10497 lines
1.2 MiB
10497 lines
1.2 MiB
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
|
||
"use strict";
|
||
|
||
$(document).ready(function () {
|
||
$(window).keydown(function (event) {
|
||
if (event.keyCode == 13) {
|
||
event.preventDefault();
|
||
return false;
|
||
}
|
||
});
|
||
$('#password').keydown(function (event) {
|
||
if (event.keyCode == 13) {
|
||
submitLogin();
|
||
return false;
|
||
}
|
||
});
|
||
});
|
||
|
||
window.showForgotPassword = function () {
|
||
$('#loginForm').hide();
|
||
$('#requestPasswordChangeForm').show();
|
||
};
|
||
|
||
window.requestPasswordChange = function () {
|
||
$('#requestPasswordChangeFormAlert').hide();
|
||
var id = $('#usernameChange').val();
|
||
|
||
if (id === '') {
|
||
return false;
|
||
}
|
||
|
||
$.post('service.php', {
|
||
a: 'rpc',
|
||
id: id
|
||
}, function (data) {
|
||
if (data.status == 'SUCCESS') {
|
||
$('#requestPasswordChangeFormAlert').show();
|
||
$('#requestPasswordChangeFormAlert').html(data.message);
|
||
} else {
|
||
$('#requestPasswordChangeFormAlert').show();
|
||
$('#requestPasswordChangeFormAlert').html(data.message);
|
||
}
|
||
}, 'json');
|
||
};
|
||
|
||
window.changePassword = function (key) {
|
||
$('#newPasswordFormAlert').hide();
|
||
var password = $('#password').val();
|
||
|
||
var passwordValidation = function passwordValidation(str) {
|
||
return str.length > 7;
|
||
};
|
||
|
||
if (!passwordValidation(password)) {
|
||
$('#newPasswordFormAlert').show();
|
||
$('#newPasswordFormAlert').html('Password should be longer than 7 characters');
|
||
return;
|
||
}
|
||
|
||
$.post('service.php', {
|
||
a: 'rsp',
|
||
key: key,
|
||
pwd: password,
|
||
now: '1'
|
||
}, function (data) {
|
||
if (data.status == 'SUCCESS') {
|
||
top.location.href = 'login.php?c=1';
|
||
} else {
|
||
$('#newPasswordFormAlert').show();
|
||
$('#newPasswordFormAlert').html(data.message);
|
||
}
|
||
}, 'json');
|
||
};
|
||
|
||
window.submitLogin = function () {
|
||
var username = $('#username').val();
|
||
var password = $('#password').val();
|
||
|
||
if (username === '' || password === '') {
|
||
return false;
|
||
}
|
||
|
||
try {
|
||
localStorage.clear();
|
||
} catch (e) {}
|
||
|
||
$('#loginForm').submit();
|
||
};
|
||
|
||
window.authGoogle = function () {
|
||
window.location.href = "".concat(window.location.href.split('login.php')[0], "login.php?google=1");
|
||
};
|
||
|
||
},{}],2:[function(require,module,exports){
|
||
"use strict";
|
||
|
||
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
||
|
||
/* ===================================================
|
||
* bootstrap-transition.js v2.1.1
|
||
* http://twitter.github.com/bootstrap/javascript.html#transitions
|
||
* ===================================================
|
||
* Copyright 2012 Twitter, Inc.
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
* ========================================================== */
|
||
!function ($) {
|
||
$(function () {
|
||
"use strict"; // jshint ;_;
|
||
|
||
/* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
|
||
* ======================================================= */
|
||
|
||
$.support.transition = function () {
|
||
var transitionEnd = function () {
|
||
var el = document.createElement('bootstrap'),
|
||
transEndEventNames = {
|
||
'WebkitTransition': 'webkitTransitionEnd',
|
||
'MozTransition': 'transitionend',
|
||
'OTransition': 'oTransitionEnd otransitionend',
|
||
'transition': 'transitionend'
|
||
},
|
||
name;
|
||
|
||
for (name in transEndEventNames) {
|
||
if (el.style[name] !== undefined) {
|
||
return transEndEventNames[name];
|
||
}
|
||
}
|
||
}();
|
||
|
||
return transitionEnd && {
|
||
end: transitionEnd
|
||
};
|
||
}();
|
||
});
|
||
}(window.jQuery);
|
||
/* ==========================================================
|
||
* bootstrap-alert.js v2.1.1
|
||
* http://twitter.github.com/bootstrap/javascript.html#alerts
|
||
* ==========================================================
|
||
* Copyright 2012 Twitter, Inc.
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
* ========================================================== */
|
||
|
||
!function ($) {
|
||
"use strict"; // jshint ;_;
|
||
|
||
/* ALERT CLASS DEFINITION
|
||
* ====================== */
|
||
|
||
var dismiss = '[data-dismiss="alert"]',
|
||
Alert = function Alert(el) {
|
||
$(el).on('click', dismiss, this.close);
|
||
};
|
||
|
||
Alert.prototype.close = function (e) {
|
||
var $this = $(this),
|
||
selector = $this.attr('data-target'),
|
||
$parent;
|
||
|
||
if (!selector) {
|
||
selector = $this.attr('href');
|
||
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, ''); //strip for ie7
|
||
}
|
||
|
||
$parent = $(selector);
|
||
e && e.preventDefault();
|
||
$parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent());
|
||
$parent.trigger(e = $.Event('close'));
|
||
if (e.isDefaultPrevented()) return;
|
||
$parent.removeClass('in');
|
||
|
||
function removeElement() {
|
||
$parent.trigger('closed').remove();
|
||
}
|
||
|
||
$.support.transition && $parent.hasClass('fade') ? $parent.on($.support.transition.end, removeElement) : removeElement();
|
||
};
|
||
/* ALERT PLUGIN DEFINITION
|
||
* ======================= */
|
||
|
||
|
||
$.fn.alert = function (option) {
|
||
return this.each(function () {
|
||
var $this = $(this),
|
||
data = $this.data('alert');
|
||
if (!data) $this.data('alert', data = new Alert(this));
|
||
if (typeof option == 'string') data[option].call($this);
|
||
});
|
||
};
|
||
|
||
$.fn.alert.Constructor = Alert;
|
||
/* ALERT DATA-API
|
||
* ============== */
|
||
|
||
$(function () {
|
||
$('body').on('click.alert.data-api', dismiss, Alert.prototype.close);
|
||
});
|
||
}(window.jQuery);
|
||
/* ============================================================
|
||
* bootstrap-button.js v2.1.1
|
||
* http://twitter.github.com/bootstrap/javascript.html#buttons
|
||
* ============================================================
|
||
* Copyright 2012 Twitter, Inc.
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
* ============================================================ */
|
||
|
||
!function ($) {
|
||
"use strict"; // jshint ;_;
|
||
|
||
/* BUTTON PUBLIC CLASS DEFINITION
|
||
* ============================== */
|
||
|
||
var Button = function Button(element, options) {
|
||
this.$element = $(element);
|
||
this.options = $.extend({}, $.fn.button.defaults, options);
|
||
};
|
||
|
||
Button.prototype.setState = function (state) {
|
||
var d = 'disabled',
|
||
$el = this.$element,
|
||
data = $el.data(),
|
||
val = $el.is('input') ? 'val' : 'html';
|
||
state = state + 'Text';
|
||
data.resetText || $el.data('resetText', $el[val]());
|
||
$el[val](data[state] || this.options[state]); // push to event loop to allow forms to submit
|
||
|
||
setTimeout(function () {
|
||
state == 'loadingText' ? $el.addClass(d).attr(d, d) : $el.removeClass(d).removeAttr(d);
|
||
}, 0);
|
||
};
|
||
|
||
Button.prototype.toggle = function () {
|
||
var $parent = this.$element.closest('[data-toggle="buttons-radio"]');
|
||
$parent && $parent.find('.active').removeClass('active');
|
||
this.$element.toggleClass('active');
|
||
};
|
||
/* BUTTON PLUGIN DEFINITION
|
||
* ======================== */
|
||
|
||
|
||
$.fn.button = function (option) {
|
||
return this.each(function () {
|
||
var $this = $(this),
|
||
data = $this.data('button'),
|
||
options = _typeof(option) == 'object' && option;
|
||
if (!data) $this.data('button', data = new Button(this, options));
|
||
if (option == 'toggle') data.toggle();else if (option) data.setState(option);
|
||
});
|
||
};
|
||
|
||
$.fn.button.defaults = {
|
||
loadingText: 'loading...'
|
||
};
|
||
$.fn.button.Constructor = Button;
|
||
/* BUTTON DATA-API
|
||
* =============== */
|
||
|
||
$(function () {
|
||
$('body').on('click.button.data-api', '[data-toggle^=button]', function (e) {
|
||
var $btn = $(e.target);
|
||
if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn');
|
||
$btn.button('toggle');
|
||
});
|
||
});
|
||
}(window.jQuery);
|
||
/* ==========================================================
|
||
* bootstrap-carousel.js v2.1.1
|
||
* http://twitter.github.com/bootstrap/javascript.html#carousel
|
||
* ==========================================================
|
||
* Copyright 2012 Twitter, Inc.
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
* ========================================================== */
|
||
|
||
!function ($) {
|
||
"use strict"; // jshint ;_;
|
||
|
||
/* CAROUSEL CLASS DEFINITION
|
||
* ========================= */
|
||
|
||
var Carousel = function Carousel(element, options) {
|
||
this.$element = $(element);
|
||
this.options = options;
|
||
this.options.slide && this.slide(this.options.slide);
|
||
this.options.pause == 'hover' && this.$element.on('mouseenter', $.proxy(this.pause, this)).on('mouseleave', $.proxy(this.cycle, this));
|
||
};
|
||
|
||
Carousel.prototype = {
|
||
cycle: function cycle(e) {
|
||
if (!e) this.paused = false;
|
||
this.options.interval && !this.paused && (this.interval = setInterval($.proxy(this.next, this), this.options.interval));
|
||
return this;
|
||
},
|
||
to: function to(pos) {
|
||
var $active = this.$element.find('.item.active'),
|
||
children = $active.parent().children(),
|
||
activePos = children.index($active),
|
||
that = this;
|
||
if (pos > children.length - 1 || pos < 0) return;
|
||
|
||
if (this.sliding) {
|
||
return this.$element.one('slid', function () {
|
||
that.to(pos);
|
||
});
|
||
}
|
||
|
||
if (activePos == pos) {
|
||
return this.pause().cycle();
|
||
}
|
||
|
||
return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]));
|
||
},
|
||
pause: function pause(e) {
|
||
if (!e) this.paused = true;
|
||
|
||
if (this.$element.find('.next, .prev').length && $.support.transition.end) {
|
||
this.$element.trigger($.support.transition.end);
|
||
this.cycle();
|
||
}
|
||
|
||
clearInterval(this.interval);
|
||
this.interval = null;
|
||
return this;
|
||
},
|
||
next: function next() {
|
||
if (this.sliding) return;
|
||
return this.slide('next');
|
||
},
|
||
prev: function prev() {
|
||
if (this.sliding) return;
|
||
return this.slide('prev');
|
||
},
|
||
slide: function slide(type, next) {
|
||
var $active = this.$element.find('.item.active'),
|
||
$next = next || $active[type](),
|
||
isCycling = this.interval,
|
||
direction = type == 'next' ? 'left' : 'right',
|
||
fallback = type == 'next' ? 'first' : 'last',
|
||
that = this,
|
||
e = $.Event('slide', {
|
||
relatedTarget: $next[0]
|
||
});
|
||
this.sliding = true;
|
||
isCycling && this.pause();
|
||
$next = $next.length ? $next : this.$element.find('.item')[fallback]();
|
||
if ($next.hasClass('active')) return;
|
||
|
||
if ($.support.transition && this.$element.hasClass('slide')) {
|
||
this.$element.trigger(e);
|
||
if (e.isDefaultPrevented()) return;
|
||
$next.addClass(type);
|
||
$next[0].offsetWidth; // force reflow
|
||
|
||
$active.addClass(direction);
|
||
$next.addClass(direction);
|
||
this.$element.one($.support.transition.end, function () {
|
||
$next.removeClass([type, direction].join(' ')).addClass('active');
|
||
$active.removeClass(['active', direction].join(' '));
|
||
that.sliding = false;
|
||
setTimeout(function () {
|
||
that.$element.trigger('slid');
|
||
}, 0);
|
||
});
|
||
} else {
|
||
this.$element.trigger(e);
|
||
if (e.isDefaultPrevented()) return;
|
||
$active.removeClass('active');
|
||
$next.addClass('active');
|
||
this.sliding = false;
|
||
this.$element.trigger('slid');
|
||
}
|
||
|
||
isCycling && this.cycle();
|
||
return this;
|
||
}
|
||
};
|
||
/* CAROUSEL PLUGIN DEFINITION
|
||
* ========================== */
|
||
|
||
$.fn.carousel = function (option) {
|
||
return this.each(function () {
|
||
var $this = $(this),
|
||
data = $this.data('carousel'),
|
||
options = $.extend({}, $.fn.carousel.defaults, _typeof(option) == 'object' && option),
|
||
action = typeof option == 'string' ? option : options.slide;
|
||
if (!data) $this.data('carousel', data = new Carousel(this, options));
|
||
if (typeof option == 'number') data.to(option);else if (action) data[action]();else if (options.interval) data.cycle();
|
||
});
|
||
};
|
||
|
||
$.fn.carousel.defaults = {
|
||
interval: 5000,
|
||
pause: 'hover'
|
||
};
|
||
$.fn.carousel.Constructor = Carousel;
|
||
/* CAROUSEL DATA-API
|
||
* ================= */
|
||
|
||
$(function () {
|
||
$('body').on('click.carousel.data-api', '[data-slide]', function (e) {
|
||
var $this = $(this),
|
||
href,
|
||
$target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
|
||
,
|
||
options = !$target.data('modal') && $.extend({}, $target.data(), $this.data());
|
||
$target.carousel(options);
|
||
e.preventDefault();
|
||
});
|
||
});
|
||
}(window.jQuery);
|
||
/* =============================================================
|
||
* bootstrap-collapse.js v2.1.1
|
||
* http://twitter.github.com/bootstrap/javascript.html#collapse
|
||
* =============================================================
|
||
* Copyright 2012 Twitter, Inc.
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
* ============================================================ */
|
||
|
||
!function ($) {
|
||
"use strict"; // jshint ;_;
|
||
|
||
/* COLLAPSE PUBLIC CLASS DEFINITION
|
||
* ================================ */
|
||
|
||
var Collapse = function Collapse(element, options) {
|
||
this.$element = $(element);
|
||
this.options = $.extend({}, $.fn.collapse.defaults, options);
|
||
|
||
if (this.options.parent) {
|
||
this.$parent = $(this.options.parent);
|
||
}
|
||
|
||
this.options.toggle && this.toggle();
|
||
};
|
||
|
||
Collapse.prototype = {
|
||
constructor: Collapse,
|
||
dimension: function dimension() {
|
||
var hasWidth = this.$element.hasClass('width');
|
||
return hasWidth ? 'width' : 'height';
|
||
},
|
||
show: function show() {
|
||
var dimension, scroll, actives, hasData;
|
||
if (this.transitioning) return;
|
||
dimension = this.dimension();
|
||
scroll = $.camelCase(['scroll', dimension].join('-'));
|
||
actives = this.$parent && this.$parent.find('> .accordion-group > .in');
|
||
|
||
if (actives && actives.length) {
|
||
hasData = actives.data('collapse');
|
||
if (hasData && hasData.transitioning) return;
|
||
actives.collapse('hide');
|
||
hasData || actives.data('collapse', null);
|
||
}
|
||
|
||
this.$element[dimension](0);
|
||
this.transition('addClass', $.Event('show'), 'shown');
|
||
$.support.transition && this.$element[dimension](this.$element[0][scroll]);
|
||
},
|
||
hide: function hide() {
|
||
var dimension;
|
||
if (this.transitioning) return;
|
||
dimension = this.dimension();
|
||
this.reset(this.$element[dimension]());
|
||
this.transition('removeClass', $.Event('hide'), 'hidden');
|
||
this.$element[dimension](0);
|
||
},
|
||
reset: function reset(size) {
|
||
var dimension = this.dimension();
|
||
this.$element.removeClass('collapse')[dimension](size || 'auto')[0].offsetWidth;
|
||
this.$element[size !== null ? 'addClass' : 'removeClass']('collapse');
|
||
return this;
|
||
},
|
||
transition: function transition(method, startEvent, completeEvent) {
|
||
var that = this,
|
||
complete = function complete() {
|
||
if (startEvent.type == 'show') that.reset();
|
||
that.transitioning = 0;
|
||
that.$element.trigger(completeEvent);
|
||
};
|
||
|
||
this.$element.trigger(startEvent);
|
||
if (startEvent.isDefaultPrevented()) return;
|
||
this.transitioning = 1;
|
||
this.$element[method]('in');
|
||
$.support.transition && this.$element.hasClass('collapse') ? this.$element.one($.support.transition.end, complete) : complete();
|
||
},
|
||
toggle: function toggle() {
|
||
this[this.$element.hasClass('in') ? 'hide' : 'show']();
|
||
}
|
||
};
|
||
/* COLLAPSIBLE PLUGIN DEFINITION
|
||
* ============================== */
|
||
|
||
$.fn.collapse = function (option) {
|
||
return this.each(function () {
|
||
var $this = $(this),
|
||
data = $this.data('collapse'),
|
||
options = _typeof(option) == 'object' && option;
|
||
if (!data) $this.data('collapse', data = new Collapse(this, options));
|
||
if (typeof option == 'string') data[option]();
|
||
});
|
||
};
|
||
|
||
$.fn.collapse.defaults = {
|
||
toggle: true
|
||
};
|
||
$.fn.collapse.Constructor = Collapse;
|
||
/* COLLAPSIBLE DATA-API
|
||
* ==================== */
|
||
|
||
$(function () {
|
||
$('body').on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
|
||
var $this = $(this),
|
||
href,
|
||
target = $this.attr('data-target') || e.preventDefault() || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
|
||
,
|
||
option = $(target).data('collapse') ? 'toggle' : $this.data();
|
||
$this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed');
|
||
$(target).collapse(option);
|
||
});
|
||
});
|
||
}(window.jQuery);
|
||
/* ============================================================
|
||
* bootstrap-dropdown.js v2.1.1
|
||
* http://twitter.github.com/bootstrap/javascript.html#dropdowns
|
||
* ============================================================
|
||
* Copyright 2012 Twitter, Inc.
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
* ============================================================ */
|
||
|
||
!function ($) {
|
||
"use strict"; // jshint ;_;
|
||
|
||
/* DROPDOWN CLASS DEFINITION
|
||
* ========================= */
|
||
|
||
var toggle = '[data-toggle=dropdown]',
|
||
Dropdown = function Dropdown(element) {
|
||
var $el = $(element).on('click.dropdown.data-api', this.toggle);
|
||
$('html').on('click.dropdown.data-api', function () {
|
||
$el.parent().removeClass('open');
|
||
});
|
||
};
|
||
|
||
Dropdown.prototype = {
|
||
constructor: Dropdown,
|
||
toggle: function toggle(e) {
|
||
var $this = $(this),
|
||
$parent,
|
||
isActive;
|
||
if ($this.is('.disabled, :disabled')) return;
|
||
$parent = getParent($this);
|
||
isActive = $parent.hasClass('open');
|
||
clearMenus();
|
||
|
||
if (!isActive) {
|
||
$parent.toggleClass('open');
|
||
$this.focus();
|
||
}
|
||
|
||
return false;
|
||
},
|
||
keydown: function keydown(e) {
|
||
var $this, $items, $active, $parent, isActive, index;
|
||
if (!/(38|40|27)/.test(e.keyCode)) return;
|
||
$this = $(this);
|
||
e.preventDefault();
|
||
e.stopPropagation();
|
||
if ($this.is('.disabled, :disabled')) return;
|
||
$parent = getParent($this);
|
||
isActive = $parent.hasClass('open');
|
||
if (!isActive || isActive && e.keyCode == 27) return $this.click();
|
||
$items = $('[role=menu] li:not(.divider) a', $parent);
|
||
if (!$items.length) return;
|
||
index = $items.index($items.filter(':focus'));
|
||
if (e.keyCode == 38 && index > 0) index--; // up
|
||
|
||
if (e.keyCode == 40 && index < $items.length - 1) index++; // down
|
||
|
||
if (!~index) index = 0;
|
||
$items.eq(index).focus();
|
||
}
|
||
};
|
||
|
||
function clearMenus() {
|
||
getParent($(toggle)).removeClass('open');
|
||
}
|
||
|
||
function getParent($this) {
|
||
var selector = $this.attr('data-target'),
|
||
$parent;
|
||
|
||
if (!selector) {
|
||
selector = $this.attr('href');
|
||
selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, ''); //strip for ie7
|
||
}
|
||
|
||
$parent = $(selector);
|
||
$parent.length || ($parent = $this.parent());
|
||
return $parent;
|
||
}
|
||
/* DROPDOWN PLUGIN DEFINITION
|
||
* ========================== */
|
||
|
||
|
||
$.fn.dropdown = function (option) {
|
||
return this.each(function () {
|
||
var $this = $(this),
|
||
data = $this.data('dropdown');
|
||
if (!data) $this.data('dropdown', data = new Dropdown(this));
|
||
if (typeof option == 'string') data[option].call($this);
|
||
});
|
||
};
|
||
|
||
$.fn.dropdown.Constructor = Dropdown;
|
||
/* APPLY TO STANDARD DROPDOWN ELEMENTS
|
||
* =================================== */
|
||
|
||
$(function () {
|
||
$('html').on('click.dropdown.data-Api touchstart.dropdown.data-Api', clearMenus);
|
||
$('body').on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) {
|
||
e.stopPropagation();
|
||
}).on('click.dropdown.data-Api touchstart.dropdown.data-Api', toggle, Dropdown.prototype.toggle).on('keydown.dropdown.data-Api touchstart.dropdown.data-Api', toggle + ', [role=menu]', Dropdown.prototype.keydown);
|
||
});
|
||
}(window.jQuery);
|
||
/* =========================================================
|
||
* bootstrap-modal.js v2.1.1
|
||
* http://twitter.github.com/bootstrap/javascript.html#modals
|
||
* =========================================================
|
||
* Copyright 2012 Twitter, Inc.
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
* ========================================================= */
|
||
|
||
!function ($) {
|
||
"use strict"; // jshint ;_;
|
||
|
||
/* MODAL CLASS DEFINITION
|
||
* ====================== */
|
||
|
||
var Modal = function Modal(element, options) {
|
||
this.options = options;
|
||
this.$element = $(element).delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this));
|
||
this.options.remote && this.$element.find('.modal-body').load(this.options.remote);
|
||
};
|
||
|
||
Modal.prototype = {
|
||
constructor: Modal,
|
||
toggle: function toggle() {
|
||
return this[!this.isShown ? 'show' : 'hide']();
|
||
},
|
||
show: function show() {
|
||
var that = this,
|
||
e = $.Event('show');
|
||
this.$element.trigger(e);
|
||
if (this.isShown || e.isDefaultPrevented()) return;
|
||
$('body').addClass('modal-open');
|
||
this.isShown = true;
|
||
this.escape();
|
||
this.backdrop(function () {
|
||
var transition = $.support.transition && that.$element.hasClass('fade');
|
||
|
||
if (!that.$element.parent().length) {
|
||
that.$element.appendTo(document.body); //don't move modals dom position
|
||
}
|
||
|
||
that.$element.show();
|
||
|
||
if (transition) {
|
||
that.$element[0].offsetWidth; // force reflow
|
||
}
|
||
|
||
that.$element.addClass('in').attr('aria-hidden', false).focus();
|
||
that.enforceFocus();
|
||
transition ? that.$element.one($.support.transition.end, function () {
|
||
that.$element.trigger('shown');
|
||
}) : that.$element.trigger('shown');
|
||
});
|
||
},
|
||
hide: function hide(e) {
|
||
e && e.preventDefault();
|
||
var that = this;
|
||
e = $.Event('hide');
|
||
this.$element.trigger(e);
|
||
if (!this.isShown || e.isDefaultPrevented()) return;
|
||
this.isShown = false;
|
||
$('body').removeClass('modal-open');
|
||
this.escape();
|
||
$(document).off('focusin.modal');
|
||
this.$element.removeClass('in').attr('aria-hidden', true);
|
||
$.support.transition && this.$element.hasClass('fade') ? this.hideWithTransition() : this.hideModal();
|
||
},
|
||
enforceFocus: function enforceFocus() {
|
||
var that = this;
|
||
$(document).on('focusin.modal', function (e) {
|
||
if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
|
||
that.$element.focus();
|
||
}
|
||
});
|
||
},
|
||
escape: function escape() {
|
||
var that = this;
|
||
|
||
if (this.isShown && this.options.keyboard) {
|
||
this.$element.on('keyup.dismiss.modal', function (e) {
|
||
e.which == 27 && that.hide();
|
||
});
|
||
} else if (!this.isShown) {
|
||
this.$element.off('keyup.dismiss.modal');
|
||
}
|
||
},
|
||
hideWithTransition: function hideWithTransition() {
|
||
var that = this,
|
||
timeout = setTimeout(function () {
|
||
that.$element.off($.support.transition.end);
|
||
that.hideModal();
|
||
}, 500);
|
||
this.$element.one($.support.transition.end, function () {
|
||
clearTimeout(timeout);
|
||
that.hideModal();
|
||
});
|
||
},
|
||
hideModal: function hideModal(that) {
|
||
this.$element.hide().trigger('hidden');
|
||
this.backdrop();
|
||
},
|
||
removeBackdrop: function removeBackdrop() {
|
||
this.$backdrop.remove();
|
||
this.$backdrop = null;
|
||
},
|
||
backdrop: function backdrop(callback) {
|
||
var that = this,
|
||
animate = this.$element.hasClass('fade') ? 'fade' : '';
|
||
|
||
if (this.isShown && this.options.backdrop) {
|
||
var doAnimate = $.support.transition && animate;
|
||
this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />').appendTo(document.body);
|
||
|
||
if (this.options.backdrop != 'static') {
|
||
this.$backdrop.click($.proxy(this.hide, this));
|
||
}
|
||
|
||
if (doAnimate) this.$backdrop[0].offsetWidth; // force reflow
|
||
|
||
this.$backdrop.addClass('in');
|
||
doAnimate ? this.$backdrop.one($.support.transition.end, callback) : callback();
|
||
} else if (!this.isShown && this.$backdrop) {
|
||
this.$backdrop.removeClass('in');
|
||
$.support.transition && this.$element.hasClass('fade') ? this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) : this.removeBackdrop();
|
||
} else if (callback) {
|
||
callback();
|
||
}
|
||
}
|
||
};
|
||
/* MODAL PLUGIN DEFINITION
|
||
* ======================= */
|
||
|
||
$.fn.modal = function (option) {
|
||
return this.each(function () {
|
||
var $this = $(this),
|
||
data = $this.data('modal'),
|
||
options = $.extend({}, $.fn.modal.defaults, $this.data(), _typeof(option) == 'object' && option);
|
||
if (!data) $this.data('modal', data = new Modal(this, options));
|
||
if (typeof option == 'string') data[option]();else if (options.show) data.show();
|
||
});
|
||
};
|
||
|
||
$.fn.modal.defaults = {
|
||
backdrop: true,
|
||
keyboard: true,
|
||
show: true
|
||
};
|
||
$.fn.modal.Constructor = Modal;
|
||
/* MODAL DATA-API
|
||
* ============== */
|
||
|
||
$(function () {
|
||
$('body').on('click.modal.data-api', '[data-toggle="modal"]', function (e) {
|
||
var $this = $(this),
|
||
href = $this.attr('href'),
|
||
$target = $($this.attr('data-target') || href && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
|
||
,
|
||
option = $target.data('modal') ? 'toggle' : $.extend({
|
||
remote: !/#/.test(href) && href
|
||
}, $target.data(), $this.data());
|
||
e.preventDefault();
|
||
$target.modal(option).one('hide', function () {
|
||
$this.focus();
|
||
});
|
||
});
|
||
});
|
||
}(window.jQuery);
|
||
/* ===========================================================
|
||
* bootstrap-tooltip.js v2.1.1
|
||
* http://twitter.github.com/bootstrap/javascript.html#tooltips
|
||
* Inspired by the original jQuery.tipsy by Jason Frame
|
||
* ===========================================================
|
||
* Copyright 2012 Twitter, Inc.
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
* ========================================================== */
|
||
|
||
!function ($) {
|
||
"use strict"; // jshint ;_;
|
||
|
||
/* TOOLTIP PUBLIC CLASS DEFINITION
|
||
* =============================== */
|
||
|
||
var Tooltip = function Tooltip(element, options) {
|
||
this.init('tooltip', element, options);
|
||
};
|
||
|
||
Tooltip.prototype = {
|
||
constructor: Tooltip,
|
||
init: function init(type, element, options) {
|
||
var eventIn, eventOut;
|
||
this.type = type;
|
||
this.$element = $(element);
|
||
this.options = this.getOptions(options);
|
||
this.enabled = true;
|
||
|
||
if (this.options.trigger == 'click') {
|
||
this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this));
|
||
} else if (this.options.trigger != 'manual') {
|
||
eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus';
|
||
eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur';
|
||
this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this));
|
||
this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this));
|
||
}
|
||
|
||
this.options.selector ? this._options = $.extend({}, this.options, {
|
||
trigger: 'manual',
|
||
selector: ''
|
||
}) : this.fixTitle();
|
||
},
|
||
getOptions: function getOptions(options) {
|
||
options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data());
|
||
|
||
if (options.delay && typeof options.delay == 'number') {
|
||
options.delay = {
|
||
show: options.delay,
|
||
hide: options.delay
|
||
};
|
||
}
|
||
|
||
return options;
|
||
},
|
||
enter: function enter(e) {
|
||
var self = $(e.currentTarget)[this.type](this._options).data(this.type);
|
||
if (!self.options.delay || !self.options.delay.show) return self.show();
|
||
clearTimeout(this.timeout);
|
||
self.hoverState = 'in';
|
||
this.timeout = setTimeout(function () {
|
||
if (self.hoverState == 'in') self.show();
|
||
}, self.options.delay.show);
|
||
},
|
||
leave: function leave(e) {
|
||
var self = $(e.currentTarget)[this.type](this._options).data(this.type);
|
||
if (this.timeout) clearTimeout(this.timeout);
|
||
if (!self.options.delay || !self.options.delay.hide) return self.hide();
|
||
self.hoverState = 'out';
|
||
this.timeout = setTimeout(function () {
|
||
if (self.hoverState == 'out') self.hide();
|
||
}, self.options.delay.hide);
|
||
},
|
||
show: function show() {
|
||
var $tip, inside, pos, actualWidth, actualHeight, placement, tp;
|
||
|
||
if (this.hasContent() && this.enabled) {
|
||
$tip = this.tip();
|
||
this.setContent();
|
||
|
||
if (this.options.animation) {
|
||
$tip.addClass('fade');
|
||
}
|
||
|
||
placement = typeof this.options.placement == 'function' ? this.options.placement.call(this, $tip[0], this.$element[0]) : this.options.placement;
|
||
inside = /in/.test(placement);
|
||
$tip.remove().css({
|
||
top: 0,
|
||
left: 0,
|
||
display: 'block'
|
||
}).appendTo(inside ? this.$element : document.body);
|
||
pos = this.getPosition(inside);
|
||
actualWidth = $tip[0].offsetWidth;
|
||
actualHeight = $tip[0].offsetHeight;
|
||
|
||
switch (inside ? placement.split(' ')[1] : placement) {
|
||
case 'bottom':
|
||
tp = {
|
||
top: pos.top + pos.height,
|
||
left: pos.left + pos.width / 2 - actualWidth / 2
|
||
};
|
||
break;
|
||
|
||
case 'top':
|
||
tp = {
|
||
top: pos.top - actualHeight,
|
||
left: pos.left + pos.width / 2 - actualWidth / 2
|
||
};
|
||
break;
|
||
|
||
case 'left':
|
||
tp = {
|
||
top: pos.top + pos.height / 2 - actualHeight / 2,
|
||
left: pos.left - actualWidth
|
||
};
|
||
break;
|
||
|
||
case 'right':
|
||
tp = {
|
||
top: pos.top + pos.height / 2 - actualHeight / 2,
|
||
left: pos.left + pos.width
|
||
};
|
||
break;
|
||
}
|
||
|
||
$tip.css(tp).addClass(placement).addClass('in');
|
||
}
|
||
},
|
||
setContent: function setContent() {
|
||
var $tip = this.tip(),
|
||
title = this.getTitle();
|
||
$tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title);
|
||
$tip.removeClass('fade in top bottom left right');
|
||
},
|
||
hide: function hide() {
|
||
var that = this,
|
||
$tip = this.tip();
|
||
$tip.removeClass('in');
|
||
|
||
function removeWithAnimation() {
|
||
var timeout = setTimeout(function () {
|
||
$tip.off($.support.transition.end).remove();
|
||
}, 500);
|
||
$tip.one($.support.transition.end, function () {
|
||
clearTimeout(timeout);
|
||
$tip.remove();
|
||
});
|
||
}
|
||
|
||
$.support.transition && this.$tip.hasClass('fade') ? removeWithAnimation() : $tip.remove();
|
||
return this;
|
||
},
|
||
fixTitle: function fixTitle() {
|
||
var $e = this.$element;
|
||
|
||
if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
|
||
$e.attr('data-original-title', $e.attr('title') || '').removeAttr('title');
|
||
}
|
||
},
|
||
hasContent: function hasContent() {
|
||
return this.getTitle();
|
||
},
|
||
getPosition: function getPosition(inside) {
|
||
return $.extend({}, inside ? {
|
||
top: 0,
|
||
left: 0
|
||
} : this.$element.offset(), {
|
||
width: this.$element[0].offsetWidth,
|
||
height: this.$element[0].offsetHeight
|
||
});
|
||
},
|
||
getTitle: function getTitle() {
|
||
var title,
|
||
$e = this.$element,
|
||
o = this.options;
|
||
title = $e.attr('data-original-title') || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title);
|
||
return title;
|
||
},
|
||
tip: function tip() {
|
||
return this.$tip = this.$tip || $(this.options.template);
|
||
},
|
||
validate: function validate() {
|
||
if (!this.$element[0].parentNode) {
|
||
this.hide();
|
||
this.$element = null;
|
||
this.options = null;
|
||
}
|
||
},
|
||
enable: function enable() {
|
||
this.enabled = true;
|
||
},
|
||
disable: function disable() {
|
||
this.enabled = false;
|
||
},
|
||
toggleEnabled: function toggleEnabled() {
|
||
this.enabled = !this.enabled;
|
||
},
|
||
toggle: function toggle() {
|
||
this[this.tip().hasClass('in') ? 'hide' : 'show']();
|
||
},
|
||
destroy: function destroy() {
|
||
this.hide().$element.off('.' + this.type).removeData(this.type);
|
||
}
|
||
};
|
||
/* TOOLTIP PLUGIN DEFINITION
|
||
* ========================= */
|
||
|
||
$.fn.tooltip = function (option) {
|
||
return this.each(function () {
|
||
var $this = $(this),
|
||
data = $this.data('tooltip'),
|
||
options = _typeof(option) == 'object' && option;
|
||
if (!data) $this.data('tooltip', data = new Tooltip(this, options));
|
||
if (typeof option == 'string') data[option]();
|
||
});
|
||
};
|
||
|
||
$.fn.tooltip.Constructor = Tooltip;
|
||
$.fn.tooltip.defaults = {
|
||
animation: true,
|
||
placement: 'top',
|
||
selector: false,
|
||
template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
|
||
trigger: 'hover',
|
||
title: '',
|
||
delay: 0,
|
||
html: true
|
||
};
|
||
}(window.jQuery);
|
||
/* ===========================================================
|
||
* bootstrap-popover.js v2.1.1
|
||
* http://twitter.github.com/bootstrap/javascript.html#popovers
|
||
* ===========================================================
|
||
* Copyright 2012 Twitter, Inc.
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
* =========================================================== */
|
||
|
||
!function ($) {
|
||
"use strict"; // jshint ;_;
|
||
|
||
/* POPOVER PUBLIC CLASS DEFINITION
|
||
* =============================== */
|
||
|
||
var Popover = function Popover(element, options) {
|
||
this.init('popover', element, options);
|
||
};
|
||
/* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
|
||
========================================== */
|
||
|
||
|
||
Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
|
||
constructor: Popover,
|
||
setContent: function setContent() {
|
||
var $tip = this.tip(),
|
||
title = this.getTitle(),
|
||
content = this.getContent();
|
||
$tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title);
|
||
$tip.find('.popover-content > *')[this.options.html ? 'html' : 'text'](content);
|
||
$tip.removeClass('fade top bottom left right in');
|
||
},
|
||
hasContent: function hasContent() {
|
||
return this.getTitle() || this.getContent();
|
||
},
|
||
getContent: function getContent() {
|
||
var content,
|
||
$e = this.$element,
|
||
o = this.options;
|
||
content = $e.attr('data-content') || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content);
|
||
return content;
|
||
},
|
||
tip: function tip() {
|
||
if (!this.$tip) {
|
||
this.$tip = $(this.options.template);
|
||
}
|
||
|
||
return this.$tip;
|
||
},
|
||
destroy: function destroy() {
|
||
this.hide().$element.off('.' + this.type).removeData(this.type);
|
||
}
|
||
});
|
||
/* POPOVER PLUGIN DEFINITION
|
||
* ======================= */
|
||
|
||
$.fn.popover = function (option) {
|
||
return this.each(function () {
|
||
var $this = $(this),
|
||
data = $this.data('popover'),
|
||
options = _typeof(option) == 'object' && option;
|
||
if (!data) $this.data('popover', data = new Popover(this, options));
|
||
if (typeof option == 'string') data[option]();
|
||
});
|
||
};
|
||
|
||
$.fn.popover.Constructor = Popover;
|
||
$.fn.popover.defaults = $.extend({}, $.fn.tooltip.defaults, {
|
||
placement: 'right',
|
||
trigger: 'click',
|
||
content: '',
|
||
template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
|
||
});
|
||
}(window.jQuery);
|
||
/* =============================================================
|
||
* bootstrap-scrollspy.js v2.1.1
|
||
* http://twitter.github.com/bootstrap/javascript.html#scrollspy
|
||
* =============================================================
|
||
* Copyright 2012 Twitter, Inc.
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
* ============================================================== */
|
||
|
||
!function ($) {
|
||
"use strict"; // jshint ;_;
|
||
|
||
/* SCROLLSPY CLASS DEFINITION
|
||
* ========================== */
|
||
|
||
function ScrollSpy(element, options) {
|
||
var process = $.proxy(this.process, this),
|
||
$element = $(element).is('body') ? $(window) : $(element),
|
||
href;
|
||
this.options = $.extend({}, $.fn.scrollspy.defaults, options);
|
||
this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process);
|
||
this.selector = (this.options.target || (href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
|
||
|| '') + ' .nav li > a';
|
||
this.$body = $('body');
|
||
this.refresh();
|
||
this.process();
|
||
}
|
||
|
||
ScrollSpy.prototype = {
|
||
constructor: ScrollSpy,
|
||
refresh: function refresh() {
|
||
var self = this,
|
||
$targets;
|
||
this.offsets = $([]);
|
||
this.targets = $([]);
|
||
$targets = this.$body.find(this.selector).map(function () {
|
||
var $el = $(this),
|
||
href = $el.data('target') || $el.attr('href'),
|
||
$href = /^#\w/.test(href) && $(href);
|
||
return $href && $href.length && [[$href.position().top, href]] || null;
|
||
}).sort(function (a, b) {
|
||
return a[0] - b[0];
|
||
}).each(function () {
|
||
self.offsets.push(this[0]);
|
||
self.targets.push(this[1]);
|
||
});
|
||
},
|
||
process: function process() {
|
||
var scrollTop = this.$scrollElement.scrollTop() + this.options.offset,
|
||
scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight,
|
||
maxScroll = scrollHeight - this.$scrollElement.height(),
|
||
offsets = this.offsets,
|
||
targets = this.targets,
|
||
activeTarget = this.activeTarget,
|
||
i;
|
||
|
||
if (scrollTop >= maxScroll) {
|
||
return activeTarget != (i = targets.last()[0]) && this.activate(i);
|
||
}
|
||
|
||
for (i = offsets.length; i--;) {
|
||
activeTarget != targets[i] && scrollTop >= offsets[i] && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) && this.activate(targets[i]);
|
||
}
|
||
},
|
||
activate: function activate(target) {
|
||
var active, selector;
|
||
this.activeTarget = target;
|
||
$(this.selector).parent('.active').removeClass('active');
|
||
selector = this.selector + '[data-target="' + target + '"],' + this.selector + '[href="' + target + '"]';
|
||
active = $(selector).parent('li').addClass('active');
|
||
|
||
if (active.parent('.dropdown-menu').length) {
|
||
active = active.closest('li.dropdown').addClass('active');
|
||
}
|
||
|
||
active.trigger('activate');
|
||
}
|
||
};
|
||
/* SCROLLSPY PLUGIN DEFINITION
|
||
* =========================== */
|
||
|
||
$.fn.scrollspy = function (option) {
|
||
return this.each(function () {
|
||
var $this = $(this),
|
||
data = $this.data('scrollspy'),
|
||
options = _typeof(option) == 'object' && option;
|
||
if (!data) $this.data('scrollspy', data = new ScrollSpy(this, options));
|
||
if (typeof option == 'string') data[option]();
|
||
});
|
||
};
|
||
|
||
$.fn.scrollspy.Constructor = ScrollSpy;
|
||
$.fn.scrollspy.defaults = {
|
||
offset: 10
|
||
};
|
||
/* SCROLLSPY DATA-API
|
||
* ================== */
|
||
|
||
$(window).on('load', function () {
|
||
$('[data-spy="scroll"]').each(function () {
|
||
var $spy = $(this);
|
||
$spy.scrollspy($spy.data());
|
||
});
|
||
});
|
||
}(window.jQuery);
|
||
/* ========================================================
|
||
* bootstrap-tab.js v2.1.1
|
||
* http://twitter.github.com/bootstrap/javascript.html#tabs
|
||
* ========================================================
|
||
* Copyright 2012 Twitter, Inc.
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
* ======================================================== */
|
||
|
||
!function ($) {
|
||
"use strict"; // jshint ;_;
|
||
|
||
/* TAB CLASS DEFINITION
|
||
* ==================== */
|
||
|
||
var Tab = function Tab(element) {
|
||
this.element = $(element);
|
||
};
|
||
|
||
Tab.prototype = {
|
||
constructor: Tab,
|
||
show: function show() {
|
||
var $this = this.element,
|
||
$ul = $this.closest('ul:not(.dropdown-menu)'),
|
||
selector = $this.attr('data-target'),
|
||
previous,
|
||
$target,
|
||
e;
|
||
|
||
if (!selector) {
|
||
selector = $this.attr('href');
|
||
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, ''); //strip for ie7
|
||
}
|
||
|
||
if ($this.parent('li').hasClass('active')) return;
|
||
previous = $ul.find('.active a').last()[0];
|
||
e = $.Event('show', {
|
||
relatedTarget: previous
|
||
});
|
||
$this.trigger(e);
|
||
if (e.isDefaultPrevented()) return;
|
||
$target = $(selector);
|
||
this.activate($this.parent('li'), $ul);
|
||
this.activate($target, $target.parent(), function () {
|
||
$this.trigger({
|
||
type: 'shown',
|
||
relatedTarget: previous
|
||
});
|
||
});
|
||
},
|
||
activate: function activate(element, container, callback) {
|
||
var $active = container.find('> .active'),
|
||
transition = callback && $.support.transition && $active.hasClass('fade');
|
||
|
||
function next() {
|
||
$active.removeClass('active').find('> .dropdown-menu > .active').removeClass('active');
|
||
element.addClass('active');
|
||
|
||
if (transition) {
|
||
element[0].offsetWidth; // reflow for transition
|
||
|
||
element.addClass('in');
|
||
} else {
|
||
element.removeClass('fade');
|
||
}
|
||
|
||
if (element.parent('.dropdown-menu')) {
|
||
element.closest('li.dropdown').addClass('active');
|
||
}
|
||
|
||
callback && callback();
|
||
}
|
||
|
||
transition ? $active.one($.support.transition.end, next) : next();
|
||
$active.removeClass('in');
|
||
}
|
||
};
|
||
/* TAB PLUGIN DEFINITION
|
||
* ===================== */
|
||
|
||
$.fn.tab = function (option) {
|
||
return this.each(function () {
|
||
var $this = $(this),
|
||
data = $this.data('tab');
|
||
if (!data) $this.data('tab', data = new Tab(this));
|
||
if (typeof option == 'string') data[option]();
|
||
});
|
||
};
|
||
|
||
$.fn.tab.Constructor = Tab;
|
||
/* TAB DATA-API
|
||
* ============ */
|
||
|
||
$(function () {
|
||
$('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
|
||
e.preventDefault();
|
||
$(this).tab('show');
|
||
});
|
||
});
|
||
}(window.jQuery);
|
||
/* =============================================================
|
||
* bootstrap-typeahead.js v2.1.1
|
||
* http://twitter.github.com/bootstrap/javascript.html#typeahead
|
||
* =============================================================
|
||
* Copyright 2012 Twitter, Inc.
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
* ============================================================ */
|
||
|
||
!function ($) {
|
||
"use strict"; // jshint ;_;
|
||
|
||
/* TYPEAHEAD PUBLIC CLASS DEFINITION
|
||
* ================================= */
|
||
|
||
var Typeahead = function Typeahead(element, options) {
|
||
this.$element = $(element);
|
||
this.options = $.extend({}, $.fn.typeahead.defaults, options);
|
||
this.matcher = this.options.matcher || this.matcher;
|
||
this.sorter = this.options.sorter || this.sorter;
|
||
this.highlighter = this.options.highlighter || this.highlighter;
|
||
this.updater = this.options.updater || this.updater;
|
||
this.$menu = $(this.options.menu).appendTo('body');
|
||
this.source = this.options.source;
|
||
this.shown = false;
|
||
this.listen();
|
||
};
|
||
|
||
Typeahead.prototype = {
|
||
constructor: Typeahead,
|
||
select: function select() {
|
||
var val = this.$menu.find('.active').attr('data-value');
|
||
this.$element.val(this.updater(val)).change();
|
||
return this.hide();
|
||
},
|
||
updater: function updater(item) {
|
||
return item;
|
||
},
|
||
show: function show() {
|
||
var pos = $.extend({}, this.$element.offset(), {
|
||
height: this.$element[0].offsetHeight
|
||
});
|
||
this.$menu.css({
|
||
top: pos.top + pos.height,
|
||
left: pos.left
|
||
});
|
||
this.$menu.show();
|
||
this.shown = true;
|
||
return this;
|
||
},
|
||
hide: function hide() {
|
||
this.$menu.hide();
|
||
this.shown = false;
|
||
return this;
|
||
},
|
||
lookup: function lookup(event) {
|
||
var items;
|
||
this.query = this.$element.val();
|
||
|
||
if (!this.query || this.query.length < this.options.minLength) {
|
||
return this.shown ? this.hide() : this;
|
||
}
|
||
|
||
items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source;
|
||
return items ? this.process(items) : this;
|
||
},
|
||
process: function process(items) {
|
||
var that = this;
|
||
items = $.grep(items, function (item) {
|
||
return that.matcher(item);
|
||
});
|
||
items = this.sorter(items);
|
||
|
||
if (!items.length) {
|
||
return this.shown ? this.hide() : this;
|
||
}
|
||
|
||
return this.render(items.slice(0, this.options.items)).show();
|
||
},
|
||
matcher: function matcher(item) {
|
||
return ~item.toLowerCase().indexOf(this.query.toLowerCase());
|
||
},
|
||
sorter: function sorter(items) {
|
||
var beginswith = [],
|
||
caseSensitive = [],
|
||
caseInsensitive = [],
|
||
item;
|
||
|
||
while (item = items.shift()) {
|
||
if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item);else if (~item.indexOf(this.query)) caseSensitive.push(item);else caseInsensitive.push(item);
|
||
}
|
||
|
||
return beginswith.concat(caseSensitive, caseInsensitive);
|
||
},
|
||
highlighter: function highlighter(item) {
|
||
var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&');
|
||
return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
|
||
return '<strong>' + match + '</strong>';
|
||
});
|
||
},
|
||
render: function render(items) {
|
||
var that = this;
|
||
items = $(items).map(function (i, item) {
|
||
i = $(that.options.item).attr('data-value', item);
|
||
i.find('a').html(that.highlighter(item));
|
||
return i[0];
|
||
});
|
||
items.first().addClass('active');
|
||
this.$menu.html(items);
|
||
return this;
|
||
},
|
||
next: function next(event) {
|
||
var active = this.$menu.find('.active').removeClass('active'),
|
||
next = active.next();
|
||
|
||
if (!next.length) {
|
||
next = $(this.$menu.find('li')[0]);
|
||
}
|
||
|
||
next.addClass('active');
|
||
},
|
||
prev: function prev(event) {
|
||
var active = this.$menu.find('.active').removeClass('active'),
|
||
prev = active.prev();
|
||
|
||
if (!prev.length) {
|
||
prev = this.$menu.find('li').last();
|
||
}
|
||
|
||
prev.addClass('active');
|
||
},
|
||
listen: function listen() {
|
||
this.$element.on('blur', $.proxy(this.blur, this)).on('keypress', $.proxy(this.keypress, this)).on('keyup', $.proxy(this.keyup, this));
|
||
|
||
if ($.browser.chrome || $.browser.webkit || $.browser.msie) {
|
||
this.$element.on('keydown', $.proxy(this.keydown, this));
|
||
}
|
||
|
||
this.$menu.on('click', $.proxy(this.click, this)).on('mouseenter', 'li', $.proxy(this.mouseenter, this));
|
||
},
|
||
move: function move(e) {
|
||
if (!this.shown) return;
|
||
|
||
switch (e.keyCode) {
|
||
case 9: // tab
|
||
|
||
case 13: // enter
|
||
|
||
case 27:
|
||
// escape
|
||
e.preventDefault();
|
||
break;
|
||
|
||
case 38:
|
||
// up arrow
|
||
e.preventDefault();
|
||
this.prev();
|
||
break;
|
||
|
||
case 40:
|
||
// down arrow
|
||
e.preventDefault();
|
||
this.next();
|
||
break;
|
||
}
|
||
|
||
e.stopPropagation();
|
||
},
|
||
keydown: function keydown(e) {
|
||
this.suppressKeyPressRepeat = !~$.inArray(e.keyCode, [40, 38, 9, 13, 27]);
|
||
this.move(e);
|
||
},
|
||
keypress: function keypress(e) {
|
||
if (this.suppressKeyPressRepeat) return;
|
||
this.move(e);
|
||
},
|
||
keyup: function keyup(e) {
|
||
switch (e.keyCode) {
|
||
case 40: // down arrow
|
||
|
||
case 38:
|
||
// up arrow
|
||
break;
|
||
|
||
case 9: // tab
|
||
|
||
case 13:
|
||
// enter
|
||
if (!this.shown) return;
|
||
this.select();
|
||
break;
|
||
|
||
case 27:
|
||
// escape
|
||
if (!this.shown) return;
|
||
this.hide();
|
||
break;
|
||
|
||
default:
|
||
this.lookup();
|
||
}
|
||
|
||
e.stopPropagation();
|
||
e.preventDefault();
|
||
},
|
||
blur: function blur(e) {
|
||
var that = this;
|
||
setTimeout(function () {
|
||
that.hide();
|
||
}, 150);
|
||
},
|
||
click: function click(e) {
|
||
e.stopPropagation();
|
||
e.preventDefault();
|
||
this.select();
|
||
},
|
||
mouseenter: function mouseenter(e) {
|
||
this.$menu.find('.active').removeClass('active');
|
||
$(e.currentTarget).addClass('active');
|
||
}
|
||
};
|
||
/* TYPEAHEAD PLUGIN DEFINITION
|
||
* =========================== */
|
||
|
||
$.fn.typeahead = function (option) {
|
||
return this.each(function () {
|
||
var $this = $(this),
|
||
data = $this.data('typeahead'),
|
||
options = _typeof(option) == 'object' && option;
|
||
if (!data) $this.data('typeahead', data = new Typeahead(this, options));
|
||
if (typeof option == 'string') data[option]();
|
||
});
|
||
};
|
||
|
||
$.fn.typeahead.defaults = {
|
||
source: [],
|
||
items: 8,
|
||
menu: '<ul class="typeahead dropdown-menu"></ul>',
|
||
item: '<li><a href="#"></a></li>',
|
||
minLength: 1
|
||
};
|
||
$.fn.typeahead.Constructor = Typeahead;
|
||
/* TYPEAHEAD DATA-API
|
||
* ================== */
|
||
|
||
$(function () {
|
||
$('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
|
||
var $this = $(this);
|
||
if ($this.data('typeahead')) return;
|
||
e.preventDefault();
|
||
$this.typeahead($this.data());
|
||
});
|
||
});
|
||
}(window.jQuery);
|
||
/* ==========================================================
|
||
* bootstrap-affix.js v2.1.1
|
||
* http://twitter.github.com/bootstrap/javascript.html#affix
|
||
* ==========================================================
|
||
* Copyright 2012 Twitter, Inc.
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
* ========================================================== */
|
||
|
||
!function ($) {
|
||
"use strict"; // jshint ;_;
|
||
|
||
/* AFFIX CLASS DEFINITION
|
||
* ====================== */
|
||
|
||
var Affix = function Affix(element, options) {
|
||
this.options = $.extend({}, $.fn.affix.defaults, options);
|
||
this.$window = $(window).on('scroll.affix.data-api', $.proxy(this.checkPosition, this));
|
||
this.$element = $(element);
|
||
this.checkPosition();
|
||
};
|
||
|
||
Affix.prototype.checkPosition = function () {
|
||
if (!this.$element.is(':visible')) return;
|
||
var scrollHeight = $(document).height(),
|
||
scrollTop = this.$window.scrollTop(),
|
||
position = this.$element.offset(),
|
||
offset = this.options.offset,
|
||
offsetBottom = offset.bottom,
|
||
offsetTop = offset.top,
|
||
reset = 'affix affix-top affix-bottom',
|
||
affix;
|
||
if (_typeof(offset) != 'object') offsetBottom = offsetTop = offset;
|
||
if (typeof offsetTop == 'function') offsetTop = offset.top();
|
||
if (typeof offsetBottom == 'function') offsetBottom = offset.bottom();
|
||
affix = this.unpin != null && scrollTop + this.unpin <= position.top ? false : offsetBottom != null && position.top + this.$element.height() >= scrollHeight - offsetBottom ? 'bottom' : offsetTop != null && scrollTop <= offsetTop ? 'top' : false;
|
||
if (this.affixed === affix) return;
|
||
this.affixed = affix;
|
||
this.unpin = affix == 'bottom' ? position.top - scrollTop : null;
|
||
this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''));
|
||
};
|
||
/* AFFIX PLUGIN DEFINITION
|
||
* ======================= */
|
||
|
||
|
||
$.fn.affix = function (option) {
|
||
return this.each(function () {
|
||
var $this = $(this),
|
||
data = $this.data('affix'),
|
||
options = _typeof(option) == 'object' && option;
|
||
if (!data) $this.data('affix', data = new Affix(this, options));
|
||
if (typeof option == 'string') data[option]();
|
||
});
|
||
};
|
||
|
||
$.fn.affix.Constructor = Affix;
|
||
$.fn.affix.defaults = {
|
||
offset: 0
|
||
};
|
||
/* AFFIX DATA-API
|
||
* ============== */
|
||
|
||
$(window).on('load', function () {
|
||
$('[data-spy="affix"]').each(function () {
|
||
var $spy = $(this),
|
||
data = $spy.data();
|
||
data.offset = data.offset || {};
|
||
data.offsetBottom && (data.offset.bottom = data.offsetBottom);
|
||
data.offsetTop && (data.offset.top = data.offsetTop);
|
||
$spy.affix(data);
|
||
});
|
||
});
|
||
}(window.jQuery);
|
||
|
||
},{}],3:[function(require,module,exports){
|
||
"use strict";
|
||
|
||
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
||
|
||
/*!
|
||
* jQuery JavaScript Library v1.8.1
|
||
* http://jquery.com/
|
||
*
|
||
* Includes Sizzle.js
|
||
* http://sizzlejs.com/
|
||
*
|
||
* Copyright 2012 jQuery Foundation and other contributors
|
||
* Released under the MIT license
|
||
* http://jquery.org/license
|
||
*
|
||
* Date: Thu Aug 30 2012 17:17:22 GMT-0400 (Eastern Daylight Time)
|
||
*/
|
||
(function (window, undefined) {
|
||
var // A central reference to the root jQuery(document)
|
||
rootjQuery,
|
||
// The deferred used on DOM ready
|
||
readyList,
|
||
// Use the correct document accordingly with window argument (sandbox)
|
||
document = window.document,
|
||
location = window.location,
|
||
navigator = window.navigator,
|
||
// Map over jQuery in case of overwrite
|
||
_jQuery = window.jQuery,
|
||
// Map over the $ in case of overwrite
|
||
_$ = window.$,
|
||
// Save a reference to some core methods
|
||
core_push = Array.prototype.push,
|
||
core_slice = Array.prototype.slice,
|
||
core_indexOf = Array.prototype.indexOf,
|
||
core_toString = Object.prototype.toString,
|
||
core_hasOwn = Object.prototype.hasOwnProperty,
|
||
core_trim = String.prototype.trim,
|
||
// Define a local copy of jQuery
|
||
jQuery = function jQuery(selector, context) {
|
||
// The jQuery object is actually just the init constructor 'enhanced'
|
||
return new jQuery.fn.init(selector, context, rootjQuery);
|
||
},
|
||
// Used for matching numbers
|
||
core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
|
||
// Used for detecting and trimming whitespace
|
||
core_rnotwhite = /\S/,
|
||
core_rspace = /\s+/,
|
||
// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
|
||
rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
|
||
// A simple way to check for HTML strings
|
||
// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
|
||
rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
|
||
// Match a standalone tag
|
||
rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
|
||
// JSON RegExp
|
||
rvalidchars = /^[\],:{}\s]*$/,
|
||
rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
|
||
rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
|
||
rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
|
||
// Matches dashed string for camelizing
|
||
rmsPrefix = /^-ms-/,
|
||
rdashAlpha = /-([\da-z])/gi,
|
||
// Used by jQuery.camelCase as callback to replace()
|
||
fcamelCase = function fcamelCase(all, letter) {
|
||
return (letter + "").toUpperCase();
|
||
},
|
||
// The ready event handler and self cleanup method
|
||
DOMContentLoaded = function DOMContentLoaded() {
|
||
if (document.addEventListener) {
|
||
document.removeEventListener("DOMContentLoaded", DOMContentLoaded, false);
|
||
jQuery.ready();
|
||
} else if (document.readyState === "complete") {
|
||
// we're here because readyState === "complete" in oldIE
|
||
// which is good enough for us to call the dom ready!
|
||
document.detachEvent("onreadystatechange", DOMContentLoaded);
|
||
jQuery.ready();
|
||
}
|
||
},
|
||
// [[Class]] -> type pairs
|
||
class2type = {};
|
||
|
||
jQuery.fn = jQuery.prototype = {
|
||
constructor: jQuery,
|
||
init: function init(selector, context, rootjQuery) {
|
||
var match, elem, ret, doc; // Handle $(""), $(null), $(undefined), $(false)
|
||
|
||
if (!selector) {
|
||
return this;
|
||
} // Handle $(DOMElement)
|
||
|
||
|
||
if (selector.nodeType) {
|
||
this.context = this[0] = selector;
|
||
this.length = 1;
|
||
return this;
|
||
} // Handle HTML strings
|
||
|
||
|
||
if (typeof selector === "string") {
|
||
if (selector.charAt(0) === "<" && selector.charAt(selector.length - 1) === ">" && selector.length >= 3) {
|
||
// Assume that strings that start and end with <> are HTML and skip the regex check
|
||
match = [null, selector, null];
|
||
} else {
|
||
match = rquickExpr.exec(selector);
|
||
} // Match html or make sure no context is specified for #id
|
||
|
||
|
||
if (match && (match[1] || !context)) {
|
||
// HANDLE: $(html) -> $(array)
|
||
if (match[1]) {
|
||
context = context instanceof jQuery ? context[0] : context;
|
||
doc = context && context.nodeType ? context.ownerDocument || context : document; // scripts is true for back-compat
|
||
|
||
selector = jQuery.parseHTML(match[1], doc, true);
|
||
|
||
if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {
|
||
this.attr.call(selector, context, true);
|
||
}
|
||
|
||
return jQuery.merge(this, selector); // HANDLE: $(#id)
|
||
} else {
|
||
elem = document.getElementById(match[2]); // Check parentNode to catch when Blackberry 4.6 returns
|
||
// nodes that are no longer in the document #6963
|
||
|
||
if (elem && elem.parentNode) {
|
||
// Handle the case where IE and Opera return items
|
||
// by name instead of ID
|
||
if (elem.id !== match[2]) {
|
||
return rootjQuery.find(selector);
|
||
} // Otherwise, we inject the element directly into the jQuery object
|
||
|
||
|
||
this.length = 1;
|
||
this[0] = elem;
|
||
}
|
||
|
||
this.context = document;
|
||
this.selector = selector;
|
||
return this;
|
||
} // HANDLE: $(expr, $(...))
|
||
|
||
} else if (!context || context.jquery) {
|
||
return (context || rootjQuery).find(selector); // HANDLE: $(expr, context)
|
||
// (which is just equivalent to: $(context).find(expr)
|
||
} else {
|
||
return this.constructor(context).find(selector);
|
||
} // HANDLE: $(function)
|
||
// Shortcut for document ready
|
||
|
||
} else if (jQuery.isFunction(selector)) {
|
||
return rootjQuery.ready(selector);
|
||
}
|
||
|
||
if (selector.selector !== undefined) {
|
||
this.selector = selector.selector;
|
||
this.context = selector.context;
|
||
}
|
||
|
||
return jQuery.makeArray(selector, this);
|
||
},
|
||
// Start with an empty selector
|
||
selector: "",
|
||
// The current version of jQuery being used
|
||
jquery: "1.8.1",
|
||
// The default length of a jQuery object is 0
|
||
length: 0,
|
||
// The number of elements contained in the matched element set
|
||
size: function size() {
|
||
return this.length;
|
||
},
|
||
toArray: function toArray() {
|
||
return core_slice.call(this);
|
||
},
|
||
// Get the Nth element in the matched element set OR
|
||
// Get the whole matched element set as a clean array
|
||
get: function get(num) {
|
||
return num == null ? // Return a 'clean' array
|
||
this.toArray() : // Return just the object
|
||
num < 0 ? this[this.length + num] : this[num];
|
||
},
|
||
// Take an array of elements and push it onto the stack
|
||
// (returning the new matched element set)
|
||
pushStack: function pushStack(elems, name, selector) {
|
||
// Build a new jQuery matched element set
|
||
var ret = jQuery.merge(this.constructor(), elems); // Add the old object onto the stack (as a reference)
|
||
|
||
ret.prevObject = this;
|
||
ret.context = this.context;
|
||
|
||
if (name === "find") {
|
||
ret.selector = this.selector + (this.selector ? " " : "") + selector;
|
||
} else if (name) {
|
||
ret.selector = this.selector + "." + name + "(" + selector + ")";
|
||
} // Return the newly-formed element set
|
||
|
||
|
||
return ret;
|
||
},
|
||
// Execute a callback for every element in the matched set.
|
||
// (You can seed the arguments with an array of args, but this is
|
||
// only used internally.)
|
||
each: function each(callback, args) {
|
||
return jQuery.each(this, callback, args);
|
||
},
|
||
ready: function ready(fn) {
|
||
// Add the callback
|
||
jQuery.ready.promise().done(fn);
|
||
return this;
|
||
},
|
||
eq: function eq(i) {
|
||
i = +i;
|
||
return i === -1 ? this.slice(i) : this.slice(i, i + 1);
|
||
},
|
||
first: function first() {
|
||
return this.eq(0);
|
||
},
|
||
last: function last() {
|
||
return this.eq(-1);
|
||
},
|
||
slice: function slice() {
|
||
return this.pushStack(core_slice.apply(this, arguments), "slice", core_slice.call(arguments).join(","));
|
||
},
|
||
map: function map(callback) {
|
||
return this.pushStack(jQuery.map(this, function (elem, i) {
|
||
return callback.call(elem, i, elem);
|
||
}));
|
||
},
|
||
end: function end() {
|
||
return this.prevObject || this.constructor(null);
|
||
},
|
||
// For internal use only.
|
||
// Behaves like an Array's method, not like a jQuery method.
|
||
push: core_push,
|
||
sort: [].sort,
|
||
splice: [].splice
|
||
}; // Give the init function the jQuery prototype for later instantiation
|
||
|
||
jQuery.fn.init.prototype = jQuery.fn;
|
||
|
||
jQuery.extend = jQuery.fn.extend = function () {
|
||
var options,
|
||
name,
|
||
src,
|
||
copy,
|
||
copyIsArray,
|
||
clone,
|
||
target = arguments[0] || {},
|
||
i = 1,
|
||
length = arguments.length,
|
||
deep = false; // Handle a deep copy situation
|
||
|
||
if (typeof target === "boolean") {
|
||
deep = target;
|
||
target = arguments[1] || {}; // skip the boolean and the target
|
||
|
||
i = 2;
|
||
} // Handle case when target is a string or something (possible in deep copy)
|
||
|
||
|
||
if (_typeof(target) !== "object" && !jQuery.isFunction(target)) {
|
||
target = {};
|
||
} // extend jQuery itself if only one argument is passed
|
||
|
||
|
||
if (length === i) {
|
||
target = this;
|
||
--i;
|
||
}
|
||
|
||
for (; i < length; i++) {
|
||
// Only deal with non-null/undefined values
|
||
if ((options = arguments[i]) != null) {
|
||
// Extend the base object
|
||
for (name in options) {
|
||
src = target[name];
|
||
copy = options[name]; // Prevent never-ending loop
|
||
|
||
if (target === copy) {
|
||
continue;
|
||
} // Recurse if we're merging plain objects or arrays
|
||
|
||
|
||
if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) {
|
||
if (copyIsArray) {
|
||
copyIsArray = false;
|
||
clone = src && jQuery.isArray(src) ? src : [];
|
||
} else {
|
||
clone = src && jQuery.isPlainObject(src) ? src : {};
|
||
} // Never move original objects, clone them
|
||
|
||
|
||
target[name] = jQuery.extend(deep, clone, copy); // Don't bring in undefined values
|
||
} else if (copy !== undefined) {
|
||
target[name] = copy;
|
||
}
|
||
}
|
||
}
|
||
} // Return the modified object
|
||
|
||
|
||
return target;
|
||
};
|
||
|
||
jQuery.extend({
|
||
noConflict: function noConflict(deep) {
|
||
if (window.$ === jQuery) {
|
||
window.$ = _$;
|
||
}
|
||
|
||
if (deep && window.jQuery === jQuery) {
|
||
window.jQuery = _jQuery;
|
||
}
|
||
|
||
return jQuery;
|
||
},
|
||
// Is the DOM ready to be used? Set to true once it occurs.
|
||
isReady: false,
|
||
// A counter to track how many items to wait for before
|
||
// the ready event fires. See #6781
|
||
readyWait: 1,
|
||
// Hold (or release) the ready event
|
||
holdReady: function holdReady(hold) {
|
||
if (hold) {
|
||
jQuery.readyWait++;
|
||
} else {
|
||
jQuery.ready(true);
|
||
}
|
||
},
|
||
// Handle when the DOM is ready
|
||
ready: function ready(wait) {
|
||
// Abort if there are pending holds or we're already ready
|
||
if (wait === true ? --jQuery.readyWait : jQuery.isReady) {
|
||
return;
|
||
} // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
|
||
|
||
|
||
if (!document.body) {
|
||
return setTimeout(jQuery.ready, 1);
|
||
} // Remember that the DOM is ready
|
||
|
||
|
||
jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be
|
||
|
||
if (wait !== true && --jQuery.readyWait > 0) {
|
||
return;
|
||
} // If there are functions bound, to execute
|
||
|
||
|
||
readyList.resolveWith(document, [jQuery]); // Trigger any bound ready events
|
||
|
||
if (jQuery.fn.trigger) {
|
||
jQuery(document).trigger("ready").off("ready");
|
||
}
|
||
},
|
||
// See test/unit/core.js for details concerning isFunction.
|
||
// Since version 1.3, DOM methods and functions like alert
|
||
// aren't supported. They return false on IE (#2968).
|
||
isFunction: function isFunction(obj) {
|
||
return jQuery.type(obj) === "function";
|
||
},
|
||
isArray: Array.isArray || function (obj) {
|
||
return jQuery.type(obj) === "array";
|
||
},
|
||
isWindow: function isWindow(obj) {
|
||
return obj != null && obj == obj.window;
|
||
},
|
||
isNumeric: function isNumeric(obj) {
|
||
return !isNaN(parseFloat(obj)) && isFinite(obj);
|
||
},
|
||
type: function type(obj) {
|
||
return obj == null ? String(obj) : class2type[core_toString.call(obj)] || "object";
|
||
},
|
||
isPlainObject: function isPlainObject(obj) {
|
||
// Must be an Object.
|
||
// Because of IE, we also have to check the presence of the constructor property.
|
||
// Make sure that DOM nodes and window objects don't pass through, as well
|
||
if (!obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow(obj)) {
|
||
return false;
|
||
}
|
||
|
||
try {
|
||
// Not own constructor property must be Object
|
||
if (obj.constructor && !core_hasOwn.call(obj, "constructor") && !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) {
|
||
return false;
|
||
}
|
||
} catch (e) {
|
||
// IE8,9 Will throw exceptions on certain host objects #9897
|
||
return false;
|
||
} // Own properties are enumerated firstly, so to speed up,
|
||
// if last one is own, then all properties are own.
|
||
|
||
|
||
var key;
|
||
|
||
for (key in obj) {}
|
||
|
||
return key === undefined || core_hasOwn.call(obj, key);
|
||
},
|
||
isEmptyObject: function isEmptyObject(obj) {
|
||
var name;
|
||
|
||
for (name in obj) {
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
},
|
||
error: function error(msg) {
|
||
throw new Error(msg);
|
||
},
|
||
// data: string of html
|
||
// context (optional): If specified, the fragment will be created in this context, defaults to document
|
||
// scripts (optional): If true, will include scripts passed in the html string
|
||
parseHTML: function parseHTML(data, context, scripts) {
|
||
var parsed;
|
||
|
||
if (!data || typeof data !== "string") {
|
||
return null;
|
||
}
|
||
|
||
if (typeof context === "boolean") {
|
||
scripts = context;
|
||
context = 0;
|
||
}
|
||
|
||
context = context || document; // Single tag
|
||
|
||
if (parsed = rsingleTag.exec(data)) {
|
||
return [context.createElement(parsed[1])];
|
||
}
|
||
|
||
parsed = jQuery.buildFragment([data], context, scripts ? null : []);
|
||
return jQuery.merge([], (parsed.cacheable ? jQuery.clone(parsed.fragment) : parsed.fragment).childNodes);
|
||
},
|
||
parseJSON: function parseJSON(data) {
|
||
if (!data || typeof data !== "string") {
|
||
return null;
|
||
} // Make sure leading/trailing whitespace is removed (IE can't handle it)
|
||
|
||
|
||
data = jQuery.trim(data); // Attempt to parse using the native JSON parser first
|
||
|
||
if (window.JSON && window.JSON.parse) {
|
||
return window.JSON.parse(data);
|
||
} // Make sure the incoming data is actual JSON
|
||
// Logic borrowed from http://json.org/json2.js
|
||
|
||
|
||
if (rvalidchars.test(data.replace(rvalidescape, "@").replace(rvalidtokens, "]").replace(rvalidbraces, ""))) {
|
||
return new Function("return " + data)();
|
||
}
|
||
|
||
jQuery.error("Invalid JSON: " + data);
|
||
},
|
||
// Cross-browser xml parsing
|
||
parseXML: function parseXML(data) {
|
||
var xml, tmp;
|
||
|
||
if (!data || typeof data !== "string") {
|
||
return null;
|
||
}
|
||
|
||
try {
|
||
if (window.DOMParser) {
|
||
// Standard
|
||
tmp = new DOMParser();
|
||
xml = tmp.parseFromString(data, "text/xml");
|
||
} else {
|
||
// IE
|
||
xml = new ActiveXObject("Microsoft.XMLDOM");
|
||
xml.async = "false";
|
||
xml.loadXML(data);
|
||
}
|
||
} catch (e) {
|
||
xml = undefined;
|
||
}
|
||
|
||
if (!xml || !xml.documentElement || xml.getElementsByTagName("parsererror").length) {
|
||
jQuery.error("Invalid XML: " + data);
|
||
}
|
||
|
||
return xml;
|
||
},
|
||
noop: function noop() {},
|
||
// Evaluates a script in a global context
|
||
// Workarounds based on findings by Jim Driscoll
|
||
// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
|
||
globalEval: function globalEval(data) {
|
||
if (data && core_rnotwhite.test(data)) {
|
||
// We use execScript on Internet Explorer
|
||
// We use an anonymous function so that context is window
|
||
// rather than jQuery in Firefox
|
||
(window.execScript || function (data) {
|
||
window["eval"].call(window, data);
|
||
})(data);
|
||
}
|
||
},
|
||
// Convert dashed to camelCase; used by the css and data modules
|
||
// Microsoft forgot to hump their vendor prefix (#9572)
|
||
camelCase: function camelCase(string) {
|
||
return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase);
|
||
},
|
||
nodeName: function nodeName(elem, name) {
|
||
return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
|
||
},
|
||
// args is for internal usage only
|
||
each: function each(obj, callback, args) {
|
||
var name,
|
||
i = 0,
|
||
length = obj.length,
|
||
isObj = length === undefined || jQuery.isFunction(obj);
|
||
|
||
if (args) {
|
||
if (isObj) {
|
||
for (name in obj) {
|
||
if (callback.apply(obj[name], args) === false) {
|
||
break;
|
||
}
|
||
}
|
||
} else {
|
||
for (; i < length;) {
|
||
if (callback.apply(obj[i++], args) === false) {
|
||
break;
|
||
}
|
||
}
|
||
} // A special, fast, case for the most common use of each
|
||
|
||
} else {
|
||
if (isObj) {
|
||
for (name in obj) {
|
||
if (callback.call(obj[name], name, obj[name]) === false) {
|
||
break;
|
||
}
|
||
}
|
||
} else {
|
||
for (; i < length;) {
|
||
if (callback.call(obj[i], i, obj[i++]) === false) {
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return obj;
|
||
},
|
||
// Use native String.trim function wherever possible
|
||
trim: core_trim && !core_trim.call("\uFEFF\xA0") ? function (text) {
|
||
return text == null ? "" : core_trim.call(text);
|
||
} : // Otherwise use our own trimming functionality
|
||
function (text) {
|
||
return text == null ? "" : text.toString().replace(rtrim, "");
|
||
},
|
||
// results is for internal usage only
|
||
makeArray: function makeArray(arr, results) {
|
||
var type,
|
||
ret = results || [];
|
||
|
||
if (arr != null) {
|
||
// The window, strings (and functions) also have 'length'
|
||
// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
|
||
type = jQuery.type(arr);
|
||
|
||
if (arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow(arr)) {
|
||
core_push.call(ret, arr);
|
||
} else {
|
||
jQuery.merge(ret, arr);
|
||
}
|
||
}
|
||
|
||
return ret;
|
||
},
|
||
inArray: function inArray(elem, arr, i) {
|
||
var len;
|
||
|
||
if (arr) {
|
||
if (core_indexOf) {
|
||
return core_indexOf.call(arr, elem, i);
|
||
}
|
||
|
||
len = arr.length;
|
||
i = i ? i < 0 ? Math.max(0, len + i) : i : 0;
|
||
|
||
for (; i < len; i++) {
|
||
// Skip accessing in sparse arrays
|
||
if (i in arr && arr[i] === elem) {
|
||
return i;
|
||
}
|
||
}
|
||
}
|
||
|
||
return -1;
|
||
},
|
||
merge: function merge(first, second) {
|
||
var l = second.length,
|
||
i = first.length,
|
||
j = 0;
|
||
|
||
if (typeof l === "number") {
|
||
for (; j < l; j++) {
|
||
first[i++] = second[j];
|
||
}
|
||
} else {
|
||
while (second[j] !== undefined) {
|
||
first[i++] = second[j++];
|
||
}
|
||
}
|
||
|
||
first.length = i;
|
||
return first;
|
||
},
|
||
grep: function grep(elems, callback, inv) {
|
||
var retVal,
|
||
ret = [],
|
||
i = 0,
|
||
length = elems.length;
|
||
inv = !!inv; // Go through the array, only saving the items
|
||
// that pass the validator function
|
||
|
||
for (; i < length; i++) {
|
||
retVal = !!callback(elems[i], i);
|
||
|
||
if (inv !== retVal) {
|
||
ret.push(elems[i]);
|
||
}
|
||
}
|
||
|
||
return ret;
|
||
},
|
||
// arg is for internal usage only
|
||
map: function map(elems, callback, arg) {
|
||
var value,
|
||
key,
|
||
ret = [],
|
||
i = 0,
|
||
length = elems.length,
|
||
// jquery objects are treated as arrays
|
||
isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && (length > 0 && elems[0] && elems[length - 1] || length === 0 || jQuery.isArray(elems)); // Go through the array, translating each of the items to their
|
||
|
||
if (isArray) {
|
||
for (; i < length; i++) {
|
||
value = callback(elems[i], i, arg);
|
||
|
||
if (value != null) {
|
||
ret[ret.length] = value;
|
||
}
|
||
} // Go through every key on the object,
|
||
|
||
} else {
|
||
for (key in elems) {
|
||
value = callback(elems[key], key, arg);
|
||
|
||
if (value != null) {
|
||
ret[ret.length] = value;
|
||
}
|
||
}
|
||
} // Flatten any nested arrays
|
||
|
||
|
||
return ret.concat.apply([], ret);
|
||
},
|
||
// A global GUID counter for objects
|
||
guid: 1,
|
||
// Bind a function to a context, optionally partially applying any
|
||
// arguments.
|
||
proxy: function proxy(fn, context) {
|
||
var tmp, args, proxy;
|
||
|
||
if (typeof context === "string") {
|
||
tmp = fn[context];
|
||
context = fn;
|
||
fn = tmp;
|
||
} // Quick check to determine if target is callable, in the spec
|
||
// this throws a TypeError, but we will just return undefined.
|
||
|
||
|
||
if (!jQuery.isFunction(fn)) {
|
||
return undefined;
|
||
} // Simulated bind
|
||
|
||
|
||
args = core_slice.call(arguments, 2);
|
||
|
||
proxy = function proxy() {
|
||
return fn.apply(context, args.concat(core_slice.call(arguments)));
|
||
}; // Set the guid of unique handler to the same of original handler, so it can be removed
|
||
|
||
|
||
proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
|
||
return proxy;
|
||
},
|
||
// Multifunctional method to get and set values of a collection
|
||
// The value/s can optionally be executed if it's a function
|
||
access: function access(elems, fn, key, value, chainable, emptyGet, pass) {
|
||
var exec,
|
||
bulk = key == null,
|
||
i = 0,
|
||
length = elems.length; // Sets many values
|
||
|
||
if (key && _typeof(key) === "object") {
|
||
for (i in key) {
|
||
jQuery.access(elems, fn, i, key[i], 1, emptyGet, value);
|
||
}
|
||
|
||
chainable = 1; // Sets one value
|
||
} else if (value !== undefined) {
|
||
// Optionally, function values get executed if exec is true
|
||
exec = pass === undefined && jQuery.isFunction(value);
|
||
|
||
if (bulk) {
|
||
// Bulk operations only iterate when executing function values
|
||
if (exec) {
|
||
exec = fn;
|
||
|
||
fn = function fn(elem, key, value) {
|
||
return exec.call(jQuery(elem), value);
|
||
}; // Otherwise they run against the entire set
|
||
|
||
} else {
|
||
fn.call(elems, value);
|
||
fn = null;
|
||
}
|
||
}
|
||
|
||
if (fn) {
|
||
for (; i < length; i++) {
|
||
fn(elems[i], key, exec ? value.call(elems[i], i, fn(elems[i], key)) : value, pass);
|
||
}
|
||
}
|
||
|
||
chainable = 1;
|
||
}
|
||
|
||
return chainable ? elems : // Gets
|
||
bulk ? fn.call(elems) : length ? fn(elems[0], key) : emptyGet;
|
||
},
|
||
now: function now() {
|
||
return new Date().getTime();
|
||
}
|
||
});
|
||
|
||
jQuery.ready.promise = function (obj) {
|
||
if (!readyList) {
|
||
readyList = jQuery.Deferred(); // Catch cases where $(document).ready() is called after the browser event has already occurred.
|
||
// we once tried to use readyState "interactive" here, but it caused issues like the one
|
||
// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
|
||
|
||
if (document.readyState === "complete") {
|
||
// Handle it asynchronously to allow scripts the opportunity to delay ready
|
||
setTimeout(jQuery.ready, 1); // Standards-based browsers support DOMContentLoaded
|
||
} else if (document.addEventListener) {
|
||
// Use the handy event callback
|
||
document.addEventListener("DOMContentLoaded", DOMContentLoaded, false); // A fallback to window.onload, that will always work
|
||
|
||
window.addEventListener("load", jQuery.ready, false); // If IE event model is used
|
||
} else {
|
||
// Ensure firing before onload, maybe late but safe also for iframes
|
||
document.attachEvent("onreadystatechange", DOMContentLoaded); // A fallback to window.onload, that will always work
|
||
|
||
window.attachEvent("onload", jQuery.ready); // If IE and not a frame
|
||
// continually check to see if the document is ready
|
||
|
||
var top = false;
|
||
|
||
try {
|
||
top = window.frameElement == null && document.documentElement;
|
||
} catch (e) {}
|
||
|
||
if (top && top.doScroll) {
|
||
(function doScrollCheck() {
|
||
if (!jQuery.isReady) {
|
||
try {
|
||
// Use the trick by Diego Perini
|
||
// http://javascript.nwbox.com/IEContentLoaded/
|
||
top.doScroll("left");
|
||
} catch (e) {
|
||
return setTimeout(doScrollCheck, 50);
|
||
} // and execute any waiting functions
|
||
|
||
|
||
jQuery.ready();
|
||
}
|
||
})();
|
||
}
|
||
}
|
||
}
|
||
|
||
return readyList.promise(obj);
|
||
}; // Populate the class2type map
|
||
|
||
|
||
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function (i, name) {
|
||
class2type["[object " + name + "]"] = name.toLowerCase();
|
||
}); // All jQuery objects should point back to these
|
||
|
||
rootjQuery = jQuery(document); // String to Object options format cache
|
||
|
||
var optionsCache = {}; // Convert String-formatted options into Object-formatted ones and store in cache
|
||
|
||
function createOptions(options) {
|
||
var object = optionsCache[options] = {};
|
||
jQuery.each(options.split(core_rspace), function (_, flag) {
|
||
object[flag] = true;
|
||
});
|
||
return object;
|
||
}
|
||
/*
|
||
* Create a callback list using the following parameters:
|
||
*
|
||
* options: an optional list of space-separated options that will change how
|
||
* the callback list behaves or a more traditional option object
|
||
*
|
||
* By default a callback list will act like an event callback list and can be
|
||
* "fired" multiple times.
|
||
*
|
||
* Possible options:
|
||
*
|
||
* once: will ensure the callback list can only be fired once (like a Deferred)
|
||
*
|
||
* memory: will keep track of previous values and will call any callback added
|
||
* after the list has been fired right away with the latest "memorized"
|
||
* values (like a Deferred)
|
||
*
|
||
* unique: will ensure a callback can only be added once (no duplicate in the list)
|
||
*
|
||
* stopOnFalse: interrupt callings when a callback returns false
|
||
*
|
||
*/
|
||
|
||
|
||
jQuery.Callbacks = function (options) {
|
||
// Convert options from String-formatted to Object-formatted if needed
|
||
// (we check in cache first)
|
||
options = typeof options === "string" ? optionsCache[options] || createOptions(options) : jQuery.extend({}, options);
|
||
|
||
var // Last fire value (for non-forgettable lists)
|
||
memory,
|
||
// Flag to know if list was already fired
|
||
_fired,
|
||
// Flag to know if list is currently firing
|
||
firing,
|
||
// First callback to fire (used internally by add and fireWith)
|
||
firingStart,
|
||
// End of the loop when firing
|
||
firingLength,
|
||
// Index of currently firing callback (modified by remove if needed)
|
||
firingIndex,
|
||
// Actual callback list
|
||
list = [],
|
||
// Stack of fire calls for repeatable lists
|
||
stack = !options.once && [],
|
||
// Fire callbacks
|
||
fire = function fire(data) {
|
||
memory = options.memory && data;
|
||
_fired = true;
|
||
firingIndex = firingStart || 0;
|
||
firingStart = 0;
|
||
firingLength = list.length;
|
||
firing = true;
|
||
|
||
for (; list && firingIndex < firingLength; firingIndex++) {
|
||
if (list[firingIndex].apply(data[0], data[1]) === false && options.stopOnFalse) {
|
||
memory = false; // To prevent further calls using add
|
||
|
||
break;
|
||
}
|
||
}
|
||
|
||
firing = false;
|
||
|
||
if (list) {
|
||
if (stack) {
|
||
if (stack.length) {
|
||
fire(stack.shift());
|
||
}
|
||
} else if (memory) {
|
||
list = [];
|
||
} else {
|
||
self.disable();
|
||
}
|
||
}
|
||
},
|
||
// Actual Callbacks object
|
||
self = {
|
||
// Add a callback or a collection of callbacks to the list
|
||
add: function add() {
|
||
if (list) {
|
||
// First, we save the current length
|
||
var start = list.length;
|
||
|
||
(function add(args) {
|
||
jQuery.each(args, function (_, arg) {
|
||
var type = jQuery.type(arg);
|
||
|
||
if (type === "function" && (!options.unique || !self.has(arg))) {
|
||
list.push(arg);
|
||
} else if (arg && arg.length && type !== "string") {
|
||
// Inspect recursively
|
||
add(arg);
|
||
}
|
||
});
|
||
})(arguments); // Do we need to add the callbacks to the
|
||
// current firing batch?
|
||
|
||
|
||
if (firing) {
|
||
firingLength = list.length; // With memory, if we're not firing then
|
||
// we should call right away
|
||
} else if (memory) {
|
||
firingStart = start;
|
||
fire(memory);
|
||
}
|
||
}
|
||
|
||
return this;
|
||
},
|
||
// Remove a callback from the list
|
||
remove: function remove() {
|
||
if (list) {
|
||
jQuery.each(arguments, function (_, arg) {
|
||
var index;
|
||
|
||
while ((index = jQuery.inArray(arg, list, index)) > -1) {
|
||
list.splice(index, 1); // Handle firing indexes
|
||
|
||
if (firing) {
|
||
if (index <= firingLength) {
|
||
firingLength--;
|
||
}
|
||
|
||
if (index <= firingIndex) {
|
||
firingIndex--;
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
return this;
|
||
},
|
||
// Control if a given callback is in the list
|
||
has: function has(fn) {
|
||
return jQuery.inArray(fn, list) > -1;
|
||
},
|
||
// Remove all callbacks from the list
|
||
empty: function empty() {
|
||
list = [];
|
||
return this;
|
||
},
|
||
// Have the list do nothing anymore
|
||
disable: function disable() {
|
||
list = stack = memory = undefined;
|
||
return this;
|
||
},
|
||
// Is it disabled?
|
||
disabled: function disabled() {
|
||
return !list;
|
||
},
|
||
// Lock the list in its current state
|
||
lock: function lock() {
|
||
stack = undefined;
|
||
|
||
if (!memory) {
|
||
self.disable();
|
||
}
|
||
|
||
return this;
|
||
},
|
||
// Is it locked?
|
||
locked: function locked() {
|
||
return !stack;
|
||
},
|
||
// Call all callbacks with the given context and arguments
|
||
fireWith: function fireWith(context, args) {
|
||
args = args || [];
|
||
args = [context, args.slice ? args.slice() : args];
|
||
|
||
if (list && (!_fired || stack)) {
|
||
if (firing) {
|
||
stack.push(args);
|
||
} else {
|
||
fire(args);
|
||
}
|
||
}
|
||
|
||
return this;
|
||
},
|
||
// Call all the callbacks with the given arguments
|
||
fire: function fire() {
|
||
self.fireWith(this, arguments);
|
||
return this;
|
||
},
|
||
// To know if the callbacks have already been called at least once
|
||
fired: function fired() {
|
||
return !!_fired;
|
||
}
|
||
};
|
||
|
||
return self;
|
||
};
|
||
|
||
jQuery.extend({
|
||
Deferred: function Deferred(func) {
|
||
var tuples = [// action, add listener, listener list, final state
|
||
["resolve", "done", jQuery.Callbacks("once memory"), "resolved"], ["reject", "fail", jQuery.Callbacks("once memory"), "rejected"], ["notify", "progress", jQuery.Callbacks("memory")]],
|
||
_state = "pending",
|
||
_promise = {
|
||
state: function state() {
|
||
return _state;
|
||
},
|
||
always: function always() {
|
||
deferred.done(arguments).fail(arguments);
|
||
return this;
|
||
},
|
||
then: function then()
|
||
/* fnDone, fnFail, fnProgress */
|
||
{
|
||
var fns = arguments;
|
||
return jQuery.Deferred(function (newDefer) {
|
||
jQuery.each(tuples, function (i, tuple) {
|
||
var action = tuple[0],
|
||
fn = fns[i]; // deferred[ done | fail | progress ] for forwarding actions to newDefer
|
||
|
||
deferred[tuple[1]](jQuery.isFunction(fn) ? function () {
|
||
var returned = fn.apply(this, arguments);
|
||
|
||
if (returned && jQuery.isFunction(returned.promise)) {
|
||
returned.promise().done(newDefer.resolve).fail(newDefer.reject).progress(newDefer.notify);
|
||
} else {
|
||
newDefer[action + "With"](this === deferred ? newDefer : this, [returned]);
|
||
}
|
||
} : newDefer[action]);
|
||
});
|
||
fns = null;
|
||
}).promise();
|
||
},
|
||
// Get a promise for this deferred
|
||
// If obj is provided, the promise aspect is added to the object
|
||
promise: function promise(obj) {
|
||
return _typeof(obj) === "object" ? jQuery.extend(obj, _promise) : _promise;
|
||
}
|
||
},
|
||
deferred = {}; // Keep pipe for back-compat
|
||
|
||
_promise.pipe = _promise.then; // Add list-specific methods
|
||
|
||
jQuery.each(tuples, function (i, tuple) {
|
||
var list = tuple[2],
|
||
stateString = tuple[3]; // promise[ done | fail | progress ] = list.add
|
||
|
||
_promise[tuple[1]] = list.add; // Handle state
|
||
|
||
if (stateString) {
|
||
list.add(function () {
|
||
// state = [ resolved | rejected ]
|
||
_state = stateString; // [ reject_list | resolve_list ].disable; progress_list.lock
|
||
}, tuples[i ^ 1][2].disable, tuples[2][2].lock);
|
||
} // deferred[ resolve | reject | notify ] = list.fire
|
||
|
||
|
||
deferred[tuple[0]] = list.fire;
|
||
deferred[tuple[0] + "With"] = list.fireWith;
|
||
}); // Make the deferred a promise
|
||
|
||
_promise.promise(deferred); // Call given func if any
|
||
|
||
|
||
if (func) {
|
||
func.call(deferred, deferred);
|
||
} // All done!
|
||
|
||
|
||
return deferred;
|
||
},
|
||
// Deferred helper
|
||
when: function when(subordinate
|
||
/* , ..., subordinateN */
|
||
) {
|
||
var i = 0,
|
||
resolveValues = core_slice.call(arguments),
|
||
length = resolveValues.length,
|
||
// the count of uncompleted subordinates
|
||
remaining = length !== 1 || subordinate && jQuery.isFunction(subordinate.promise) ? length : 0,
|
||
// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
|
||
deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
|
||
// Update function for both resolve and progress values
|
||
updateFunc = function updateFunc(i, contexts, values) {
|
||
return function (value) {
|
||
contexts[i] = this;
|
||
values[i] = arguments.length > 1 ? core_slice.call(arguments) : value;
|
||
|
||
if (values === progressValues) {
|
||
deferred.notifyWith(contexts, values);
|
||
} else if (! --remaining) {
|
||
deferred.resolveWith(contexts, values);
|
||
}
|
||
};
|
||
},
|
||
progressValues,
|
||
progressContexts,
|
||
resolveContexts; // add listeners to Deferred subordinates; treat others as resolved
|
||
|
||
|
||
if (length > 1) {
|
||
progressValues = new Array(length);
|
||
progressContexts = new Array(length);
|
||
resolveContexts = new Array(length);
|
||
|
||
for (; i < length; i++) {
|
||
if (resolveValues[i] && jQuery.isFunction(resolveValues[i].promise)) {
|
||
resolveValues[i].promise().done(updateFunc(i, resolveContexts, resolveValues)).fail(deferred.reject).progress(updateFunc(i, progressContexts, progressValues));
|
||
} else {
|
||
--remaining;
|
||
}
|
||
}
|
||
} // if we're not waiting on anything, resolve the master
|
||
|
||
|
||
if (!remaining) {
|
||
deferred.resolveWith(resolveContexts, resolveValues);
|
||
}
|
||
|
||
return deferred.promise();
|
||
}
|
||
});
|
||
|
||
jQuery.support = function () {
|
||
var support,
|
||
all,
|
||
a,
|
||
select,
|
||
opt,
|
||
input,
|
||
fragment,
|
||
eventName,
|
||
i,
|
||
isSupported,
|
||
clickFn,
|
||
div = document.createElement("div"); // Preliminary tests
|
||
|
||
div.setAttribute("className", "t");
|
||
div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
|
||
all = div.getElementsByTagName("*");
|
||
a = div.getElementsByTagName("a")[0];
|
||
a.style.cssText = "top:1px;float:left;opacity:.5"; // Can't get basic test support
|
||
|
||
if (!all || !all.length || !a) {
|
||
return {};
|
||
} // First batch of supports tests
|
||
|
||
|
||
select = document.createElement("select");
|
||
opt = select.appendChild(document.createElement("option"));
|
||
input = div.getElementsByTagName("input")[0];
|
||
support = {
|
||
// IE strips leading whitespace when .innerHTML is used
|
||
leadingWhitespace: div.firstChild.nodeType === 3,
|
||
// Make sure that tbody elements aren't automatically inserted
|
||
// IE will insert them into empty tables
|
||
tbody: !div.getElementsByTagName("tbody").length,
|
||
// Make sure that link elements get serialized correctly by innerHTML
|
||
// This requires a wrapper element in IE
|
||
htmlSerialize: !!div.getElementsByTagName("link").length,
|
||
// Get the style information from getAttribute
|
||
// (IE uses .cssText instead)
|
||
style: /top/.test(a.getAttribute("style")),
|
||
// Make sure that URLs aren't manipulated
|
||
// (IE normalizes it by default)
|
||
hrefNormalized: a.getAttribute("href") === "/a",
|
||
// Make sure that element opacity exists
|
||
// (IE uses filter instead)
|
||
// Use a regex to work around a WebKit issue. See #5145
|
||
opacity: /^0.5/.test(a.style.opacity),
|
||
// Verify style float existence
|
||
// (IE uses styleFloat instead of cssFloat)
|
||
cssFloat: !!a.style.cssFloat,
|
||
// Make sure that if no value is specified for a checkbox
|
||
// that it defaults to "on".
|
||
// (WebKit defaults to "" instead)
|
||
checkOn: input.value === "on",
|
||
// Make sure that a selected-by-default option has a working selected property.
|
||
// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
|
||
optSelected: opt.selected,
|
||
// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
|
||
getSetAttribute: div.className !== "t",
|
||
// Tests for enctype support on a form(#6743)
|
||
enctype: !!document.createElement("form").enctype,
|
||
// Makes sure cloning an html5 element does not cause problems
|
||
// Where outerHTML is undefined, this still works
|
||
html5Clone: document.createElement("nav").cloneNode(true).outerHTML !== "<:nav></:nav>",
|
||
// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
|
||
boxModel: document.compatMode === "CSS1Compat",
|
||
// Will be defined later
|
||
submitBubbles: true,
|
||
changeBubbles: true,
|
||
focusinBubbles: false,
|
||
deleteExpando: true,
|
||
noCloneEvent: true,
|
||
inlineBlockNeedsLayout: false,
|
||
shrinkWrapBlocks: false,
|
||
reliableMarginRight: true,
|
||
boxSizingReliable: true,
|
||
pixelPosition: false
|
||
}; // Make sure checked status is properly cloned
|
||
|
||
input.checked = true;
|
||
support.noCloneChecked = input.cloneNode(true).checked; // Make sure that the options inside disabled selects aren't marked as disabled
|
||
// (WebKit marks them as disabled)
|
||
|
||
select.disabled = true;
|
||
support.optDisabled = !opt.disabled; // Test to see if it's possible to delete an expando from an element
|
||
// Fails in Internet Explorer
|
||
|
||
try {
|
||
delete div.test;
|
||
} catch (e) {
|
||
support.deleteExpando = false;
|
||
}
|
||
|
||
if (!div.addEventListener && div.attachEvent && div.fireEvent) {
|
||
div.attachEvent("onclick", clickFn = function clickFn() {
|
||
// Cloning a node shouldn't copy over any
|
||
// bound event handlers (IE does this)
|
||
support.noCloneEvent = false;
|
||
});
|
||
div.cloneNode(true).fireEvent("onclick");
|
||
div.detachEvent("onclick", clickFn);
|
||
} // Check if a radio maintains its value
|
||
// after being appended to the DOM
|
||
|
||
|
||
input = document.createElement("input");
|
||
input.value = "t";
|
||
input.setAttribute("type", "radio");
|
||
support.radioValue = input.value === "t";
|
||
input.setAttribute("checked", "checked"); // #11217 - WebKit loses check when the name is after the checked attribute
|
||
|
||
input.setAttribute("name", "t");
|
||
div.appendChild(input);
|
||
fragment = document.createDocumentFragment();
|
||
fragment.appendChild(div.lastChild); // WebKit doesn't clone checked state correctly in fragments
|
||
|
||
support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; // Check if a disconnected checkbox will retain its checked
|
||
// value of true after appended to the DOM (IE6/7)
|
||
|
||
support.appendChecked = input.checked;
|
||
fragment.removeChild(input);
|
||
fragment.appendChild(div); // Technique from Juriy Zaytsev
|
||
// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
|
||
// We only care about the case where non-standard event systems
|
||
// are used, namely in IE. Short-circuiting here helps us to
|
||
// avoid an eval call (in setAttribute) which can cause CSP
|
||
// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
|
||
|
||
if (div.attachEvent) {
|
||
for (i in {
|
||
submit: true,
|
||
change: true,
|
||
focusin: true
|
||
}) {
|
||
eventName = "on" + i;
|
||
isSupported = eventName in div;
|
||
|
||
if (!isSupported) {
|
||
div.setAttribute(eventName, "return;");
|
||
isSupported = typeof div[eventName] === "function";
|
||
}
|
||
|
||
support[i + "Bubbles"] = isSupported;
|
||
}
|
||
} // Run tests that need a body at doc ready
|
||
|
||
|
||
jQuery(function () {
|
||
var container,
|
||
div,
|
||
tds,
|
||
marginDiv,
|
||
divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
|
||
body = document.getElementsByTagName("body")[0];
|
||
|
||
if (!body) {
|
||
// Return for frameset docs that don't have a body
|
||
return;
|
||
}
|
||
|
||
container = document.createElement("div");
|
||
container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
|
||
body.insertBefore(container, body.firstChild); // Construct the test element
|
||
|
||
div = document.createElement("div");
|
||
container.appendChild(div); // Check if table cells still have offsetWidth/Height when they are set
|
||
// to display:none and there are still other visible table cells in a
|
||
// table row; if so, offsetWidth/Height are not reliable for use when
|
||
// determining if an element has been hidden directly using
|
||
// display:none (it is still safe to use offsets if a parent element is
|
||
// hidden; don safety goggles and see bug #4512 for more information).
|
||
// (only IE 8 fails this test)
|
||
|
||
div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
|
||
tds = div.getElementsByTagName("td");
|
||
tds[0].style.cssText = "padding:0;margin:0;border:0;display:none";
|
||
isSupported = tds[0].offsetHeight === 0;
|
||
tds[0].style.display = "";
|
||
tds[1].style.display = "none"; // Check if empty table cells still have offsetWidth/Height
|
||
// (IE <= 8 fail this test)
|
||
|
||
support.reliableHiddenOffsets = isSupported && tds[0].offsetHeight === 0; // Check box-sizing and margin behavior
|
||
|
||
div.innerHTML = "";
|
||
div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
|
||
support.boxSizing = div.offsetWidth === 4;
|
||
support.doesNotIncludeMarginInBodyOffset = body.offsetTop !== 1; // NOTE: To any future maintainer, we've window.getComputedStyle
|
||
// because jsdom on node.js will break without it.
|
||
|
||
if (window.getComputedStyle) {
|
||
support.pixelPosition = (window.getComputedStyle(div, null) || {}).top !== "1%";
|
||
support.boxSizingReliable = (window.getComputedStyle(div, null) || {
|
||
width: "4px"
|
||
}).width === "4px"; // Check if div with explicit width and no margin-right incorrectly
|
||
// gets computed margin-right based on width of container. For more
|
||
// info see bug #3333
|
||
// Fails in WebKit before Feb 2011 nightlies
|
||
// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
|
||
|
||
marginDiv = document.createElement("div");
|
||
marginDiv.style.cssText = div.style.cssText = divReset;
|
||
marginDiv.style.marginRight = marginDiv.style.width = "0";
|
||
div.style.width = "1px";
|
||
div.appendChild(marginDiv);
|
||
support.reliableMarginRight = !parseFloat((window.getComputedStyle(marginDiv, null) || {}).marginRight);
|
||
}
|
||
|
||
if (typeof div.style.zoom !== "undefined") {
|
||
// Check if natively block-level elements act like inline-block
|
||
// elements when setting their display to 'inline' and giving
|
||
// them layout
|
||
// (IE < 8 does this)
|
||
div.innerHTML = "";
|
||
div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
|
||
support.inlineBlockNeedsLayout = div.offsetWidth === 3; // Check if elements with layout shrink-wrap their children
|
||
// (IE 6 does this)
|
||
|
||
div.style.display = "block";
|
||
div.style.overflow = "visible";
|
||
div.innerHTML = "<div></div>";
|
||
div.firstChild.style.width = "5px";
|
||
support.shrinkWrapBlocks = div.offsetWidth !== 3;
|
||
container.style.zoom = 1;
|
||
} // Null elements to avoid leaks in IE
|
||
|
||
|
||
body.removeChild(container);
|
||
container = div = tds = marginDiv = null;
|
||
}); // Null elements to avoid leaks in IE
|
||
|
||
fragment.removeChild(div);
|
||
all = a = select = opt = input = fragment = div = null;
|
||
return support;
|
||
}();
|
||
|
||
var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
|
||
rmultiDash = /([A-Z])/g;
|
||
jQuery.extend({
|
||
cache: {},
|
||
deletedIds: [],
|
||
// Please use with caution
|
||
uuid: 0,
|
||
// Unique for each copy of jQuery on the page
|
||
// Non-digits removed to match rinlinejQuery
|
||
expando: "jQuery" + (jQuery.fn.jquery + Math.random()).replace(/\D/g, ""),
|
||
// The following elements throw uncatchable exceptions if you
|
||
// attempt to add expando properties to them.
|
||
noData: {
|
||
"embed": true,
|
||
// Ban all objects except for Flash (which handle expandos)
|
||
"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
|
||
"applet": true
|
||
},
|
||
hasData: function hasData(elem) {
|
||
elem = elem.nodeType ? jQuery.cache[elem[jQuery.expando]] : elem[jQuery.expando];
|
||
return !!elem && !isEmptyDataObject(elem);
|
||
},
|
||
data: function data(elem, name, _data, pvt
|
||
/* Internal Use Only */
|
||
) {
|
||
if (!jQuery.acceptData(elem)) {
|
||
return;
|
||
}
|
||
|
||
var thisCache,
|
||
ret,
|
||
internalKey = jQuery.expando,
|
||
getByName = typeof name === "string",
|
||
// We have to handle DOM nodes and JS objects differently because IE6-7
|
||
// can't GC object references properly across the DOM-JS boundary
|
||
isNode = elem.nodeType,
|
||
// Only DOM nodes need the global jQuery cache; JS object data is
|
||
// attached directly to the object so GC can occur automatically
|
||
cache = isNode ? jQuery.cache : elem,
|
||
// Only defining an ID for JS objects if its cache already exists allows
|
||
// the code to shortcut on the same path as a DOM node with no cache
|
||
id = isNode ? elem[internalKey] : elem[internalKey] && internalKey; // Avoid doing any more work than we need to when trying to get data on an
|
||
// object that has no data at all
|
||
|
||
if ((!id || !cache[id] || !pvt && !cache[id].data) && getByName && _data === undefined) {
|
||
return;
|
||
}
|
||
|
||
if (!id) {
|
||
// Only DOM nodes need a new unique ID for each element since their data
|
||
// ends up in the global cache
|
||
if (isNode) {
|
||
elem[internalKey] = id = jQuery.deletedIds.pop() || ++jQuery.uuid;
|
||
} else {
|
||
id = internalKey;
|
||
}
|
||
}
|
||
|
||
if (!cache[id]) {
|
||
cache[id] = {}; // Avoids exposing jQuery metadata on plain JS objects when the object
|
||
// is serialized using JSON.stringify
|
||
|
||
if (!isNode) {
|
||
cache[id].toJSON = jQuery.noop;
|
||
}
|
||
} // An object can be passed to jQuery.data instead of a key/value pair; this gets
|
||
// shallow copied over onto the existing cache
|
||
|
||
|
||
if (_typeof(name) === "object" || typeof name === "function") {
|
||
if (pvt) {
|
||
cache[id] = jQuery.extend(cache[id], name);
|
||
} else {
|
||
cache[id].data = jQuery.extend(cache[id].data, name);
|
||
}
|
||
}
|
||
|
||
thisCache = cache[id]; // jQuery data() is stored in a separate object inside the object's internal data
|
||
// cache in order to avoid key collisions between internal data and user-defined
|
||
// data.
|
||
|
||
if (!pvt) {
|
||
if (!thisCache.data) {
|
||
thisCache.data = {};
|
||
}
|
||
|
||
thisCache = thisCache.data;
|
||
}
|
||
|
||
if (_data !== undefined) {
|
||
thisCache[jQuery.camelCase(name)] = _data;
|
||
} // Check for both converted-to-camel and non-converted data property names
|
||
// If a data property was specified
|
||
|
||
|
||
if (getByName) {
|
||
// First Try to find as-is property data
|
||
ret = thisCache[name]; // Test for null|undefined property data
|
||
|
||
if (ret == null) {
|
||
// Try to find the camelCased property
|
||
ret = thisCache[jQuery.camelCase(name)];
|
||
}
|
||
} else {
|
||
ret = thisCache;
|
||
}
|
||
|
||
return ret;
|
||
},
|
||
removeData: function removeData(elem, name, pvt
|
||
/* Internal Use Only */
|
||
) {
|
||
if (!jQuery.acceptData(elem)) {
|
||
return;
|
||
}
|
||
|
||
var thisCache,
|
||
i,
|
||
l,
|
||
isNode = elem.nodeType,
|
||
// See jQuery.data for more information
|
||
cache = isNode ? jQuery.cache : elem,
|
||
id = isNode ? elem[jQuery.expando] : jQuery.expando; // If there is already no cache entry for this object, there is no
|
||
// purpose in continuing
|
||
|
||
if (!cache[id]) {
|
||
return;
|
||
}
|
||
|
||
if (name) {
|
||
thisCache = pvt ? cache[id] : cache[id].data;
|
||
|
||
if (thisCache) {
|
||
// Support array or space separated string names for data keys
|
||
if (!jQuery.isArray(name)) {
|
||
// try the string as a key before any manipulation
|
||
if (name in thisCache) {
|
||
name = [name];
|
||
} else {
|
||
// split the camel cased version by spaces unless a key with the spaces exists
|
||
name = jQuery.camelCase(name);
|
||
|
||
if (name in thisCache) {
|
||
name = [name];
|
||
} else {
|
||
name = name.split(" ");
|
||
}
|
||
}
|
||
}
|
||
|
||
for (i = 0, l = name.length; i < l; i++) {
|
||
delete thisCache[name[i]];
|
||
} // If there is no data left in the cache, we want to continue
|
||
// and let the cache object itself get destroyed
|
||
|
||
|
||
if (!(pvt ? isEmptyDataObject : jQuery.isEmptyObject)(thisCache)) {
|
||
return;
|
||
}
|
||
}
|
||
} // See jQuery.data for more information
|
||
|
||
|
||
if (!pvt) {
|
||
delete cache[id].data; // Don't destroy the parent cache unless the internal data object
|
||
// had been the only thing left in it
|
||
|
||
if (!isEmptyDataObject(cache[id])) {
|
||
return;
|
||
}
|
||
} // Destroy the cache
|
||
|
||
|
||
if (isNode) {
|
||
jQuery.cleanData([elem], true); // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
|
||
} else if (jQuery.support.deleteExpando || cache != cache.window) {
|
||
delete cache[id]; // When all else fails, null
|
||
} else {
|
||
cache[id] = null;
|
||
}
|
||
},
|
||
// For internal use only.
|
||
_data: function _data(elem, name, data) {
|
||
return jQuery.data(elem, name, data, true);
|
||
},
|
||
// A method for determining if a DOM node can handle the data expando
|
||
acceptData: function acceptData(elem) {
|
||
var noData = elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]; // nodes accept data unless otherwise specified; rejection can be conditional
|
||
|
||
return !noData || noData !== true && elem.getAttribute("classid") === noData;
|
||
}
|
||
});
|
||
jQuery.fn.extend({
|
||
data: function data(key, value) {
|
||
var parts,
|
||
part,
|
||
attr,
|
||
name,
|
||
l,
|
||
elem = this[0],
|
||
i = 0,
|
||
data = null; // Gets all values
|
||
|
||
if (key === undefined) {
|
||
if (this.length) {
|
||
data = jQuery.data(elem);
|
||
|
||
if (elem.nodeType === 1 && !jQuery._data(elem, "parsedAttrs")) {
|
||
attr = elem.attributes;
|
||
|
||
for (l = attr.length; i < l; i++) {
|
||
name = attr[i].name;
|
||
|
||
if (name.indexOf("data-") === 0) {
|
||
name = jQuery.camelCase(name.substring(5));
|
||
dataAttr(elem, name, data[name]);
|
||
}
|
||
}
|
||
|
||
jQuery._data(elem, "parsedAttrs", true);
|
||
}
|
||
}
|
||
|
||
return data;
|
||
} // Sets multiple values
|
||
|
||
|
||
if (_typeof(key) === "object") {
|
||
return this.each(function () {
|
||
jQuery.data(this, key);
|
||
});
|
||
}
|
||
|
||
parts = key.split(".", 2);
|
||
parts[1] = parts[1] ? "." + parts[1] : "";
|
||
part = parts[1] + "!";
|
||
return jQuery.access(this, function (value) {
|
||
if (value === undefined) {
|
||
data = this.triggerHandler("getData" + part, [parts[0]]); // Try to fetch any internally stored data first
|
||
|
||
if (data === undefined && elem) {
|
||
data = jQuery.data(elem, key);
|
||
data = dataAttr(elem, key, data);
|
||
}
|
||
|
||
return data === undefined && parts[1] ? this.data(parts[0]) : data;
|
||
}
|
||
|
||
parts[1] = value;
|
||
this.each(function () {
|
||
var self = jQuery(this);
|
||
self.triggerHandler("setData" + part, parts);
|
||
jQuery.data(this, key, value);
|
||
self.triggerHandler("changeData" + part, parts);
|
||
});
|
||
}, null, value, arguments.length > 1, null, false);
|
||
},
|
||
removeData: function removeData(key) {
|
||
return this.each(function () {
|
||
jQuery.removeData(this, key);
|
||
});
|
||
}
|
||
});
|
||
|
||
function dataAttr(elem, key, data) {
|
||
// If nothing was found internally, try to fetch any
|
||
// data from the HTML5 data-* attribute
|
||
if (data === undefined && elem.nodeType === 1) {
|
||
var name = "data-" + key.replace(rmultiDash, "-$1").toLowerCase();
|
||
data = elem.getAttribute(name);
|
||
|
||
if (typeof data === "string") {
|
||
try {
|
||
data = data === "true" ? true : data === "false" ? false : data === "null" ? null : // Only convert to a number if it doesn't change the string
|
||
+data + "" === data ? +data : rbrace.test(data) ? jQuery.parseJSON(data) : data;
|
||
} catch (e) {} // Make sure we set the data so it isn't changed later
|
||
|
||
|
||
jQuery.data(elem, key, data);
|
||
} else {
|
||
data = undefined;
|
||
}
|
||
}
|
||
|
||
return data;
|
||
} // checks a cache object for emptiness
|
||
|
||
|
||
function isEmptyDataObject(obj) {
|
||
var name;
|
||
|
||
for (name in obj) {
|
||
// if the public data object is empty, the private is still empty
|
||
if (name === "data" && jQuery.isEmptyObject(obj[name])) {
|
||
continue;
|
||
}
|
||
|
||
if (name !== "toJSON") {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
jQuery.extend({
|
||
queue: function queue(elem, type, data) {
|
||
var queue;
|
||
|
||
if (elem) {
|
||
type = (type || "fx") + "queue";
|
||
queue = jQuery._data(elem, type); // Speed up dequeue by getting out quickly if this is just a lookup
|
||
|
||
if (data) {
|
||
if (!queue || jQuery.isArray(data)) {
|
||
queue = jQuery._data(elem, type, jQuery.makeArray(data));
|
||
} else {
|
||
queue.push(data);
|
||
}
|
||
}
|
||
|
||
return queue || [];
|
||
}
|
||
},
|
||
dequeue: function dequeue(elem, type) {
|
||
type = type || "fx";
|
||
|
||
var queue = jQuery.queue(elem, type),
|
||
startLength = queue.length,
|
||
fn = queue.shift(),
|
||
hooks = jQuery._queueHooks(elem, type),
|
||
next = function next() {
|
||
jQuery.dequeue(elem, type);
|
||
}; // If the fx queue is dequeued, always remove the progress sentinel
|
||
|
||
|
||
if (fn === "inprogress") {
|
||
fn = queue.shift();
|
||
startLength--;
|
||
}
|
||
|
||
if (fn) {
|
||
// Add a progress sentinel to prevent the fx queue from being
|
||
// automatically dequeued
|
||
if (type === "fx") {
|
||
queue.unshift("inprogress");
|
||
} // clear up the last queue stop function
|
||
|
||
|
||
delete hooks.stop;
|
||
fn.call(elem, next, hooks);
|
||
}
|
||
|
||
if (!startLength && hooks) {
|
||
hooks.empty.fire();
|
||
}
|
||
},
|
||
// not intended for public consumption - generates a queueHooks object, or returns the current one
|
||
_queueHooks: function _queueHooks(elem, type) {
|
||
var key = type + "queueHooks";
|
||
return jQuery._data(elem, key) || jQuery._data(elem, key, {
|
||
empty: jQuery.Callbacks("once memory").add(function () {
|
||
jQuery.removeData(elem, type + "queue", true);
|
||
jQuery.removeData(elem, key, true);
|
||
})
|
||
});
|
||
}
|
||
});
|
||
jQuery.fn.extend({
|
||
queue: function queue(type, data) {
|
||
var setter = 2;
|
||
|
||
if (typeof type !== "string") {
|
||
data = type;
|
||
type = "fx";
|
||
setter--;
|
||
}
|
||
|
||
if (arguments.length < setter) {
|
||
return jQuery.queue(this[0], type);
|
||
}
|
||
|
||
return data === undefined ? this : this.each(function () {
|
||
var queue = jQuery.queue(this, type, data); // ensure a hooks for this queue
|
||
|
||
jQuery._queueHooks(this, type);
|
||
|
||
if (type === "fx" && queue[0] !== "inprogress") {
|
||
jQuery.dequeue(this, type);
|
||
}
|
||
});
|
||
},
|
||
dequeue: function dequeue(type) {
|
||
return this.each(function () {
|
||
jQuery.dequeue(this, type);
|
||
});
|
||
},
|
||
// Based off of the plugin by Clint Helfers, with permission.
|
||
// http://blindsignals.com/index.php/2009/07/jquery-delay/
|
||
delay: function delay(time, type) {
|
||
time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
|
||
type = type || "fx";
|
||
return this.queue(type, function (next, hooks) {
|
||
var timeout = setTimeout(next, time);
|
||
|
||
hooks.stop = function () {
|
||
clearTimeout(timeout);
|
||
};
|
||
});
|
||
},
|
||
clearQueue: function clearQueue(type) {
|
||
return this.queue(type || "fx", []);
|
||
},
|
||
// Get a promise resolved when queues of a certain type
|
||
// are emptied (fx is the type by default)
|
||
promise: function promise(type, obj) {
|
||
var tmp,
|
||
count = 1,
|
||
defer = jQuery.Deferred(),
|
||
elements = this,
|
||
i = this.length,
|
||
resolve = function resolve() {
|
||
if (! --count) {
|
||
defer.resolveWith(elements, [elements]);
|
||
}
|
||
};
|
||
|
||
if (typeof type !== "string") {
|
||
obj = type;
|
||
type = undefined;
|
||
}
|
||
|
||
type = type || "fx";
|
||
|
||
while (i--) {
|
||
tmp = jQuery._data(elements[i], type + "queueHooks");
|
||
|
||
if (tmp && tmp.empty) {
|
||
count++;
|
||
tmp.empty.add(resolve);
|
||
}
|
||
}
|
||
|
||
resolve();
|
||
return defer.promise(obj);
|
||
}
|
||
});
|
||
var nodeHook,
|
||
boolHook,
|
||
fixSpecified,
|
||
rclass = /[\t\r\n]/g,
|
||
rreturn = /\r/g,
|
||
rtype = /^(?:button|input)$/i,
|
||
rfocusable = /^(?:button|input|object|select|textarea)$/i,
|
||
rclickable = /^a(?:rea|)$/i,
|
||
rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
|
||
getSetAttribute = jQuery.support.getSetAttribute;
|
||
jQuery.fn.extend({
|
||
attr: function attr(name, value) {
|
||
return jQuery.access(this, jQuery.attr, name, value, arguments.length > 1);
|
||
},
|
||
removeAttr: function removeAttr(name) {
|
||
return this.each(function () {
|
||
jQuery.removeAttr(this, name);
|
||
});
|
||
},
|
||
prop: function prop(name, value) {
|
||
return jQuery.access(this, jQuery.prop, name, value, arguments.length > 1);
|
||
},
|
||
removeProp: function removeProp(name) {
|
||
name = jQuery.propFix[name] || name;
|
||
return this.each(function () {
|
||
// try/catch handles cases where IE balks (such as removing a property on window)
|
||
try {
|
||
this[name] = undefined;
|
||
delete this[name];
|
||
} catch (e) {}
|
||
});
|
||
},
|
||
addClass: function addClass(value) {
|
||
var classNames, i, l, elem, setClass, c, cl;
|
||
|
||
if (jQuery.isFunction(value)) {
|
||
return this.each(function (j) {
|
||
jQuery(this).addClass(value.call(this, j, this.className));
|
||
});
|
||
}
|
||
|
||
if (value && typeof value === "string") {
|
||
classNames = value.split(core_rspace);
|
||
|
||
for (i = 0, l = this.length; i < l; i++) {
|
||
elem = this[i];
|
||
|
||
if (elem.nodeType === 1) {
|
||
if (!elem.className && classNames.length === 1) {
|
||
elem.className = value;
|
||
} else {
|
||
setClass = " " + elem.className + " ";
|
||
|
||
for (c = 0, cl = classNames.length; c < cl; c++) {
|
||
if (!~setClass.indexOf(" " + classNames[c] + " ")) {
|
||
setClass += classNames[c] + " ";
|
||
}
|
||
}
|
||
|
||
elem.className = jQuery.trim(setClass);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return this;
|
||
},
|
||
removeClass: function removeClass(value) {
|
||
var removes, className, elem, c, cl, i, l;
|
||
|
||
if (jQuery.isFunction(value)) {
|
||
return this.each(function (j) {
|
||
jQuery(this).removeClass(value.call(this, j, this.className));
|
||
});
|
||
}
|
||
|
||
if (value && typeof value === "string" || value === undefined) {
|
||
removes = (value || "").split(core_rspace);
|
||
|
||
for (i = 0, l = this.length; i < l; i++) {
|
||
elem = this[i];
|
||
|
||
if (elem.nodeType === 1 && elem.className) {
|
||
className = (" " + elem.className + " ").replace(rclass, " "); // loop over each item in the removal list
|
||
|
||
for (c = 0, cl = removes.length; c < cl; c++) {
|
||
// Remove until there is nothing to remove,
|
||
while (className.indexOf(" " + removes[c] + " ") > -1) {
|
||
className = className.replace(" " + removes[c] + " ", " ");
|
||
}
|
||
}
|
||
|
||
elem.className = value ? jQuery.trim(className) : "";
|
||
}
|
||
}
|
||
}
|
||
|
||
return this;
|
||
},
|
||
toggleClass: function toggleClass(value, stateVal) {
|
||
var type = _typeof(value),
|
||
isBool = typeof stateVal === "boolean";
|
||
|
||
if (jQuery.isFunction(value)) {
|
||
return this.each(function (i) {
|
||
jQuery(this).toggleClass(value.call(this, i, this.className, stateVal), stateVal);
|
||
});
|
||
}
|
||
|
||
return this.each(function () {
|
||
if (type === "string") {
|
||
// toggle individual class names
|
||
var className,
|
||
i = 0,
|
||
self = jQuery(this),
|
||
state = stateVal,
|
||
classNames = value.split(core_rspace);
|
||
|
||
while (className = classNames[i++]) {
|
||
// check each className given, space separated list
|
||
state = isBool ? state : !self.hasClass(className);
|
||
self[state ? "addClass" : "removeClass"](className);
|
||
}
|
||
} else if (type === "undefined" || type === "boolean") {
|
||
if (this.className) {
|
||
// store className if set
|
||
jQuery._data(this, "__className__", this.className);
|
||
} // toggle whole className
|
||
|
||
|
||
this.className = this.className || value === false ? "" : jQuery._data(this, "__className__") || "";
|
||
}
|
||
});
|
||
},
|
||
hasClass: function hasClass(selector) {
|
||
var className = " " + selector + " ",
|
||
i = 0,
|
||
l = this.length;
|
||
|
||
for (; i < l; i++) {
|
||
if (this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf(className) > -1) {
|
||
return true;
|
||
}
|
||
}
|
||
|
||
return false;
|
||
},
|
||
val: function val(value) {
|
||
var hooks,
|
||
ret,
|
||
isFunction,
|
||
elem = this[0];
|
||
|
||
if (!arguments.length) {
|
||
if (elem) {
|
||
hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()];
|
||
|
||
if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== undefined) {
|
||
return ret;
|
||
}
|
||
|
||
ret = elem.value;
|
||
return typeof ret === "string" ? // handle most common string cases
|
||
ret.replace(rreturn, "") : // handle cases where value is null/undef or number
|
||
ret == null ? "" : ret;
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
isFunction = jQuery.isFunction(value);
|
||
return this.each(function (i) {
|
||
var val,
|
||
self = jQuery(this);
|
||
|
||
if (this.nodeType !== 1) {
|
||
return;
|
||
}
|
||
|
||
if (isFunction) {
|
||
val = value.call(this, i, self.val());
|
||
} else {
|
||
val = value;
|
||
} // Treat null/undefined as ""; convert numbers to string
|
||
|
||
|
||
if (val == null) {
|
||
val = "";
|
||
} else if (typeof val === "number") {
|
||
val += "";
|
||
} else if (jQuery.isArray(val)) {
|
||
val = jQuery.map(val, function (value) {
|
||
return value == null ? "" : value + "";
|
||
});
|
||
}
|
||
|
||
hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()]; // If set returns undefined, fall back to normal setting
|
||
|
||
if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) {
|
||
this.value = val;
|
||
}
|
||
});
|
||
}
|
||
});
|
||
jQuery.extend({
|
||
valHooks: {
|
||
option: {
|
||
get: function get(elem) {
|
||
// attributes.value is undefined in Blackberry 4.7 but
|
||
// uses .value. See #6932
|
||
var val = elem.attributes.value;
|
||
return !val || val.specified ? elem.value : elem.text;
|
||
}
|
||
},
|
||
select: {
|
||
get: function get(elem) {
|
||
var value,
|
||
i,
|
||
max,
|
||
option,
|
||
index = elem.selectedIndex,
|
||
values = [],
|
||
options = elem.options,
|
||
one = elem.type === "select-one"; // Nothing was selected
|
||
|
||
if (index < 0) {
|
||
return null;
|
||
} // Loop through all the selected options
|
||
|
||
|
||
i = one ? index : 0;
|
||
max = one ? index + 1 : options.length;
|
||
|
||
for (; i < max; i++) {
|
||
option = options[i]; // Don't return options that are disabled or in a disabled optgroup
|
||
|
||
if (option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && (!option.parentNode.disabled || !jQuery.nodeName(option.parentNode, "optgroup"))) {
|
||
// Get the specific value for the option
|
||
value = jQuery(option).val(); // We don't need an array for one selects
|
||
|
||
if (one) {
|
||
return value;
|
||
} // Multi-Selects return an array
|
||
|
||
|
||
values.push(value);
|
||
}
|
||
} // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
|
||
|
||
|
||
if (one && !values.length && options.length) {
|
||
return jQuery(options[index]).val();
|
||
}
|
||
|
||
return values;
|
||
},
|
||
set: function set(elem, value) {
|
||
var values = jQuery.makeArray(value);
|
||
jQuery(elem).find("option").each(function () {
|
||
this.selected = jQuery.inArray(jQuery(this).val(), values) >= 0;
|
||
});
|
||
|
||
if (!values.length) {
|
||
elem.selectedIndex = -1;
|
||
}
|
||
|
||
return values;
|
||
}
|
||
}
|
||
},
|
||
// Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
|
||
attrFn: {},
|
||
attr: function attr(elem, name, value, pass) {
|
||
var ret,
|
||
hooks,
|
||
notxml,
|
||
nType = elem.nodeType; // don't get/set attributes on text, comment and attribute nodes
|
||
|
||
if (!elem || nType === 3 || nType === 8 || nType === 2) {
|
||
return;
|
||
}
|
||
|
||
if (pass && jQuery.isFunction(jQuery.fn[name])) {
|
||
return jQuery(elem)[name](value);
|
||
} // Fallback to prop when attributes are not supported
|
||
|
||
|
||
if (typeof elem.getAttribute === "undefined") {
|
||
return jQuery.prop(elem, name, value);
|
||
}
|
||
|
||
notxml = nType !== 1 || !jQuery.isXMLDoc(elem); // All attributes are lowercase
|
||
// Grab necessary hook if one is defined
|
||
|
||
if (notxml) {
|
||
name = name.toLowerCase();
|
||
hooks = jQuery.attrHooks[name] || (rboolean.test(name) ? boolHook : nodeHook);
|
||
}
|
||
|
||
if (value !== undefined) {
|
||
if (value === null) {
|
||
jQuery.removeAttr(elem, name);
|
||
return;
|
||
} else if (hooks && "set" in hooks && notxml && (ret = hooks.set(elem, value, name)) !== undefined) {
|
||
return ret;
|
||
} else {
|
||
elem.setAttribute(name, "" + value);
|
||
return value;
|
||
}
|
||
} else if (hooks && "get" in hooks && notxml && (ret = hooks.get(elem, name)) !== null) {
|
||
return ret;
|
||
} else {
|
||
ret = elem.getAttribute(name); // Non-existent attributes return null, we normalize to undefined
|
||
|
||
return ret === null ? undefined : ret;
|
||
}
|
||
},
|
||
removeAttr: function removeAttr(elem, value) {
|
||
var propName,
|
||
attrNames,
|
||
name,
|
||
isBool,
|
||
i = 0;
|
||
|
||
if (value && elem.nodeType === 1) {
|
||
attrNames = value.split(core_rspace);
|
||
|
||
for (; i < attrNames.length; i++) {
|
||
name = attrNames[i];
|
||
|
||
if (name) {
|
||
propName = jQuery.propFix[name] || name;
|
||
isBool = rboolean.test(name); // See #9699 for explanation of this approach (setting first, then removal)
|
||
// Do not do this for boolean attributes (see #10870)
|
||
|
||
if (!isBool) {
|
||
jQuery.attr(elem, name, "");
|
||
}
|
||
|
||
elem.removeAttribute(getSetAttribute ? name : propName); // Set corresponding property to false for boolean attributes
|
||
|
||
if (isBool && propName in elem) {
|
||
elem[propName] = false;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
attrHooks: {
|
||
type: {
|
||
set: function set(elem, value) {
|
||
// We can't allow the type property to be changed (since it causes problems in IE)
|
||
if (rtype.test(elem.nodeName) && elem.parentNode) {
|
||
jQuery.error("type property can't be changed");
|
||
} else if (!jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input")) {
|
||
// Setting the type on a radio button after the value resets the value in IE6-9
|
||
// Reset value to it's default in case type is set after value
|
||
// This is for element creation
|
||
var val = elem.value;
|
||
elem.setAttribute("type", value);
|
||
|
||
if (val) {
|
||
elem.value = val;
|
||
}
|
||
|
||
return value;
|
||
}
|
||
}
|
||
},
|
||
// Use the value property for back compat
|
||
// Use the nodeHook for button elements in IE6/7 (#1954)
|
||
value: {
|
||
get: function get(elem, name) {
|
||
if (nodeHook && jQuery.nodeName(elem, "button")) {
|
||
return nodeHook.get(elem, name);
|
||
}
|
||
|
||
return name in elem ? elem.value : null;
|
||
},
|
||
set: function set(elem, value, name) {
|
||
if (nodeHook && jQuery.nodeName(elem, "button")) {
|
||
return nodeHook.set(elem, value, name);
|
||
} // Does not return so that setAttribute is also used
|
||
|
||
|
||
elem.value = value;
|
||
}
|
||
}
|
||
},
|
||
propFix: {
|
||
tabindex: "tabIndex",
|
||
readonly: "readOnly",
|
||
"for": "htmlFor",
|
||
"class": "className",
|
||
maxlength: "maxLength",
|
||
cellspacing: "cellSpacing",
|
||
cellpadding: "cellPadding",
|
||
rowspan: "rowSpan",
|
||
colspan: "colSpan",
|
||
usemap: "useMap",
|
||
frameborder: "frameBorder",
|
||
contenteditable: "contentEditable"
|
||
},
|
||
prop: function prop(elem, name, value) {
|
||
var ret,
|
||
hooks,
|
||
notxml,
|
||
nType = elem.nodeType; // don't get/set properties on text, comment and attribute nodes
|
||
|
||
if (!elem || nType === 3 || nType === 8 || nType === 2) {
|
||
return;
|
||
}
|
||
|
||
notxml = nType !== 1 || !jQuery.isXMLDoc(elem);
|
||
|
||
if (notxml) {
|
||
// Fix name and attach hooks
|
||
name = jQuery.propFix[name] || name;
|
||
hooks = jQuery.propHooks[name];
|
||
}
|
||
|
||
if (value !== undefined) {
|
||
if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {
|
||
return ret;
|
||
} else {
|
||
return elem[name] = value;
|
||
}
|
||
} else {
|
||
if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
|
||
return ret;
|
||
} else {
|
||
return elem[name];
|
||
}
|
||
}
|
||
},
|
||
propHooks: {
|
||
tabIndex: {
|
||
get: function get(elem) {
|
||
// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
|
||
// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
|
||
var attributeNode = elem.getAttributeNode("tabindex");
|
||
return attributeNode && attributeNode.specified ? parseInt(attributeNode.value, 10) : rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href ? 0 : undefined;
|
||
}
|
||
}
|
||
}
|
||
}); // Hook for boolean attributes
|
||
|
||
boolHook = {
|
||
get: function get(elem, name) {
|
||
// Align boolean attributes with corresponding properties
|
||
// Fall back to attribute presence where some booleans are not supported
|
||
var attrNode,
|
||
property = jQuery.prop(elem, name);
|
||
return property === true || typeof property !== "boolean" && (attrNode = elem.getAttributeNode(name)) && attrNode.nodeValue !== false ? name.toLowerCase() : undefined;
|
||
},
|
||
set: function set(elem, value, name) {
|
||
var propName;
|
||
|
||
if (value === false) {
|
||
// Remove boolean attributes when set to false
|
||
jQuery.removeAttr(elem, name);
|
||
} else {
|
||
// value is true since we know at this point it's type boolean and not false
|
||
// Set boolean attributes to the same name and set the DOM property
|
||
propName = jQuery.propFix[name] || name;
|
||
|
||
if (propName in elem) {
|
||
// Only set the IDL specifically if it already exists on the element
|
||
elem[propName] = true;
|
||
}
|
||
|
||
elem.setAttribute(name, name.toLowerCase());
|
||
}
|
||
|
||
return name;
|
||
}
|
||
}; // IE6/7 do not support getting/setting some attributes with get/setAttribute
|
||
|
||
if (!getSetAttribute) {
|
||
fixSpecified = {
|
||
name: true,
|
||
id: true,
|
||
coords: true
|
||
}; // Use this for any attribute in IE6/7
|
||
// This fixes almost every IE6/7 issue
|
||
|
||
nodeHook = jQuery.valHooks.button = {
|
||
get: function get(elem, name) {
|
||
var ret;
|
||
ret = elem.getAttributeNode(name);
|
||
return ret && (fixSpecified[name] ? ret.value !== "" : ret.specified) ? ret.value : undefined;
|
||
},
|
||
set: function set(elem, value, name) {
|
||
// Set the existing or create a new attribute node
|
||
var ret = elem.getAttributeNode(name);
|
||
|
||
if (!ret) {
|
||
ret = document.createAttribute(name);
|
||
elem.setAttributeNode(ret);
|
||
}
|
||
|
||
return ret.value = value + "";
|
||
}
|
||
}; // Set width and height to auto instead of 0 on empty string( Bug #8150 )
|
||
// This is for removals
|
||
|
||
jQuery.each(["width", "height"], function (i, name) {
|
||
jQuery.attrHooks[name] = jQuery.extend(jQuery.attrHooks[name], {
|
||
set: function set(elem, value) {
|
||
if (value === "") {
|
||
elem.setAttribute(name, "auto");
|
||
return value;
|
||
}
|
||
}
|
||
});
|
||
}); // Set contenteditable to false on removals(#10429)
|
||
// Setting to empty string throws an error as an invalid value
|
||
|
||
jQuery.attrHooks.contenteditable = {
|
||
get: nodeHook.get,
|
||
set: function set(elem, value, name) {
|
||
if (value === "") {
|
||
value = "false";
|
||
}
|
||
|
||
nodeHook.set(elem, value, name);
|
||
}
|
||
};
|
||
} // Some attributes require a special call on IE
|
||
|
||
|
||
if (!jQuery.support.hrefNormalized) {
|
||
jQuery.each(["href", "src", "width", "height"], function (i, name) {
|
||
jQuery.attrHooks[name] = jQuery.extend(jQuery.attrHooks[name], {
|
||
get: function get(elem) {
|
||
var ret = elem.getAttribute(name, 2);
|
||
return ret === null ? undefined : ret;
|
||
}
|
||
});
|
||
});
|
||
}
|
||
|
||
if (!jQuery.support.style) {
|
||
jQuery.attrHooks.style = {
|
||
get: function get(elem) {
|
||
// Return undefined in the case of empty string
|
||
// Normalize to lowercase since IE uppercases css property names
|
||
return elem.style.cssText.toLowerCase() || undefined;
|
||
},
|
||
set: function set(elem, value) {
|
||
return elem.style.cssText = "" + value;
|
||
}
|
||
};
|
||
} // Safari mis-reports the default selected property of an option
|
||
// Accessing the parent's selectedIndex property fixes it
|
||
|
||
|
||
if (!jQuery.support.optSelected) {
|
||
jQuery.propHooks.selected = jQuery.extend(jQuery.propHooks.selected, {
|
||
get: function get(elem) {
|
||
var parent = elem.parentNode;
|
||
|
||
if (parent) {
|
||
parent.selectedIndex; // Make sure that it also works with optgroups, see #5701
|
||
|
||
if (parent.parentNode) {
|
||
parent.parentNode.selectedIndex;
|
||
}
|
||
}
|
||
|
||
return null;
|
||
}
|
||
});
|
||
} // IE6/7 call enctype encoding
|
||
|
||
|
||
if (!jQuery.support.enctype) {
|
||
jQuery.propFix.enctype = "encoding";
|
||
} // Radios and checkboxes getter/setter
|
||
|
||
|
||
if (!jQuery.support.checkOn) {
|
||
jQuery.each(["radio", "checkbox"], function () {
|
||
jQuery.valHooks[this] = {
|
||
get: function get(elem) {
|
||
// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
|
||
return elem.getAttribute("value") === null ? "on" : elem.value;
|
||
}
|
||
};
|
||
});
|
||
}
|
||
|
||
jQuery.each(["radio", "checkbox"], function () {
|
||
jQuery.valHooks[this] = jQuery.extend(jQuery.valHooks[this], {
|
||
set: function set(elem, value) {
|
||
if (jQuery.isArray(value)) {
|
||
return elem.checked = jQuery.inArray(jQuery(elem).val(), value) >= 0;
|
||
}
|
||
}
|
||
});
|
||
});
|
||
|
||
var rformElems = /^(?:textarea|input|select)$/i,
|
||
rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
|
||
rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
|
||
rkeyEvent = /^key/,
|
||
rmouseEvent = /^(?:mouse|contextmenu)|click/,
|
||
rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
|
||
hoverHack = function hoverHack(events) {
|
||
return jQuery.event.special.hover ? events : events.replace(rhoverHack, "mouseenter$1 mouseleave$1");
|
||
};
|
||
/*
|
||
* Helper functions for managing events -- not part of the public interface.
|
||
* Props to Dean Edwards' addEvent library for many of the ideas.
|
||
*/
|
||
|
||
|
||
jQuery.event = {
|
||
add: function add(elem, types, handler, data, selector) {
|
||
var elemData, _eventHandle, events, t, tns, type, namespaces, handleObj, handleObjIn, handlers, special; // Don't attach events to noData or text/comment nodes (allow plain objects tho)
|
||
|
||
|
||
if (elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data(elem))) {
|
||
return;
|
||
} // Caller can pass in an object of custom data in lieu of the handler
|
||
|
||
|
||
if (handler.handler) {
|
||
handleObjIn = handler;
|
||
handler = handleObjIn.handler;
|
||
selector = handleObjIn.selector;
|
||
} // Make sure that the handler has a unique ID, used to find/remove it later
|
||
|
||
|
||
if (!handler.guid) {
|
||
handler.guid = jQuery.guid++;
|
||
} // Init the element's event structure and main handler, if this is the first
|
||
|
||
|
||
events = elemData.events;
|
||
|
||
if (!events) {
|
||
elemData.events = events = {};
|
||
}
|
||
|
||
_eventHandle = elemData.handle;
|
||
|
||
if (!_eventHandle) {
|
||
elemData.handle = _eventHandle = function eventHandle(e) {
|
||
// Discard the second event of a jQuery.event.trigger() and
|
||
// when an event is called after a page has unloaded
|
||
return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply(_eventHandle.elem, arguments) : undefined;
|
||
}; // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
|
||
|
||
|
||
_eventHandle.elem = elem;
|
||
} // Handle multiple events separated by a space
|
||
// jQuery(...).bind("mouseover mouseout", fn);
|
||
|
||
|
||
types = jQuery.trim(hoverHack(types)).split(" ");
|
||
|
||
for (t = 0; t < types.length; t++) {
|
||
tns = rtypenamespace.exec(types[t]) || [];
|
||
type = tns[1];
|
||
namespaces = (tns[2] || "").split(".").sort(); // If event changes its type, use the special event handlers for the changed type
|
||
|
||
special = jQuery.event.special[type] || {}; // If selector defined, determine special event api type, otherwise given type
|
||
|
||
type = (selector ? special.delegateType : special.bindType) || type; // Update special based on newly reset type
|
||
|
||
special = jQuery.event.special[type] || {}; // handleObj is passed to all event handlers
|
||
|
||
handleObj = jQuery.extend({
|
||
type: type,
|
||
origType: tns[1],
|
||
data: data,
|
||
handler: handler,
|
||
guid: handler.guid,
|
||
selector: selector,
|
||
namespace: namespaces.join(".")
|
||
}, handleObjIn); // Init the event handler queue if we're the first
|
||
|
||
handlers = events[type];
|
||
|
||
if (!handlers) {
|
||
handlers = events[type] = [];
|
||
handlers.delegateCount = 0; // Only use addEventListener/attachEvent if the special events handler returns false
|
||
|
||
if (!special.setup || special.setup.call(elem, data, namespaces, _eventHandle) === false) {
|
||
// Bind the global event handler to the element
|
||
if (elem.addEventListener) {
|
||
elem.addEventListener(type, _eventHandle, false);
|
||
} else if (elem.attachEvent) {
|
||
elem.attachEvent("on" + type, _eventHandle);
|
||
}
|
||
}
|
||
}
|
||
|
||
if (special.add) {
|
||
special.add.call(elem, handleObj);
|
||
|
||
if (!handleObj.handler.guid) {
|
||
handleObj.handler.guid = handler.guid;
|
||
}
|
||
} // Add to the element's handler list, delegates in front
|
||
|
||
|
||
if (selector) {
|
||
handlers.splice(handlers.delegateCount++, 0, handleObj);
|
||
} else {
|
||
handlers.push(handleObj);
|
||
} // Keep track of which events have ever been used, for event optimization
|
||
|
||
|
||
jQuery.event.global[type] = true;
|
||
} // Nullify elem to prevent memory leaks in IE
|
||
|
||
|
||
elem = null;
|
||
},
|
||
global: {},
|
||
// Detach an event or set of events from an element
|
||
remove: function remove(elem, types, handler, selector, mappedTypes) {
|
||
var t,
|
||
tns,
|
||
type,
|
||
origType,
|
||
namespaces,
|
||
origCount,
|
||
j,
|
||
events,
|
||
special,
|
||
eventType,
|
||
handleObj,
|
||
elemData = jQuery.hasData(elem) && jQuery._data(elem);
|
||
|
||
if (!elemData || !(events = elemData.events)) {
|
||
return;
|
||
} // Once for each type.namespace in types; type may be omitted
|
||
|
||
|
||
types = jQuery.trim(hoverHack(types || "")).split(" ");
|
||
|
||
for (t = 0; t < types.length; t++) {
|
||
tns = rtypenamespace.exec(types[t]) || [];
|
||
type = origType = tns[1];
|
||
namespaces = tns[2]; // Unbind all events (on this namespace, if provided) for the element
|
||
|
||
if (!type) {
|
||
for (type in events) {
|
||
jQuery.event.remove(elem, type + types[t], handler, selector, true);
|
||
}
|
||
|
||
continue;
|
||
}
|
||
|
||
special = jQuery.event.special[type] || {};
|
||
type = (selector ? special.delegateType : special.bindType) || type;
|
||
eventType = events[type] || [];
|
||
origCount = eventType.length;
|
||
namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null; // Remove matching events
|
||
|
||
for (j = 0; j < eventType.length; j++) {
|
||
handleObj = eventType[j];
|
||
|
||
if ((mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && (!namespaces || namespaces.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) {
|
||
eventType.splice(j--, 1);
|
||
|
||
if (handleObj.selector) {
|
||
eventType.delegateCount--;
|
||
}
|
||
|
||
if (special.remove) {
|
||
special.remove.call(elem, handleObj);
|
||
}
|
||
}
|
||
} // Remove generic event handler if we removed something and no more handlers exist
|
||
// (avoids potential for endless recursion during removal of special event handlers)
|
||
|
||
|
||
if (eventType.length === 0 && origCount !== eventType.length) {
|
||
if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) {
|
||
jQuery.removeEvent(elem, type, elemData.handle);
|
||
}
|
||
|
||
delete events[type];
|
||
}
|
||
} // Remove the expando if it's no longer used
|
||
|
||
|
||
if (jQuery.isEmptyObject(events)) {
|
||
delete elemData.handle; // removeData also checks for emptiness and clears the expando if empty
|
||
// so use it instead of delete
|
||
|
||
jQuery.removeData(elem, "events", true);
|
||
}
|
||
},
|
||
// Events that are safe to short-circuit if no handlers are attached.
|
||
// Native DOM events should not be added, they may have inline handlers.
|
||
customEvent: {
|
||
"getData": true,
|
||
"setData": true,
|
||
"changeData": true
|
||
},
|
||
trigger: function trigger(event, data, elem, onlyHandlers) {
|
||
// Don't do events on text and comment nodes
|
||
if (elem && (elem.nodeType === 3 || elem.nodeType === 8)) {
|
||
return;
|
||
} // Event object or event type
|
||
|
||
|
||
var cache,
|
||
exclusive,
|
||
i,
|
||
cur,
|
||
old,
|
||
ontype,
|
||
special,
|
||
handle,
|
||
eventPath,
|
||
bubbleType,
|
||
type = event.type || event,
|
||
namespaces = []; // focus/blur morphs to focusin/out; ensure we're not firing them right now
|
||
|
||
if (rfocusMorph.test(type + jQuery.event.triggered)) {
|
||
return;
|
||
}
|
||
|
||
if (type.indexOf("!") >= 0) {
|
||
// Exclusive events trigger only for the exact event (no namespaces)
|
||
type = type.slice(0, -1);
|
||
exclusive = true;
|
||
}
|
||
|
||
if (type.indexOf(".") >= 0) {
|
||
// Namespaced trigger; create a regexp to match event type in handle()
|
||
namespaces = type.split(".");
|
||
type = namespaces.shift();
|
||
namespaces.sort();
|
||
}
|
||
|
||
if ((!elem || jQuery.event.customEvent[type]) && !jQuery.event.global[type]) {
|
||
// No jQuery handlers for this event type, and it can't have inline handlers
|
||
return;
|
||
} // Caller can pass in an Event, Object, or just an event type string
|
||
|
||
|
||
event = _typeof(event) === "object" ? // jQuery.Event object
|
||
event[jQuery.expando] ? event : // Object literal
|
||
new jQuery.Event(type, event) : // Just the event type (string)
|
||
new jQuery.Event(type);
|
||
event.type = type;
|
||
event.isTrigger = true;
|
||
event.exclusive = exclusive;
|
||
event.namespace = namespaces.join(".");
|
||
event.namespace_re = event.namespace ? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
|
||
ontype = type.indexOf(":") < 0 ? "on" + type : ""; // Handle a global trigger
|
||
|
||
if (!elem) {
|
||
// TODO: Stop taunting the data cache; remove global events and always attach to document
|
||
cache = jQuery.cache;
|
||
|
||
for (i in cache) {
|
||
if (cache[i].events && cache[i].events[type]) {
|
||
jQuery.event.trigger(event, data, cache[i].handle.elem, true);
|
||
}
|
||
}
|
||
|
||
return;
|
||
} // Clean up the event in case it is being reused
|
||
|
||
|
||
event.result = undefined;
|
||
|
||
if (!event.target) {
|
||
event.target = elem;
|
||
} // Clone any incoming data and prepend the event, creating the handler arg list
|
||
|
||
|
||
data = data != null ? jQuery.makeArray(data) : [];
|
||
data.unshift(event); // Allow special events to draw outside the lines
|
||
|
||
special = jQuery.event.special[type] || {};
|
||
|
||
if (special.trigger && special.trigger.apply(elem, data) === false) {
|
||
return;
|
||
} // Determine event propagation path in advance, per W3C events spec (#9951)
|
||
// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
|
||
|
||
|
||
eventPath = [[elem, special.bindType || type]];
|
||
|
||
if (!onlyHandlers && !special.noBubble && !jQuery.isWindow(elem)) {
|
||
bubbleType = special.delegateType || type;
|
||
cur = rfocusMorph.test(bubbleType + type) ? elem : elem.parentNode;
|
||
|
||
for (old = elem; cur; cur = cur.parentNode) {
|
||
eventPath.push([cur, bubbleType]);
|
||
old = cur;
|
||
} // Only add window if we got to document (e.g., not plain obj or detached DOM)
|
||
|
||
|
||
if (old === (elem.ownerDocument || document)) {
|
||
eventPath.push([old.defaultView || old.parentWindow || window, bubbleType]);
|
||
}
|
||
} // Fire handlers on the event path
|
||
|
||
|
||
for (i = 0; i < eventPath.length && !event.isPropagationStopped(); i++) {
|
||
cur = eventPath[i][0];
|
||
event.type = eventPath[i][1];
|
||
handle = (jQuery._data(cur, "events") || {})[event.type] && jQuery._data(cur, "handle");
|
||
|
||
if (handle) {
|
||
handle.apply(cur, data);
|
||
} // Note that this is a bare JS function and not a jQuery handler
|
||
|
||
|
||
handle = ontype && cur[ontype];
|
||
|
||
if (handle && jQuery.acceptData(cur) && handle.apply(cur, data) === false) {
|
||
event.preventDefault();
|
||
}
|
||
}
|
||
|
||
event.type = type; // If nobody prevented the default action, do it now
|
||
|
||
if (!onlyHandlers && !event.isDefaultPrevented()) {
|
||
if ((!special._default || special._default.apply(elem.ownerDocument, data) === false) && !(type === "click" && jQuery.nodeName(elem, "a")) && jQuery.acceptData(elem)) {
|
||
// Call a native DOM method on the target with the same name name as the event.
|
||
// Can't use an .isFunction() check here because IE6/7 fails that test.
|
||
// Don't do default actions on window, that's where global variables be (#6170)
|
||
// IE<9 dies on focus/blur to hidden element (#1486)
|
||
if (ontype && elem[type] && (type !== "focus" && type !== "blur" || event.target.offsetWidth !== 0) && !jQuery.isWindow(elem)) {
|
||
// Don't re-trigger an onFOO event when we call its FOO() method
|
||
old = elem[ontype];
|
||
|
||
if (old) {
|
||
elem[ontype] = null;
|
||
} // Prevent re-triggering of the same event, since we already bubbled it above
|
||
|
||
|
||
jQuery.event.triggered = type;
|
||
elem[type]();
|
||
jQuery.event.triggered = undefined;
|
||
|
||
if (old) {
|
||
elem[ontype] = old;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return event.result;
|
||
},
|
||
dispatch: function dispatch(event) {
|
||
// Make a writable jQuery.Event from the native event object
|
||
event = jQuery.event.fix(event || window.event);
|
||
var i,
|
||
j,
|
||
cur,
|
||
ret,
|
||
selMatch,
|
||
matched,
|
||
matches,
|
||
handleObj,
|
||
sel,
|
||
related,
|
||
handlers = (jQuery._data(this, "events") || {})[event.type] || [],
|
||
delegateCount = handlers.delegateCount,
|
||
args = [].slice.call(arguments),
|
||
run_all = !event.exclusive && !event.namespace,
|
||
special = jQuery.event.special[event.type] || {},
|
||
handlerQueue = []; // Use the fix-ed jQuery.Event rather than the (read-only) native event
|
||
|
||
args[0] = event;
|
||
event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired
|
||
|
||
if (special.preDispatch && special.preDispatch.call(this, event) === false) {
|
||
return;
|
||
} // Determine handlers that should run if there are delegated events
|
||
// Avoid non-left-click bubbling in Firefox (#3861)
|
||
|
||
|
||
if (delegateCount && !(event.button && event.type === "click")) {
|
||
for (cur = event.target; cur != this; cur = cur.parentNode || this) {
|
||
// Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
|
||
if (cur.disabled !== true || event.type !== "click") {
|
||
selMatch = {};
|
||
matches = [];
|
||
|
||
for (i = 0; i < delegateCount; i++) {
|
||
handleObj = handlers[i];
|
||
sel = handleObj.selector;
|
||
|
||
if (selMatch[sel] === undefined) {
|
||
selMatch[sel] = jQuery(sel, this).index(cur) >= 0;
|
||
}
|
||
|
||
if (selMatch[sel]) {
|
||
matches.push(handleObj);
|
||
}
|
||
}
|
||
|
||
if (matches.length) {
|
||
handlerQueue.push({
|
||
elem: cur,
|
||
matches: matches
|
||
});
|
||
}
|
||
}
|
||
}
|
||
} // Add the remaining (directly-bound) handlers
|
||
|
||
|
||
if (handlers.length > delegateCount) {
|
||
handlerQueue.push({
|
||
elem: this,
|
||
matches: handlers.slice(delegateCount)
|
||
});
|
||
} // Run delegates first; they may want to stop propagation beneath us
|
||
|
||
|
||
for (i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++) {
|
||
matched = handlerQueue[i];
|
||
event.currentTarget = matched.elem;
|
||
|
||
for (j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++) {
|
||
handleObj = matched.matches[j]; // Triggered event must either 1) be non-exclusive and have no namespace, or
|
||
// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
|
||
|
||
if (run_all || !event.namespace && !handleObj.namespace || event.namespace_re && event.namespace_re.test(handleObj.namespace)) {
|
||
event.data = handleObj.data;
|
||
event.handleObj = handleObj;
|
||
ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args);
|
||
|
||
if (ret !== undefined) {
|
||
event.result = ret;
|
||
|
||
if (ret === false) {
|
||
event.preventDefault();
|
||
event.stopPropagation();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} // Call the postDispatch hook for the mapped type
|
||
|
||
|
||
if (special.postDispatch) {
|
||
special.postDispatch.call(this, event);
|
||
}
|
||
|
||
return event.result;
|
||
},
|
||
// Includes some event props shared by KeyEvent and MouseEvent
|
||
// *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
|
||
props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
|
||
fixHooks: {},
|
||
keyHooks: {
|
||
props: "char charCode key keyCode".split(" "),
|
||
filter: function filter(event, original) {
|
||
// Add which for key events
|
||
if (event.which == null) {
|
||
event.which = original.charCode != null ? original.charCode : original.keyCode;
|
||
}
|
||
|
||
return event;
|
||
}
|
||
},
|
||
mouseHooks: {
|
||
props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
|
||
filter: function filter(event, original) {
|
||
var eventDoc,
|
||
doc,
|
||
body,
|
||
button = original.button,
|
||
fromElement = original.fromElement; // Calculate pageX/Y if missing and clientX/Y available
|
||
|
||
if (event.pageX == null && original.clientX != null) {
|
||
eventDoc = event.target.ownerDocument || document;
|
||
doc = eventDoc.documentElement;
|
||
body = eventDoc.body;
|
||
event.pageX = original.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
|
||
event.pageY = original.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
|
||
} // Add relatedTarget, if necessary
|
||
|
||
|
||
if (!event.relatedTarget && fromElement) {
|
||
event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
|
||
} // Add which for click: 1 === left; 2 === middle; 3 === right
|
||
// Note: button is not normalized, so don't use it
|
||
|
||
|
||
if (!event.which && button !== undefined) {
|
||
event.which = button & 1 ? 1 : button & 2 ? 3 : button & 4 ? 2 : 0;
|
||
}
|
||
|
||
return event;
|
||
}
|
||
},
|
||
fix: function fix(event) {
|
||
if (event[jQuery.expando]) {
|
||
return event;
|
||
} // Create a writable copy of the event object and normalize some properties
|
||
|
||
|
||
var i,
|
||
prop,
|
||
originalEvent = event,
|
||
fixHook = jQuery.event.fixHooks[event.type] || {},
|
||
copy = fixHook.props ? this.props.concat(fixHook.props) : this.props;
|
||
event = jQuery.Event(originalEvent);
|
||
|
||
for (i = copy.length; i;) {
|
||
prop = copy[--i];
|
||
event[prop] = originalEvent[prop];
|
||
} // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
|
||
|
||
|
||
if (!event.target) {
|
||
event.target = originalEvent.srcElement || document;
|
||
} // Target should not be a text node (#504, Safari)
|
||
|
||
|
||
if (event.target.nodeType === 3) {
|
||
event.target = event.target.parentNode;
|
||
} // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
|
||
|
||
|
||
event.metaKey = !!event.metaKey;
|
||
return fixHook.filter ? fixHook.filter(event, originalEvent) : event;
|
||
},
|
||
special: {
|
||
load: {
|
||
// Prevent triggered image.load events from bubbling to window.load
|
||
noBubble: true
|
||
},
|
||
focus: {
|
||
delegateType: "focusin"
|
||
},
|
||
blur: {
|
||
delegateType: "focusout"
|
||
},
|
||
beforeunload: {
|
||
setup: function setup(data, namespaces, eventHandle) {
|
||
// We only want to do this special case on windows
|
||
if (jQuery.isWindow(this)) {
|
||
this.onbeforeunload = eventHandle;
|
||
}
|
||
},
|
||
teardown: function teardown(namespaces, eventHandle) {
|
||
if (this.onbeforeunload === eventHandle) {
|
||
this.onbeforeunload = null;
|
||
}
|
||
}
|
||
}
|
||
},
|
||
simulate: function simulate(type, elem, event, bubble) {
|
||
// Piggyback on a donor event to simulate a different one.
|
||
// Fake originalEvent to avoid donor's stopPropagation, but if the
|
||
// simulated event prevents default then we do the same on the donor.
|
||
var e = jQuery.extend(new jQuery.Event(), event, {
|
||
type: type,
|
||
isSimulated: true,
|
||
originalEvent: {}
|
||
});
|
||
|
||
if (bubble) {
|
||
jQuery.event.trigger(e, null, elem);
|
||
} else {
|
||
jQuery.event.dispatch.call(elem, e);
|
||
}
|
||
|
||
if (e.isDefaultPrevented()) {
|
||
event.preventDefault();
|
||
}
|
||
}
|
||
}; // Some plugins are using, but it's undocumented/deprecated and will be removed.
|
||
// The 1.7 special event interface should provide all the hooks needed now.
|
||
|
||
jQuery.event.handle = jQuery.event.dispatch;
|
||
jQuery.removeEvent = document.removeEventListener ? function (elem, type, handle) {
|
||
if (elem.removeEventListener) {
|
||
elem.removeEventListener(type, handle, false);
|
||
}
|
||
} : function (elem, type, handle) {
|
||
var name = "on" + type;
|
||
|
||
if (elem.detachEvent) {
|
||
// #8545, #7054, preventing memory leaks for custom events in IE6-8 –
|
||
// detachEvent needed property on element, by name of that event, to properly expose it to GC
|
||
if (typeof elem[name] === "undefined") {
|
||
elem[name] = null;
|
||
}
|
||
|
||
elem.detachEvent(name, handle);
|
||
}
|
||
};
|
||
|
||
jQuery.Event = function (src, props) {
|
||
// Allow instantiation without the 'new' keyword
|
||
if (!(this instanceof jQuery.Event)) {
|
||
return new jQuery.Event(src, props);
|
||
} // Event object
|
||
|
||
|
||
if (src && src.type) {
|
||
this.originalEvent = src;
|
||
this.type = src.type; // Events bubbling up the document may have been marked as prevented
|
||
// by a handler lower down the tree; reflect the correct value.
|
||
|
||
this.isDefaultPrevented = src.defaultPrevented || src.returnValue === false || src.getPreventDefault && src.getPreventDefault() ? returnTrue : returnFalse; // Event type
|
||
} else {
|
||
this.type = src;
|
||
} // Put explicitly provided properties onto the event object
|
||
|
||
|
||
if (props) {
|
||
jQuery.extend(this, props);
|
||
} // Create a timestamp if incoming event doesn't have one
|
||
|
||
|
||
this.timeStamp = src && src.timeStamp || jQuery.now(); // Mark it as fixed
|
||
|
||
this[jQuery.expando] = true;
|
||
};
|
||
|
||
function returnFalse() {
|
||
return false;
|
||
}
|
||
|
||
function returnTrue() {
|
||
return true;
|
||
} // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
|
||
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
|
||
|
||
|
||
jQuery.Event.prototype = {
|
||
preventDefault: function preventDefault() {
|
||
this.isDefaultPrevented = returnTrue;
|
||
var e = this.originalEvent;
|
||
|
||
if (!e) {
|
||
return;
|
||
} // if preventDefault exists run it on the original event
|
||
|
||
|
||
if (e.preventDefault) {
|
||
e.preventDefault(); // otherwise set the returnValue property of the original event to false (IE)
|
||
} else {
|
||
e.returnValue = false;
|
||
}
|
||
},
|
||
stopPropagation: function stopPropagation() {
|
||
this.isPropagationStopped = returnTrue;
|
||
var e = this.originalEvent;
|
||
|
||
if (!e) {
|
||
return;
|
||
} // if stopPropagation exists run it on the original event
|
||
|
||
|
||
if (e.stopPropagation) {
|
||
e.stopPropagation();
|
||
} // otherwise set the cancelBubble property of the original event to true (IE)
|
||
|
||
|
||
e.cancelBubble = true;
|
||
},
|
||
stopImmediatePropagation: function stopImmediatePropagation() {
|
||
this.isImmediatePropagationStopped = returnTrue;
|
||
this.stopPropagation();
|
||
},
|
||
isDefaultPrevented: returnFalse,
|
||
isPropagationStopped: returnFalse,
|
||
isImmediatePropagationStopped: returnFalse
|
||
}; // Create mouseenter/leave events using mouseover/out and event-time checks
|
||
|
||
jQuery.each({
|
||
mouseenter: "mouseover",
|
||
mouseleave: "mouseout"
|
||
}, function (orig, fix) {
|
||
jQuery.event.special[orig] = {
|
||
delegateType: fix,
|
||
bindType: fix,
|
||
handle: function handle(event) {
|
||
var ret,
|
||
target = this,
|
||
related = event.relatedTarget,
|
||
handleObj = event.handleObj,
|
||
selector = handleObj.selector; // For mousenter/leave call the handler if related is outside the target.
|
||
// NB: No relatedTarget if the mouse left/entered the browser window
|
||
|
||
if (!related || related !== target && !jQuery.contains(target, related)) {
|
||
event.type = handleObj.origType;
|
||
ret = handleObj.handler.apply(this, arguments);
|
||
event.type = fix;
|
||
}
|
||
|
||
return ret;
|
||
}
|
||
};
|
||
}); // IE submit delegation
|
||
|
||
if (!jQuery.support.submitBubbles) {
|
||
jQuery.event.special.submit = {
|
||
setup: function setup() {
|
||
// Only need this for delegated form submit events
|
||
if (jQuery.nodeName(this, "form")) {
|
||
return false;
|
||
} // Lazy-add a submit handler when a descendant form may potentially be submitted
|
||
|
||
|
||
jQuery.event.add(this, "click._submit keypress._submit", function (e) {
|
||
// Node name check avoids a VML-related crash in IE (#9807)
|
||
var elem = e.target,
|
||
form = jQuery.nodeName(elem, "input") || jQuery.nodeName(elem, "button") ? elem.form : undefined;
|
||
|
||
if (form && !jQuery._data(form, "_submit_attached")) {
|
||
jQuery.event.add(form, "submit._submit", function (event) {
|
||
event._submit_bubble = true;
|
||
});
|
||
|
||
jQuery._data(form, "_submit_attached", true);
|
||
}
|
||
}); // return undefined since we don't need an event listener
|
||
},
|
||
postDispatch: function postDispatch(event) {
|
||
// If form was submitted by the user, bubble the event up the tree
|
||
if (event._submit_bubble) {
|
||
delete event._submit_bubble;
|
||
|
||
if (this.parentNode && !event.isTrigger) {
|
||
jQuery.event.simulate("submit", this.parentNode, event, true);
|
||
}
|
||
}
|
||
},
|
||
teardown: function teardown() {
|
||
// Only need this for delegated form submit events
|
||
if (jQuery.nodeName(this, "form")) {
|
||
return false;
|
||
} // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
|
||
|
||
|
||
jQuery.event.remove(this, "._submit");
|
||
}
|
||
};
|
||
} // IE change delegation and checkbox/radio fix
|
||
|
||
|
||
if (!jQuery.support.changeBubbles) {
|
||
jQuery.event.special.change = {
|
||
setup: function setup() {
|
||
if (rformElems.test(this.nodeName)) {
|
||
// IE doesn't fire change on a check/radio until blur; trigger it on click
|
||
// after a propertychange. Eat the blur-change in special.change.handle.
|
||
// This still fires onchange a second time for check/radio after blur.
|
||
if (this.type === "checkbox" || this.type === "radio") {
|
||
jQuery.event.add(this, "propertychange._change", function (event) {
|
||
if (event.originalEvent.propertyName === "checked") {
|
||
this._just_changed = true;
|
||
}
|
||
});
|
||
jQuery.event.add(this, "click._change", function (event) {
|
||
if (this._just_changed && !event.isTrigger) {
|
||
this._just_changed = false;
|
||
} // Allow triggered, simulated change events (#11500)
|
||
|
||
|
||
jQuery.event.simulate("change", this, event, true);
|
||
});
|
||
}
|
||
|
||
return false;
|
||
} // Delegated event; lazy-add a change handler on descendant inputs
|
||
|
||
|
||
jQuery.event.add(this, "beforeactivate._change", function (e) {
|
||
var elem = e.target;
|
||
|
||
if (rformElems.test(elem.nodeName) && !jQuery._data(elem, "_change_attached")) {
|
||
jQuery.event.add(elem, "change._change", function (event) {
|
||
if (this.parentNode && !event.isSimulated && !event.isTrigger) {
|
||
jQuery.event.simulate("change", this.parentNode, event, true);
|
||
}
|
||
});
|
||
|
||
jQuery._data(elem, "_change_attached", true);
|
||
}
|
||
});
|
||
},
|
||
handle: function handle(event) {
|
||
var elem = event.target; // Swallow native change events from checkbox/radio, we already triggered them above
|
||
|
||
if (this !== elem || event.isSimulated || event.isTrigger || elem.type !== "radio" && elem.type !== "checkbox") {
|
||
return event.handleObj.handler.apply(this, arguments);
|
||
}
|
||
},
|
||
teardown: function teardown() {
|
||
jQuery.event.remove(this, "._change");
|
||
return !rformElems.test(this.nodeName);
|
||
}
|
||
};
|
||
} // Create "bubbling" focus and blur events
|
||
|
||
|
||
if (!jQuery.support.focusinBubbles) {
|
||
jQuery.each({
|
||
focus: "focusin",
|
||
blur: "focusout"
|
||
}, function (orig, fix) {
|
||
// Attach a single capturing handler while someone wants focusin/focusout
|
||
var attaches = 0,
|
||
handler = function handler(event) {
|
||
jQuery.event.simulate(fix, event.target, jQuery.event.fix(event), true);
|
||
};
|
||
|
||
jQuery.event.special[fix] = {
|
||
setup: function setup() {
|
||
if (attaches++ === 0) {
|
||
document.addEventListener(orig, handler, true);
|
||
}
|
||
},
|
||
teardown: function teardown() {
|
||
if (--attaches === 0) {
|
||
document.removeEventListener(orig, handler, true);
|
||
}
|
||
}
|
||
};
|
||
});
|
||
}
|
||
|
||
jQuery.fn.extend({
|
||
on: function on(types, selector, data, fn,
|
||
/*INTERNAL*/
|
||
one) {
|
||
var origFn, type; // Types can be a map of types/handlers
|
||
|
||
if (_typeof(types) === "object") {
|
||
// ( types-Object, selector, data )
|
||
if (typeof selector !== "string") {
|
||
// && selector != null
|
||
// ( types-Object, data )
|
||
data = data || selector;
|
||
selector = undefined;
|
||
}
|
||
|
||
for (type in types) {
|
||
this.on(type, selector, data, types[type], one);
|
||
}
|
||
|
||
return this;
|
||
}
|
||
|
||
if (data == null && fn == null) {
|
||
// ( types, fn )
|
||
fn = selector;
|
||
data = selector = undefined;
|
||
} else if (fn == null) {
|
||
if (typeof selector === "string") {
|
||
// ( types, selector, fn )
|
||
fn = data;
|
||
data = undefined;
|
||
} else {
|
||
// ( types, data, fn )
|
||
fn = data;
|
||
data = selector;
|
||
selector = undefined;
|
||
}
|
||
}
|
||
|
||
if (fn === false) {
|
||
fn = returnFalse;
|
||
} else if (!fn) {
|
||
return this;
|
||
}
|
||
|
||
if (one === 1) {
|
||
origFn = fn;
|
||
|
||
fn = function fn(event) {
|
||
// Can use an empty set, since event contains the info
|
||
jQuery().off(event);
|
||
return origFn.apply(this, arguments);
|
||
}; // Use same guid so caller can remove using origFn
|
||
|
||
|
||
fn.guid = origFn.guid || (origFn.guid = jQuery.guid++);
|
||
}
|
||
|
||
return this.each(function () {
|
||
jQuery.event.add(this, types, fn, data, selector);
|
||
});
|
||
},
|
||
one: function one(types, selector, data, fn) {
|
||
return this.on(types, selector, data, fn, 1);
|
||
},
|
||
off: function off(types, selector, fn) {
|
||
var handleObj, type;
|
||
|
||
if (types && types.preventDefault && types.handleObj) {
|
||
// ( event ) dispatched jQuery.Event
|
||
handleObj = types.handleObj;
|
||
jQuery(types.delegateTarget).off(handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler);
|
||
return this;
|
||
}
|
||
|
||
if (_typeof(types) === "object") {
|
||
// ( types-object [, selector] )
|
||
for (type in types) {
|
||
this.off(type, selector, types[type]);
|
||
}
|
||
|
||
return this;
|
||
}
|
||
|
||
if (selector === false || typeof selector === "function") {
|
||
// ( types [, fn] )
|
||
fn = selector;
|
||
selector = undefined;
|
||
}
|
||
|
||
if (fn === false) {
|
||
fn = returnFalse;
|
||
}
|
||
|
||
return this.each(function () {
|
||
jQuery.event.remove(this, types, fn, selector);
|
||
});
|
||
},
|
||
bind: function bind(types, data, fn) {
|
||
return this.on(types, null, data, fn);
|
||
},
|
||
unbind: function unbind(types, fn) {
|
||
return this.off(types, null, fn);
|
||
},
|
||
live: function live(types, data, fn) {
|
||
jQuery(this.context).on(types, this.selector, data, fn);
|
||
return this;
|
||
},
|
||
die: function die(types, fn) {
|
||
jQuery(this.context).off(types, this.selector || "**", fn);
|
||
return this;
|
||
},
|
||
delegate: function delegate(selector, types, data, fn) {
|
||
return this.on(types, selector, data, fn);
|
||
},
|
||
undelegate: function undelegate(selector, types, fn) {
|
||
// ( namespace ) or ( selector, types [, fn] )
|
||
return arguments.length == 1 ? this.off(selector, "**") : this.off(types, selector || "**", fn);
|
||
},
|
||
trigger: function trigger(type, data) {
|
||
return this.each(function () {
|
||
jQuery.event.trigger(type, data, this);
|
||
});
|
||
},
|
||
triggerHandler: function triggerHandler(type, data) {
|
||
if (this[0]) {
|
||
return jQuery.event.trigger(type, data, this[0], true);
|
||
}
|
||
},
|
||
toggle: function toggle(fn) {
|
||
// Save reference to arguments for access in closure
|
||
var args = arguments,
|
||
guid = fn.guid || jQuery.guid++,
|
||
i = 0,
|
||
toggler = function toggler(event) {
|
||
// Figure out which function to execute
|
||
var lastToggle = (jQuery._data(this, "lastToggle" + fn.guid) || 0) % i;
|
||
|
||
jQuery._data(this, "lastToggle" + fn.guid, lastToggle + 1); // Make sure that clicks stop
|
||
|
||
|
||
event.preventDefault(); // and execute the function
|
||
|
||
return args[lastToggle].apply(this, arguments) || false;
|
||
}; // link all the functions, so any of them can unbind this click handler
|
||
|
||
|
||
toggler.guid = guid;
|
||
|
||
while (i < args.length) {
|
||
args[i++].guid = guid;
|
||
}
|
||
|
||
return this.click(toggler);
|
||
},
|
||
hover: function hover(fnOver, fnOut) {
|
||
return this.mouseenter(fnOver).mouseleave(fnOut || fnOver);
|
||
}
|
||
});
|
||
jQuery.each(("blur focus focusin focusout load resize scroll unload click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup error contextmenu").split(" "), function (i, name) {
|
||
// Handle event binding
|
||
jQuery.fn[name] = function (data, fn) {
|
||
if (fn == null) {
|
||
fn = data;
|
||
data = null;
|
||
}
|
||
|
||
return arguments.length > 0 ? this.on(name, null, data, fn) : this.trigger(name);
|
||
};
|
||
|
||
if (rkeyEvent.test(name)) {
|
||
jQuery.event.fixHooks[name] = jQuery.event.keyHooks;
|
||
}
|
||
|
||
if (rmouseEvent.test(name)) {
|
||
jQuery.event.fixHooks[name] = jQuery.event.mouseHooks;
|
||
}
|
||
});
|
||
/*!
|
||
* Sizzle CSS Selector Engine
|
||
* Copyright 2012 jQuery Foundation and other contributors
|
||
* Released under the MIT license
|
||
* http://sizzlejs.com/
|
||
*/
|
||
|
||
(function (window, undefined) {
|
||
var dirruns,
|
||
cachedruns,
|
||
assertGetIdNotName,
|
||
Expr,
|
||
getText,
|
||
isXML,
|
||
contains,
|
||
compile,
|
||
sortOrder,
|
||
hasDuplicate,
|
||
baseHasDuplicate = true,
|
||
strundefined = "undefined",
|
||
expando = ("sizcache" + Math.random()).replace(".", ""),
|
||
document = window.document,
|
||
docElem = document.documentElement,
|
||
done = 0,
|
||
slice = [].slice,
|
||
push = [].push,
|
||
// Augment a function for special use by Sizzle
|
||
markFunction = function markFunction(fn, value) {
|
||
fn[expando] = value || true;
|
||
return fn;
|
||
},
|
||
createCache = function createCache() {
|
||
var cache = {},
|
||
keys = [];
|
||
return markFunction(function (key, value) {
|
||
// Only keep the most recent entries
|
||
if (keys.push(key) > Expr.cacheLength) {
|
||
delete cache[keys.shift()];
|
||
}
|
||
|
||
return cache[key] = value;
|
||
}, cache);
|
||
},
|
||
classCache = createCache(),
|
||
tokenCache = createCache(),
|
||
compilerCache = createCache(),
|
||
// Regex
|
||
// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
|
||
whitespace = "[\\x20\\t\\r\\n\\f]",
|
||
// http://www.w3.org/TR/css3-syntax/#characters
|
||
characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",
|
||
// Loosely modeled on CSS identifier characters
|
||
// An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)
|
||
// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
|
||
identifier = characterEncoding.replace("w", "w#"),
|
||
// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
|
||
operators = "([*^$|!~]?=)",
|
||
attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
|
||
// Prefer arguments not in parens/brackets,
|
||
// then attribute selectors and non-pseudos (denoted by :),
|
||
// then anything else
|
||
// These preferences are here to reduce the number of selectors
|
||
// needing tokenize in the PSEUDO preFilter
|
||
pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",
|
||
// For matchExpr.POS and matchExpr.needsContext
|
||
pos = ":(nth|eq|gt|lt|first|last|even|odd)(?:\\(((?:-\\d)?\\d*)\\)|)(?=[^-]|$)",
|
||
// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
|
||
rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"),
|
||
rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"),
|
||
rcombinators = new RegExp("^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*"),
|
||
rpseudo = new RegExp(pseudos),
|
||
// Easily-parseable/retrievable ID or TAG or CLASS selectors
|
||
rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,
|
||
rnot = /^:not/,
|
||
rsibling = /[\x20\t\r\n\f]*[+~]/,
|
||
rendsWithNot = /:not\($/,
|
||
rheader = /h\d/i,
|
||
rinputs = /input|select|textarea|button/i,
|
||
rbackslash = /\\(?!\\)/g,
|
||
matchExpr = {
|
||
"ID": new RegExp("^#(" + characterEncoding + ")"),
|
||
"CLASS": new RegExp("^\\.(" + characterEncoding + ")"),
|
||
"NAME": new RegExp("^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]"),
|
||
"TAG": new RegExp("^(" + characterEncoding.replace("w", "w*") + ")"),
|
||
"ATTR": new RegExp("^" + attributes),
|
||
"PSEUDO": new RegExp("^" + pseudos),
|
||
"CHILD": new RegExp("^:(only|nth|last|first)-child(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"),
|
||
"POS": new RegExp(pos, "ig"),
|
||
// For use in libraries implementing .is()
|
||
"needsContext": new RegExp("^" + whitespace + "*[>+~]|" + pos, "i")
|
||
},
|
||
// Support
|
||
// Used for testing something on an element
|
||
assert = function assert(fn) {
|
||
var div = document.createElement("div");
|
||
|
||
try {
|
||
return fn(div);
|
||
} catch (e) {
|
||
return false;
|
||
} finally {
|
||
// release memory in IE
|
||
div = null;
|
||
}
|
||
},
|
||
// Check if getElementsByTagName("*") returns only elements
|
||
assertTagNameNoComments = assert(function (div) {
|
||
div.appendChild(document.createComment(""));
|
||
return !div.getElementsByTagName("*").length;
|
||
}),
|
||
// Check if getAttribute returns normalized href attributes
|
||
assertHrefNotNormalized = assert(function (div) {
|
||
div.innerHTML = "<a href='#'></a>";
|
||
return div.firstChild && _typeof(div.firstChild.getAttribute) !== strundefined && div.firstChild.getAttribute("href") === "#";
|
||
}),
|
||
// Check if attributes should be retrieved by attribute nodes
|
||
assertAttributes = assert(function (div) {
|
||
div.innerHTML = "<select></select>";
|
||
|
||
var type = _typeof(div.lastChild.getAttribute("multiple")); // IE8 returns a string for some attributes even when not present
|
||
|
||
|
||
return type !== "boolean" && type !== "string";
|
||
}),
|
||
// Check if getElementsByClassName can be trusted
|
||
assertUsableClassName = assert(function (div) {
|
||
// Opera can't find a second classname (in 9.6)
|
||
div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
|
||
|
||
if (!div.getElementsByClassName || !div.getElementsByClassName("e").length) {
|
||
return false;
|
||
} // Safari 3.2 caches class attributes and doesn't catch changes
|
||
|
||
|
||
div.lastChild.className = "e";
|
||
return div.getElementsByClassName("e").length === 2;
|
||
}),
|
||
// Check if getElementById returns elements by name
|
||
// Check if getElementsByName privileges form controls or returns elements by ID
|
||
assertUsableName = assert(function (div) {
|
||
// Inject content
|
||
div.id = expando + 0;
|
||
div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
|
||
docElem.insertBefore(div, docElem.firstChild); // Test
|
||
|
||
var pass = document.getElementsByName && // buggy browsers will return fewer than the correct 2
|
||
document.getElementsByName(expando).length === 2 + // buggy browsers will return more than the correct 0
|
||
document.getElementsByName(expando + 0).length;
|
||
assertGetIdNotName = !document.getElementById(expando); // Cleanup
|
||
|
||
docElem.removeChild(div);
|
||
return pass;
|
||
}); // If slice is not available, provide a backup
|
||
|
||
|
||
try {
|
||
slice.call(docElem.childNodes, 0)[0].nodeType;
|
||
} catch (e) {
|
||
slice = function slice(i) {
|
||
var elem,
|
||
results = [];
|
||
|
||
for (; elem = this[i]; i++) {
|
||
results.push(elem);
|
||
}
|
||
|
||
return results;
|
||
};
|
||
}
|
||
|
||
function Sizzle(selector, context, results, seed) {
|
||
results = results || [];
|
||
context = context || document;
|
||
var match,
|
||
elem,
|
||
xml,
|
||
m,
|
||
nodeType = context.nodeType;
|
||
|
||
if (nodeType !== 1 && nodeType !== 9) {
|
||
return [];
|
||
}
|
||
|
||
if (!selector || typeof selector !== "string") {
|
||
return results;
|
||
}
|
||
|
||
xml = isXML(context);
|
||
|
||
if (!xml && !seed) {
|
||
if (match = rquickExpr.exec(selector)) {
|
||
// Speed-up: Sizzle("#ID")
|
||
if (m = match[1]) {
|
||
if (nodeType === 9) {
|
||
elem = context.getElementById(m); // Check parentNode to catch when Blackberry 4.6 returns
|
||
// nodes that are no longer in the document #6963
|
||
|
||
if (elem && elem.parentNode) {
|
||
// Handle the case where IE, Opera, and Webkit return items
|
||
// by name instead of ID
|
||
if (elem.id === m) {
|
||
results.push(elem);
|
||
return results;
|
||
}
|
||
} else {
|
||
return results;
|
||
}
|
||
} else {
|
||
// Context is not a document
|
||
if (context.ownerDocument && (elem = context.ownerDocument.getElementById(m)) && contains(context, elem) && elem.id === m) {
|
||
results.push(elem);
|
||
return results;
|
||
}
|
||
} // Speed-up: Sizzle("TAG")
|
||
|
||
} else if (match[2]) {
|
||
push.apply(results, slice.call(context.getElementsByTagName(selector), 0));
|
||
return results; // Speed-up: Sizzle(".CLASS")
|
||
} else if ((m = match[3]) && assertUsableClassName && context.getElementsByClassName) {
|
||
push.apply(results, slice.call(context.getElementsByClassName(m), 0));
|
||
return results;
|
||
}
|
||
}
|
||
} // All others
|
||
|
||
|
||
return select(selector, context, results, seed, xml);
|
||
}
|
||
|
||
Sizzle.matches = function (expr, elements) {
|
||
return Sizzle(expr, null, null, elements);
|
||
};
|
||
|
||
Sizzle.matchesSelector = function (elem, expr) {
|
||
return Sizzle(expr, null, null, [elem]).length > 0;
|
||
}; // Returns a function to use in pseudos for input types
|
||
|
||
|
||
function createInputPseudo(type) {
|
||
return function (elem) {
|
||
var name = elem.nodeName.toLowerCase();
|
||
return name === "input" && elem.type === type;
|
||
};
|
||
} // Returns a function to use in pseudos for buttons
|
||
|
||
|
||
function createButtonPseudo(type) {
|
||
return function (elem) {
|
||
var name = elem.nodeName.toLowerCase();
|
||
return (name === "input" || name === "button") && elem.type === type;
|
||
};
|
||
}
|
||
/**
|
||
* Utility function for retrieving the text value of an array of DOM nodes
|
||
* @param {Array|Element} elem
|
||
*/
|
||
|
||
|
||
getText = Sizzle.getText = function (elem) {
|
||
var node,
|
||
ret = "",
|
||
i = 0,
|
||
nodeType = elem.nodeType;
|
||
|
||
if (nodeType) {
|
||
if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
|
||
// Use textContent for elements
|
||
// innerText usage removed for consistency of new lines (see #11153)
|
||
if (typeof elem.textContent === "string") {
|
||
return elem.textContent;
|
||
} else {
|
||
// Traverse its children
|
||
for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
|
||
ret += getText(elem);
|
||
}
|
||
}
|
||
} else if (nodeType === 3 || nodeType === 4) {
|
||
return elem.nodeValue;
|
||
} // Do not include comment or processing instruction nodes
|
||
|
||
} else {
|
||
// If no nodeType, this is expected to be an array
|
||
for (; node = elem[i]; i++) {
|
||
// Do not traverse comment nodes
|
||
ret += getText(node);
|
||
}
|
||
}
|
||
|
||
return ret;
|
||
};
|
||
|
||
isXML = Sizzle.isXML = function isXML(elem) {
|
||
// documentElement is verified for cases where it doesn't yet exist
|
||
// (such as loading iframes in IE - #4833)
|
||
var documentElement = elem && (elem.ownerDocument || elem).documentElement;
|
||
return documentElement ? documentElement.nodeName !== "HTML" : false;
|
||
}; // Element contains another
|
||
|
||
|
||
contains = Sizzle.contains = docElem.contains ? function (a, b) {
|
||
var adown = a.nodeType === 9 ? a.documentElement : a,
|
||
bup = b && b.parentNode;
|
||
return a === bup || !!(bup && bup.nodeType === 1 && adown.contains && adown.contains(bup));
|
||
} : docElem.compareDocumentPosition ? function (a, b) {
|
||
return b && !!(a.compareDocumentPosition(b) & 16);
|
||
} : function (a, b) {
|
||
while (b = b.parentNode) {
|
||
if (b === a) {
|
||
return true;
|
||
}
|
||
}
|
||
|
||
return false;
|
||
};
|
||
|
||
Sizzle.attr = function (elem, name) {
|
||
var attr,
|
||
xml = isXML(elem);
|
||
|
||
if (!xml) {
|
||
name = name.toLowerCase();
|
||
}
|
||
|
||
if (Expr.attrHandle[name]) {
|
||
return Expr.attrHandle[name](elem);
|
||
}
|
||
|
||
if (assertAttributes || xml) {
|
||
return elem.getAttribute(name);
|
||
}
|
||
|
||
attr = elem.getAttributeNode(name);
|
||
return attr ? typeof elem[name] === "boolean" ? elem[name] ? name : null : attr.specified ? attr.value : null : null;
|
||
};
|
||
|
||
Expr = Sizzle.selectors = {
|
||
// Can be adjusted by the user
|
||
cacheLength: 50,
|
||
createPseudo: markFunction,
|
||
match: matchExpr,
|
||
order: new RegExp("ID|TAG" + (assertUsableName ? "|NAME" : "") + (assertUsableClassName ? "|CLASS" : "")),
|
||
// IE6/7 return a modified href
|
||
attrHandle: assertHrefNotNormalized ? {} : {
|
||
"href": function href(elem) {
|
||
return elem.getAttribute("href", 2);
|
||
},
|
||
"type": function type(elem) {
|
||
return elem.getAttribute("type");
|
||
}
|
||
},
|
||
find: {
|
||
"ID": assertGetIdNotName ? function (id, context, xml) {
|
||
if (_typeof(context.getElementById) !== strundefined && !xml) {
|
||
var m = context.getElementById(id); // Check parentNode to catch when Blackberry 4.6 returns
|
||
// nodes that are no longer in the document #6963
|
||
|
||
return m && m.parentNode ? [m] : [];
|
||
}
|
||
} : function (id, context, xml) {
|
||
if (_typeof(context.getElementById) !== strundefined && !xml) {
|
||
var m = context.getElementById(id);
|
||
return m ? m.id === id || _typeof(m.getAttributeNode) !== strundefined && m.getAttributeNode("id").value === id ? [m] : undefined : [];
|
||
}
|
||
},
|
||
"TAG": assertTagNameNoComments ? function (tag, context) {
|
||
if (_typeof(context.getElementsByTagName) !== strundefined) {
|
||
return context.getElementsByTagName(tag);
|
||
}
|
||
} : function (tag, context) {
|
||
var results = context.getElementsByTagName(tag); // Filter out possible comments
|
||
|
||
if (tag === "*") {
|
||
var elem,
|
||
tmp = [],
|
||
i = 0;
|
||
|
||
for (; elem = results[i]; i++) {
|
||
if (elem.nodeType === 1) {
|
||
tmp.push(elem);
|
||
}
|
||
}
|
||
|
||
return tmp;
|
||
}
|
||
|
||
return results;
|
||
},
|
||
"NAME": function NAME(tag, context) {
|
||
if (_typeof(context.getElementsByName) !== strundefined) {
|
||
return context.getElementsByName(name);
|
||
}
|
||
},
|
||
"CLASS": function CLASS(className, context, xml) {
|
||
if (_typeof(context.getElementsByClassName) !== strundefined && !xml) {
|
||
return context.getElementsByClassName(className);
|
||
}
|
||
}
|
||
},
|
||
relative: {
|
||
">": {
|
||
dir: "parentNode",
|
||
first: true
|
||
},
|
||
" ": {
|
||
dir: "parentNode"
|
||
},
|
||
"+": {
|
||
dir: "previousSibling",
|
||
first: true
|
||
},
|
||
"~": {
|
||
dir: "previousSibling"
|
||
}
|
||
},
|
||
preFilter: {
|
||
"ATTR": function ATTR(match) {
|
||
match[1] = match[1].replace(rbackslash, ""); // Move the given value to match[3] whether quoted or unquoted
|
||
|
||
match[3] = (match[4] || match[5] || "").replace(rbackslash, "");
|
||
|
||
if (match[2] === "~=") {
|
||
match[3] = " " + match[3] + " ";
|
||
}
|
||
|
||
return match.slice(0, 4);
|
||
},
|
||
"CHILD": function CHILD(match) {
|
||
/* matches from matchExpr.CHILD
|
||
1 type (only|nth|...)
|
||
2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
|
||
3 xn-component of xn+y argument ([+-]?\d*n|)
|
||
4 sign of xn-component
|
||
5 x of xn-component
|
||
6 sign of y-component
|
||
7 y of y-component
|
||
*/
|
||
match[1] = match[1].toLowerCase();
|
||
|
||
if (match[1] === "nth") {
|
||
// nth-child requires argument
|
||
if (!match[2]) {
|
||
Sizzle.error(match[0]);
|
||
} // numeric x and y parameters for Expr.filter.CHILD
|
||
// remember that false/true cast respectively to 0/1
|
||
|
||
|
||
match[3] = +(match[3] ? match[4] + (match[5] || 1) : 2 * (match[2] === "even" || match[2] === "odd"));
|
||
match[4] = +(match[6] + match[7] || match[2] === "odd"); // other types prohibit arguments
|
||
} else if (match[2]) {
|
||
Sizzle.error(match[0]);
|
||
}
|
||
|
||
return match;
|
||
},
|
||
"PSEUDO": function PSEUDO(match, context, xml) {
|
||
var unquoted, excess;
|
||
|
||
if (matchExpr["CHILD"].test(match[0])) {
|
||
return null;
|
||
}
|
||
|
||
if (match[3]) {
|
||
match[2] = match[3];
|
||
} else if (unquoted = match[4]) {
|
||
// Only check arguments that contain a pseudo
|
||
if (rpseudo.test(unquoted) && ( // Get excess from tokenize (recursively)
|
||
excess = tokenize(unquoted, context, xml, true)) && ( // advance to the next closing parenthesis
|
||
excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) {
|
||
// excess is a negative index
|
||
unquoted = unquoted.slice(0, excess);
|
||
match[0] = match[0].slice(0, excess);
|
||
}
|
||
|
||
match[2] = unquoted;
|
||
} // Return only captures needed by the pseudo filter method (type and argument)
|
||
|
||
|
||
return match.slice(0, 3);
|
||
}
|
||
},
|
||
filter: {
|
||
"ID": assertGetIdNotName ? function (id) {
|
||
id = id.replace(rbackslash, "");
|
||
return function (elem) {
|
||
return elem.getAttribute("id") === id;
|
||
};
|
||
} : function (id) {
|
||
id = id.replace(rbackslash, "");
|
||
return function (elem) {
|
||
var node = _typeof(elem.getAttributeNode) !== strundefined && elem.getAttributeNode("id");
|
||
return node && node.value === id;
|
||
};
|
||
},
|
||
"TAG": function TAG(nodeName) {
|
||
if (nodeName === "*") {
|
||
return function () {
|
||
return true;
|
||
};
|
||
}
|
||
|
||
nodeName = nodeName.replace(rbackslash, "").toLowerCase();
|
||
return function (elem) {
|
||
return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
|
||
};
|
||
},
|
||
"CLASS": function CLASS(className) {
|
||
var pattern = classCache[expando][className];
|
||
|
||
if (!pattern) {
|
||
pattern = classCache(className, new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)"));
|
||
}
|
||
|
||
return function (elem) {
|
||
return pattern.test(elem.className || _typeof(elem.getAttribute) !== strundefined && elem.getAttribute("class") || "");
|
||
};
|
||
},
|
||
"ATTR": function ATTR(name, operator, check) {
|
||
if (!operator) {
|
||
return function (elem) {
|
||
return Sizzle.attr(elem, name) != null;
|
||
};
|
||
}
|
||
|
||
return function (elem) {
|
||
var result = Sizzle.attr(elem, name),
|
||
value = result + "";
|
||
|
||
if (result == null) {
|
||
return operator === "!=";
|
||
}
|
||
|
||
switch (operator) {
|
||
case "=":
|
||
return value === check;
|
||
|
||
case "!=":
|
||
return value !== check;
|
||
|
||
case "^=":
|
||
return check && value.indexOf(check) === 0;
|
||
|
||
case "*=":
|
||
return check && value.indexOf(check) > -1;
|
||
|
||
case "$=":
|
||
return check && value.substr(value.length - check.length) === check;
|
||
|
||
case "~=":
|
||
return (" " + value + " ").indexOf(check) > -1;
|
||
|
||
case "|=":
|
||
return value === check || value.substr(0, check.length + 1) === check + "-";
|
||
}
|
||
};
|
||
},
|
||
"CHILD": function CHILD(type, argument, first, last) {
|
||
if (type === "nth") {
|
||
var doneName = done++;
|
||
return function (elem) {
|
||
var parent,
|
||
diff,
|
||
count = 0,
|
||
node = elem;
|
||
|
||
if (first === 1 && last === 0) {
|
||
return true;
|
||
}
|
||
|
||
parent = elem.parentNode;
|
||
|
||
if (parent && (parent[expando] !== doneName || !elem.sizset)) {
|
||
for (node = parent.firstChild; node; node = node.nextSibling) {
|
||
if (node.nodeType === 1) {
|
||
node.sizset = ++count;
|
||
|
||
if (node === elem) {
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
parent[expando] = doneName;
|
||
}
|
||
|
||
diff = elem.sizset - last;
|
||
|
||
if (first === 0) {
|
||
return diff === 0;
|
||
} else {
|
||
return diff % first === 0 && diff / first >= 0;
|
||
}
|
||
};
|
||
}
|
||
|
||
return function (elem) {
|
||
var node = elem;
|
||
|
||
switch (type) {
|
||
case "only":
|
||
case "first":
|
||
while (node = node.previousSibling) {
|
||
if (node.nodeType === 1) {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
if (type === "first") {
|
||
return true;
|
||
}
|
||
|
||
node = elem;
|
||
|
||
/* falls through */
|
||
|
||
case "last":
|
||
while (node = node.nextSibling) {
|
||
if (node.nodeType === 1) {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
};
|
||
},
|
||
"PSEUDO": function PSEUDO(pseudo, argument, context, xml) {
|
||
// pseudo-class names are case-insensitive
|
||
// http://www.w3.org/TR/selectors/#pseudo-classes
|
||
// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
|
||
var args,
|
||
fn = Expr.pseudos[pseudo] || Expr.pseudos[pseudo.toLowerCase()];
|
||
|
||
if (!fn) {
|
||
Sizzle.error("unsupported pseudo: " + pseudo);
|
||
} // The user may use createPseudo to indicate that
|
||
// arguments are needed to create the filter function
|
||
// just as Sizzle does
|
||
|
||
|
||
if (!fn[expando]) {
|
||
if (fn.length > 1) {
|
||
args = [pseudo, pseudo, "", argument];
|
||
return function (elem) {
|
||
return fn(elem, 0, args);
|
||
};
|
||
}
|
||
|
||
return fn;
|
||
}
|
||
|
||
return fn(argument, context, xml);
|
||
}
|
||
},
|
||
pseudos: {
|
||
"not": markFunction(function (selector, context, xml) {
|
||
// Trim the selector passed to compile
|
||
// to avoid treating leading and trailing
|
||
// spaces as combinators
|
||
var matcher = compile(selector.replace(rtrim, "$1"), context, xml);
|
||
return function (elem) {
|
||
return !matcher(elem);
|
||
};
|
||
}),
|
||
"enabled": function enabled(elem) {
|
||
return elem.disabled === false;
|
||
},
|
||
"disabled": function disabled(elem) {
|
||
return elem.disabled === true;
|
||
},
|
||
"checked": function checked(elem) {
|
||
// In CSS3, :checked should return both checked and selected elements
|
||
// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
|
||
var nodeName = elem.nodeName.toLowerCase();
|
||
return nodeName === "input" && !!elem.checked || nodeName === "option" && !!elem.selected;
|
||
},
|
||
"selected": function selected(elem) {
|
||
// Accessing this property makes selected-by-default
|
||
// options in Safari work properly
|
||
if (elem.parentNode) {
|
||
elem.parentNode.selectedIndex;
|
||
}
|
||
|
||
return elem.selected === true;
|
||
},
|
||
"parent": function parent(elem) {
|
||
return !Expr.pseudos["empty"](elem);
|
||
},
|
||
"empty": function empty(elem) {
|
||
// http://www.w3.org/TR/selectors/#empty-pseudo
|
||
// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
|
||
// not comment, processing instructions, or others
|
||
// Thanks to Diego Perini for the nodeName shortcut
|
||
// Greater than "@" means alpha characters (specifically not starting with "#" or "?")
|
||
var nodeType;
|
||
elem = elem.firstChild;
|
||
|
||
while (elem) {
|
||
if (elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4) {
|
||
return false;
|
||
}
|
||
|
||
elem = elem.nextSibling;
|
||
}
|
||
|
||
return true;
|
||
},
|
||
"contains": markFunction(function (text) {
|
||
return function (elem) {
|
||
return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1;
|
||
};
|
||
}),
|
||
"has": markFunction(function (selector) {
|
||
return function (elem) {
|
||
return Sizzle(selector, elem).length > 0;
|
||
};
|
||
}),
|
||
"header": function header(elem) {
|
||
return rheader.test(elem.nodeName);
|
||
},
|
||
"text": function text(elem) {
|
||
var type, attr; // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
|
||
// use getAttribute instead to test this case
|
||
|
||
return elem.nodeName.toLowerCase() === "input" && (type = elem.type) === "text" && ((attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type);
|
||
},
|
||
// Input types
|
||
"radio": createInputPseudo("radio"),
|
||
"checkbox": createInputPseudo("checkbox"),
|
||
"file": createInputPseudo("file"),
|
||
"password": createInputPseudo("password"),
|
||
"image": createInputPseudo("image"),
|
||
"submit": createButtonPseudo("submit"),
|
||
"reset": createButtonPseudo("reset"),
|
||
"button": function button(elem) {
|
||
var name = elem.nodeName.toLowerCase();
|
||
return name === "input" && elem.type === "button" || name === "button";
|
||
},
|
||
"input": function input(elem) {
|
||
return rinputs.test(elem.nodeName);
|
||
},
|
||
"focus": function focus(elem) {
|
||
var doc = elem.ownerDocument;
|
||
return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href);
|
||
},
|
||
"active": function active(elem) {
|
||
return elem === elem.ownerDocument.activeElement;
|
||
}
|
||
},
|
||
setFilters: {
|
||
"first": function first(elements, argument, not) {
|
||
return not ? elements.slice(1) : [elements[0]];
|
||
},
|
||
"last": function last(elements, argument, not) {
|
||
var elem = elements.pop();
|
||
return not ? elements : [elem];
|
||
},
|
||
"even": function even(elements, argument, not) {
|
||
var results = [],
|
||
i = not ? 1 : 0,
|
||
len = elements.length;
|
||
|
||
for (; i < len; i = i + 2) {
|
||
results.push(elements[i]);
|
||
}
|
||
|
||
return results;
|
||
},
|
||
"odd": function odd(elements, argument, not) {
|
||
var results = [],
|
||
i = not ? 0 : 1,
|
||
len = elements.length;
|
||
|
||
for (; i < len; i = i + 2) {
|
||
results.push(elements[i]);
|
||
}
|
||
|
||
return results;
|
||
},
|
||
"lt": function lt(elements, argument, not) {
|
||
return not ? elements.slice(+argument) : elements.slice(0, +argument);
|
||
},
|
||
"gt": function gt(elements, argument, not) {
|
||
return not ? elements.slice(0, +argument + 1) : elements.slice(+argument + 1);
|
||
},
|
||
"eq": function eq(elements, argument, not) {
|
||
var elem = elements.splice(+argument, 1);
|
||
return not ? elements : elem;
|
||
}
|
||
}
|
||
};
|
||
|
||
function siblingCheck(a, b, ret) {
|
||
if (a === b) {
|
||
return ret;
|
||
}
|
||
|
||
var cur = a.nextSibling;
|
||
|
||
while (cur) {
|
||
if (cur === b) {
|
||
return -1;
|
||
}
|
||
|
||
cur = cur.nextSibling;
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
sortOrder = docElem.compareDocumentPosition ? function (a, b) {
|
||
if (a === b) {
|
||
hasDuplicate = true;
|
||
return 0;
|
||
}
|
||
|
||
return (!a.compareDocumentPosition || !b.compareDocumentPosition ? a.compareDocumentPosition : a.compareDocumentPosition(b) & 4) ? -1 : 1;
|
||
} : function (a, b) {
|
||
// The nodes are identical, we can exit early
|
||
if (a === b) {
|
||
hasDuplicate = true;
|
||
return 0; // Fallback to using sourceIndex (in IE) if it's available on both nodes
|
||
} else if (a.sourceIndex && b.sourceIndex) {
|
||
return a.sourceIndex - b.sourceIndex;
|
||
}
|
||
|
||
var al,
|
||
bl,
|
||
ap = [],
|
||
bp = [],
|
||
aup = a.parentNode,
|
||
bup = b.parentNode,
|
||
cur = aup; // If the nodes are siblings (or identical) we can do a quick check
|
||
|
||
if (aup === bup) {
|
||
return siblingCheck(a, b); // If no parents were found then the nodes are disconnected
|
||
} else if (!aup) {
|
||
return -1;
|
||
} else if (!bup) {
|
||
return 1;
|
||
} // Otherwise they're somewhere else in the tree so we need
|
||
// to build up a full list of the parentNodes for comparison
|
||
|
||
|
||
while (cur) {
|
||
ap.unshift(cur);
|
||
cur = cur.parentNode;
|
||
}
|
||
|
||
cur = bup;
|
||
|
||
while (cur) {
|
||
bp.unshift(cur);
|
||
cur = cur.parentNode;
|
||
}
|
||
|
||
al = ap.length;
|
||
bl = bp.length; // Start walking down the tree looking for a discrepancy
|
||
|
||
for (var i = 0; i < al && i < bl; i++) {
|
||
if (ap[i] !== bp[i]) {
|
||
return siblingCheck(ap[i], bp[i]);
|
||
}
|
||
} // We ended someplace up the tree so do a sibling check
|
||
|
||
|
||
return i === al ? siblingCheck(a, bp[i], -1) : siblingCheck(ap[i], b, 1);
|
||
}; // Always assume the presence of duplicates if sort doesn't
|
||
// pass them to our comparison function (as in Google Chrome).
|
||
|
||
[0, 0].sort(sortOrder);
|
||
baseHasDuplicate = !hasDuplicate; // Document sorting and removing duplicates
|
||
|
||
Sizzle.uniqueSort = function (results) {
|
||
var elem,
|
||
i = 1;
|
||
hasDuplicate = baseHasDuplicate;
|
||
results.sort(sortOrder);
|
||
|
||
if (hasDuplicate) {
|
||
for (; elem = results[i]; i++) {
|
||
if (elem === results[i - 1]) {
|
||
results.splice(i--, 1);
|
||
}
|
||
}
|
||
}
|
||
|
||
return results;
|
||
};
|
||
|
||
Sizzle.error = function (msg) {
|
||
throw new Error("Syntax error, unrecognized expression: " + msg);
|
||
};
|
||
|
||
function tokenize(selector, context, xml, parseOnly) {
|
||
var matched,
|
||
match,
|
||
tokens,
|
||
type,
|
||
soFar,
|
||
groups,
|
||
group,
|
||
i,
|
||
preFilters,
|
||
filters,
|
||
checkContext = !xml && context !== document,
|
||
// Token cache should maintain spaces
|
||
key = (checkContext ? "<s>" : "") + selector.replace(rtrim, "$1<s>"),
|
||
cached = tokenCache[expando][key];
|
||
|
||
if (cached) {
|
||
return parseOnly ? 0 : slice.call(cached, 0);
|
||
}
|
||
|
||
soFar = selector;
|
||
groups = [];
|
||
i = 0;
|
||
preFilters = Expr.preFilter;
|
||
filters = Expr.filter;
|
||
|
||
while (soFar) {
|
||
// Comma and first run
|
||
if (!matched || (match = rcomma.exec(soFar))) {
|
||
if (match) {
|
||
soFar = soFar.slice(match[0].length);
|
||
tokens.selector = group;
|
||
}
|
||
|
||
groups.push(tokens = []);
|
||
group = ""; // Need to make sure we're within a narrower context if necessary
|
||
// Adding a descendant combinator will generate what is needed
|
||
|
||
if (checkContext) {
|
||
soFar = " " + soFar;
|
||
}
|
||
}
|
||
|
||
matched = false; // Combinators
|
||
|
||
if (match = rcombinators.exec(soFar)) {
|
||
group += match[0];
|
||
soFar = soFar.slice(match[0].length); // Cast descendant combinators to space
|
||
|
||
matched = tokens.push({
|
||
part: match.pop().replace(rtrim, " "),
|
||
string: match[0],
|
||
captures: match
|
||
});
|
||
} // Filters
|
||
|
||
|
||
for (type in filters) {
|
||
if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match, context, xml)))) {
|
||
group += match[0];
|
||
soFar = soFar.slice(match[0].length);
|
||
matched = tokens.push({
|
||
part: type,
|
||
string: match.shift(),
|
||
captures: match
|
||
});
|
||
}
|
||
}
|
||
|
||
if (!matched) {
|
||
break;
|
||
}
|
||
} // Attach the full group as a selector
|
||
|
||
|
||
if (group) {
|
||
tokens.selector = group;
|
||
} // Return the length of the invalid excess
|
||
// if we're just parsing
|
||
// Otherwise, throw an error or return tokens
|
||
|
||
|
||
return parseOnly ? soFar.length : soFar ? Sizzle.error(selector) : // Cache the tokens
|
||
slice.call(tokenCache(key, groups), 0);
|
||
}
|
||
|
||
function addCombinator(matcher, combinator, context, xml) {
|
||
var dir = combinator.dir,
|
||
doneName = done++;
|
||
|
||
if (!matcher) {
|
||
// If there is no matcher to check, check against the context
|
||
matcher = function matcher(elem) {
|
||
return elem === context;
|
||
};
|
||
}
|
||
|
||
return combinator.first ? function (elem) {
|
||
while (elem = elem[dir]) {
|
||
if (elem.nodeType === 1) {
|
||
return matcher(elem) && elem;
|
||
}
|
||
}
|
||
} : xml ? function (elem) {
|
||
while (elem = elem[dir]) {
|
||
if (elem.nodeType === 1) {
|
||
if (matcher(elem)) {
|
||
return elem;
|
||
}
|
||
}
|
||
}
|
||
} : function (elem) {
|
||
var cache,
|
||
dirkey = doneName + "." + dirruns,
|
||
cachedkey = dirkey + "." + cachedruns;
|
||
|
||
while (elem = elem[dir]) {
|
||
if (elem.nodeType === 1) {
|
||
if ((cache = elem[expando]) === cachedkey) {
|
||
return elem.sizset;
|
||
} else if (typeof cache === "string" && cache.indexOf(dirkey) === 0) {
|
||
if (elem.sizset) {
|
||
return elem;
|
||
}
|
||
} else {
|
||
elem[expando] = cachedkey;
|
||
|
||
if (matcher(elem)) {
|
||
elem.sizset = true;
|
||
return elem;
|
||
}
|
||
|
||
elem.sizset = false;
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
|
||
function addMatcher(higher, deeper) {
|
||
return higher ? function (elem) {
|
||
var result = deeper(elem);
|
||
return result && higher(result === true ? elem : result);
|
||
} : deeper;
|
||
} // ["TAG", ">", "ID", " ", "CLASS"]
|
||
|
||
|
||
function matcherFromTokens(tokens, context, xml) {
|
||
var token,
|
||
matcher,
|
||
i = 0;
|
||
|
||
for (; token = tokens[i]; i++) {
|
||
if (Expr.relative[token.part]) {
|
||
matcher = addCombinator(matcher, Expr.relative[token.part], context, xml);
|
||
} else {
|
||
matcher = addMatcher(matcher, Expr.filter[token.part].apply(null, token.captures.concat(context, xml)));
|
||
}
|
||
}
|
||
|
||
return matcher;
|
||
}
|
||
|
||
function matcherFromGroupMatchers(matchers) {
|
||
return function (elem) {
|
||
var matcher,
|
||
j = 0;
|
||
|
||
for (; matcher = matchers[j]; j++) {
|
||
if (matcher(elem)) {
|
||
return true;
|
||
}
|
||
}
|
||
|
||
return false;
|
||
};
|
||
}
|
||
|
||
compile = Sizzle.compile = function (selector, context, xml) {
|
||
var group,
|
||
i,
|
||
len,
|
||
cached = compilerCache[expando][selector]; // Return a cached group function if already generated (context dependent)
|
||
|
||
if (cached && cached.context === context) {
|
||
return cached;
|
||
} // Generate a function of recursive functions that can be used to check each element
|
||
|
||
|
||
group = tokenize(selector, context, xml);
|
||
|
||
for (i = 0, len = group.length; i < len; i++) {
|
||
group[i] = matcherFromTokens(group[i], context, xml);
|
||
} // Cache the compiled function
|
||
|
||
|
||
cached = compilerCache(selector, matcherFromGroupMatchers(group));
|
||
cached.context = context;
|
||
cached.runs = cached.dirruns = 0;
|
||
return cached;
|
||
};
|
||
|
||
function multipleContexts(selector, contexts, results, seed) {
|
||
var i = 0,
|
||
len = contexts.length;
|
||
|
||
for (; i < len; i++) {
|
||
Sizzle(selector, contexts[i], results, seed);
|
||
}
|
||
}
|
||
|
||
function handlePOSGroup(selector, posfilter, argument, contexts, seed, not) {
|
||
var results,
|
||
fn = Expr.setFilters[posfilter.toLowerCase()];
|
||
|
||
if (!fn) {
|
||
Sizzle.error(posfilter);
|
||
}
|
||
|
||
if (selector || !(results = seed)) {
|
||
multipleContexts(selector || "*", contexts, results = [], seed);
|
||
}
|
||
|
||
return results.length > 0 ? fn(results, argument, not) : [];
|
||
}
|
||
|
||
function handlePOS(groups, context, results, seed) {
|
||
var group,
|
||
part,
|
||
j,
|
||
groupLen,
|
||
token,
|
||
selector,
|
||
anchor,
|
||
elements,
|
||
match,
|
||
matched,
|
||
lastIndex,
|
||
currentContexts,
|
||
not,
|
||
i = 0,
|
||
len = groups.length,
|
||
rpos = matchExpr["POS"],
|
||
// This is generated here in case matchExpr["POS"] is extended
|
||
rposgroups = new RegExp("^" + rpos.source + "(?!" + whitespace + ")", "i"),
|
||
// This is for making sure non-participating
|
||
// matching groups are represented cross-browser (IE6-8)
|
||
setUndefined = function setUndefined() {
|
||
var i = 1,
|
||
len = arguments.length - 2;
|
||
|
||
for (; i < len; i++) {
|
||
if (arguments[i] === undefined) {
|
||
match[i] = undefined;
|
||
}
|
||
}
|
||
};
|
||
|
||
for (; i < len; i++) {
|
||
group = groups[i];
|
||
part = "";
|
||
elements = seed;
|
||
|
||
for (j = 0, groupLen = group.length; j < groupLen; j++) {
|
||
token = group[j];
|
||
selector = token.string;
|
||
|
||
if (token.part === "PSEUDO") {
|
||
// Reset regex index to 0
|
||
rpos.exec("");
|
||
anchor = 0;
|
||
|
||
while (match = rpos.exec(selector)) {
|
||
matched = true;
|
||
lastIndex = rpos.lastIndex = match.index + match[0].length;
|
||
|
||
if (lastIndex > anchor) {
|
||
part += selector.slice(anchor, match.index);
|
||
anchor = lastIndex;
|
||
currentContexts = [context];
|
||
|
||
if (rcombinators.test(part)) {
|
||
if (elements) {
|
||
currentContexts = elements;
|
||
}
|
||
|
||
elements = seed;
|
||
}
|
||
|
||
if (not = rendsWithNot.test(part)) {
|
||
part = part.slice(0, -5).replace(rcombinators, "$&*");
|
||
anchor++;
|
||
}
|
||
|
||
if (match.length > 1) {
|
||
match[0].replace(rposgroups, setUndefined);
|
||
}
|
||
|
||
elements = handlePOSGroup(part, match[1], match[2], currentContexts, elements, not);
|
||
}
|
||
|
||
part = "";
|
||
}
|
||
}
|
||
|
||
if (!matched) {
|
||
part += selector;
|
||
}
|
||
|
||
matched = false;
|
||
}
|
||
|
||
if (part) {
|
||
if (rcombinators.test(part)) {
|
||
multipleContexts(part, elements || [context], results, seed);
|
||
} else {
|
||
Sizzle(part, context, results, seed ? seed.concat(elements) : elements);
|
||
}
|
||
} else {
|
||
push.apply(results, elements);
|
||
}
|
||
} // Do not sort if this is a single filter
|
||
|
||
|
||
return len === 1 ? results : Sizzle.uniqueSort(results);
|
||
}
|
||
|
||
function select(selector, context, results, seed, xml) {
|
||
// Remove excessive whitespace
|
||
selector = selector.replace(rtrim, "$1");
|
||
var elements,
|
||
matcher,
|
||
cached,
|
||
elem,
|
||
i,
|
||
tokens,
|
||
token,
|
||
lastToken,
|
||
findContext,
|
||
type,
|
||
match = tokenize(selector, context, xml),
|
||
contextNodeType = context.nodeType; // POS handling
|
||
|
||
if (matchExpr["POS"].test(selector)) {
|
||
return handlePOS(match, context, results, seed);
|
||
}
|
||
|
||
if (seed) {
|
||
elements = slice.call(seed, 0); // To maintain document order, only narrow the
|
||
// set if there is one group
|
||
} else if (match.length === 1) {
|
||
// Take a shortcut and set the context if the root selector is an ID
|
||
if ((tokens = slice.call(match[0], 0)).length > 2 && (token = tokens[0]).part === "ID" && contextNodeType === 9 && !xml && Expr.relative[tokens[1].part]) {
|
||
context = Expr.find["ID"](token.captures[0].replace(rbackslash, ""), context, xml)[0];
|
||
|
||
if (!context) {
|
||
return results;
|
||
}
|
||
|
||
selector = selector.slice(tokens.shift().string.length);
|
||
}
|
||
|
||
findContext = (match = rsibling.exec(tokens[0].string)) && !match.index && context.parentNode || context; // Reduce the set if possible
|
||
|
||
lastToken = "";
|
||
|
||
for (i = tokens.length - 1; i >= 0; i--) {
|
||
token = tokens[i];
|
||
type = token.part;
|
||
lastToken = token.string + lastToken;
|
||
|
||
if (Expr.relative[type]) {
|
||
break;
|
||
}
|
||
|
||
if (Expr.order.test(type)) {
|
||
elements = Expr.find[type](token.captures[0].replace(rbackslash, ""), findContext, xml);
|
||
|
||
if (elements == null) {
|
||
continue;
|
||
} else {
|
||
selector = selector.slice(0, selector.length - lastToken.length) + lastToken.replace(matchExpr[type], "");
|
||
|
||
if (!selector) {
|
||
push.apply(results, slice.call(elements, 0));
|
||
}
|
||
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
} // Only loop over the given elements once
|
||
|
||
|
||
if (selector) {
|
||
matcher = compile(selector, context, xml);
|
||
dirruns = matcher.dirruns++;
|
||
|
||
if (elements == null) {
|
||
elements = Expr.find["TAG"]("*", rsibling.test(selector) && context.parentNode || context);
|
||
}
|
||
|
||
for (i = 0; elem = elements[i]; i++) {
|
||
cachedruns = matcher.runs++;
|
||
|
||
if (matcher(elem)) {
|
||
results.push(elem);
|
||
}
|
||
}
|
||
}
|
||
|
||
return results;
|
||
}
|
||
|
||
if (document.querySelectorAll) {
|
||
(function () {
|
||
var disconnectedMatch,
|
||
oldSelect = select,
|
||
rescape = /'|\\/g,
|
||
rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
|
||
rbuggyQSA = [],
|
||
// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
|
||
// A support test would require too much code (would include document ready)
|
||
// just skip matchesSelector for :active
|
||
rbuggyMatches = [":active"],
|
||
matches = docElem.matchesSelector || docElem.mozMatchesSelector || docElem.webkitMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector; // Build QSA regex
|
||
// Regex strategy adopted from Diego Perini
|
||
|
||
assert(function (div) {
|
||
// Select is set to empty string on purpose
|
||
// This is to test IE's treatment of not explictly
|
||
// setting a boolean content attribute,
|
||
// since its presence should be enough
|
||
// http://bugs.jquery.com/ticket/12359
|
||
div.innerHTML = "<select><option selected=''></option></select>"; // IE8 - Some boolean attributes are not treated correctly
|
||
|
||
if (!div.querySelectorAll("[selected]").length) {
|
||
rbuggyQSA.push("\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)");
|
||
} // Webkit/Opera - :checked should return selected option elements
|
||
// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
|
||
// IE8 throws error here (do not put tests after this one)
|
||
|
||
|
||
if (!div.querySelectorAll(":checked").length) {
|
||
rbuggyQSA.push(":checked");
|
||
}
|
||
});
|
||
assert(function (div) {
|
||
// Opera 10-12/IE9 - ^= $= *= and empty values
|
||
// Should not select anything
|
||
div.innerHTML = "<p test=''></p>";
|
||
|
||
if (div.querySelectorAll("[test^='']").length) {
|
||
rbuggyQSA.push("[*^$]=" + whitespace + "*(?:\"\"|'')");
|
||
} // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
|
||
// IE8 throws error here (do not put tests after this one)
|
||
|
||
|
||
div.innerHTML = "<input type='hidden'/>";
|
||
|
||
if (!div.querySelectorAll(":enabled").length) {
|
||
rbuggyQSA.push(":enabled", ":disabled");
|
||
}
|
||
});
|
||
rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|"));
|
||
|
||
select = function select(selector, context, results, seed, xml) {
|
||
// Only use querySelectorAll when not filtering,
|
||
// when this is not xml,
|
||
// and when no QSA bugs apply
|
||
if (!seed && !xml && (!rbuggyQSA || !rbuggyQSA.test(selector))) {
|
||
if (context.nodeType === 9) {
|
||
try {
|
||
push.apply(results, slice.call(context.querySelectorAll(selector), 0));
|
||
return results;
|
||
} catch (qsaError) {} // qSA works strangely on Element-rooted queries
|
||
// We can work around this by specifying an extra ID on the root
|
||
// and working up from there (Thanks to Andrew Dupont for the technique)
|
||
// IE 8 doesn't work on object elements
|
||
|
||
} else if (context.nodeType === 1 && context.nodeName.toLowerCase() !== "object") {
|
||
var groups,
|
||
i,
|
||
len,
|
||
old = context.getAttribute("id"),
|
||
nid = old || expando,
|
||
newContext = rsibling.test(selector) && context.parentNode || context;
|
||
|
||
if (old) {
|
||
nid = nid.replace(rescape, "\\$&");
|
||
} else {
|
||
context.setAttribute("id", nid);
|
||
}
|
||
|
||
groups = tokenize(selector, context, xml); // Trailing space is unnecessary
|
||
// There is always a context check
|
||
|
||
nid = "[id='" + nid + "']";
|
||
|
||
for (i = 0, len = groups.length; i < len; i++) {
|
||
groups[i] = nid + groups[i].selector;
|
||
}
|
||
|
||
try {
|
||
push.apply(results, slice.call(newContext.querySelectorAll(groups.join(",")), 0));
|
||
return results;
|
||
} catch (qsaError) {} finally {
|
||
if (!old) {
|
||
context.removeAttribute("id");
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return oldSelect(selector, context, results, seed, xml);
|
||
};
|
||
|
||
if (matches) {
|
||
assert(function (div) {
|
||
// Check to see if it's possible to do matchesSelector
|
||
// on a disconnected node (IE 9)
|
||
disconnectedMatch = matches.call(div, "div"); // This should fail with an exception
|
||
// Gecko does not error, returns false instead
|
||
|
||
try {
|
||
matches.call(div, "[test!='']:sizzle");
|
||
rbuggyMatches.push(matchExpr["PSEUDO"].source, matchExpr["POS"].source, "!=");
|
||
} catch (e) {}
|
||
}); // rbuggyMatches always contains :active, so no need for a length check
|
||
|
||
rbuggyMatches =
|
||
/* rbuggyMatches.length && */
|
||
new RegExp(rbuggyMatches.join("|"));
|
||
|
||
Sizzle.matchesSelector = function (elem, expr) {
|
||
// Make sure that attribute selectors are quoted
|
||
expr = expr.replace(rattributeQuotes, "='$1']"); // rbuggyMatches always contains :active, so no need for an existence check
|
||
|
||
if (!isXML(elem) && !rbuggyMatches.test(expr) && (!rbuggyQSA || !rbuggyQSA.test(expr))) {
|
||
try {
|
||
var ret = matches.call(elem, expr); // IE 9's matchesSelector returns false on disconnected nodes
|
||
|
||
if (ret || disconnectedMatch || // As well, disconnected nodes are said to be in a document
|
||
// fragment in IE 9
|
||
elem.document && elem.document.nodeType !== 11) {
|
||
return ret;
|
||
}
|
||
} catch (e) {}
|
||
}
|
||
|
||
return Sizzle(expr, null, null, [elem]).length > 0;
|
||
};
|
||
}
|
||
})();
|
||
} // Deprecated
|
||
|
||
|
||
Expr.setFilters["nth"] = Expr.setFilters["eq"]; // Back-compat
|
||
|
||
Expr.filters = Expr.pseudos; // Override sizzle attribute retrieval
|
||
|
||
Sizzle.attr = jQuery.attr;
|
||
jQuery.find = Sizzle;
|
||
jQuery.expr = Sizzle.selectors;
|
||
jQuery.expr[":"] = jQuery.expr.pseudos;
|
||
jQuery.unique = Sizzle.uniqueSort;
|
||
jQuery.text = Sizzle.getText;
|
||
jQuery.isXMLDoc = Sizzle.isXML;
|
||
jQuery.contains = Sizzle.contains;
|
||
})(window);
|
||
|
||
var runtil = /Until$/,
|
||
rparentsprev = /^(?:parents|prev(?:Until|All))/,
|
||
isSimple = /^.[^:#\[\.,]*$/,
|
||
rneedsContext = jQuery.expr.match.needsContext,
|
||
// methods guaranteed to produce a unique set when starting from a unique set
|
||
guaranteedUnique = {
|
||
children: true,
|
||
contents: true,
|
||
next: true,
|
||
prev: true
|
||
};
|
||
jQuery.fn.extend({
|
||
find: function find(selector) {
|
||
var i,
|
||
l,
|
||
length,
|
||
n,
|
||
r,
|
||
ret,
|
||
self = this;
|
||
|
||
if (typeof selector !== "string") {
|
||
return jQuery(selector).filter(function () {
|
||
for (i = 0, l = self.length; i < l; i++) {
|
||
if (jQuery.contains(self[i], this)) {
|
||
return true;
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
ret = this.pushStack("", "find", selector);
|
||
|
||
for (i = 0, l = this.length; i < l; i++) {
|
||
length = ret.length;
|
||
jQuery.find(selector, this[i], ret);
|
||
|
||
if (i > 0) {
|
||
// Make sure that the results are unique
|
||
for (n = length; n < ret.length; n++) {
|
||
for (r = 0; r < length; r++) {
|
||
if (ret[r] === ret[n]) {
|
||
ret.splice(n--, 1);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return ret;
|
||
},
|
||
has: function has(target) {
|
||
var i,
|
||
targets = jQuery(target, this),
|
||
len = targets.length;
|
||
return this.filter(function () {
|
||
for (i = 0; i < len; i++) {
|
||
if (jQuery.contains(this, targets[i])) {
|
||
return true;
|
||
}
|
||
}
|
||
});
|
||
},
|
||
not: function not(selector) {
|
||
return this.pushStack(winnow(this, selector, false), "not", selector);
|
||
},
|
||
filter: function filter(selector) {
|
||
return this.pushStack(winnow(this, selector, true), "filter", selector);
|
||
},
|
||
is: function is(selector) {
|
||
return !!selector && (typeof selector === "string" ? // If this is a positional/relative selector, check membership in the returned set
|
||
// so $("p:first").is("p:last") won't return true for a doc with two "p".
|
||
rneedsContext.test(selector) ? jQuery(selector, this.context).index(this[0]) >= 0 : jQuery.filter(selector, this).length > 0 : this.filter(selector).length > 0);
|
||
},
|
||
closest: function closest(selectors, context) {
|
||
var cur,
|
||
i = 0,
|
||
l = this.length,
|
||
ret = [],
|
||
pos = rneedsContext.test(selectors) || typeof selectors !== "string" ? jQuery(selectors, context || this.context) : 0;
|
||
|
||
for (; i < l; i++) {
|
||
cur = this[i];
|
||
|
||
while (cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11) {
|
||
if (pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors)) {
|
||
ret.push(cur);
|
||
break;
|
||
}
|
||
|
||
cur = cur.parentNode;
|
||
}
|
||
}
|
||
|
||
ret = ret.length > 1 ? jQuery.unique(ret) : ret;
|
||
return this.pushStack(ret, "closest", selectors);
|
||
},
|
||
// Determine the position of an element within
|
||
// the matched set of elements
|
||
index: function index(elem) {
|
||
// No argument, return index in parent
|
||
if (!elem) {
|
||
return this[0] && this[0].parentNode ? this.prevAll().length : -1;
|
||
} // index in selector
|
||
|
||
|
||
if (typeof elem === "string") {
|
||
return jQuery.inArray(this[0], jQuery(elem));
|
||
} // Locate the position of the desired element
|
||
|
||
|
||
return jQuery.inArray( // If it receives a jQuery object, the first element is used
|
||
elem.jquery ? elem[0] : elem, this);
|
||
},
|
||
add: function add(selector, context) {
|
||
var set = typeof selector === "string" ? jQuery(selector, context) : jQuery.makeArray(selector && selector.nodeType ? [selector] : selector),
|
||
all = jQuery.merge(this.get(), set);
|
||
return this.pushStack(isDisconnected(set[0]) || isDisconnected(all[0]) ? all : jQuery.unique(all));
|
||
},
|
||
addBack: function addBack(selector) {
|
||
return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector));
|
||
}
|
||
});
|
||
jQuery.fn.andSelf = jQuery.fn.addBack; // A painfully simple check to see if an element is disconnected
|
||
// from a document (should be improved, where feasible).
|
||
|
||
function isDisconnected(node) {
|
||
return !node || !node.parentNode || node.parentNode.nodeType === 11;
|
||
}
|
||
|
||
function sibling(cur, dir) {
|
||
do {
|
||
cur = cur[dir];
|
||
} while (cur && cur.nodeType !== 1);
|
||
|
||
return cur;
|
||
}
|
||
|
||
jQuery.each({
|
||
parent: function parent(elem) {
|
||
var parent = elem.parentNode;
|
||
return parent && parent.nodeType !== 11 ? parent : null;
|
||
},
|
||
parents: function parents(elem) {
|
||
return jQuery.dir(elem, "parentNode");
|
||
},
|
||
parentsUntil: function parentsUntil(elem, i, until) {
|
||
return jQuery.dir(elem, "parentNode", until);
|
||
},
|
||
next: function next(elem) {
|
||
return sibling(elem, "nextSibling");
|
||
},
|
||
prev: function prev(elem) {
|
||
return sibling(elem, "previousSibling");
|
||
},
|
||
nextAll: function nextAll(elem) {
|
||
return jQuery.dir(elem, "nextSibling");
|
||
},
|
||
prevAll: function prevAll(elem) {
|
||
return jQuery.dir(elem, "previousSibling");
|
||
},
|
||
nextUntil: function nextUntil(elem, i, until) {
|
||
return jQuery.dir(elem, "nextSibling", until);
|
||
},
|
||
prevUntil: function prevUntil(elem, i, until) {
|
||
return jQuery.dir(elem, "previousSibling", until);
|
||
},
|
||
siblings: function siblings(elem) {
|
||
return jQuery.sibling((elem.parentNode || {}).firstChild, elem);
|
||
},
|
||
children: function children(elem) {
|
||
return jQuery.sibling(elem.firstChild);
|
||
},
|
||
contents: function contents(elem) {
|
||
return jQuery.nodeName(elem, "iframe") ? elem.contentDocument || elem.contentWindow.document : jQuery.merge([], elem.childNodes);
|
||
}
|
||
}, function (name, fn) {
|
||
jQuery.fn[name] = function (until, selector) {
|
||
var ret = jQuery.map(this, fn, until);
|
||
|
||
if (!runtil.test(name)) {
|
||
selector = until;
|
||
}
|
||
|
||
if (selector && typeof selector === "string") {
|
||
ret = jQuery.filter(selector, ret);
|
||
}
|
||
|
||
ret = this.length > 1 && !guaranteedUnique[name] ? jQuery.unique(ret) : ret;
|
||
|
||
if (this.length > 1 && rparentsprev.test(name)) {
|
||
ret = ret.reverse();
|
||
}
|
||
|
||
return this.pushStack(ret, name, core_slice.call(arguments).join(","));
|
||
};
|
||
});
|
||
jQuery.extend({
|
||
filter: function filter(expr, elems, not) {
|
||
if (not) {
|
||
expr = ":not(" + expr + ")";
|
||
}
|
||
|
||
return elems.length === 1 ? jQuery.find.matchesSelector(elems[0], expr) ? [elems[0]] : [] : jQuery.find.matches(expr, elems);
|
||
},
|
||
dir: function dir(elem, _dir, until) {
|
||
var matched = [],
|
||
cur = elem[_dir];
|
||
|
||
while (cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery(cur).is(until))) {
|
||
if (cur.nodeType === 1) {
|
||
matched.push(cur);
|
||
}
|
||
|
||
cur = cur[_dir];
|
||
}
|
||
|
||
return matched;
|
||
},
|
||
sibling: function sibling(n, elem) {
|
||
var r = [];
|
||
|
||
for (; n; n = n.nextSibling) {
|
||
if (n.nodeType === 1 && n !== elem) {
|
||
r.push(n);
|
||
}
|
||
}
|
||
|
||
return r;
|
||
}
|
||
}); // Implement the identical functionality for filter and not
|
||
|
||
function winnow(elements, qualifier, keep) {
|
||
// Can't pass null or undefined to indexOf in Firefox 4
|
||
// Set to 0 to skip string check
|
||
qualifier = qualifier || 0;
|
||
|
||
if (jQuery.isFunction(qualifier)) {
|
||
return jQuery.grep(elements, function (elem, i) {
|
||
var retVal = !!qualifier.call(elem, i, elem);
|
||
return retVal === keep;
|
||
});
|
||
} else if (qualifier.nodeType) {
|
||
return jQuery.grep(elements, function (elem, i) {
|
||
return elem === qualifier === keep;
|
||
});
|
||
} else if (typeof qualifier === "string") {
|
||
var filtered = jQuery.grep(elements, function (elem) {
|
||
return elem.nodeType === 1;
|
||
});
|
||
|
||
if (isSimple.test(qualifier)) {
|
||
return jQuery.filter(qualifier, filtered, !keep);
|
||
} else {
|
||
qualifier = jQuery.filter(qualifier, filtered);
|
||
}
|
||
}
|
||
|
||
return jQuery.grep(elements, function (elem, i) {
|
||
return jQuery.inArray(elem, qualifier) >= 0 === keep;
|
||
});
|
||
}
|
||
|
||
function createSafeFragment(document) {
|
||
var list = nodeNames.split("|"),
|
||
safeFrag = document.createDocumentFragment();
|
||
|
||
if (safeFrag.createElement) {
|
||
while (list.length) {
|
||
safeFrag.createElement(list.pop());
|
||
}
|
||
}
|
||
|
||
return safeFrag;
|
||
}
|
||
|
||
var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
|
||
rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
|
||
rleadingWhitespace = /^\s+/,
|
||
rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
|
||
rtagName = /<([\w:]+)/,
|
||
rtbody = /<tbody/i,
|
||
rhtml = /<|&#?\w+;/,
|
||
rnoInnerhtml = /<(?:script|style|link)/i,
|
||
rnocache = /<(?:script|object|embed|option|style)/i,
|
||
rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
|
||
rcheckableType = /^(?:checkbox|radio)$/,
|
||
// checked="checked" or checked
|
||
rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
|
||
rscriptType = /\/(java|ecma)script/i,
|
||
rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
|
||
wrapMap = {
|
||
option: [1, "<select multiple='multiple'>", "</select>"],
|
||
legend: [1, "<fieldset>", "</fieldset>"],
|
||
thead: [1, "<table>", "</table>"],
|
||
tr: [2, "<table><tbody>", "</tbody></table>"],
|
||
td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],
|
||
col: [2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"],
|
||
area: [1, "<map>", "</map>"],
|
||
_default: [0, "", ""]
|
||
},
|
||
safeFragment = createSafeFragment(document),
|
||
fragmentDiv = safeFragment.appendChild(document.createElement("div"));
|
||
wrapMap.optgroup = wrapMap.option;
|
||
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
|
||
wrapMap.th = wrapMap.td; // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
|
||
// unless wrapped in a div with non-breaking characters in front of it.
|
||
|
||
if (!jQuery.support.htmlSerialize) {
|
||
wrapMap._default = [1, "X<div>", "</div>"];
|
||
}
|
||
|
||
jQuery.fn.extend({
|
||
text: function text(value) {
|
||
return jQuery.access(this, function (value) {
|
||
return value === undefined ? jQuery.text(this) : this.empty().append((this[0] && this[0].ownerDocument || document).createTextNode(value));
|
||
}, null, value, arguments.length);
|
||
},
|
||
wrapAll: function wrapAll(html) {
|
||
if (jQuery.isFunction(html)) {
|
||
return this.each(function (i) {
|
||
jQuery(this).wrapAll(html.call(this, i));
|
||
});
|
||
}
|
||
|
||
if (this[0]) {
|
||
// The elements to wrap the target around
|
||
var wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true);
|
||
|
||
if (this[0].parentNode) {
|
||
wrap.insertBefore(this[0]);
|
||
}
|
||
|
||
wrap.map(function () {
|
||
var elem = this;
|
||
|
||
while (elem.firstChild && elem.firstChild.nodeType === 1) {
|
||
elem = elem.firstChild;
|
||
}
|
||
|
||
return elem;
|
||
}).append(this);
|
||
}
|
||
|
||
return this;
|
||
},
|
||
wrapInner: function wrapInner(html) {
|
||
if (jQuery.isFunction(html)) {
|
||
return this.each(function (i) {
|
||
jQuery(this).wrapInner(html.call(this, i));
|
||
});
|
||
}
|
||
|
||
return this.each(function () {
|
||
var self = jQuery(this),
|
||
contents = self.contents();
|
||
|
||
if (contents.length) {
|
||
contents.wrapAll(html);
|
||
} else {
|
||
self.append(html);
|
||
}
|
||
});
|
||
},
|
||
wrap: function wrap(html) {
|
||
var isFunction = jQuery.isFunction(html);
|
||
return this.each(function (i) {
|
||
jQuery(this).wrapAll(isFunction ? html.call(this, i) : html);
|
||
});
|
||
},
|
||
unwrap: function unwrap() {
|
||
return this.parent().each(function () {
|
||
if (!jQuery.nodeName(this, "body")) {
|
||
jQuery(this).replaceWith(this.childNodes);
|
||
}
|
||
}).end();
|
||
},
|
||
append: function append() {
|
||
return this.domManip(arguments, true, function (elem) {
|
||
if (this.nodeType === 1 || this.nodeType === 11) {
|
||
this.appendChild(elem);
|
||
}
|
||
});
|
||
},
|
||
prepend: function prepend() {
|
||
return this.domManip(arguments, true, function (elem) {
|
||
if (this.nodeType === 1 || this.nodeType === 11) {
|
||
this.insertBefore(elem, this.firstChild);
|
||
}
|
||
});
|
||
},
|
||
before: function before() {
|
||
if (!isDisconnected(this[0])) {
|
||
return this.domManip(arguments, false, function (elem) {
|
||
this.parentNode.insertBefore(elem, this);
|
||
});
|
||
}
|
||
|
||
if (arguments.length) {
|
||
var set = jQuery.clean(arguments);
|
||
return this.pushStack(jQuery.merge(set, this), "before", this.selector);
|
||
}
|
||
},
|
||
after: function after() {
|
||
if (!isDisconnected(this[0])) {
|
||
return this.domManip(arguments, false, function (elem) {
|
||
this.parentNode.insertBefore(elem, this.nextSibling);
|
||
});
|
||
}
|
||
|
||
if (arguments.length) {
|
||
var set = jQuery.clean(arguments);
|
||
return this.pushStack(jQuery.merge(this, set), "after", this.selector);
|
||
}
|
||
},
|
||
// keepData is for internal use only--do not document
|
||
remove: function remove(selector, keepData) {
|
||
var elem,
|
||
i = 0;
|
||
|
||
for (; (elem = this[i]) != null; i++) {
|
||
if (!selector || jQuery.filter(selector, [elem]).length) {
|
||
if (!keepData && elem.nodeType === 1) {
|
||
jQuery.cleanData(elem.getElementsByTagName("*"));
|
||
jQuery.cleanData([elem]);
|
||
}
|
||
|
||
if (elem.parentNode) {
|
||
elem.parentNode.removeChild(elem);
|
||
}
|
||
}
|
||
}
|
||
|
||
return this;
|
||
},
|
||
empty: function empty() {
|
||
var elem,
|
||
i = 0;
|
||
|
||
for (; (elem = this[i]) != null; i++) {
|
||
// Remove element nodes and prevent memory leaks
|
||
if (elem.nodeType === 1) {
|
||
jQuery.cleanData(elem.getElementsByTagName("*"));
|
||
} // Remove any remaining nodes
|
||
|
||
|
||
while (elem.firstChild) {
|
||
elem.removeChild(elem.firstChild);
|
||
}
|
||
}
|
||
|
||
return this;
|
||
},
|
||
clone: function clone(dataAndEvents, deepDataAndEvents) {
|
||
dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
|
||
deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
|
||
return this.map(function () {
|
||
return jQuery.clone(this, dataAndEvents, deepDataAndEvents);
|
||
});
|
||
},
|
||
html: function html(value) {
|
||
return jQuery.access(this, function (value) {
|
||
var elem = this[0] || {},
|
||
i = 0,
|
||
l = this.length;
|
||
|
||
if (value === undefined) {
|
||
return elem.nodeType === 1 ? elem.innerHTML.replace(rinlinejQuery, "") : undefined;
|
||
} // See if we can take a shortcut and just use innerHTML
|
||
|
||
|
||
if (typeof value === "string" && !rnoInnerhtml.test(value) && (jQuery.support.htmlSerialize || !rnoshimcache.test(value)) && (jQuery.support.leadingWhitespace || !rleadingWhitespace.test(value)) && !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) {
|
||
value = value.replace(rxhtmlTag, "<$1></$2>");
|
||
|
||
try {
|
||
for (; i < l; i++) {
|
||
// Remove element nodes and prevent memory leaks
|
||
elem = this[i] || {};
|
||
|
||
if (elem.nodeType === 1) {
|
||
jQuery.cleanData(elem.getElementsByTagName("*"));
|
||
elem.innerHTML = value;
|
||
}
|
||
}
|
||
|
||
elem = 0; // If using innerHTML throws an exception, use the fallback method
|
||
} catch (e) {}
|
||
}
|
||
|
||
if (elem) {
|
||
this.empty().append(value);
|
||
}
|
||
}, null, value, arguments.length);
|
||
},
|
||
replaceWith: function replaceWith(value) {
|
||
if (!isDisconnected(this[0])) {
|
||
// Make sure that the elements are removed from the DOM before they are inserted
|
||
// this can help fix replacing a parent with child elements
|
||
if (jQuery.isFunction(value)) {
|
||
return this.each(function (i) {
|
||
var self = jQuery(this),
|
||
old = self.html();
|
||
self.replaceWith(value.call(this, i, old));
|
||
});
|
||
}
|
||
|
||
if (typeof value !== "string") {
|
||
value = jQuery(value).detach();
|
||
}
|
||
|
||
return this.each(function () {
|
||
var next = this.nextSibling,
|
||
parent = this.parentNode;
|
||
jQuery(this).remove();
|
||
|
||
if (next) {
|
||
jQuery(next).before(value);
|
||
} else {
|
||
jQuery(parent).append(value);
|
||
}
|
||
});
|
||
}
|
||
|
||
return this.length ? this.pushStack(jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value) : this;
|
||
},
|
||
detach: function detach(selector) {
|
||
return this.remove(selector, true);
|
||
},
|
||
domManip: function domManip(args, table, callback) {
|
||
// Flatten any nested arrays
|
||
args = [].concat.apply([], args);
|
||
var results,
|
||
first,
|
||
fragment,
|
||
iNoClone,
|
||
i = 0,
|
||
value = args[0],
|
||
scripts = [],
|
||
l = this.length; // We can't cloneNode fragments that contain checked, in WebKit
|
||
|
||
if (!jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test(value)) {
|
||
return this.each(function () {
|
||
jQuery(this).domManip(args, table, callback);
|
||
});
|
||
}
|
||
|
||
if (jQuery.isFunction(value)) {
|
||
return this.each(function (i) {
|
||
var self = jQuery(this);
|
||
args[0] = value.call(this, i, table ? self.html() : undefined);
|
||
self.domManip(args, table, callback);
|
||
});
|
||
}
|
||
|
||
if (this[0]) {
|
||
results = jQuery.buildFragment(args, this, scripts);
|
||
fragment = results.fragment;
|
||
first = fragment.firstChild;
|
||
|
||
if (fragment.childNodes.length === 1) {
|
||
fragment = first;
|
||
}
|
||
|
||
if (first) {
|
||
table = table && jQuery.nodeName(first, "tr"); // Use the original fragment for the last item instead of the first because it can end up
|
||
// being emptied incorrectly in certain situations (#8070).
|
||
// Fragments from the fragment cache must always be cloned and never used in place.
|
||
|
||
for (iNoClone = results.cacheable || l - 1; i < l; i++) {
|
||
callback.call(table && jQuery.nodeName(this[i], "table") ? findOrAppend(this[i], "tbody") : this[i], i === iNoClone ? fragment : jQuery.clone(fragment, true, true));
|
||
}
|
||
} // Fix #11809: Avoid leaking memory
|
||
|
||
|
||
fragment = first = null;
|
||
|
||
if (scripts.length) {
|
||
jQuery.each(scripts, function (i, elem) {
|
||
if (elem.src) {
|
||
if (jQuery.ajax) {
|
||
jQuery.ajax({
|
||
url: elem.src,
|
||
type: "GET",
|
||
dataType: "script",
|
||
async: false,
|
||
global: false,
|
||
"throws": true
|
||
});
|
||
} else {
|
||
jQuery.error("no ajax");
|
||
}
|
||
} else {
|
||
jQuery.globalEval((elem.text || elem.textContent || elem.innerHTML || "").replace(rcleanScript, ""));
|
||
}
|
||
|
||
if (elem.parentNode) {
|
||
elem.parentNode.removeChild(elem);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
return this;
|
||
}
|
||
});
|
||
|
||
function findOrAppend(elem, tag) {
|
||
return elem.getElementsByTagName(tag)[0] || elem.appendChild(elem.ownerDocument.createElement(tag));
|
||
}
|
||
|
||
function cloneCopyEvent(src, dest) {
|
||
if (dest.nodeType !== 1 || !jQuery.hasData(src)) {
|
||
return;
|
||
}
|
||
|
||
var type,
|
||
i,
|
||
l,
|
||
oldData = jQuery._data(src),
|
||
curData = jQuery._data(dest, oldData),
|
||
events = oldData.events;
|
||
|
||
if (events) {
|
||
delete curData.handle;
|
||
curData.events = {};
|
||
|
||
for (type in events) {
|
||
for (i = 0, l = events[type].length; i < l; i++) {
|
||
jQuery.event.add(dest, type, events[type][i]);
|
||
}
|
||
}
|
||
} // make the cloned public data object a copy from the original
|
||
|
||
|
||
if (curData.data) {
|
||
curData.data = jQuery.extend({}, curData.data);
|
||
}
|
||
}
|
||
|
||
function cloneFixAttributes(src, dest) {
|
||
var nodeName; // We do not need to do anything for non-Elements
|
||
|
||
if (dest.nodeType !== 1) {
|
||
return;
|
||
} // clearAttributes removes the attributes, which we don't want,
|
||
// but also removes the attachEvent events, which we *do* want
|
||
|
||
|
||
if (dest.clearAttributes) {
|
||
dest.clearAttributes();
|
||
} // mergeAttributes, in contrast, only merges back on the
|
||
// original attributes, not the events
|
||
|
||
|
||
if (dest.mergeAttributes) {
|
||
dest.mergeAttributes(src);
|
||
}
|
||
|
||
nodeName = dest.nodeName.toLowerCase();
|
||
|
||
if (nodeName === "object") {
|
||
// IE6-10 improperly clones children of object elements using classid.
|
||
// IE10 throws NoModificationAllowedError if parent is null, #12132.
|
||
if (dest.parentNode) {
|
||
dest.outerHTML = src.outerHTML;
|
||
} // This path appears unavoidable for IE9. When cloning an object
|
||
// element in IE9, the outerHTML strategy above is not sufficient.
|
||
// If the src has innerHTML and the destination does not,
|
||
// copy the src.innerHTML into the dest.innerHTML. #10324
|
||
|
||
|
||
if (jQuery.support.html5Clone && src.innerHTML && !jQuery.trim(dest.innerHTML)) {
|
||
dest.innerHTML = src.innerHTML;
|
||
}
|
||
} else if (nodeName === "input" && rcheckableType.test(src.type)) {
|
||
// IE6-8 fails to persist the checked state of a cloned checkbox
|
||
// or radio button. Worse, IE6-7 fail to give the cloned element
|
||
// a checked appearance if the defaultChecked value isn't also set
|
||
dest.defaultChecked = dest.checked = src.checked; // IE6-7 get confused and end up setting the value of a cloned
|
||
// checkbox/radio button to an empty string instead of "on"
|
||
|
||
if (dest.value !== src.value) {
|
||
dest.value = src.value;
|
||
} // IE6-8 fails to return the selected option to the default selected
|
||
// state when cloning options
|
||
|
||
} else if (nodeName === "option") {
|
||
dest.selected = src.defaultSelected; // IE6-8 fails to set the defaultValue to the correct value when
|
||
// cloning other types of input fields
|
||
} else if (nodeName === "input" || nodeName === "textarea") {
|
||
dest.defaultValue = src.defaultValue; // IE blanks contents when cloning scripts
|
||
} else if (nodeName === "script" && dest.text !== src.text) {
|
||
dest.text = src.text;
|
||
} // Event data gets referenced instead of copied if the expando
|
||
// gets copied too
|
||
|
||
|
||
dest.removeAttribute(jQuery.expando);
|
||
}
|
||
|
||
jQuery.buildFragment = function (args, context, scripts) {
|
||
var fragment,
|
||
cacheable,
|
||
cachehit,
|
||
first = args[0]; // Set context from what may come in as undefined or a jQuery collection or a node
|
||
// Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
|
||
// also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
|
||
|
||
context = context || document;
|
||
context = !context.nodeType && context[0] || context;
|
||
context = context.ownerDocument || context; // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
|
||
// Cloning options loses the selected state, so don't cache them
|
||
// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
|
||
// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
|
||
// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
|
||
|
||
if (args.length === 1 && typeof first === "string" && first.length < 512 && context === document && first.charAt(0) === "<" && !rnocache.test(first) && (jQuery.support.checkClone || !rchecked.test(first)) && (jQuery.support.html5Clone || !rnoshimcache.test(first))) {
|
||
// Mark cacheable and look for a hit
|
||
cacheable = true;
|
||
fragment = jQuery.fragments[first];
|
||
cachehit = fragment !== undefined;
|
||
}
|
||
|
||
if (!fragment) {
|
||
fragment = context.createDocumentFragment();
|
||
jQuery.clean(args, context, fragment, scripts); // Update the cache, but only store false
|
||
// unless this is a second parsing of the same content
|
||
|
||
if (cacheable) {
|
||
jQuery.fragments[first] = cachehit && fragment;
|
||
}
|
||
}
|
||
|
||
return {
|
||
fragment: fragment,
|
||
cacheable: cacheable
|
||
};
|
||
};
|
||
|
||
jQuery.fragments = {};
|
||
jQuery.each({
|
||
appendTo: "append",
|
||
prependTo: "prepend",
|
||
insertBefore: "before",
|
||
insertAfter: "after",
|
||
replaceAll: "replaceWith"
|
||
}, function (name, original) {
|
||
jQuery.fn[name] = function (selector) {
|
||
var elems,
|
||
i = 0,
|
||
ret = [],
|
||
insert = jQuery(selector),
|
||
l = insert.length,
|
||
parent = this.length === 1 && this[0].parentNode;
|
||
|
||
if ((parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1) {
|
||
insert[original](this[0]);
|
||
return this;
|
||
} else {
|
||
for (; i < l; i++) {
|
||
elems = (i > 0 ? this.clone(true) : this).get();
|
||
jQuery(insert[i])[original](elems);
|
||
ret = ret.concat(elems);
|
||
}
|
||
|
||
return this.pushStack(ret, name, insert.selector);
|
||
}
|
||
};
|
||
});
|
||
|
||
function getAll(elem) {
|
||
if (typeof elem.getElementsByTagName !== "undefined") {
|
||
return elem.getElementsByTagName("*");
|
||
} else if (typeof elem.querySelectorAll !== "undefined") {
|
||
return elem.querySelectorAll("*");
|
||
} else {
|
||
return [];
|
||
}
|
||
} // Used in clean, fixes the defaultChecked property
|
||
|
||
|
||
function fixDefaultChecked(elem) {
|
||
if (rcheckableType.test(elem.type)) {
|
||
elem.defaultChecked = elem.checked;
|
||
}
|
||
}
|
||
|
||
jQuery.extend({
|
||
clone: function clone(elem, dataAndEvents, deepDataAndEvents) {
|
||
var srcElements, destElements, i, clone;
|
||
|
||
if (jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test("<" + elem.nodeName + ">")) {
|
||
clone = elem.cloneNode(true); // IE<=8 does not properly clone detached, unknown element nodes
|
||
} else {
|
||
fragmentDiv.innerHTML = elem.outerHTML;
|
||
fragmentDiv.removeChild(clone = fragmentDiv.firstChild);
|
||
}
|
||
|
||
if ((!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) {
|
||
// IE copies events bound via attachEvent when using cloneNode.
|
||
// Calling detachEvent on the clone will also remove the events
|
||
// from the original. In order to get around this, we use some
|
||
// proprietary methods to clear the events. Thanks to MooTools
|
||
// guys for this hotness.
|
||
cloneFixAttributes(elem, clone); // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
|
||
|
||
srcElements = getAll(elem);
|
||
destElements = getAll(clone); // Weird iteration because IE will replace the length property
|
||
// with an element if you are cloning the body and one of the
|
||
// elements on the page has a name or id of "length"
|
||
|
||
for (i = 0; srcElements[i]; ++i) {
|
||
// Ensure that the destination node is not null; Fixes #9587
|
||
if (destElements[i]) {
|
||
cloneFixAttributes(srcElements[i], destElements[i]);
|
||
}
|
||
}
|
||
} // Copy the events from the original to the clone
|
||
|
||
|
||
if (dataAndEvents) {
|
||
cloneCopyEvent(elem, clone);
|
||
|
||
if (deepDataAndEvents) {
|
||
srcElements = getAll(elem);
|
||
destElements = getAll(clone);
|
||
|
||
for (i = 0; srcElements[i]; ++i) {
|
||
cloneCopyEvent(srcElements[i], destElements[i]);
|
||
}
|
||
}
|
||
}
|
||
|
||
srcElements = destElements = null; // Return the cloned set
|
||
|
||
return clone;
|
||
},
|
||
clean: function clean(elems, context, fragment, scripts) {
|
||
var i,
|
||
j,
|
||
elem,
|
||
tag,
|
||
wrap,
|
||
depth,
|
||
div,
|
||
hasBody,
|
||
tbody,
|
||
len,
|
||
handleScript,
|
||
jsTags,
|
||
safe = context === document && safeFragment,
|
||
ret = []; // Ensure that context is a document
|
||
|
||
if (!context || typeof context.createDocumentFragment === "undefined") {
|
||
context = document;
|
||
} // Use the already-created safe fragment if context permits
|
||
|
||
|
||
for (i = 0; (elem = elems[i]) != null; i++) {
|
||
if (typeof elem === "number") {
|
||
elem += "";
|
||
}
|
||
|
||
if (!elem) {
|
||
continue;
|
||
} // Convert html string into DOM nodes
|
||
|
||
|
||
if (typeof elem === "string") {
|
||
if (!rhtml.test(elem)) {
|
||
elem = context.createTextNode(elem);
|
||
} else {
|
||
// Ensure a safe container in which to render the html
|
||
safe = safe || createSafeFragment(context);
|
||
div = context.createElement("div");
|
||
safe.appendChild(div); // Fix "XHTML"-style tags in all browsers
|
||
|
||
elem = elem.replace(rxhtmlTag, "<$1></$2>"); // Go to html and back, then peel off extra wrappers
|
||
|
||
tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase();
|
||
wrap = wrapMap[tag] || wrapMap._default;
|
||
depth = wrap[0];
|
||
div.innerHTML = wrap[1] + elem + wrap[2]; // Move to the right depth
|
||
|
||
while (depth--) {
|
||
div = div.lastChild;
|
||
} // Remove IE's autoinserted <tbody> from table fragments
|
||
|
||
|
||
if (!jQuery.support.tbody) {
|
||
// String was a <table>, *may* have spurious <tbody>
|
||
hasBody = rtbody.test(elem);
|
||
tbody = tag === "table" && !hasBody ? div.firstChild && div.firstChild.childNodes : // String was a bare <thead> or <tfoot>
|
||
wrap[1] === "<table>" && !hasBody ? div.childNodes : [];
|
||
|
||
for (j = tbody.length - 1; j >= 0; --j) {
|
||
if (jQuery.nodeName(tbody[j], "tbody") && !tbody[j].childNodes.length) {
|
||
tbody[j].parentNode.removeChild(tbody[j]);
|
||
}
|
||
}
|
||
} // IE completely kills leading whitespace when innerHTML is used
|
||
|
||
|
||
if (!jQuery.support.leadingWhitespace && rleadingWhitespace.test(elem)) {
|
||
div.insertBefore(context.createTextNode(rleadingWhitespace.exec(elem)[0]), div.firstChild);
|
||
}
|
||
|
||
elem = div.childNodes; // Take out of fragment container (we need a fresh div each time)
|
||
|
||
div.parentNode.removeChild(div);
|
||
}
|
||
}
|
||
|
||
if (elem.nodeType) {
|
||
ret.push(elem);
|
||
} else {
|
||
jQuery.merge(ret, elem);
|
||
}
|
||
} // Fix #11356: Clear elements from safeFragment
|
||
|
||
|
||
if (div) {
|
||
elem = div = safe = null;
|
||
} // Reset defaultChecked for any radios and checkboxes
|
||
// about to be appended to the DOM in IE 6/7 (#8060)
|
||
|
||
|
||
if (!jQuery.support.appendChecked) {
|
||
for (i = 0; (elem = ret[i]) != null; i++) {
|
||
if (jQuery.nodeName(elem, "input")) {
|
||
fixDefaultChecked(elem);
|
||
} else if (typeof elem.getElementsByTagName !== "undefined") {
|
||
jQuery.grep(elem.getElementsByTagName("input"), fixDefaultChecked);
|
||
}
|
||
}
|
||
} // Append elements to a provided document fragment
|
||
|
||
|
||
if (fragment) {
|
||
// Special handling of each script element
|
||
handleScript = function handleScript(elem) {
|
||
// Check if we consider it executable
|
||
if (!elem.type || rscriptType.test(elem.type)) {
|
||
// Detach the script and store it in the scripts array (if provided) or the fragment
|
||
// Return truthy to indicate that it has been handled
|
||
return scripts ? scripts.push(elem.parentNode ? elem.parentNode.removeChild(elem) : elem) : fragment.appendChild(elem);
|
||
}
|
||
};
|
||
|
||
for (i = 0; (elem = ret[i]) != null; i++) {
|
||
// Check if we're done after handling an executable script
|
||
if (!(jQuery.nodeName(elem, "script") && handleScript(elem))) {
|
||
// Append to fragment and handle embedded scripts
|
||
fragment.appendChild(elem);
|
||
|
||
if (typeof elem.getElementsByTagName !== "undefined") {
|
||
// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
|
||
jsTags = jQuery.grep(jQuery.merge([], elem.getElementsByTagName("script")), handleScript); // Splice the scripts into ret after their former ancestor and advance our index beyond them
|
||
|
||
ret.splice.apply(ret, [i + 1, 0].concat(jsTags));
|
||
i += jsTags.length;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return ret;
|
||
},
|
||
cleanData: function cleanData(elems,
|
||
/* internal */
|
||
acceptData) {
|
||
var data,
|
||
id,
|
||
elem,
|
||
type,
|
||
i = 0,
|
||
internalKey = jQuery.expando,
|
||
cache = jQuery.cache,
|
||
deleteExpando = jQuery.support.deleteExpando,
|
||
special = jQuery.event.special;
|
||
|
||
for (; (elem = elems[i]) != null; i++) {
|
||
if (acceptData || jQuery.acceptData(elem)) {
|
||
id = elem[internalKey];
|
||
data = id && cache[id];
|
||
|
||
if (data) {
|
||
if (data.events) {
|
||
for (type in data.events) {
|
||
if (special[type]) {
|
||
jQuery.event.remove(elem, type); // This is a shortcut to avoid jQuery.event.remove's overhead
|
||
} else {
|
||
jQuery.removeEvent(elem, type, data.handle);
|
||
}
|
||
}
|
||
} // Remove cache only if it was not already removed by jQuery.event.remove
|
||
|
||
|
||
if (cache[id]) {
|
||
delete cache[id]; // IE does not allow us to delete expando properties from nodes,
|
||
// nor does it have a removeAttribute function on Document nodes;
|
||
// we must handle all of these cases
|
||
|
||
if (deleteExpando) {
|
||
delete elem[internalKey];
|
||
} else if (elem.removeAttribute) {
|
||
elem.removeAttribute(internalKey);
|
||
} else {
|
||
elem[internalKey] = null;
|
||
}
|
||
|
||
jQuery.deletedIds.push(id);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}); // Limit scope pollution from any deprecated API
|
||
|
||
(function () {
|
||
var matched, browser; // Use of jQuery.browser is frowned upon.
|
||
// More details: http://api.jquery.com/jQuery.browser
|
||
// jQuery.uaMatch maintained for back-compat
|
||
|
||
jQuery.uaMatch = function (ua) {
|
||
ua = ua.toLowerCase();
|
||
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || /(webkit)[ \/]([\w.]+)/.exec(ua) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || /(msie) ([\w.]+)/.exec(ua) || ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || [];
|
||
return {
|
||
browser: match[1] || "",
|
||
version: match[2] || "0"
|
||
};
|
||
};
|
||
|
||
matched = jQuery.uaMatch(navigator.userAgent);
|
||
browser = {};
|
||
|
||
if (matched.browser) {
|
||
browser[matched.browser] = true;
|
||
browser.version = matched.version;
|
||
} // Chrome is Webkit, but Webkit is also Safari.
|
||
|
||
|
||
if (browser.chrome) {
|
||
browser.webkit = true;
|
||
} else if (browser.webkit) {
|
||
browser.safari = true;
|
||
}
|
||
|
||
jQuery.browser = browser;
|
||
|
||
jQuery.sub = function () {
|
||
function jQuerySub(selector, context) {
|
||
return new jQuerySub.fn.init(selector, context);
|
||
}
|
||
|
||
jQuery.extend(true, jQuerySub, this);
|
||
jQuerySub.superclass = this;
|
||
jQuerySub.fn = jQuerySub.prototype = this();
|
||
jQuerySub.fn.constructor = jQuerySub;
|
||
jQuerySub.sub = this.sub;
|
||
|
||
jQuerySub.fn.init = function init(selector, context) {
|
||
if (context && context instanceof jQuery && !(context instanceof jQuerySub)) {
|
||
context = jQuerySub(context);
|
||
}
|
||
|
||
return jQuery.fn.init.call(this, selector, context, rootjQuerySub);
|
||
};
|
||
|
||
jQuerySub.fn.init.prototype = jQuerySub.fn;
|
||
var rootjQuerySub = jQuerySub(document);
|
||
return jQuerySub;
|
||
};
|
||
})();
|
||
|
||
var curCSS,
|
||
iframe,
|
||
iframeDoc,
|
||
ralpha = /alpha\([^)]*\)/i,
|
||
ropacity = /opacity=([^)]*)/,
|
||
rposition = /^(top|right|bottom|left)$/,
|
||
// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
|
||
// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
|
||
rdisplayswap = /^(none|table(?!-c[ea]).+)/,
|
||
rmargin = /^margin/,
|
||
rnumsplit = new RegExp("^(" + core_pnum + ")(.*)$", "i"),
|
||
rnumnonpx = new RegExp("^(" + core_pnum + ")(?!px)[a-z%]+$", "i"),
|
||
rrelNum = new RegExp("^([-+])=(" + core_pnum + ")", "i"),
|
||
elemdisplay = {},
|
||
cssShow = {
|
||
position: "absolute",
|
||
visibility: "hidden",
|
||
display: "block"
|
||
},
|
||
cssNormalTransform = {
|
||
letterSpacing: 0,
|
||
fontWeight: 400
|
||
},
|
||
cssExpand = ["Top", "Right", "Bottom", "Left"],
|
||
cssPrefixes = ["Webkit", "O", "Moz", "ms"],
|
||
eventsToggle = jQuery.fn.toggle; // return a css property mapped to a potentially vendor prefixed property
|
||
|
||
function vendorPropName(style, name) {
|
||
// shortcut for names that are not vendor prefixed
|
||
if (name in style) {
|
||
return name;
|
||
} // check for vendor prefixed names
|
||
|
||
|
||
var capName = name.charAt(0).toUpperCase() + name.slice(1),
|
||
origName = name,
|
||
i = cssPrefixes.length;
|
||
|
||
while (i--) {
|
||
name = cssPrefixes[i] + capName;
|
||
|
||
if (name in style) {
|
||
return name;
|
||
}
|
||
}
|
||
|
||
return origName;
|
||
}
|
||
|
||
function isHidden(elem, el) {
|
||
elem = el || elem;
|
||
return jQuery.css(elem, "display") === "none" || !jQuery.contains(elem.ownerDocument, elem);
|
||
}
|
||
|
||
function showHide(elements, show) {
|
||
var elem,
|
||
display,
|
||
values = [],
|
||
index = 0,
|
||
length = elements.length;
|
||
|
||
for (; index < length; index++) {
|
||
elem = elements[index];
|
||
|
||
if (!elem.style) {
|
||
continue;
|
||
}
|
||
|
||
values[index] = jQuery._data(elem, "olddisplay");
|
||
|
||
if (show) {
|
||
// Reset the inline display of this element to learn if it is
|
||
// being hidden by cascaded rules or not
|
||
if (!values[index] && elem.style.display === "none") {
|
||
elem.style.display = "";
|
||
} // Set elements which have been overridden with display: none
|
||
// in a stylesheet to whatever the default browser style is
|
||
// for such an element
|
||
|
||
|
||
if (elem.style.display === "" && isHidden(elem)) {
|
||
values[index] = jQuery._data(elem, "olddisplay", css_defaultDisplay(elem.nodeName));
|
||
}
|
||
} else {
|
||
display = curCSS(elem, "display");
|
||
|
||
if (!values[index] && display !== "none") {
|
||
jQuery._data(elem, "olddisplay", display);
|
||
}
|
||
}
|
||
} // Set the display of most of the elements in a second loop
|
||
// to avoid the constant reflow
|
||
|
||
|
||
for (index = 0; index < length; index++) {
|
||
elem = elements[index];
|
||
|
||
if (!elem.style) {
|
||
continue;
|
||
}
|
||
|
||
if (!show || elem.style.display === "none" || elem.style.display === "") {
|
||
elem.style.display = show ? values[index] || "" : "none";
|
||
}
|
||
}
|
||
|
||
return elements;
|
||
}
|
||
|
||
jQuery.fn.extend({
|
||
css: function css(name, value) {
|
||
return jQuery.access(this, function (elem, name, value) {
|
||
return value !== undefined ? jQuery.style(elem, name, value) : jQuery.css(elem, name);
|
||
}, name, value, arguments.length > 1);
|
||
},
|
||
show: function show() {
|
||
return showHide(this, true);
|
||
},
|
||
hide: function hide() {
|
||
return showHide(this);
|
||
},
|
||
toggle: function toggle(state, fn2) {
|
||
var bool = typeof state === "boolean";
|
||
|
||
if (jQuery.isFunction(state) && jQuery.isFunction(fn2)) {
|
||
return eventsToggle.apply(this, arguments);
|
||
}
|
||
|
||
return this.each(function () {
|
||
if (bool ? state : isHidden(this)) {
|
||
jQuery(this).show();
|
||
} else {
|
||
jQuery(this).hide();
|
||
}
|
||
});
|
||
}
|
||
});
|
||
jQuery.extend({
|
||
// Add in style property hooks for overriding the default
|
||
// behavior of getting and setting a style property
|
||
cssHooks: {
|
||
opacity: {
|
||
get: function get(elem, computed) {
|
||
if (computed) {
|
||
// We should always get a number back from opacity
|
||
var ret = curCSS(elem, "opacity");
|
||
return ret === "" ? "1" : ret;
|
||
}
|
||
}
|
||
}
|
||
},
|
||
// Exclude the following css properties to add px
|
||
cssNumber: {
|
||
"fillOpacity": true,
|
||
"fontWeight": true,
|
||
"lineHeight": true,
|
||
"opacity": true,
|
||
"orphans": true,
|
||
"widows": true,
|
||
"zIndex": true,
|
||
"zoom": true
|
||
},
|
||
// Add in properties whose names you wish to fix before
|
||
// setting or getting the value
|
||
cssProps: {
|
||
// normalize float css property
|
||
"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
|
||
},
|
||
// Get and set the style property on a DOM Node
|
||
style: function style(elem, name, value, extra) {
|
||
// Don't set styles on text and comment nodes
|
||
if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) {
|
||
return;
|
||
} // Make sure that we're working with the right name
|
||
|
||
|
||
var ret,
|
||
type,
|
||
hooks,
|
||
origName = jQuery.camelCase(name),
|
||
style = elem.style;
|
||
name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(style, origName)); // gets hook for the prefixed version
|
||
// followed by the unprefixed version
|
||
|
||
hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; // Check if we're setting a value
|
||
|
||
if (value !== undefined) {
|
||
type = _typeof(value); // convert relative number strings (+= or -=) to relative numbers. #7345
|
||
|
||
if (type === "string" && (ret = rrelNum.exec(value))) {
|
||
value = (ret[1] + 1) * ret[2] + parseFloat(jQuery.css(elem, name)); // Fixes bug #9237
|
||
|
||
type = "number";
|
||
} // Make sure that NaN and null values aren't set. See: #7116
|
||
|
||
|
||
if (value == null || type === "number" && isNaN(value)) {
|
||
return;
|
||
} // If a number was passed in, add 'px' to the (except for certain CSS properties)
|
||
|
||
|
||
if (type === "number" && !jQuery.cssNumber[origName]) {
|
||
value += "px";
|
||
} // If a hook was provided, use that value, otherwise just set the specified value
|
||
|
||
|
||
if (!hooks || !("set" in hooks) || (value = hooks.set(elem, value, extra)) !== undefined) {
|
||
// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
|
||
// Fixes bug #5509
|
||
try {
|
||
style[name] = value;
|
||
} catch (e) {}
|
||
}
|
||
} else {
|
||
// If a hook was provided get the non-computed value from there
|
||
if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== undefined) {
|
||
return ret;
|
||
} // Otherwise just get the value from the style object
|
||
|
||
|
||
return style[name];
|
||
}
|
||
},
|
||
css: function css(elem, name, numeric, extra) {
|
||
var val,
|
||
num,
|
||
hooks,
|
||
origName = jQuery.camelCase(name); // Make sure that we're working with the right name
|
||
|
||
name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(elem.style, origName)); // gets hook for the prefixed version
|
||
// followed by the unprefixed version
|
||
|
||
hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; // If a hook was provided get the computed value from there
|
||
|
||
if (hooks && "get" in hooks) {
|
||
val = hooks.get(elem, true, extra);
|
||
} // Otherwise, if a way to get the computed value exists, use that
|
||
|
||
|
||
if (val === undefined) {
|
||
val = curCSS(elem, name);
|
||
} //convert "normal" to computed value
|
||
|
||
|
||
if (val === "normal" && name in cssNormalTransform) {
|
||
val = cssNormalTransform[name];
|
||
} // Return, converting to number if forced or a qualifier was provided and val looks numeric
|
||
|
||
|
||
if (numeric || extra !== undefined) {
|
||
num = parseFloat(val);
|
||
return numeric || jQuery.isNumeric(num) ? num || 0 : val;
|
||
}
|
||
|
||
return val;
|
||
},
|
||
// A method for quickly swapping in/out CSS properties to get correct calculations
|
||
swap: function swap(elem, options, callback) {
|
||
var ret,
|
||
name,
|
||
old = {}; // Remember the old values, and insert the new ones
|
||
|
||
for (name in options) {
|
||
old[name] = elem.style[name];
|
||
elem.style[name] = options[name];
|
||
}
|
||
|
||
ret = callback.call(elem); // Revert the old values
|
||
|
||
for (name in options) {
|
||
elem.style[name] = old[name];
|
||
}
|
||
|
||
return ret;
|
||
}
|
||
}); // NOTE: To any future maintainer, we've window.getComputedStyle
|
||
// because jsdom on node.js will break without it.
|
||
|
||
if (window.getComputedStyle) {
|
||
curCSS = function curCSS(elem, name) {
|
||
var ret,
|
||
width,
|
||
minWidth,
|
||
maxWidth,
|
||
computed = window.getComputedStyle(elem, null),
|
||
style = elem.style;
|
||
|
||
if (computed) {
|
||
ret = computed[name];
|
||
|
||
if (ret === "" && !jQuery.contains(elem.ownerDocument, elem)) {
|
||
ret = jQuery.style(elem, name);
|
||
} // A tribute to the "awesome hack by Dean Edwards"
|
||
// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
|
||
// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
|
||
// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
|
||
|
||
|
||
if (rnumnonpx.test(ret) && rmargin.test(name)) {
|
||
width = style.width;
|
||
minWidth = style.minWidth;
|
||
maxWidth = style.maxWidth;
|
||
style.minWidth = style.maxWidth = style.width = ret;
|
||
ret = computed.width;
|
||
style.width = width;
|
||
style.minWidth = minWidth;
|
||
style.maxWidth = maxWidth;
|
||
}
|
||
}
|
||
|
||
return ret;
|
||
};
|
||
} else if (document.documentElement.currentStyle) {
|
||
curCSS = function curCSS(elem, name) {
|
||
var left,
|
||
rsLeft,
|
||
ret = elem.currentStyle && elem.currentStyle[name],
|
||
style = elem.style; // Avoid setting ret to empty string here
|
||
// so we don't default to auto
|
||
|
||
if (ret == null && style && style[name]) {
|
||
ret = style[name];
|
||
} // From the awesome hack by Dean Edwards
|
||
// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
|
||
// If we're not dealing with a regular pixel number
|
||
// but a number that has a weird ending, we need to convert it to pixels
|
||
// but not position css attributes, as those are proportional to the parent element instead
|
||
// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
|
||
|
||
|
||
if (rnumnonpx.test(ret) && !rposition.test(name)) {
|
||
// Remember the original values
|
||
left = style.left;
|
||
rsLeft = elem.runtimeStyle && elem.runtimeStyle.left; // Put in the new values to get a computed value out
|
||
|
||
if (rsLeft) {
|
||
elem.runtimeStyle.left = elem.currentStyle.left;
|
||
}
|
||
|
||
style.left = name === "fontSize" ? "1em" : ret;
|
||
ret = style.pixelLeft + "px"; // Revert the changed values
|
||
|
||
style.left = left;
|
||
|
||
if (rsLeft) {
|
||
elem.runtimeStyle.left = rsLeft;
|
||
}
|
||
}
|
||
|
||
return ret === "" ? "auto" : ret;
|
||
};
|
||
}
|
||
|
||
function setPositiveNumber(elem, value, subtract) {
|
||
var matches = rnumsplit.exec(value);
|
||
return matches ? Math.max(0, matches[1] - (subtract || 0)) + (matches[2] || "px") : value;
|
||
}
|
||
|
||
function augmentWidthOrHeight(elem, name, extra, isBorderBox) {
|
||
var i = extra === (isBorderBox ? "border" : "content") ? // If we already have the right measurement, avoid augmentation
|
||
4 : // Otherwise initialize for horizontal or vertical properties
|
||
name === "width" ? 1 : 0,
|
||
val = 0;
|
||
|
||
for (; i < 4; i += 2) {
|
||
// both box models exclude margin, so add it if we want it
|
||
if (extra === "margin") {
|
||
// we use jQuery.css instead of curCSS here
|
||
// because of the reliableMarginRight CSS hook!
|
||
val += jQuery.css(elem, extra + cssExpand[i], true);
|
||
} // From this point on we use curCSS for maximum performance (relevant in animations)
|
||
|
||
|
||
if (isBorderBox) {
|
||
// border-box includes padding, so remove it if we want content
|
||
if (extra === "content") {
|
||
val -= parseFloat(curCSS(elem, "padding" + cssExpand[i])) || 0;
|
||
} // at this point, extra isn't border nor margin, so remove border
|
||
|
||
|
||
if (extra !== "margin") {
|
||
val -= parseFloat(curCSS(elem, "border" + cssExpand[i] + "Width")) || 0;
|
||
}
|
||
} else {
|
||
// at this point, extra isn't content, so add padding
|
||
val += parseFloat(curCSS(elem, "padding" + cssExpand[i])) || 0; // at this point, extra isn't content nor padding, so add border
|
||
|
||
if (extra !== "padding") {
|
||
val += parseFloat(curCSS(elem, "border" + cssExpand[i] + "Width")) || 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
return val;
|
||
}
|
||
|
||
function getWidthOrHeight(elem, name, extra) {
|
||
// Start with offset property, which is equivalent to the border-box value
|
||
var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
|
||
valueIsBorderBox = true,
|
||
isBorderBox = jQuery.support.boxSizing && jQuery.css(elem, "boxSizing") === "border-box"; // some non-html elements return undefined for offsetWidth, so check for null/undefined
|
||
// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
|
||
// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
|
||
|
||
if (val <= 0 || val == null) {
|
||
// Fall back to computed then uncomputed css if necessary
|
||
val = curCSS(elem, name);
|
||
|
||
if (val < 0 || val == null) {
|
||
val = elem.style[name];
|
||
} // Computed unit is not pixels. Stop here and return.
|
||
|
||
|
||
if (rnumnonpx.test(val)) {
|
||
return val;
|
||
} // we need the check for style in case a browser which returns unreliable values
|
||
// for getComputedStyle silently falls back to the reliable elem.style
|
||
|
||
|
||
valueIsBorderBox = isBorderBox && (jQuery.support.boxSizingReliable || val === elem.style[name]); // Normalize "", auto, and prepare for extra
|
||
|
||
val = parseFloat(val) || 0;
|
||
} // use the active box-sizing model to add/subtract irrelevant styles
|
||
|
||
|
||
return val + augmentWidthOrHeight(elem, name, extra || (isBorderBox ? "border" : "content"), valueIsBorderBox) + "px";
|
||
} // Try to determine the default display value of an element
|
||
|
||
|
||
function css_defaultDisplay(nodeName) {
|
||
if (elemdisplay[nodeName]) {
|
||
return elemdisplay[nodeName];
|
||
}
|
||
|
||
var elem = jQuery("<" + nodeName + ">").appendTo(document.body),
|
||
display = elem.css("display");
|
||
elem.remove(); // If the simple way fails,
|
||
// get element's real default display by attaching it to a temp iframe
|
||
|
||
if (display === "none" || display === "") {
|
||
// Use the already-created iframe if possible
|
||
iframe = document.body.appendChild(iframe || jQuery.extend(document.createElement("iframe"), {
|
||
frameBorder: 0,
|
||
width: 0,
|
||
height: 0
|
||
})); // Create a cacheable copy of the iframe document on first call.
|
||
// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
|
||
// document to it; WebKit & Firefox won't allow reusing the iframe document.
|
||
|
||
if (!iframeDoc || !iframe.createElement) {
|
||
iframeDoc = (iframe.contentWindow || iframe.contentDocument).document;
|
||
iframeDoc.write("<!doctype html><html><body>");
|
||
iframeDoc.close();
|
||
}
|
||
|
||
elem = iframeDoc.body.appendChild(iframeDoc.createElement(nodeName));
|
||
display = curCSS(elem, "display");
|
||
document.body.removeChild(iframe);
|
||
} // Store the correct default display
|
||
|
||
|
||
elemdisplay[nodeName] = display;
|
||
return display;
|
||
}
|
||
|
||
jQuery.each(["height", "width"], function (i, name) {
|
||
jQuery.cssHooks[name] = {
|
||
get: function get(elem, computed, extra) {
|
||
if (computed) {
|
||
// certain elements can have dimension info if we invisibly show them
|
||
// however, it must have a current display style that would benefit from this
|
||
if (elem.offsetWidth === 0 && rdisplayswap.test(curCSS(elem, "display"))) {
|
||
return jQuery.swap(elem, cssShow, function () {
|
||
return getWidthOrHeight(elem, name, extra);
|
||
});
|
||
} else {
|
||
return getWidthOrHeight(elem, name, extra);
|
||
}
|
||
}
|
||
},
|
||
set: function set(elem, value, extra) {
|
||
return setPositiveNumber(elem, value, extra ? augmentWidthOrHeight(elem, name, extra, jQuery.support.boxSizing && jQuery.css(elem, "boxSizing") === "border-box") : 0);
|
||
}
|
||
};
|
||
});
|
||
|
||
if (!jQuery.support.opacity) {
|
||
jQuery.cssHooks.opacity = {
|
||
get: function get(elem, computed) {
|
||
// IE uses filters for opacity
|
||
return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ? 0.01 * parseFloat(RegExp.$1) + "" : computed ? "1" : "";
|
||
},
|
||
set: function set(elem, value) {
|
||
var style = elem.style,
|
||
currentStyle = elem.currentStyle,
|
||
opacity = jQuery.isNumeric(value) ? "alpha(opacity=" + value * 100 + ")" : "",
|
||
filter = currentStyle && currentStyle.filter || style.filter || ""; // IE has trouble with opacity if it does not have layout
|
||
// Force it by setting the zoom level
|
||
|
||
style.zoom = 1; // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
|
||
|
||
if (value >= 1 && jQuery.trim(filter.replace(ralpha, "")) === "" && style.removeAttribute) {
|
||
// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
|
||
// if "filter:" is present at all, clearType is disabled, we want to avoid this
|
||
// style.removeAttribute is IE Only, but so apparently is this code path...
|
||
style.removeAttribute("filter"); // if there there is no filter style applied in a css rule, we are done
|
||
|
||
if (currentStyle && !currentStyle.filter) {
|
||
return;
|
||
}
|
||
} // otherwise, set new filter values
|
||
|
||
|
||
style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : filter + " " + opacity;
|
||
}
|
||
};
|
||
} // These hooks cannot be added until DOM ready because the support test
|
||
// for it is not run until after DOM ready
|
||
|
||
|
||
jQuery(function () {
|
||
if (!jQuery.support.reliableMarginRight) {
|
||
jQuery.cssHooks.marginRight = {
|
||
get: function get(elem, computed) {
|
||
// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
|
||
// Work around by temporarily setting element display to inline-block
|
||
return jQuery.swap(elem, {
|
||
"display": "inline-block"
|
||
}, function () {
|
||
if (computed) {
|
||
return curCSS(elem, "marginRight");
|
||
}
|
||
});
|
||
}
|
||
};
|
||
} // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
|
||
// getComputedStyle returns percent when specified for top/left/bottom/right
|
||
// rather than make the css module depend on the offset module, we just check for it here
|
||
|
||
|
||
if (!jQuery.support.pixelPosition && jQuery.fn.position) {
|
||
jQuery.each(["top", "left"], function (i, prop) {
|
||
jQuery.cssHooks[prop] = {
|
||
get: function get(elem, computed) {
|
||
if (computed) {
|
||
var ret = curCSS(elem, prop); // if curCSS returns percentage, fallback to offset
|
||
|
||
return rnumnonpx.test(ret) ? jQuery(elem).position()[prop] + "px" : ret;
|
||
}
|
||
}
|
||
};
|
||
});
|
||
}
|
||
});
|
||
|
||
if (jQuery.expr && jQuery.expr.filters) {
|
||
jQuery.expr.filters.hidden = function (elem) {
|
||
return elem.offsetWidth === 0 && elem.offsetHeight === 0 || !jQuery.support.reliableHiddenOffsets && (elem.style && elem.style.display || curCSS(elem, "display")) === "none";
|
||
};
|
||
|
||
jQuery.expr.filters.visible = function (elem) {
|
||
return !jQuery.expr.filters.hidden(elem);
|
||
};
|
||
} // These hooks are used by animate to expand properties
|
||
|
||
|
||
jQuery.each({
|
||
margin: "",
|
||
padding: "",
|
||
border: "Width"
|
||
}, function (prefix, suffix) {
|
||
jQuery.cssHooks[prefix + suffix] = {
|
||
expand: function expand(value) {
|
||
var i,
|
||
// assumes a single number if not a string
|
||
parts = typeof value === "string" ? value.split(" ") : [value],
|
||
expanded = {};
|
||
|
||
for (i = 0; i < 4; i++) {
|
||
expanded[prefix + cssExpand[i] + suffix] = parts[i] || parts[i - 2] || parts[0];
|
||
}
|
||
|
||
return expanded;
|
||
}
|
||
};
|
||
|
||
if (!rmargin.test(prefix)) {
|
||
jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;
|
||
}
|
||
});
|
||
var r20 = /%20/g,
|
||
rbracket = /\[\]$/,
|
||
rCRLF = /\r?\n/g,
|
||
rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
|
||
rselectTextarea = /^(?:select|textarea)/i;
|
||
jQuery.fn.extend({
|
||
serialize: function serialize() {
|
||
return jQuery.param(this.serializeArray());
|
||
},
|
||
serializeArray: function serializeArray() {
|
||
return this.map(function () {
|
||
return this.elements ? jQuery.makeArray(this.elements) : this;
|
||
}).filter(function () {
|
||
return this.name && !this.disabled && (this.checked || rselectTextarea.test(this.nodeName) || rinput.test(this.type));
|
||
}).map(function (i, elem) {
|
||
var val = jQuery(this).val();
|
||
return val == null ? null : jQuery.isArray(val) ? jQuery.map(val, function (val, i) {
|
||
return {
|
||
name: elem.name,
|
||
value: val.replace(rCRLF, "\r\n")
|
||
};
|
||
}) : {
|
||
name: elem.name,
|
||
value: val.replace(rCRLF, "\r\n")
|
||
};
|
||
}).get();
|
||
}
|
||
}); //Serialize an array of form elements or a set of
|
||
//key/values into a query string
|
||
|
||
jQuery.param = function (a, traditional) {
|
||
var prefix,
|
||
s = [],
|
||
add = function add(key, value) {
|
||
// If value is a function, invoke it and return its value
|
||
value = jQuery.isFunction(value) ? value() : value == null ? "" : value;
|
||
s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
|
||
}; // Set traditional to true for jQuery <= 1.3.2 behavior.
|
||
|
||
|
||
if (traditional === undefined) {
|
||
traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
|
||
} // If an array was passed in, assume that it is an array of form elements.
|
||
|
||
|
||
if (jQuery.isArray(a) || a.jquery && !jQuery.isPlainObject(a)) {
|
||
// Serialize the form elements
|
||
jQuery.each(a, function () {
|
||
add(this.name, this.value);
|
||
});
|
||
} else {
|
||
// If traditional, encode the "old" way (the way 1.3.2 or older
|
||
// did it), otherwise encode params recursively.
|
||
for (prefix in a) {
|
||
buildParams(prefix, a[prefix], traditional, add);
|
||
}
|
||
} // Return the resulting serialization
|
||
|
||
|
||
return s.join("&").replace(r20, "+");
|
||
};
|
||
|
||
function buildParams(prefix, obj, traditional, add) {
|
||
var name;
|
||
|
||
if (jQuery.isArray(obj)) {
|
||
// Serialize array item.
|
||
jQuery.each(obj, function (i, v) {
|
||
if (traditional || rbracket.test(prefix)) {
|
||
// Treat each array item as a scalar.
|
||
add(prefix, v);
|
||
} else {
|
||
// If array item is non-scalar (array or object), encode its
|
||
// numeric index to resolve deserialization ambiguity issues.
|
||
// Note that rack (as of 1.0.0) can't currently deserialize
|
||
// nested arrays properly, and attempting to do so may cause
|
||
// a server error. Possible fixes are to modify rack's
|
||
// deserialization algorithm or to provide an option or flag
|
||
// to force array serialization to be shallow.
|
||
buildParams(prefix + "[" + (_typeof(v) === "object" ? i : "") + "]", v, traditional, add);
|
||
}
|
||
});
|
||
} else if (!traditional && jQuery.type(obj) === "object") {
|
||
// Serialize object item.
|
||
for (name in obj) {
|
||
buildParams(prefix + "[" + name + "]", obj[name], traditional, add);
|
||
}
|
||
} else {
|
||
// Serialize scalar item.
|
||
add(prefix, obj);
|
||
}
|
||
}
|
||
|
||
var // Document location
|
||
ajaxLocation,
|
||
// Document location segments
|
||
ajaxLocParts,
|
||
rhash = /#.*$/,
|
||
rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg,
|
||
// IE leaves an \r character at EOL
|
||
// #7653, #8125, #8152: local protocol detection
|
||
rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
|
||
rnoContent = /^(?:GET|HEAD)$/,
|
||
rprotocol = /^\/\//,
|
||
rquery = /\?/,
|
||
rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
|
||
rts = /([?&])_=[^&]*/,
|
||
rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
|
||
// Keep a copy of the old load method
|
||
_load = jQuery.fn.load,
|
||
|
||
/* Prefilters
|
||
* 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
|
||
* 2) These are called:
|
||
* - BEFORE asking for a transport
|
||
* - AFTER param serialization (s.data is a string if s.processData is true)
|
||
* 3) key is the dataType
|
||
* 4) the catchall symbol "*" can be used
|
||
* 5) execution will start with transport dataType and THEN continue down to "*" if needed
|
||
*/
|
||
prefilters = {},
|
||
|
||
/* Transports bindings
|
||
* 1) key is the dataType
|
||
* 2) the catchall symbol "*" can be used
|
||
* 3) selection will start with transport dataType and THEN go to "*" if needed
|
||
*/
|
||
transports = {},
|
||
// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
|
||
allTypes = ["*/"] + ["*"]; // #8138, IE may throw an exception when accessing
|
||
// a field from window.location if document.domain has been set
|
||
|
||
try {
|
||
ajaxLocation = location.href;
|
||
} catch (e) {
|
||
// Use the href attribute of an A element
|
||
// since IE will modify it given document.location
|
||
ajaxLocation = document.createElement("a");
|
||
ajaxLocation.href = "";
|
||
ajaxLocation = ajaxLocation.href;
|
||
} // Segment location into parts
|
||
|
||
|
||
ajaxLocParts = rurl.exec(ajaxLocation.toLowerCase()) || []; // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
|
||
|
||
function addToPrefiltersOrTransports(structure) {
|
||
// dataTypeExpression is optional and defaults to "*"
|
||
return function (dataTypeExpression, func) {
|
||
if (typeof dataTypeExpression !== "string") {
|
||
func = dataTypeExpression;
|
||
dataTypeExpression = "*";
|
||
}
|
||
|
||
var dataType,
|
||
list,
|
||
placeBefore,
|
||
dataTypes = dataTypeExpression.toLowerCase().split(core_rspace),
|
||
i = 0,
|
||
length = dataTypes.length;
|
||
|
||
if (jQuery.isFunction(func)) {
|
||
// For each dataType in the dataTypeExpression
|
||
for (; i < length; i++) {
|
||
dataType = dataTypes[i]; // We control if we're asked to add before
|
||
// any existing element
|
||
|
||
placeBefore = /^\+/.test(dataType);
|
||
|
||
if (placeBefore) {
|
||
dataType = dataType.substr(1) || "*";
|
||
}
|
||
|
||
list = structure[dataType] = structure[dataType] || []; // then we add to the structure accordingly
|
||
|
||
list[placeBefore ? "unshift" : "push"](func);
|
||
}
|
||
}
|
||
};
|
||
} // Base inspection function for prefilters and transports
|
||
|
||
|
||
function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR, dataType
|
||
/* internal */
|
||
, inspected
|
||
/* internal */
|
||
) {
|
||
dataType = dataType || options.dataTypes[0];
|
||
inspected = inspected || {};
|
||
inspected[dataType] = true;
|
||
var selection,
|
||
list = structure[dataType],
|
||
i = 0,
|
||
length = list ? list.length : 0,
|
||
executeOnly = structure === prefilters;
|
||
|
||
for (; i < length && (executeOnly || !selection); i++) {
|
||
selection = list[i](options, originalOptions, jqXHR); // If we got redirected to another dataType
|
||
// we try there if executing only and not done already
|
||
|
||
if (typeof selection === "string") {
|
||
if (!executeOnly || inspected[selection]) {
|
||
selection = undefined;
|
||
} else {
|
||
options.dataTypes.unshift(selection);
|
||
selection = inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR, selection, inspected);
|
||
}
|
||
}
|
||
} // If we're only executing or nothing was selected
|
||
// we try the catchall dataType if not done already
|
||
|
||
|
||
if ((executeOnly || !selection) && !inspected["*"]) {
|
||
selection = inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR, "*", inspected);
|
||
} // unnecessary when only executing (prefilters)
|
||
// but it'll be ignored by the caller in that case
|
||
|
||
|
||
return selection;
|
||
} // A special extend for ajax options
|
||
// that takes "flat" options (not to be deep extended)
|
||
// Fixes #9887
|
||
|
||
|
||
function ajaxExtend(target, src) {
|
||
var key,
|
||
deep,
|
||
flatOptions = jQuery.ajaxSettings.flatOptions || {};
|
||
|
||
for (key in src) {
|
||
if (src[key] !== undefined) {
|
||
(flatOptions[key] ? target : deep || (deep = {}))[key] = src[key];
|
||
}
|
||
}
|
||
|
||
if (deep) {
|
||
jQuery.extend(true, target, deep);
|
||
}
|
||
}
|
||
|
||
jQuery.fn.load = function (url, params, callback) {
|
||
if (typeof url !== "string" && _load) {
|
||
return _load.apply(this, arguments);
|
||
} // Don't do a request if no elements are being requested
|
||
|
||
|
||
if (!this.length) {
|
||
return this;
|
||
}
|
||
|
||
var selector,
|
||
type,
|
||
response,
|
||
self = this,
|
||
off = url.indexOf(" ");
|
||
|
||
if (off >= 0) {
|
||
selector = url.slice(off, url.length);
|
||
url = url.slice(0, off);
|
||
} // If it's a function
|
||
|
||
|
||
if (jQuery.isFunction(params)) {
|
||
// We assume that it's the callback
|
||
callback = params;
|
||
params = undefined; // Otherwise, build a param string
|
||
} else if (params && _typeof(params) === "object") {
|
||
type = "POST";
|
||
} // Request the remote document
|
||
|
||
|
||
jQuery.ajax({
|
||
url: url,
|
||
// if "type" variable is undefined, then "GET" method will be used
|
||
type: type,
|
||
dataType: "html",
|
||
data: params,
|
||
complete: function complete(jqXHR, status) {
|
||
if (callback) {
|
||
self.each(callback, response || [jqXHR.responseText, status, jqXHR]);
|
||
}
|
||
}
|
||
}).done(function (responseText) {
|
||
// Save response for use in complete callback
|
||
response = arguments; // See if a selector was specified
|
||
|
||
self.html(selector ? // Create a dummy div to hold the results
|
||
jQuery("<div>") // inject the contents of the document in, removing the scripts
|
||
// to avoid any 'Permission Denied' errors in IE
|
||
.append(responseText.replace(rscript, "")) // Locate the specified elements
|
||
.find(selector) : // If not, just inject the full result
|
||
responseText);
|
||
});
|
||
return this;
|
||
}; // Attach a bunch of functions for handling common AJAX events
|
||
|
||
|
||
jQuery.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function (i, o) {
|
||
jQuery.fn[o] = function (f) {
|
||
return this.on(o, f);
|
||
};
|
||
});
|
||
jQuery.each(["get", "post"], function (i, method) {
|
||
jQuery[method] = function (url, data, callback, type) {
|
||
// shift arguments if data argument was omitted
|
||
if (jQuery.isFunction(data)) {
|
||
type = type || callback;
|
||
callback = data;
|
||
data = undefined;
|
||
}
|
||
|
||
return jQuery.ajax({
|
||
type: method,
|
||
url: url,
|
||
data: data,
|
||
success: callback,
|
||
dataType: type
|
||
});
|
||
};
|
||
});
|
||
jQuery.extend({
|
||
getScript: function getScript(url, callback) {
|
||
return jQuery.get(url, undefined, callback, "script");
|
||
},
|
||
getJSON: function getJSON(url, data, callback) {
|
||
return jQuery.get(url, data, callback, "json");
|
||
},
|
||
// Creates a full fledged settings object into target
|
||
// with both ajaxSettings and settings fields.
|
||
// If target is omitted, writes into ajaxSettings.
|
||
ajaxSetup: function ajaxSetup(target, settings) {
|
||
if (settings) {
|
||
// Building a settings object
|
||
ajaxExtend(target, jQuery.ajaxSettings);
|
||
} else {
|
||
// Extending ajaxSettings
|
||
settings = target;
|
||
target = jQuery.ajaxSettings;
|
||
}
|
||
|
||
ajaxExtend(target, settings);
|
||
return target;
|
||
},
|
||
ajaxSettings: {
|
||
url: ajaxLocation,
|
||
isLocal: rlocalProtocol.test(ajaxLocParts[1]),
|
||
global: true,
|
||
type: "GET",
|
||
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
|
||
processData: true,
|
||
async: true,
|
||
|
||
/*
|
||
timeout: 0,
|
||
data: null,
|
||
dataType: null,
|
||
username: null,
|
||
password: null,
|
||
cache: null,
|
||
throws: false,
|
||
traditional: false,
|
||
headers: {},
|
||
*/
|
||
accepts: {
|
||
xml: "application/xml, text/xml",
|
||
html: "text/html",
|
||
text: "text/plain",
|
||
json: "application/json, text/javascript",
|
||
"*": allTypes
|
||
},
|
||
contents: {
|
||
xml: /xml/,
|
||
html: /html/,
|
||
json: /json/
|
||
},
|
||
responseFields: {
|
||
xml: "responseXML",
|
||
text: "responseText"
|
||
},
|
||
// List of data converters
|
||
// 1) key format is "source_type destination_type" (a single space in-between)
|
||
// 2) the catchall symbol "*" can be used for source_type
|
||
converters: {
|
||
// Convert anything to text
|
||
"* text": window.String,
|
||
// Text to html (true = no transformation)
|
||
"text html": true,
|
||
// Evaluate text as a json expression
|
||
"text json": jQuery.parseJSON,
|
||
// Parse text as xml
|
||
"text xml": jQuery.parseXML
|
||
},
|
||
// For options that shouldn't be deep extended:
|
||
// you can add your own custom options here if
|
||
// and when you create one that shouldn't be
|
||
// deep extended (see ajaxExtend)
|
||
flatOptions: {
|
||
context: true,
|
||
url: true
|
||
}
|
||
},
|
||
ajaxPrefilter: addToPrefiltersOrTransports(prefilters),
|
||
ajaxTransport: addToPrefiltersOrTransports(transports),
|
||
// Main method
|
||
ajax: function ajax(url, options) {
|
||
// If url is an object, simulate pre-1.5 signature
|
||
if (_typeof(url) === "object") {
|
||
options = url;
|
||
url = undefined;
|
||
} // Force options to be an object
|
||
|
||
|
||
options = options || {};
|
||
var // ifModified key
|
||
ifModifiedKey,
|
||
// Response headers
|
||
responseHeadersString,
|
||
responseHeaders,
|
||
// transport
|
||
transport,
|
||
// timeout handle
|
||
timeoutTimer,
|
||
// Cross-domain detection vars
|
||
parts,
|
||
// To know if global events are to be dispatched
|
||
fireGlobals,
|
||
// Loop variable
|
||
i,
|
||
// Create the final options object
|
||
s = jQuery.ajaxSetup({}, options),
|
||
// Callbacks context
|
||
callbackContext = s.context || s,
|
||
// Context for global events
|
||
// It's the callbackContext if one was provided in the options
|
||
// and if it's a DOM node or a jQuery collection
|
||
globalEventContext = callbackContext !== s && (callbackContext.nodeType || callbackContext instanceof jQuery) ? jQuery(callbackContext) : jQuery.event,
|
||
// Deferreds
|
||
deferred = jQuery.Deferred(),
|
||
completeDeferred = jQuery.Callbacks("once memory"),
|
||
// Status-dependent callbacks
|
||
statusCode = s.statusCode || {},
|
||
// Headers (they are sent all at once)
|
||
requestHeaders = {},
|
||
requestHeadersNames = {},
|
||
// The jqXHR state
|
||
state = 0,
|
||
// Default abort message
|
||
strAbort = "canceled",
|
||
// Fake xhr
|
||
jqXHR = {
|
||
readyState: 0,
|
||
// Caches the header
|
||
setRequestHeader: function setRequestHeader(name, value) {
|
||
if (!state) {
|
||
var lname = name.toLowerCase();
|
||
name = requestHeadersNames[lname] = requestHeadersNames[lname] || name;
|
||
requestHeaders[name] = value;
|
||
}
|
||
|
||
return this;
|
||
},
|
||
// Raw string
|
||
getAllResponseHeaders: function getAllResponseHeaders() {
|
||
return state === 2 ? responseHeadersString : null;
|
||
},
|
||
// Builds headers hashtable if needed
|
||
getResponseHeader: function getResponseHeader(key) {
|
||
var match;
|
||
|
||
if (state === 2) {
|
||
if (!responseHeaders) {
|
||
responseHeaders = {};
|
||
|
||
while (match = rheaders.exec(responseHeadersString)) {
|
||
responseHeaders[match[1].toLowerCase()] = match[2];
|
||
}
|
||
}
|
||
|
||
match = responseHeaders[key.toLowerCase()];
|
||
}
|
||
|
||
return match === undefined ? null : match;
|
||
},
|
||
// Overrides response content-type header
|
||
overrideMimeType: function overrideMimeType(type) {
|
||
if (!state) {
|
||
s.mimeType = type;
|
||
}
|
||
|
||
return this;
|
||
},
|
||
// Cancel the request
|
||
abort: function abort(statusText) {
|
||
statusText = statusText || strAbort;
|
||
|
||
if (transport) {
|
||
transport.abort(statusText);
|
||
}
|
||
|
||
done(0, statusText);
|
||
return this;
|
||
}
|
||
}; // Callback for when everything is done
|
||
// It is defined here because jslint complains if it is declared
|
||
// at the end of the function (which would be more logical and readable)
|
||
|
||
function done(status, nativeStatusText, responses, headers) {
|
||
var isSuccess,
|
||
success,
|
||
error,
|
||
response,
|
||
modified,
|
||
statusText = nativeStatusText; // Called once
|
||
|
||
if (state === 2) {
|
||
return;
|
||
} // State is "done" now
|
||
|
||
|
||
state = 2; // Clear timeout if it exists
|
||
|
||
if (timeoutTimer) {
|
||
clearTimeout(timeoutTimer);
|
||
} // Dereference transport for early garbage collection
|
||
// (no matter how long the jqXHR object will be used)
|
||
|
||
|
||
transport = undefined; // Cache response headers
|
||
|
||
responseHeadersString = headers || ""; // Set readyState
|
||
|
||
jqXHR.readyState = status > 0 ? 4 : 0; // Get response data
|
||
|
||
if (responses) {
|
||
response = ajaxHandleResponses(s, jqXHR, responses);
|
||
} // If successful, handle type chaining
|
||
|
||
|
||
if (status >= 200 && status < 300 || status === 304) {
|
||
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
|
||
if (s.ifModified) {
|
||
modified = jqXHR.getResponseHeader("Last-Modified");
|
||
|
||
if (modified) {
|
||
jQuery.lastModified[ifModifiedKey] = modified;
|
||
}
|
||
|
||
modified = jqXHR.getResponseHeader("Etag");
|
||
|
||
if (modified) {
|
||
jQuery.etag[ifModifiedKey] = modified;
|
||
}
|
||
} // If not modified
|
||
|
||
|
||
if (status === 304) {
|
||
statusText = "notmodified";
|
||
isSuccess = true; // If we have data
|
||
} else {
|
||
isSuccess = ajaxConvert(s, response);
|
||
statusText = isSuccess.state;
|
||
success = isSuccess.data;
|
||
error = isSuccess.error;
|
||
isSuccess = !error;
|
||
}
|
||
} else {
|
||
// We extract error from statusText
|
||
// then normalize statusText and status for non-aborts
|
||
error = statusText;
|
||
|
||
if (!statusText || status) {
|
||
statusText = "error";
|
||
|
||
if (status < 0) {
|
||
status = 0;
|
||
}
|
||
}
|
||
} // Set data for the fake xhr object
|
||
|
||
|
||
jqXHR.status = status;
|
||
jqXHR.statusText = "" + (nativeStatusText || statusText); // Success/Error
|
||
|
||
if (isSuccess) {
|
||
deferred.resolveWith(callbackContext, [success, statusText, jqXHR]);
|
||
} else {
|
||
deferred.rejectWith(callbackContext, [jqXHR, statusText, error]);
|
||
} // Status-dependent callbacks
|
||
|
||
|
||
jqXHR.statusCode(statusCode);
|
||
statusCode = undefined;
|
||
|
||
if (fireGlobals) {
|
||
globalEventContext.trigger("ajax" + (isSuccess ? "Success" : "Error"), [jqXHR, s, isSuccess ? success : error]);
|
||
} // Complete
|
||
|
||
|
||
completeDeferred.fireWith(callbackContext, [jqXHR, statusText]);
|
||
|
||
if (fireGlobals) {
|
||
globalEventContext.trigger("ajaxComplete", [jqXHR, s]); // Handle the global AJAX counter
|
||
|
||
if (! --jQuery.active) {
|
||
jQuery.event.trigger("ajaxStop");
|
||
}
|
||
}
|
||
} // Attach deferreds
|
||
|
||
|
||
deferred.promise(jqXHR);
|
||
jqXHR.success = jqXHR.done;
|
||
jqXHR.error = jqXHR.fail;
|
||
jqXHR.complete = completeDeferred.add; // Status-dependent callbacks
|
||
|
||
jqXHR.statusCode = function (map) {
|
||
if (map) {
|
||
var tmp;
|
||
|
||
if (state < 2) {
|
||
for (tmp in map) {
|
||
statusCode[tmp] = [statusCode[tmp], map[tmp]];
|
||
}
|
||
} else {
|
||
tmp = map[jqXHR.status];
|
||
jqXHR.always(tmp);
|
||
}
|
||
}
|
||
|
||
return this;
|
||
}; // Remove hash character (#7531: and string promotion)
|
||
// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
|
||
// We also use the url parameter if available
|
||
|
||
|
||
s.url = ((url || s.url) + "").replace(rhash, "").replace(rprotocol, ajaxLocParts[1] + "//"); // Extract dataTypes list
|
||
|
||
s.dataTypes = jQuery.trim(s.dataType || "*").toLowerCase().split(core_rspace); // Determine if a cross-domain request is in order
|
||
|
||
if (s.crossDomain == null) {
|
||
parts = rurl.exec(s.url.toLowerCase());
|
||
s.crossDomain = !!(parts && (parts[1] != ajaxLocParts[1] || parts[2] != ajaxLocParts[2] || (parts[3] || (parts[1] === "http:" ? 80 : 443)) != (ajaxLocParts[3] || (ajaxLocParts[1] === "http:" ? 80 : 443))));
|
||
} // Convert data if not already a string
|
||
|
||
|
||
if (s.data && s.processData && typeof s.data !== "string") {
|
||
s.data = jQuery.param(s.data, s.traditional);
|
||
} // Apply prefilters
|
||
|
||
|
||
inspectPrefiltersOrTransports(prefilters, s, options, jqXHR); // If request was aborted inside a prefilter, stop there
|
||
|
||
if (state === 2) {
|
||
return jqXHR;
|
||
} // We can fire global events as of now if asked to
|
||
|
||
|
||
fireGlobals = s.global; // Uppercase the type
|
||
|
||
s.type = s.type.toUpperCase(); // Determine if request has content
|
||
|
||
s.hasContent = !rnoContent.test(s.type); // Watch for a new set of requests
|
||
|
||
if (fireGlobals && jQuery.active++ === 0) {
|
||
jQuery.event.trigger("ajaxStart");
|
||
} // More options handling for requests with no content
|
||
|
||
|
||
if (!s.hasContent) {
|
||
// If data is available, append data to url
|
||
if (s.data) {
|
||
s.url += (rquery.test(s.url) ? "&" : "?") + s.data; // #9682: remove data so that it's not used in an eventual retry
|
||
|
||
delete s.data;
|
||
} // Get ifModifiedKey before adding the anti-cache parameter
|
||
|
||
|
||
ifModifiedKey = s.url; // Add anti-cache in url if needed
|
||
|
||
if (s.cache === false) {
|
||
var ts = jQuery.now(),
|
||
// try replacing _= if it is there
|
||
ret = s.url.replace(rts, "$1_=" + ts); // if nothing was replaced, add timestamp to the end
|
||
|
||
s.url = ret + (ret === s.url ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
|
||
}
|
||
} // Set the correct header, if data is being sent
|
||
|
||
|
||
if (s.data && s.hasContent && s.contentType !== false || options.contentType) {
|
||
jqXHR.setRequestHeader("Content-Type", s.contentType);
|
||
} // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
|
||
|
||
|
||
if (s.ifModified) {
|
||
ifModifiedKey = ifModifiedKey || s.url;
|
||
|
||
if (jQuery.lastModified[ifModifiedKey]) {
|
||
jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[ifModifiedKey]);
|
||
}
|
||
|
||
if (jQuery.etag[ifModifiedKey]) {
|
||
jqXHR.setRequestHeader("If-None-Match", jQuery.etag[ifModifiedKey]);
|
||
}
|
||
} // Set the Accepts header for the server, depending on the dataType
|
||
|
||
|
||
jqXHR.setRequestHeader("Accept", s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") : s.accepts["*"]); // Check for headers option
|
||
|
||
for (i in s.headers) {
|
||
jqXHR.setRequestHeader(i, s.headers[i]);
|
||
} // Allow custom headers/mimetypes and early abort
|
||
|
||
|
||
if (s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === false || state === 2)) {
|
||
// Abort if not done already and return
|
||
return jqXHR.abort();
|
||
} // aborting is no longer a cancellation
|
||
|
||
|
||
strAbort = "abort"; // Install callbacks on deferreds
|
||
|
||
for (i in {
|
||
success: 1,
|
||
error: 1,
|
||
complete: 1
|
||
}) {
|
||
jqXHR[i](s[i]);
|
||
} // Get transport
|
||
|
||
|
||
transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR); // If no transport, we auto-abort
|
||
|
||
if (!transport) {
|
||
done(-1, "No Transport");
|
||
} else {
|
||
jqXHR.readyState = 1; // Send global event
|
||
|
||
if (fireGlobals) {
|
||
globalEventContext.trigger("ajaxSend", [jqXHR, s]);
|
||
} // Timeout
|
||
|
||
|
||
if (s.async && s.timeout > 0) {
|
||
timeoutTimer = setTimeout(function () {
|
||
jqXHR.abort("timeout");
|
||
}, s.timeout);
|
||
}
|
||
|
||
try {
|
||
state = 1;
|
||
transport.send(requestHeaders, done);
|
||
} catch (e) {
|
||
// Propagate exception as error if not done
|
||
if (state < 2) {
|
||
done(-1, e); // Simply rethrow otherwise
|
||
} else {
|
||
throw e;
|
||
}
|
||
}
|
||
}
|
||
|
||
return jqXHR;
|
||
},
|
||
// Counter for holding the number of active queries
|
||
active: 0,
|
||
// Last-Modified header cache for next request
|
||
lastModified: {},
|
||
etag: {}
|
||
});
|
||
/* Handles responses to an ajax request:
|
||
* - sets all responseXXX fields accordingly
|
||
* - finds the right dataType (mediates between content-type and expected dataType)
|
||
* - returns the corresponding response
|
||
*/
|
||
|
||
function ajaxHandleResponses(s, jqXHR, responses) {
|
||
var ct,
|
||
type,
|
||
finalDataType,
|
||
firstDataType,
|
||
contents = s.contents,
|
||
dataTypes = s.dataTypes,
|
||
responseFields = s.responseFields; // Fill responseXXX fields
|
||
|
||
for (type in responseFields) {
|
||
if (type in responses) {
|
||
jqXHR[responseFields[type]] = responses[type];
|
||
}
|
||
} // Remove auto dataType and get content-type in the process
|
||
|
||
|
||
while (dataTypes[0] === "*") {
|
||
dataTypes.shift();
|
||
|
||
if (ct === undefined) {
|
||
ct = s.mimeType || jqXHR.getResponseHeader("content-type");
|
||
}
|
||
} // Check if we're dealing with a known content-type
|
||
|
||
|
||
if (ct) {
|
||
for (type in contents) {
|
||
if (contents[type] && contents[type].test(ct)) {
|
||
dataTypes.unshift(type);
|
||
break;
|
||
}
|
||
}
|
||
} // Check to see if we have a response for the expected dataType
|
||
|
||
|
||
if (dataTypes[0] in responses) {
|
||
finalDataType = dataTypes[0];
|
||
} else {
|
||
// Try convertible dataTypes
|
||
for (type in responses) {
|
||
if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) {
|
||
finalDataType = type;
|
||
break;
|
||
}
|
||
|
||
if (!firstDataType) {
|
||
firstDataType = type;
|
||
}
|
||
} // Or just use first one
|
||
|
||
|
||
finalDataType = finalDataType || firstDataType;
|
||
} // If we found a dataType
|
||
// We add the dataType to the list if needed
|
||
// and return the corresponding response
|
||
|
||
|
||
if (finalDataType) {
|
||
if (finalDataType !== dataTypes[0]) {
|
||
dataTypes.unshift(finalDataType);
|
||
}
|
||
|
||
return responses[finalDataType];
|
||
}
|
||
} // Chain conversions given the request and the original response
|
||
|
||
|
||
function ajaxConvert(s, response) {
|
||
var conv,
|
||
conv2,
|
||
current,
|
||
tmp,
|
||
// Work with a copy of dataTypes in case we need to modify it for conversion
|
||
dataTypes = s.dataTypes.slice(),
|
||
prev = dataTypes[0],
|
||
converters = {},
|
||
i = 0; // Apply the dataFilter if provided
|
||
|
||
if (s.dataFilter) {
|
||
response = s.dataFilter(response, s.dataType);
|
||
} // Create converters map with lowercased keys
|
||
|
||
|
||
if (dataTypes[1]) {
|
||
for (conv in s.converters) {
|
||
converters[conv.toLowerCase()] = s.converters[conv];
|
||
}
|
||
} // Convert to each sequential dataType, tolerating list modification
|
||
|
||
|
||
for (; current = dataTypes[++i];) {
|
||
// There's only work to do if current dataType is non-auto
|
||
if (current !== "*") {
|
||
// Convert response if prev dataType is non-auto and differs from current
|
||
if (prev !== "*" && prev !== current) {
|
||
// Seek a direct converter
|
||
conv = converters[prev + " " + current] || converters["* " + current]; // If none found, seek a pair
|
||
|
||
if (!conv) {
|
||
for (conv2 in converters) {
|
||
// If conv2 outputs current
|
||
tmp = conv2.split(" ");
|
||
|
||
if (tmp[1] === current) {
|
||
// If prev can be converted to accepted input
|
||
conv = converters[prev + " " + tmp[0]] || converters["* " + tmp[0]];
|
||
|
||
if (conv) {
|
||
// Condense equivalence converters
|
||
if (conv === true) {
|
||
conv = converters[conv2]; // Otherwise, insert the intermediate dataType
|
||
} else if (converters[conv2] !== true) {
|
||
current = tmp[0];
|
||
dataTypes.splice(i--, 0, current);
|
||
}
|
||
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
} // Apply converter (if not an equivalence)
|
||
|
||
|
||
if (conv !== true) {
|
||
// Unless errors are allowed to bubble, catch and return them
|
||
if (conv && s["throws"]) {
|
||
response = conv(response);
|
||
} else {
|
||
try {
|
||
response = conv(response);
|
||
} catch (e) {
|
||
return {
|
||
state: "parsererror",
|
||
error: conv ? e : "No conversion from " + prev + " to " + current
|
||
};
|
||
}
|
||
}
|
||
}
|
||
} // Update prev for next iteration
|
||
|
||
|
||
prev = current;
|
||
}
|
||
}
|
||
|
||
return {
|
||
state: "success",
|
||
data: response
|
||
};
|
||
}
|
||
|
||
var oldCallbacks = [],
|
||
rquestion = /\?/,
|
||
rjsonp = /(=)\?(?=&|$)|\?\?/,
|
||
nonce = jQuery.now(); // Default jsonp settings
|
||
|
||
jQuery.ajaxSetup({
|
||
jsonp: "callback",
|
||
jsonpCallback: function jsonpCallback() {
|
||
var callback = oldCallbacks.pop() || jQuery.expando + "_" + nonce++;
|
||
this[callback] = true;
|
||
return callback;
|
||
}
|
||
}); // Detect, normalize options and install callbacks for jsonp requests
|
||
|
||
jQuery.ajaxPrefilter("json jsonp", function (s, originalSettings, jqXHR) {
|
||
var callbackName,
|
||
overwritten,
|
||
responseContainer,
|
||
data = s.data,
|
||
url = s.url,
|
||
hasCallback = s.jsonp !== false,
|
||
replaceInUrl = hasCallback && rjsonp.test(url),
|
||
replaceInData = hasCallback && !replaceInUrl && typeof data === "string" && !(s.contentType || "").indexOf("application/x-www-form-urlencoded") && rjsonp.test(data); // Handle iff the expected data type is "jsonp" or we have a parameter to set
|
||
|
||
if (s.dataTypes[0] === "jsonp" || replaceInUrl || replaceInData) {
|
||
// Get callback name, remembering preexisting value associated with it
|
||
callbackName = s.jsonpCallback = jQuery.isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback;
|
||
overwritten = window[callbackName]; // Insert callback into url or form data
|
||
|
||
if (replaceInUrl) {
|
||
s.url = url.replace(rjsonp, "$1" + callbackName);
|
||
} else if (replaceInData) {
|
||
s.data = data.replace(rjsonp, "$1" + callbackName);
|
||
} else if (hasCallback) {
|
||
s.url += (rquestion.test(url) ? "&" : "?") + s.jsonp + "=" + callbackName;
|
||
} // Use data converter to retrieve json after script execution
|
||
|
||
|
||
s.converters["script json"] = function () {
|
||
if (!responseContainer) {
|
||
jQuery.error(callbackName + " was not called");
|
||
}
|
||
|
||
return responseContainer[0];
|
||
}; // force json dataType
|
||
|
||
|
||
s.dataTypes[0] = "json"; // Install callback
|
||
|
||
window[callbackName] = function () {
|
||
responseContainer = arguments;
|
||
}; // Clean-up function (fires after converters)
|
||
|
||
|
||
jqXHR.always(function () {
|
||
// Restore preexisting value
|
||
window[callbackName] = overwritten; // Save back as free
|
||
|
||
if (s[callbackName]) {
|
||
// make sure that re-using the options doesn't screw things around
|
||
s.jsonpCallback = originalSettings.jsonpCallback; // save the callback name for future use
|
||
|
||
oldCallbacks.push(callbackName);
|
||
} // Call if it was a function and we have a response
|
||
|
||
|
||
if (responseContainer && jQuery.isFunction(overwritten)) {
|
||
overwritten(responseContainer[0]);
|
||
}
|
||
|
||
responseContainer = overwritten = undefined;
|
||
}); // Delegate to script
|
||
|
||
return "script";
|
||
}
|
||
}); // Install script dataType
|
||
|
||
jQuery.ajaxSetup({
|
||
accepts: {
|
||
script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
|
||
},
|
||
contents: {
|
||
script: /javascript|ecmascript/
|
||
},
|
||
converters: {
|
||
"text script": function textScript(text) {
|
||
jQuery.globalEval(text);
|
||
return text;
|
||
}
|
||
}
|
||
}); // Handle cache's special case and global
|
||
|
||
jQuery.ajaxPrefilter("script", function (s) {
|
||
if (s.cache === undefined) {
|
||
s.cache = false;
|
||
}
|
||
|
||
if (s.crossDomain) {
|
||
s.type = "GET";
|
||
s.global = false;
|
||
}
|
||
}); // Bind script tag hack transport
|
||
|
||
jQuery.ajaxTransport("script", function (s) {
|
||
// This transport only deals with cross domain requests
|
||
if (s.crossDomain) {
|
||
var script,
|
||
head = document.head || document.getElementsByTagName("head")[0] || document.documentElement;
|
||
return {
|
||
send: function send(_, callback) {
|
||
script = document.createElement("script");
|
||
script.async = "async";
|
||
|
||
if (s.scriptCharset) {
|
||
script.charset = s.scriptCharset;
|
||
}
|
||
|
||
script.src = s.url; // Attach handlers for all browsers
|
||
|
||
script.onload = script.onreadystatechange = function (_, isAbort) {
|
||
if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) {
|
||
// Handle memory leak in IE
|
||
script.onload = script.onreadystatechange = null; // Remove the script
|
||
|
||
if (head && script.parentNode) {
|
||
head.removeChild(script);
|
||
} // Dereference the script
|
||
|
||
|
||
script = undefined; // Callback if not abort
|
||
|
||
if (!isAbort) {
|
||
callback(200, "success");
|
||
}
|
||
}
|
||
}; // Use insertBefore instead of appendChild to circumvent an IE6 bug.
|
||
// This arises when a base node is used (#2709 and #4378).
|
||
|
||
|
||
head.insertBefore(script, head.firstChild);
|
||
},
|
||
abort: function abort() {
|
||
if (script) {
|
||
script.onload(0, 1);
|
||
}
|
||
}
|
||
};
|
||
}
|
||
});
|
||
var xhrCallbacks,
|
||
// #5280: Internet Explorer will keep connections alive if we don't abort on unload
|
||
xhrOnUnloadAbort = window.ActiveXObject ? function () {
|
||
// Abort all pending requests
|
||
for (var key in xhrCallbacks) {
|
||
xhrCallbacks[key](0, 1);
|
||
}
|
||
} : false,
|
||
xhrId = 0; // Functions to create xhrs
|
||
|
||
function createStandardXHR() {
|
||
try {
|
||
return new window.XMLHttpRequest();
|
||
} catch (e) {}
|
||
}
|
||
|
||
function createActiveXHR() {
|
||
try {
|
||
return new window.ActiveXObject("Microsoft.XMLHTTP");
|
||
} catch (e) {}
|
||
} // Create the request object
|
||
// (This is still attached to ajaxSettings for backward compatibility)
|
||
|
||
|
||
jQuery.ajaxSettings.xhr = window.ActiveXObject ?
|
||
/* Microsoft failed to properly
|
||
* implement the XMLHttpRequest in IE7 (can't request local files),
|
||
* so we use the ActiveXObject when it is available
|
||
* Additionally XMLHttpRequest can be disabled in IE7/IE8 so
|
||
* we need a fallback.
|
||
*/
|
||
function () {
|
||
return !this.isLocal && createStandardXHR() || createActiveXHR();
|
||
} : // For all other browsers, use the standard XMLHttpRequest object
|
||
createStandardXHR; // Determine support properties
|
||
|
||
(function (xhr) {
|
||
jQuery.extend(jQuery.support, {
|
||
ajax: !!xhr,
|
||
cors: !!xhr && "withCredentials" in xhr
|
||
});
|
||
})(jQuery.ajaxSettings.xhr()); // Create transport if the browser can provide an xhr
|
||
|
||
|
||
if (jQuery.support.ajax) {
|
||
jQuery.ajaxTransport(function (s) {
|
||
// Cross domain only allowed if supported through XMLHttpRequest
|
||
if (!s.crossDomain || jQuery.support.cors) {
|
||
var _callback;
|
||
|
||
return {
|
||
send: function send(headers, complete) {
|
||
// Get a new xhr
|
||
var handle,
|
||
i,
|
||
xhr = s.xhr(); // Open the socket
|
||
// Passing null username, generates a login popup on Opera (#2865)
|
||
|
||
if (s.username) {
|
||
xhr.open(s.type, s.url, s.async, s.username, s.password);
|
||
} else {
|
||
xhr.open(s.type, s.url, s.async);
|
||
} // Apply custom fields if provided
|
||
|
||
|
||
if (s.xhrFields) {
|
||
for (i in s.xhrFields) {
|
||
xhr[i] = s.xhrFields[i];
|
||
}
|
||
} // Override mime type if needed
|
||
|
||
|
||
if (s.mimeType && xhr.overrideMimeType) {
|
||
xhr.overrideMimeType(s.mimeType);
|
||
} // X-Requested-With header
|
||
// For cross-domain requests, seeing as conditions for a preflight are
|
||
// akin to a jigsaw puzzle, we simply never set it to be sure.
|
||
// (it can always be set on a per-request basis or even using ajaxSetup)
|
||
// For same-domain requests, won't change header if already provided.
|
||
|
||
|
||
if (!s.crossDomain && !headers["X-Requested-With"]) {
|
||
headers["X-Requested-With"] = "XMLHttpRequest";
|
||
} // Need an extra try/catch for cross domain requests in Firefox 3
|
||
|
||
|
||
try {
|
||
for (i in headers) {
|
||
xhr.setRequestHeader(i, headers[i]);
|
||
}
|
||
} catch (_) {} // Do send the request
|
||
// This may raise an exception which is actually
|
||
// handled in jQuery.ajax (so no try/catch here)
|
||
|
||
|
||
xhr.send(s.hasContent && s.data || null); // Listener
|
||
|
||
_callback = function callback(_, isAbort) {
|
||
var status, statusText, responseHeaders, responses, xml; // Firefox throws exceptions when accessing properties
|
||
// of an xhr when a network error occurred
|
||
// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
|
||
|
||
try {
|
||
// Was never called and is aborted or complete
|
||
if (_callback && (isAbort || xhr.readyState === 4)) {
|
||
// Only called once
|
||
_callback = undefined; // Do not keep as active anymore
|
||
|
||
if (handle) {
|
||
xhr.onreadystatechange = jQuery.noop;
|
||
|
||
if (xhrOnUnloadAbort) {
|
||
delete xhrCallbacks[handle];
|
||
}
|
||
} // If it's an abort
|
||
|
||
|
||
if (isAbort) {
|
||
// Abort it manually if needed
|
||
if (xhr.readyState !== 4) {
|
||
xhr.abort();
|
||
}
|
||
} else {
|
||
status = xhr.status;
|
||
responseHeaders = xhr.getAllResponseHeaders();
|
||
responses = {};
|
||
xml = xhr.responseXML; // Construct response list
|
||
|
||
if (xml && xml.documentElement
|
||
/* #4958 */
|
||
) {
|
||
responses.xml = xml;
|
||
} // When requesting binary data, IE6-9 will throw an exception
|
||
// on any attempt to access responseText (#11426)
|
||
|
||
|
||
try {
|
||
responses.text = xhr.responseText;
|
||
} catch (_) {} // Firefox throws an exception when accessing
|
||
// statusText for faulty cross-domain requests
|
||
|
||
|
||
try {
|
||
statusText = xhr.statusText;
|
||
} catch (e) {
|
||
// We normalize with Webkit giving an empty statusText
|
||
statusText = "";
|
||
} // Filter status for non standard behaviors
|
||
// If the request is local and we have data: assume a success
|
||
// (success with no data won't get notified, that's the best we
|
||
// can do given current implementations)
|
||
|
||
|
||
if (!status && s.isLocal && !s.crossDomain) {
|
||
status = responses.text ? 200 : 404; // IE - #1450: sometimes returns 1223 when it should be 204
|
||
} else if (status === 1223) {
|
||
status = 204;
|
||
}
|
||
}
|
||
}
|
||
} catch (firefoxAccessException) {
|
||
if (!isAbort) {
|
||
complete(-1, firefoxAccessException);
|
||
}
|
||
} // Call complete if needed
|
||
|
||
|
||
if (responses) {
|
||
complete(status, statusText, responses, responseHeaders);
|
||
}
|
||
};
|
||
|
||
if (!s.async) {
|
||
// if we're in sync mode we fire the callback
|
||
_callback();
|
||
} else if (xhr.readyState === 4) {
|
||
// (IE6 & IE7) if it's in cache and has been
|
||
// retrieved directly we need to fire the callback
|
||
setTimeout(_callback, 0);
|
||
} else {
|
||
handle = ++xhrId;
|
||
|
||
if (xhrOnUnloadAbort) {
|
||
// Create the active xhrs callbacks list if needed
|
||
// and attach the unload handler
|
||
if (!xhrCallbacks) {
|
||
xhrCallbacks = {};
|
||
jQuery(window).unload(xhrOnUnloadAbort);
|
||
} // Add to list of active xhrs callbacks
|
||
|
||
|
||
xhrCallbacks[handle] = _callback;
|
||
}
|
||
|
||
xhr.onreadystatechange = _callback;
|
||
}
|
||
},
|
||
abort: function abort() {
|
||
if (_callback) {
|
||
_callback(0, 1);
|
||
}
|
||
}
|
||
};
|
||
}
|
||
});
|
||
}
|
||
|
||
var fxNow,
|
||
timerId,
|
||
rfxtypes = /^(?:toggle|show|hide)$/,
|
||
rfxnum = new RegExp("^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i"),
|
||
rrun = /queueHooks$/,
|
||
animationPrefilters = [defaultPrefilter],
|
||
tweeners = {
|
||
"*": [function (prop, value) {
|
||
var end,
|
||
unit,
|
||
prevScale,
|
||
tween = this.createTween(prop, value),
|
||
parts = rfxnum.exec(value),
|
||
target = tween.cur(),
|
||
start = +target || 0,
|
||
scale = 1;
|
||
|
||
if (parts) {
|
||
end = +parts[2];
|
||
unit = parts[3] || (jQuery.cssNumber[prop] ? "" : "px"); // We need to compute starting value
|
||
|
||
if (unit !== "px" && start) {
|
||
// Iteratively approximate from a nonzero starting point
|
||
// Prefer the current property, because this process will be trivial if it uses the same units
|
||
// Fallback to end or a simple constant
|
||
start = jQuery.css(tween.elem, prop, true) || end || 1;
|
||
|
||
do {
|
||
// If previous iteration zeroed out, double until we get *something*
|
||
// Use a string for doubling factor so we don't accidentally see scale as unchanged below
|
||
prevScale = scale = scale || ".5"; // Adjust and apply
|
||
|
||
start = start / scale;
|
||
jQuery.style(tween.elem, prop, start + unit); // Update scale, tolerating zeroes from tween.cur()
|
||
|
||
scale = tween.cur() / target; // Stop looping if we've hit the mark or scale is unchanged
|
||
} while (scale !== 1 && scale !== prevScale);
|
||
}
|
||
|
||
tween.unit = unit;
|
||
tween.start = start; // If a +=/-= token was provided, we're doing a relative animation
|
||
|
||
tween.end = parts[1] ? start + (parts[1] + 1) * end : end;
|
||
}
|
||
|
||
return tween;
|
||
}]
|
||
}; // Animations created synchronously will run synchronously
|
||
|
||
function createFxNow() {
|
||
setTimeout(function () {
|
||
fxNow = undefined;
|
||
}, 0);
|
||
return fxNow = jQuery.now();
|
||
}
|
||
|
||
function createTweens(animation, props) {
|
||
jQuery.each(props, function (prop, value) {
|
||
var collection = (tweeners[prop] || []).concat(tweeners["*"]),
|
||
index = 0,
|
||
length = collection.length;
|
||
|
||
for (; index < length; index++) {
|
||
if (collection[index].call(animation, prop, value)) {
|
||
// we're done with this property
|
||
return;
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
function Animation(elem, properties, options) {
|
||
var result,
|
||
index = 0,
|
||
tweenerIndex = 0,
|
||
length = animationPrefilters.length,
|
||
deferred = jQuery.Deferred().always(function () {
|
||
// don't match elem in the :animated selector
|
||
delete tick.elem;
|
||
}),
|
||
tick = function tick() {
|
||
var currentTime = fxNow || createFxNow(),
|
||
remaining = Math.max(0, animation.startTime + animation.duration - currentTime),
|
||
percent = 1 - (remaining / animation.duration || 0),
|
||
index = 0,
|
||
length = animation.tweens.length;
|
||
|
||
for (; index < length; index++) {
|
||
animation.tweens[index].run(percent);
|
||
}
|
||
|
||
deferred.notifyWith(elem, [animation, percent, remaining]);
|
||
|
||
if (percent < 1 && length) {
|
||
return remaining;
|
||
} else {
|
||
deferred.resolveWith(elem, [animation]);
|
||
return false;
|
||
}
|
||
},
|
||
animation = deferred.promise({
|
||
elem: elem,
|
||
props: jQuery.extend({}, properties),
|
||
opts: jQuery.extend(true, {
|
||
specialEasing: {}
|
||
}, options),
|
||
originalProperties: properties,
|
||
originalOptions: options,
|
||
startTime: fxNow || createFxNow(),
|
||
duration: options.duration,
|
||
tweens: [],
|
||
createTween: function createTween(prop, end, easing) {
|
||
var tween = jQuery.Tween(elem, animation.opts, prop, end, animation.opts.specialEasing[prop] || animation.opts.easing);
|
||
animation.tweens.push(tween);
|
||
return tween;
|
||
},
|
||
stop: function stop(gotoEnd) {
|
||
var index = 0,
|
||
// if we are going to the end, we want to run all the tweens
|
||
// otherwise we skip this part
|
||
length = gotoEnd ? animation.tweens.length : 0;
|
||
|
||
for (; index < length; index++) {
|
||
animation.tweens[index].run(1);
|
||
} // resolve when we played the last frame
|
||
// otherwise, reject
|
||
|
||
|
||
if (gotoEnd) {
|
||
deferred.resolveWith(elem, [animation, gotoEnd]);
|
||
} else {
|
||
deferred.rejectWith(elem, [animation, gotoEnd]);
|
||
}
|
||
|
||
return this;
|
||
}
|
||
}),
|
||
props = animation.props;
|
||
|
||
propFilter(props, animation.opts.specialEasing);
|
||
|
||
for (; index < length; index++) {
|
||
result = animationPrefilters[index].call(animation, elem, props, animation.opts);
|
||
|
||
if (result) {
|
||
return result;
|
||
}
|
||
}
|
||
|
||
createTweens(animation, props);
|
||
|
||
if (jQuery.isFunction(animation.opts.start)) {
|
||
animation.opts.start.call(elem, animation);
|
||
}
|
||
|
||
jQuery.fx.timer(jQuery.extend(tick, {
|
||
anim: animation,
|
||
queue: animation.opts.queue,
|
||
elem: elem
|
||
})); // attach callbacks from options
|
||
|
||
return animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always);
|
||
}
|
||
|
||
function propFilter(props, specialEasing) {
|
||
var index, name, easing, value, hooks; // camelCase, specialEasing and expand cssHook pass
|
||
|
||
for (index in props) {
|
||
name = jQuery.camelCase(index);
|
||
easing = specialEasing[name];
|
||
value = props[index];
|
||
|
||
if (jQuery.isArray(value)) {
|
||
easing = value[1];
|
||
value = props[index] = value[0];
|
||
}
|
||
|
||
if (index !== name) {
|
||
props[name] = value;
|
||
delete props[index];
|
||
}
|
||
|
||
hooks = jQuery.cssHooks[name];
|
||
|
||
if (hooks && "expand" in hooks) {
|
||
value = hooks.expand(value);
|
||
delete props[name]; // not quite $.extend, this wont overwrite keys already present.
|
||
// also - reusing 'index' from above because we have the correct "name"
|
||
|
||
for (index in value) {
|
||
if (!(index in props)) {
|
||
props[index] = value[index];
|
||
specialEasing[index] = easing;
|
||
}
|
||
}
|
||
} else {
|
||
specialEasing[name] = easing;
|
||
}
|
||
}
|
||
}
|
||
|
||
jQuery.Animation = jQuery.extend(Animation, {
|
||
tweener: function tweener(props, callback) {
|
||
if (jQuery.isFunction(props)) {
|
||
callback = props;
|
||
props = ["*"];
|
||
} else {
|
||
props = props.split(" ");
|
||
}
|
||
|
||
var prop,
|
||
index = 0,
|
||
length = props.length;
|
||
|
||
for (; index < length; index++) {
|
||
prop = props[index];
|
||
tweeners[prop] = tweeners[prop] || [];
|
||
tweeners[prop].unshift(callback);
|
||
}
|
||
},
|
||
prefilter: function prefilter(callback, prepend) {
|
||
if (prepend) {
|
||
animationPrefilters.unshift(callback);
|
||
} else {
|
||
animationPrefilters.push(callback);
|
||
}
|
||
}
|
||
});
|
||
|
||
function defaultPrefilter(elem, props, opts) {
|
||
var index,
|
||
prop,
|
||
value,
|
||
length,
|
||
dataShow,
|
||
tween,
|
||
hooks,
|
||
oldfire,
|
||
anim = this,
|
||
style = elem.style,
|
||
orig = {},
|
||
handled = [],
|
||
hidden = elem.nodeType && isHidden(elem); // handle queue: false promises
|
||
|
||
if (!opts.queue) {
|
||
hooks = jQuery._queueHooks(elem, "fx");
|
||
|
||
if (hooks.unqueued == null) {
|
||
hooks.unqueued = 0;
|
||
oldfire = hooks.empty.fire;
|
||
|
||
hooks.empty.fire = function () {
|
||
if (!hooks.unqueued) {
|
||
oldfire();
|
||
}
|
||
};
|
||
}
|
||
|
||
hooks.unqueued++;
|
||
anim.always(function () {
|
||
// doing this makes sure that the complete handler will be called
|
||
// before this completes
|
||
anim.always(function () {
|
||
hooks.unqueued--;
|
||
|
||
if (!jQuery.queue(elem, "fx").length) {
|
||
hooks.empty.fire();
|
||
}
|
||
});
|
||
});
|
||
} // height/width overflow pass
|
||
|
||
|
||
if (elem.nodeType === 1 && ("height" in props || "width" in props)) {
|
||
// Make sure that nothing sneaks out
|
||
// Record all 3 overflow attributes because IE does not
|
||
// change the overflow attribute when overflowX and
|
||
// overflowY are set to the same value
|
||
opts.overflow = [style.overflow, style.overflowX, style.overflowY]; // Set display property to inline-block for height/width
|
||
// animations on inline elements that are having width/height animated
|
||
|
||
if (jQuery.css(elem, "display") === "inline" && jQuery.css(elem, "float") === "none") {
|
||
// inline-level elements accept inline-block;
|
||
// block-level elements need to be inline with layout
|
||
if (!jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay(elem.nodeName) === "inline") {
|
||
style.display = "inline-block";
|
||
} else {
|
||
style.zoom = 1;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (opts.overflow) {
|
||
style.overflow = "hidden";
|
||
|
||
if (!jQuery.support.shrinkWrapBlocks) {
|
||
anim.done(function () {
|
||
style.overflow = opts.overflow[0];
|
||
style.overflowX = opts.overflow[1];
|
||
style.overflowY = opts.overflow[2];
|
||
});
|
||
}
|
||
} // show/hide pass
|
||
|
||
|
||
for (index in props) {
|
||
value = props[index];
|
||
|
||
if (rfxtypes.exec(value)) {
|
||
delete props[index];
|
||
|
||
if (value === (hidden ? "hide" : "show")) {
|
||
continue;
|
||
}
|
||
|
||
handled.push(index);
|
||
}
|
||
}
|
||
|
||
length = handled.length;
|
||
|
||
if (length) {
|
||
dataShow = jQuery._data(elem, "fxshow") || jQuery._data(elem, "fxshow", {});
|
||
|
||
if (hidden) {
|
||
jQuery(elem).show();
|
||
} else {
|
||
anim.done(function () {
|
||
jQuery(elem).hide();
|
||
});
|
||
}
|
||
|
||
anim.done(function () {
|
||
var prop;
|
||
jQuery.removeData(elem, "fxshow", true);
|
||
|
||
for (prop in orig) {
|
||
jQuery.style(elem, prop, orig[prop]);
|
||
}
|
||
});
|
||
|
||
for (index = 0; index < length; index++) {
|
||
prop = handled[index];
|
||
tween = anim.createTween(prop, hidden ? dataShow[prop] : 0);
|
||
orig[prop] = dataShow[prop] || jQuery.style(elem, prop);
|
||
|
||
if (!(prop in dataShow)) {
|
||
dataShow[prop] = tween.start;
|
||
|
||
if (hidden) {
|
||
tween.end = tween.start;
|
||
tween.start = prop === "width" || prop === "height" ? 1 : 0;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
function Tween(elem, options, prop, end, easing) {
|
||
return new Tween.prototype.init(elem, options, prop, end, easing);
|
||
}
|
||
|
||
jQuery.Tween = Tween;
|
||
Tween.prototype = {
|
||
constructor: Tween,
|
||
init: function init(elem, options, prop, end, easing, unit) {
|
||
this.elem = elem;
|
||
this.prop = prop;
|
||
this.easing = easing || "swing";
|
||
this.options = options;
|
||
this.start = this.now = this.cur();
|
||
this.end = end;
|
||
this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px");
|
||
},
|
||
cur: function cur() {
|
||
var hooks = Tween.propHooks[this.prop];
|
||
return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this);
|
||
},
|
||
run: function run(percent) {
|
||
var eased,
|
||
hooks = Tween.propHooks[this.prop];
|
||
|
||
if (this.options.duration) {
|
||
this.pos = eased = jQuery.easing[this.easing](percent, this.options.duration * percent, 0, 1, this.options.duration);
|
||
} else {
|
||
this.pos = eased = percent;
|
||
}
|
||
|
||
this.now = (this.end - this.start) * eased + this.start;
|
||
|
||
if (this.options.step) {
|
||
this.options.step.call(this.elem, this.now, this);
|
||
}
|
||
|
||
if (hooks && hooks.set) {
|
||
hooks.set(this);
|
||
} else {
|
||
Tween.propHooks._default.set(this);
|
||
}
|
||
|
||
return this;
|
||
}
|
||
};
|
||
Tween.prototype.init.prototype = Tween.prototype;
|
||
Tween.propHooks = {
|
||
_default: {
|
||
get: function get(tween) {
|
||
var result;
|
||
|
||
if (tween.elem[tween.prop] != null && (!tween.elem.style || tween.elem.style[tween.prop] == null)) {
|
||
return tween.elem[tween.prop];
|
||
} // passing any value as a 4th parameter to .css will automatically
|
||
// attempt a parseFloat and fallback to a string if the parse fails
|
||
// so, simple values such as "10px" are parsed to Float.
|
||
// complex values such as "rotate(1rad)" are returned as is.
|
||
|
||
|
||
result = jQuery.css(tween.elem, tween.prop, false, ""); // Empty strings, null, undefined and "auto" are converted to 0.
|
||
|
||
return !result || result === "auto" ? 0 : result;
|
||
},
|
||
set: function set(tween) {
|
||
// use step hook for back compat - use cssHook if its there - use .style if its
|
||
// available and use plain properties where available
|
||
if (jQuery.fx.step[tween.prop]) {
|
||
jQuery.fx.step[tween.prop](tween);
|
||
} else if (tween.elem.style && (tween.elem.style[jQuery.cssProps[tween.prop]] != null || jQuery.cssHooks[tween.prop])) {
|
||
jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);
|
||
} else {
|
||
tween.elem[tween.prop] = tween.now;
|
||
}
|
||
}
|
||
}
|
||
}; // Remove in 2.0 - this supports IE8's panic based approach
|
||
// to setting things on disconnected nodes
|
||
|
||
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
|
||
set: function set(tween) {
|
||
if (tween.elem.nodeType && tween.elem.parentNode) {
|
||
tween.elem[tween.prop] = tween.now;
|
||
}
|
||
}
|
||
};
|
||
jQuery.each(["toggle", "show", "hide"], function (i, name) {
|
||
var cssFn = jQuery.fn[name];
|
||
|
||
jQuery.fn[name] = function (speed, easing, callback) {
|
||
return speed == null || typeof speed === "boolean" || // special check for .toggle( handler, handler, ... )
|
||
!i && jQuery.isFunction(speed) && jQuery.isFunction(easing) ? cssFn.apply(this, arguments) : this.animate(genFx(name, true), speed, easing, callback);
|
||
};
|
||
});
|
||
jQuery.fn.extend({
|
||
fadeTo: function fadeTo(speed, to, easing, callback) {
|
||
// show any hidden elements after setting opacity to 0
|
||
return this.filter(isHidden).css("opacity", 0).show() // animate to the value specified
|
||
.end().animate({
|
||
opacity: to
|
||
}, speed, easing, callback);
|
||
},
|
||
animate: function animate(prop, speed, easing, callback) {
|
||
var empty = jQuery.isEmptyObject(prop),
|
||
optall = jQuery.speed(speed, easing, callback),
|
||
doAnimation = function doAnimation() {
|
||
// Operate on a copy of prop so per-property easing won't be lost
|
||
var anim = Animation(this, jQuery.extend({}, prop), optall); // Empty animations resolve immediately
|
||
|
||
if (empty) {
|
||
anim.stop(true);
|
||
}
|
||
};
|
||
|
||
return empty || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation);
|
||
},
|
||
stop: function stop(type, clearQueue, gotoEnd) {
|
||
var stopQueue = function stopQueue(hooks) {
|
||
var stop = hooks.stop;
|
||
delete hooks.stop;
|
||
stop(gotoEnd);
|
||
};
|
||
|
||
if (typeof type !== "string") {
|
||
gotoEnd = clearQueue;
|
||
clearQueue = type;
|
||
type = undefined;
|
||
}
|
||
|
||
if (clearQueue && type !== false) {
|
||
this.queue(type || "fx", []);
|
||
}
|
||
|
||
return this.each(function () {
|
||
var dequeue = true,
|
||
index = type != null && type + "queueHooks",
|
||
timers = jQuery.timers,
|
||
data = jQuery._data(this);
|
||
|
||
if (index) {
|
||
if (data[index] && data[index].stop) {
|
||
stopQueue(data[index]);
|
||
}
|
||
} else {
|
||
for (index in data) {
|
||
if (data[index] && data[index].stop && rrun.test(index)) {
|
||
stopQueue(data[index]);
|
||
}
|
||
}
|
||
}
|
||
|
||
for (index = timers.length; index--;) {
|
||
if (timers[index].elem === this && (type == null || timers[index].queue === type)) {
|
||
timers[index].anim.stop(gotoEnd);
|
||
dequeue = false;
|
||
timers.splice(index, 1);
|
||
}
|
||
} // start the next in the queue if the last step wasn't forced
|
||
// timers currently will call their complete callbacks, which will dequeue
|
||
// but only if they were gotoEnd
|
||
|
||
|
||
if (dequeue || !gotoEnd) {
|
||
jQuery.dequeue(this, type);
|
||
}
|
||
});
|
||
}
|
||
}); // Generate parameters to create a standard animation
|
||
|
||
function genFx(type, includeWidth) {
|
||
var which,
|
||
attrs = {
|
||
height: type
|
||
},
|
||
i = 0; // if we include width, step value is 1 to do all cssExpand values,
|
||
// if we don't include width, step value is 2 to skip over Left and Right
|
||
|
||
includeWidth = includeWidth ? 1 : 0;
|
||
|
||
for (; i < 4; i += 2 - includeWidth) {
|
||
which = cssExpand[i];
|
||
attrs["margin" + which] = attrs["padding" + which] = type;
|
||
}
|
||
|
||
if (includeWidth) {
|
||
attrs.opacity = attrs.width = type;
|
||
}
|
||
|
||
return attrs;
|
||
} // Generate shortcuts for custom animations
|
||
|
||
|
||
jQuery.each({
|
||
slideDown: genFx("show"),
|
||
slideUp: genFx("hide"),
|
||
slideToggle: genFx("toggle"),
|
||
fadeIn: {
|
||
opacity: "show"
|
||
},
|
||
fadeOut: {
|
||
opacity: "hide"
|
||
},
|
||
fadeToggle: {
|
||
opacity: "toggle"
|
||
}
|
||
}, function (name, props) {
|
||
jQuery.fn[name] = function (speed, easing, callback) {
|
||
return this.animate(props, speed, easing, callback);
|
||
};
|
||
});
|
||
|
||
jQuery.speed = function (speed, easing, fn) {
|
||
var opt = speed && _typeof(speed) === "object" ? jQuery.extend({}, speed) : {
|
||
complete: fn || !fn && easing || jQuery.isFunction(speed) && speed,
|
||
duration: speed,
|
||
easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
|
||
};
|
||
opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default; // normalize opt.queue - true/undefined/null -> "fx"
|
||
|
||
if (opt.queue == null || opt.queue === true) {
|
||
opt.queue = "fx";
|
||
} // Queueing
|
||
|
||
|
||
opt.old = opt.complete;
|
||
|
||
opt.complete = function () {
|
||
if (jQuery.isFunction(opt.old)) {
|
||
opt.old.call(this);
|
||
}
|
||
|
||
if (opt.queue) {
|
||
jQuery.dequeue(this, opt.queue);
|
||
}
|
||
};
|
||
|
||
return opt;
|
||
};
|
||
|
||
jQuery.easing = {
|
||
linear: function linear(p) {
|
||
return p;
|
||
},
|
||
swing: function swing(p) {
|
||
return 0.5 - Math.cos(p * Math.PI) / 2;
|
||
}
|
||
};
|
||
jQuery.timers = [];
|
||
jQuery.fx = Tween.prototype.init;
|
||
|
||
jQuery.fx.tick = function () {
|
||
var timer,
|
||
timers = jQuery.timers,
|
||
i = 0;
|
||
|
||
for (; i < timers.length; i++) {
|
||
timer = timers[i]; // Checks the timer has not already been removed
|
||
|
||
if (!timer() && timers[i] === timer) {
|
||
timers.splice(i--, 1);
|
||
}
|
||
}
|
||
|
||
if (!timers.length) {
|
||
jQuery.fx.stop();
|
||
}
|
||
};
|
||
|
||
jQuery.fx.timer = function (timer) {
|
||
if (timer() && jQuery.timers.push(timer) && !timerId) {
|
||
timerId = setInterval(jQuery.fx.tick, jQuery.fx.interval);
|
||
}
|
||
};
|
||
|
||
jQuery.fx.interval = 13;
|
||
|
||
jQuery.fx.stop = function () {
|
||
clearInterval(timerId);
|
||
timerId = null;
|
||
};
|
||
|
||
jQuery.fx.speeds = {
|
||
slow: 600,
|
||
fast: 200,
|
||
// Default speed
|
||
_default: 400
|
||
}; // Back Compat <1.8 extension point
|
||
|
||
jQuery.fx.step = {};
|
||
|
||
if (jQuery.expr && jQuery.expr.filters) {
|
||
jQuery.expr.filters.animated = function (elem) {
|
||
return jQuery.grep(jQuery.timers, function (fn) {
|
||
return elem === fn.elem;
|
||
}).length;
|
||
};
|
||
}
|
||
|
||
var rroot = /^(?:body|html)$/i;
|
||
|
||
jQuery.fn.offset = function (options) {
|
||
if (arguments.length) {
|
||
return options === undefined ? this : this.each(function (i) {
|
||
jQuery.offset.setOffset(this, options, i);
|
||
});
|
||
}
|
||
|
||
var box,
|
||
docElem,
|
||
body,
|
||
win,
|
||
clientTop,
|
||
clientLeft,
|
||
scrollTop,
|
||
scrollLeft,
|
||
top,
|
||
left,
|
||
elem = this[0],
|
||
doc = elem && elem.ownerDocument;
|
||
|
||
if (!doc) {
|
||
return;
|
||
}
|
||
|
||
if ((body = doc.body) === elem) {
|
||
return jQuery.offset.bodyOffset(elem);
|
||
}
|
||
|
||
docElem = doc.documentElement; // Make sure we're not dealing with a disconnected DOM node
|
||
|
||
if (!jQuery.contains(docElem, elem)) {
|
||
return {
|
||
top: 0,
|
||
left: 0
|
||
};
|
||
}
|
||
|
||
box = elem.getBoundingClientRect();
|
||
win = getWindow(doc);
|
||
clientTop = docElem.clientTop || body.clientTop || 0;
|
||
clientLeft = docElem.clientLeft || body.clientLeft || 0;
|
||
scrollTop = win.pageYOffset || docElem.scrollTop;
|
||
scrollLeft = win.pageXOffset || docElem.scrollLeft;
|
||
top = box.top + scrollTop - clientTop;
|
||
left = box.left + scrollLeft - clientLeft;
|
||
return {
|
||
top: top,
|
||
left: left
|
||
};
|
||
};
|
||
|
||
jQuery.offset = {
|
||
bodyOffset: function bodyOffset(body) {
|
||
var top = body.offsetTop,
|
||
left = body.offsetLeft;
|
||
|
||
if (jQuery.support.doesNotIncludeMarginInBodyOffset) {
|
||
top += parseFloat(jQuery.css(body, "marginTop")) || 0;
|
||
left += parseFloat(jQuery.css(body, "marginLeft")) || 0;
|
||
}
|
||
|
||
return {
|
||
top: top,
|
||
left: left
|
||
};
|
||
},
|
||
setOffset: function setOffset(elem, options, i) {
|
||
var position = jQuery.css(elem, "position"); // set position first, in-case top/left are set even on static elem
|
||
|
||
if (position === "static") {
|
||
elem.style.position = "relative";
|
||
}
|
||
|
||
var curElem = jQuery(elem),
|
||
curOffset = curElem.offset(),
|
||
curCSSTop = jQuery.css(elem, "top"),
|
||
curCSSLeft = jQuery.css(elem, "left"),
|
||
calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
|
||
props = {},
|
||
curPosition = {},
|
||
curTop,
|
||
curLeft; // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
|
||
|
||
if (calculatePosition) {
|
||
curPosition = curElem.position();
|
||
curTop = curPosition.top;
|
||
curLeft = curPosition.left;
|
||
} else {
|
||
curTop = parseFloat(curCSSTop) || 0;
|
||
curLeft = parseFloat(curCSSLeft) || 0;
|
||
}
|
||
|
||
if (jQuery.isFunction(options)) {
|
||
options = options.call(elem, i, curOffset);
|
||
}
|
||
|
||
if (options.top != null) {
|
||
props.top = options.top - curOffset.top + curTop;
|
||
}
|
||
|
||
if (options.left != null) {
|
||
props.left = options.left - curOffset.left + curLeft;
|
||
}
|
||
|
||
if ("using" in options) {
|
||
options.using.call(elem, props);
|
||
} else {
|
||
curElem.css(props);
|
||
}
|
||
}
|
||
};
|
||
jQuery.fn.extend({
|
||
position: function position() {
|
||
if (!this[0]) {
|
||
return;
|
||
}
|
||
|
||
var elem = this[0],
|
||
// Get *real* offsetParent
|
||
offsetParent = this.offsetParent(),
|
||
// Get correct offsets
|
||
offset = this.offset(),
|
||
parentOffset = rroot.test(offsetParent[0].nodeName) ? {
|
||
top: 0,
|
||
left: 0
|
||
} : offsetParent.offset(); // Subtract element margins
|
||
// note: when an element has margin: auto the offsetLeft and marginLeft
|
||
// are the same in Safari causing offset.left to incorrectly be 0
|
||
|
||
offset.top -= parseFloat(jQuery.css(elem, "marginTop")) || 0;
|
||
offset.left -= parseFloat(jQuery.css(elem, "marginLeft")) || 0; // Add offsetParent borders
|
||
|
||
parentOffset.top += parseFloat(jQuery.css(offsetParent[0], "borderTopWidth")) || 0;
|
||
parentOffset.left += parseFloat(jQuery.css(offsetParent[0], "borderLeftWidth")) || 0; // Subtract the two offsets
|
||
|
||
return {
|
||
top: offset.top - parentOffset.top,
|
||
left: offset.left - parentOffset.left
|
||
};
|
||
},
|
||
offsetParent: function offsetParent() {
|
||
return this.map(function () {
|
||
var offsetParent = this.offsetParent || document.body;
|
||
|
||
while (offsetParent && !rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") {
|
||
offsetParent = offsetParent.offsetParent;
|
||
}
|
||
|
||
return offsetParent || document.body;
|
||
});
|
||
}
|
||
}); // Create scrollLeft and scrollTop methods
|
||
|
||
jQuery.each({
|
||
scrollLeft: "pageXOffset",
|
||
scrollTop: "pageYOffset"
|
||
}, function (method, prop) {
|
||
var top = /Y/.test(prop);
|
||
|
||
jQuery.fn[method] = function (val) {
|
||
return jQuery.access(this, function (elem, method, val) {
|
||
var win = getWindow(elem);
|
||
|
||
if (val === undefined) {
|
||
return win ? prop in win ? win[prop] : win.document.documentElement[method] : elem[method];
|
||
}
|
||
|
||
if (win) {
|
||
win.scrollTo(!top ? val : jQuery(win).scrollLeft(), top ? val : jQuery(win).scrollTop());
|
||
} else {
|
||
elem[method] = val;
|
||
}
|
||
}, method, val, arguments.length, null);
|
||
};
|
||
});
|
||
|
||
function getWindow(elem) {
|
||
return jQuery.isWindow(elem) ? elem : elem.nodeType === 9 ? elem.defaultView || elem.parentWindow : false;
|
||
} // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
|
||
|
||
|
||
jQuery.each({
|
||
Height: "height",
|
||
Width: "width"
|
||
}, function (name, type) {
|
||
jQuery.each({
|
||
padding: "inner" + name,
|
||
content: type,
|
||
"": "outer" + name
|
||
}, function (defaultExtra, funcName) {
|
||
// margin is only for outerHeight, outerWidth
|
||
jQuery.fn[funcName] = function (margin, value) {
|
||
var chainable = arguments.length && (defaultExtra || typeof margin !== "boolean"),
|
||
extra = defaultExtra || (margin === true || value === true ? "margin" : "border");
|
||
return jQuery.access(this, function (elem, type, value) {
|
||
var doc;
|
||
|
||
if (jQuery.isWindow(elem)) {
|
||
// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
|
||
// isn't a whole lot we can do. See pull request at this URL for discussion:
|
||
// https://github.com/jquery/jquery/pull/764
|
||
return elem.document.documentElement["client" + name];
|
||
} // Get document width or height
|
||
|
||
|
||
if (elem.nodeType === 9) {
|
||
doc = elem.documentElement; // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
|
||
// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
|
||
|
||
return Math.max(elem.body["scroll" + name], doc["scroll" + name], elem.body["offset" + name], doc["offset" + name], doc["client" + name]);
|
||
}
|
||
|
||
return value === undefined ? // Get width or height on the element, requesting but not forcing parseFloat
|
||
jQuery.css(elem, type, value, extra) : // Set width or height on the element
|
||
jQuery.style(elem, type, value, extra);
|
||
}, type, chainable ? margin : undefined, chainable, null);
|
||
};
|
||
});
|
||
}); // Expose jQuery to the global object
|
||
|
||
window.jQuery = window.$ = jQuery; // Expose jQuery as an AMD module, but only for AMD loaders that
|
||
// understand the issues with loading multiple versions of jQuery
|
||
// in a page that all might call define(). The loader will indicate
|
||
// they have special allowances for multiple jQuery versions by
|
||
// specifying define.amd.jQuery = true. Register as a named module,
|
||
// since jQuery can be concatenated with other files that may use define,
|
||
// but not use a proper concatenation script that understands anonymous
|
||
// AMD modules. A named AMD is safest and most robust way to register.
|
||
// Lowercase jquery is used because AMD module names are derived from
|
||
// file names, and jQuery is normally delivered in a lowercase file name.
|
||
// Do this after creating the global so that if an AMD module wants to call
|
||
// noConflict to hide this version of jQuery, it will work.
|
||
|
||
if (typeof define === "function" && define.amd && define.amd.jQuery) {
|
||
define("jquery", [], function () {
|
||
return jQuery;
|
||
});
|
||
}
|
||
})(window);
|
||
|
||
},{}]},{},[3,2,1])
|
||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJ3ZWIvYXBpLWNvbW1vbi9sb2dpbi5qcyIsIndlYi9ib290c3RyYXAvanMvYm9vdHN0cmFwLmpzIiwid2ViL2pzL2pxdWVyeS0xLjguMS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0FDQUEsQ0FBQyxDQUFDLFFBQUQsQ0FBRCxDQUFZLEtBQVosQ0FBa0IsWUFBTTtBQUN0QixFQUFBLENBQUMsQ0FBQyxNQUFELENBQUQsQ0FBVSxPQUFWLENBQWtCLFVBQUMsS0FBRCxFQUFXO0FBQzNCLFFBQUksS0FBSyxDQUFDLE9BQU4sSUFBaUIsRUFBckIsRUFBeUI7QUFDdkIsTUFBQSxLQUFLLENBQUMsY0FBTjtBQUNBLGFBQU8sS0FBUDtBQUNEO0FBQ0YsR0FMRDtBQU9BLEVBQUEsQ0FBQyxDQUFDLFdBQUQsQ0FBRCxDQUFlLE9BQWYsQ0FBdUIsVUFBQyxLQUFELEVBQVc7QUFDaEMsUUFBSSxLQUFLLENBQUMsT0FBTixJQUFpQixFQUFyQixFQUF5QjtBQUN2QixNQUFBLFdBQVc7QUFDWCxhQUFPLEtBQVA7QUFDRDtBQUNGLEdBTEQ7QUFNRCxDQWREOztBQWdCQSxNQUFNLENBQUMsa0JBQVAsR0FBNEIsWUFBTTtBQUNoQyxFQUFBLENBQUMsQ0FBQyxZQUFELENBQUQsQ0FBZ0IsSUFBaEI7QUFDQSxFQUFBLENBQUMsQ0FBQyw0QkFBRCxDQUFELENBQWdDLElBQWhDO0FBQ0QsQ0FIRDs7QUFLQSxNQUFNLENBQUMscUJBQVAsR0FBK0IsWUFBTTtBQUNuQyxFQUFBLENBQUMsQ0FBQyxpQ0FBRCxDQUFELENBQXFDLElBQXJDO0FBQ0EsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLGlCQUFELENBQUQsQ0FBcUIsR0FBckIsRUFBWDs7QUFDQSxNQUFJLEVBQUUsS0FBSyxFQUFYLEVBQWU7QUFDYixXQUFPLEtBQVA7QUFDRDs7QUFDRCxFQUFBLENBQUMsQ0FBQyxJQUFGLENBQU8sYUFBUCxF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SUE3QkksRUE2QkUsU0FBUyxHQUFHLE1BQUgsR0FBWSxTQTdCdkIsRUE2QmtDLFNBN0JsQyxFQTZCNkMsSUE3QjdDLENBQVA7QUE4QkEsT0FsQ0Q7QUFtQ0EsS0FyQ0Q7QUFzQ0EsR0F2Q0QsRUE1Z1MrQixDQW9qUy9COztBQUNBLEVBQUEsTUFBTSxDQUFDLE1BQVAsR0FBZ0IsTUFBTSxDQUFDLENBQVAsR0FBVyxNQUEzQixDQXJqUytCLENBdWpTL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE1BQUssT0FBTyxNQUFQLEtBQWtCLFVBQWxCLElBQWdDLE1BQU0sQ0FBQyxHQUF2QyxJQUE4QyxNQUFNLENBQUMsR0FBUCxDQUFXLE1BQTlELEVBQXVFO0FBQ3RFLElBQUEsTUFBTSxDQUFFLFFBQUYsRUFBWSxFQUFaLEVBQWdCLFlBQVk7QUFBRSxhQUFPLE1BQVA7QUFBZ0IsS0FBOUMsQ0FBTjtBQUNBO0FBRUEsQ0F2a1NELEVBdWtTSSxNQXZrU0oiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCIkKGRvY3VtZW50KS5yZWFkeSgoKSA9PiB7XHJcbiAgJCh3aW5kb3cpLmtleWRvd24oKGV2ZW50KSA9PiB7XHJcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSAxMykge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gICQoJyNwYXNzd29yZCcpLmtleWRvd24oKGV2ZW50KSA9PiB7XHJcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSAxMykge1xyXG4gICAgICBzdWJtaXRMb2dpbigpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn0pO1xyXG5cclxud2luZG93LnNob3dGb3Jnb3RQYXNzd29yZCA9ICgpID0+IHtcclxuICAkKCcjbG9naW5Gb3JtJykuaGlkZSgpO1xyXG4gICQoJyNyZXF1ZXN0UGFzc3dvcmRDaGFuZ2VGb3JtJykuc2hvdygpO1xyXG59O1xyXG5cclxud2luZG93LnJlcXVlc3RQYXNzd29yZENoYW5nZSA9ICgpID0+IHtcclxuICAkKCcjcmVxdWVzdFBhc3N3b3JkQ2hhbmdlRm9ybUFsZXJ0JykuaGlkZSgpO1xyXG4gIGNvbnN0IGlkID0gJCgnI3VzZXJuYW1lQ2hhbmdlJykudmFsKCk7XHJcbiAgaWYgKGlkID09PSAnJykge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICAkLnBvc3QoJ3NlcnZpY2UucGhwJywgeyBhOiAncnBjJywgaWQgfSwgKGRhdGEpID0+IHtcclxuICAgIGlmIChkYXRhLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgJCgnI3JlcXVlc3RQYXNzd29yZENoYW5nZUZvcm1BbGVydCcpLnNob3coKTtcclxuICAgICAgJCgnI3JlcXVlc3RQYXNzd29yZENoYW5nZUZvcm1BbGVydCcpLmh0bWwoZGF0YS5tZXNzYWdlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICQoJyNyZXF1ZXN0UGFzc3dvcmRDaGFuZ2VGb3JtQWxlcnQnKS5zaG93KCk7XHJcbiAgICAgICQoJyNyZXF1ZXN0UGFzc3dvcmRDaGFuZ2VGb3JtQWxlcnQnKS5odG1sKGRhdGEubWVzc2FnZSk7XHJcbiAgICB9XHJcbiAgfSwgJ2pzb24nKTtcclxufTtcclxuXHJcbndpbmRvdy5jaGFuZ2VQYXNzd29yZCA9IChrZXkpID0+IHtcclxuICAkKCcjbmV3UGFzc3dvcmRGb3JtQWxlcnQnKS5oaWRlKCk7XHJcbiAgY29uc3QgcGFzc3dvcmQgPSAkKCcjcGFzc3dvcmQnKS52YWwoKTtcclxuXHJcbiAgY29uc3QgcGFzc3dvcmRWYWxpZGF0aW9uID0gZnVuY3Rpb24gKHN0cikge1xyXG4gICAgcmV0dXJuIHN0ci5sZW5ndGggPiA3O1xyXG4gIH07XHJcblxyXG5cclxuICBpZiAoIXBhc3N3b3JkVmFsaWRhdGlvbihwYXNzd29yZCkpIHtcclxuICAgICQoJyNuZXdQYXNzd29yZEZvcm1BbGVydCcpLnNob3coKTtcclxuICAgICQoJyNuZXdQYXNzd29yZEZvcm1BbGVydCcpLmh0bWwoJ1Bhc3N3b3JkIHNob3VsZCBiZSBsb25nZXIgdGhhbiA3IGNoYXJhY3RlcnMnKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG5cclxuICAkLnBvc3QoJ3NlcnZpY2UucGhwJywge1xyXG4gICAgYTogJ3JzcCcsIGtleSwgcHdkOiBwYXNzd29yZCwgbm93OiAnMScsXHJcbiAgfSwgKGRhdGEpID0+IHtcclxuICAgIGlmIChkYXRhLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgdG9wLmxvY2F0aW9uLmhyZWYgPSAnbG9naW4ucGhwP2M9MSc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAkKCcjbmV3UGFzc3dvcmRGb3JtQWxlcnQnKS5zaG93KCk7XHJcbiAgICAgICQoJyNuZXdQYXNzd29yZEZvcm1BbGVydCcpLmh0bWwoZGF0YS5tZXNzYWdlKTtcclxuICAgIH1cclxuICB9LCAnanNvbicpO1xyXG59O1xyXG5cclxud2luZG93LnN1Ym1pdExvZ2luID0gKCkgPT4ge1xyXG4gIGNvbnN0IHVzZXJuYW1lID0gJCgnI3VzZXJuYW1lJykudmFsKCk7XHJcbiAgY29uc3QgcGFzc3dvcmQgPSAkKCcjcGFzc3dvcmQnKS52YWwoKTtcclxuICBpZiAodXNlcm5hbWUgPT09ICcnIHx8IHBhc3N3b3JkID09PSAnJykge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICB0cnkge1xyXG4gICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XHJcbiAgfSBjYXRjaCAoZSkge31cclxuICAkKCcjbG9naW5Gb3JtJykuc3VibWl0KCk7XHJcbn07XHJcblxyXG53aW5kb3cuYXV0aEdvb2dsZSA9ICgpID0+IHtcclxuICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGAke3dpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCdsb2dpbi5waHAnKVswXX1sb2dpbi5waHA/Z29vZ2xlPTFgO1xyXG59O1xyXG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogYm9vdHN0cmFwLXRyYW5zaXRpb24uanMgdjIuMS4xXHJcbiAqIGh0dHA6Ly90d2l0dGVyLmdpdGh1Yi5jb20vYm9vdHN0cmFwL2phdmFzY3JpcHQuaHRtbCN0cmFuc2l0aW9uc1xyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG5cclxuIWZ1bmN0aW9uICgkKSB7XHJcblxyXG4gICQoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIFwidXNlIHN0cmljdFwiOyAvLyBqc2hpbnQgO187XHJcblxyXG5cclxuICAgIC8qIENTUyBUUkFOU0lUSU9OIFNVUFBPUlQgKGh0dHA6Ly93d3cubW9kZXJuaXpyLmNvbS8pXHJcbiAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gICAgJC5zdXBwb3J0LnRyYW5zaXRpb24gPSAoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgdmFyIHRyYW5zaXRpb25FbmQgPSAoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdib290c3RyYXAnKVxyXG4gICAgICAgICAgLCB0cmFuc0VuZEV2ZW50TmFtZXMgPSB7XHJcbiAgICAgICAgICAgICAgICdXZWJraXRUcmFuc2l0aW9uJyA6ICd3ZWJraXRUcmFuc2l0aW9uRW5kJ1xyXG4gICAgICAgICAgICAsICAnTW96VHJhbnNpdGlvbicgICAgOiAndHJhbnNpdGlvbmVuZCdcclxuICAgICAgICAgICAgLCAgJ09UcmFuc2l0aW9uJyAgICAgIDogJ29UcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kJ1xyXG4gICAgICAgICAgICAsICAndHJhbnNpdGlvbicgICAgICAgOiAndHJhbnNpdGlvbmVuZCdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgLCBuYW1lXHJcblxyXG4gICAgICAgIGZvciAobmFtZSBpbiB0cmFuc0VuZEV2ZW50TmFtZXMpe1xyXG4gICAgICAgICAgaWYgKGVsLnN0eWxlW25hbWVdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRyYW5zRW5kRXZlbnROYW1lc1tuYW1lXVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0oKSlcclxuXHJcbiAgICAgIHJldHVybiB0cmFuc2l0aW9uRW5kICYmIHtcclxuICAgICAgICBlbmQ6IHRyYW5zaXRpb25FbmRcclxuICAgICAgfVxyXG5cclxuICAgIH0pKClcclxuXHJcbiAgfSlcclxuXHJcbn0od2luZG93LmpRdWVyeSk7LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBib290c3RyYXAtYWxlcnQuanMgdjIuMS4xXHJcbiAqIGh0dHA6Ly90d2l0dGVyLmdpdGh1Yi5jb20vYm9vdHN0cmFwL2phdmFzY3JpcHQuaHRtbCNhbGVydHNcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBDb3B5cmlnaHQgMjAxMiBUd2l0dGVyLCBJbmMuXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcblxyXG4hZnVuY3Rpb24gKCQpIHtcclxuXHJcbiAgXCJ1c2Ugc3RyaWN0XCI7IC8vIGpzaGludCA7XztcclxuXHJcblxyXG4gLyogQUxFUlQgQ0xBU1MgREVGSU5JVElPTlxyXG4gICogPT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuICB2YXIgZGlzbWlzcyA9ICdbZGF0YS1kaXNtaXNzPVwiYWxlcnRcIl0nXHJcbiAgICAsIEFsZXJ0ID0gZnVuY3Rpb24gKGVsKSB7XHJcbiAgICAgICAgJChlbCkub24oJ2NsaWNrJywgZGlzbWlzcywgdGhpcy5jbG9zZSlcclxuICAgICAgfVxyXG5cclxuICBBbGVydC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgdmFyICR0aGlzID0gJCh0aGlzKVxyXG4gICAgICAsIHNlbGVjdG9yID0gJHRoaXMuYXR0cignZGF0YS10YXJnZXQnKVxyXG4gICAgICAsICRwYXJlbnRcclxuXHJcbiAgICBpZiAoIXNlbGVjdG9yKSB7XHJcbiAgICAgIHNlbGVjdG9yID0gJHRoaXMuYXR0cignaHJlZicpXHJcbiAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3IgJiYgc2VsZWN0b3IucmVwbGFjZSgvLiooPz0jW15cXHNdKiQpLywgJycpIC8vc3RyaXAgZm9yIGllN1xyXG4gICAgfVxyXG5cclxuICAgICRwYXJlbnQgPSAkKHNlbGVjdG9yKVxyXG5cclxuICAgIGUgJiYgZS5wcmV2ZW50RGVmYXVsdCgpXHJcblxyXG4gICAgJHBhcmVudC5sZW5ndGggfHwgKCRwYXJlbnQgPSAkdGhpcy5oYXNDbGFzcygnYWxlcnQnKSA/ICR0aGlzIDogJHRoaXMucGFyZW50KCkpXHJcblxyXG4gICAgJHBhcmVudC50cmlnZ2VyKGUgPSAkLkV2ZW50KCdjbG9zZScpKVxyXG5cclxuICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm5cclxuXHJcbiAgICAkcGFyZW50LnJlbW92ZUNsYXNzKCdpbicpXHJcblxyXG4gICAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudCgpIHtcclxuICAgICAgJHBhcmVudFxyXG4gICAgICAgIC50cmlnZ2VyKCdjbG9zZWQnKVxyXG4gICAgICAgIC5yZW1vdmUoKVxyXG4gICAgfVxyXG5cclxuICAgICQuc3VwcG9ydC50cmFuc2l0aW9uICYmICRwYXJlbnQuaGFzQ2xhc3MoJ2ZhZGUnKSA/XHJcbiAgICAgICRwYXJlbnQub24oJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLCByZW1vdmVFbGVtZW50KSA6XHJcbiAgICAgIHJlbW92ZUVsZW1lbnQoKVxyXG4gIH1cclxuXHJcblxyXG4gLyogQUxFUlQgUExVR0lOIERFRklOSVRJT05cclxuICAqID09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gICQuZm4uYWxlcnQgPSBmdW5jdGlvbiAob3B0aW9uKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyICR0aGlzID0gJCh0aGlzKVxyXG4gICAgICAgICwgZGF0YSA9ICR0aGlzLmRhdGEoJ2FsZXJ0JylcclxuICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCdhbGVydCcsIChkYXRhID0gbmV3IEFsZXJ0KHRoaXMpKSlcclxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXS5jYWxsKCR0aGlzKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gICQuZm4uYWxlcnQuQ29uc3RydWN0b3IgPSBBbGVydFxyXG5cclxuXHJcbiAvKiBBTEVSVCBEQVRBLUFQSVxyXG4gICogPT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgJChmdW5jdGlvbiAoKSB7XHJcbiAgICAkKCdib2R5Jykub24oJ2NsaWNrLmFsZXJ0LmRhdGEtYXBpJywgZGlzbWlzcywgQWxlcnQucHJvdG90eXBlLmNsb3NlKVxyXG4gIH0pXHJcblxyXG59KHdpbmRvdy5qUXVlcnkpOy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBib290c3RyYXAtYnV0dG9uLmpzIHYyLjEuMVxyXG4gKiBodHRwOi8vdHdpdHRlci5naXRodWIuY29tL2Jvb3RzdHJhcC9qYXZhc2NyaXB0Lmh0bWwjYnV0dG9uc1xyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcblxyXG4hZnVuY3Rpb24gKCQpIHtcclxuXHJcbiAgXCJ1c2Ugc3RyaWN0XCI7IC8vIGpzaGludCA7XztcclxuXHJcblxyXG4gLyogQlVUVE9OIFBVQkxJQyBDTEFTUyBERUZJTklUSU9OXHJcbiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgdmFyIEJ1dHRvbiA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XHJcbiAgICB0aGlzLiRlbGVtZW50ID0gJChlbGVtZW50KVxyXG4gICAgdGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sICQuZm4uYnV0dG9uLmRlZmF1bHRzLCBvcHRpb25zKVxyXG4gIH1cclxuXHJcbiAgQnV0dG9uLnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xyXG4gICAgdmFyIGQgPSAnZGlzYWJsZWQnXHJcbiAgICAgICwgJGVsID0gdGhpcy4kZWxlbWVudFxyXG4gICAgICAsIGRhdGEgPSAkZWwuZGF0YSgpXHJcbiAgICAgICwgdmFsID0gJGVsLmlzKCdpbnB1dCcpID8gJ3ZhbCcgOiAnaHRtbCdcclxuXHJcbiAgICBzdGF0ZSA9IHN0YXRlICsgJ1RleHQnXHJcbiAgICBkYXRhLnJlc2V0VGV4dCB8fCAkZWwuZGF0YSgncmVzZXRUZXh0JywgJGVsW3ZhbF0oKSlcclxuXHJcbiAgICAkZWxbdmFsXShkYXRhW3N0YXRlXSB8fCB0aGlzLm9wdGlvbnNbc3RhdGVdKVxyXG5cclxuICAgIC8vIHB1c2ggdG8gZXZlbnQgbG9vcCB0byBhbGxvdyBmb3JtcyB0byBzdWJtaXRcclxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICBzdGF0ZSA9PSAnbG9hZGluZ1RleHQnID9cclxuICAgICAgICAkZWwuYWRkQ2xhc3MoZCkuYXR0cihkLCBkKSA6XHJcbiAgICAgICAgJGVsLnJlbW92ZUNsYXNzKGQpLnJlbW92ZUF0dHIoZClcclxuICAgIH0sIDApXHJcbiAgfVxyXG5cclxuICBCdXR0b24ucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciAkcGFyZW50ID0gdGhpcy4kZWxlbWVudC5jbG9zZXN0KCdbZGF0YS10b2dnbGU9XCJidXR0b25zLXJhZGlvXCJdJylcclxuXHJcbiAgICAkcGFyZW50ICYmICRwYXJlbnRcclxuICAgICAgLmZpbmQoJy5hY3RpdmUnKVxyXG4gICAgICAucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXHJcblxyXG4gICAgdGhpcy4kZWxlbWVudC50b2dnbGVDbGFzcygnYWN0aXZlJylcclxuICB9XHJcblxyXG5cclxuIC8qIEJVVFRPTiBQTFVHSU4gREVGSU5JVElPTlxyXG4gICogPT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gICQuZm4uYnV0dG9uID0gZnVuY3Rpb24gKG9wdGlvbikge1xyXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuICAgICAgICAsIGRhdGEgPSAkdGhpcy5kYXRhKCdidXR0b24nKVxyXG4gICAgICAgICwgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0aW9uXHJcbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnYnV0dG9uJywgKGRhdGEgPSBuZXcgQnV0dG9uKHRoaXMsIG9wdGlvbnMpKSlcclxuICAgICAgaWYgKG9wdGlvbiA9PSAndG9nZ2xlJykgZGF0YS50b2dnbGUoKVxyXG4gICAgICBlbHNlIGlmIChvcHRpb24pIGRhdGEuc2V0U3RhdGUob3B0aW9uKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gICQuZm4uYnV0dG9uLmRlZmF1bHRzID0ge1xyXG4gICAgbG9hZGluZ1RleHQ6ICdsb2FkaW5nLi4uJ1xyXG4gIH1cclxuXHJcbiAgJC5mbi5idXR0b24uQ29uc3RydWN0b3IgPSBCdXR0b25cclxuXHJcblxyXG4gLyogQlVUVE9OIERBVEEtQVBJXHJcbiAgKiA9PT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgJChmdW5jdGlvbiAoKSB7XHJcbiAgICAkKCdib2R5Jykub24oJ2NsaWNrLmJ1dHRvbi5kYXRhLWFwaScsICdbZGF0YS10b2dnbGVePWJ1dHRvbl0nLCBmdW5jdGlvbiAoIGUgKSB7XHJcbiAgICAgIHZhciAkYnRuID0gJChlLnRhcmdldClcclxuICAgICAgaWYgKCEkYnRuLmhhc0NsYXNzKCdidG4nKSkgJGJ0biA9ICRidG4uY2xvc2VzdCgnLmJ0bicpXHJcbiAgICAgICRidG4uYnV0dG9uKCd0b2dnbGUnKVxyXG4gICAgfSlcclxuICB9KVxyXG5cclxufSh3aW5kb3cualF1ZXJ5KTsvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIGJvb3RzdHJhcC1jYXJvdXNlbC5qcyB2Mi4xLjFcclxuICogaHR0cDovL3R3aXR0ZXIuZ2l0aHViLmNvbS9ib290c3RyYXAvamF2YXNjcmlwdC5odG1sI2Nhcm91c2VsXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG5cclxuIWZ1bmN0aW9uICgkKSB7XHJcblxyXG4gIFwidXNlIHN0cmljdFwiOyAvLyBqc2hpbnQgO187XHJcblxyXG5cclxuIC8qIENBUk9VU0VMIENMQVNTIERFRklOSVRJT05cclxuICAqID09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgdmFyIENhcm91c2VsID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGVsZW1lbnQgPSAkKGVsZW1lbnQpXHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXHJcbiAgICB0aGlzLm9wdGlvbnMuc2xpZGUgJiYgdGhpcy5zbGlkZSh0aGlzLm9wdGlvbnMuc2xpZGUpXHJcbiAgICB0aGlzLm9wdGlvbnMucGF1c2UgPT0gJ2hvdmVyJyAmJiB0aGlzLiRlbGVtZW50XHJcbiAgICAgIC5vbignbW91c2VlbnRlcicsICQucHJveHkodGhpcy5wYXVzZSwgdGhpcykpXHJcbiAgICAgIC5vbignbW91c2VsZWF2ZScsICQucHJveHkodGhpcy5jeWNsZSwgdGhpcykpXHJcbiAgfVxyXG5cclxuICBDYXJvdXNlbC5wcm90b3R5cGUgPSB7XHJcblxyXG4gICAgY3ljbGU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIGlmICghZSkgdGhpcy5wYXVzZWQgPSBmYWxzZVxyXG4gICAgICB0aGlzLm9wdGlvbnMuaW50ZXJ2YWxcclxuICAgICAgICAmJiAhdGhpcy5wYXVzZWRcclxuICAgICAgICAmJiAodGhpcy5pbnRlcnZhbCA9IHNldEludGVydmFsKCQucHJveHkodGhpcy5uZXh0LCB0aGlzKSwgdGhpcy5vcHRpb25zLmludGVydmFsKSlcclxuICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgLCB0bzogZnVuY3Rpb24gKHBvcykge1xyXG4gICAgICB2YXIgJGFjdGl2ZSA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLml0ZW0uYWN0aXZlJylcclxuICAgICAgICAsIGNoaWxkcmVuID0gJGFjdGl2ZS5wYXJlbnQoKS5jaGlsZHJlbigpXHJcbiAgICAgICAgLCBhY3RpdmVQb3MgPSBjaGlsZHJlbi5pbmRleCgkYWN0aXZlKVxyXG4gICAgICAgICwgdGhhdCA9IHRoaXNcclxuXHJcbiAgICAgIGlmIChwb3MgPiAoY2hpbGRyZW4ubGVuZ3RoIC0gMSkgfHwgcG9zIDwgMCkgcmV0dXJuXHJcblxyXG4gICAgICBpZiAodGhpcy5zbGlkaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuJGVsZW1lbnQub25lKCdzbGlkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgdGhhdC50byhwb3MpXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGFjdGl2ZVBvcyA9PSBwb3MpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wYXVzZSgpLmN5Y2xlKClcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuc2xpZGUocG9zID4gYWN0aXZlUG9zID8gJ25leHQnIDogJ3ByZXYnLCAkKGNoaWxkcmVuW3Bvc10pKVxyXG4gICAgfVxyXG5cclxuICAsIHBhdXNlOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICBpZiAoIWUpIHRoaXMucGF1c2VkID0gdHJ1ZVxyXG4gICAgICBpZiAodGhpcy4kZWxlbWVudC5maW5kKCcubmV4dCwgLnByZXYnKS5sZW5ndGggJiYgJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kKSB7XHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZClcclxuICAgICAgICB0aGlzLmN5Y2xlKClcclxuICAgICAgfVxyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpXHJcbiAgICAgIHRoaXMuaW50ZXJ2YWwgPSBudWxsXHJcbiAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICwgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICBpZiAodGhpcy5zbGlkaW5nKSByZXR1cm5cclxuICAgICAgcmV0dXJuIHRoaXMuc2xpZGUoJ25leHQnKVxyXG4gICAgfVxyXG5cclxuICAsIHByZXY6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgaWYgKHRoaXMuc2xpZGluZykgcmV0dXJuXHJcbiAgICAgIHJldHVybiB0aGlzLnNsaWRlKCdwcmV2JylcclxuICAgIH1cclxuXHJcbiAgLCBzbGlkZTogZnVuY3Rpb24gKHR5cGUsIG5leHQpIHtcclxuICAgICAgdmFyICRhY3RpdmUgPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5pdGVtLmFjdGl2ZScpXHJcbiAgICAgICAgLCAkbmV4dCA9IG5leHQgfHwgJGFjdGl2ZVt0eXBlXSgpXHJcbiAgICAgICAgLCBpc0N5Y2xpbmcgPSB0aGlzLmludGVydmFsXHJcbiAgICAgICAgLCBkaXJlY3Rpb24gPSB0eXBlID09ICduZXh0JyA/ICdsZWZ0JyA6ICdyaWdodCdcclxuICAgICAgICAsIGZhbGxiYWNrICA9IHR5cGUgPT0gJ25leHQnID8gJ2ZpcnN0JyA6ICdsYXN0J1xyXG4gICAgICAgICwgdGhhdCA9IHRoaXNcclxuICAgICAgICAsIGUgPSAkLkV2ZW50KCdzbGlkZScsIHtcclxuICAgICAgICAgICAgcmVsYXRlZFRhcmdldDogJG5leHRbMF1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLnNsaWRpbmcgPSB0cnVlXHJcblxyXG4gICAgICBpc0N5Y2xpbmcgJiYgdGhpcy5wYXVzZSgpXHJcblxyXG4gICAgICAkbmV4dCA9ICRuZXh0Lmxlbmd0aCA/ICRuZXh0IDogdGhpcy4kZWxlbWVudC5maW5kKCcuaXRlbScpW2ZhbGxiYWNrXSgpXHJcblxyXG4gICAgICBpZiAoJG5leHQuaGFzQ2xhc3MoJ2FjdGl2ZScpKSByZXR1cm5cclxuXHJcbiAgICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdzbGlkZScpKSB7XHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKGUpXHJcbiAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxyXG4gICAgICAgICRuZXh0LmFkZENsYXNzKHR5cGUpXHJcbiAgICAgICAgJG5leHRbMF0ub2Zmc2V0V2lkdGggLy8gZm9yY2UgcmVmbG93XHJcbiAgICAgICAgJGFjdGl2ZS5hZGRDbGFzcyhkaXJlY3Rpb24pXHJcbiAgICAgICAgJG5leHQuYWRkQ2xhc3MoZGlyZWN0aW9uKVxyXG4gICAgICAgIHRoaXMuJGVsZW1lbnQub25lKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgJG5leHQucmVtb3ZlQ2xhc3MoW3R5cGUsIGRpcmVjdGlvbl0uam9pbignICcpKS5hZGRDbGFzcygnYWN0aXZlJylcclxuICAgICAgICAgICRhY3RpdmUucmVtb3ZlQ2xhc3MoWydhY3RpdmUnLCBkaXJlY3Rpb25dLmpvaW4oJyAnKSlcclxuICAgICAgICAgIHRoYXQuc2xpZGluZyA9IGZhbHNlXHJcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgdGhhdC4kZWxlbWVudC50cmlnZ2VyKCdzbGlkJykgfSwgMClcclxuICAgICAgICB9KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihlKVxyXG4gICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm5cclxuICAgICAgICAkYWN0aXZlLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxyXG4gICAgICAgICRuZXh0LmFkZENsYXNzKCdhY3RpdmUnKVxyXG4gICAgICAgIHRoaXMuc2xpZGluZyA9IGZhbHNlXHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdzbGlkJylcclxuICAgICAgfVxyXG5cclxuICAgICAgaXNDeWNsaW5nICYmIHRoaXMuY3ljbGUoKVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAvKiBDQVJPVVNFTCBQTFVHSU4gREVGSU5JVElPTlxyXG4gICogPT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgJC5mbi5jYXJvdXNlbCA9IGZ1bmN0aW9uIChvcHRpb24pIHtcclxuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpXHJcbiAgICAgICAgLCBkYXRhID0gJHRoaXMuZGF0YSgnY2Fyb3VzZWwnKVxyXG4gICAgICAgICwgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCAkLmZuLmNhcm91c2VsLmRlZmF1bHRzLCB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYmIG9wdGlvbilcclxuICAgICAgICAsIGFjdGlvbiA9IHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycgPyBvcHRpb24gOiBvcHRpb25zLnNsaWRlXHJcbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnY2Fyb3VzZWwnLCAoZGF0YSA9IG5ldyBDYXJvdXNlbCh0aGlzLCBvcHRpb25zKSkpXHJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdudW1iZXInKSBkYXRhLnRvKG9wdGlvbilcclxuICAgICAgZWxzZSBpZiAoYWN0aW9uKSBkYXRhW2FjdGlvbl0oKVxyXG4gICAgICBlbHNlIGlmIChvcHRpb25zLmludGVydmFsKSBkYXRhLmN5Y2xlKClcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAkLmZuLmNhcm91c2VsLmRlZmF1bHRzID0ge1xyXG4gICAgaW50ZXJ2YWw6IDUwMDBcclxuICAsIHBhdXNlOiAnaG92ZXInXHJcbiAgfVxyXG5cclxuICAkLmZuLmNhcm91c2VsLkNvbnN0cnVjdG9yID0gQ2Fyb3VzZWxcclxuXHJcblxyXG4gLyogQ0FST1VTRUwgREFUQS1BUElcclxuICAqID09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gICQoZnVuY3Rpb24gKCkge1xyXG4gICAgJCgnYm9keScpLm9uKCdjbGljay5jYXJvdXNlbC5kYXRhLWFwaScsICdbZGF0YS1zbGlkZV0nLCBmdW5jdGlvbiAoIGUgKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksIGhyZWZcclxuICAgICAgICAsICR0YXJnZXQgPSAkKCR0aGlzLmF0dHIoJ2RhdGEtdGFyZ2V0JykgfHwgKGhyZWYgPSAkdGhpcy5hdHRyKCdocmVmJykpICYmIGhyZWYucmVwbGFjZSgvLiooPz0jW15cXHNdKyQpLywgJycpKSAvL3N0cmlwIGZvciBpZTdcclxuICAgICAgICAsIG9wdGlvbnMgPSAhJHRhcmdldC5kYXRhKCdtb2RhbCcpICYmICQuZXh0ZW5kKHt9LCAkdGFyZ2V0LmRhdGEoKSwgJHRoaXMuZGF0YSgpKVxyXG4gICAgICAkdGFyZ2V0LmNhcm91c2VsKG9wdGlvbnMpXHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgfSlcclxuICB9KVxyXG5cclxufSh3aW5kb3cualF1ZXJ5KTsvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIGJvb3RzdHJhcC1jb2xsYXBzZS5qcyB2Mi4xLjFcclxuICogaHR0cDovL3R3aXR0ZXIuZ2l0aHViLmNvbS9ib290c3RyYXAvamF2YXNjcmlwdC5odG1sI2NvbGxhcHNlXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcblxyXG4hZnVuY3Rpb24gKCQpIHtcclxuXHJcbiAgXCJ1c2Ugc3RyaWN0XCI7IC8vIGpzaGludCA7XztcclxuXHJcblxyXG4gLyogQ09MTEFQU0UgUFVCTElDIENMQVNTIERFRklOSVRJT05cclxuICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gIHZhciBDb2xsYXBzZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XHJcbiAgICB0aGlzLiRlbGVtZW50ID0gJChlbGVtZW50KVxyXG4gICAgdGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sICQuZm4uY29sbGFwc2UuZGVmYXVsdHMsIG9wdGlvbnMpXHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wYXJlbnQpIHtcclxuICAgICAgdGhpcy4kcGFyZW50ID0gJCh0aGlzLm9wdGlvbnMucGFyZW50KVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3B0aW9ucy50b2dnbGUgJiYgdGhpcy50b2dnbGUoKVxyXG4gIH1cclxuXHJcbiAgQ29sbGFwc2UucHJvdG90eXBlID0ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yOiBDb2xsYXBzZVxyXG5cclxuICAsIGRpbWVuc2lvbjogZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgaGFzV2lkdGggPSB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCd3aWR0aCcpXHJcbiAgICAgIHJldHVybiBoYXNXaWR0aCA/ICd3aWR0aCcgOiAnaGVpZ2h0J1xyXG4gICAgfVxyXG5cclxuICAsIHNob3c6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyIGRpbWVuc2lvblxyXG4gICAgICAgICwgc2Nyb2xsXHJcbiAgICAgICAgLCBhY3RpdmVzXHJcbiAgICAgICAgLCBoYXNEYXRhXHJcblxyXG4gICAgICBpZiAodGhpcy50cmFuc2l0aW9uaW5nKSByZXR1cm5cclxuXHJcbiAgICAgIGRpbWVuc2lvbiA9IHRoaXMuZGltZW5zaW9uKClcclxuICAgICAgc2Nyb2xsID0gJC5jYW1lbENhc2UoWydzY3JvbGwnLCBkaW1lbnNpb25dLmpvaW4oJy0nKSlcclxuICAgICAgYWN0aXZlcyA9IHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQuZmluZCgnPiAuYWNjb3JkaW9uLWdyb3VwID4gLmluJylcclxuXHJcbiAgICAgIGlmIChhY3RpdmVzICYmIGFjdGl2ZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgaGFzRGF0YSA9IGFjdGl2ZXMuZGF0YSgnY29sbGFwc2UnKVxyXG4gICAgICAgIGlmIChoYXNEYXRhICYmIGhhc0RhdGEudHJhbnNpdGlvbmluZykgcmV0dXJuXHJcbiAgICAgICAgYWN0aXZlcy5jb2xsYXBzZSgnaGlkZScpXHJcbiAgICAgICAgaGFzRGF0YSB8fCBhY3RpdmVzLmRhdGEoJ2NvbGxhcHNlJywgbnVsbClcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy4kZWxlbWVudFtkaW1lbnNpb25dKDApXHJcbiAgICAgIHRoaXMudHJhbnNpdGlvbignYWRkQ2xhc3MnLCAkLkV2ZW50KCdzaG93JyksICdzaG93bicpXHJcbiAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uICYmIHRoaXMuJGVsZW1lbnRbZGltZW5zaW9uXSh0aGlzLiRlbGVtZW50WzBdW3Njcm9sbF0pXHJcbiAgICB9XHJcblxyXG4gICwgaGlkZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgZGltZW5zaW9uXHJcbiAgICAgIGlmICh0aGlzLnRyYW5zaXRpb25pbmcpIHJldHVyblxyXG4gICAgICBkaW1lbnNpb24gPSB0aGlzLmRpbWVuc2lvbigpXHJcbiAgICAgIHRoaXMucmVzZXQodGhpcy4kZWxlbWVudFtkaW1lbnNpb25dKCkpXHJcbiAgICAgIHRoaXMudHJhbnNpdGlvbigncmVtb3ZlQ2xhc3MnLCAkLkV2ZW50KCdoaWRlJyksICdoaWRkZW4nKVxyXG4gICAgICB0aGlzLiRlbGVtZW50W2RpbWVuc2lvbl0oMClcclxuICAgIH1cclxuXHJcbiAgLCByZXNldDogZnVuY3Rpb24gKHNpemUpIHtcclxuICAgICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuZGltZW5zaW9uKClcclxuXHJcbiAgICAgIHRoaXMuJGVsZW1lbnRcclxuICAgICAgICAucmVtb3ZlQ2xhc3MoJ2NvbGxhcHNlJylcclxuICAgICAgICBbZGltZW5zaW9uXShzaXplIHx8ICdhdXRvJylcclxuICAgICAgICBbMF0ub2Zmc2V0V2lkdGhcclxuXHJcbiAgICAgIHRoaXMuJGVsZW1lbnRbc2l6ZSAhPT0gbnVsbCA/ICdhZGRDbGFzcycgOiAncmVtb3ZlQ2xhc3MnXSgnY29sbGFwc2UnKVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgLCB0cmFuc2l0aW9uOiBmdW5jdGlvbiAobWV0aG9kLCBzdGFydEV2ZW50LCBjb21wbGV0ZUV2ZW50KSB7XHJcbiAgICAgIHZhciB0aGF0ID0gdGhpc1xyXG4gICAgICAgICwgY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChzdGFydEV2ZW50LnR5cGUgPT0gJ3Nob3cnKSB0aGF0LnJlc2V0KClcclxuICAgICAgICAgICAgdGhhdC50cmFuc2l0aW9uaW5nID0gMFxyXG4gICAgICAgICAgICB0aGF0LiRlbGVtZW50LnRyaWdnZXIoY29tcGxldGVFdmVudClcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihzdGFydEV2ZW50KVxyXG5cclxuICAgICAgaWYgKHN0YXJ0RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxyXG5cclxuICAgICAgdGhpcy50cmFuc2l0aW9uaW5nID0gMVxyXG5cclxuICAgICAgdGhpcy4kZWxlbWVudFttZXRob2RdKCdpbicpXHJcblxyXG4gICAgICAkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdjb2xsYXBzZScpID9cclxuICAgICAgICB0aGlzLiRlbGVtZW50Lm9uZSgkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsIGNvbXBsZXRlKSA6XHJcbiAgICAgICAgY29tcGxldGUoKVxyXG4gICAgfVxyXG5cclxuICAsIHRvZ2dsZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICB0aGlzW3RoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2luJykgPyAnaGlkZScgOiAnc2hvdyddKClcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAvKiBDT0xMQVBTSUJMRSBQTFVHSU4gREVGSU5JVElPTlxyXG4gICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gICQuZm4uY29sbGFwc2UgPSBmdW5jdGlvbiAob3B0aW9uKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyICR0aGlzID0gJCh0aGlzKVxyXG4gICAgICAgICwgZGF0YSA9ICR0aGlzLmRhdGEoJ2NvbGxhcHNlJylcclxuICAgICAgICAsIG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYmIG9wdGlvblxyXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2NvbGxhcHNlJywgKGRhdGEgPSBuZXcgQ29sbGFwc2UodGhpcywgb3B0aW9ucykpKVxyXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJykgZGF0YVtvcHRpb25dKClcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAkLmZuLmNvbGxhcHNlLmRlZmF1bHRzID0ge1xyXG4gICAgdG9nZ2xlOiB0cnVlXHJcbiAgfVxyXG5cclxuICAkLmZuLmNvbGxhcHNlLkNvbnN0cnVjdG9yID0gQ29sbGFwc2VcclxuXHJcblxyXG4gLyogQ09MTEFQU0lCTEUgREFUQS1BUElcclxuICAqID09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gICQoZnVuY3Rpb24gKCkge1xyXG4gICAgJCgnYm9keScpLm9uKCdjbGljay5jb2xsYXBzZS5kYXRhLWFwaScsICdbZGF0YS10b2dnbGU9Y29sbGFwc2VdJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgdmFyICR0aGlzID0gJCh0aGlzKSwgaHJlZlxyXG4gICAgICAgICwgdGFyZ2V0ID0gJHRoaXMuYXR0cignZGF0YS10YXJnZXQnKVxyXG4gICAgICAgICAgfHwgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICB8fCAoaHJlZiA9ICR0aGlzLmF0dHIoJ2hyZWYnKSkgJiYgaHJlZi5yZXBsYWNlKC8uKig/PSNbXlxcc10rJCkvLCAnJykgLy9zdHJpcCBmb3IgaWU3XHJcbiAgICAgICAgLCBvcHRpb24gPSAkKHRhcmdldCkuZGF0YSgnY29sbGFwc2UnKSA/ICd0b2dnbGUnIDogJHRoaXMuZGF0YSgpXHJcbiAgICAgICR0aGlzWyQodGFyZ2V0KS5oYXNDbGFzcygnaW4nKSA/ICdhZGRDbGFzcycgOiAncmVtb3ZlQ2xhc3MnXSgnY29sbGFwc2VkJylcclxuICAgICAgJCh0YXJnZXQpLmNvbGxhcHNlKG9wdGlvbilcclxuICAgIH0pXHJcbiAgfSlcclxuXHJcbn0od2luZG93LmpRdWVyeSk7LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIGJvb3RzdHJhcC1kcm9wZG93bi5qcyB2Mi4xLjFcclxuICogaHR0cDovL3R3aXR0ZXIuZ2l0aHViLmNvbS9ib290c3RyYXAvamF2YXNjcmlwdC5odG1sI2Ryb3Bkb3duc1xyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcblxyXG4hZnVuY3Rpb24gKCQpIHtcclxuXHJcbiAgXCJ1c2Ugc3RyaWN0XCI7IC8vIGpzaGludCA7XztcclxuXHJcblxyXG4gLyogRFJPUERPV04gQ0xBU1MgREVGSU5JVElPTlxyXG4gICogPT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuICB2YXIgdG9nZ2xlID0gJ1tkYXRhLXRvZ2dsZT1kcm9wZG93bl0nXHJcbiAgICAsIERyb3Bkb3duID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICB2YXIgJGVsID0gJChlbGVtZW50KS5vbignY2xpY2suZHJvcGRvd24uZGF0YS1hcGknLCB0aGlzLnRvZ2dsZSlcclxuICAgICAgICAkKCdodG1sJykub24oJ2NsaWNrLmRyb3Bkb3duLmRhdGEtYXBpJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgJGVsLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdvcGVuJylcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcblxyXG4gIERyb3Bkb3duLnByb3RvdHlwZSA9IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcjogRHJvcGRvd25cclxuXHJcbiAgLCB0b2dnbGU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuICAgICAgICAsICRwYXJlbnRcclxuICAgICAgICAsIGlzQWN0aXZlXHJcblxyXG4gICAgICBpZiAoJHRoaXMuaXMoJy5kaXNhYmxlZCwgOmRpc2FibGVkJykpIHJldHVyblxyXG5cclxuICAgICAgJHBhcmVudCA9IGdldFBhcmVudCgkdGhpcylcclxuXHJcbiAgICAgIGlzQWN0aXZlID0gJHBhcmVudC5oYXNDbGFzcygnb3BlbicpXHJcblxyXG4gICAgICBjbGVhck1lbnVzKClcclxuXHJcbiAgICAgIGlmICghaXNBY3RpdmUpIHtcclxuICAgICAgICAkcGFyZW50LnRvZ2dsZUNsYXNzKCdvcGVuJylcclxuICAgICAgICAkdGhpcy5mb2N1cygpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfVxyXG5cclxuICAsIGtleWRvd246IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIHZhciAkdGhpc1xyXG4gICAgICAgICwgJGl0ZW1zXHJcbiAgICAgICAgLCAkYWN0aXZlXHJcbiAgICAgICAgLCAkcGFyZW50XHJcbiAgICAgICAgLCBpc0FjdGl2ZVxyXG4gICAgICAgICwgaW5kZXhcclxuXHJcbiAgICAgIGlmICghLygzOHw0MHwyNykvLnRlc3QoZS5rZXlDb2RlKSkgcmV0dXJuXHJcblxyXG4gICAgICAkdGhpcyA9ICQodGhpcylcclxuXHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXHJcblxyXG4gICAgICBpZiAoJHRoaXMuaXMoJy5kaXNhYmxlZCwgOmRpc2FibGVkJykpIHJldHVyblxyXG5cclxuICAgICAgJHBhcmVudCA9IGdldFBhcmVudCgkdGhpcylcclxuXHJcbiAgICAgIGlzQWN0aXZlID0gJHBhcmVudC5oYXNDbGFzcygnb3BlbicpXHJcblxyXG4gICAgICBpZiAoIWlzQWN0aXZlIHx8IChpc0FjdGl2ZSAmJiBlLmtleUNvZGUgPT0gMjcpKSByZXR1cm4gJHRoaXMuY2xpY2soKVxyXG5cclxuICAgICAgJGl0ZW1zID0gJCgnW3JvbGU9bWVudV0gbGk6bm90KC5kaXZpZGVyKSBhJywgJHBhcmVudClcclxuXHJcbiAgICAgIGlmICghJGl0ZW1zLmxlbmd0aCkgcmV0dXJuXHJcblxyXG4gICAgICBpbmRleCA9ICRpdGVtcy5pbmRleCgkaXRlbXMuZmlsdGVyKCc6Zm9jdXMnKSlcclxuXHJcbiAgICAgIGlmIChlLmtleUNvZGUgPT0gMzggJiYgaW5kZXggPiAwKSBpbmRleC0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwXHJcbiAgICAgIGlmIChlLmtleUNvZGUgPT0gNDAgJiYgaW5kZXggPCAkaXRlbXMubGVuZ3RoIC0gMSkgaW5kZXgrKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvd25cclxuICAgICAgaWYgKCF+aW5kZXgpIGluZGV4ID0gMFxyXG5cclxuICAgICAgJGl0ZW1zXHJcbiAgICAgICAgLmVxKGluZGV4KVxyXG4gICAgICAgIC5mb2N1cygpXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gY2xlYXJNZW51cygpIHtcclxuICAgIGdldFBhcmVudCgkKHRvZ2dsZSkpXHJcbiAgICAgIC5yZW1vdmVDbGFzcygnb3BlbicpXHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBnZXRQYXJlbnQoJHRoaXMpIHtcclxuICAgIHZhciBzZWxlY3RvciA9ICR0aGlzLmF0dHIoJ2RhdGEtdGFyZ2V0JylcclxuICAgICAgLCAkcGFyZW50XHJcblxyXG4gICAgaWYgKCFzZWxlY3Rvcikge1xyXG4gICAgICBzZWxlY3RvciA9ICR0aGlzLmF0dHIoJ2hyZWYnKVxyXG4gICAgICBzZWxlY3RvciA9IHNlbGVjdG9yICYmIC8jLy50ZXN0KHNlbGVjdG9yKSAmJiBzZWxlY3Rvci5yZXBsYWNlKC8uKig/PSNbXlxcc10qJCkvLCAnJykgLy9zdHJpcCBmb3IgaWU3XHJcbiAgICB9XHJcblxyXG4gICAgJHBhcmVudCA9ICQoc2VsZWN0b3IpXHJcbiAgICAkcGFyZW50Lmxlbmd0aCB8fCAoJHBhcmVudCA9ICR0aGlzLnBhcmVudCgpKVxyXG5cclxuICAgIHJldHVybiAkcGFyZW50XHJcbiAgfVxyXG5cclxuXHJcbiAgLyogRFJPUERPV04gUExVR0lOIERFRklOSVRJT05cclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuICAkLmZuLmRyb3Bkb3duID0gZnVuY3Rpb24gKG9wdGlvbikge1xyXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuICAgICAgICAsIGRhdGEgPSAkdGhpcy5kYXRhKCdkcm9wZG93bicpXHJcbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnZHJvcGRvd24nLCAoZGF0YSA9IG5ldyBEcm9wZG93bih0aGlzKSkpXHJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0uY2FsbCgkdGhpcylcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAkLmZuLmRyb3Bkb3duLkNvbnN0cnVjdG9yID0gRHJvcGRvd25cclxuXHJcblxyXG4gIC8qIEFQUExZIFRPIFNUQU5EQVJEIERST1BET1dOIEVMRU1FTlRTXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgJChmdW5jdGlvbiAoKSB7XHJcbiAgICAkKCdodG1sJylcclxuICAgICAgLm9uKCdjbGljay5kcm9wZG93bi5kYXRhLUFwaSB0b3VjaHN0YXJ0LmRyb3Bkb3duLmRhdGEtQXBpJywgY2xlYXJNZW51cylcclxuICAgICQoJ2JvZHknKVxyXG4gICAgICAub24oJ2NsaWNrLmRyb3Bkb3duIHRvdWNoc3RhcnQuZHJvcGRvd24uZGF0YS1hcGknLCAnLmRyb3Bkb3duIGZvcm0nLCBmdW5jdGlvbiAoZSkgeyBlLnN0b3BQcm9wYWdhdGlvbigpIH0pXHJcbiAgICAgIC5vbignY2xpY2suZHJvcGRvd24uZGF0YS1BcGkgdG91Y2hzdGFydC5kcm9wZG93bi5kYXRhLUFwaScgICwgdG9nZ2xlLCBEcm9wZG93bi5wcm90b3R5cGUudG9nZ2xlKVxyXG4gICAgICAub24oJ2tleWRvd24uZHJvcGRvd24uZGF0YS1BcGkgdG91Y2hzdGFydC5kcm9wZG93bi5kYXRhLUFwaScsIHRvZ2dsZSArICcsIFtyb2xlPW1lbnVdJyAsIERyb3Bkb3duLnByb3RvdHlwZS5rZXlkb3duKVxyXG4gIH0pXHJcblxyXG59KHdpbmRvdy5qUXVlcnkpOy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBib290c3RyYXAtbW9kYWwuanMgdjIuMS4xXHJcbiAqIGh0dHA6Ly90d2l0dGVyLmdpdGh1Yi5jb20vYm9vdHN0cmFwL2phdmFzY3JpcHQuaHRtbCNtb2RhbHNcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIENvcHlyaWdodCAyMDEyIFR3aXR0ZXIsIEluYy5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG5cclxuIWZ1bmN0aW9uICgkKSB7XHJcblxyXG4gIFwidXNlIHN0cmljdFwiOyAvLyBqc2hpbnQgO187XHJcblxyXG5cclxuIC8qIE1PREFMIENMQVNTIERFRklOSVRJT05cclxuICAqID09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgdmFyIE1vZGFsID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcclxuICAgIHRoaXMuJGVsZW1lbnQgPSAkKGVsZW1lbnQpXHJcbiAgICAgIC5kZWxlZ2F0ZSgnW2RhdGEtZGlzbWlzcz1cIm1vZGFsXCJdJywgJ2NsaWNrLmRpc21pc3MubW9kYWwnLCAkLnByb3h5KHRoaXMuaGlkZSwgdGhpcykpXHJcbiAgICB0aGlzLm9wdGlvbnMucmVtb3RlICYmIHRoaXMuJGVsZW1lbnQuZmluZCgnLm1vZGFsLWJvZHknKS5sb2FkKHRoaXMub3B0aW9ucy5yZW1vdGUpXHJcbiAgfVxyXG5cclxuICBNb2RhbC5wcm90b3R5cGUgPSB7XHJcblxyXG4gICAgICBjb25zdHJ1Y3RvcjogTW9kYWxcclxuXHJcbiAgICAsIHRvZ2dsZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzWyF0aGlzLmlzU2hvd24gPyAnc2hvdycgOiAnaGlkZSddKClcclxuICAgICAgfVxyXG5cclxuICAgICwgc2hvdzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciB0aGF0ID0gdGhpc1xyXG4gICAgICAgICAgLCBlID0gJC5FdmVudCgnc2hvdycpXHJcblxyXG4gICAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihlKVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pc1Nob3duIHx8IGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxyXG5cclxuICAgICAgICAkKCdib2R5JykuYWRkQ2xhc3MoJ21vZGFsLW9wZW4nKVxyXG5cclxuICAgICAgICB0aGlzLmlzU2hvd24gPSB0cnVlXHJcblxyXG4gICAgICAgIHRoaXMuZXNjYXBlKClcclxuXHJcbiAgICAgICAgdGhpcy5iYWNrZHJvcChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICB2YXIgdHJhbnNpdGlvbiA9ICQuc3VwcG9ydC50cmFuc2l0aW9uICYmIHRoYXQuJGVsZW1lbnQuaGFzQ2xhc3MoJ2ZhZGUnKVxyXG5cclxuICAgICAgICAgIGlmICghdGhhdC4kZWxlbWVudC5wYXJlbnQoKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhhdC4kZWxlbWVudC5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KSAvL2Rvbid0IG1vdmUgbW9kYWxzIGRvbSBwb3NpdGlvblxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoYXQuJGVsZW1lbnRcclxuICAgICAgICAgICAgLnNob3coKVxyXG5cclxuICAgICAgICAgIGlmICh0cmFuc2l0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoYXQuJGVsZW1lbnRbMF0ub2Zmc2V0V2lkdGggLy8gZm9yY2UgcmVmbG93XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhhdC4kZWxlbWVudFxyXG4gICAgICAgICAgICAuYWRkQ2xhc3MoJ2luJylcclxuICAgICAgICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgZmFsc2UpXHJcbiAgICAgICAgICAgIC5mb2N1cygpXHJcblxyXG4gICAgICAgICAgdGhhdC5lbmZvcmNlRm9jdXMoKVxyXG5cclxuICAgICAgICAgIHRyYW5zaXRpb24gP1xyXG4gICAgICAgICAgICB0aGF0LiRlbGVtZW50Lm9uZSgkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsIGZ1bmN0aW9uICgpIHsgdGhhdC4kZWxlbWVudC50cmlnZ2VyKCdzaG93bicpIH0pIDpcclxuICAgICAgICAgICAgdGhhdC4kZWxlbWVudC50cmlnZ2VyKCdzaG93bicpXHJcblxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuXHJcbiAgICAsIGhpZGU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgZSAmJiBlLnByZXZlbnREZWZhdWx0KClcclxuXHJcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzXHJcblxyXG4gICAgICAgIGUgPSAkLkV2ZW50KCdoaWRlJylcclxuXHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKGUpXHJcblxyXG4gICAgICAgIGlmICghdGhpcy5pc1Nob3duIHx8IGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxyXG5cclxuICAgICAgICB0aGlzLmlzU2hvd24gPSBmYWxzZVxyXG5cclxuICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ21vZGFsLW9wZW4nKVxyXG5cclxuICAgICAgICB0aGlzLmVzY2FwZSgpXHJcblxyXG4gICAgICAgICQoZG9jdW1lbnQpLm9mZignZm9jdXNpbi5tb2RhbCcpXHJcblxyXG4gICAgICAgIHRoaXMuJGVsZW1lbnRcclxuICAgICAgICAgIC5yZW1vdmVDbGFzcygnaW4nKVxyXG4gICAgICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgdHJ1ZSlcclxuXHJcbiAgICAgICAgJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnZmFkZScpID9cclxuICAgICAgICAgIHRoaXMuaGlkZVdpdGhUcmFuc2l0aW9uKCkgOlxyXG4gICAgICAgICAgdGhpcy5oaWRlTW9kYWwoKVxyXG4gICAgICB9XHJcblxyXG4gICAgLCBlbmZvcmNlRm9jdXM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgdGhhdCA9IHRoaXNcclxuICAgICAgICAkKGRvY3VtZW50KS5vbignZm9jdXNpbi5tb2RhbCcsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICBpZiAodGhhdC4kZWxlbWVudFswXSAhPT0gZS50YXJnZXQgJiYgIXRoYXQuJGVsZW1lbnQuaGFzKGUudGFyZ2V0KS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhhdC4kZWxlbWVudC5mb2N1cygpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG5cclxuICAgICwgZXNjYXBlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzXHJcbiAgICAgICAgaWYgKHRoaXMuaXNTaG93biAmJiB0aGlzLm9wdGlvbnMua2V5Ym9hcmQpIHtcclxuICAgICAgICAgIHRoaXMuJGVsZW1lbnQub24oJ2tleXVwLmRpc21pc3MubW9kYWwnLCBmdW5jdGlvbiAoIGUgKSB7XHJcbiAgICAgICAgICAgIGUud2hpY2ggPT0gMjcgJiYgdGhhdC5oaWRlKClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pc1Nob3duKSB7XHJcbiAgICAgICAgICB0aGlzLiRlbGVtZW50Lm9mZigna2V5dXAuZGlzbWlzcy5tb2RhbCcpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgLCBoaWRlV2l0aFRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgdGhhdCA9IHRoaXNcclxuICAgICAgICAgICwgdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgIHRoYXQuJGVsZW1lbnQub2ZmKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZClcclxuICAgICAgICAgICAgICB0aGF0LmhpZGVNb2RhbCgpXHJcbiAgICAgICAgICAgIH0sIDUwMClcclxuXHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC5vbmUoJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dClcclxuICAgICAgICAgIHRoYXQuaGlkZU1vZGFsKClcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcblxyXG4gICAgLCBoaWRlTW9kYWw6IGZ1bmN0aW9uICh0aGF0KSB7XHJcbiAgICAgICAgdGhpcy4kZWxlbWVudFxyXG4gICAgICAgICAgLmhpZGUoKVxyXG4gICAgICAgICAgLnRyaWdnZXIoJ2hpZGRlbicpXHJcblxyXG4gICAgICAgIHRoaXMuYmFja2Ryb3AoKVxyXG4gICAgICB9XHJcblxyXG4gICAgLCByZW1vdmVCYWNrZHJvcDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuJGJhY2tkcm9wLnJlbW92ZSgpXHJcbiAgICAgICAgdGhpcy4kYmFja2Ryb3AgPSBudWxsXHJcbiAgICAgIH1cclxuXHJcbiAgICAsIGJhY2tkcm9wOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcclxuICAgICAgICB2YXIgdGhhdCA9IHRoaXNcclxuICAgICAgICAgICwgYW5pbWF0ZSA9IHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2ZhZGUnKSA/ICdmYWRlJyA6ICcnXHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzU2hvd24gJiYgdGhpcy5vcHRpb25zLmJhY2tkcm9wKSB7XHJcbiAgICAgICAgICB2YXIgZG9BbmltYXRlID0gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgYW5pbWF0ZVxyXG5cclxuICAgICAgICAgIHRoaXMuJGJhY2tkcm9wID0gJCgnPGRpdiBjbGFzcz1cIm1vZGFsLWJhY2tkcm9wICcgKyBhbmltYXRlICsgJ1wiIC8+JylcclxuICAgICAgICAgICAgLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpXHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5iYWNrZHJvcCAhPSAnc3RhdGljJykge1xyXG4gICAgICAgICAgICB0aGlzLiRiYWNrZHJvcC5jbGljaygkLnByb3h5KHRoaXMuaGlkZSwgdGhpcykpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGRvQW5pbWF0ZSkgdGhpcy4kYmFja2Ryb3BbMF0ub2Zmc2V0V2lkdGggLy8gZm9yY2UgcmVmbG93XHJcblxyXG4gICAgICAgICAgdGhpcy4kYmFja2Ryb3AuYWRkQ2xhc3MoJ2luJylcclxuXHJcbiAgICAgICAgICBkb0FuaW1hdGUgP1xyXG4gICAgICAgICAgICB0aGlzLiRiYWNrZHJvcC5vbmUoJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLCBjYWxsYmFjaykgOlxyXG4gICAgICAgICAgICBjYWxsYmFjaygpXHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNTaG93biAmJiB0aGlzLiRiYWNrZHJvcCkge1xyXG4gICAgICAgICAgdGhpcy4kYmFja2Ryb3AucmVtb3ZlQ2xhc3MoJ2luJylcclxuXHJcbiAgICAgICAgICAkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdmYWRlJyk/XHJcbiAgICAgICAgICAgIHRoaXMuJGJhY2tkcm9wLm9uZSgkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsICQucHJveHkodGhpcy5yZW1vdmVCYWNrZHJvcCwgdGhpcykpIDpcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVCYWNrZHJvcCgpXHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2spIHtcclxuICAgICAgICAgIGNhbGxiYWNrKClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICB9XHJcblxyXG5cclxuIC8qIE1PREFMIFBMVUdJTiBERUZJTklUSU9OXHJcbiAgKiA9PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuICAkLmZuLm1vZGFsID0gZnVuY3Rpb24gKG9wdGlvbikge1xyXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuICAgICAgICAsIGRhdGEgPSAkdGhpcy5kYXRhKCdtb2RhbCcpXHJcbiAgICAgICAgLCBvcHRpb25zID0gJC5leHRlbmQoe30sICQuZm4ubW9kYWwuZGVmYXVsdHMsICR0aGlzLmRhdGEoKSwgdHlwZW9mIG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb24pXHJcbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnbW9kYWwnLCAoZGF0YSA9IG5ldyBNb2RhbCh0aGlzLCBvcHRpb25zKSkpXHJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0oKVxyXG4gICAgICBlbHNlIGlmIChvcHRpb25zLnNob3cpIGRhdGEuc2hvdygpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgJC5mbi5tb2RhbC5kZWZhdWx0cyA9IHtcclxuICAgICAgYmFja2Ryb3A6IHRydWVcclxuICAgICwga2V5Ym9hcmQ6IHRydWVcclxuICAgICwgc2hvdzogdHJ1ZVxyXG4gIH1cclxuXHJcbiAgJC5mbi5tb2RhbC5Db25zdHJ1Y3RvciA9IE1vZGFsXHJcblxyXG5cclxuIC8qIE1PREFMIERBVEEtQVBJXHJcbiAgKiA9PT09PT09PT09PT09PSAqL1xyXG5cclxuICAkKGZ1bmN0aW9uICgpIHtcclxuICAgICQoJ2JvZHknKS5vbignY2xpY2subW9kYWwuZGF0YS1hcGknLCAnW2RhdGEtdG9nZ2xlPVwibW9kYWxcIl0nLCBmdW5jdGlvbiAoIGUgKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuICAgICAgICAsIGhyZWYgPSAkdGhpcy5hdHRyKCdocmVmJylcclxuICAgICAgICAsICR0YXJnZXQgPSAkKCR0aGlzLmF0dHIoJ2RhdGEtdGFyZ2V0JykgfHwgKGhyZWYgJiYgaHJlZi5yZXBsYWNlKC8uKig/PSNbXlxcc10rJCkvLCAnJykpKSAvL3N0cmlwIGZvciBpZTdcclxuICAgICAgICAsIG9wdGlvbiA9ICR0YXJnZXQuZGF0YSgnbW9kYWwnKSA/ICd0b2dnbGUnIDogJC5leHRlbmQoeyByZW1vdGU6ICEvIy8udGVzdChocmVmKSAmJiBocmVmIH0sICR0YXJnZXQuZGF0YSgpLCAkdGhpcy5kYXRhKCkpXHJcblxyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcclxuXHJcbiAgICAgICR0YXJnZXRcclxuICAgICAgICAubW9kYWwob3B0aW9uKVxyXG4gICAgICAgIC5vbmUoJ2hpZGUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAkdGhpcy5mb2N1cygpXHJcbiAgICAgICAgfSlcclxuICAgIH0pXHJcbiAgfSlcclxuXHJcbn0od2luZG93LmpRdWVyeSk7LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogYm9vdHN0cmFwLXRvb2x0aXAuanMgdjIuMS4xXHJcbiAqIGh0dHA6Ly90d2l0dGVyLmdpdGh1Yi5jb20vYm9vdHN0cmFwL2phdmFzY3JpcHQuaHRtbCN0b29sdGlwc1xyXG4gKiBJbnNwaXJlZCBieSB0aGUgb3JpZ2luYWwgalF1ZXJ5LnRpcHN5IGJ5IEphc29uIEZyYW1lXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIENvcHlyaWdodCAyMDEyIFR3aXR0ZXIsIEluYy5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuXHJcbiFmdW5jdGlvbiAoJCkge1xyXG5cclxuICBcInVzZSBzdHJpY3RcIjsgLy8ganNoaW50IDtfO1xyXG5cclxuXHJcbiAvKiBUT09MVElQIFBVQkxJQyBDTEFTUyBERUZJTklUSU9OXHJcbiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gIHZhciBUb29sdGlwID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcclxuICAgIHRoaXMuaW5pdCgndG9vbHRpcCcsIGVsZW1lbnQsIG9wdGlvbnMpXHJcbiAgfVxyXG5cclxuICBUb29sdGlwLnByb3RvdHlwZSA9IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcjogVG9vbHRpcFxyXG5cclxuICAsIGluaXQ6IGZ1bmN0aW9uICh0eXBlLCBlbGVtZW50LCBvcHRpb25zKSB7XHJcbiAgICAgIHZhciBldmVudEluXHJcbiAgICAgICAgLCBldmVudE91dFxyXG5cclxuICAgICAgdGhpcy50eXBlID0gdHlwZVxyXG4gICAgICB0aGlzLiRlbGVtZW50ID0gJChlbGVtZW50KVxyXG4gICAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMob3B0aW9ucylcclxuICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG5cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy50cmlnZ2VyID09ICdjbGljaycpIHtcclxuICAgICAgICB0aGlzLiRlbGVtZW50Lm9uKCdjbGljay4nICsgdGhpcy50eXBlLCB0aGlzLm9wdGlvbnMuc2VsZWN0b3IsICQucHJveHkodGhpcy50b2dnbGUsIHRoaXMpKVxyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy50cmlnZ2VyICE9ICdtYW51YWwnKSB7XHJcbiAgICAgICAgZXZlbnRJbiA9IHRoaXMub3B0aW9ucy50cmlnZ2VyID09ICdob3ZlcicgPyAnbW91c2VlbnRlcicgOiAnZm9jdXMnXHJcbiAgICAgICAgZXZlbnRPdXQgPSB0aGlzLm9wdGlvbnMudHJpZ2dlciA9PSAnaG92ZXInID8gJ21vdXNlbGVhdmUnIDogJ2JsdXInXHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC5vbihldmVudEluICsgJy4nICsgdGhpcy50eXBlLCB0aGlzLm9wdGlvbnMuc2VsZWN0b3IsICQucHJveHkodGhpcy5lbnRlciwgdGhpcykpXHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC5vbihldmVudE91dCArICcuJyArIHRoaXMudHlwZSwgdGhpcy5vcHRpb25zLnNlbGVjdG9yLCAkLnByb3h5KHRoaXMubGVhdmUsIHRoaXMpKVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLm9wdGlvbnMuc2VsZWN0b3IgP1xyXG4gICAgICAgICh0aGlzLl9vcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgeyB0cmlnZ2VyOiAnbWFudWFsJywgc2VsZWN0b3I6ICcnIH0pKSA6XHJcbiAgICAgICAgdGhpcy5maXhUaXRsZSgpXHJcbiAgICB9XHJcblxyXG4gICwgZ2V0T3B0aW9uczogZnVuY3Rpb24gKG9wdGlvbnMpIHtcclxuICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCAkLmZuW3RoaXMudHlwZV0uZGVmYXVsdHMsIG9wdGlvbnMsIHRoaXMuJGVsZW1lbnQuZGF0YSgpKVxyXG5cclxuICAgICAgaWYgKG9wdGlvbnMuZGVsYXkgJiYgdHlwZW9mIG9wdGlvbnMuZGVsYXkgPT0gJ251bWJlcicpIHtcclxuICAgICAgICBvcHRpb25zLmRlbGF5ID0ge1xyXG4gICAgICAgICAgc2hvdzogb3B0aW9ucy5kZWxheVxyXG4gICAgICAgICwgaGlkZTogb3B0aW9ucy5kZWxheVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG9wdGlvbnNcclxuICAgIH1cclxuXHJcbiAgLCBlbnRlcjogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgdmFyIHNlbGYgPSAkKGUuY3VycmVudFRhcmdldClbdGhpcy50eXBlXSh0aGlzLl9vcHRpb25zKS5kYXRhKHRoaXMudHlwZSlcclxuXHJcbiAgICAgIGlmICghc2VsZi5vcHRpb25zLmRlbGF5IHx8ICFzZWxmLm9wdGlvbnMuZGVsYXkuc2hvdykgcmV0dXJuIHNlbGYuc2hvdygpXHJcblxyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KVxyXG4gICAgICBzZWxmLmhvdmVyU3RhdGUgPSAnaW4nXHJcbiAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaWYgKHNlbGYuaG92ZXJTdGF0ZSA9PSAnaW4nKSBzZWxmLnNob3coKVxyXG4gICAgICB9LCBzZWxmLm9wdGlvbnMuZGVsYXkuc2hvdylcclxuICAgIH1cclxuXHJcbiAgLCBsZWF2ZTogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgdmFyIHNlbGYgPSAkKGUuY3VycmVudFRhcmdldClbdGhpcy50eXBlXSh0aGlzLl9vcHRpb25zKS5kYXRhKHRoaXMudHlwZSlcclxuXHJcbiAgICAgIGlmICh0aGlzLnRpbWVvdXQpIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpXHJcbiAgICAgIGlmICghc2VsZi5vcHRpb25zLmRlbGF5IHx8ICFzZWxmLm9wdGlvbnMuZGVsYXkuaGlkZSkgcmV0dXJuIHNlbGYuaGlkZSgpXHJcblxyXG4gICAgICBzZWxmLmhvdmVyU3RhdGUgPSAnb3V0J1xyXG4gICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChzZWxmLmhvdmVyU3RhdGUgPT0gJ291dCcpIHNlbGYuaGlkZSgpXHJcbiAgICAgIH0sIHNlbGYub3B0aW9ucy5kZWxheS5oaWRlKVxyXG4gICAgfVxyXG5cclxuICAsIHNob3c6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyICR0aXBcclxuICAgICAgICAsIGluc2lkZVxyXG4gICAgICAgICwgcG9zXHJcbiAgICAgICAgLCBhY3R1YWxXaWR0aFxyXG4gICAgICAgICwgYWN0dWFsSGVpZ2h0XHJcbiAgICAgICAgLCBwbGFjZW1lbnRcclxuICAgICAgICAsIHRwXHJcblxyXG4gICAgICBpZiAodGhpcy5oYXNDb250ZW50KCkgJiYgdGhpcy5lbmFibGVkKSB7XHJcbiAgICAgICAgJHRpcCA9IHRoaXMudGlwKClcclxuICAgICAgICB0aGlzLnNldENvbnRlbnQoKVxyXG5cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFuaW1hdGlvbikge1xyXG4gICAgICAgICAgJHRpcC5hZGRDbGFzcygnZmFkZScpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwbGFjZW1lbnQgPSB0eXBlb2YgdGhpcy5vcHRpb25zLnBsYWNlbWVudCA9PSAnZnVuY3Rpb24nID9cclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wbGFjZW1lbnQuY2FsbCh0aGlzLCAkdGlwWzBdLCB0aGlzLiRlbGVtZW50WzBdKSA6XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucGxhY2VtZW50XHJcblxyXG4gICAgICAgIGluc2lkZSA9IC9pbi8udGVzdChwbGFjZW1lbnQpXHJcblxyXG4gICAgICAgICR0aXBcclxuICAgICAgICAgIC5yZW1vdmUoKVxyXG4gICAgICAgICAgLmNzcyh7IHRvcDogMCwgbGVmdDogMCwgZGlzcGxheTogJ2Jsb2NrJyB9KVxyXG4gICAgICAgICAgLmFwcGVuZFRvKGluc2lkZSA/IHRoaXMuJGVsZW1lbnQgOiBkb2N1bWVudC5ib2R5KVxyXG5cclxuICAgICAgICBwb3MgPSB0aGlzLmdldFBvc2l0aW9uKGluc2lkZSlcclxuXHJcbiAgICAgICAgYWN0dWFsV2lkdGggPSAkdGlwWzBdLm9mZnNldFdpZHRoXHJcbiAgICAgICAgYWN0dWFsSGVpZ2h0ID0gJHRpcFswXS5vZmZzZXRIZWlnaHRcclxuXHJcbiAgICAgICAgc3dpdGNoIChpbnNpZGUgPyBwbGFjZW1lbnQuc3BsaXQoJyAnKVsxXSA6IHBsYWNlbWVudCkge1xyXG4gICAgICAgICAgY2FzZSAnYm90dG9tJzpcclxuICAgICAgICAgICAgdHAgPSB7dG9wOiBwb3MudG9wICsgcG9zLmhlaWdodCwgbGVmdDogcG9zLmxlZnQgKyBwb3Mud2lkdGggLyAyIC0gYWN0dWFsV2lkdGggLyAyfVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgY2FzZSAndG9wJzpcclxuICAgICAgICAgICAgdHAgPSB7dG9wOiBwb3MudG9wIC0gYWN0dWFsSGVpZ2h0LCBsZWZ0OiBwb3MubGVmdCArIHBvcy53aWR0aCAvIDIgLSBhY3R1YWxXaWR0aCAvIDJ9XHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBjYXNlICdsZWZ0JzpcclxuICAgICAgICAgICAgdHAgPSB7dG9wOiBwb3MudG9wICsgcG9zLmhlaWdodCAvIDIgLSBhY3R1YWxIZWlnaHQgLyAyLCBsZWZ0OiBwb3MubGVmdCAtIGFjdHVhbFdpZHRofVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgY2FzZSAncmlnaHQnOlxyXG4gICAgICAgICAgICB0cCA9IHt0b3A6IHBvcy50b3AgKyBwb3MuaGVpZ2h0IC8gMiAtIGFjdHVhbEhlaWdodCAvIDIsIGxlZnQ6IHBvcy5sZWZ0ICsgcG9zLndpZHRofVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJHRpcFxyXG4gICAgICAgICAgLmNzcyh0cClcclxuICAgICAgICAgIC5hZGRDbGFzcyhwbGFjZW1lbnQpXHJcbiAgICAgICAgICAuYWRkQ2xhc3MoJ2luJylcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAsIHNldENvbnRlbnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyICR0aXAgPSB0aGlzLnRpcCgpXHJcbiAgICAgICAgLCB0aXRsZSA9IHRoaXMuZ2V0VGl0bGUoKVxyXG5cclxuICAgICAgJHRpcC5maW5kKCcudG9vbHRpcC1pbm5lcicpW3RoaXMub3B0aW9ucy5odG1sID8gJ2h0bWwnIDogJ3RleHQnXSh0aXRsZSlcclxuICAgICAgJHRpcC5yZW1vdmVDbGFzcygnZmFkZSBpbiB0b3AgYm90dG9tIGxlZnQgcmlnaHQnKVxyXG4gICAgfVxyXG5cclxuICAsIGhpZGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyIHRoYXQgPSB0aGlzXHJcbiAgICAgICAgLCAkdGlwID0gdGhpcy50aXAoKVxyXG5cclxuICAgICAgJHRpcC5yZW1vdmVDbGFzcygnaW4nKVxyXG5cclxuICAgICAgZnVuY3Rpb24gcmVtb3ZlV2l0aEFuaW1hdGlvbigpIHtcclxuICAgICAgICB2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgJHRpcC5vZmYoJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kKS5yZW1vdmUoKVxyXG4gICAgICAgIH0sIDUwMClcclxuXHJcbiAgICAgICAgJHRpcC5vbmUoJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dClcclxuICAgICAgICAgICR0aXAucmVtb3ZlKClcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcblxyXG4gICAgICAkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGlzLiR0aXAuaGFzQ2xhc3MoJ2ZhZGUnKSA/XHJcbiAgICAgICAgcmVtb3ZlV2l0aEFuaW1hdGlvbigpIDpcclxuICAgICAgICAkdGlwLnJlbW92ZSgpXHJcblxyXG4gICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAsIGZpeFRpdGxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkZSA9IHRoaXMuJGVsZW1lbnRcclxuICAgICAgaWYgKCRlLmF0dHIoJ3RpdGxlJykgfHwgdHlwZW9mKCRlLmF0dHIoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnKSkgIT0gJ3N0cmluZycpIHtcclxuICAgICAgICAkZS5hdHRyKCdkYXRhLW9yaWdpbmFsLXRpdGxlJywgJGUuYXR0cigndGl0bGUnKSB8fCAnJykucmVtb3ZlQXR0cigndGl0bGUnKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICwgaGFzQ29udGVudDogZnVuY3Rpb24gKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRUaXRsZSgpXHJcbiAgICB9XHJcblxyXG4gICwgZ2V0UG9zaXRpb246IGZ1bmN0aW9uIChpbnNpZGUpIHtcclxuICAgICAgcmV0dXJuICQuZXh0ZW5kKHt9LCAoaW5zaWRlID8ge3RvcDogMCwgbGVmdDogMH0gOiB0aGlzLiRlbGVtZW50Lm9mZnNldCgpKSwge1xyXG4gICAgICAgIHdpZHRoOiB0aGlzLiRlbGVtZW50WzBdLm9mZnNldFdpZHRoXHJcbiAgICAgICwgaGVpZ2h0OiB0aGlzLiRlbGVtZW50WzBdLm9mZnNldEhlaWdodFxyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAsIGdldFRpdGxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciB0aXRsZVxyXG4gICAgICAgICwgJGUgPSB0aGlzLiRlbGVtZW50XHJcbiAgICAgICAgLCBvID0gdGhpcy5vcHRpb25zXHJcblxyXG4gICAgICB0aXRsZSA9ICRlLmF0dHIoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnKVxyXG4gICAgICAgIHx8ICh0eXBlb2Ygby50aXRsZSA9PSAnZnVuY3Rpb24nID8gby50aXRsZS5jYWxsKCRlWzBdKSA6ICBvLnRpdGxlKVxyXG5cclxuICAgICAgcmV0dXJuIHRpdGxlXHJcbiAgICB9XHJcblxyXG4gICwgdGlwOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiR0aXAgPSB0aGlzLiR0aXAgfHwgJCh0aGlzLm9wdGlvbnMudGVtcGxhdGUpXHJcbiAgICB9XHJcblxyXG4gICwgdmFsaWRhdGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgaWYgKCF0aGlzLiRlbGVtZW50WzBdLnBhcmVudE5vZGUpIHtcclxuICAgICAgICB0aGlzLmhpZGUoKVxyXG4gICAgICAgIHRoaXMuJGVsZW1lbnQgPSBudWxsXHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gbnVsbFxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICwgZW5hYmxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcclxuICAgIH1cclxuXHJcbiAgLCBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICwgdG9nZ2xlRW5hYmxlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICB0aGlzLmVuYWJsZWQgPSAhdGhpcy5lbmFibGVkXHJcbiAgICB9XHJcblxyXG4gICwgdG9nZ2xlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHRoaXNbdGhpcy50aXAoKS5oYXNDbGFzcygnaW4nKSA/ICdoaWRlJyA6ICdzaG93J10oKVxyXG4gICAgfVxyXG5cclxuICAsIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdGhpcy5oaWRlKCkuJGVsZW1lbnQub2ZmKCcuJyArIHRoaXMudHlwZSkucmVtb3ZlRGF0YSh0aGlzLnR5cGUpXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gLyogVE9PTFRJUCBQTFVHSU4gREVGSU5JVElPTlxyXG4gICogPT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuICAkLmZuLnRvb2x0aXAgPSBmdW5jdGlvbiAoIG9wdGlvbiApIHtcclxuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpXHJcbiAgICAgICAgLCBkYXRhID0gJHRoaXMuZGF0YSgndG9vbHRpcCcpXHJcbiAgICAgICAgLCBvcHRpb25zID0gdHlwZW9mIG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb25cclxuICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCd0b29sdGlwJywgKGRhdGEgPSBuZXcgVG9vbHRpcCh0aGlzLCBvcHRpb25zKSkpXHJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0oKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gICQuZm4udG9vbHRpcC5Db25zdHJ1Y3RvciA9IFRvb2x0aXBcclxuXHJcbiAgJC5mbi50b29sdGlwLmRlZmF1bHRzID0ge1xyXG4gICAgYW5pbWF0aW9uOiB0cnVlXHJcbiAgLCBwbGFjZW1lbnQ6ICd0b3AnXHJcbiAgLCBzZWxlY3RvcjogZmFsc2VcclxuICAsIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz1cInRvb2x0aXBcIj48ZGl2IGNsYXNzPVwidG9vbHRpcC1hcnJvd1wiPjwvZGl2PjxkaXYgY2xhc3M9XCJ0b29sdGlwLWlubmVyXCI+PC9kaXY+PC9kaXY+J1xyXG4gICwgdHJpZ2dlcjogJ2hvdmVyJ1xyXG4gICwgdGl0bGU6ICcnXHJcbiAgLCBkZWxheTogMFxyXG4gICwgaHRtbDogdHJ1ZVxyXG4gIH1cclxuXHJcbn0od2luZG93LmpRdWVyeSk7XHJcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIGJvb3RzdHJhcC1wb3BvdmVyLmpzIHYyLjEuMVxyXG4gKiBodHRwOi8vdHdpdHRlci5naXRodWIuY29tL2Jvb3RzdHJhcC9qYXZhc2NyaXB0Lmh0bWwjcG9wb3ZlcnNcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuXHJcbiFmdW5jdGlvbiAoJCkge1xyXG5cclxuICBcInVzZSBzdHJpY3RcIjsgLy8ganNoaW50IDtfO1xyXG5cclxuXHJcbiAvKiBQT1BPVkVSIFBVQkxJQyBDTEFTUyBERUZJTklUSU9OXHJcbiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gIHZhciBQb3BvdmVyID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcclxuICAgIHRoaXMuaW5pdCgncG9wb3ZlcicsIGVsZW1lbnQsIG9wdGlvbnMpXHJcbiAgfVxyXG5cclxuXHJcbiAgLyogTk9URTogUE9QT1ZFUiBFWFRFTkRTIEJPT1RTVFJBUC1UT09MVElQLmpzXHJcbiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gIFBvcG92ZXIucHJvdG90eXBlID0gJC5leHRlbmQoe30sICQuZm4udG9vbHRpcC5Db25zdHJ1Y3Rvci5wcm90b3R5cGUsIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcjogUG9wb3ZlclxyXG5cclxuICAsIHNldENvbnRlbnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyICR0aXAgPSB0aGlzLnRpcCgpXHJcbiAgICAgICAgLCB0aXRsZSA9IHRoaXMuZ2V0VGl0bGUoKVxyXG4gICAgICAgICwgY29udGVudCA9IHRoaXMuZ2V0Q29udGVudCgpXHJcblxyXG4gICAgICAkdGlwLmZpbmQoJy5wb3BvdmVyLXRpdGxlJylbdGhpcy5vcHRpb25zLmh0bWwgPyAnaHRtbCcgOiAndGV4dCddKHRpdGxlKVxyXG4gICAgICAkdGlwLmZpbmQoJy5wb3BvdmVyLWNvbnRlbnQgPiAqJylbdGhpcy5vcHRpb25zLmh0bWwgPyAnaHRtbCcgOiAndGV4dCddKGNvbnRlbnQpXHJcblxyXG4gICAgICAkdGlwLnJlbW92ZUNsYXNzKCdmYWRlIHRvcCBib3R0b20gbGVmdCByaWdodCBpbicpXHJcbiAgICB9XHJcblxyXG4gICwgaGFzQ29udGVudDogZnVuY3Rpb24gKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRUaXRsZSgpIHx8IHRoaXMuZ2V0Q29udGVudCgpXHJcbiAgICB9XHJcblxyXG4gICwgZ2V0Q29udGVudDogZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgY29udGVudFxyXG4gICAgICAgICwgJGUgPSB0aGlzLiRlbGVtZW50XHJcbiAgICAgICAgLCBvID0gdGhpcy5vcHRpb25zXHJcblxyXG4gICAgICBjb250ZW50ID0gJGUuYXR0cignZGF0YS1jb250ZW50JylcclxuICAgICAgICB8fCAodHlwZW9mIG8uY29udGVudCA9PSAnZnVuY3Rpb24nID8gby5jb250ZW50LmNhbGwoJGVbMF0pIDogIG8uY29udGVudClcclxuXHJcbiAgICAgIHJldHVybiBjb250ZW50XHJcbiAgICB9XHJcblxyXG4gICwgdGlwOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIGlmICghdGhpcy4kdGlwKSB7XHJcbiAgICAgICAgdGhpcy4kdGlwID0gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGUpXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuJHRpcFxyXG4gICAgfVxyXG5cclxuICAsIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdGhpcy5oaWRlKCkuJGVsZW1lbnQub2ZmKCcuJyArIHRoaXMudHlwZSkucmVtb3ZlRGF0YSh0aGlzLnR5cGUpXHJcbiAgICB9XHJcblxyXG4gIH0pXHJcblxyXG5cclxuIC8qIFBPUE9WRVIgUExVR0lOIERFRklOSVRJT05cclxuICAqID09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gICQuZm4ucG9wb3ZlciA9IGZ1bmN0aW9uIChvcHRpb24pIHtcclxuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpXHJcbiAgICAgICAgLCBkYXRhID0gJHRoaXMuZGF0YSgncG9wb3ZlcicpXHJcbiAgICAgICAgLCBvcHRpb25zID0gdHlwZW9mIG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb25cclxuICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCdwb3BvdmVyJywgKGRhdGEgPSBuZXcgUG9wb3Zlcih0aGlzLCBvcHRpb25zKSkpXHJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0oKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gICQuZm4ucG9wb3Zlci5Db25zdHJ1Y3RvciA9IFBvcG92ZXJcclxuXHJcbiAgJC5mbi5wb3BvdmVyLmRlZmF1bHRzID0gJC5leHRlbmQoe30gLCAkLmZuLnRvb2x0aXAuZGVmYXVsdHMsIHtcclxuICAgIHBsYWNlbWVudDogJ3JpZ2h0J1xyXG4gICwgdHJpZ2dlcjogJ2NsaWNrJ1xyXG4gICwgY29udGVudDogJydcclxuICAsIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz1cInBvcG92ZXJcIj48ZGl2IGNsYXNzPVwiYXJyb3dcIj48L2Rpdj48ZGl2IGNsYXNzPVwicG9wb3Zlci1pbm5lclwiPjxoMyBjbGFzcz1cInBvcG92ZXItdGl0bGVcIj48L2gzPjxkaXYgY2xhc3M9XCJwb3BvdmVyLWNvbnRlbnRcIj48cD48L3A+PC9kaXY+PC9kaXY+PC9kaXY+J1xyXG4gIH0pXHJcblxyXG59KHdpbmRvdy5qUXVlcnkpOy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogYm9vdHN0cmFwLXNjcm9sbHNweS5qcyB2Mi4xLjFcclxuICogaHR0cDovL3R3aXR0ZXIuZ2l0aHViLmNvbS9ib290c3RyYXAvamF2YXNjcmlwdC5odG1sI3Njcm9sbHNweVxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIENvcHlyaWdodCAyMDEyIFR3aXR0ZXIsIEluYy5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcblxyXG4hZnVuY3Rpb24gKCQpIHtcclxuXHJcbiAgXCJ1c2Ugc3RyaWN0XCI7IC8vIGpzaGludCA7XztcclxuXHJcblxyXG4gLyogU0NST0xMU1BZIENMQVNTIERFRklOSVRJT05cclxuICAqID09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gIGZ1bmN0aW9uIFNjcm9sbFNweShlbGVtZW50LCBvcHRpb25zKSB7XHJcbiAgICB2YXIgcHJvY2VzcyA9ICQucHJveHkodGhpcy5wcm9jZXNzLCB0aGlzKVxyXG4gICAgICAsICRlbGVtZW50ID0gJChlbGVtZW50KS5pcygnYm9keScpID8gJCh3aW5kb3cpIDogJChlbGVtZW50KVxyXG4gICAgICAsIGhyZWZcclxuICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCAkLmZuLnNjcm9sbHNweS5kZWZhdWx0cywgb3B0aW9ucylcclxuICAgIHRoaXMuJHNjcm9sbEVsZW1lbnQgPSAkZWxlbWVudC5vbignc2Nyb2xsLnNjcm9sbC1zcHkuZGF0YS1hcGknLCBwcm9jZXNzKVxyXG4gICAgdGhpcy5zZWxlY3RvciA9ICh0aGlzLm9wdGlvbnMudGFyZ2V0XHJcbiAgICAgIHx8ICgoaHJlZiA9ICQoZWxlbWVudCkuYXR0cignaHJlZicpKSAmJiBocmVmLnJlcGxhY2UoLy4qKD89I1teXFxzXSskKS8sICcnKSkgLy9zdHJpcCBmb3IgaWU3XHJcbiAgICAgIHx8ICcnKSArICcgLm5hdiBsaSA+IGEnXHJcbiAgICB0aGlzLiRib2R5ID0gJCgnYm9keScpXHJcbiAgICB0aGlzLnJlZnJlc2goKVxyXG4gICAgdGhpcy5wcm9jZXNzKClcclxuICB9XHJcblxyXG4gIFNjcm9sbFNweS5wcm90b3R5cGUgPSB7XHJcblxyXG4gICAgICBjb25zdHJ1Y3RvcjogU2Nyb2xsU3B5XHJcblxyXG4gICAgLCByZWZyZXNoOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzXHJcbiAgICAgICAgICAsICR0YXJnZXRzXHJcblxyXG4gICAgICAgIHRoaXMub2Zmc2V0cyA9ICQoW10pXHJcbiAgICAgICAgdGhpcy50YXJnZXRzID0gJChbXSlcclxuXHJcbiAgICAgICAgJHRhcmdldHMgPSB0aGlzLiRib2R5XHJcbiAgICAgICAgICAuZmluZCh0aGlzLnNlbGVjdG9yKVxyXG4gICAgICAgICAgLm1hcChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciAkZWwgPSAkKHRoaXMpXHJcbiAgICAgICAgICAgICAgLCBocmVmID0gJGVsLmRhdGEoJ3RhcmdldCcpIHx8ICRlbC5hdHRyKCdocmVmJylcclxuICAgICAgICAgICAgICAsICRocmVmID0gL14jXFx3Ly50ZXN0KGhyZWYpICYmICQoaHJlZilcclxuICAgICAgICAgICAgcmV0dXJuICggJGhyZWZcclxuICAgICAgICAgICAgICAmJiAkaHJlZi5sZW5ndGhcclxuICAgICAgICAgICAgICAmJiBbWyAkaHJlZi5wb3NpdGlvbigpLnRvcCwgaHJlZiBdXSApIHx8IG51bGxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYVswXSAtIGJbMF0gfSlcclxuICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgc2VsZi5vZmZzZXRzLnB1c2godGhpc1swXSlcclxuICAgICAgICAgICAgc2VsZi50YXJnZXRzLnB1c2godGhpc1sxXSlcclxuICAgICAgICAgIH0pXHJcbiAgICAgIH1cclxuXHJcbiAgICAsIHByb2Nlc3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy4kc2Nyb2xsRWxlbWVudC5zY3JvbGxUb3AoKSArIHRoaXMub3B0aW9ucy5vZmZzZXRcclxuICAgICAgICAgICwgc2Nyb2xsSGVpZ2h0ID0gdGhpcy4kc2Nyb2xsRWxlbWVudFswXS5zY3JvbGxIZWlnaHQgfHwgdGhpcy4kYm9keVswXS5zY3JvbGxIZWlnaHRcclxuICAgICAgICAgICwgbWF4U2Nyb2xsID0gc2Nyb2xsSGVpZ2h0IC0gdGhpcy4kc2Nyb2xsRWxlbWVudC5oZWlnaHQoKVxyXG4gICAgICAgICAgLCBvZmZzZXRzID0gdGhpcy5vZmZzZXRzXHJcbiAgICAgICAgICAsIHRhcmdldHMgPSB0aGlzLnRhcmdldHNcclxuICAgICAgICAgICwgYWN0aXZlVGFyZ2V0ID0gdGhpcy5hY3RpdmVUYXJnZXRcclxuICAgICAgICAgICwgaVxyXG5cclxuICAgICAgICBpZiAoc2Nyb2xsVG9wID49IG1heFNjcm9sbCkge1xyXG4gICAgICAgICAgcmV0dXJuIGFjdGl2ZVRhcmdldCAhPSAoaSA9IHRhcmdldHMubGFzdCgpWzBdKVxyXG4gICAgICAgICAgICAmJiB0aGlzLmFjdGl2YXRlICggaSApXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGkgPSBvZmZzZXRzLmxlbmd0aDsgaS0tOykge1xyXG4gICAgICAgICAgYWN0aXZlVGFyZ2V0ICE9IHRhcmdldHNbaV1cclxuICAgICAgICAgICAgJiYgc2Nyb2xsVG9wID49IG9mZnNldHNbaV1cclxuICAgICAgICAgICAgJiYgKCFvZmZzZXRzW2kgKyAxXSB8fCBzY3JvbGxUb3AgPD0gb2Zmc2V0c1tpICsgMV0pXHJcbiAgICAgICAgICAgICYmIHRoaXMuYWN0aXZhdGUoIHRhcmdldHNbaV0gKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICwgYWN0aXZhdGU6IGZ1bmN0aW9uICh0YXJnZXQpIHtcclxuICAgICAgICB2YXIgYWN0aXZlXHJcbiAgICAgICAgICAsIHNlbGVjdG9yXHJcblxyXG4gICAgICAgIHRoaXMuYWN0aXZlVGFyZ2V0ID0gdGFyZ2V0XHJcblxyXG4gICAgICAgICQodGhpcy5zZWxlY3RvcilcclxuICAgICAgICAgIC5wYXJlbnQoJy5hY3RpdmUnKVxyXG4gICAgICAgICAgLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxyXG5cclxuICAgICAgICBzZWxlY3RvciA9IHRoaXMuc2VsZWN0b3JcclxuICAgICAgICAgICsgJ1tkYXRhLXRhcmdldD1cIicgKyB0YXJnZXQgKyAnXCJdLCdcclxuICAgICAgICAgICsgdGhpcy5zZWxlY3RvciArICdbaHJlZj1cIicgKyB0YXJnZXQgKyAnXCJdJ1xyXG5cclxuICAgICAgICBhY3RpdmUgPSAkKHNlbGVjdG9yKVxyXG4gICAgICAgICAgLnBhcmVudCgnbGknKVxyXG4gICAgICAgICAgLmFkZENsYXNzKCdhY3RpdmUnKVxyXG5cclxuICAgICAgICBpZiAoYWN0aXZlLnBhcmVudCgnLmRyb3Bkb3duLW1lbnUnKS5sZW5ndGgpICB7XHJcbiAgICAgICAgICBhY3RpdmUgPSBhY3RpdmUuY2xvc2VzdCgnbGkuZHJvcGRvd24nKS5hZGRDbGFzcygnYWN0aXZlJylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFjdGl2ZS50cmlnZ2VyKCdhY3RpdmF0ZScpXHJcbiAgICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAvKiBTQ1JPTExTUFkgUExVR0lOIERFRklOSVRJT05cclxuICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuICAkLmZuLnNjcm9sbHNweSA9IGZ1bmN0aW9uIChvcHRpb24pIHtcclxuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpXHJcbiAgICAgICAgLCBkYXRhID0gJHRoaXMuZGF0YSgnc2Nyb2xsc3B5JylcclxuICAgICAgICAsIG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYmIG9wdGlvblxyXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ3Njcm9sbHNweScsIChkYXRhID0gbmV3IFNjcm9sbFNweSh0aGlzLCBvcHRpb25zKSkpXHJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0oKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gICQuZm4uc2Nyb2xsc3B5LkNvbnN0cnVjdG9yID0gU2Nyb2xsU3B5XHJcblxyXG4gICQuZm4uc2Nyb2xsc3B5LmRlZmF1bHRzID0ge1xyXG4gICAgb2Zmc2V0OiAxMFxyXG4gIH1cclxuXHJcblxyXG4gLyogU0NST0xMU1BZIERBVEEtQVBJXHJcbiAgKiA9PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgJCh3aW5kb3cpLm9uKCdsb2FkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgJCgnW2RhdGEtc3B5PVwic2Nyb2xsXCJdJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkc3B5ID0gJCh0aGlzKVxyXG4gICAgICAkc3B5LnNjcm9sbHNweSgkc3B5LmRhdGEoKSlcclxuICAgIH0pXHJcbiAgfSlcclxuXHJcbn0od2luZG93LmpRdWVyeSk7LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogYm9vdHN0cmFwLXRhYi5qcyB2Mi4xLjFcclxuICogaHR0cDovL3R3aXR0ZXIuZ2l0aHViLmNvbS9ib290c3RyYXAvamF2YXNjcmlwdC5odG1sI3RhYnNcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuXHJcbiFmdW5jdGlvbiAoJCkge1xyXG5cclxuICBcInVzZSBzdHJpY3RcIjsgLy8ganNoaW50IDtfO1xyXG5cclxuXHJcbiAvKiBUQUIgQ0xBU1MgREVGSU5JVElPTlxyXG4gICogPT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgdmFyIFRhYiA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICB0aGlzLmVsZW1lbnQgPSAkKGVsZW1lbnQpXHJcbiAgfVxyXG5cclxuICBUYWIucHJvdG90eXBlID0ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yOiBUYWJcclxuXHJcbiAgLCBzaG93OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9IHRoaXMuZWxlbWVudFxyXG4gICAgICAgICwgJHVsID0gJHRoaXMuY2xvc2VzdCgndWw6bm90KC5kcm9wZG93bi1tZW51KScpXHJcbiAgICAgICAgLCBzZWxlY3RvciA9ICR0aGlzLmF0dHIoJ2RhdGEtdGFyZ2V0JylcclxuICAgICAgICAsIHByZXZpb3VzXHJcbiAgICAgICAgLCAkdGFyZ2V0XHJcbiAgICAgICAgLCBlXHJcblxyXG4gICAgICBpZiAoIXNlbGVjdG9yKSB7XHJcbiAgICAgICAgc2VsZWN0b3IgPSAkdGhpcy5hdHRyKCdocmVmJylcclxuICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yICYmIHNlbGVjdG9yLnJlcGxhY2UoLy4qKD89I1teXFxzXSokKS8sICcnKSAvL3N0cmlwIGZvciBpZTdcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCAkdGhpcy5wYXJlbnQoJ2xpJykuaGFzQ2xhc3MoJ2FjdGl2ZScpICkgcmV0dXJuXHJcblxyXG4gICAgICBwcmV2aW91cyA9ICR1bC5maW5kKCcuYWN0aXZlIGEnKS5sYXN0KClbMF1cclxuXHJcbiAgICAgIGUgPSAkLkV2ZW50KCdzaG93Jywge1xyXG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHByZXZpb3VzXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICAkdGhpcy50cmlnZ2VyKGUpXHJcblxyXG4gICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuXHJcblxyXG4gICAgICAkdGFyZ2V0ID0gJChzZWxlY3RvcilcclxuXHJcbiAgICAgIHRoaXMuYWN0aXZhdGUoJHRoaXMucGFyZW50KCdsaScpLCAkdWwpXHJcbiAgICAgIHRoaXMuYWN0aXZhdGUoJHRhcmdldCwgJHRhcmdldC5wYXJlbnQoKSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICR0aGlzLnRyaWdnZXIoe1xyXG4gICAgICAgICAgdHlwZTogJ3Nob3duJ1xyXG4gICAgICAgICwgcmVsYXRlZFRhcmdldDogcHJldmlvdXNcclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAsIGFjdGl2YXRlOiBmdW5jdGlvbiAoIGVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHtcclxuICAgICAgdmFyICRhY3RpdmUgPSBjb250YWluZXIuZmluZCgnPiAuYWN0aXZlJylcclxuICAgICAgICAsIHRyYW5zaXRpb24gPSBjYWxsYmFja1xyXG4gICAgICAgICAgICAmJiAkLnN1cHBvcnQudHJhbnNpdGlvblxyXG4gICAgICAgICAgICAmJiAkYWN0aXZlLmhhc0NsYXNzKCdmYWRlJylcclxuXHJcbiAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XHJcbiAgICAgICAgJGFjdGl2ZVxyXG4gICAgICAgICAgLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxyXG4gICAgICAgICAgLmZpbmQoJz4gLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlJylcclxuICAgICAgICAgIC5yZW1vdmVDbGFzcygnYWN0aXZlJylcclxuXHJcbiAgICAgICAgZWxlbWVudC5hZGRDbGFzcygnYWN0aXZlJylcclxuXHJcbiAgICAgICAgaWYgKHRyYW5zaXRpb24pIHtcclxuICAgICAgICAgIGVsZW1lbnRbMF0ub2Zmc2V0V2lkdGggLy8gcmVmbG93IGZvciB0cmFuc2l0aW9uXHJcbiAgICAgICAgICBlbGVtZW50LmFkZENsYXNzKCdpbicpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ2ZhZGUnKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCBlbGVtZW50LnBhcmVudCgnLmRyb3Bkb3duLW1lbnUnKSApIHtcclxuICAgICAgICAgIGVsZW1lbnQuY2xvc2VzdCgnbGkuZHJvcGRvd24nKS5hZGRDbGFzcygnYWN0aXZlJylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKClcclxuICAgICAgfVxyXG5cclxuICAgICAgdHJhbnNpdGlvbiA/XHJcbiAgICAgICAgJGFjdGl2ZS5vbmUoJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLCBuZXh0KSA6XHJcbiAgICAgICAgbmV4dCgpXHJcblxyXG4gICAgICAkYWN0aXZlLnJlbW92ZUNsYXNzKCdpbicpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAvKiBUQUIgUExVR0lOIERFRklOSVRJT05cclxuICAqID09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuICAkLmZuLnRhYiA9IGZ1bmN0aW9uICggb3B0aW9uICkge1xyXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuICAgICAgICAsIGRhdGEgPSAkdGhpcy5kYXRhKCd0YWInKVxyXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ3RhYicsIChkYXRhID0gbmV3IFRhYih0aGlzKSkpXHJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0oKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gICQuZm4udGFiLkNvbnN0cnVjdG9yID0gVGFiXHJcblxyXG5cclxuIC8qIFRBQiBEQVRBLUFQSVxyXG4gICogPT09PT09PT09PT09ICovXHJcblxyXG4gICQoZnVuY3Rpb24gKCkge1xyXG4gICAgJCgnYm9keScpLm9uKCdjbGljay50YWIuZGF0YS1hcGknLCAnW2RhdGEtdG9nZ2xlPVwidGFiXCJdLCBbZGF0YS10b2dnbGU9XCJwaWxsXCJdJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICQodGhpcykudGFiKCdzaG93JylcclxuICAgIH0pXHJcbiAgfSlcclxuXHJcbn0od2luZG93LmpRdWVyeSk7LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBib290c3RyYXAtdHlwZWFoZWFkLmpzIHYyLjEuMVxyXG4gKiBodHRwOi8vdHdpdHRlci5naXRodWIuY29tL2Jvb3RzdHJhcC9qYXZhc2NyaXB0Lmh0bWwjdHlwZWFoZWFkXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcblxyXG4hZnVuY3Rpb24oJCl7XHJcblxyXG4gIFwidXNlIHN0cmljdFwiOyAvLyBqc2hpbnQgO187XHJcblxyXG5cclxuIC8qIFRZUEVBSEVBRCBQVUJMSUMgQ0xBU1MgREVGSU5JVElPTlxyXG4gICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gIHZhciBUeXBlYWhlYWQgPSBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykge1xyXG4gICAgdGhpcy4kZWxlbWVudCA9ICQoZWxlbWVudClcclxuICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCAkLmZuLnR5cGVhaGVhZC5kZWZhdWx0cywgb3B0aW9ucylcclxuICAgIHRoaXMubWF0Y2hlciA9IHRoaXMub3B0aW9ucy5tYXRjaGVyIHx8IHRoaXMubWF0Y2hlclxyXG4gICAgdGhpcy5zb3J0ZXIgPSB0aGlzLm9wdGlvbnMuc29ydGVyIHx8IHRoaXMuc29ydGVyXHJcbiAgICB0aGlzLmhpZ2hsaWdodGVyID0gdGhpcy5vcHRpb25zLmhpZ2hsaWdodGVyIHx8IHRoaXMuaGlnaGxpZ2h0ZXJcclxuICAgIHRoaXMudXBkYXRlciA9IHRoaXMub3B0aW9ucy51cGRhdGVyIHx8IHRoaXMudXBkYXRlclxyXG4gICAgdGhpcy4kbWVudSA9ICQodGhpcy5vcHRpb25zLm1lbnUpLmFwcGVuZFRvKCdib2R5JylcclxuICAgIHRoaXMuc291cmNlID0gdGhpcy5vcHRpb25zLnNvdXJjZVxyXG4gICAgdGhpcy5zaG93biA9IGZhbHNlXHJcbiAgICB0aGlzLmxpc3RlbigpXHJcbiAgfVxyXG5cclxuICBUeXBlYWhlYWQucHJvdG90eXBlID0ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yOiBUeXBlYWhlYWRcclxuXHJcbiAgLCBzZWxlY3Q6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyIHZhbCA9IHRoaXMuJG1lbnUuZmluZCgnLmFjdGl2ZScpLmF0dHIoJ2RhdGEtdmFsdWUnKVxyXG4gICAgICB0aGlzLiRlbGVtZW50XHJcbiAgICAgICAgLnZhbCh0aGlzLnVwZGF0ZXIodmFsKSlcclxuICAgICAgICAuY2hhbmdlKClcclxuICAgICAgcmV0dXJuIHRoaXMuaGlkZSgpXHJcbiAgICB9XHJcblxyXG4gICwgdXBkYXRlcjogZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgcmV0dXJuIGl0ZW1cclxuICAgIH1cclxuXHJcbiAgLCBzaG93OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciBwb3MgPSAkLmV4dGVuZCh7fSwgdGhpcy4kZWxlbWVudC5vZmZzZXQoKSwge1xyXG4gICAgICAgIGhlaWdodDogdGhpcy4kZWxlbWVudFswXS5vZmZzZXRIZWlnaHRcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuJG1lbnUuY3NzKHtcclxuICAgICAgICB0b3A6IHBvcy50b3AgKyBwb3MuaGVpZ2h0XHJcbiAgICAgICwgbGVmdDogcG9zLmxlZnRcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuJG1lbnUuc2hvdygpXHJcbiAgICAgIHRoaXMuc2hvd24gPSB0cnVlXHJcbiAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICwgaGlkZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICB0aGlzLiRtZW51LmhpZGUoKVxyXG4gICAgICB0aGlzLnNob3duID0gZmFsc2VcclxuICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgLCBsb29rdXA6IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICB2YXIgaXRlbXNcclxuXHJcbiAgICAgIHRoaXMucXVlcnkgPSB0aGlzLiRlbGVtZW50LnZhbCgpXHJcblxyXG4gICAgICBpZiAoIXRoaXMucXVlcnkgfHwgdGhpcy5xdWVyeS5sZW5ndGggPCB0aGlzLm9wdGlvbnMubWluTGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvd24gPyB0aGlzLmhpZGUoKSA6IHRoaXNcclxuICAgICAgfVxyXG5cclxuICAgICAgaXRlbXMgPSAkLmlzRnVuY3Rpb24odGhpcy5zb3VyY2UpID8gdGhpcy5zb3VyY2UodGhpcy5xdWVyeSwgJC5wcm94eSh0aGlzLnByb2Nlc3MsIHRoaXMpKSA6IHRoaXMuc291cmNlXHJcblxyXG4gICAgICByZXR1cm4gaXRlbXMgPyB0aGlzLnByb2Nlc3MoaXRlbXMpIDogdGhpc1xyXG4gICAgfVxyXG5cclxuICAsIHByb2Nlc3M6IGZ1bmN0aW9uIChpdGVtcykge1xyXG4gICAgICB2YXIgdGhhdCA9IHRoaXNcclxuXHJcbiAgICAgIGl0ZW1zID0gJC5ncmVwKGl0ZW1zLCBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgIHJldHVybiB0aGF0Lm1hdGNoZXIoaXRlbSlcclxuICAgICAgfSlcclxuXHJcbiAgICAgIGl0ZW1zID0gdGhpcy5zb3J0ZXIoaXRlbXMpXHJcblxyXG4gICAgICBpZiAoIWl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlcihpdGVtcy5zbGljZSgwLCB0aGlzLm9wdGlvbnMuaXRlbXMpKS5zaG93KClcclxuICAgIH1cclxuXHJcbiAgLCBtYXRjaGVyOiBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICByZXR1cm4gfml0ZW0udG9Mb3dlckNhc2UoKS5pbmRleE9mKHRoaXMucXVlcnkudG9Mb3dlckNhc2UoKSlcclxuICAgIH1cclxuXHJcbiAgLCBzb3J0ZXI6IGZ1bmN0aW9uIChpdGVtcykge1xyXG4gICAgICB2YXIgYmVnaW5zd2l0aCA9IFtdXHJcbiAgICAgICAgLCBjYXNlU2Vuc2l0aXZlID0gW11cclxuICAgICAgICAsIGNhc2VJbnNlbnNpdGl2ZSA9IFtdXHJcbiAgICAgICAgLCBpdGVtXHJcblxyXG4gICAgICB3aGlsZSAoaXRlbSA9IGl0ZW1zLnNoaWZ0KCkpIHtcclxuICAgICAgICBpZiAoIWl0ZW0udG9Mb3dlckNhc2UoKS5pbmRleE9mKHRoaXMucXVlcnkudG9Mb3dlckNhc2UoKSkpIGJlZ2luc3dpdGgucHVzaChpdGVtKVxyXG4gICAgICAgIGVsc2UgaWYgKH5pdGVtLmluZGV4T2YodGhpcy5xdWVyeSkpIGNhc2VTZW5zaXRpdmUucHVzaChpdGVtKVxyXG4gICAgICAgIGVsc2UgY2FzZUluc2Vuc2l0aXZlLnB1c2goaXRlbSlcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGJlZ2luc3dpdGguY29uY2F0KGNhc2VTZW5zaXRpdmUsIGNhc2VJbnNlbnNpdGl2ZSlcclxuICAgIH1cclxuXHJcbiAgLCBoaWdobGlnaHRlcjogZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgdmFyIHF1ZXJ5ID0gdGhpcy5xdWVyeS5yZXBsYWNlKC9bXFwtXFxbXFxde30oKSorPy4sXFxcXFxcXiR8I1xcc10vZywgJ1xcXFwkJicpXHJcbiAgICAgIHJldHVybiBpdGVtLnJlcGxhY2UobmV3IFJlZ0V4cCgnKCcgKyBxdWVyeSArICcpJywgJ2lnJyksIGZ1bmN0aW9uICgkMSwgbWF0Y2gpIHtcclxuICAgICAgICByZXR1cm4gJzxzdHJvbmc+JyArIG1hdGNoICsgJzwvc3Ryb25nPidcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgLCByZW5kZXI6IGZ1bmN0aW9uIChpdGVtcykge1xyXG4gICAgICB2YXIgdGhhdCA9IHRoaXNcclxuXHJcbiAgICAgIGl0ZW1zID0gJChpdGVtcykubWFwKGZ1bmN0aW9uIChpLCBpdGVtKSB7XHJcbiAgICAgICAgaSA9ICQodGhhdC5vcHRpb25zLml0ZW0pLmF0dHIoJ2RhdGEtdmFsdWUnLCBpdGVtKVxyXG4gICAgICAgIGkuZmluZCgnYScpLmh0bWwodGhhdC5oaWdobGlnaHRlcihpdGVtKSlcclxuICAgICAgICByZXR1cm4gaVswXVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgaXRlbXMuZmlyc3QoKS5hZGRDbGFzcygnYWN0aXZlJylcclxuICAgICAgdGhpcy4kbWVudS5odG1sKGl0ZW1zKVxyXG4gICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAsIG5leHQ6IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICB2YXIgYWN0aXZlID0gdGhpcy4kbWVudS5maW5kKCcuYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXHJcbiAgICAgICAgLCBuZXh0ID0gYWN0aXZlLm5leHQoKVxyXG5cclxuICAgICAgaWYgKCFuZXh0Lmxlbmd0aCkge1xyXG4gICAgICAgIG5leHQgPSAkKHRoaXMuJG1lbnUuZmluZCgnbGknKVswXSlcclxuICAgICAgfVxyXG5cclxuICAgICAgbmV4dC5hZGRDbGFzcygnYWN0aXZlJylcclxuICAgIH1cclxuXHJcbiAgLCBwcmV2OiBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgdmFyIGFjdGl2ZSA9IHRoaXMuJG1lbnUuZmluZCgnLmFjdGl2ZScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxyXG4gICAgICAgICwgcHJldiA9IGFjdGl2ZS5wcmV2KClcclxuXHJcbiAgICAgIGlmICghcHJldi5sZW5ndGgpIHtcclxuICAgICAgICBwcmV2ID0gdGhpcy4kbWVudS5maW5kKCdsaScpLmxhc3QoKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBwcmV2LmFkZENsYXNzKCdhY3RpdmUnKVxyXG4gICAgfVxyXG5cclxuICAsIGxpc3RlbjogZnVuY3Rpb24gKCkge1xyXG4gICAgICB0aGlzLiRlbGVtZW50XHJcbiAgICAgICAgLm9uKCdibHVyJywgICAgICQucHJveHkodGhpcy5ibHVyLCB0aGlzKSlcclxuICAgICAgICAub24oJ2tleXByZXNzJywgJC5wcm94eSh0aGlzLmtleXByZXNzLCB0aGlzKSlcclxuICAgICAgICAub24oJ2tleXVwJywgICAgJC5wcm94eSh0aGlzLmtleXVwLCB0aGlzKSlcclxuXHJcbiAgICAgIGlmICgkLmJyb3dzZXIuY2hyb21lIHx8ICQuYnJvd3Nlci53ZWJraXQgfHwgJC5icm93c2VyLm1zaWUpIHtcclxuICAgICAgICB0aGlzLiRlbGVtZW50Lm9uKCdrZXlkb3duJywgJC5wcm94eSh0aGlzLmtleWRvd24sIHRoaXMpKVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLiRtZW51XHJcbiAgICAgICAgLm9uKCdjbGljaycsICQucHJveHkodGhpcy5jbGljaywgdGhpcykpXHJcbiAgICAgICAgLm9uKCdtb3VzZWVudGVyJywgJ2xpJywgJC5wcm94eSh0aGlzLm1vdXNlZW50ZXIsIHRoaXMpKVxyXG4gICAgfVxyXG5cclxuICAsIG1vdmU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIGlmICghdGhpcy5zaG93bikgcmV0dXJuXHJcblxyXG4gICAgICBzd2l0Y2goZS5rZXlDb2RlKSB7XHJcbiAgICAgICAgY2FzZSA5OiAvLyB0YWJcclxuICAgICAgICBjYXNlIDEzOiAvLyBlbnRlclxyXG4gICAgICAgIGNhc2UgMjc6IC8vIGVzY2FwZVxyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICBjYXNlIDM4OiAvLyB1cCBhcnJvd1xyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICB0aGlzLnByZXYoKVxyXG4gICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgY2FzZSA0MDogLy8gZG93biBhcnJvd1xyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICB0aGlzLm5leHQoKVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG5cclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgfVxyXG5cclxuICAsIGtleWRvd246IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIHRoaXMuc3VwcHJlc3NLZXlQcmVzc1JlcGVhdCA9ICF+JC5pbkFycmF5KGUua2V5Q29kZSwgWzQwLDM4LDksMTMsMjddKVxyXG4gICAgICB0aGlzLm1vdmUoZSlcclxuICAgIH1cclxuXHJcbiAgLCBrZXlwcmVzczogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgaWYgKHRoaXMuc3VwcHJlc3NLZXlQcmVzc1JlcGVhdCkgcmV0dXJuXHJcbiAgICAgIHRoaXMubW92ZShlKVxyXG4gICAgfVxyXG5cclxuICAsIGtleXVwOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICBzd2l0Y2goZS5rZXlDb2RlKSB7XHJcbiAgICAgICAgY2FzZSA0MDogLy8gZG93biBhcnJvd1xyXG4gICAgICAgIGNhc2UgMzg6IC8vIHVwIGFycm93XHJcbiAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICBjYXNlIDk6IC8vIHRhYlxyXG4gICAgICAgIGNhc2UgMTM6IC8vIGVudGVyXHJcbiAgICAgICAgICBpZiAoIXRoaXMuc2hvd24pIHJldHVyblxyXG4gICAgICAgICAgdGhpcy5zZWxlY3QoKVxyXG4gICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgY2FzZSAyNzogLy8gZXNjYXBlXHJcbiAgICAgICAgICBpZiAoIXRoaXMuc2hvd24pIHJldHVyblxyXG4gICAgICAgICAgdGhpcy5oaWRlKClcclxuICAgICAgICAgIGJyZWFrXHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0aGlzLmxvb2t1cCgpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgfVxyXG5cclxuICAsIGJsdXI6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIHZhciB0aGF0ID0gdGhpc1xyXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgdGhhdC5oaWRlKCkgfSwgMTUwKVxyXG4gICAgfVxyXG5cclxuICAsIGNsaWNrOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgICB0aGlzLnNlbGVjdCgpXHJcbiAgICB9XHJcblxyXG4gICwgbW91c2VlbnRlcjogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgdGhpcy4kbWVudS5maW5kKCcuYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXHJcbiAgICAgICQoZS5jdXJyZW50VGFyZ2V0KS5hZGRDbGFzcygnYWN0aXZlJylcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLyogVFlQRUFIRUFEIFBMVUdJTiBERUZJTklUSU9OXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gICQuZm4udHlwZWFoZWFkID0gZnVuY3Rpb24gKG9wdGlvbikge1xyXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuICAgICAgICAsIGRhdGEgPSAkdGhpcy5kYXRhKCd0eXBlYWhlYWQnKVxyXG4gICAgICAgICwgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0aW9uXHJcbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgndHlwZWFoZWFkJywgKGRhdGEgPSBuZXcgVHlwZWFoZWFkKHRoaXMsIG9wdGlvbnMpKSlcclxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXSgpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgJC5mbi50eXBlYWhlYWQuZGVmYXVsdHMgPSB7XHJcbiAgICBzb3VyY2U6IFtdXHJcbiAgLCBpdGVtczogOFxyXG4gICwgbWVudTogJzx1bCBjbGFzcz1cInR5cGVhaGVhZCBkcm9wZG93bi1tZW51XCI+PC91bD4nXHJcbiAgLCBpdGVtOiAnPGxpPjxhIGhyZWY9XCIjXCI+PC9hPjwvbGk+J1xyXG4gICwgbWluTGVuZ3RoOiAxXHJcbiAgfVxyXG5cclxuICAkLmZuLnR5cGVhaGVhZC5Db25zdHJ1Y3RvciA9IFR5cGVhaGVhZFxyXG5cclxuXHJcbiAvKiAgIFRZUEVBSEVBRCBEQVRBLUFQSVxyXG4gICogPT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gICQoZnVuY3Rpb24gKCkge1xyXG4gICAgJCgnYm9keScpLm9uKCdmb2N1cy50eXBlYWhlYWQuZGF0YS1hcGknLCAnW2RhdGEtcHJvdmlkZT1cInR5cGVhaGVhZFwiXScsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuICAgICAgaWYgKCR0aGlzLmRhdGEoJ3R5cGVhaGVhZCcpKSByZXR1cm5cclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICR0aGlzLnR5cGVhaGVhZCgkdGhpcy5kYXRhKCkpXHJcbiAgICB9KVxyXG4gIH0pXHJcblxyXG59KHdpbmRvdy5qUXVlcnkpO1xyXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIGJvb3RzdHJhcC1hZmZpeC5qcyB2Mi4xLjFcclxuICogaHR0cDovL3R3aXR0ZXIuZ2l0aHViLmNvbS9ib290c3RyYXAvamF2YXNjcmlwdC5odG1sI2FmZml4XHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG5cclxuIWZ1bmN0aW9uICgkKSB7XHJcblxyXG4gIFwidXNlIHN0cmljdFwiOyAvLyBqc2hpbnQgO187XHJcblxyXG5cclxuIC8qIEFGRklYIENMQVNTIERFRklOSVRJT05cclxuICAqID09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgdmFyIEFmZml4ID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCAkLmZuLmFmZml4LmRlZmF1bHRzLCBvcHRpb25zKVxyXG4gICAgdGhpcy4kd2luZG93ID0gJCh3aW5kb3cpLm9uKCdzY3JvbGwuYWZmaXguZGF0YS1hcGknLCAkLnByb3h5KHRoaXMuY2hlY2tQb3NpdGlvbiwgdGhpcykpXHJcbiAgICB0aGlzLiRlbGVtZW50ID0gJChlbGVtZW50KVxyXG4gICAgdGhpcy5jaGVja1Bvc2l0aW9uKClcclxuICB9XHJcblxyXG4gIEFmZml4LnByb3RvdHlwZS5jaGVja1Bvc2l0aW9uID0gZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKCF0aGlzLiRlbGVtZW50LmlzKCc6dmlzaWJsZScpKSByZXR1cm5cclxuXHJcbiAgICB2YXIgc2Nyb2xsSGVpZ2h0ID0gJChkb2N1bWVudCkuaGVpZ2h0KClcclxuICAgICAgLCBzY3JvbGxUb3AgPSB0aGlzLiR3aW5kb3cuc2Nyb2xsVG9wKClcclxuICAgICAgLCBwb3NpdGlvbiA9IHRoaXMuJGVsZW1lbnQub2Zmc2V0KClcclxuICAgICAgLCBvZmZzZXQgPSB0aGlzLm9wdGlvbnMub2Zmc2V0XHJcbiAgICAgICwgb2Zmc2V0Qm90dG9tID0gb2Zmc2V0LmJvdHRvbVxyXG4gICAgICAsIG9mZnNldFRvcCA9IG9mZnNldC50b3BcclxuICAgICAgLCByZXNldCA9ICdhZmZpeCBhZmZpeC10b3AgYWZmaXgtYm90dG9tJ1xyXG4gICAgICAsIGFmZml4XHJcblxyXG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgIT0gJ29iamVjdCcpIG9mZnNldEJvdHRvbSA9IG9mZnNldFRvcCA9IG9mZnNldFxyXG4gICAgaWYgKHR5cGVvZiBvZmZzZXRUb3AgPT0gJ2Z1bmN0aW9uJykgb2Zmc2V0VG9wID0gb2Zmc2V0LnRvcCgpXHJcbiAgICBpZiAodHlwZW9mIG9mZnNldEJvdHRvbSA9PSAnZnVuY3Rpb24nKSBvZmZzZXRCb3R0b20gPSBvZmZzZXQuYm90dG9tKClcclxuXHJcbiAgICBhZmZpeCA9IHRoaXMudW5waW4gIT0gbnVsbCAmJiAoc2Nyb2xsVG9wICsgdGhpcy51bnBpbiA8PSBwb3NpdGlvbi50b3ApID9cclxuICAgICAgZmFsc2UgICAgOiBvZmZzZXRCb3R0b20gIT0gbnVsbCAmJiAocG9zaXRpb24udG9wICsgdGhpcy4kZWxlbWVudC5oZWlnaHQoKSA+PSBzY3JvbGxIZWlnaHQgLSBvZmZzZXRCb3R0b20pID9cclxuICAgICAgJ2JvdHRvbScgOiBvZmZzZXRUb3AgIT0gbnVsbCAmJiBzY3JvbGxUb3AgPD0gb2Zmc2V0VG9wID9cclxuICAgICAgJ3RvcCcgICAgOiBmYWxzZVxyXG5cclxuICAgIGlmICh0aGlzLmFmZml4ZWQgPT09IGFmZml4KSByZXR1cm5cclxuXHJcbiAgICB0aGlzLmFmZml4ZWQgPSBhZmZpeFxyXG4gICAgdGhpcy51bnBpbiA9IGFmZml4ID09ICdib3R0b20nID8gcG9zaXRpb24udG9wIC0gc2Nyb2xsVG9wIDogbnVsbFxyXG5cclxuICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MocmVzZXQpLmFkZENsYXNzKCdhZmZpeCcgKyAoYWZmaXggPyAnLScgKyBhZmZpeCA6ICcnKSlcclxuICB9XHJcblxyXG5cclxuIC8qIEFGRklYIFBMVUdJTiBERUZJTklUSU9OXHJcbiAgKiA9PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuICAkLmZuLmFmZml4ID0gZnVuY3Rpb24gKG9wdGlvbikge1xyXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuICAgICAgICAsIGRhdGEgPSAkdGhpcy5kYXRhKCdhZmZpeCcpXHJcbiAgICAgICAgLCBvcHRpb25zID0gdHlwZW9mIG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb25cclxuICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCdhZmZpeCcsIChkYXRhID0gbmV3IEFmZml4KHRoaXMsIG9wdGlvbnMpKSlcclxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXSgpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgJC5mbi5hZmZpeC5Db25zdHJ1Y3RvciA9IEFmZml4XHJcblxyXG4gICQuZm4uYWZmaXguZGVmYXVsdHMgPSB7XHJcbiAgICBvZmZzZXQ6IDBcclxuICB9XHJcblxyXG5cclxuIC8qIEFGRklYIERBVEEtQVBJXHJcbiAgKiA9PT09PT09PT09PT09PSAqL1xyXG5cclxuICAkKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAkKCdbZGF0YS1zcHk9XCJhZmZpeFwiXScpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgJHNweSA9ICQodGhpcylcclxuICAgICAgICAsIGRhdGEgPSAkc3B5LmRhdGEoKVxyXG5cclxuICAgICAgZGF0YS5vZmZzZXQgPSBkYXRhLm9mZnNldCB8fCB7fVxyXG5cclxuICAgICAgZGF0YS5vZmZzZXRCb3R0b20gJiYgKGRhdGEub2Zmc2V0LmJvdHRvbSA9IGRhdGEub2Zmc2V0Qm90dG9tKVxyXG4gICAgICBkYXRhLm9mZnNldFRvcCAmJiAoZGF0YS5vZmZzZXQudG9wID0gZGF0YS5vZmZzZXRUb3ApXHJcblxyXG4gICAgICAkc3B5LmFmZml4KGRhdGEpXHJcbiAgICB9KVxyXG4gIH0pXHJcblxyXG5cclxufSh3aW5kb3cualF1ZXJ5KTtcclxuIiwiLyohXHJcbiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuOC4xXHJcbiAqIGh0dHA6Ly9qcXVlcnkuY29tL1xyXG4gKlxyXG4gKiBJbmNsdWRlcyBTaXp6bGUuanNcclxuICogaHR0cDovL3NpenpsZWpzLmNvbS9cclxuICpcclxuICogQ29weXJpZ2h0IDIwMTIgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xyXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcclxuICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZVxyXG4gKlxyXG4gKiBEYXRlOiBUaHUgQXVnIDMwIDIwMTIgMTc6MTc6MjIgR01ULTA0MDAgKEVhc3Rlcm4gRGF5bGlnaHQgVGltZSlcclxuICovXHJcbihmdW5jdGlvbiggd2luZG93LCB1bmRlZmluZWQgKSB7XHJcbnZhclxyXG5cdC8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KVxyXG5cdHJvb3RqUXVlcnksXHJcblxyXG5cdC8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeVxyXG5cdHJlYWR5TGlzdCxcclxuXHJcblx0Ly8gVXNlIHRoZSBjb3JyZWN0IGRvY3VtZW50IGFjY29yZGluZ2x5IHdpdGggd2luZG93IGFyZ3VtZW50IChzYW5kYm94KVxyXG5cdGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50LFxyXG5cdGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLFxyXG5cdG5hdmlnYXRvciA9IHdpbmRvdy5uYXZpZ2F0b3IsXHJcblxyXG5cdC8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxyXG5cdF9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LFxyXG5cclxuXHQvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxyXG5cdF8kID0gd2luZG93LiQsXHJcblxyXG5cdC8vIFNhdmUgYSByZWZlcmVuY2UgdG8gc29tZSBjb3JlIG1ldGhvZHNcclxuXHRjb3JlX3B1c2ggPSBBcnJheS5wcm90b3R5cGUucHVzaCxcclxuXHRjb3JlX3NsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLFxyXG5cdGNvcmVfaW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mLFxyXG5cdGNvcmVfdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLFxyXG5cdGNvcmVfaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcclxuXHRjb3JlX3RyaW0gPSBTdHJpbmcucHJvdG90eXBlLnRyaW0sXHJcblxyXG5cdC8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5XHJcblx0alF1ZXJ5ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xyXG5cdFx0Ly8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnXHJcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCwgcm9vdGpRdWVyeSApO1xyXG5cdH0sXHJcblxyXG5cdC8vIFVzZWQgZm9yIG1hdGNoaW5nIG51bWJlcnNcclxuXHRjb3JlX3BudW0gPSAvW1xcLStdPyg/OlxcZCpcXC58KVxcZCsoPzpbZUVdW1xcLStdP1xcZCt8KS8uc291cmNlLFxyXG5cclxuXHQvLyBVc2VkIGZvciBkZXRlY3RpbmcgYW5kIHRyaW1taW5nIHdoaXRlc3BhY2VcclxuXHRjb3JlX3Jub3R3aGl0ZSA9IC9cXFMvLFxyXG5cdGNvcmVfcnNwYWNlID0gL1xccysvLFxyXG5cclxuXHQvLyBNYWtlIHN1cmUgd2UgdHJpbSBCT00gYW5kIE5CU1AgKGhlcmUncyBsb29raW5nIGF0IHlvdSwgU2FmYXJpIDUuMCBhbmQgSUUpXHJcblx0cnRyaW0gPSAvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csXHJcblxyXG5cdC8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzXHJcblx0Ly8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKVxyXG5cdHJxdWlja0V4cHIgPSAvXig/OlteIzxdKig8W1xcd1xcV10rPilbXj5dKiR8IyhbXFx3XFwtXSopJCkvLFxyXG5cclxuXHQvLyBNYXRjaCBhIHN0YW5kYWxvbmUgdGFnXHJcblx0cnNpbmdsZVRhZyA9IC9ePChcXHcrKVxccypcXC8/Pig/OjxcXC9cXDE+fCkkLyxcclxuXHJcblx0Ly8gSlNPTiBSZWdFeHBcclxuXHRydmFsaWRjaGFycyA9IC9eW1xcXSw6e31cXHNdKiQvLFxyXG5cdHJ2YWxpZGJyYWNlcyA9IC8oPzpefDp8LCkoPzpcXHMqXFxbKSsvZyxcclxuXHRydmFsaWRlc2NhcGUgPSAvXFxcXCg/OltcIlxcXFxcXC9iZm5ydF18dVtcXGRhLWZBLUZdezR9KS9nLFxyXG5cdHJ2YWxpZHRva2VucyA9IC9cIlteXCJcXFxcXFxyXFxuXSpcInx0cnVlfGZhbHNlfG51bGx8LT8oPzpcXGRcXGQqXFwufClcXGQrKD86W2VFXVtcXC0rXT9cXGQrfCkvZyxcclxuXHJcblx0Ly8gTWF0Y2hlcyBkYXNoZWQgc3RyaW5nIGZvciBjYW1lbGl6aW5nXHJcblx0cm1zUHJlZml4ID0gL14tbXMtLyxcclxuXHRyZGFzaEFscGhhID0gLy0oW1xcZGEtel0pL2dpLFxyXG5cclxuXHQvLyBVc2VkIGJ5IGpRdWVyeS5jYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXHJcblx0ZmNhbWVsQ2FzZSA9IGZ1bmN0aW9uKCBhbGwsIGxldHRlciApIHtcclxuXHRcdHJldHVybiAoIGxldHRlciArIFwiXCIgKS50b1VwcGVyQ2FzZSgpO1xyXG5cdH0sXHJcblxyXG5cdC8vIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kXHJcblx0RE9NQ29udGVudExvYWRlZCA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0aWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkge1xyXG5cdFx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgRE9NQ29udGVudExvYWRlZCwgZmFsc2UgKTtcclxuXHRcdFx0alF1ZXJ5LnJlYWR5KCk7XHJcblx0XHR9IGVsc2UgaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIgKSB7XHJcblx0XHRcdC8vIHdlJ3JlIGhlcmUgYmVjYXVzZSByZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIgaW4gb2xkSUVcclxuXHRcdFx0Ly8gd2hpY2ggaXMgZ29vZCBlbm91Z2ggZm9yIHVzIHRvIGNhbGwgdGhlIGRvbSByZWFkeSFcclxuXHRcdFx0ZG9jdW1lbnQuZGV0YWNoRXZlbnQoIFwib25yZWFkeXN0YXRlY2hhbmdlXCIsIERPTUNvbnRlbnRMb2FkZWQgKTtcclxuXHRcdFx0alF1ZXJ5LnJlYWR5KCk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Ly8gW1tDbGFzc11dIC0+IHR5cGUgcGFpcnNcclxuXHRjbGFzczJ0eXBlID0ge307XHJcblxyXG5qUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0ge1xyXG5cdGNvbnN0cnVjdG9yOiBqUXVlcnksXHJcblx0aW5pdDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByb290alF1ZXJ5ICkge1xyXG5cdFx0dmFyIG1hdGNoLCBlbGVtLCByZXQsIGRvYztcclxuXHJcblx0XHQvLyBIYW5kbGUgJChcIlwiKSwgJChudWxsKSwgJCh1bmRlZmluZWQpLCAkKGZhbHNlKVxyXG5cdFx0aWYgKCAhc2VsZWN0b3IgKSB7XHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEhhbmRsZSAkKERPTUVsZW1lbnQpXHJcblx0XHRpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xyXG5cdFx0XHR0aGlzLmNvbnRleHQgPSB0aGlzWzBdID0gc2VsZWN0b3I7XHJcblx0XHRcdHRoaXMubGVuZ3RoID0gMTtcclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gSGFuZGxlIEhUTUwgc3RyaW5nc1xyXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XHJcblx0XHRcdGlmICggc2VsZWN0b3IuY2hhckF0KDApID09PSBcIjxcIiAmJiBzZWxlY3Rvci5jaGFyQXQoIHNlbGVjdG9yLmxlbmd0aCAtIDEgKSA9PT0gXCI+XCIgJiYgc2VsZWN0b3IubGVuZ3RoID49IDMgKSB7XHJcblx0XHRcdFx0Ly8gQXNzdW1lIHRoYXQgc3RyaW5ncyB0aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCA8PiBhcmUgSFRNTCBhbmQgc2tpcCB0aGUgcmVnZXggY2hlY2tcclxuXHRcdFx0XHRtYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0bWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE1hdGNoIGh0bWwgb3IgbWFrZSBzdXJlIG5vIGNvbnRleHQgaXMgc3BlY2lmaWVkIGZvciAjaWRcclxuXHRcdFx0aWYgKCBtYXRjaCAmJiAobWF0Y2hbMV0gfHwgIWNvbnRleHQpICkge1xyXG5cclxuXHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSlcclxuXHRcdFx0XHRpZiAoIG1hdGNoWzFdICkge1xyXG5cdFx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZXh0WzBdIDogY29udGV4dDtcclxuXHRcdFx0XHRcdGRvYyA9ICggY29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCApO1xyXG5cclxuXHRcdFx0XHRcdC8vIHNjcmlwdHMgaXMgdHJ1ZSBmb3IgYmFjay1jb21wYXRcclxuXHRcdFx0XHRcdHNlbGVjdG9yID0galF1ZXJ5LnBhcnNlSFRNTCggbWF0Y2hbMV0sIGRvYywgdHJ1ZSApO1xyXG5cdFx0XHRcdFx0aWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWzFdICkgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvbnRleHQgKSApIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5hdHRyLmNhbGwoIHNlbGVjdG9yLCBjb250ZXh0LCB0cnVlICk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5tZXJnZSggdGhpcywgc2VsZWN0b3IgKTtcclxuXHJcblx0XHRcdFx0Ly8gSEFORExFOiAkKCNpZClcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0ZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsyXSApO1xyXG5cclxuXHRcdFx0XHRcdC8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zXHJcblx0XHRcdFx0XHQvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzXHJcblx0XHRcdFx0XHRpZiAoIGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlICkge1xyXG5cdFx0XHRcdFx0XHQvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgSUUgYW5kIE9wZXJhIHJldHVybiBpdGVtc1xyXG5cdFx0XHRcdFx0XHQvLyBieSBuYW1lIGluc3RlYWQgb2YgSURcclxuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLmlkICE9PSBtYXRjaFsyXSApIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcm9vdGpRdWVyeS5maW5kKCBzZWxlY3RvciApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0XHJcblx0XHRcdFx0XHRcdHRoaXMubGVuZ3RoID0gMTtcclxuXHRcdFx0XHRcdFx0dGhpc1swXSA9IGVsZW07XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5jb250ZXh0ID0gZG9jdW1lbnQ7XHJcblx0XHRcdFx0XHR0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XHJcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKVxyXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcclxuXHRcdFx0XHRyZXR1cm4gKCBjb250ZXh0IHx8IHJvb3RqUXVlcnkgKS5maW5kKCBzZWxlY3RvciApO1xyXG5cclxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXHJcblx0XHRcdC8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQoY29udGV4dCkuZmluZChleHByKVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcclxuXHRcdC8vIFNob3J0Y3V0IGZvciBkb2N1bWVudCByZWFkeVxyXG5cdFx0fSBlbHNlIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHNlbGVjdG9yICkgKSB7XHJcblx0XHRcdHJldHVybiByb290alF1ZXJ5LnJlYWR5KCBzZWxlY3RvciApO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggc2VsZWN0b3Iuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCApIHtcclxuXHRcdFx0dGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yLnNlbGVjdG9yO1xyXG5cdFx0XHR0aGlzLmNvbnRleHQgPSBzZWxlY3Rvci5jb250ZXh0O1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApO1xyXG5cdH0sXHJcblxyXG5cdC8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VsZWN0b3JcclxuXHRzZWxlY3RvcjogXCJcIixcclxuXHJcblx0Ly8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBqUXVlcnkgYmVpbmcgdXNlZFxyXG5cdGpxdWVyeTogXCIxLjguMVwiLFxyXG5cclxuXHQvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDBcclxuXHRsZW5ndGg6IDAsXHJcblxyXG5cdC8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0XHJcblx0c2l6ZTogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5sZW5ndGg7XHJcblx0fSxcclxuXHJcblx0dG9BcnJheTogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gY29yZV9zbGljZS5jYWxsKCB0aGlzICk7XHJcblx0fSxcclxuXHJcblx0Ly8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUlxyXG5cdC8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5XHJcblx0Z2V0OiBmdW5jdGlvbiggbnVtICkge1xyXG5cdFx0cmV0dXJuIG51bSA9PSBudWxsID9cclxuXHJcblx0XHRcdC8vIFJldHVybiBhICdjbGVhbicgYXJyYXlcclxuXHRcdFx0dGhpcy50b0FycmF5KCkgOlxyXG5cclxuXHRcdFx0Ly8gUmV0dXJuIGp1c3QgdGhlIG9iamVjdFxyXG5cdFx0XHQoIG51bSA8IDAgPyB0aGlzWyB0aGlzLmxlbmd0aCArIG51bSBdIDogdGhpc1sgbnVtIF0gKTtcclxuXHR9LFxyXG5cclxuXHQvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrXHJcblx0Ly8gKHJldHVybmluZyB0aGUgbmV3IG1hdGNoZWQgZWxlbWVudCBzZXQpXHJcblx0cHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMsIG5hbWUsIHNlbGVjdG9yICkge1xyXG5cclxuXHRcdC8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0XHJcblx0XHR2YXIgcmV0ID0galF1ZXJ5Lm1lcmdlKCB0aGlzLmNvbnN0cnVjdG9yKCksIGVsZW1zICk7XHJcblxyXG5cdFx0Ly8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSlcclxuXHRcdHJldC5wcmV2T2JqZWN0ID0gdGhpcztcclxuXHJcblx0XHRyZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDtcclxuXHJcblx0XHRpZiAoIG5hbWUgPT09IFwiZmluZFwiICkge1xyXG5cdFx0XHRyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yICsgKCB0aGlzLnNlbGVjdG9yID8gXCIgXCIgOiBcIlwiICkgKyBzZWxlY3RvcjtcclxuXHRcdH0gZWxzZSBpZiAoIG5hbWUgKSB7XHJcblx0XHRcdHJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyBcIi5cIiArIG5hbWUgKyBcIihcIiArIHNlbGVjdG9yICsgXCIpXCI7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXRcclxuXHRcdHJldHVybiByZXQ7XHJcblx0fSxcclxuXHJcblx0Ly8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC5cclxuXHQvLyAoWW91IGNhbiBzZWVkIHRoZSBhcmd1bWVudHMgd2l0aCBhbiBhcnJheSBvZiBhcmdzLCBidXQgdGhpcyBpc1xyXG5cdC8vIG9ubHkgdXNlZCBpbnRlcm5hbGx5LilcclxuXHRlYWNoOiBmdW5jdGlvbiggY2FsbGJhY2ssIGFyZ3MgKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrLCBhcmdzICk7XHJcblx0fSxcclxuXHJcblx0cmVhZHk6IGZ1bmN0aW9uKCBmbiApIHtcclxuXHRcdC8vIEFkZCB0aGUgY2FsbGJhY2tcclxuXHRcdGpRdWVyeS5yZWFkeS5wcm9taXNlKCkuZG9uZSggZm4gKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cclxuXHRlcTogZnVuY3Rpb24oIGkgKSB7XHJcblx0XHRpID0gK2k7XHJcblx0XHRyZXR1cm4gaSA9PT0gLTEgP1xyXG5cdFx0XHR0aGlzLnNsaWNlKCBpICkgOlxyXG5cdFx0XHR0aGlzLnNsaWNlKCBpLCBpICsgMSApO1xyXG5cdH0sXHJcblxyXG5cdGZpcnN0OiBmdW5jdGlvbigpIHtcclxuXHRcdHJldHVybiB0aGlzLmVxKCAwICk7XHJcblx0fSxcclxuXHJcblx0bGFzdDogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5lcSggLTEgKTtcclxuXHR9LFxyXG5cclxuXHRzbGljZTogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGNvcmVfc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApLFxyXG5cdFx0XHRcInNsaWNlXCIsIGNvcmVfc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oXCIsXCIpICk7XHJcblx0fSxcclxuXHJcblx0bWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAodGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XHJcblx0XHRcdHJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7XHJcblx0XHR9KSk7XHJcblx0fSxcclxuXHJcblx0ZW5kOiBmdW5jdGlvbigpIHtcclxuXHRcdHJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcihudWxsKTtcclxuXHR9LFxyXG5cclxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXHJcblx0Ly8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuXHJcblx0cHVzaDogY29yZV9wdXNoLFxyXG5cdHNvcnQ6IFtdLnNvcnQsXHJcblx0c3BsaWNlOiBbXS5zcGxpY2VcclxufTtcclxuXHJcbi8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb25cclxualF1ZXJ5LmZuLmluaXQucHJvdG90eXBlID0galF1ZXJ5LmZuO1xyXG5cclxualF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsXHJcblx0XHR0YXJnZXQgPSBhcmd1bWVudHNbMF0gfHwge30sXHJcblx0XHRpID0gMSxcclxuXHRcdGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXHJcblx0XHRkZWVwID0gZmFsc2U7XHJcblxyXG5cdC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb25cclxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiICkge1xyXG5cdFx0ZGVlcCA9IHRhcmdldDtcclxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sxXSB8fCB7fTtcclxuXHRcdC8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXRcclxuXHRcdGkgPSAyO1xyXG5cdH1cclxuXHJcblx0Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXHJcblx0aWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSBcIm9iamVjdFwiICYmICFqUXVlcnkuaXNGdW5jdGlvbih0YXJnZXQpICkge1xyXG5cdFx0dGFyZ2V0ID0ge307XHJcblx0fVxyXG5cclxuXHQvLyBleHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWRcclxuXHRpZiAoIGxlbmd0aCA9PT0gaSApIHtcclxuXHRcdHRhcmdldCA9IHRoaXM7XHJcblx0XHQtLWk7XHJcblx0fVxyXG5cclxuXHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcclxuXHRcdC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXNcclxuXHRcdGlmICggKG9wdGlvbnMgPSBhcmd1bWVudHNbIGkgXSkgIT0gbnVsbCApIHtcclxuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxyXG5cdFx0XHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XHJcblx0XHRcdFx0c3JjID0gdGFyZ2V0WyBuYW1lIF07XHJcblx0XHRcdFx0Y29weSA9IG9wdGlvbnNbIG5hbWUgXTtcclxuXHJcblx0XHRcdFx0Ly8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcFxyXG5cdFx0XHRcdGlmICggdGFyZ2V0ID09PSBjb3B5ICkge1xyXG5cdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXNcclxuXHRcdFx0XHRpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KGNvcHkpIHx8IChjb3B5SXNBcnJheSA9IGpRdWVyeS5pc0FycmF5KGNvcHkpKSApICkge1xyXG5cdFx0XHRcdFx0aWYgKCBjb3B5SXNBcnJheSApIHtcclxuXHRcdFx0XHRcdFx0Y29weUlzQXJyYXkgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KHNyYykgPyBzcmMgOiB7fTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW1cclxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcclxuXHJcblx0XHRcdFx0Ly8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlc1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcclxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0gY29weTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0XHJcblx0cmV0dXJuIHRhcmdldDtcclxufTtcclxuXHJcbmpRdWVyeS5leHRlbmQoe1xyXG5cdG5vQ29uZmxpY3Q6IGZ1bmN0aW9uKCBkZWVwICkge1xyXG5cdFx0aWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkge1xyXG5cdFx0XHR3aW5kb3cuJCA9IF8kO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7XHJcblx0XHRcdHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5O1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBqUXVlcnk7XHJcblx0fSxcclxuXHJcblx0Ly8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2VkPyBTZXQgdG8gdHJ1ZSBvbmNlIGl0IG9jY3Vycy5cclxuXHRpc1JlYWR5OiBmYWxzZSxcclxuXHJcblx0Ly8gQSBjb3VudGVyIHRvIHRyYWNrIGhvdyBtYW55IGl0ZW1zIHRvIHdhaXQgZm9yIGJlZm9yZVxyXG5cdC8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxXHJcblx0cmVhZHlXYWl0OiAxLFxyXG5cclxuXHQvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnRcclxuXHRob2xkUmVhZHk6IGZ1bmN0aW9uKCBob2xkICkge1xyXG5cdFx0aWYgKCBob2xkICkge1xyXG5cdFx0XHRqUXVlcnkucmVhZHlXYWl0Kys7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRqUXVlcnkucmVhZHkoIHRydWUgKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHQvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5XHJcblx0cmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkge1xyXG5cclxuXHRcdC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHlcclxuXHRcdGlmICggd2FpdCA9PT0gdHJ1ZSA/IC0talF1ZXJ5LnJlYWR5V2FpdCA6IGpRdWVyeS5pc1JlYWR5ICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gTWFrZSBzdXJlIGJvZHkgZXhpc3RzLCBhdCBsZWFzdCwgaW4gY2FzZSBJRSBnZXRzIGEgbGl0dGxlIG92ZXJ6ZWFsb3VzICh0aWNrZXQgIzU0NDMpLlxyXG5cdFx0aWYgKCAhZG9jdW1lbnQuYm9keSApIHtcclxuXHRcdFx0cmV0dXJuIHNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSwgMSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeVxyXG5cdFx0alF1ZXJ5LmlzUmVhZHkgPSB0cnVlO1xyXG5cclxuXHRcdC8vIElmIGEgbm9ybWFsIERPTSBSZWFkeSBldmVudCBmaXJlZCwgZGVjcmVtZW50LCBhbmQgd2FpdCBpZiBuZWVkIGJlXHJcblx0XHRpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGVcclxuXHRcdHJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTtcclxuXHJcblx0XHQvLyBUcmlnZ2VyIGFueSBib3VuZCByZWFkeSBldmVudHNcclxuXHRcdGlmICggalF1ZXJ5LmZuLnRyaWdnZXIgKSB7XHJcblx0XHRcdGpRdWVyeSggZG9jdW1lbnQgKS50cmlnZ2VyKFwicmVhZHlcIikub2ZmKFwicmVhZHlcIik7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Ly8gU2VlIHRlc3QvdW5pdC9jb3JlLmpzIGZvciBkZXRhaWxzIGNvbmNlcm5pbmcgaXNGdW5jdGlvbi5cclxuXHQvLyBTaW5jZSB2ZXJzaW9uIDEuMywgRE9NIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucyBsaWtlIGFsZXJ0XHJcblx0Ly8gYXJlbid0IHN1cHBvcnRlZC4gVGhleSByZXR1cm4gZmFsc2Ugb24gSUUgKCMyOTY4KS5cclxuXHRpc0Z1bmN0aW9uOiBmdW5jdGlvbiggb2JqICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS50eXBlKG9iaikgPT09IFwiZnVuY3Rpb25cIjtcclxuXHR9LFxyXG5cclxuXHRpc0FycmF5OiBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKCBvYmogKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gXCJhcnJheVwiO1xyXG5cdH0sXHJcblxyXG5cdGlzV2luZG93OiBmdW5jdGlvbiggb2JqICkge1xyXG5cdFx0cmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PSBvYmoud2luZG93O1xyXG5cdH0sXHJcblxyXG5cdGlzTnVtZXJpYzogZnVuY3Rpb24oIG9iaiApIHtcclxuXHRcdHJldHVybiAhaXNOYU4oIHBhcnNlRmxvYXQob2JqKSApICYmIGlzRmluaXRlKCBvYmogKTtcclxuXHR9LFxyXG5cclxuXHR0eXBlOiBmdW5jdGlvbiggb2JqICkge1xyXG5cdFx0cmV0dXJuIG9iaiA9PSBudWxsID9cclxuXHRcdFx0U3RyaW5nKCBvYmogKSA6XHJcblx0XHRcdGNsYXNzMnR5cGVbIGNvcmVfdG9TdHJpbmcuY2FsbChvYmopIF0gfHwgXCJvYmplY3RcIjtcclxuXHR9LFxyXG5cclxuXHRpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xyXG5cdFx0Ly8gTXVzdCBiZSBhbiBPYmplY3QuXHJcblx0XHQvLyBCZWNhdXNlIG9mIElFLCB3ZSBhbHNvIGhhdmUgdG8gY2hlY2sgdGhlIHByZXNlbmNlIG9mIHRoZSBjb25zdHJ1Y3RvciBwcm9wZXJ0eS5cclxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IERPTSBub2RlcyBhbmQgd2luZG93IG9iamVjdHMgZG9uJ3QgcGFzcyB0aHJvdWdoLCBhcyB3ZWxsXHJcblx0XHRpZiAoICFvYmogfHwgalF1ZXJ5LnR5cGUob2JqKSAhPT0gXCJvYmplY3RcIiB8fCBvYmoubm9kZVR5cGUgfHwgalF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRyeSB7XHJcblx0XHRcdC8vIE5vdCBvd24gY29uc3RydWN0b3IgcHJvcGVydHkgbXVzdCBiZSBPYmplY3RcclxuXHRcdFx0aWYgKCBvYmouY29uc3RydWN0b3IgJiZcclxuXHRcdFx0XHQhY29yZV9oYXNPd24uY2FsbChvYmosIFwiY29uc3RydWN0b3JcIikgJiZcclxuXHRcdFx0XHQhY29yZV9oYXNPd24uY2FsbChvYmouY29uc3RydWN0b3IucHJvdG90eXBlLCBcImlzUHJvdG90eXBlT2ZcIikgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0Ly8gSUU4LDkgV2lsbCB0aHJvdyBleGNlcHRpb25zIG9uIGNlcnRhaW4gaG9zdCBvYmplY3RzICM5ODk3XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBPd24gcHJvcGVydGllcyBhcmUgZW51bWVyYXRlZCBmaXJzdGx5LCBzbyB0byBzcGVlZCB1cCxcclxuXHRcdC8vIGlmIGxhc3Qgb25lIGlzIG93biwgdGhlbiBhbGwgcHJvcGVydGllcyBhcmUgb3duLlxyXG5cclxuXHRcdHZhciBrZXk7XHJcblx0XHRmb3IgKCBrZXkgaW4gb2JqICkge31cclxuXHJcblx0XHRyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgfHwgY29yZV9oYXNPd24uY2FsbCggb2JqLCBrZXkgKTtcclxuXHR9LFxyXG5cclxuXHRpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xyXG5cdFx0dmFyIG5hbWU7XHJcblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fSxcclxuXHJcblx0ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoIG1zZyApO1xyXG5cdH0sXHJcblxyXG5cdC8vIGRhdGE6IHN0cmluZyBvZiBodG1sXHJcblx0Ly8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LCBkZWZhdWx0cyB0byBkb2N1bWVudFxyXG5cdC8vIHNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZ1xyXG5cdHBhcnNlSFRNTDogZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIHNjcmlwdHMgKSB7XHJcblx0XHR2YXIgcGFyc2VkO1xyXG5cdFx0aWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0XHRpZiAoIHR5cGVvZiBjb250ZXh0ID09PSBcImJvb2xlYW5cIiApIHtcclxuXHRcdFx0c2NyaXB0cyA9IGNvbnRleHQ7XHJcblx0XHRcdGNvbnRleHQgPSAwO1xyXG5cdFx0fVxyXG5cdFx0Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7XHJcblxyXG5cdFx0Ly8gU2luZ2xlIHRhZ1xyXG5cdFx0aWYgKCAocGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICkpICkge1xyXG5cdFx0XHRyZXR1cm4gWyBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIHBhcnNlZFsxXSApIF07XHJcblx0XHR9XHJcblxyXG5cdFx0cGFyc2VkID0galF1ZXJ5LmJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzID8gbnVsbCA6IFtdICk7XHJcblx0XHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSxcclxuXHRcdFx0KHBhcnNlZC5jYWNoZWFibGUgPyBqUXVlcnkuY2xvbmUoIHBhcnNlZC5mcmFnbWVudCApIDogcGFyc2VkLmZyYWdtZW50KS5jaGlsZE5vZGVzICk7XHJcblx0fSxcclxuXHJcblx0cGFyc2VKU09OOiBmdW5jdGlvbiggZGF0YSApIHtcclxuXHRcdGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIpIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gTWFrZSBzdXJlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyByZW1vdmVkIChJRSBjYW4ndCBoYW5kbGUgaXQpXHJcblx0XHRkYXRhID0galF1ZXJ5LnRyaW0oIGRhdGEgKTtcclxuXHJcblx0XHQvLyBBdHRlbXB0IHRvIHBhcnNlIHVzaW5nIHRoZSBuYXRpdmUgSlNPTiBwYXJzZXIgZmlyc3RcclxuXHRcdGlmICggd2luZG93LkpTT04gJiYgd2luZG93LkpTT04ucGFyc2UgKSB7XHJcblx0XHRcdHJldHVybiB3aW5kb3cuSlNPTi5wYXJzZSggZGF0YSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE1ha2Ugc3VyZSB0aGUgaW5jb21pbmcgZGF0YSBpcyBhY3R1YWwgSlNPTlxyXG5cdFx0Ly8gTG9naWMgYm9ycm93ZWQgZnJvbSBodHRwOi8vanNvbi5vcmcvanNvbjIuanNcclxuXHRcdGlmICggcnZhbGlkY2hhcnMudGVzdCggZGF0YS5yZXBsYWNlKCBydmFsaWRlc2NhcGUsIFwiQFwiIClcclxuXHRcdFx0LnJlcGxhY2UoIHJ2YWxpZHRva2VucywgXCJdXCIgKVxyXG5cdFx0XHQucmVwbGFjZSggcnZhbGlkYnJhY2VzLCBcIlwiKSkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gKCBuZXcgRnVuY3Rpb24oIFwicmV0dXJuIFwiICsgZGF0YSApICkoKTtcclxuXHJcblx0XHR9XHJcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBKU09OOiBcIiArIGRhdGEgKTtcclxuXHR9LFxyXG5cclxuXHQvLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nXHJcblx0cGFyc2VYTUw6IGZ1bmN0aW9uKCBkYXRhICkge1xyXG5cdFx0dmFyIHhtbCwgdG1wO1xyXG5cdFx0aWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0XHR0cnkge1xyXG5cdFx0XHRpZiAoIHdpbmRvdy5ET01QYXJzZXIgKSB7IC8vIFN0YW5kYXJkXHJcblx0XHRcdFx0dG1wID0gbmV3IERPTVBhcnNlcigpO1xyXG5cdFx0XHRcdHhtbCA9IHRtcC5wYXJzZUZyb21TdHJpbmcoIGRhdGEgLCBcInRleHQveG1sXCIgKTtcclxuXHRcdFx0fSBlbHNlIHsgLy8gSUVcclxuXHRcdFx0XHR4bWwgPSBuZXcgQWN0aXZlWE9iamVjdCggXCJNaWNyb3NvZnQuWE1MRE9NXCIgKTtcclxuXHRcdFx0XHR4bWwuYXN5bmMgPSBcImZhbHNlXCI7XHJcblx0XHRcdFx0eG1sLmxvYWRYTUwoIGRhdGEgKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBjYXRjaCggZSApIHtcclxuXHRcdFx0eG1sID0gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCAheG1sIHx8ICF4bWwuZG9jdW1lbnRFbGVtZW50IHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCJwYXJzZXJlcnJvclwiICkubGVuZ3RoICkge1xyXG5cdFx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgZGF0YSApO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHhtbDtcclxuXHR9LFxyXG5cclxuXHRub29wOiBmdW5jdGlvbigpIHt9LFxyXG5cclxuXHQvLyBFdmFsdWF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dFxyXG5cdC8vIFdvcmthcm91bmRzIGJhc2VkIG9uIGZpbmRpbmdzIGJ5IEppbSBEcmlzY29sbFxyXG5cdC8vIGh0dHA6Ly93ZWJsb2dzLmphdmEubmV0L2Jsb2cvZHJpc2NvbGwvYXJjaGl2ZS8yMDA5LzA5LzA4L2V2YWwtamF2YXNjcmlwdC1nbG9iYWwtY29udGV4dFxyXG5cdGdsb2JhbEV2YWw6IGZ1bmN0aW9uKCBkYXRhICkge1xyXG5cdFx0aWYgKCBkYXRhICYmIGNvcmVfcm5vdHdoaXRlLnRlc3QoIGRhdGEgKSApIHtcclxuXHRcdFx0Ly8gV2UgdXNlIGV4ZWNTY3JpcHQgb24gSW50ZXJuZXQgRXhwbG9yZXJcclxuXHRcdFx0Ly8gV2UgdXNlIGFuIGFub255bW91cyBmdW5jdGlvbiBzbyB0aGF0IGNvbnRleHQgaXMgd2luZG93XHJcblx0XHRcdC8vIHJhdGhlciB0aGFuIGpRdWVyeSBpbiBGaXJlZm94XHJcblx0XHRcdCggd2luZG93LmV4ZWNTY3JpcHQgfHwgZnVuY3Rpb24oIGRhdGEgKSB7XHJcblx0XHRcdFx0d2luZG93WyBcImV2YWxcIiBdLmNhbGwoIHdpbmRvdywgZGF0YSApO1xyXG5cdFx0XHR9ICkoIGRhdGEgKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHQvLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzXHJcblx0Ly8gTWljcm9zb2Z0IGZvcmdvdCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXggKCM5NTcyKVxyXG5cdGNhbWVsQ2FzZTogZnVuY3Rpb24oIHN0cmluZyApIHtcclxuXHRcdHJldHVybiBzdHJpbmcucmVwbGFjZSggcm1zUHJlZml4LCBcIm1zLVwiICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApO1xyXG5cdH0sXHJcblxyXG5cdG5vZGVOYW1lOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcclxuXHRcdHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gbmFtZS50b1VwcGVyQ2FzZSgpO1xyXG5cdH0sXHJcblxyXG5cdC8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcclxuXHRlYWNoOiBmdW5jdGlvbiggb2JqLCBjYWxsYmFjaywgYXJncyApIHtcclxuXHRcdHZhciBuYW1lLFxyXG5cdFx0XHRpID0gMCxcclxuXHRcdFx0bGVuZ3RoID0gb2JqLmxlbmd0aCxcclxuXHRcdFx0aXNPYmogPSBsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNGdW5jdGlvbiggb2JqICk7XHJcblxyXG5cdFx0aWYgKCBhcmdzICkge1xyXG5cdFx0XHRpZiAoIGlzT2JqICkge1xyXG5cdFx0XHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xyXG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5hcHBseSggb2JqWyBuYW1lIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKSB7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7ICkge1xyXG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5hcHBseSggb2JqWyBpKysgXSwgYXJncyApID09PSBmYWxzZSApIHtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0Ly8gQSBzcGVjaWFsLCBmYXN0LCBjYXNlIGZvciB0aGUgbW9zdCBjb21tb24gdXNlIG9mIGVhY2hcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGlmICggaXNPYmogKSB7XHJcblx0XHRcdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XHJcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgbmFtZSBdLCBuYW1lLCBvYmpbIG5hbWUgXSApID09PSBmYWxzZSApIHtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgKSB7XHJcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkrKyBdICkgPT09IGZhbHNlICkge1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gb2JqO1xyXG5cdH0sXHJcblxyXG5cdC8vIFVzZSBuYXRpdmUgU3RyaW5nLnRyaW0gZnVuY3Rpb24gd2hlcmV2ZXIgcG9zc2libGVcclxuXHR0cmltOiBjb3JlX3RyaW0gJiYgIWNvcmVfdHJpbS5jYWxsKFwiXFx1RkVGRlxceEEwXCIpID9cclxuXHRcdGZ1bmN0aW9uKCB0ZXh0ICkge1xyXG5cdFx0XHRyZXR1cm4gdGV4dCA9PSBudWxsID9cclxuXHRcdFx0XHRcIlwiIDpcclxuXHRcdFx0XHRjb3JlX3RyaW0uY2FsbCggdGV4dCApO1xyXG5cdFx0fSA6XHJcblxyXG5cdFx0Ly8gT3RoZXJ3aXNlIHVzZSBvdXIgb3duIHRyaW1taW5nIGZ1bmN0aW9uYWxpdHlcclxuXHRcdGZ1bmN0aW9uKCB0ZXh0ICkge1xyXG5cdFx0XHRyZXR1cm4gdGV4dCA9PSBudWxsID9cclxuXHRcdFx0XHRcIlwiIDpcclxuXHRcdFx0XHR0ZXh0LnRvU3RyaW5nKCkucmVwbGFjZSggcnRyaW0sIFwiXCIgKTtcclxuXHRcdH0sXHJcblxyXG5cdC8vIHJlc3VsdHMgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcclxuXHRtYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnIsIHJlc3VsdHMgKSB7XHJcblx0XHR2YXIgdHlwZSxcclxuXHRcdFx0cmV0ID0gcmVzdWx0cyB8fCBbXTtcclxuXHJcblx0XHRpZiAoIGFyciAhPSBudWxsICkge1xyXG5cdFx0XHQvLyBUaGUgd2luZG93LCBzdHJpbmdzIChhbmQgZnVuY3Rpb25zKSBhbHNvIGhhdmUgJ2xlbmd0aCdcclxuXHRcdFx0Ly8gVHdlYWtlZCBsb2dpYyBzbGlnaHRseSB0byBoYW5kbGUgQmxhY2tiZXJyeSA0LjcgUmVnRXhwIGlzc3VlcyAjNjkzMFxyXG5cdFx0XHR0eXBlID0galF1ZXJ5LnR5cGUoIGFyciApO1xyXG5cclxuXHRcdFx0aWYgKCBhcnIubGVuZ3RoID09IG51bGwgfHwgdHlwZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZSA9PT0gXCJyZWdleHBcIiB8fCBqUXVlcnkuaXNXaW5kb3coIGFyciApICkge1xyXG5cdFx0XHRcdGNvcmVfcHVzaC5jYWxsKCByZXQsIGFyciApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggcmV0LCBhcnIgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXQ7XHJcblx0fSxcclxuXHJcblx0aW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHtcclxuXHRcdHZhciBsZW47XHJcblxyXG5cdFx0aWYgKCBhcnIgKSB7XHJcblx0XHRcdGlmICggY29yZV9pbmRleE9mICkge1xyXG5cdFx0XHRcdHJldHVybiBjb3JlX2luZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxlbiA9IGFyci5sZW5ndGg7XHJcblx0XHRcdGkgPSBpID8gaSA8IDAgPyBNYXRoLm1heCggMCwgbGVuICsgaSApIDogaSA6IDA7XHJcblxyXG5cdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcclxuXHRcdFx0XHQvLyBTa2lwIGFjY2Vzc2luZyBpbiBzcGFyc2UgYXJyYXlzXHJcblx0XHRcdFx0aWYgKCBpIGluIGFyciAmJiBhcnJbIGkgXSA9PT0gZWxlbSApIHtcclxuXHRcdFx0XHRcdHJldHVybiBpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAtMTtcclxuXHR9LFxyXG5cclxuXHRtZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7XHJcblx0XHR2YXIgbCA9IHNlY29uZC5sZW5ndGgsXHJcblx0XHRcdGkgPSBmaXJzdC5sZW5ndGgsXHJcblx0XHRcdGogPSAwO1xyXG5cclxuXHRcdGlmICggdHlwZW9mIGwgPT09IFwibnVtYmVyXCIgKSB7XHJcblx0XHRcdGZvciAoIDsgaiA8IGw7IGorKyApIHtcclxuXHRcdFx0XHRmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHdoaWxlICggc2Vjb25kW2pdICE9PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdFx0Zmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqKysgXTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGZpcnN0Lmxlbmd0aCA9IGk7XHJcblxyXG5cdFx0cmV0dXJuIGZpcnN0O1xyXG5cdH0sXHJcblxyXG5cdGdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludiApIHtcclxuXHRcdHZhciByZXRWYWwsXHJcblx0XHRcdHJldCA9IFtdLFxyXG5cdFx0XHRpID0gMCxcclxuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoO1xyXG5cdFx0aW52ID0gISFpbnY7XHJcblxyXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIG9ubHkgc2F2aW5nIHRoZSBpdGVtc1xyXG5cdFx0Ly8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb25cclxuXHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xyXG5cdFx0XHRyZXRWYWwgPSAhIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7XHJcblx0XHRcdGlmICggaW52ICE9PSByZXRWYWwgKSB7XHJcblx0XHRcdFx0cmV0LnB1c2goIGVsZW1zWyBpIF0gKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXQ7XHJcblx0fSxcclxuXHJcblx0Ly8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XHJcblx0bWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7XHJcblx0XHR2YXIgdmFsdWUsIGtleSxcclxuXHRcdFx0cmV0ID0gW10sXHJcblx0XHRcdGkgPSAwLFxyXG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGgsXHJcblx0XHRcdC8vIGpxdWVyeSBvYmplY3RzIGFyZSB0cmVhdGVkIGFzIGFycmF5c1xyXG5cdFx0XHRpc0FycmF5ID0gZWxlbXMgaW5zdGFuY2VvZiBqUXVlcnkgfHwgbGVuZ3RoICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJiAoICggbGVuZ3RoID4gMCAmJiBlbGVtc1sgMCBdICYmIGVsZW1zWyBsZW5ndGggLTEgXSApIHx8IGxlbmd0aCA9PT0gMCB8fCBqUXVlcnkuaXNBcnJheSggZWxlbXMgKSApIDtcclxuXHJcblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXJcclxuXHRcdGlmICggaXNBcnJheSApIHtcclxuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XHJcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XHJcblxyXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcclxuXHRcdFx0XHRcdHJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0Ly8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCxcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGZvciAoIGtleSBpbiBlbGVtcyApIHtcclxuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sga2V5IF0sIGtleSwgYXJnICk7XHJcblxyXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcclxuXHRcdFx0XHRcdHJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xyXG5cdFx0cmV0dXJuIHJldC5jb25jYXQuYXBwbHkoIFtdLCByZXQgKTtcclxuXHR9LFxyXG5cclxuXHQvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHNcclxuXHRndWlkOiAxLFxyXG5cclxuXHQvLyBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0LCBvcHRpb25hbGx5IHBhcnRpYWxseSBhcHBseWluZyBhbnlcclxuXHQvLyBhcmd1bWVudHMuXHJcblx0cHJveHk6IGZ1bmN0aW9uKCBmbiwgY29udGV4dCApIHtcclxuXHRcdHZhciB0bXAsIGFyZ3MsIHByb3h5O1xyXG5cclxuXHRcdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XHJcblx0XHRcdHRtcCA9IGZuWyBjb250ZXh0IF07XHJcblx0XHRcdGNvbnRleHQgPSBmbjtcclxuXHRcdFx0Zm4gPSB0bXA7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWNcclxuXHRcdC8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuXHJcblx0XHRpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHtcclxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBTaW11bGF0ZWQgYmluZFxyXG5cdFx0YXJncyA9IGNvcmVfc2xpY2UuY2FsbCggYXJndW1lbnRzLCAyICk7XHJcblx0XHRwcm94eSA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRyZXR1cm4gZm4uYXBwbHkoIGNvbnRleHQsIGFyZ3MuY29uY2F0KCBjb3JlX3NsaWNlLmNhbGwoIGFyZ3VtZW50cyApICkgKTtcclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkXHJcblx0XHRwcm94eS5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgcHJveHkuZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xyXG5cclxuXHRcdHJldHVybiBwcm94eTtcclxuXHR9LFxyXG5cclxuXHQvLyBNdWx0aWZ1bmN0aW9uYWwgbWV0aG9kIHRvIGdldCBhbmQgc2V0IHZhbHVlcyBvZiBhIGNvbGxlY3Rpb25cclxuXHQvLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb25cclxuXHRhY2Nlc3M6IGZ1bmN0aW9uKCBlbGVtcywgZm4sIGtleSwgdmFsdWUsIGNoYWluYWJsZSwgZW1wdHlHZXQsIHBhc3MgKSB7XHJcblx0XHR2YXIgZXhlYyxcclxuXHRcdFx0YnVsayA9IGtleSA9PSBudWxsLFxyXG5cdFx0XHRpID0gMCxcclxuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoO1xyXG5cclxuXHRcdC8vIFNldHMgbWFueSB2YWx1ZXNcclxuXHRcdGlmICgga2V5ICYmIHR5cGVvZiBrZXkgPT09IFwib2JqZWN0XCIgKSB7XHJcblx0XHRcdGZvciAoIGkgaW4ga2V5ICkge1xyXG5cdFx0XHRcdGpRdWVyeS5hY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5W2ldLCAxLCBlbXB0eUdldCwgdmFsdWUgKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjaGFpbmFibGUgPSAxO1xyXG5cclxuXHRcdC8vIFNldHMgb25lIHZhbHVlXHJcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHQvLyBPcHRpb25hbGx5LCBmdW5jdGlvbiB2YWx1ZXMgZ2V0IGV4ZWN1dGVkIGlmIGV4ZWMgaXMgdHJ1ZVxyXG5cdFx0XHRleGVjID0gcGFzcyA9PT0gdW5kZWZpbmVkICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApO1xyXG5cclxuXHRcdFx0aWYgKCBidWxrICkge1xyXG5cdFx0XHRcdC8vIEJ1bGsgb3BlcmF0aW9ucyBvbmx5IGl0ZXJhdGUgd2hlbiBleGVjdXRpbmcgZnVuY3Rpb24gdmFsdWVzXHJcblx0XHRcdFx0aWYgKCBleGVjICkge1xyXG5cdFx0XHRcdFx0ZXhlYyA9IGZuO1xyXG5cdFx0XHRcdFx0Zm4gPSBmdW5jdGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGV4ZWMuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7XHJcblx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHQvLyBPdGhlcndpc2UgdGhleSBydW4gYWdhaW5zdCB0aGUgZW50aXJlIHNldFxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRmbi5jYWxsKCBlbGVtcywgdmFsdWUgKTtcclxuXHRcdFx0XHRcdGZuID0gbnVsbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggZm4gKSB7XHJcblx0XHRcdFx0Zm9yICg7IGkgPCBsZW5ndGg7IGkrKyApIHtcclxuXHRcdFx0XHRcdGZuKCBlbGVtc1tpXSwga2V5LCBleGVjID8gdmFsdWUuY2FsbCggZWxlbXNbaV0sIGksIGZuKCBlbGVtc1tpXSwga2V5ICkgKSA6IHZhbHVlLCBwYXNzICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjaGFpbmFibGUgPSAxO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBjaGFpbmFibGUgP1xyXG5cdFx0XHRlbGVtcyA6XHJcblxyXG5cdFx0XHQvLyBHZXRzXHJcblx0XHRcdGJ1bGsgP1xyXG5cdFx0XHRcdGZuLmNhbGwoIGVsZW1zICkgOlxyXG5cdFx0XHRcdGxlbmd0aCA/IGZuKCBlbGVtc1swXSwga2V5ICkgOiBlbXB0eUdldDtcclxuXHR9LFxyXG5cclxuXHRub3c6IGZ1bmN0aW9uKCkge1xyXG5cdFx0cmV0dXJuICggbmV3IERhdGUoKSApLmdldFRpbWUoKTtcclxuXHR9XHJcbn0pO1xyXG5cclxualF1ZXJ5LnJlYWR5LnByb21pc2UgPSBmdW5jdGlvbiggb2JqICkge1xyXG5cdGlmICggIXJlYWR5TGlzdCApIHtcclxuXHJcblx0XHRyZWFkeUxpc3QgPSBqUXVlcnkuRGVmZXJyZWQoKTtcclxuXHJcblx0XHQvLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZCBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC5cclxuXHRcdC8vIHdlIG9uY2UgdHJpZWQgdG8gdXNlIHJlYWR5U3RhdGUgXCJpbnRlcmFjdGl2ZVwiIGhlcmUsIGJ1dCBpdCBjYXVzZWQgaXNzdWVzIGxpa2UgdGhlIG9uZVxyXG5cdFx0Ly8gZGlzY292ZXJlZCBieSBDaHJpc1MgaGVyZTogaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIyODIjY29tbWVudDoxNVxyXG5cdFx0aWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIgKSB7XHJcblx0XHRcdC8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeVxyXG5cdFx0XHRzZXRUaW1lb3V0KCBqUXVlcnkucmVhZHksIDEgKTtcclxuXHJcblx0XHQvLyBTdGFuZGFyZHMtYmFzZWQgYnJvd3NlcnMgc3VwcG9ydCBET01Db250ZW50TG9hZGVkXHJcblx0XHR9IGVsc2UgaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkge1xyXG5cdFx0XHQvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrXHJcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIFwiRE9NQ29udGVudExvYWRlZFwiLCBET01Db250ZW50TG9hZGVkLCBmYWxzZSApO1xyXG5cclxuXHRcdFx0Ly8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmtcclxuXHRcdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIFwibG9hZFwiLCBqUXVlcnkucmVhZHksIGZhbHNlICk7XHJcblxyXG5cdFx0Ly8gSWYgSUUgZXZlbnQgbW9kZWwgaXMgdXNlZFxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gRW5zdXJlIGZpcmluZyBiZWZvcmUgb25sb2FkLCBtYXliZSBsYXRlIGJ1dCBzYWZlIGFsc28gZm9yIGlmcmFtZXNcclxuXHRcdFx0ZG9jdW1lbnQuYXR0YWNoRXZlbnQoIFwib25yZWFkeXN0YXRlY2hhbmdlXCIsIERPTUNvbnRlbnRMb2FkZWQgKTtcclxuXHJcblx0XHRcdC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrXHJcblx0XHRcdHdpbmRvdy5hdHRhY2hFdmVudCggXCJvbmxvYWRcIiwgalF1ZXJ5LnJlYWR5ICk7XHJcblxyXG5cdFx0XHQvLyBJZiBJRSBhbmQgbm90IGEgZnJhbWVcclxuXHRcdFx0Ly8gY29udGludWFsbHkgY2hlY2sgdG8gc2VlIGlmIHRoZSBkb2N1bWVudCBpcyByZWFkeVxyXG5cdFx0XHR2YXIgdG9wID0gZmFsc2U7XHJcblxyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdHRvcCA9IHdpbmRvdy5mcmFtZUVsZW1lbnQgPT0gbnVsbCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XHJcblx0XHRcdH0gY2F0Y2goZSkge31cclxuXHJcblx0XHRcdGlmICggdG9wICYmIHRvcC5kb1Njcm9sbCApIHtcclxuXHRcdFx0XHQoZnVuY3Rpb24gZG9TY3JvbGxDaGVjaygpIHtcclxuXHRcdFx0XHRcdGlmICggIWpRdWVyeS5pc1JlYWR5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0XHQvLyBVc2UgdGhlIHRyaWNrIGJ5IERpZWdvIFBlcmluaVxyXG5cdFx0XHRcdFx0XHRcdC8vIGh0dHA6Ly9qYXZhc2NyaXB0Lm53Ym94LmNvbS9JRUNvbnRlbnRMb2FkZWQvXHJcblx0XHRcdFx0XHRcdFx0dG9wLmRvU2Nyb2xsKFwibGVmdFwiKTtcclxuXHRcdFx0XHRcdFx0fSBjYXRjaChlKSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHNldFRpbWVvdXQoIGRvU2Nyb2xsQ2hlY2ssIDUwICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8vIGFuZCBleGVjdXRlIGFueSB3YWl0aW5nIGZ1bmN0aW9uc1xyXG5cdFx0XHRcdFx0XHRqUXVlcnkucmVhZHkoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiByZWFkeUxpc3QucHJvbWlzZSggb2JqICk7XHJcbn07XHJcblxyXG4vLyBQb3B1bGF0ZSB0aGUgY2xhc3MydHlwZSBtYXBcclxualF1ZXJ5LmVhY2goXCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0XCIuc3BsaXQoXCIgXCIpLCBmdW5jdGlvbihpLCBuYW1lKSB7XHJcblx0Y2xhc3MydHlwZVsgXCJbb2JqZWN0IFwiICsgbmFtZSArIFwiXVwiIF0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XHJcbn0pO1xyXG5cclxuLy8gQWxsIGpRdWVyeSBvYmplY3RzIHNob3VsZCBwb2ludCBiYWNrIHRvIHRoZXNlXHJcbnJvb3RqUXVlcnkgPSBqUXVlcnkoZG9jdW1lbnQpO1xyXG4vLyBTdHJpbmcgdG8gT2JqZWN0IG9wdGlvbnMgZm9ybWF0IGNhY2hlXHJcbnZhciBvcHRpb25zQ2FjaGUgPSB7fTtcclxuXHJcbi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzIGFuZCBzdG9yZSBpbiBjYWNoZVxyXG5mdW5jdGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkge1xyXG5cdHZhciBvYmplY3QgPSBvcHRpb25zQ2FjaGVbIG9wdGlvbnMgXSA9IHt9O1xyXG5cdGpRdWVyeS5lYWNoKCBvcHRpb25zLnNwbGl0KCBjb3JlX3JzcGFjZSApLCBmdW5jdGlvbiggXywgZmxhZyApIHtcclxuXHRcdG9iamVjdFsgZmxhZyBdID0gdHJ1ZTtcclxuXHR9KTtcclxuXHRyZXR1cm4gb2JqZWN0O1xyXG59XHJcblxyXG4vKlxyXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczpcclxuICpcclxuICpcdG9wdGlvbnM6IGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlvbnMgdGhhdCB3aWxsIGNoYW5nZSBob3dcclxuICpcdFx0XHR0aGUgY2FsbGJhY2sgbGlzdCBiZWhhdmVzIG9yIGEgbW9yZSB0cmFkaXRpb25hbCBvcHRpb24gb2JqZWN0XHJcbiAqXHJcbiAqIEJ5IGRlZmF1bHQgYSBjYWxsYmFjayBsaXN0IHdpbGwgYWN0IGxpa2UgYW4gZXZlbnQgY2FsbGJhY2sgbGlzdCBhbmQgY2FuIGJlXHJcbiAqIFwiZmlyZWRcIiBtdWx0aXBsZSB0aW1lcy5cclxuICpcclxuICogUG9zc2libGUgb3B0aW9uczpcclxuICpcclxuICpcdG9uY2U6XHRcdFx0d2lsbCBlbnN1cmUgdGhlIGNhbGxiYWNrIGxpc3QgY2FuIG9ubHkgYmUgZmlyZWQgb25jZSAobGlrZSBhIERlZmVycmVkKVxyXG4gKlxyXG4gKlx0bWVtb3J5Olx0XHRcdHdpbGwga2VlcCB0cmFjayBvZiBwcmV2aW91cyB2YWx1ZXMgYW5kIHdpbGwgY2FsbCBhbnkgY2FsbGJhY2sgYWRkZWRcclxuICpcdFx0XHRcdFx0YWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZmlyZWQgcmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgXCJtZW1vcml6ZWRcIlxyXG4gKlx0XHRcdFx0XHR2YWx1ZXMgKGxpa2UgYSBEZWZlcnJlZClcclxuICpcclxuICpcdHVuaXF1ZTpcdFx0XHR3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdClcclxuICpcclxuICpcdHN0b3BPbkZhbHNlOlx0aW50ZXJydXB0IGNhbGxpbmdzIHdoZW4gYSBjYWxsYmFjayByZXR1cm5zIGZhbHNlXHJcbiAqXHJcbiAqL1xyXG5qUXVlcnkuQ2FsbGJhY2tzID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XHJcblxyXG5cdC8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWRcclxuXHQvLyAod2UgY2hlY2sgaW4gY2FjaGUgZmlyc3QpXHJcblx0b3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiID9cclxuXHRcdCggb3B0aW9uc0NhY2hlWyBvcHRpb25zIF0gfHwgY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApICkgOlxyXG5cdFx0alF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTtcclxuXHJcblx0dmFyIC8vIExhc3QgZmlyZSB2YWx1ZSAoZm9yIG5vbi1mb3JnZXR0YWJsZSBsaXN0cylcclxuXHRcdG1lbW9yeSxcclxuXHRcdC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkXHJcblx0XHRmaXJlZCxcclxuXHRcdC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IGlzIGN1cnJlbnRseSBmaXJpbmdcclxuXHRcdGZpcmluZyxcclxuXHRcdC8vIEZpcnN0IGNhbGxiYWNrIHRvIGZpcmUgKHVzZWQgaW50ZXJuYWxseSBieSBhZGQgYW5kIGZpcmVXaXRoKVxyXG5cdFx0ZmlyaW5nU3RhcnQsXHJcblx0XHQvLyBFbmQgb2YgdGhlIGxvb3Agd2hlbiBmaXJpbmdcclxuXHRcdGZpcmluZ0xlbmd0aCxcclxuXHRcdC8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IHJlbW92ZSBpZiBuZWVkZWQpXHJcblx0XHRmaXJpbmdJbmRleCxcclxuXHRcdC8vIEFjdHVhbCBjYWxsYmFjayBsaXN0XHJcblx0XHRsaXN0ID0gW10sXHJcblx0XHQvLyBTdGFjayBvZiBmaXJlIGNhbGxzIGZvciByZXBlYXRhYmxlIGxpc3RzXHJcblx0XHRzdGFjayA9ICFvcHRpb25zLm9uY2UgJiYgW10sXHJcblx0XHQvLyBGaXJlIGNhbGxiYWNrc1xyXG5cdFx0ZmlyZSA9IGZ1bmN0aW9uKCBkYXRhICkge1xyXG5cdFx0XHRtZW1vcnkgPSBvcHRpb25zLm1lbW9yeSAmJiBkYXRhO1xyXG5cdFx0XHRmaXJlZCA9IHRydWU7XHJcblx0XHRcdGZpcmluZ0luZGV4ID0gZmlyaW5nU3RhcnQgfHwgMDtcclxuXHRcdFx0ZmlyaW5nU3RhcnQgPSAwO1xyXG5cdFx0XHRmaXJpbmdMZW5ndGggPSBsaXN0Lmxlbmd0aDtcclxuXHRcdFx0ZmlyaW5nID0gdHJ1ZTtcclxuXHRcdFx0Zm9yICggOyBsaXN0ICYmIGZpcmluZ0luZGV4IDwgZmlyaW5nTGVuZ3RoOyBmaXJpbmdJbmRleCsrICkge1xyXG5cdFx0XHRcdGlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggZGF0YVsgMCBdLCBkYXRhWyAxIF0gKSA9PT0gZmFsc2UgJiYgb3B0aW9ucy5zdG9wT25GYWxzZSApIHtcclxuXHRcdFx0XHRcdG1lbW9yeSA9IGZhbHNlOyAvLyBUbyBwcmV2ZW50IGZ1cnRoZXIgY2FsbHMgdXNpbmcgYWRkXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0ZmlyaW5nID0gZmFsc2U7XHJcblx0XHRcdGlmICggbGlzdCApIHtcclxuXHRcdFx0XHRpZiAoIHN0YWNrICkge1xyXG5cdFx0XHRcdFx0aWYgKCBzdGFjay5sZW5ndGggKSB7XHJcblx0XHRcdFx0XHRcdGZpcmUoIHN0YWNrLnNoaWZ0KCkgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtZW1vcnkgKSB7XHJcblx0XHRcdFx0XHRsaXN0ID0gW107XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHNlbGYuZGlzYWJsZSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdC8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0XHJcblx0XHRzZWxmID0ge1xyXG5cdFx0XHQvLyBBZGQgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIHRvIHRoZSBsaXN0XHJcblx0XHRcdGFkZDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xyXG5cdFx0XHRcdFx0Ly8gRmlyc3QsIHdlIHNhdmUgdGhlIGN1cnJlbnQgbGVuZ3RoXHJcblx0XHRcdFx0XHR2YXIgc3RhcnQgPSBsaXN0Lmxlbmd0aDtcclxuXHRcdFx0XHRcdChmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7XHJcblx0XHRcdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmdzLCBmdW5jdGlvbiggXywgYXJnICkge1xyXG5cdFx0XHRcdFx0XHRcdHZhciB0eXBlID0galF1ZXJ5LnR5cGUoIGFyZyApO1xyXG5cdFx0XHRcdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmdW5jdGlvblwiICYmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSApIHtcclxuXHRcdFx0XHRcdFx0XHRcdGxpc3QucHVzaCggYXJnICk7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIEluc3BlY3QgcmVjdXJzaXZlbHlcclxuXHRcdFx0XHRcdFx0XHRcdGFkZCggYXJnICk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH0pKCBhcmd1bWVudHMgKTtcclxuXHRcdFx0XHRcdC8vIERvIHdlIG5lZWQgdG8gYWRkIHRoZSBjYWxsYmFja3MgdG8gdGhlXHJcblx0XHRcdFx0XHQvLyBjdXJyZW50IGZpcmluZyBiYXRjaD9cclxuXHRcdFx0XHRcdGlmICggZmlyaW5nICkge1xyXG5cdFx0XHRcdFx0XHRmaXJpbmdMZW5ndGggPSBsaXN0Lmxlbmd0aDtcclxuXHRcdFx0XHRcdC8vIFdpdGggbWVtb3J5LCBpZiB3ZSdyZSBub3QgZmlyaW5nIHRoZW5cclxuXHRcdFx0XHRcdC8vIHdlIHNob3VsZCBjYWxsIHJpZ2h0IGF3YXlcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIG1lbW9yeSApIHtcclxuXHRcdFx0XHRcdFx0ZmlyaW5nU3RhcnQgPSBzdGFydDtcclxuXHRcdFx0XHRcdFx0ZmlyZSggbWVtb3J5ICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHQvLyBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBsaXN0XHJcblx0XHRcdHJlbW92ZTogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xyXG5cdFx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHtcclxuXHRcdFx0XHRcdFx0dmFyIGluZGV4O1xyXG5cdFx0XHRcdFx0XHR3aGlsZSggKCBpbmRleCA9IGpRdWVyeS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkge1xyXG5cdFx0XHRcdFx0XHRcdGxpc3Quc3BsaWNlKCBpbmRleCwgMSApO1xyXG5cdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBmaXJpbmcgaW5kZXhlc1xyXG5cdFx0XHRcdFx0XHRcdGlmICggZmlyaW5nICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBpbmRleCA8PSBmaXJpbmdMZW5ndGggKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGZpcmluZ0xlbmd0aC0tO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXgtLTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdFx0fSxcclxuXHRcdFx0Ly8gQ29udHJvbCBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0XHJcblx0XHRcdGhhczogZnVuY3Rpb24oIGZuICkge1xyXG5cdFx0XHRcdHJldHVybiBqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHQvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0XHJcblx0XHRcdGVtcHR5OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRsaXN0ID0gW107XHJcblx0XHRcdFx0cmV0dXJuIHRoaXM7XHJcblx0XHRcdH0sXHJcblx0XHRcdC8vIEhhdmUgdGhlIGxpc3QgZG8gbm90aGluZyBhbnltb3JlXHJcblx0XHRcdGRpc2FibGU6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGxpc3QgPSBzdGFjayA9IG1lbW9yeSA9IHVuZGVmaW5lZDtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdFx0fSxcclxuXHRcdFx0Ly8gSXMgaXQgZGlzYWJsZWQ/XHJcblx0XHRcdGRpc2FibGVkOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRyZXR1cm4gIWxpc3Q7XHJcblx0XHRcdH0sXHJcblx0XHRcdC8vIExvY2sgdGhlIGxpc3QgaW4gaXRzIGN1cnJlbnQgc3RhdGVcclxuXHRcdFx0bG9jazogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0c3RhY2sgPSB1bmRlZmluZWQ7XHJcblx0XHRcdFx0aWYgKCAhbWVtb3J5ICkge1xyXG5cdFx0XHRcdFx0c2VsZi5kaXNhYmxlKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHQvLyBJcyBpdCBsb2NrZWQ/XHJcblx0XHRcdGxvY2tlZDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0cmV0dXJuICFzdGFjaztcclxuXHRcdFx0fSxcclxuXHRcdFx0Ly8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xyXG5cdFx0XHRmaXJlV2l0aDogZnVuY3Rpb24oIGNvbnRleHQsIGFyZ3MgKSB7XHJcblx0XHRcdFx0YXJncyA9IGFyZ3MgfHwgW107XHJcblx0XHRcdFx0YXJncyA9IFsgY29udGV4dCwgYXJncy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFyZ3MgXTtcclxuXHRcdFx0XHRpZiAoIGxpc3QgJiYgKCAhZmlyZWQgfHwgc3RhY2sgKSApIHtcclxuXHRcdFx0XHRcdGlmICggZmlyaW5nICkge1xyXG5cdFx0XHRcdFx0XHRzdGFjay5wdXNoKCBhcmdzICk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRmaXJlKCBhcmdzICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHQvLyBDYWxsIGFsbCB0aGUgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50c1xyXG5cdFx0XHRmaXJlOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRzZWxmLmZpcmVXaXRoKCB0aGlzLCBhcmd1bWVudHMgKTtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdFx0fSxcclxuXHRcdFx0Ly8gVG8ga25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlXHJcblx0XHRcdGZpcmVkOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRyZXR1cm4gISFmaXJlZDtcclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHJcblx0cmV0dXJuIHNlbGY7XHJcbn07XHJcbmpRdWVyeS5leHRlbmQoe1xyXG5cclxuXHREZWZlcnJlZDogZnVuY3Rpb24oIGZ1bmMgKSB7XHJcblx0XHR2YXIgdHVwbGVzID0gW1xyXG5cdFx0XHRcdC8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBsaXN0ZW5lciBsaXN0LCBmaW5hbCBzdGF0ZVxyXG5cdFx0XHRcdFsgXCJyZXNvbHZlXCIsIFwiZG9uZVwiLCBqUXVlcnkuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIiksIFwicmVzb2x2ZWRcIiBdLFxyXG5cdFx0XHRcdFsgXCJyZWplY3RcIiwgXCJmYWlsXCIsIGpRdWVyeS5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKSwgXCJyZWplY3RlZFwiIF0sXHJcblx0XHRcdFx0WyBcIm5vdGlmeVwiLCBcInByb2dyZXNzXCIsIGpRdWVyeS5DYWxsYmFja3MoXCJtZW1vcnlcIikgXVxyXG5cdFx0XHRdLFxyXG5cdFx0XHRzdGF0ZSA9IFwicGVuZGluZ1wiLFxyXG5cdFx0XHRwcm9taXNlID0ge1xyXG5cdFx0XHRcdHN0YXRlOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdHJldHVybiBzdGF0ZTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGFsd2F5czogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHRkZWZlcnJlZC5kb25lKCBhcmd1bWVudHMgKS5mYWlsKCBhcmd1bWVudHMgKTtcclxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0dGhlbjogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkge1xyXG5cdFx0XHRcdFx0dmFyIGZucyA9IGFyZ3VtZW50cztcclxuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoZnVuY3Rpb24oIG5ld0RlZmVyICkge1xyXG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIGFjdGlvbiA9IHR1cGxlWyAwIF0sXHJcblx0XHRcdFx0XHRcdFx0XHRmbiA9IGZuc1sgaSBdO1xyXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkWyBkb25lIHwgZmFpbCB8IHByb2dyZXNzIF0gZm9yIGZvcndhcmRpbmcgYWN0aW9ucyB0byBuZXdEZWZlclxyXG5cdFx0XHRcdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsxXSBdKCBqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSA/XHJcblx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIHJldHVybmVkID0gZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQucHJvbWlzZSgpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuZmFpbCggbmV3RGVmZXIucmVqZWN0IClcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXJbIGFjdGlvbiArIFwiV2l0aFwiIF0oIHRoaXMgPT09IGRlZmVycmVkID8gbmV3RGVmZXIgOiB0aGlzLCBbIHJldHVybmVkIF0gKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fSA6XHJcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlclsgYWN0aW9uIF1cclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0Zm5zID0gbnVsbDtcclxuXHRcdFx0XHRcdH0pLnByb21pc2UoKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8vIEdldCBhIHByb21pc2UgZm9yIHRoaXMgZGVmZXJyZWRcclxuXHRcdFx0XHQvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0XHJcblx0XHRcdFx0cHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHtcclxuXHRcdFx0XHRcdHJldHVybiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiID8galF1ZXJ5LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHRcdFx0ZGVmZXJyZWQgPSB7fTtcclxuXHJcblx0XHQvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0XHJcblx0XHRwcm9taXNlLnBpcGUgPSBwcm9taXNlLnRoZW47XHJcblxyXG5cdFx0Ly8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kc1xyXG5cdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xyXG5cdFx0XHR2YXIgbGlzdCA9IHR1cGxlWyAyIF0sXHJcblx0XHRcdFx0c3RhdGVTdHJpbmcgPSB0dXBsZVsgMyBdO1xyXG5cclxuXHRcdFx0Ly8gcHJvbWlzZVsgZG9uZSB8IGZhaWwgfCBwcm9ncmVzcyBdID0gbGlzdC5hZGRcclxuXHRcdFx0cHJvbWlzZVsgdHVwbGVbMV0gXSA9IGxpc3QuYWRkO1xyXG5cclxuXHRcdFx0Ly8gSGFuZGxlIHN0YXRlXHJcblx0XHRcdGlmICggc3RhdGVTdHJpbmcgKSB7XHJcblx0XHRcdFx0bGlzdC5hZGQoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHQvLyBzdGF0ZSA9IFsgcmVzb2x2ZWQgfCByZWplY3RlZCBdXHJcblx0XHRcdFx0XHRzdGF0ZSA9IHN0YXRlU3RyaW5nO1xyXG5cclxuXHRcdFx0XHQvLyBbIHJlamVjdF9saXN0IHwgcmVzb2x2ZV9saXN0IF0uZGlzYWJsZTsgcHJvZ3Jlc3NfbGlzdC5sb2NrXHJcblx0XHRcdFx0fSwgdHVwbGVzWyBpIF4gMSBdWyAyIF0uZGlzYWJsZSwgdHVwbGVzWyAyIF1bIDIgXS5sb2NrICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGRlZmVycmVkWyByZXNvbHZlIHwgcmVqZWN0IHwgbm90aWZ5IF0gPSBsaXN0LmZpcmVcclxuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWzBdIF0gPSBsaXN0LmZpcmU7XHJcblx0XHRcdGRlZmVycmVkWyB0dXBsZVswXSArIFwiV2l0aFwiIF0gPSBsaXN0LmZpcmVXaXRoO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gTWFrZSB0aGUgZGVmZXJyZWQgYSBwcm9taXNlXHJcblx0XHRwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7XHJcblxyXG5cdFx0Ly8gQ2FsbCBnaXZlbiBmdW5jIGlmIGFueVxyXG5cdFx0aWYgKCBmdW5jICkge1xyXG5cdFx0XHRmdW5jLmNhbGwoIGRlZmVycmVkLCBkZWZlcnJlZCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEFsbCBkb25lIVxyXG5cdFx0cmV0dXJuIGRlZmVycmVkO1xyXG5cdH0sXHJcblxyXG5cdC8vIERlZmVycmVkIGhlbHBlclxyXG5cdHdoZW46IGZ1bmN0aW9uKCBzdWJvcmRpbmF0ZSAvKiAsIC4uLiwgc3Vib3JkaW5hdGVOICovICkge1xyXG5cdFx0dmFyIGkgPSAwLFxyXG5cdFx0XHRyZXNvbHZlVmFsdWVzID0gY29yZV9zbGljZS5jYWxsKCBhcmd1bWVudHMgKSxcclxuXHRcdFx0bGVuZ3RoID0gcmVzb2x2ZVZhbHVlcy5sZW5ndGgsXHJcblxyXG5cdFx0XHQvLyB0aGUgY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzXHJcblx0XHRcdHJlbWFpbmluZyA9IGxlbmd0aCAhPT0gMSB8fCAoIHN1Ym9yZGluYXRlICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBzdWJvcmRpbmF0ZS5wcm9taXNlICkgKSA/IGxlbmd0aCA6IDAsXHJcblxyXG5cdFx0XHQvLyB0aGUgbWFzdGVyIERlZmVycmVkLiBJZiByZXNvbHZlVmFsdWVzIGNvbnNpc3Qgb2Ygb25seSBhIHNpbmdsZSBEZWZlcnJlZCwganVzdCB1c2UgdGhhdC5cclxuXHRcdFx0ZGVmZXJyZWQgPSByZW1haW5pbmcgPT09IDEgPyBzdWJvcmRpbmF0ZSA6IGpRdWVyeS5EZWZlcnJlZCgpLFxyXG5cclxuXHRcdFx0Ly8gVXBkYXRlIGZ1bmN0aW9uIGZvciBib3RoIHJlc29sdmUgYW5kIHByb2dyZXNzIHZhbHVlc1xyXG5cdFx0XHR1cGRhdGVGdW5jID0gZnVuY3Rpb24oIGksIGNvbnRleHRzLCB2YWx1ZXMgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcclxuXHRcdFx0XHRcdGNvbnRleHRzWyBpIF0gPSB0aGlzO1xyXG5cdFx0XHRcdFx0dmFsdWVzWyBpIF0gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGNvcmVfc2xpY2UuY2FsbCggYXJndW1lbnRzICkgOiB2YWx1ZTtcclxuXHRcdFx0XHRcdGlmKCB2YWx1ZXMgPT09IHByb2dyZXNzVmFsdWVzICkge1xyXG5cdFx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCAhKCAtLXJlbWFpbmluZyApICkge1xyXG5cdFx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggY29udGV4dHMsIHZhbHVlcyApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH07XHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRwcm9ncmVzc1ZhbHVlcywgcHJvZ3Jlc3NDb250ZXh0cywgcmVzb2x2ZUNvbnRleHRzO1xyXG5cclxuXHRcdC8vIGFkZCBsaXN0ZW5lcnMgdG8gRGVmZXJyZWQgc3Vib3JkaW5hdGVzOyB0cmVhdCBvdGhlcnMgYXMgcmVzb2x2ZWRcclxuXHRcdGlmICggbGVuZ3RoID4gMSApIHtcclxuXHRcdFx0cHJvZ3Jlc3NWYWx1ZXMgPSBuZXcgQXJyYXkoIGxlbmd0aCApO1xyXG5cdFx0XHRwcm9ncmVzc0NvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTtcclxuXHRcdFx0cmVzb2x2ZUNvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTtcclxuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XHJcblx0XHRcdFx0aWYgKCByZXNvbHZlVmFsdWVzWyBpIF0gJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNlICkgKSB7XHJcblx0XHRcdFx0XHRyZXNvbHZlVmFsdWVzWyBpIF0ucHJvbWlzZSgpXHJcblx0XHRcdFx0XHRcdC5kb25lKCB1cGRhdGVGdW5jKCBpLCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKSApXHJcblx0XHRcdFx0XHRcdC5mYWlsKCBkZWZlcnJlZC5yZWplY3QgKVxyXG5cdFx0XHRcdFx0XHQucHJvZ3Jlc3MoIHVwZGF0ZUZ1bmMoIGksIHByb2dyZXNzQ29udGV4dHMsIHByb2dyZXNzVmFsdWVzICkgKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0LS1yZW1haW5pbmc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gaWYgd2UncmUgbm90IHdhaXRpbmcgb24gYW55dGhpbmcsIHJlc29sdmUgdGhlIG1hc3RlclxyXG5cdFx0aWYgKCAhcmVtYWluaW5nICkge1xyXG5cdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGRlZmVycmVkLnByb21pc2UoKTtcclxuXHR9XHJcbn0pO1xyXG5qUXVlcnkuc3VwcG9ydCA9IChmdW5jdGlvbigpIHtcclxuXHJcblx0dmFyIHN1cHBvcnQsXHJcblx0XHRhbGwsXHJcblx0XHRhLFxyXG5cdFx0c2VsZWN0LFxyXG5cdFx0b3B0LFxyXG5cdFx0aW5wdXQsXHJcblx0XHRmcmFnbWVudCxcclxuXHRcdGV2ZW50TmFtZSxcclxuXHRcdGksXHJcblx0XHRpc1N1cHBvcnRlZCxcclxuXHRcdGNsaWNrRm4sXHJcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuXHQvLyBQcmVsaW1pbmFyeSB0ZXN0c1xyXG5cdGRpdi5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NOYW1lXCIsIFwidFwiICk7XHJcblx0ZGl2LmlubmVySFRNTCA9IFwiICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+XCI7XHJcblxyXG5cdGFsbCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIik7XHJcblx0YSA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZShcImFcIilbIDAgXTtcclxuXHRhLnN0eWxlLmNzc1RleHQgPSBcInRvcDoxcHg7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41XCI7XHJcblxyXG5cdC8vIENhbid0IGdldCBiYXNpYyB0ZXN0IHN1cHBvcnRcclxuXHRpZiAoICFhbGwgfHwgIWFsbC5sZW5ndGggfHwgIWEgKSB7XHJcblx0XHRyZXR1cm4ge307XHJcblx0fVxyXG5cclxuXHQvLyBGaXJzdCBiYXRjaCBvZiBzdXBwb3J0cyB0ZXN0c1xyXG5cdHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIik7XHJcblx0b3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpICk7XHJcblx0aW5wdXQgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJpbnB1dFwiKVsgMCBdO1xyXG5cclxuXHRzdXBwb3J0ID0ge1xyXG5cdFx0Ly8gSUUgc3RyaXBzIGxlYWRpbmcgd2hpdGVzcGFjZSB3aGVuIC5pbm5lckhUTUwgaXMgdXNlZFxyXG5cdFx0bGVhZGluZ1doaXRlc3BhY2U6ICggZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IDMgKSxcclxuXHJcblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0Ym9keSBlbGVtZW50cyBhcmVuJ3QgYXV0b21hdGljYWxseSBpbnNlcnRlZFxyXG5cdFx0Ly8gSUUgd2lsbCBpbnNlcnQgdGhlbSBpbnRvIGVtcHR5IHRhYmxlc1xyXG5cdFx0dGJvZHk6ICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0Ym9keVwiKS5sZW5ndGgsXHJcblxyXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgbGluayBlbGVtZW50cyBnZXQgc2VyaWFsaXplZCBjb3JyZWN0bHkgYnkgaW5uZXJIVE1MXHJcblx0XHQvLyBUaGlzIHJlcXVpcmVzIGEgd3JhcHBlciBlbGVtZW50IGluIElFXHJcblx0XHRodG1sU2VyaWFsaXplOiAhIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZShcImxpbmtcIikubGVuZ3RoLFxyXG5cclxuXHRcdC8vIEdldCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gZnJvbSBnZXRBdHRyaWJ1dGVcclxuXHRcdC8vIChJRSB1c2VzIC5jc3NUZXh0IGluc3RlYWQpXHJcblx0XHRzdHlsZTogL3RvcC8udGVzdCggYS5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKSApLFxyXG5cclxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IFVSTHMgYXJlbid0IG1hbmlwdWxhdGVkXHJcblx0XHQvLyAoSUUgbm9ybWFsaXplcyBpdCBieSBkZWZhdWx0KVxyXG5cdFx0aHJlZk5vcm1hbGl6ZWQ6ICggYS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpID09PSBcIi9hXCIgKSxcclxuXHJcblx0XHQvLyBNYWtlIHN1cmUgdGhhdCBlbGVtZW50IG9wYWNpdHkgZXhpc3RzXHJcblx0XHQvLyAoSUUgdXNlcyBmaWx0ZXIgaW5zdGVhZClcclxuXHRcdC8vIFVzZSBhIHJlZ2V4IHRvIHdvcmsgYXJvdW5kIGEgV2ViS2l0IGlzc3VlLiBTZWUgIzUxNDVcclxuXHRcdG9wYWNpdHk6IC9eMC41Ly50ZXN0KCBhLnN0eWxlLm9wYWNpdHkgKSxcclxuXHJcblx0XHQvLyBWZXJpZnkgc3R5bGUgZmxvYXQgZXhpc3RlbmNlXHJcblx0XHQvLyAoSUUgdXNlcyBzdHlsZUZsb2F0IGluc3RlYWQgb2YgY3NzRmxvYXQpXHJcblx0XHRjc3NGbG9hdDogISFhLnN0eWxlLmNzc0Zsb2F0LFxyXG5cclxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCBmb3IgYSBjaGVja2JveFxyXG5cdFx0Ly8gdGhhdCBpdCBkZWZhdWx0cyB0byBcIm9uXCIuXHJcblx0XHQvLyAoV2ViS2l0IGRlZmF1bHRzIHRvIFwiXCIgaW5zdGVhZClcclxuXHRcdGNoZWNrT246ICggaW5wdXQudmFsdWUgPT09IFwib25cIiApLFxyXG5cclxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IGEgc2VsZWN0ZWQtYnktZGVmYXVsdCBvcHRpb24gaGFzIGEgd29ya2luZyBzZWxlY3RlZCBwcm9wZXJ0eS5cclxuXHRcdC8vIChXZWJLaXQgZGVmYXVsdHMgdG8gZmFsc2UgaW5zdGVhZCBvZiB0cnVlLCBJRSB0b28sIGlmIGl0J3MgaW4gYW4gb3B0Z3JvdXApXHJcblx0XHRvcHRTZWxlY3RlZDogb3B0LnNlbGVjdGVkLFxyXG5cclxuXHRcdC8vIFRlc3Qgc2V0QXR0cmlidXRlIG9uIGNhbWVsQ2FzZSBjbGFzcy4gSWYgaXQgd29ya3MsIHdlIG5lZWQgYXR0ckZpeGVzIHdoZW4gZG9pbmcgZ2V0L3NldEF0dHJpYnV0ZSAoaWU2LzcpXHJcblx0XHRnZXRTZXRBdHRyaWJ1dGU6IGRpdi5jbGFzc05hbWUgIT09IFwidFwiLFxyXG5cclxuXHRcdC8vIFRlc3RzIGZvciBlbmN0eXBlIHN1cHBvcnQgb24gYSBmb3JtKCM2NzQzKVxyXG5cdFx0ZW5jdHlwZTogISFkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKS5lbmN0eXBlLFxyXG5cclxuXHRcdC8vIE1ha2VzIHN1cmUgY2xvbmluZyBhbiBodG1sNSBlbGVtZW50IGRvZXMgbm90IGNhdXNlIHByb2JsZW1zXHJcblx0XHQvLyBXaGVyZSBvdXRlckhUTUwgaXMgdW5kZWZpbmVkLCB0aGlzIHN0aWxsIHdvcmtzXHJcblx0XHRodG1sNUNsb25lOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibmF2XCIpLmNsb25lTm9kZSggdHJ1ZSApLm91dGVySFRNTCAhPT0gXCI8Om5hdj48LzpuYXY+XCIsXHJcblxyXG5cdFx0Ly8galF1ZXJ5LnN1cHBvcnQuYm94TW9kZWwgREVQUkVDQVRFRCBpbiAxLjggc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBRdWlya3MgTW9kZVxyXG5cdFx0Ym94TW9kZWw6ICggZG9jdW1lbnQuY29tcGF0TW9kZSA9PT0gXCJDU1MxQ29tcGF0XCIgKSxcclxuXHJcblx0XHQvLyBXaWxsIGJlIGRlZmluZWQgbGF0ZXJcclxuXHRcdHN1Ym1pdEJ1YmJsZXM6IHRydWUsXHJcblx0XHRjaGFuZ2VCdWJibGVzOiB0cnVlLFxyXG5cdFx0Zm9jdXNpbkJ1YmJsZXM6IGZhbHNlLFxyXG5cdFx0ZGVsZXRlRXhwYW5kbzogdHJ1ZSxcclxuXHRcdG5vQ2xvbmVFdmVudDogdHJ1ZSxcclxuXHRcdGlubGluZUJsb2NrTmVlZHNMYXlvdXQ6IGZhbHNlLFxyXG5cdFx0c2hyaW5rV3JhcEJsb2NrczogZmFsc2UsXHJcblx0XHRyZWxpYWJsZU1hcmdpblJpZ2h0OiB0cnVlLFxyXG5cdFx0Ym94U2l6aW5nUmVsaWFibGU6IHRydWUsXHJcblx0XHRwaXhlbFBvc2l0aW9uOiBmYWxzZVxyXG5cdH07XHJcblxyXG5cdC8vIE1ha2Ugc3VyZSBjaGVja2VkIHN0YXR1cyBpcyBwcm9wZXJseSBjbG9uZWRcclxuXHRpbnB1dC5jaGVja2VkID0gdHJ1ZTtcclxuXHRzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gaW5wdXQuY2xvbmVOb2RlKCB0cnVlICkuY2hlY2tlZDtcclxuXHJcblx0Ly8gTWFrZSBzdXJlIHRoYXQgdGhlIG9wdGlvbnMgaW5zaWRlIGRpc2FibGVkIHNlbGVjdHMgYXJlbid0IG1hcmtlZCBhcyBkaXNhYmxlZFxyXG5cdC8vIChXZWJLaXQgbWFya3MgdGhlbSBhcyBkaXNhYmxlZClcclxuXHRzZWxlY3QuZGlzYWJsZWQgPSB0cnVlO1xyXG5cdHN1cHBvcnQub3B0RGlzYWJsZWQgPSAhb3B0LmRpc2FibGVkO1xyXG5cclxuXHQvLyBUZXN0IHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRlbGV0ZSBhbiBleHBhbmRvIGZyb20gYW4gZWxlbWVudFxyXG5cdC8vIEZhaWxzIGluIEludGVybmV0IEV4cGxvcmVyXHJcblx0dHJ5IHtcclxuXHRcdGRlbGV0ZSBkaXYudGVzdDtcclxuXHR9IGNhdGNoKCBlICkge1xyXG5cdFx0c3VwcG9ydC5kZWxldGVFeHBhbmRvID0gZmFsc2U7XHJcblx0fVxyXG5cclxuXHRpZiAoICFkaXYuYWRkRXZlbnRMaXN0ZW5lciAmJiBkaXYuYXR0YWNoRXZlbnQgJiYgZGl2LmZpcmVFdmVudCApIHtcclxuXHRcdGRpdi5hdHRhY2hFdmVudCggXCJvbmNsaWNrXCIsIGNsaWNrRm4gPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0Ly8gQ2xvbmluZyBhIG5vZGUgc2hvdWxkbid0IGNvcHkgb3ZlciBhbnlcclxuXHRcdFx0Ly8gYm91bmQgZXZlbnQgaGFuZGxlcnMgKElFIGRvZXMgdGhpcylcclxuXHRcdFx0c3VwcG9ydC5ub0Nsb25lRXZlbnQgPSBmYWxzZTtcclxuXHRcdH0pO1xyXG5cdFx0ZGl2LmNsb25lTm9kZSggdHJ1ZSApLmZpcmVFdmVudChcIm9uY2xpY2tcIik7XHJcblx0XHRkaXYuZGV0YWNoRXZlbnQoIFwib25jbGlja1wiLCBjbGlja0ZuICk7XHJcblx0fVxyXG5cclxuXHQvLyBDaGVjayBpZiBhIHJhZGlvIG1haW50YWlucyBpdHMgdmFsdWVcclxuXHQvLyBhZnRlciBiZWluZyBhcHBlbmRlZCB0byB0aGUgRE9NXHJcblx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XHJcblx0aW5wdXQudmFsdWUgPSBcInRcIjtcclxuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCBcInJhZGlvXCIgKTtcclxuXHRzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gXCJ0XCI7XHJcblxyXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJjaGVja2VkXCIsIFwiY2hlY2tlZFwiICk7XHJcblxyXG5cdC8vICMxMTIxNyAtIFdlYktpdCBsb3NlcyBjaGVjayB3aGVuIHRoZSBuYW1lIGlzIGFmdGVyIHRoZSBjaGVja2VkIGF0dHJpYnV0ZVxyXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwidFwiICk7XHJcblxyXG5cdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKTtcclxuXHRmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHRmcmFnbWVudC5hcHBlbmRDaGlsZCggZGl2Lmxhc3RDaGlsZCApO1xyXG5cclxuXHQvLyBXZWJLaXQgZG9lc24ndCBjbG9uZSBjaGVja2VkIHN0YXRlIGNvcnJlY3RseSBpbiBmcmFnbWVudHNcclxuXHRzdXBwb3J0LmNoZWNrQ2xvbmUgPSBmcmFnbWVudC5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDtcclxuXHJcblx0Ly8gQ2hlY2sgaWYgYSBkaXNjb25uZWN0ZWQgY2hlY2tib3ggd2lsbCByZXRhaW4gaXRzIGNoZWNrZWRcclxuXHQvLyB2YWx1ZSBvZiB0cnVlIGFmdGVyIGFwcGVuZGVkIHRvIHRoZSBET00gKElFNi83KVxyXG5cdHN1cHBvcnQuYXBwZW5kQ2hlY2tlZCA9IGlucHV0LmNoZWNrZWQ7XHJcblxyXG5cdGZyYWdtZW50LnJlbW92ZUNoaWxkKCBpbnB1dCApO1xyXG5cdGZyYWdtZW50LmFwcGVuZENoaWxkKCBkaXYgKTtcclxuXHJcblx0Ly8gVGVjaG5pcXVlIGZyb20gSnVyaXkgWmF5dHNldlxyXG5cdC8vIGh0dHA6Ly9wZXJmZWN0aW9ua2lsbHMuY29tL2RldGVjdGluZy1ldmVudC1zdXBwb3J0LXdpdGhvdXQtYnJvd3Nlci1zbmlmZmluZy9cclxuXHQvLyBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGNhc2Ugd2hlcmUgbm9uLXN0YW5kYXJkIGV2ZW50IHN5c3RlbXNcclxuXHQvLyBhcmUgdXNlZCwgbmFtZWx5IGluIElFLiBTaG9ydC1jaXJjdWl0aW5nIGhlcmUgaGVscHMgdXMgdG9cclxuXHQvLyBhdm9pZCBhbiBldmFsIGNhbGwgKGluIHNldEF0dHJpYnV0ZSkgd2hpY2ggY2FuIGNhdXNlIENTUFxyXG5cdC8vIHRvIGdvIGhheXdpcmUuIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vU2VjdXJpdHkvQ1NQXHJcblx0aWYgKCBkaXYuYXR0YWNoRXZlbnQgKSB7XHJcblx0XHRmb3IgKCBpIGluIHtcclxuXHRcdFx0c3VibWl0OiB0cnVlLFxyXG5cdFx0XHRjaGFuZ2U6IHRydWUsXHJcblx0XHRcdGZvY3VzaW46IHRydWVcclxuXHRcdH0pIHtcclxuXHRcdFx0ZXZlbnROYW1lID0gXCJvblwiICsgaTtcclxuXHRcdFx0aXNTdXBwb3J0ZWQgPSAoIGV2ZW50TmFtZSBpbiBkaXYgKTtcclxuXHRcdFx0aWYgKCAhaXNTdXBwb3J0ZWQgKSB7XHJcblx0XHRcdFx0ZGl2LnNldEF0dHJpYnV0ZSggZXZlbnROYW1lLCBcInJldHVybjtcIiApO1xyXG5cdFx0XHRcdGlzU3VwcG9ydGVkID0gKCB0eXBlb2YgZGl2WyBldmVudE5hbWUgXSA9PT0gXCJmdW5jdGlvblwiICk7XHJcblx0XHRcdH1cclxuXHRcdFx0c3VwcG9ydFsgaSArIFwiQnViYmxlc1wiIF0gPSBpc1N1cHBvcnRlZDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIFJ1biB0ZXN0cyB0aGF0IG5lZWQgYSBib2R5IGF0IGRvYyByZWFkeVxyXG5cdGpRdWVyeShmdW5jdGlvbigpIHtcclxuXHRcdHZhciBjb250YWluZXIsIGRpdiwgdGRzLCBtYXJnaW5EaXYsXHJcblx0XHRcdGRpdlJlc2V0ID0gXCJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47XCIsXHJcblx0XHRcdGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJvZHlcIilbMF07XHJcblxyXG5cdFx0aWYgKCAhYm9keSApIHtcclxuXHRcdFx0Ly8gUmV0dXJuIGZvciBmcmFtZXNldCBkb2NzIHRoYXQgZG9uJ3QgaGF2ZSBhIGJvZHlcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHRjb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IFwidmlzaWJpbGl0eTpoaWRkZW47Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjpzdGF0aWM7dG9wOjA7bWFyZ2luLXRvcDoxcHhcIjtcclxuXHRcdGJvZHkuaW5zZXJ0QmVmb3JlKCBjb250YWluZXIsIGJvZHkuZmlyc3RDaGlsZCApO1xyXG5cclxuXHRcdC8vIENvbnN0cnVjdCB0aGUgdGVzdCBlbGVtZW50XHJcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0Y29udGFpbmVyLmFwcGVuZENoaWxkKCBkaXYgKTtcclxuXHJcblx0XHQvLyBDaGVjayBpZiB0YWJsZSBjZWxscyBzdGlsbCBoYXZlIG9mZnNldFdpZHRoL0hlaWdodCB3aGVuIHRoZXkgYXJlIHNldFxyXG5cdFx0Ly8gdG8gZGlzcGxheTpub25lIGFuZCB0aGVyZSBhcmUgc3RpbGwgb3RoZXIgdmlzaWJsZSB0YWJsZSBjZWxscyBpbiBhXHJcblx0XHQvLyB0YWJsZSByb3c7IGlmIHNvLCBvZmZzZXRXaWR0aC9IZWlnaHQgYXJlIG5vdCByZWxpYWJsZSBmb3IgdXNlIHdoZW5cclxuXHRcdC8vIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaGFzIGJlZW4gaGlkZGVuIGRpcmVjdGx5IHVzaW5nXHJcblx0XHQvLyBkaXNwbGF5Om5vbmUgKGl0IGlzIHN0aWxsIHNhZmUgdG8gdXNlIG9mZnNldHMgaWYgYSBwYXJlbnQgZWxlbWVudCBpc1xyXG5cdFx0Ly8gaGlkZGVuOyBkb24gc2FmZXR5IGdvZ2dsZXMgYW5kIHNlZSBidWcgIzQ1MTIgZm9yIG1vcmUgaW5mb3JtYXRpb24pLlxyXG5cdFx0Ly8gKG9ubHkgSUUgOCBmYWlscyB0aGlzIHRlc3QpXHJcblx0XHRkaXYuaW5uZXJIVE1MID0gXCI8dGFibGU+PHRyPjx0ZD48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+XCI7XHJcblx0XHR0ZHMgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0ZFwiKTtcclxuXHRcdHRkc1sgMCBdLnN0eWxlLmNzc1RleHQgPSBcInBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6MDtkaXNwbGF5Om5vbmVcIjtcclxuXHRcdGlzU3VwcG9ydGVkID0gKCB0ZHNbIDAgXS5vZmZzZXRIZWlnaHQgPT09IDAgKTtcclxuXHJcblx0XHR0ZHNbIDAgXS5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcclxuXHRcdHRkc1sgMSBdLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuXHJcblx0XHQvLyBDaGVjayBpZiBlbXB0eSB0YWJsZSBjZWxscyBzdGlsbCBoYXZlIG9mZnNldFdpZHRoL0hlaWdodFxyXG5cdFx0Ly8gKElFIDw9IDggZmFpbCB0aGlzIHRlc3QpXHJcblx0XHRzdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyA9IGlzU3VwcG9ydGVkICYmICggdGRzWyAwIF0ub2Zmc2V0SGVpZ2h0ID09PSAwICk7XHJcblxyXG5cdFx0Ly8gQ2hlY2sgYm94LXNpemluZyBhbmQgbWFyZ2luIGJlaGF2aW9yXHJcblx0XHRkaXYuaW5uZXJIVE1MID0gXCJcIjtcclxuXHRcdGRpdi5zdHlsZS5jc3NUZXh0ID0gXCJib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzoxcHg7Ym9yZGVyOjFweDtkaXNwbGF5OmJsb2NrO3dpZHRoOjRweDttYXJnaW4tdG9wOjElO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxJTtcIjtcclxuXHRcdHN1cHBvcnQuYm94U2l6aW5nID0gKCBkaXYub2Zmc2V0V2lkdGggPT09IDQgKTtcclxuXHRcdHN1cHBvcnQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgPSAoIGJvZHkub2Zmc2V0VG9wICE9PSAxICk7XHJcblxyXG5cdFx0Ly8gTk9URTogVG8gYW55IGZ1dHVyZSBtYWludGFpbmVyLCB3ZSd2ZSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZVxyXG5cdFx0Ly8gYmVjYXVzZSBqc2RvbSBvbiBub2RlLmpzIHdpbGwgYnJlYWsgd2l0aG91dCBpdC5cclxuXHRcdGlmICggd2luZG93LmdldENvbXB1dGVkU3R5bGUgKSB7XHJcblx0XHRcdHN1cHBvcnQucGl4ZWxQb3NpdGlvbiA9ICggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiwgbnVsbCApIHx8IHt9ICkudG9wICE9PSBcIjElXCI7XHJcblx0XHRcdHN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGUgPSAoIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYsIG51bGwgKSB8fCB7IHdpZHRoOiBcIjRweFwiIH0gKS53aWR0aCA9PT0gXCI0cHhcIjtcclxuXHJcblx0XHRcdC8vIENoZWNrIGlmIGRpdiB3aXRoIGV4cGxpY2l0IHdpZHRoIGFuZCBubyBtYXJnaW4tcmlnaHQgaW5jb3JyZWN0bHlcclxuXHRcdFx0Ly8gZ2V0cyBjb21wdXRlZCBtYXJnaW4tcmlnaHQgYmFzZWQgb24gd2lkdGggb2YgY29udGFpbmVyLiBGb3IgbW9yZVxyXG5cdFx0XHQvLyBpbmZvIHNlZSBidWcgIzMzMzNcclxuXHRcdFx0Ly8gRmFpbHMgaW4gV2ViS2l0IGJlZm9yZSBGZWIgMjAxMSBuaWdodGxpZXNcclxuXHRcdFx0Ly8gV2ViS2l0IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyB3cm9uZyB2YWx1ZSBmb3IgbWFyZ2luLXJpZ2h0XHJcblx0XHRcdG1hcmdpbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHRcdG1hcmdpbkRpdi5zdHlsZS5jc3NUZXh0ID0gZGl2LnN0eWxlLmNzc1RleHQgPSBkaXZSZXNldDtcclxuXHRcdFx0bWFyZ2luRGl2LnN0eWxlLm1hcmdpblJpZ2h0ID0gbWFyZ2luRGl2LnN0eWxlLndpZHRoID0gXCIwXCI7XHJcblx0XHRcdGRpdi5zdHlsZS53aWR0aCA9IFwiMXB4XCI7XHJcblx0XHRcdGRpdi5hcHBlbmRDaGlsZCggbWFyZ2luRGl2ICk7XHJcblx0XHRcdHN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCA9XHJcblx0XHRcdFx0IXBhcnNlRmxvYXQoICggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIG1hcmdpbkRpdiwgbnVsbCApIHx8IHt9ICkubWFyZ2luUmlnaHQgKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHR5cGVvZiBkaXYuc3R5bGUuem9vbSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcclxuXHRcdFx0Ly8gQ2hlY2sgaWYgbmF0aXZlbHkgYmxvY2stbGV2ZWwgZWxlbWVudHMgYWN0IGxpa2UgaW5saW5lLWJsb2NrXHJcblx0XHRcdC8vIGVsZW1lbnRzIHdoZW4gc2V0dGluZyB0aGVpciBkaXNwbGF5IHRvICdpbmxpbmUnIGFuZCBnaXZpbmdcclxuXHRcdFx0Ly8gdGhlbSBsYXlvdXRcclxuXHRcdFx0Ly8gKElFIDwgOCBkb2VzIHRoaXMpXHJcblx0XHRcdGRpdi5pbm5lckhUTUwgPSBcIlwiO1xyXG5cdFx0XHRkaXYuc3R5bGUuY3NzVGV4dCA9IGRpdlJlc2V0ICsgXCJ3aWR0aDoxcHg7cGFkZGluZzoxcHg7ZGlzcGxheTppbmxpbmU7em9vbToxXCI7XHJcblx0XHRcdHN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dCA9ICggZGl2Lm9mZnNldFdpZHRoID09PSAzICk7XHJcblxyXG5cdFx0XHQvLyBDaGVjayBpZiBlbGVtZW50cyB3aXRoIGxheW91dCBzaHJpbmstd3JhcCB0aGVpciBjaGlsZHJlblxyXG5cdFx0XHQvLyAoSUUgNiBkb2VzIHRoaXMpXHJcblx0XHRcdGRpdi5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xyXG5cdFx0XHRkaXYuc3R5bGUub3ZlcmZsb3cgPSBcInZpc2libGVcIjtcclxuXHRcdFx0ZGl2LmlubmVySFRNTCA9IFwiPGRpdj48L2Rpdj5cIjtcclxuXHRcdFx0ZGl2LmZpcnN0Q2hpbGQuc3R5bGUud2lkdGggPSBcIjVweFwiO1xyXG5cdFx0XHRzdXBwb3J0LnNocmlua1dyYXBCbG9ja3MgPSAoIGRpdi5vZmZzZXRXaWR0aCAhPT0gMyApO1xyXG5cclxuXHRcdFx0Y29udGFpbmVyLnN0eWxlLnpvb20gPSAxO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE51bGwgZWxlbWVudHMgdG8gYXZvaWQgbGVha3MgaW4gSUVcclxuXHRcdGJvZHkucmVtb3ZlQ2hpbGQoIGNvbnRhaW5lciApO1xyXG5cdFx0Y29udGFpbmVyID0gZGl2ID0gdGRzID0gbWFyZ2luRGl2ID0gbnVsbDtcclxuXHR9KTtcclxuXHJcblx0Ly8gTnVsbCBlbGVtZW50cyB0byBhdm9pZCBsZWFrcyBpbiBJRVxyXG5cdGZyYWdtZW50LnJlbW92ZUNoaWxkKCBkaXYgKTtcclxuXHRhbGwgPSBhID0gc2VsZWN0ID0gb3B0ID0gaW5wdXQgPSBmcmFnbWVudCA9IGRpdiA9IG51bGw7XHJcblxyXG5cdHJldHVybiBzdXBwb3J0O1xyXG59KSgpO1xyXG52YXIgcmJyYWNlID0gLyg/Olxce1tcXHNcXFNdKlxcfXxcXFtbXFxzXFxTXSpcXF0pJC8sXHJcblx0cm11bHRpRGFzaCA9IC8oW0EtWl0pL2c7XHJcblxyXG5qUXVlcnkuZXh0ZW5kKHtcclxuXHRjYWNoZToge30sXHJcblxyXG5cdGRlbGV0ZWRJZHM6IFtdLFxyXG5cclxuXHQvLyBQbGVhc2UgdXNlIHdpdGggY2F1dGlvblxyXG5cdHV1aWQ6IDAsXHJcblxyXG5cdC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZVxyXG5cdC8vIE5vbi1kaWdpdHMgcmVtb3ZlZCB0byBtYXRjaCByaW5saW5lalF1ZXJ5XHJcblx0ZXhwYW5kbzogXCJqUXVlcnlcIiArICggalF1ZXJ5LmZuLmpxdWVyeSArIE1hdGgucmFuZG9tKCkgKS5yZXBsYWNlKCAvXFxEL2csIFwiXCIgKSxcclxuXHJcblx0Ly8gVGhlIGZvbGxvd2luZyBlbGVtZW50cyB0aHJvdyB1bmNhdGNoYWJsZSBleGNlcHRpb25zIGlmIHlvdVxyXG5cdC8vIGF0dGVtcHQgdG8gYWRkIGV4cGFuZG8gcHJvcGVydGllcyB0byB0aGVtLlxyXG5cdG5vRGF0YToge1xyXG5cdFx0XCJlbWJlZFwiOiB0cnVlLFxyXG5cdFx0Ly8gQmFuIGFsbCBvYmplY3RzIGV4Y2VwdCBmb3IgRmxhc2ggKHdoaWNoIGhhbmRsZSBleHBhbmRvcylcclxuXHRcdFwib2JqZWN0XCI6IFwiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwXCIsXHJcblx0XHRcImFwcGxldFwiOiB0cnVlXHJcblx0fSxcclxuXHJcblx0aGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRlbGVtID0gZWxlbS5ub2RlVHlwZSA/IGpRdWVyeS5jYWNoZVsgZWxlbVtqUXVlcnkuZXhwYW5kb10gXSA6IGVsZW1bIGpRdWVyeS5leHBhbmRvIF07XHJcblx0XHRyZXR1cm4gISFlbGVtICYmICFpc0VtcHR5RGF0YU9iamVjdCggZWxlbSApO1xyXG5cdH0sXHJcblxyXG5cdGRhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhLCBwdnQgLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7XHJcblx0XHRpZiAoICFqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIHRoaXNDYWNoZSwgcmV0LFxyXG5cdFx0XHRpbnRlcm5hbEtleSA9IGpRdWVyeS5leHBhbmRvLFxyXG5cdFx0XHRnZXRCeU5hbWUgPSB0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIixcclxuXHJcblx0XHRcdC8vIFdlIGhhdmUgdG8gaGFuZGxlIERPTSBub2RlcyBhbmQgSlMgb2JqZWN0cyBkaWZmZXJlbnRseSBiZWNhdXNlIElFNi03XHJcblx0XHRcdC8vIGNhbid0IEdDIG9iamVjdCByZWZlcmVuY2VzIHByb3Blcmx5IGFjcm9zcyB0aGUgRE9NLUpTIGJvdW5kYXJ5XHJcblx0XHRcdGlzTm9kZSA9IGVsZW0ubm9kZVR5cGUsXHJcblxyXG5cdFx0XHQvLyBPbmx5IERPTSBub2RlcyBuZWVkIHRoZSBnbG9iYWwgalF1ZXJ5IGNhY2hlOyBKUyBvYmplY3QgZGF0YSBpc1xyXG5cdFx0XHQvLyBhdHRhY2hlZCBkaXJlY3RseSB0byB0aGUgb2JqZWN0IHNvIEdDIGNhbiBvY2N1ciBhdXRvbWF0aWNhbGx5XHJcblx0XHRcdGNhY2hlID0gaXNOb2RlID8galF1ZXJ5LmNhY2hlIDogZWxlbSxcclxuXHJcblx0XHRcdC8vIE9ubHkgZGVmaW5pbmcgYW4gSUQgZm9yIEpTIG9iamVjdHMgaWYgaXRzIGNhY2hlIGFscmVhZHkgZXhpc3RzIGFsbG93c1xyXG5cdFx0XHQvLyB0aGUgY29kZSB0byBzaG9ydGN1dCBvbiB0aGUgc2FtZSBwYXRoIGFzIGEgRE9NIG5vZGUgd2l0aCBubyBjYWNoZVxyXG5cdFx0XHRpZCA9IGlzTm9kZSA/IGVsZW1bIGludGVybmFsS2V5IF0gOiBlbGVtWyBpbnRlcm5hbEtleSBdICYmIGludGVybmFsS2V5O1xyXG5cclxuXHRcdC8vIEF2b2lkIGRvaW5nIGFueSBtb3JlIHdvcmsgdGhhbiB3ZSBuZWVkIHRvIHdoZW4gdHJ5aW5nIHRvIGdldCBkYXRhIG9uIGFuXHJcblx0XHQvLyBvYmplY3QgdGhhdCBoYXMgbm8gZGF0YSBhdCBhbGxcclxuXHRcdGlmICggKCFpZCB8fCAhY2FjaGVbaWRdIHx8ICghcHZ0ICYmICFjYWNoZVtpZF0uZGF0YSkpICYmIGdldEJ5TmFtZSAmJiBkYXRhID09PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoICFpZCApIHtcclxuXHRcdFx0Ly8gT25seSBET00gbm9kZXMgbmVlZCBhIG5ldyB1bmlxdWUgSUQgZm9yIGVhY2ggZWxlbWVudCBzaW5jZSB0aGVpciBkYXRhXHJcblx0XHRcdC8vIGVuZHMgdXAgaW4gdGhlIGdsb2JhbCBjYWNoZVxyXG5cdFx0XHRpZiAoIGlzTm9kZSApIHtcclxuXHRcdFx0XHRlbGVtWyBpbnRlcm5hbEtleSBdID0gaWQgPSBqUXVlcnkuZGVsZXRlZElkcy5wb3AoKSB8fCArK2pRdWVyeS51dWlkO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGlkID0gaW50ZXJuYWxLZXk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoICFjYWNoZVsgaWQgXSApIHtcclxuXHRcdFx0Y2FjaGVbIGlkIF0gPSB7fTtcclxuXHJcblx0XHRcdC8vIEF2b2lkcyBleHBvc2luZyBqUXVlcnkgbWV0YWRhdGEgb24gcGxhaW4gSlMgb2JqZWN0cyB3aGVuIHRoZSBvYmplY3RcclxuXHRcdFx0Ly8gaXMgc2VyaWFsaXplZCB1c2luZyBKU09OLnN0cmluZ2lmeVxyXG5cdFx0XHRpZiAoICFpc05vZGUgKSB7XHJcblx0XHRcdFx0Y2FjaGVbIGlkIF0udG9KU09OID0galF1ZXJ5Lm5vb3A7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBBbiBvYmplY3QgY2FuIGJlIHBhc3NlZCB0byBqUXVlcnkuZGF0YSBpbnN0ZWFkIG9mIGEga2V5L3ZhbHVlIHBhaXI7IHRoaXMgZ2V0c1xyXG5cdFx0Ly8gc2hhbGxvdyBjb3BpZWQgb3ZlciBvbnRvIHRoZSBleGlzdGluZyBjYWNoZVxyXG5cdFx0aWYgKCB0eXBlb2YgbmFtZSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiICkge1xyXG5cdFx0XHRpZiAoIHB2dCApIHtcclxuXHRcdFx0XHRjYWNoZVsgaWQgXSA9IGpRdWVyeS5leHRlbmQoIGNhY2hlWyBpZCBdLCBuYW1lICk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Y2FjaGVbIGlkIF0uZGF0YSA9IGpRdWVyeS5leHRlbmQoIGNhY2hlWyBpZCBdLmRhdGEsIG5hbWUgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXNDYWNoZSA9IGNhY2hlWyBpZCBdO1xyXG5cclxuXHRcdC8vIGpRdWVyeSBkYXRhKCkgaXMgc3RvcmVkIGluIGEgc2VwYXJhdGUgb2JqZWN0IGluc2lkZSB0aGUgb2JqZWN0J3MgaW50ZXJuYWwgZGF0YVxyXG5cdFx0Ly8gY2FjaGUgaW4gb3JkZXIgdG8gYXZvaWQga2V5IGNvbGxpc2lvbnMgYmV0d2VlbiBpbnRlcm5hbCBkYXRhIGFuZCB1c2VyLWRlZmluZWRcclxuXHRcdC8vIGRhdGEuXHJcblx0XHRpZiAoICFwdnQgKSB7XHJcblx0XHRcdGlmICggIXRoaXNDYWNoZS5kYXRhICkge1xyXG5cdFx0XHRcdHRoaXNDYWNoZS5kYXRhID0ge307XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXNDYWNoZSA9IHRoaXNDYWNoZS5kYXRhO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHR0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdID0gZGF0YTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBDaGVjayBmb3IgYm90aCBjb252ZXJ0ZWQtdG8tY2FtZWwgYW5kIG5vbi1jb252ZXJ0ZWQgZGF0YSBwcm9wZXJ0eSBuYW1lc1xyXG5cdFx0Ly8gSWYgYSBkYXRhIHByb3BlcnR5IHdhcyBzcGVjaWZpZWRcclxuXHRcdGlmICggZ2V0QnlOYW1lICkge1xyXG5cclxuXHRcdFx0Ly8gRmlyc3QgVHJ5IHRvIGZpbmQgYXMtaXMgcHJvcGVydHkgZGF0YVxyXG5cdFx0XHRyZXQgPSB0aGlzQ2FjaGVbIG5hbWUgXTtcclxuXHJcblx0XHRcdC8vIFRlc3QgZm9yIG51bGx8dW5kZWZpbmVkIHByb3BlcnR5IGRhdGFcclxuXHRcdFx0aWYgKCByZXQgPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0Ly8gVHJ5IHRvIGZpbmQgdGhlIGNhbWVsQ2FzZWQgcHJvcGVydHlcclxuXHRcdFx0XHRyZXQgPSB0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXQgPSB0aGlzQ2FjaGU7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJldDtcclxuXHR9LFxyXG5cclxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgcHZ0IC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xyXG5cdFx0aWYgKCAhalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciB0aGlzQ2FjaGUsIGksIGwsXHJcblxyXG5cdFx0XHRpc05vZGUgPSBlbGVtLm5vZGVUeXBlLFxyXG5cclxuXHRcdFx0Ly8gU2VlIGpRdWVyeS5kYXRhIGZvciBtb3JlIGluZm9ybWF0aW9uXHJcblx0XHRcdGNhY2hlID0gaXNOb2RlID8galF1ZXJ5LmNhY2hlIDogZWxlbSxcclxuXHRcdFx0aWQgPSBpc05vZGUgPyBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdIDogalF1ZXJ5LmV4cGFuZG87XHJcblxyXG5cdFx0Ly8gSWYgdGhlcmUgaXMgYWxyZWFkeSBubyBjYWNoZSBlbnRyeSBmb3IgdGhpcyBvYmplY3QsIHRoZXJlIGlzIG5vXHJcblx0XHQvLyBwdXJwb3NlIGluIGNvbnRpbnVpbmdcclxuXHRcdGlmICggIWNhY2hlWyBpZCBdICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBuYW1lICkge1xyXG5cclxuXHRcdFx0dGhpc0NhY2hlID0gcHZ0ID8gY2FjaGVbIGlkIF0gOiBjYWNoZVsgaWQgXS5kYXRhO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzQ2FjaGUgKSB7XHJcblxyXG5cdFx0XHRcdC8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBuYW1lcyBmb3IgZGF0YSBrZXlzXHJcblx0XHRcdFx0aWYgKCAhalF1ZXJ5LmlzQXJyYXkoIG5hbWUgKSApIHtcclxuXHJcblx0XHRcdFx0XHQvLyB0cnkgdGhlIHN0cmluZyBhcyBhIGtleSBiZWZvcmUgYW55IG1hbmlwdWxhdGlvblxyXG5cdFx0XHRcdFx0aWYgKCBuYW1lIGluIHRoaXNDYWNoZSApIHtcclxuXHRcdFx0XHRcdFx0bmFtZSA9IFsgbmFtZSBdO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIHNwbGl0IHRoZSBjYW1lbCBjYXNlZCB2ZXJzaW9uIGJ5IHNwYWNlcyB1bmxlc3MgYSBrZXkgd2l0aCB0aGUgc3BhY2VzIGV4aXN0c1xyXG5cdFx0XHRcdFx0XHRuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApO1xyXG5cdFx0XHRcdFx0XHRpZiAoIG5hbWUgaW4gdGhpc0NhY2hlICkge1xyXG5cdFx0XHRcdFx0XHRcdG5hbWUgPSBbIG5hbWUgXTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRuYW1lID0gbmFtZS5zcGxpdChcIiBcIik7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gbmFtZS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XHJcblx0XHRcdFx0XHRkZWxldGUgdGhpc0NhY2hlWyBuYW1lW2ldIF07XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBubyBkYXRhIGxlZnQgaW4gdGhlIGNhY2hlLCB3ZSB3YW50IHRvIGNvbnRpbnVlXHJcblx0XHRcdFx0Ly8gYW5kIGxldCB0aGUgY2FjaGUgb2JqZWN0IGl0c2VsZiBnZXQgZGVzdHJveWVkXHJcblx0XHRcdFx0aWYgKCAhKCBwdnQgPyBpc0VtcHR5RGF0YU9iamVjdCA6IGpRdWVyeS5pc0VtcHR5T2JqZWN0ICkoIHRoaXNDYWNoZSApICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFNlZSBqUXVlcnkuZGF0YSBmb3IgbW9yZSBpbmZvcm1hdGlvblxyXG5cdFx0aWYgKCAhcHZ0ICkge1xyXG5cdFx0XHRkZWxldGUgY2FjaGVbIGlkIF0uZGF0YTtcclxuXHJcblx0XHRcdC8vIERvbid0IGRlc3Ryb3kgdGhlIHBhcmVudCBjYWNoZSB1bmxlc3MgdGhlIGludGVybmFsIGRhdGEgb2JqZWN0XHJcblx0XHRcdC8vIGhhZCBiZWVuIHRoZSBvbmx5IHRoaW5nIGxlZnQgaW4gaXRcclxuXHRcdFx0aWYgKCAhaXNFbXB0eURhdGFPYmplY3QoIGNhY2hlWyBpZCBdICkgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRGVzdHJveSB0aGUgY2FjaGVcclxuXHRcdGlmICggaXNOb2RlICkge1xyXG5cdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBbIGVsZW0gXSwgdHJ1ZSApO1xyXG5cclxuXHRcdC8vIFVzZSBkZWxldGUgd2hlbiBzdXBwb3J0ZWQgZm9yIGV4cGFuZG9zIG9yIGBjYWNoZWAgaXMgbm90IGEgd2luZG93IHBlciBpc1dpbmRvdyAoIzEwMDgwKVxyXG5cdFx0fSBlbHNlIGlmICggalF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyB8fCBjYWNoZSAhPSBjYWNoZS53aW5kb3cgKSB7XHJcblx0XHRcdGRlbGV0ZSBjYWNoZVsgaWQgXTtcclxuXHJcblx0XHQvLyBXaGVuIGFsbCBlbHNlIGZhaWxzLCBudWxsXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjYWNoZVsgaWQgXSA9IG51bGw7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Ly8gRm9yIGludGVybmFsIHVzZSBvbmx5LlxyXG5cdF9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcclxuXHRcdHJldHVybiBqUXVlcnkuZGF0YSggZWxlbSwgbmFtZSwgZGF0YSwgdHJ1ZSApO1xyXG5cdH0sXHJcblxyXG5cdC8vIEEgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBpZiBhIERPTSBub2RlIGNhbiBoYW5kbGUgdGhlIGRhdGEgZXhwYW5kb1xyXG5cdGFjY2VwdERhdGE6IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0dmFyIG5vRGF0YSA9IGVsZW0ubm9kZU5hbWUgJiYgalF1ZXJ5Lm5vRGF0YVsgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07XHJcblxyXG5cdFx0Ly8gbm9kZXMgYWNjZXB0IGRhdGEgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQ7IHJlamVjdGlvbiBjYW4gYmUgY29uZGl0aW9uYWxcclxuXHRcdHJldHVybiAhbm9EYXRhIHx8IG5vRGF0YSAhPT0gdHJ1ZSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImNsYXNzaWRcIikgPT09IG5vRGF0YTtcclxuXHR9XHJcbn0pO1xyXG5cclxualF1ZXJ5LmZuLmV4dGVuZCh7XHJcblx0ZGF0YTogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XHJcblx0XHR2YXIgcGFydHMsIHBhcnQsIGF0dHIsIG5hbWUsIGwsXHJcblx0XHRcdGVsZW0gPSB0aGlzWzBdLFxyXG5cdFx0XHRpID0gMCxcclxuXHRcdFx0ZGF0YSA9IG51bGw7XHJcblxyXG5cdFx0Ly8gR2V0cyBhbGwgdmFsdWVzXHJcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRpZiAoIHRoaXMubGVuZ3RoICkge1xyXG5cdFx0XHRcdGRhdGEgPSBqUXVlcnkuZGF0YSggZWxlbSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWpRdWVyeS5fZGF0YSggZWxlbSwgXCJwYXJzZWRBdHRyc1wiICkgKSB7XHJcblx0XHRcdFx0XHRhdHRyID0gZWxlbS5hdHRyaWJ1dGVzO1xyXG5cdFx0XHRcdFx0Zm9yICggbCA9IGF0dHIubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xyXG5cdFx0XHRcdFx0XHRuYW1lID0gYXR0cltpXS5uYW1lO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBuYW1lLmluZGV4T2YoIFwiZGF0YS1cIiApID09PSAwICkge1xyXG5cdFx0XHRcdFx0XHRcdG5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lLnN1YnN0cmluZyg1KSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGpRdWVyeS5fZGF0YSggZWxlbSwgXCJwYXJzZWRBdHRyc1wiLCB0cnVlICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZGF0YTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBTZXRzIG11bHRpcGxlIHZhbHVlc1xyXG5cdFx0aWYgKCB0eXBlb2Yga2V5ID09PSBcIm9iamVjdFwiICkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGpRdWVyeS5kYXRhKCB0aGlzLCBrZXkgKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cGFydHMgPSBrZXkuc3BsaXQoIFwiLlwiLCAyICk7XHJcblx0XHRwYXJ0c1sxXSA9IHBhcnRzWzFdID8gXCIuXCIgKyBwYXJ0c1sxXSA6IFwiXCI7XHJcblx0XHRwYXJ0ID0gcGFydHNbMV0gKyBcIiFcIjtcclxuXHJcblx0XHRyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xyXG5cclxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRcdGRhdGEgPSB0aGlzLnRyaWdnZXJIYW5kbGVyKCBcImdldERhdGFcIiArIHBhcnQsIFsgcGFydHNbMF0gXSApO1xyXG5cclxuXHRcdFx0XHQvLyBUcnkgdG8gZmV0Y2ggYW55IGludGVybmFsbHkgc3RvcmVkIGRhdGEgZmlyc3RcclxuXHRcdFx0XHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtICkge1xyXG5cdFx0XHRcdFx0ZGF0YSA9IGpRdWVyeS5kYXRhKCBlbGVtLCBrZXkgKTtcclxuXHRcdFx0XHRcdGRhdGEgPSBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkICYmIHBhcnRzWzFdID9cclxuXHRcdFx0XHRcdHRoaXMuZGF0YSggcGFydHNbMF0gKSA6XHJcblx0XHRcdFx0XHRkYXRhO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRwYXJ0c1sxXSA9IHZhbHVlO1xyXG5cdFx0XHR0aGlzLmVhY2goZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0dmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKTtcclxuXHJcblx0XHRcdFx0c2VsZi50cmlnZ2VySGFuZGxlciggXCJzZXREYXRhXCIgKyBwYXJ0LCBwYXJ0cyApO1xyXG5cdFx0XHRcdGpRdWVyeS5kYXRhKCB0aGlzLCBrZXksIHZhbHVlICk7XHJcblx0XHRcdFx0c2VsZi50cmlnZ2VySGFuZGxlciggXCJjaGFuZ2VEYXRhXCIgKyBwYXJ0LCBwYXJ0cyApO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgZmFsc2UgKTtcclxuXHR9LFxyXG5cclxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkge1xyXG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcclxuXHRcdFx0alF1ZXJ5LnJlbW92ZURhdGEoIHRoaXMsIGtleSApO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59KTtcclxuXHJcbmZ1bmN0aW9uIGRhdGFBdHRyKCBlbGVtLCBrZXksIGRhdGEgKSB7XHJcblx0Ly8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueVxyXG5cdC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZVxyXG5cdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XHJcblxyXG5cdFx0dmFyIG5hbWUgPSBcImRhdGEtXCIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJDFcIiApLnRvTG93ZXJDYXNlKCk7XHJcblxyXG5cdFx0ZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XHJcblxyXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRkYXRhID0gZGF0YSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDpcclxuXHRcdFx0XHRkYXRhID09PSBcImZhbHNlXCIgPyBmYWxzZSA6XHJcblx0XHRcdFx0ZGF0YSA9PT0gXCJudWxsXCIgPyBudWxsIDpcclxuXHRcdFx0XHQvLyBPbmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHN0cmluZ1xyXG5cdFx0XHRcdCtkYXRhICsgXCJcIiA9PT0gZGF0YSA/ICtkYXRhIDpcclxuXHRcdFx0XHRyYnJhY2UudGVzdCggZGF0YSApID8galF1ZXJ5LnBhcnNlSlNPTiggZGF0YSApIDpcclxuXHRcdFx0XHRcdGRhdGE7XHJcblx0XHRcdH0gY2F0Y2goIGUgKSB7fVxyXG5cclxuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyXHJcblx0XHRcdGpRdWVyeS5kYXRhKCBlbGVtLCBrZXksIGRhdGEgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGRhdGE7XHJcbn1cclxuXHJcbi8vIGNoZWNrcyBhIGNhY2hlIG9iamVjdCBmb3IgZW1wdGluZXNzXHJcbmZ1bmN0aW9uIGlzRW1wdHlEYXRhT2JqZWN0KCBvYmogKSB7XHJcblx0dmFyIG5hbWU7XHJcblx0Zm9yICggbmFtZSBpbiBvYmogKSB7XHJcblxyXG5cdFx0Ly8gaWYgdGhlIHB1YmxpYyBkYXRhIG9iamVjdCBpcyBlbXB0eSwgdGhlIHByaXZhdGUgaXMgc3RpbGwgZW1wdHlcclxuXHRcdGlmICggbmFtZSA9PT0gXCJkYXRhXCIgJiYgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9ialtuYW1lXSApICkge1xyXG5cdFx0XHRjb250aW51ZTtcclxuXHRcdH1cclxuXHRcdGlmICggbmFtZSAhPT0gXCJ0b0pTT05cIiApIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRydWU7XHJcbn1cclxualF1ZXJ5LmV4dGVuZCh7XHJcblx0cXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkge1xyXG5cdFx0dmFyIHF1ZXVlO1xyXG5cclxuXHRcdGlmICggZWxlbSApIHtcclxuXHRcdFx0dHlwZSA9ICggdHlwZSB8fCBcImZ4XCIgKSArIFwicXVldWVcIjtcclxuXHRcdFx0cXVldWUgPSBqUXVlcnkuX2RhdGEoIGVsZW0sIHR5cGUgKTtcclxuXHJcblx0XHRcdC8vIFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGluZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1c3QgYSBsb29rdXBcclxuXHRcdFx0aWYgKCBkYXRhICkge1xyXG5cdFx0XHRcdGlmICggIXF1ZXVlIHx8IGpRdWVyeS5pc0FycmF5KGRhdGEpICkge1xyXG5cdFx0XHRcdFx0cXVldWUgPSBqUXVlcnkuX2RhdGEoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoZGF0YSkgKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0cXVldWUucHVzaCggZGF0YSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gcXVldWUgfHwgW107XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0ZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XHJcblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XHJcblxyXG5cdFx0dmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksXHJcblx0XHRcdHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLFxyXG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCksXHJcblx0XHRcdGhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksXHJcblx0XHRcdG5leHQgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApO1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdC8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWxcclxuXHRcdGlmICggZm4gPT09IFwiaW5wcm9ncmVzc1wiICkge1xyXG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCk7XHJcblx0XHRcdHN0YXJ0TGVuZ3RoLS07XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBmbiApIHtcclxuXHJcblx0XHRcdC8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmdcclxuXHRcdFx0Ly8gYXV0b21hdGljYWxseSBkZXF1ZXVlZFxyXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiApIHtcclxuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KCBcImlucHJvZ3Jlc3NcIiApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBjbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uXHJcblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xyXG5cdFx0XHRmbi5jYWxsKCBlbGVtLCBuZXh0LCBob29rcyApO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggIXN0YXJ0TGVuZ3RoICYmIGhvb2tzICkge1xyXG5cdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Ly8gbm90IGludGVuZGVkIGZvciBwdWJsaWMgY29uc3VtcHRpb24gLSBnZW5lcmF0ZXMgYSBxdWV1ZUhvb2tzIG9iamVjdCwgb3IgcmV0dXJucyB0aGUgY3VycmVudCBvbmVcclxuXHRfcXVldWVIb29rczogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XHJcblx0XHR2YXIga2V5ID0gdHlwZSArIFwicXVldWVIb29rc1wiO1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5fZGF0YSggZWxlbSwga2V5ICkgfHwgalF1ZXJ5Ll9kYXRhKCBlbGVtLCBrZXksIHtcclxuXHRcdFx0ZW1wdHk6IGpRdWVyeS5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKS5hZGQoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0alF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sIHR5cGUgKyBcInF1ZXVlXCIsIHRydWUgKTtcclxuXHRcdFx0XHRqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwga2V5LCB0cnVlICk7XHJcblx0XHRcdH0pXHJcblx0XHR9KTtcclxuXHR9XHJcbn0pO1xyXG5cclxualF1ZXJ5LmZuLmV4dGVuZCh7XHJcblx0cXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xyXG5cdFx0dmFyIHNldHRlciA9IDI7XHJcblxyXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0ZGF0YSA9IHR5cGU7XHJcblx0XHRcdHR5cGUgPSBcImZ4XCI7XHJcblx0XHRcdHNldHRlci0tO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHtcclxuXHRcdFx0cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkYXRhID09PSB1bmRlZmluZWQgP1xyXG5cdFx0XHR0aGlzIDpcclxuXHRcdFx0dGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApO1xyXG5cclxuXHRcdFx0XHQvLyBlbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZVxyXG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggdGhpcywgdHlwZSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiAmJiBxdWV1ZVswXSAhPT0gXCJpbnByb2dyZXNzXCIgKSB7XHJcblx0XHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0fSxcclxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcclxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XHJcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XHJcblx0XHR9KTtcclxuXHR9LFxyXG5cdC8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi5cclxuXHQvLyBodHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvXHJcblx0ZGVsYXk6IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkge1xyXG5cdFx0dGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTtcclxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkge1xyXG5cdFx0XHR2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoIG5leHQsIHRpbWUgKTtcclxuXHRcdFx0aG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGNsZWFyVGltZW91dCggdGltZW91dCApO1xyXG5cdFx0XHR9O1xyXG5cdFx0fSk7XHJcblx0fSxcclxuXHRjbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcclxuXHRcdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcclxuXHR9LFxyXG5cdC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGVcclxuXHQvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5cGUgYnkgZGVmYXVsdClcclxuXHRwcm9taXNlOiBmdW5jdGlvbiggdHlwZSwgb2JqICkge1xyXG5cdFx0dmFyIHRtcCxcclxuXHRcdFx0Y291bnQgPSAxLFxyXG5cdFx0XHRkZWZlciA9IGpRdWVyeS5EZWZlcnJlZCgpLFxyXG5cdFx0XHRlbGVtZW50cyA9IHRoaXMsXHJcblx0XHRcdGkgPSB0aGlzLmxlbmd0aCxcclxuXHRcdFx0cmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGlmICggISggLS1jb3VudCApICkge1xyXG5cdFx0XHRcdFx0ZGVmZXIucmVzb2x2ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH07XHJcblxyXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0b2JqID0gdHlwZTtcclxuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcclxuXHJcblx0XHR3aGlsZSggaS0tICkge1xyXG5cdFx0XHR0bXAgPSBqUXVlcnkuX2RhdGEoIGVsZW1lbnRzWyBpIF0sIHR5cGUgKyBcInF1ZXVlSG9va3NcIiApO1xyXG5cdFx0XHRpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7XHJcblx0XHRcdFx0Y291bnQrKztcclxuXHRcdFx0XHR0bXAuZW1wdHkuYWRkKCByZXNvbHZlICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJlc29sdmUoKTtcclxuXHRcdHJldHVybiBkZWZlci5wcm9taXNlKCBvYmogKTtcclxuXHR9XHJcbn0pO1xyXG52YXIgbm9kZUhvb2ssIGJvb2xIb29rLCBmaXhTcGVjaWZpZWQsXHJcblx0cmNsYXNzID0gL1tcXHRcXHJcXG5dL2csXHJcblx0cnJldHVybiA9IC9cXHIvZyxcclxuXHRydHlwZSA9IC9eKD86YnV0dG9ufGlucHV0KSQvaSxcclxuXHRyZm9jdXNhYmxlID0gL14oPzpidXR0b258aW5wdXR8b2JqZWN0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksXHJcblx0cmNsaWNrYWJsZSA9IC9eYSg/OnJlYXwpJC9pLFxyXG5cdHJib29sZWFuID0gL14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZHxzZWxlY3RlZCkkL2ksXHJcblx0Z2V0U2V0QXR0cmlidXRlID0galF1ZXJ5LnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlO1xyXG5cclxualF1ZXJ5LmZuLmV4dGVuZCh7XHJcblx0YXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGpRdWVyeS5hdHRyLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcclxuXHR9LFxyXG5cclxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHtcclxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XHJcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7XHJcblx0XHR9KTtcclxuXHR9LFxyXG5cclxuXHRwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xyXG5cdH0sXHJcblxyXG5cdHJlbW92ZVByb3A6IGZ1bmN0aW9uKCBuYW1lICkge1xyXG5cdFx0bmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTtcclxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XHJcblx0XHRcdC8vIHRyeS9jYXRjaCBoYW5kbGVzIGNhc2VzIHdoZXJlIElFIGJhbGtzIChzdWNoIGFzIHJlbW92aW5nIGEgcHJvcGVydHkgb24gd2luZG93KVxyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdHRoaXNbIG5hbWUgXSA9IHVuZGVmaW5lZDtcclxuXHRcdFx0XHRkZWxldGUgdGhpc1sgbmFtZSBdO1xyXG5cdFx0XHR9IGNhdGNoKCBlICkge31cclxuXHRcdH0pO1xyXG5cdH0sXHJcblxyXG5cdGFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XHJcblx0XHR2YXIgY2xhc3NOYW1lcywgaSwgbCwgZWxlbSxcclxuXHRcdFx0c2V0Q2xhc3MsIGMsIGNsO1xyXG5cclxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7XHJcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuYWRkQ2xhc3MoIHZhbHVlLmNhbGwodGhpcywgaiwgdGhpcy5jbGFzc05hbWUpICk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICkge1xyXG5cdFx0XHRjbGFzc05hbWVzID0gdmFsdWUuc3BsaXQoIGNvcmVfcnNwYWNlICk7XHJcblxyXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xyXG5cdFx0XHRcdGVsZW0gPSB0aGlzWyBpIF07XHJcblxyXG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcclxuXHRcdFx0XHRcdGlmICggIWVsZW0uY2xhc3NOYW1lICYmIGNsYXNzTmFtZXMubGVuZ3RoID09PSAxICkge1xyXG5cdFx0XHRcdFx0XHRlbGVtLmNsYXNzTmFtZSA9IHZhbHVlO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHNldENsYXNzID0gXCIgXCIgKyBlbGVtLmNsYXNzTmFtZSArIFwiIFwiO1xyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICggYyA9IDAsIGNsID0gY2xhc3NOYW1lcy5sZW5ndGg7IGMgPCBjbDsgYysrICkge1xyXG5cdFx0XHRcdFx0XHRcdGlmICggIX5zZXRDbGFzcy5pbmRleE9mKCBcIiBcIiArIGNsYXNzTmFtZXNbIGMgXSArIFwiIFwiICkgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRzZXRDbGFzcyArPSBjbGFzc05hbWVzWyBjIF0gKyBcIiBcIjtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0ZWxlbS5jbGFzc05hbWUgPSBqUXVlcnkudHJpbSggc2V0Q2xhc3MgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cclxuXHRyZW1vdmVDbGFzczogZnVuY3Rpb24oIHZhbHVlICkge1xyXG5cdFx0dmFyIHJlbW92ZXMsIGNsYXNzTmFtZSwgZWxlbSwgYywgY2wsIGksIGw7XHJcblxyXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaiApIHtcclxuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5yZW1vdmVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBqLCB0aGlzLmNsYXNzTmFtZSkgKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0XHRpZiAoICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHx8IHZhbHVlID09PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdHJlbW92ZXMgPSAoIHZhbHVlIHx8IFwiXCIgKS5zcGxpdCggY29yZV9yc3BhY2UgKTtcclxuXHJcblx0XHRcdGZvciAoIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XHJcblx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXTtcclxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgZWxlbS5jbGFzc05hbWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y2xhc3NOYW1lID0gKFwiIFwiICsgZWxlbS5jbGFzc05hbWUgKyBcIiBcIikucmVwbGFjZSggcmNsYXNzLCBcIiBcIiApO1xyXG5cclxuXHRcdFx0XHRcdC8vIGxvb3Agb3ZlciBlYWNoIGl0ZW0gaW4gdGhlIHJlbW92YWwgbGlzdFxyXG5cdFx0XHRcdFx0Zm9yICggYyA9IDAsIGNsID0gcmVtb3Zlcy5sZW5ndGg7IGMgPCBjbDsgYysrICkge1xyXG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgdW50aWwgdGhlcmUgaXMgbm90aGluZyB0byByZW1vdmUsXHJcblx0XHRcdFx0XHRcdHdoaWxlICggY2xhc3NOYW1lLmluZGV4T2YoXCIgXCIgKyByZW1vdmVzWyBjIF0gKyBcIiBcIikgPiAtMSApIHtcclxuXHRcdFx0XHRcdFx0XHRjbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSggXCIgXCIgKyByZW1vdmVzWyBjIF0gKyBcIiBcIiAsIFwiIFwiICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGVsZW0uY2xhc3NOYW1lID0gdmFsdWUgPyBqUXVlcnkudHJpbSggY2xhc3NOYW1lICkgOiBcIlwiO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH0sXHJcblxyXG5cdHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUsIHN0YXRlVmFsICkge1xyXG5cdFx0dmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsXHJcblx0XHRcdGlzQm9vbCA9IHR5cGVvZiBzdGF0ZVZhbCA9PT0gXCJib29sZWFuXCI7XHJcblxyXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHtcclxuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBpLCB0aGlzLmNsYXNzTmFtZSwgc3RhdGVWYWwpLCBzdGF0ZVZhbCApO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwic3RyaW5nXCIgKSB7XHJcblx0XHRcdFx0Ly8gdG9nZ2xlIGluZGl2aWR1YWwgY2xhc3MgbmFtZXNcclxuXHRcdFx0XHR2YXIgY2xhc3NOYW1lLFxyXG5cdFx0XHRcdFx0aSA9IDAsXHJcblx0XHRcdFx0XHRzZWxmID0galF1ZXJ5KCB0aGlzICksXHJcblx0XHRcdFx0XHRzdGF0ZSA9IHN0YXRlVmFsLFxyXG5cdFx0XHRcdFx0Y2xhc3NOYW1lcyA9IHZhbHVlLnNwbGl0KCBjb3JlX3JzcGFjZSApO1xyXG5cclxuXHRcdFx0XHR3aGlsZSAoIChjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSkgKSB7XHJcblx0XHRcdFx0XHQvLyBjaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3RcclxuXHRcdFx0XHRcdHN0YXRlID0gaXNCb29sID8gc3RhdGUgOiAhc2VsZi5oYXNDbGFzcyggY2xhc3NOYW1lICk7XHJcblx0XHRcdFx0XHRzZWxmWyBzdGF0ZSA/IFwiYWRkQ2xhc3NcIiA6IFwicmVtb3ZlQ2xhc3NcIiBdKCBjbGFzc05hbWUgKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGUgPT09IFwiYm9vbGVhblwiICkge1xyXG5cdFx0XHRcdGlmICggdGhpcy5jbGFzc05hbWUgKSB7XHJcblx0XHRcdFx0XHQvLyBzdG9yZSBjbGFzc05hbWUgaWYgc2V0XHJcblx0XHRcdFx0XHRqUXVlcnkuX2RhdGEoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiLCB0aGlzLmNsYXNzTmFtZSApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gdG9nZ2xlIHdob2xlIGNsYXNzTmFtZVxyXG5cdFx0XHRcdHRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID8gXCJcIiA6IGpRdWVyeS5fZGF0YSggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIgKSB8fCBcIlwiO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9LFxyXG5cclxuXHRoYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xyXG5cdFx0dmFyIGNsYXNzTmFtZSA9IFwiIFwiICsgc2VsZWN0b3IgKyBcIiBcIixcclxuXHRcdFx0aSA9IDAsXHJcblx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcclxuXHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcclxuXHRcdFx0aWYgKCB0aGlzW2ldLm5vZGVUeXBlID09PSAxICYmIChcIiBcIiArIHRoaXNbaV0uY2xhc3NOYW1lICsgXCIgXCIpLnJlcGxhY2UocmNsYXNzLCBcIiBcIikuaW5kZXhPZiggY2xhc3NOYW1lICkgPiAtMSApIHtcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHR9LFxyXG5cclxuXHR2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcclxuXHRcdHZhciBob29rcywgcmV0LCBpc0Z1bmN0aW9uLFxyXG5cdFx0XHRlbGVtID0gdGhpc1swXTtcclxuXHJcblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xyXG5cdFx0XHRpZiAoIGVsZW0gKSB7XHJcblx0XHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07XHJcblxyXG5cdFx0XHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBcInZhbHVlXCIgKSkgIT09IHVuZGVmaW5lZCApIHtcclxuXHRcdFx0XHRcdHJldHVybiByZXQ7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXQgPSBlbGVtLnZhbHVlO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIHJldCA9PT0gXCJzdHJpbmdcIiA/XHJcblx0XHRcdFx0XHQvLyBoYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzXHJcblx0XHRcdFx0XHRyZXQucmVwbGFjZShycmV0dXJuLCBcIlwiKSA6XHJcblx0XHRcdFx0XHQvLyBoYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXJcclxuXHRcdFx0XHRcdHJldCA9PSBudWxsID8gXCJcIiA6IHJldDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkge1xyXG5cdFx0XHR2YXIgdmFsLFxyXG5cdFx0XHRcdHNlbGYgPSBqUXVlcnkodGhpcyk7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgIT09IDEgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24gKSB7XHJcblx0XHRcdFx0dmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgc2VsZi52YWwoKSApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHZhbCA9IHZhbHVlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyBcIlwiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nXHJcblx0XHRcdGlmICggdmFsID09IG51bGwgKSB7XHJcblx0XHRcdFx0dmFsID0gXCJcIjtcclxuXHRcdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIiApIHtcclxuXHRcdFx0XHR2YWwgKz0gXCJcIjtcclxuXHRcdFx0fSBlbHNlIGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkge1xyXG5cdFx0XHRcdHZhbCA9IGpRdWVyeS5tYXAodmFsLCBmdW5jdGlvbiAoIHZhbHVlICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcclxuXHJcblx0XHRcdC8vIElmIHNldCByZXR1cm5zIHVuZGVmaW5lZCwgZmFsbCBiYWNrIHRvIG5vcm1hbCBzZXR0aW5nXHJcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoXCJzZXRcIiBpbiBob29rcykgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsIFwidmFsdWVcIiApID09PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbDtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG59KTtcclxuXHJcbmpRdWVyeS5leHRlbmQoe1xyXG5cdHZhbEhvb2tzOiB7XHJcblx0XHRvcHRpb246IHtcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHQvLyBhdHRyaWJ1dGVzLnZhbHVlIGlzIHVuZGVmaW5lZCBpbiBCbGFja2JlcnJ5IDQuNyBidXRcclxuXHRcdFx0XHQvLyB1c2VzIC52YWx1ZS4gU2VlICM2OTMyXHJcblx0XHRcdFx0dmFyIHZhbCA9IGVsZW0uYXR0cmlidXRlcy52YWx1ZTtcclxuXHRcdFx0XHRyZXR1cm4gIXZhbCB8fCB2YWwuc3BlY2lmaWVkID8gZWxlbS52YWx1ZSA6IGVsZW0udGV4dDtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdHNlbGVjdDoge1xyXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHRcdHZhciB2YWx1ZSwgaSwgbWF4LCBvcHRpb24sXHJcblx0XHRcdFx0XHRpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleCxcclxuXHRcdFx0XHRcdHZhbHVlcyA9IFtdLFxyXG5cdFx0XHRcdFx0b3B0aW9ucyA9IGVsZW0ub3B0aW9ucyxcclxuXHRcdFx0XHRcdG9uZSA9IGVsZW0udHlwZSA9PT0gXCJzZWxlY3Qtb25lXCI7XHJcblxyXG5cdFx0XHRcdC8vIE5vdGhpbmcgd2FzIHNlbGVjdGVkXHJcblx0XHRcdFx0aWYgKCBpbmRleCA8IDAgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlvbnNcclxuXHRcdFx0XHRpID0gb25lID8gaW5kZXggOiAwO1xyXG5cdFx0XHRcdG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoO1xyXG5cdFx0XHRcdGZvciAoIDsgaSA8IG1heDsgaSsrICkge1xyXG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRcdC8vIERvbid0IHJldHVybiBvcHRpb25zIHRoYXQgYXJlIGRpc2FibGVkIG9yIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXBcclxuXHRcdFx0XHRcdGlmICggb3B0aW9uLnNlbGVjdGVkICYmIChqUXVlcnkuc3VwcG9ydC5vcHREaXNhYmxlZCA/ICFvcHRpb24uZGlzYWJsZWQgOiBvcHRpb24uZ2V0QXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPT09IG51bGwpICYmXHJcblx0XHRcdFx0XHRcdFx0KCFvcHRpb24ucGFyZW50Tm9kZS5kaXNhYmxlZCB8fCAhalF1ZXJ5Lm5vZGVOYW1lKCBvcHRpb24ucGFyZW50Tm9kZSwgXCJvcHRncm91cFwiICkpICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvblxyXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0c1xyXG5cdFx0XHRcdFx0XHRpZiAoIG9uZSApIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5XHJcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gRml4ZXMgQnVnICMyNTUxIC0tIHNlbGVjdC52YWwoKSBicm9rZW4gaW4gSUUgYWZ0ZXIgZm9ybS5yZXNldCgpXHJcblx0XHRcdFx0aWYgKCBvbmUgJiYgIXZhbHVlcy5sZW5ndGggJiYgb3B0aW9ucy5sZW5ndGggKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5KCBvcHRpb25zWyBpbmRleCBdICkudmFsKCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XHJcblx0XHRcdFx0dmFyIHZhbHVlcyA9IGpRdWVyeS5tYWtlQXJyYXkoIHZhbHVlICk7XHJcblxyXG5cdFx0XHRcdGpRdWVyeShlbGVtKS5maW5kKFwib3B0aW9uXCIpLmVhY2goZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkID0galF1ZXJ5LmluQXJyYXkoIGpRdWVyeSh0aGlzKS52YWwoKSwgdmFsdWVzICkgPj0gMDtcclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0aWYgKCAhdmFsdWVzLmxlbmd0aCApIHtcclxuXHRcdFx0XHRcdGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Ly8gVW51c2VkIGluIDEuOCwgbGVmdCBpbiBzbyBhdHRyRm4tc3RhYmJlcnMgd29uJ3QgZGllOyByZW1vdmUgaW4gMS45XHJcblx0YXR0ckZuOiB7fSxcclxuXHJcblx0YXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBwYXNzICkge1xyXG5cdFx0dmFyIHJldCwgaG9va3MsIG5vdHhtbCxcclxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xyXG5cclxuXHRcdC8vIGRvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcclxuXHRcdGlmICggIWVsZW0gfHwgblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHBhc3MgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIGpRdWVyeS5mblsgbmFtZSBdICkgKSB7XHJcblx0XHRcdHJldHVybiBqUXVlcnkoIGVsZW0gKVsgbmFtZSBdKCB2YWx1ZSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkXHJcblx0XHRpZiAoIHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSA9PT0gXCJ1bmRlZmluZWRcIiApIHtcclxuXHRcdFx0cmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdG5vdHhtbCA9IG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKTtcclxuXHJcblx0XHQvLyBBbGwgYXR0cmlidXRlcyBhcmUgbG93ZXJjYXNlXHJcblx0XHQvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkXHJcblx0XHRpZiAoIG5vdHhtbCApIHtcclxuXHRcdFx0bmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0aG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gfHwgKCByYm9vbGVhbi50ZXN0KCBuYW1lICkgPyBib29sSG9vayA6IG5vZGVIb29rICk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gbnVsbCApIHtcclxuXHRcdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiYgbm90eG1sICYmIChyZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkpICE9PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdFx0cmV0dXJuIHJldDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIFwiXCIgKyB2YWx1ZSApO1xyXG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgbm90eG1sICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7XHJcblx0XHRcdHJldHVybiByZXQ7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHJldCA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XHJcblxyXG5cdFx0XHQvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZFxyXG5cdFx0XHRyZXR1cm4gcmV0ID09PSBudWxsID9cclxuXHRcdFx0XHR1bmRlZmluZWQgOlxyXG5cdFx0XHRcdHJldDtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XHJcblx0XHR2YXIgcHJvcE5hbWUsIGF0dHJOYW1lcywgbmFtZSwgaXNCb29sLFxyXG5cdFx0XHRpID0gMDtcclxuXHJcblx0XHRpZiAoIHZhbHVlICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XHJcblxyXG5cdFx0XHRhdHRyTmFtZXMgPSB2YWx1ZS5zcGxpdCggY29yZV9yc3BhY2UgKTtcclxuXHJcblx0XHRcdGZvciAoIDsgaSA8IGF0dHJOYW1lcy5sZW5ndGg7IGkrKyApIHtcclxuXHRcdFx0XHRuYW1lID0gYXR0ck5hbWVzWyBpIF07XHJcblxyXG5cdFx0XHRcdGlmICggbmFtZSApIHtcclxuXHRcdFx0XHRcdHByb3BOYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lO1xyXG5cdFx0XHRcdFx0aXNCb29sID0gcmJvb2xlYW4udGVzdCggbmFtZSApO1xyXG5cclxuXHRcdFx0XHRcdC8vIFNlZSAjOTY5OSBmb3IgZXhwbGFuYXRpb24gb2YgdGhpcyBhcHByb2FjaCAoc2V0dGluZyBmaXJzdCwgdGhlbiByZW1vdmFsKVxyXG5cdFx0XHRcdFx0Ly8gRG8gbm90IGRvIHRoaXMgZm9yIGJvb2xlYW4gYXR0cmlidXRlcyAoc2VlICMxMDg3MClcclxuXHRcdFx0XHRcdGlmICggIWlzQm9vbCApIHtcclxuXHRcdFx0XHRcdFx0alF1ZXJ5LmF0dHIoIGVsZW0sIG5hbWUsIFwiXCIgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBnZXRTZXRBdHRyaWJ1dGUgPyBuYW1lIDogcHJvcE5hbWUgKTtcclxuXHJcblx0XHRcdFx0XHQvLyBTZXQgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB0byBmYWxzZSBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzXHJcblx0XHRcdFx0XHRpZiAoIGlzQm9vbCAmJiBwcm9wTmFtZSBpbiBlbGVtICkge1xyXG5cdFx0XHRcdFx0XHRlbGVtWyBwcm9wTmFtZSBdID0gZmFsc2U7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0YXR0ckhvb2tzOiB7XHJcblx0XHR0eXBlOiB7XHJcblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xyXG5cdFx0XHRcdC8vIFdlIGNhbid0IGFsbG93IHRoZSB0eXBlIHByb3BlcnR5IHRvIGJlIGNoYW5nZWQgKHNpbmNlIGl0IGNhdXNlcyBwcm9ibGVtcyBpbiBJRSlcclxuXHRcdFx0XHRpZiAoIHJ0eXBlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiBlbGVtLnBhcmVudE5vZGUgKSB7XHJcblx0XHRcdFx0XHRqUXVlcnkuZXJyb3IoIFwidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkXCIgKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKCAhalF1ZXJ5LnN1cHBvcnQucmFkaW9WYWx1ZSAmJiB2YWx1ZSA9PT0gXCJyYWRpb1wiICYmIGpRdWVyeS5ub2RlTmFtZShlbGVtLCBcImlucHV0XCIpICkge1xyXG5cdFx0XHRcdFx0Ly8gU2V0dGluZyB0aGUgdHlwZSBvbiBhIHJhZGlvIGJ1dHRvbiBhZnRlciB0aGUgdmFsdWUgcmVzZXRzIHRoZSB2YWx1ZSBpbiBJRTYtOVxyXG5cdFx0XHRcdFx0Ly8gUmVzZXQgdmFsdWUgdG8gaXQncyBkZWZhdWx0IGluIGNhc2UgdHlwZSBpcyBzZXQgYWZ0ZXIgdmFsdWVcclxuXHRcdFx0XHRcdC8vIFRoaXMgaXMgZm9yIGVsZW1lbnQgY3JlYXRpb25cclxuXHRcdFx0XHRcdHZhciB2YWwgPSBlbGVtLnZhbHVlO1xyXG5cdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCB2YWx1ZSApO1xyXG5cdFx0XHRcdFx0aWYgKCB2YWwgKSB7XHJcblx0XHRcdFx0XHRcdGVsZW0udmFsdWUgPSB2YWw7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cdFx0Ly8gVXNlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBmb3IgYmFjayBjb21wYXRcclxuXHRcdC8vIFVzZSB0aGUgbm9kZUhvb2sgZm9yIGJ1dHRvbiBlbGVtZW50cyBpbiBJRTYvNyAoIzE5NTQpXHJcblx0XHR2YWx1ZToge1xyXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xyXG5cdFx0XHRcdGlmICggbm9kZUhvb2sgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCBcImJ1dHRvblwiICkgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gbm9kZUhvb2suZ2V0KCBlbGVtLCBuYW1lICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiBuYW1lIGluIGVsZW0gP1xyXG5cdFx0XHRcdFx0ZWxlbS52YWx1ZSA6XHJcblx0XHRcdFx0XHRudWxsO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHtcclxuXHRcdFx0XHRpZiAoIG5vZGVIb29rICYmIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJidXR0b25cIiApICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIG5vZGVIb29rLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gRG9lcyBub3QgcmV0dXJuIHNvIHRoYXQgc2V0QXR0cmlidXRlIGlzIGFsc28gdXNlZFxyXG5cdFx0XHRcdGVsZW0udmFsdWUgPSB2YWx1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdHByb3BGaXg6IHtcclxuXHRcdHRhYmluZGV4OiBcInRhYkluZGV4XCIsXHJcblx0XHRyZWFkb25seTogXCJyZWFkT25seVwiLFxyXG5cdFx0XCJmb3JcIjogXCJodG1sRm9yXCIsXHJcblx0XHRcImNsYXNzXCI6IFwiY2xhc3NOYW1lXCIsXHJcblx0XHRtYXhsZW5ndGg6IFwibWF4TGVuZ3RoXCIsXHJcblx0XHRjZWxsc3BhY2luZzogXCJjZWxsU3BhY2luZ1wiLFxyXG5cdFx0Y2VsbHBhZGRpbmc6IFwiY2VsbFBhZGRpbmdcIixcclxuXHRcdHJvd3NwYW46IFwicm93U3BhblwiLFxyXG5cdFx0Y29sc3BhbjogXCJjb2xTcGFuXCIsXHJcblx0XHR1c2VtYXA6IFwidXNlTWFwXCIsXHJcblx0XHRmcmFtZWJvcmRlcjogXCJmcmFtZUJvcmRlclwiLFxyXG5cdFx0Y29udGVudGVkaXRhYmxlOiBcImNvbnRlbnRFZGl0YWJsZVwiXHJcblx0fSxcclxuXHJcblx0cHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xyXG5cdFx0dmFyIHJldCwgaG9va3MsIG5vdHhtbCxcclxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xyXG5cclxuXHRcdC8vIGRvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcclxuXHRcdGlmICggIWVsZW0gfHwgblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRub3R4bWwgPSBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICk7XHJcblxyXG5cdFx0aWYgKCBub3R4bWwgKSB7XHJcblx0XHRcdC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3NcclxuXHRcdFx0bmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTtcclxuXHRcdFx0aG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSkgIT09IHVuZGVmaW5lZCApIHtcclxuXHRcdFx0XHRyZXR1cm4gcmV0O1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRyZXR1cm4gKCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7XHJcblx0XHRcdFx0cmV0dXJuIHJldDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cmV0dXJuIGVsZW1bIG5hbWUgXTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdHByb3BIb29rczoge1xyXG5cdFx0dGFiSW5kZXg6IHtcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHQvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0XHJcblx0XHRcdFx0Ly8gaHR0cDovL2ZsdWlkcHJvamVjdC5vcmcvYmxvZy8yMDA4LzAxLzA5L2dldHRpbmctc2V0dGluZy1hbmQtcmVtb3ZpbmctdGFiaW5kZXgtdmFsdWVzLXdpdGgtamF2YXNjcmlwdC9cclxuXHRcdFx0XHR2YXIgYXR0cmlidXRlTm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShcInRhYmluZGV4XCIpO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gYXR0cmlidXRlTm9kZSAmJiBhdHRyaWJ1dGVOb2RlLnNwZWNpZmllZCA/XHJcblx0XHRcdFx0XHRwYXJzZUludCggYXR0cmlidXRlTm9kZS52YWx1ZSwgMTAgKSA6XHJcblx0XHRcdFx0XHRyZm9jdXNhYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSB8fCByY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiBlbGVtLmhyZWYgP1xyXG5cdFx0XHRcdFx0XHQwIDpcclxuXHRcdFx0XHRcdFx0dW5kZWZpbmVkO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG59KTtcclxuXHJcbi8vIEhvb2sgZm9yIGJvb2xlYW4gYXR0cmlidXRlc1xyXG5ib29sSG9vayA9IHtcclxuXHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xyXG5cdFx0Ly8gQWxpZ24gYm9vbGVhbiBhdHRyaWJ1dGVzIHdpdGggY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzXHJcblx0XHQvLyBGYWxsIGJhY2sgdG8gYXR0cmlidXRlIHByZXNlbmNlIHdoZXJlIHNvbWUgYm9vbGVhbnMgYXJlIG5vdCBzdXBwb3J0ZWRcclxuXHRcdHZhciBhdHRyTm9kZSxcclxuXHRcdFx0cHJvcGVydHkgPSBqUXVlcnkucHJvcCggZWxlbSwgbmFtZSApO1xyXG5cdFx0cmV0dXJuIHByb3BlcnR5ID09PSB0cnVlIHx8IHR5cGVvZiBwcm9wZXJ0eSAhPT0gXCJib29sZWFuXCIgJiYgKCBhdHRyTm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSApICYmIGF0dHJOb2RlLm5vZGVWYWx1ZSAhPT0gZmFsc2UgP1xyXG5cdFx0XHRuYW1lLnRvTG93ZXJDYXNlKCkgOlxyXG5cdFx0XHR1bmRlZmluZWQ7XHJcblx0fSxcclxuXHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHtcclxuXHRcdHZhciBwcm9wTmFtZTtcclxuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xyXG5cdFx0XHQvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlXHJcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyB2YWx1ZSBpcyB0cnVlIHNpbmNlIHdlIGtub3cgYXQgdGhpcyBwb2ludCBpdCdzIHR5cGUgYm9vbGVhbiBhbmQgbm90IGZhbHNlXHJcblx0XHRcdC8vIFNldCBib29sZWFuIGF0dHJpYnV0ZXMgdG8gdGhlIHNhbWUgbmFtZSBhbmQgc2V0IHRoZSBET00gcHJvcGVydHlcclxuXHRcdFx0cHJvcE5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XHJcblx0XHRcdGlmICggcHJvcE5hbWUgaW4gZWxlbSApIHtcclxuXHRcdFx0XHQvLyBPbmx5IHNldCB0aGUgSURMIHNwZWNpZmljYWxseSBpZiBpdCBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgZWxlbWVudFxyXG5cdFx0XHRcdGVsZW1bIHByb3BOYW1lIF0gPSB0cnVlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpICk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbmFtZTtcclxuXHR9XHJcbn07XHJcblxyXG4vLyBJRTYvNyBkbyBub3Qgc3VwcG9ydCBnZXR0aW5nL3NldHRpbmcgc29tZSBhdHRyaWJ1dGVzIHdpdGggZ2V0L3NldEF0dHJpYnV0ZVxyXG5pZiAoICFnZXRTZXRBdHRyaWJ1dGUgKSB7XHJcblxyXG5cdGZpeFNwZWNpZmllZCA9IHtcclxuXHRcdG5hbWU6IHRydWUsXHJcblx0XHRpZDogdHJ1ZSxcclxuXHRcdGNvb3JkczogdHJ1ZVxyXG5cdH07XHJcblxyXG5cdC8vIFVzZSB0aGlzIGZvciBhbnkgYXR0cmlidXRlIGluIElFNi83XHJcblx0Ly8gVGhpcyBmaXhlcyBhbG1vc3QgZXZlcnkgSUU2LzcgaXNzdWVcclxuXHRub2RlSG9vayA9IGpRdWVyeS52YWxIb29rcy5idXR0b24gPSB7XHJcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xyXG5cdFx0XHR2YXIgcmV0O1xyXG5cdFx0XHRyZXQgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKTtcclxuXHRcdFx0cmV0dXJuIHJldCAmJiAoIGZpeFNwZWNpZmllZFsgbmFtZSBdID8gcmV0LnZhbHVlICE9PSBcIlwiIDogcmV0LnNwZWNpZmllZCApID9cclxuXHRcdFx0XHRyZXQudmFsdWUgOlxyXG5cdFx0XHRcdHVuZGVmaW5lZDtcclxuXHRcdH0sXHJcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHtcclxuXHRcdFx0Ly8gU2V0IHRoZSBleGlzdGluZyBvciBjcmVhdGUgYSBuZXcgYXR0cmlidXRlIG5vZGVcclxuXHRcdFx0dmFyIHJldCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApO1xyXG5cdFx0XHRpZiAoICFyZXQgKSB7XHJcblx0XHRcdFx0cmV0ID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKCBuYW1lICk7XHJcblx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGVOb2RlKCByZXQgKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gKCByZXQudmFsdWUgPSB2YWx1ZSArIFwiXCIgKTtcclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHQvLyBTZXQgd2lkdGggYW5kIGhlaWdodCB0byBhdXRvIGluc3RlYWQgb2YgMCBvbiBlbXB0eSBzdHJpbmcoIEJ1ZyAjODE1MCApXHJcblx0Ly8gVGhpcyBpcyBmb3IgcmVtb3ZhbHNcclxuXHRqUXVlcnkuZWFjaChbIFwid2lkdGhcIiwgXCJoZWlnaHRcIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcclxuXHRcdGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSwge1xyXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcclxuXHRcdFx0XHRpZiAoIHZhbHVlID09PSBcIlwiICkge1xyXG5cdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIFwiYXV0b1wiICk7XHJcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9KTtcclxuXHJcblx0Ly8gU2V0IGNvbnRlbnRlZGl0YWJsZSB0byBmYWxzZSBvbiByZW1vdmFscygjMTA0MjkpXHJcblx0Ly8gU2V0dGluZyB0byBlbXB0eSBzdHJpbmcgdGhyb3dzIGFuIGVycm9yIGFzIGFuIGludmFsaWQgdmFsdWVcclxuXHRqUXVlcnkuYXR0ckhvb2tzLmNvbnRlbnRlZGl0YWJsZSA9IHtcclxuXHRcdGdldDogbm9kZUhvb2suZ2V0LFxyXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7XHJcblx0XHRcdGlmICggdmFsdWUgPT09IFwiXCIgKSB7XHJcblx0XHRcdFx0dmFsdWUgPSBcImZhbHNlXCI7XHJcblx0XHRcdH1cclxuXHRcdFx0bm9kZUhvb2suc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApO1xyXG5cdFx0fVxyXG5cdH07XHJcbn1cclxuXHJcblxyXG4vLyBTb21lIGF0dHJpYnV0ZXMgcmVxdWlyZSBhIHNwZWNpYWwgY2FsbCBvbiBJRVxyXG5pZiAoICFqUXVlcnkuc3VwcG9ydC5ocmVmTm9ybWFsaXplZCApIHtcclxuXHRqUXVlcnkuZWFjaChbIFwiaHJlZlwiLCBcInNyY1wiLCBcIndpZHRoXCIsIFwiaGVpZ2h0XCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XHJcblx0XHRqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0sIHtcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHR2YXIgcmV0ID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIDIgKTtcclxuXHRcdFx0XHRyZXR1cm4gcmV0ID09PSBudWxsID8gdW5kZWZpbmVkIDogcmV0O1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9KTtcclxufVxyXG5cclxuaWYgKCAhalF1ZXJ5LnN1cHBvcnQuc3R5bGUgKSB7XHJcblx0alF1ZXJ5LmF0dHJIb29rcy5zdHlsZSA9IHtcclxuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdC8vIFJldHVybiB1bmRlZmluZWQgaW4gdGhlIGNhc2Ugb2YgZW1wdHkgc3RyaW5nXHJcblx0XHRcdC8vIE5vcm1hbGl6ZSB0byBsb3dlcmNhc2Ugc2luY2UgSUUgdXBwZXJjYXNlcyBjc3MgcHJvcGVydHkgbmFtZXNcclxuXHRcdFx0cmV0dXJuIGVsZW0uc3R5bGUuY3NzVGV4dC50b0xvd2VyQ2FzZSgpIHx8IHVuZGVmaW5lZDtcclxuXHRcdH0sXHJcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcclxuXHRcdFx0cmV0dXJuICggZWxlbS5zdHlsZS5jc3NUZXh0ID0gXCJcIiArIHZhbHVlICk7XHJcblx0XHR9XHJcblx0fTtcclxufVxyXG5cclxuLy8gU2FmYXJpIG1pcy1yZXBvcnRzIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHByb3BlcnR5IG9mIGFuIG9wdGlvblxyXG4vLyBBY2Nlc3NpbmcgdGhlIHBhcmVudCdzIHNlbGVjdGVkSW5kZXggcHJvcGVydHkgZml4ZXMgaXRcclxuaWYgKCAhalF1ZXJ5LnN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7XHJcblx0alF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQsIHtcclxuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XHJcblxyXG5cdFx0XHRpZiAoIHBhcmVudCApIHtcclxuXHRcdFx0XHRwYXJlbnQuc2VsZWN0ZWRJbmRleDtcclxuXHJcblx0XHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgaXQgYWxzbyB3b3JrcyB3aXRoIG9wdGdyb3Vwcywgc2VlICM1NzAxXHJcblx0XHRcdFx0aWYgKCBwYXJlbnQucGFyZW50Tm9kZSApIHtcclxuXHRcdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG59XHJcblxyXG4vLyBJRTYvNyBjYWxsIGVuY3R5cGUgZW5jb2RpbmdcclxuaWYgKCAhalF1ZXJ5LnN1cHBvcnQuZW5jdHlwZSApIHtcclxuXHRqUXVlcnkucHJvcEZpeC5lbmN0eXBlID0gXCJlbmNvZGluZ1wiO1xyXG59XHJcblxyXG4vLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlclxyXG5pZiAoICFqUXVlcnkuc3VwcG9ydC5jaGVja09uICkge1xyXG5cdGpRdWVyeS5lYWNoKFsgXCJyYWRpb1wiLCBcImNoZWNrYm94XCIgXSwgZnVuY3Rpb24oKSB7XHJcblx0XHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHtcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHQvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgaW4gV2Via2l0IFwiXCIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBcIm9uXCIgaWYgYSB2YWx1ZSBpc24ndCBzcGVjaWZpZWRcclxuXHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSA9PT0gbnVsbCA/IFwib25cIiA6IGVsZW0udmFsdWU7XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0fSk7XHJcbn1cclxualF1ZXJ5LmVhY2goWyBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiBdLCBmdW5jdGlvbigpIHtcclxuXHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS52YWxIb29rc1sgdGhpcyBdLCB7XHJcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcclxuXHRcdFx0aWYgKCBqUXVlcnkuaXNBcnJheSggdmFsdWUgKSApIHtcclxuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLmNoZWNrZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KGVsZW0pLnZhbCgpLCB2YWx1ZSApID49IDAgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0pO1xyXG59KTtcclxudmFyIHJmb3JtRWxlbXMgPSAvXig/OnRleHRhcmVhfGlucHV0fHNlbGVjdCkkL2ksXHJcblx0cnR5cGVuYW1lc3BhY2UgPSAvXihbXlxcLl0qfCkoPzpcXC4oLispfCkkLyxcclxuXHRyaG92ZXJIYWNrID0gLyg/Ol58XFxzKWhvdmVyKFxcLlxcUyt8KVxcYi8sXHJcblx0cmtleUV2ZW50ID0gL15rZXkvLFxyXG5cdHJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxjb250ZXh0bWVudSl8Y2xpY2svLFxyXG5cdHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLFxyXG5cdGhvdmVySGFjayA9IGZ1bmN0aW9uKCBldmVudHMgKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5LmV2ZW50LnNwZWNpYWwuaG92ZXIgPyBldmVudHMgOiBldmVudHMucmVwbGFjZSggcmhvdmVySGFjaywgXCJtb3VzZWVudGVyJDEgbW91c2VsZWF2ZSQxXCIgKTtcclxuXHR9O1xyXG5cclxuLypcclxuICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLlxyXG4gKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLlxyXG4gKi9cclxualF1ZXJ5LmV2ZW50ID0ge1xyXG5cclxuXHRhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSwgc2VsZWN0b3IgKSB7XHJcblxyXG5cdFx0dmFyIGVsZW1EYXRhLCBldmVudEhhbmRsZSwgZXZlbnRzLFxyXG5cdFx0XHR0LCB0bnMsIHR5cGUsIG5hbWVzcGFjZXMsIGhhbmRsZU9iaixcclxuXHRcdFx0aGFuZGxlT2JqSW4sIGhhbmRsZXJzLCBzcGVjaWFsO1xyXG5cclxuXHRcdC8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYWxsb3cgcGxhaW4gb2JqZWN0cyB0aG8pXHJcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhdHlwZXMgfHwgIWhhbmRsZXIgfHwgIShlbGVtRGF0YSA9IGpRdWVyeS5fZGF0YSggZWxlbSApKSApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlclxyXG5cdFx0aWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7XHJcblx0XHRcdGhhbmRsZU9iakluID0gaGFuZGxlcjtcclxuXHRcdFx0aGFuZGxlciA9IGhhbmRsZU9iakluLmhhbmRsZXI7XHJcblx0XHRcdHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyXHJcblx0XHRpZiAoICFoYW5kbGVyLmd1aWQgKSB7XHJcblx0XHRcdGhhbmRsZXIuZ3VpZCA9IGpRdWVyeS5ndWlkKys7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdFxyXG5cdFx0ZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzO1xyXG5cdFx0aWYgKCAhZXZlbnRzICkge1xyXG5cdFx0XHRlbGVtRGF0YS5ldmVudHMgPSBldmVudHMgPSB7fTtcclxuXHRcdH1cclxuXHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlO1xyXG5cdFx0aWYgKCAhZXZlbnRIYW5kbGUgKSB7XHJcblx0XHRcdGVsZW1EYXRhLmhhbmRsZSA9IGV2ZW50SGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XHJcblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcclxuXHRcdFx0XHQvLyB3aGVuIGFuIGV2ZW50IGlzIGNhbGxlZCBhZnRlciBhIHBhZ2UgaGFzIHVubG9hZGVkXHJcblx0XHRcdFx0cmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09IFwidW5kZWZpbmVkXCIgJiYgKCFlIHx8IGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgIT09IGUudHlwZSkgP1xyXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmFwcGx5KCBldmVudEhhbmRsZS5lbGVtLCBhcmd1bWVudHMgKSA6XHJcblx0XHRcdFx0XHR1bmRlZmluZWQ7XHJcblx0XHRcdH07XHJcblx0XHRcdC8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkgb2YgdGhlIGhhbmRsZSBmbiB0byBwcmV2ZW50IGEgbWVtb3J5IGxlYWsgd2l0aCBJRSBub24tbmF0aXZlIGV2ZW50c1xyXG5cdFx0XHRldmVudEhhbmRsZS5lbGVtID0gZWxlbTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlXHJcblx0XHQvLyBqUXVlcnkoLi4uKS5iaW5kKFwibW91c2VvdmVyIG1vdXNlb3V0XCIsIGZuKTtcclxuXHRcdHR5cGVzID0galF1ZXJ5LnRyaW0oIGhvdmVySGFjayh0eXBlcykgKS5zcGxpdCggXCIgXCIgKTtcclxuXHRcdGZvciAoIHQgPSAwOyB0IDwgdHlwZXMubGVuZ3RoOyB0KysgKSB7XHJcblxyXG5cdFx0XHR0bnMgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1t0XSApIHx8IFtdO1xyXG5cdFx0XHR0eXBlID0gdG5zWzFdO1xyXG5cdFx0XHRuYW1lc3BhY2VzID0gKCB0bnNbMl0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcclxuXHJcblx0XHRcdC8vIElmIGV2ZW50IGNoYW5nZXMgaXRzIHR5cGUsIHVzZSB0aGUgc3BlY2lhbCBldmVudCBoYW5kbGVycyBmb3IgdGhlIGNoYW5nZWQgdHlwZVxyXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcclxuXHJcblx0XHRcdC8vIElmIHNlbGVjdG9yIGRlZmluZWQsIGRldGVybWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBlLCBvdGhlcndpc2UgZ2l2ZW4gdHlwZVxyXG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XHJcblxyXG5cdFx0XHQvLyBVcGRhdGUgc3BlY2lhbCBiYXNlZCBvbiBuZXdseSByZXNldCB0eXBlXHJcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xyXG5cclxuXHRcdFx0Ly8gaGFuZGxlT2JqIGlzIHBhc3NlZCB0byBhbGwgZXZlbnQgaGFuZGxlcnNcclxuXHRcdFx0aGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCh7XHJcblx0XHRcdFx0dHlwZTogdHlwZSxcclxuXHRcdFx0XHRvcmlnVHlwZTogdG5zWzFdLFxyXG5cdFx0XHRcdGRhdGE6IGRhdGEsXHJcblx0XHRcdFx0aGFuZGxlcjogaGFuZGxlcixcclxuXHRcdFx0XHRndWlkOiBoYW5kbGVyLmd1aWQsXHJcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxyXG5cdFx0XHRcdG5hbWVzcGFjZTogbmFtZXNwYWNlcy5qb2luKFwiLlwiKVxyXG5cdFx0XHR9LCBoYW5kbGVPYmpJbiApO1xyXG5cclxuXHRcdFx0Ly8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3RcclxuXHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXTtcclxuXHRcdFx0aWYgKCAhaGFuZGxlcnMgKSB7XHJcblx0XHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSA9IFtdO1xyXG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xyXG5cclxuXHRcdFx0XHQvLyBPbmx5IHVzZSBhZGRFdmVudExpc3RlbmVyL2F0dGFjaEV2ZW50IGlmIHRoZSBzcGVjaWFsIGV2ZW50cyBoYW5kbGVyIHJldHVybnMgZmFsc2VcclxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8IHNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7XHJcblx0XHRcdFx0XHQvLyBCaW5kIHRoZSBnbG9iYWwgZXZlbnQgaGFuZGxlciB0byB0aGUgZWxlbWVudFxyXG5cdFx0XHRcdFx0aWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIgKSB7XHJcblx0XHRcdFx0XHRcdGVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUsIGZhbHNlICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggZWxlbS5hdHRhY2hFdmVudCApIHtcclxuXHRcdFx0XHRcdFx0ZWxlbS5hdHRhY2hFdmVudCggXCJvblwiICsgdHlwZSwgZXZlbnRIYW5kbGUgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggc3BlY2lhbC5hZGQgKSB7XHJcblx0XHRcdFx0c3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XHJcblxyXG5cdFx0XHRcdGlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7XHJcblx0XHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnRcclxuXHRcdFx0aWYgKCBzZWxlY3RvciApIHtcclxuXHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGhhbmRsZXJzLmRlbGVnYXRlQ291bnQrKywgMCwgaGFuZGxlT2JqICk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0aGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb25cclxuXHRcdFx0alF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBOdWxsaWZ5IGVsZW0gdG8gcHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUVcclxuXHRcdGVsZW0gPSBudWxsO1xyXG5cdH0sXHJcblxyXG5cdGdsb2JhbDoge30sXHJcblxyXG5cdC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudFxyXG5cdHJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7XHJcblxyXG5cdFx0dmFyIHQsIHRucywgdHlwZSwgb3JpZ1R5cGUsIG5hbWVzcGFjZXMsIG9yaWdDb3VudCxcclxuXHRcdFx0aiwgZXZlbnRzLCBzcGVjaWFsLCBldmVudFR5cGUsIGhhbmRsZU9iaixcclxuXHRcdFx0ZWxlbURhdGEgPSBqUXVlcnkuaGFzRGF0YSggZWxlbSApICYmIGpRdWVyeS5fZGF0YSggZWxlbSApO1xyXG5cclxuXHRcdGlmICggIWVsZW1EYXRhIHx8ICEoZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzKSApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWRcclxuXHRcdHR5cGVzID0galF1ZXJ5LnRyaW0oIGhvdmVySGFjayggdHlwZXMgfHwgXCJcIiApICkuc3BsaXQoXCIgXCIpO1xyXG5cdFx0Zm9yICggdCA9IDA7IHQgPCB0eXBlcy5sZW5ndGg7IHQrKyApIHtcclxuXHRcdFx0dG5zID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbdF0gKSB8fCBbXTtcclxuXHRcdFx0dHlwZSA9IG9yaWdUeXBlID0gdG5zWzFdO1xyXG5cdFx0XHRuYW1lc3BhY2VzID0gdG5zWzJdO1xyXG5cclxuXHRcdFx0Ly8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50XHJcblx0XHRcdGlmICggIXR5cGUgKSB7XHJcblx0XHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XHJcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xyXG5cdFx0XHR0eXBlID0gKCBzZWxlY3Rvcj8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTtcclxuXHRcdFx0ZXZlbnRUeXBlID0gZXZlbnRzWyB0eXBlIF0gfHwgW107XHJcblx0XHRcdG9yaWdDb3VudCA9IGV2ZW50VHlwZS5sZW5ndGg7XHJcblx0XHRcdG5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzID8gbmV3IFJlZ0V4cChcIihefFxcXFwuKVwiICsgbmFtZXNwYWNlcy5zcGxpdChcIi5cIikuc29ydCgpLmpvaW4oXCJcXFxcLig/Oi4qXFxcXC58KVwiKSArIFwiKFxcXFwufCQpXCIpIDogbnVsbDtcclxuXHJcblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcclxuXHRcdFx0Zm9yICggaiA9IDA7IGogPCBldmVudFR5cGUubGVuZ3RoOyBqKysgKSB7XHJcblx0XHRcdFx0aGFuZGxlT2JqID0gZXZlbnRUeXBlWyBqIF07XHJcblxyXG5cdFx0XHRcdGlmICggKCBtYXBwZWRUeXBlcyB8fCBvcmlnVHlwZSA9PT0gaGFuZGxlT2JqLm9yaWdUeXBlICkgJiZcclxuXHRcdFx0XHRcdCAoICFoYW5kbGVyIHx8IGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSAmJlxyXG5cdFx0XHRcdFx0ICggIW5hbWVzcGFjZXMgfHwgbmFtZXNwYWNlcy50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJlxyXG5cdFx0XHRcdFx0ICggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcclxuXHRcdFx0XHRcdGV2ZW50VHlwZS5zcGxpY2UoIGotLSwgMSApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xyXG5cdFx0XHRcdFx0XHRldmVudFR5cGUuZGVsZWdhdGVDb3VudC0tO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCBzcGVjaWFsLnJlbW92ZSApIHtcclxuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBSZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVyIGlmIHdlIHJlbW92ZWQgc29tZXRoaW5nIGFuZCBubyBtb3JlIGhhbmRsZXJzIGV4aXN0XHJcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxyXG5cdFx0XHRpZiAoIGV2ZW50VHlwZS5sZW5ndGggPT09IDAgJiYgb3JpZ0NvdW50ICE9PSBldmVudFR5cGUubGVuZ3RoICkge1xyXG5cdFx0XHRcdGlmICggIXNwZWNpYWwudGVhcmRvd24gfHwgc3BlY2lhbC50ZWFyZG93bi5jYWxsKCBlbGVtLCBuYW1lc3BhY2VzLCBlbGVtRGF0YS5oYW5kbGUgKSA9PT0gZmFsc2UgKSB7XHJcblx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGVsZW1EYXRhLmhhbmRsZSApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0ZGVsZXRlIGV2ZW50c1sgdHlwZSBdO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWRcclxuXHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkge1xyXG5cdFx0XHRkZWxldGUgZWxlbURhdGEuaGFuZGxlO1xyXG5cclxuXHRcdFx0Ly8gcmVtb3ZlRGF0YSBhbHNvIGNoZWNrcyBmb3IgZW1wdGluZXNzIGFuZCBjbGVhcnMgdGhlIGV4cGFuZG8gaWYgZW1wdHlcclxuXHRcdFx0Ly8gc28gdXNlIGl0IGluc3RlYWQgb2YgZGVsZXRlXHJcblx0XHRcdGpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCBcImV2ZW50c1wiLCB0cnVlICk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Ly8gRXZlbnRzIHRoYXQgYXJlIHNhZmUgdG8gc2hvcnQtY2lyY3VpdCBpZiBubyBoYW5kbGVycyBhcmUgYXR0YWNoZWQuXHJcblx0Ly8gTmF0aXZlIERPTSBldmVudHMgc2hvdWxkIG5vdCBiZSBhZGRlZCwgdGhleSBtYXkgaGF2ZSBpbmxpbmUgaGFuZGxlcnMuXHJcblx0Y3VzdG9tRXZlbnQ6IHtcclxuXHRcdFwiZ2V0RGF0YVwiOiB0cnVlLFxyXG5cdFx0XCJzZXREYXRhXCI6IHRydWUsXHJcblx0XHRcImNoYW5nZURhdGFcIjogdHJ1ZVxyXG5cdH0sXHJcblxyXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkge1xyXG5cdFx0Ly8gRG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcclxuXHRcdGlmICggZWxlbSAmJiAoZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4KSApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEV2ZW50IG9iamVjdCBvciBldmVudCB0eXBlXHJcblx0XHR2YXIgY2FjaGUsIGV4Y2x1c2l2ZSwgaSwgY3VyLCBvbGQsIG9udHlwZSwgc3BlY2lhbCwgaGFuZGxlLCBldmVudFBhdGgsIGJ1YmJsZVR5cGUsXHJcblx0XHRcdHR5cGUgPSBldmVudC50eXBlIHx8IGV2ZW50LFxyXG5cdFx0XHRuYW1lc3BhY2VzID0gW107XHJcblxyXG5cdFx0Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93XHJcblx0XHRpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHR5cGUuaW5kZXhPZiggXCIhXCIgKSA+PSAwICkge1xyXG5cdFx0XHQvLyBFeGNsdXNpdmUgZXZlbnRzIHRyaWdnZXIgb25seSBmb3IgdGhlIGV4YWN0IGV2ZW50IChubyBuYW1lc3BhY2VzKVxyXG5cdFx0XHR0eXBlID0gdHlwZS5zbGljZSgwLCAtMSk7XHJcblx0XHRcdGV4Y2x1c2l2ZSA9IHRydWU7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0eXBlLmluZGV4T2YoIFwiLlwiICkgPj0gMCApIHtcclxuXHRcdFx0Ly8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKVxyXG5cdFx0XHRuYW1lc3BhY2VzID0gdHlwZS5zcGxpdChcIi5cIik7XHJcblx0XHRcdHR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7XHJcblx0XHRcdG5hbWVzcGFjZXMuc29ydCgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggKCFlbGVtIHx8IGpRdWVyeS5ldmVudC5jdXN0b21FdmVudFsgdHlwZSBdKSAmJiAhalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdICkge1xyXG5cdFx0XHQvLyBObyBqUXVlcnkgaGFuZGxlcnMgZm9yIHRoaXMgZXZlbnQgdHlwZSwgYW5kIGl0IGNhbid0IGhhdmUgaW5saW5lIGhhbmRsZXJzXHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gRXZlbnQsIE9iamVjdCwgb3IganVzdCBhbiBldmVudCB0eXBlIHN0cmluZ1xyXG5cdFx0ZXZlbnQgPSB0eXBlb2YgZXZlbnQgPT09IFwib2JqZWN0XCIgP1xyXG5cdFx0XHQvLyBqUXVlcnkuRXZlbnQgb2JqZWN0XHJcblx0XHRcdGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8gZXZlbnQgOlxyXG5cdFx0XHQvLyBPYmplY3QgbGl0ZXJhbFxyXG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCB0eXBlLCBldmVudCApIDpcclxuXHRcdFx0Ly8gSnVzdCB0aGUgZXZlbnQgdHlwZSAoc3RyaW5nKVxyXG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCB0eXBlICk7XHJcblxyXG5cdFx0ZXZlbnQudHlwZSA9IHR5cGU7XHJcblx0XHRldmVudC5pc1RyaWdnZXIgPSB0cnVlO1xyXG5cdFx0ZXZlbnQuZXhjbHVzaXZlID0gZXhjbHVzaXZlO1xyXG5cdFx0ZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCBcIi5cIiApO1xyXG5cdFx0ZXZlbnQubmFtZXNwYWNlX3JlID0gZXZlbnQubmFtZXNwYWNlPyBuZXcgUmVnRXhwKFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oXCJcXFxcLig/Oi4qXFxcXC58KVwiKSArIFwiKFxcXFwufCQpXCIpIDogbnVsbDtcclxuXHRcdG9udHlwZSA9IHR5cGUuaW5kZXhPZiggXCI6XCIgKSA8IDAgPyBcIm9uXCIgKyB0eXBlIDogXCJcIjtcclxuXHJcblx0XHQvLyBIYW5kbGUgYSBnbG9iYWwgdHJpZ2dlclxyXG5cdFx0aWYgKCAhZWxlbSApIHtcclxuXHJcblx0XHRcdC8vIFRPRE86IFN0b3AgdGF1bnRpbmcgdGhlIGRhdGEgY2FjaGU7IHJlbW92ZSBnbG9iYWwgZXZlbnRzIGFuZCBhbHdheXMgYXR0YWNoIHRvIGRvY3VtZW50XHJcblx0XHRcdGNhY2hlID0galF1ZXJ5LmNhY2hlO1xyXG5cdFx0XHRmb3IgKCBpIGluIGNhY2hlICkge1xyXG5cdFx0XHRcdGlmICggY2FjaGVbIGkgXS5ldmVudHMgJiYgY2FjaGVbIGkgXS5ldmVudHNbIHR5cGUgXSApIHtcclxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgY2FjaGVbIGkgXS5oYW5kbGUuZWxlbSwgdHJ1ZSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkXHJcblx0XHRldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7XHJcblx0XHRpZiAoICFldmVudC50YXJnZXQgKSB7XHJcblx0XHRcdGV2ZW50LnRhcmdldCA9IGVsZW07XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ2xvbmUgYW55IGluY29taW5nIGRhdGEgYW5kIHByZXBlbmQgdGhlIGV2ZW50LCBjcmVhdGluZyB0aGUgaGFuZGxlciBhcmcgbGlzdFxyXG5cdFx0ZGF0YSA9IGRhdGEgIT0gbnVsbCA/IGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSA6IFtdO1xyXG5cdFx0ZGF0YS51bnNoaWZ0KCBldmVudCApO1xyXG5cclxuXHRcdC8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXNcclxuXHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xyXG5cdFx0aWYgKCBzcGVjaWFsLnRyaWdnZXIgJiYgc3BlY2lhbC50cmlnZ2VyLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpXHJcblx0XHQvLyBCdWJibGUgdXAgdG8gZG9jdW1lbnQsIHRoZW4gdG8gd2luZG93OyB3YXRjaCBmb3IgYSBnbG9iYWwgb3duZXJEb2N1bWVudCB2YXIgKCM5NzI0KVxyXG5cdFx0ZXZlbnRQYXRoID0gW1sgZWxlbSwgc3BlY2lhbC5iaW5kVHlwZSB8fCB0eXBlIF1dO1xyXG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHtcclxuXHJcblx0XHRcdGJ1YmJsZVR5cGUgPSBzcGVjaWFsLmRlbGVnYXRlVHlwZSB8fCB0eXBlO1xyXG5cdFx0XHRjdXIgPSByZm9jdXNNb3JwaC50ZXN0KCBidWJibGVUeXBlICsgdHlwZSApID8gZWxlbSA6IGVsZW0ucGFyZW50Tm9kZTtcclxuXHRcdFx0Zm9yICggb2xkID0gZWxlbTsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcclxuXHRcdFx0XHRldmVudFBhdGgucHVzaChbIGN1ciwgYnViYmxlVHlwZSBdKTtcclxuXHRcdFx0XHRvbGQgPSBjdXI7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE9ubHkgYWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3IgZGV0YWNoZWQgRE9NKVxyXG5cdFx0XHRpZiAoIG9sZCA9PT0gKGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkgKSB7XHJcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goWyBvbGQuZGVmYXVsdFZpZXcgfHwgb2xkLnBhcmVudFdpbmRvdyB8fCB3aW5kb3csIGJ1YmJsZVR5cGUgXSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoXHJcblx0XHRmb3IgKCBpID0gMDsgaSA8IGV2ZW50UGF0aC5sZW5ndGggJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7IGkrKyApIHtcclxuXHJcblx0XHRcdGN1ciA9IGV2ZW50UGF0aFtpXVswXTtcclxuXHRcdFx0ZXZlbnQudHlwZSA9IGV2ZW50UGF0aFtpXVsxXTtcclxuXHJcblx0XHRcdGhhbmRsZSA9ICggalF1ZXJ5Ll9kYXRhKCBjdXIsIFwiZXZlbnRzXCIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gJiYgalF1ZXJ5Ll9kYXRhKCBjdXIsIFwiaGFuZGxlXCIgKTtcclxuXHRcdFx0aWYgKCBoYW5kbGUgKSB7XHJcblx0XHRcdFx0aGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBOb3RlIHRoYXQgdGhpcyBpcyBhIGJhcmUgSlMgZnVuY3Rpb24gYW5kIG5vdCBhIGpRdWVyeSBoYW5kbGVyXHJcblx0XHRcdGhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdO1xyXG5cdFx0XHRpZiAoIGhhbmRsZSAmJiBqUXVlcnkuYWNjZXB0RGF0YSggY3VyICkgJiYgaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKSA9PT0gZmFsc2UgKSB7XHJcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0ZXZlbnQudHlwZSA9IHR5cGU7XHJcblxyXG5cdFx0Ly8gSWYgbm9ib2R5IHByZXZlbnRlZCB0aGUgZGVmYXVsdCBhY3Rpb24sIGRvIGl0IG5vd1xyXG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHtcclxuXHJcblx0XHRcdGlmICggKCFzcGVjaWFsLl9kZWZhdWx0IHx8IHNwZWNpYWwuX2RlZmF1bHQuYXBwbHkoIGVsZW0ub3duZXJEb2N1bWVudCwgZGF0YSApID09PSBmYWxzZSkgJiZcclxuXHRcdFx0XHQhKHR5cGUgPT09IFwiY2xpY2tcIiAmJiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sIFwiYVwiICkpICYmIGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7XHJcblxyXG5cdFx0XHRcdC8vIENhbGwgYSBuYXRpdmUgRE9NIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBuYW1lIGFzIHRoZSBldmVudC5cclxuXHRcdFx0XHQvLyBDYW4ndCB1c2UgYW4gLmlzRnVuY3Rpb24oKSBjaGVjayBoZXJlIGJlY2F1c2UgSUU2LzcgZmFpbHMgdGhhdCB0ZXN0LlxyXG5cdFx0XHRcdC8vIERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgjNjE3MClcclxuXHRcdFx0XHQvLyBJRTw5IGRpZXMgb24gZm9jdXMvYmx1ciB0byBoaWRkZW4gZWxlbWVudCAoIzE0ODYpXHJcblx0XHRcdFx0aWYgKCBvbnR5cGUgJiYgZWxlbVsgdHlwZSBdICYmICgodHlwZSAhPT0gXCJmb2N1c1wiICYmIHR5cGUgIT09IFwiYmx1clwiKSB8fCBldmVudC50YXJnZXQub2Zmc2V0V2lkdGggIT09IDApICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXHJcblx0XHRcdFx0XHRvbGQgPSBlbGVtWyBvbnR5cGUgXTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIG9sZCApIHtcclxuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSBudWxsO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlXHJcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdHlwZTtcclxuXHRcdFx0XHRcdGVsZW1bIHR5cGUgXSgpO1xyXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHRcdFx0XHRpZiAoIG9sZCApIHtcclxuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSBvbGQ7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcclxuXHR9LFxyXG5cclxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkge1xyXG5cclxuXHRcdC8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdFxyXG5cdFx0ZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBldmVudCB8fCB3aW5kb3cuZXZlbnQgKTtcclxuXHJcblx0XHR2YXIgaSwgaiwgY3VyLCByZXQsIHNlbE1hdGNoLCBtYXRjaGVkLCBtYXRjaGVzLCBoYW5kbGVPYmosIHNlbCwgcmVsYXRlZCxcclxuXHRcdFx0aGFuZGxlcnMgPSAoIChqUXVlcnkuX2RhdGEoIHRoaXMsIFwiZXZlbnRzXCIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gfHwgW10pLFxyXG5cdFx0XHRkZWxlZ2F0ZUNvdW50ID0gaGFuZGxlcnMuZGVsZWdhdGVDb3VudCxcclxuXHRcdFx0YXJncyA9IFtdLnNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLFxyXG5cdFx0XHRydW5fYWxsID0gIWV2ZW50LmV4Y2x1c2l2ZSAmJiAhZXZlbnQubmFtZXNwYWNlLFxyXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGV2ZW50LnR5cGUgXSB8fCB7fSxcclxuXHRcdFx0aGFuZGxlclF1ZXVlID0gW107XHJcblxyXG5cdFx0Ly8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnRcclxuXHRcdGFyZ3NbMF0gPSBldmVudDtcclxuXHRcdGV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpcztcclxuXHJcblx0XHQvLyBDYWxsIHRoZSBwcmVEaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5cGUsIGFuZCBsZXQgaXQgYmFpbCBpZiBkZXNpcmVkXHJcblx0XHRpZiAoIHNwZWNpYWwucHJlRGlzcGF0Y2ggJiYgc3BlY2lhbC5wcmVEaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApID09PSBmYWxzZSApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIERldGVybWluZSBoYW5kbGVycyB0aGF0IHNob3VsZCBydW4gaWYgdGhlcmUgYXJlIGRlbGVnYXRlZCBldmVudHNcclxuXHRcdC8vIEF2b2lkIG5vbi1sZWZ0LWNsaWNrIGJ1YmJsaW5nIGluIEZpcmVmb3ggKCMzODYxKVxyXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50ICYmICEoZXZlbnQuYnV0dG9uICYmIGV2ZW50LnR5cGUgPT09IFwiY2xpY2tcIikgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBjdXIgPSBldmVudC50YXJnZXQ7IGN1ciAhPSB0aGlzOyBjdXIgPSBjdXIucGFyZW50Tm9kZSB8fCB0aGlzICkge1xyXG5cclxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyAoT05MWSkgb24gZGlzYWJsZWQgZWxlbWVudHMgKCM2OTExLCAjODE2NSwgIzExMzgyLCAjMTE3NjQpXHJcblx0XHRcdFx0aWYgKCBjdXIuZGlzYWJsZWQgIT09IHRydWUgfHwgZXZlbnQudHlwZSAhPT0gXCJjbGlja1wiICkge1xyXG5cdFx0XHRcdFx0c2VsTWF0Y2ggPSB7fTtcclxuXHRcdFx0XHRcdG1hdGNoZXMgPSBbXTtcclxuXHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkge1xyXG5cdFx0XHRcdFx0XHRoYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdO1xyXG5cdFx0XHRcdFx0XHRzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3I7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHNlbE1hdGNoWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRcdFx0XHRcdHNlbE1hdGNoWyBzZWwgXSA9IGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID49IDA7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKCBzZWxNYXRjaFsgc2VsIF0gKSB7XHJcblx0XHRcdFx0XHRcdFx0bWF0Y2hlcy5wdXNoKCBoYW5kbGVPYmogKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVzLmxlbmd0aCApIHtcclxuXHRcdFx0XHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goeyBlbGVtOiBjdXIsIG1hdGNoZXM6IG1hdGNoZXMgfSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVyc1xyXG5cdFx0aWYgKCBoYW5kbGVycy5sZW5ndGggPiBkZWxlZ2F0ZUNvdW50ICkge1xyXG5cdFx0XHRoYW5kbGVyUXVldWUucHVzaCh7IGVsZW06IHRoaXMsIG1hdGNoZXM6IGhhbmRsZXJzLnNsaWNlKCBkZWxlZ2F0ZUNvdW50ICkgfSk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUnVuIGRlbGVnYXRlcyBmaXJzdDsgdGhleSBtYXkgd2FudCB0byBzdG9wIHByb3BhZ2F0aW9uIGJlbmVhdGggdXNcclxuXHRcdGZvciAoIGkgPSAwOyBpIDwgaGFuZGxlclF1ZXVlLmxlbmd0aCAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTsgaSsrICkge1xyXG5cdFx0XHRtYXRjaGVkID0gaGFuZGxlclF1ZXVlWyBpIF07XHJcblx0XHRcdGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07XHJcblxyXG5cdFx0XHRmb3IgKCBqID0gMDsgaiA8IG1hdGNoZWQubWF0Y2hlcy5sZW5ndGggJiYgIWV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7IGorKyApIHtcclxuXHRcdFx0XHRoYW5kbGVPYmogPSBtYXRjaGVkLm1hdGNoZXNbIGogXTtcclxuXHJcblx0XHRcdFx0Ly8gVHJpZ2dlcmVkIGV2ZW50IG11c3QgZWl0aGVyIDEpIGJlIG5vbi1leGNsdXNpdmUgYW5kIGhhdmUgbm8gbmFtZXNwYWNlLCBvclxyXG5cdFx0XHRcdC8vIDIpIGhhdmUgbmFtZXNwYWNlKHMpIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLlxyXG5cdFx0XHRcdGlmICggcnVuX2FsbCB8fCAoIWV2ZW50Lm5hbWVzcGFjZSAmJiAhaGFuZGxlT2JqLm5hbWVzcGFjZSkgfHwgZXZlbnQubmFtZXNwYWNlX3JlICYmIGV2ZW50Lm5hbWVzcGFjZV9yZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhO1xyXG5cdFx0XHRcdFx0ZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqO1xyXG5cclxuXHRcdFx0XHRcdHJldCA9ICggKGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSkuaGFuZGxlIHx8IGhhbmRsZU9iai5oYW5kbGVyIClcclxuXHRcdFx0XHRcdFx0XHQuYXBwbHkoIG1hdGNoZWQuZWxlbSwgYXJncyApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdFx0XHRcdGV2ZW50LnJlc3VsdCA9IHJldDtcclxuXHRcdFx0XHRcdFx0aWYgKCByZXQgPT09IGZhbHNlICkge1xyXG5cdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlXHJcblx0XHRpZiAoIHNwZWNpYWwucG9zdERpc3BhdGNoICkge1xyXG5cdFx0XHRzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XHJcblx0fSxcclxuXHJcblx0Ly8gSW5jbHVkZXMgc29tZSBldmVudCBwcm9wcyBzaGFyZWQgYnkgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnRcclxuXHQvLyAqKiogYXR0ckNoYW5nZSBhdHRyTmFtZSByZWxhdGVkTm9kZSBzcmNFbGVtZW50ICBhcmUgbm90IG5vcm1hbGl6ZWQsIG5vbi1XM0MsIGRlcHJlY2F0ZWQsIHdpbGwgYmUgcmVtb3ZlZCBpbiAxLjggKioqXHJcblx0cHJvcHM6IFwiYXR0ckNoYW5nZSBhdHRyTmFtZSByZWxhdGVkTm9kZSBzcmNFbGVtZW50IGFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaFwiLnNwbGl0KFwiIFwiKSxcclxuXHJcblx0Zml4SG9va3M6IHt9LFxyXG5cclxuXHRrZXlIb29rczoge1xyXG5cdFx0cHJvcHM6IFwiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZVwiLnNwbGl0KFwiIFwiKSxcclxuXHRcdGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHtcclxuXHJcblx0XHRcdC8vIEFkZCB3aGljaCBmb3Iga2V5IGV2ZW50c1xyXG5cdFx0XHRpZiAoIGV2ZW50LndoaWNoID09IG51bGwgKSB7XHJcblx0XHRcdFx0ZXZlbnQud2hpY2ggPSBvcmlnaW5hbC5jaGFyQ29kZSAhPSBudWxsID8gb3JpZ2luYWwuY2hhckNvZGUgOiBvcmlnaW5hbC5rZXlDb2RlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZXZlbnQ7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0bW91c2VIb29rczoge1xyXG5cdFx0cHJvcHM6IFwiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50XCIuc3BsaXQoXCIgXCIpLFxyXG5cdFx0ZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkge1xyXG5cdFx0XHR2YXIgZXZlbnREb2MsIGRvYywgYm9keSxcclxuXHRcdFx0XHRidXR0b24gPSBvcmlnaW5hbC5idXR0b24sXHJcblx0XHRcdFx0ZnJvbUVsZW1lbnQgPSBvcmlnaW5hbC5mcm9tRWxlbWVudDtcclxuXHJcblx0XHRcdC8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGVcclxuXHRcdFx0aWYgKCBldmVudC5wYWdlWCA9PSBudWxsICYmIG9yaWdpbmFsLmNsaWVudFggIT0gbnVsbCApIHtcclxuXHRcdFx0XHRldmVudERvYyA9IGV2ZW50LnRhcmdldC5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50O1xyXG5cdFx0XHRcdGRvYyA9IGV2ZW50RG9jLmRvY3VtZW50RWxlbWVudDtcclxuXHRcdFx0XHRib2R5ID0gZXZlbnREb2MuYm9keTtcclxuXHJcblx0XHRcdFx0ZXZlbnQucGFnZVggPSBvcmlnaW5hbC5jbGllbnRYICsgKCBkb2MgJiYgZG9jLnNjcm9sbExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9sbExlZnQgfHwgMCApIC0gKCBkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCApO1xyXG5cdFx0XHRcdGV2ZW50LnBhZ2VZID0gb3JpZ2luYWwuY2xpZW50WSArICggZG9jICYmIGRvYy5zY3JvbGxUb3AgIHx8IGJvZHkgJiYgYm9keS5zY3JvbGxUb3AgIHx8IDAgKSAtICggZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDAgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gQWRkIHJlbGF0ZWRUYXJnZXQsIGlmIG5lY2Vzc2FyeVxyXG5cdFx0XHRpZiAoICFldmVudC5yZWxhdGVkVGFyZ2V0ICYmIGZyb21FbGVtZW50ICkge1xyXG5cdFx0XHRcdGV2ZW50LnJlbGF0ZWRUYXJnZXQgPSBmcm9tRWxlbWVudCA9PT0gZXZlbnQudGFyZ2V0ID8gb3JpZ2luYWwudG9FbGVtZW50IDogZnJvbUVsZW1lbnQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHRcclxuXHRcdFx0Ly8gTm90ZTogYnV0dG9uIGlzIG5vdCBub3JtYWxpemVkLCBzbyBkb24ndCB1c2UgaXRcclxuXHRcdFx0aWYgKCAhZXZlbnQud2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdFx0ZXZlbnQud2hpY2ggPSAoIGJ1dHRvbiAmIDEgPyAxIDogKCBidXR0b24gJiAyID8gMyA6ICggYnV0dG9uICYgNCA/IDIgOiAwICkgKSApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZXZlbnQ7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Zml4OiBmdW5jdGlvbiggZXZlbnQgKSB7XHJcblx0XHRpZiAoIGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdICkge1xyXG5cdFx0XHRyZXR1cm4gZXZlbnQ7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ3JlYXRlIGEgd3JpdGFibGUgY29weSBvZiB0aGUgZXZlbnQgb2JqZWN0IGFuZCBub3JtYWxpemUgc29tZSBwcm9wZXJ0aWVzXHJcblx0XHR2YXIgaSwgcHJvcCxcclxuXHRcdFx0b3JpZ2luYWxFdmVudCA9IGV2ZW50LFxyXG5cdFx0XHRmaXhIb29rID0galF1ZXJ5LmV2ZW50LmZpeEhvb2tzWyBldmVudC50eXBlIF0gfHwge30sXHJcblx0XHRcdGNvcHkgPSBmaXhIb29rLnByb3BzID8gdGhpcy5wcm9wcy5jb25jYXQoIGZpeEhvb2sucHJvcHMgKSA6IHRoaXMucHJvcHM7XHJcblxyXG5cdFx0ZXZlbnQgPSBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTtcclxuXHJcblx0XHRmb3IgKCBpID0gY29weS5sZW5ndGg7IGk7ICkge1xyXG5cdFx0XHRwcm9wID0gY29weVsgLS1pIF07XHJcblx0XHRcdGV2ZW50WyBwcm9wIF0gPSBvcmlnaW5hbEV2ZW50WyBwcm9wIF07XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRml4IHRhcmdldCBwcm9wZXJ0eSwgaWYgbmVjZXNzYXJ5ICgjMTkyNSwgSUUgNi83LzggJiBTYWZhcmkyKVxyXG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xyXG5cdFx0XHRldmVudC50YXJnZXQgPSBvcmlnaW5hbEV2ZW50LnNyY0VsZW1lbnQgfHwgZG9jdW1lbnQ7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVGFyZ2V0IHNob3VsZCBub3QgYmUgYSB0ZXh0IG5vZGUgKCM1MDQsIFNhZmFyaSlcclxuXHRcdGlmICggZXZlbnQudGFyZ2V0Lm5vZGVUeXBlID09PSAzICkge1xyXG5cdFx0XHRldmVudC50YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50Tm9kZTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBGb3IgbW91c2Uva2V5IGV2ZW50cywgbWV0YUtleT09ZmFsc2UgaWYgaXQncyB1bmRlZmluZWQgKCMzMzY4LCAjMTEzMjg7IElFNi83LzgpXHJcblx0XHRldmVudC5tZXRhS2V5ID0gISFldmVudC5tZXRhS2V5O1xyXG5cclxuXHRcdHJldHVybiBmaXhIb29rLmZpbHRlcj8gZml4SG9vay5maWx0ZXIoIGV2ZW50LCBvcmlnaW5hbEV2ZW50ICkgOiBldmVudDtcclxuXHR9LFxyXG5cclxuXHRzcGVjaWFsOiB7XHJcblx0XHRsb2FkOiB7XHJcblx0XHRcdC8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWRcclxuXHRcdFx0bm9CdWJibGU6IHRydWVcclxuXHRcdH0sXHJcblxyXG5cdFx0Zm9jdXM6IHtcclxuXHRcdFx0ZGVsZWdhdGVUeXBlOiBcImZvY3VzaW5cIlxyXG5cdFx0fSxcclxuXHRcdGJsdXI6IHtcclxuXHRcdFx0ZGVsZWdhdGVUeXBlOiBcImZvY3Vzb3V0XCJcclxuXHRcdH0sXHJcblxyXG5cdFx0YmVmb3JldW5sb2FkOiB7XHJcblx0XHRcdHNldHVwOiBmdW5jdGlvbiggZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSB7XHJcblx0XHRcdFx0Ly8gV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgc3BlY2lhbCBjYXNlIG9uIHdpbmRvd3NcclxuXHRcdFx0XHRpZiAoIGpRdWVyeS5pc1dpbmRvdyggdGhpcyApICkge1xyXG5cdFx0XHRcdFx0dGhpcy5vbmJlZm9yZXVubG9hZCA9IGV2ZW50SGFuZGxlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHRlYXJkb3duOiBmdW5jdGlvbiggbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSB7XHJcblx0XHRcdFx0aWYgKCB0aGlzLm9uYmVmb3JldW5sb2FkID09PSBldmVudEhhbmRsZSApIHtcclxuXHRcdFx0XHRcdHRoaXMub25iZWZvcmV1bmxvYWQgPSBudWxsO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdHNpbXVsYXRlOiBmdW5jdGlvbiggdHlwZSwgZWxlbSwgZXZlbnQsIGJ1YmJsZSApIHtcclxuXHRcdC8vIFBpZ2d5YmFjayBvbiBhIGRvbm9yIGV2ZW50IHRvIHNpbXVsYXRlIGEgZGlmZmVyZW50IG9uZS5cclxuXHRcdC8vIEZha2Ugb3JpZ2luYWxFdmVudCB0byBhdm9pZCBkb25vcidzIHN0b3BQcm9wYWdhdGlvbiwgYnV0IGlmIHRoZVxyXG5cdFx0Ly8gc2ltdWxhdGVkIGV2ZW50IHByZXZlbnRzIGRlZmF1bHQgdGhlbiB3ZSBkbyB0aGUgc2FtZSBvbiB0aGUgZG9ub3IuXHJcblx0XHR2YXIgZSA9IGpRdWVyeS5leHRlbmQoXHJcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoKSxcclxuXHRcdFx0ZXZlbnQsXHJcblx0XHRcdHsgdHlwZTogdHlwZSxcclxuXHRcdFx0XHRpc1NpbXVsYXRlZDogdHJ1ZSxcclxuXHRcdFx0XHRvcmlnaW5hbEV2ZW50OiB7fVxyXG5cdFx0XHR9XHJcblx0XHQpO1xyXG5cdFx0aWYgKCBidWJibGUgKSB7XHJcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBlLCBudWxsLCBlbGVtICk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRqUXVlcnkuZXZlbnQuZGlzcGF0Y2guY2FsbCggZWxlbSwgZSApO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCBlLmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xyXG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuXHJcbi8vIFNvbWUgcGx1Z2lucyBhcmUgdXNpbmcsIGJ1dCBpdCdzIHVuZG9jdW1lbnRlZC9kZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQuXHJcbi8vIFRoZSAxLjcgc3BlY2lhbCBldmVudCBpbnRlcmZhY2Ugc2hvdWxkIHByb3ZpZGUgYWxsIHRoZSBob29rcyBuZWVkZWQgbm93LlxyXG5qUXVlcnkuZXZlbnQuaGFuZGxlID0galF1ZXJ5LmV2ZW50LmRpc3BhdGNoO1xyXG5cclxualF1ZXJ5LnJlbW92ZUV2ZW50ID0gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciA/XHJcblx0ZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHtcclxuXHRcdGlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkge1xyXG5cdFx0XHRlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSwgZmFsc2UgKTtcclxuXHRcdH1cclxuXHR9IDpcclxuXHRmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkge1xyXG5cdFx0dmFyIG5hbWUgPSBcIm9uXCIgKyB0eXBlO1xyXG5cclxuXHRcdGlmICggZWxlbS5kZXRhY2hFdmVudCApIHtcclxuXHJcblx0XHRcdC8vICM4NTQ1LCAjNzA1NCwgcHJldmVudGluZyBtZW1vcnkgbGVha3MgZm9yIGN1c3RvbSBldmVudHMgaW4gSUU2LTgg4oCTXHJcblx0XHRcdC8vIGRldGFjaEV2ZW50IG5lZWRlZCBwcm9wZXJ0eSBvbiBlbGVtZW50LCBieSBuYW1lIG9mIHRoYXQgZXZlbnQsIHRvIHByb3Blcmx5IGV4cG9zZSBpdCB0byBHQ1xyXG5cdFx0XHRpZiAoIHR5cGVvZiBlbGVtWyBuYW1lIF0gPT09IFwidW5kZWZpbmVkXCIgKSB7XHJcblx0XHRcdFx0ZWxlbVsgbmFtZSBdID0gbnVsbDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZWxlbS5kZXRhY2hFdmVudCggbmFtZSwgaGFuZGxlICk7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcbmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkge1xyXG5cdC8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZFxyXG5cdGlmICggISh0aGlzIGluc3RhbmNlb2YgalF1ZXJ5LkV2ZW50KSApIHtcclxuXHRcdHJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7XHJcblx0fVxyXG5cclxuXHQvLyBFdmVudCBvYmplY3RcclxuXHRpZiAoIHNyYyAmJiBzcmMudHlwZSApIHtcclxuXHRcdHRoaXMub3JpZ2luYWxFdmVudCA9IHNyYztcclxuXHRcdHRoaXMudHlwZSA9IHNyYy50eXBlO1xyXG5cclxuXHRcdC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkXHJcblx0XHQvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cclxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gKCBzcmMuZGVmYXVsdFByZXZlbnRlZCB8fCBzcmMucmV0dXJuVmFsdWUgPT09IGZhbHNlIHx8XHJcblx0XHRcdHNyYy5nZXRQcmV2ZW50RGVmYXVsdCAmJiBzcmMuZ2V0UHJldmVudERlZmF1bHQoKSApID8gcmV0dXJuVHJ1ZSA6IHJldHVybkZhbHNlO1xyXG5cclxuXHQvLyBFdmVudCB0eXBlXHJcblx0fSBlbHNlIHtcclxuXHRcdHRoaXMudHlwZSA9IHNyYztcclxuXHR9XHJcblxyXG5cdC8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0XHJcblx0aWYgKCBwcm9wcyApIHtcclxuXHRcdGpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7XHJcblx0fVxyXG5cclxuXHQvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZVxyXG5cdHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgalF1ZXJ5Lm5vdygpO1xyXG5cclxuXHQvLyBNYXJrIGl0IGFzIGZpeGVkXHJcblx0dGhpc1sgalF1ZXJ5LmV4cGFuZG8gXSA9IHRydWU7XHJcbn07XHJcblxyXG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcclxuXHRyZXR1cm4gZmFsc2U7XHJcbn1cclxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcclxuXHRyZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nXHJcbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbFxyXG5qUXVlcnkuRXZlbnQucHJvdG90eXBlID0ge1xyXG5cdHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcclxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTtcclxuXHJcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcclxuXHRcdGlmICggIWUgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBpZiBwcmV2ZW50RGVmYXVsdCBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudFxyXG5cdFx0aWYgKCBlLnByZXZlbnREZWZhdWx0ICkge1xyXG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0Ly8gb3RoZXJ3aXNlIHNldCB0aGUgcmV0dXJuVmFsdWUgcHJvcGVydHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIGZhbHNlIChJRSlcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGUucmV0dXJuVmFsdWUgPSBmYWxzZTtcclxuXHRcdH1cclxuXHR9LFxyXG5cdHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XHJcblx0XHR0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcclxuXHJcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcclxuXHRcdGlmICggIWUgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdC8vIGlmIHN0b3BQcm9wYWdhdGlvbiBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudFxyXG5cdFx0aWYgKCBlLnN0b3BQcm9wYWdhdGlvbiApIHtcclxuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdH1cclxuXHRcdC8vIG90aGVyd2lzZSBzZXQgdGhlIGNhbmNlbEJ1YmJsZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gdHJ1ZSAoSUUpXHJcblx0XHRlLmNhbmNlbEJ1YmJsZSA9IHRydWU7XHJcblx0fSxcclxuXHRzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xyXG5cdFx0dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XHJcblx0XHR0aGlzLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdH0sXHJcblx0aXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSxcclxuXHRpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXHJcblx0aXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlXHJcbn07XHJcblxyXG4vLyBDcmVhdGUgbW91c2VlbnRlci9sZWF2ZSBldmVudHMgdXNpbmcgbW91c2VvdmVyL291dCBhbmQgZXZlbnQtdGltZSBjaGVja3NcclxualF1ZXJ5LmVhY2goe1xyXG5cdG1vdXNlZW50ZXI6IFwibW91c2VvdmVyXCIsXHJcblx0bW91c2VsZWF2ZTogXCJtb3VzZW91dFwiXHJcbn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XHJcblx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHtcclxuXHRcdGRlbGVnYXRlVHlwZTogZml4LFxyXG5cdFx0YmluZFR5cGU6IGZpeCxcclxuXHJcblx0XHRoYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHtcclxuXHRcdFx0dmFyIHJldCxcclxuXHRcdFx0XHR0YXJnZXQgPSB0aGlzLFxyXG5cdFx0XHRcdHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LFxyXG5cdFx0XHRcdGhhbmRsZU9iaiA9IGV2ZW50LmhhbmRsZU9iaixcclxuXHRcdFx0XHRzZWxlY3RvciA9IGhhbmRsZU9iai5zZWxlY3RvcjtcclxuXHJcblx0XHRcdC8vIEZvciBtb3VzZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC5cclxuXHRcdFx0Ly8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3dcclxuXHRcdFx0aWYgKCAhcmVsYXRlZCB8fCAocmVsYXRlZCAhPT0gdGFyZ2V0ICYmICFqUXVlcnkuY29udGFpbnMoIHRhcmdldCwgcmVsYXRlZCApKSApIHtcclxuXHRcdFx0XHRldmVudC50eXBlID0gaGFuZGxlT2JqLm9yaWdUeXBlO1xyXG5cdFx0XHRcdHJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcclxuXHRcdFx0XHRldmVudC50eXBlID0gZml4O1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiByZXQ7XHJcblx0XHR9XHJcblx0fTtcclxufSk7XHJcblxyXG4vLyBJRSBzdWJtaXQgZGVsZWdhdGlvblxyXG5pZiAoICFqUXVlcnkuc3VwcG9ydC5zdWJtaXRCdWJibGVzICkge1xyXG5cclxuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbC5zdWJtaXQgPSB7XHJcblx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdC8vIE9ubHkgbmVlZCB0aGlzIGZvciBkZWxlZ2F0ZWQgZm9ybSBzdWJtaXQgZXZlbnRzXHJcblx0XHRcdGlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCBcImZvcm1cIiApICkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gTGF6eS1hZGQgYSBzdWJtaXQgaGFuZGxlciB3aGVuIGEgZGVzY2VuZGFudCBmb3JtIG1heSBwb3RlbnRpYWxseSBiZSBzdWJtaXR0ZWRcclxuXHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgXCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXRcIiwgZnVuY3Rpb24oIGUgKSB7XHJcblx0XHRcdFx0Ly8gTm9kZSBuYW1lIGNoZWNrIGF2b2lkcyBhIFZNTC1yZWxhdGVkIGNyYXNoIGluIElFICgjOTgwNylcclxuXHRcdFx0XHR2YXIgZWxlbSA9IGUudGFyZ2V0LFxyXG5cdFx0XHRcdFx0Zm9ybSA9IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgfHwgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCBcImJ1dHRvblwiICkgPyBlbGVtLmZvcm0gOiB1bmRlZmluZWQ7XHJcblx0XHRcdFx0aWYgKCBmb3JtICYmICFqUXVlcnkuX2RhdGEoIGZvcm0sIFwiX3N1Ym1pdF9hdHRhY2hlZFwiICkgKSB7XHJcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCBmb3JtLCBcInN1Ym1pdC5fc3VibWl0XCIsIGZ1bmN0aW9uKCBldmVudCApIHtcclxuXHRcdFx0XHRcdFx0ZXZlbnQuX3N1Ym1pdF9idWJibGUgPSB0cnVlO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRqUXVlcnkuX2RhdGEoIGZvcm0sIFwiX3N1Ym1pdF9hdHRhY2hlZFwiLCB0cnVlICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0Ly8gcmV0dXJuIHVuZGVmaW5lZCBzaW5jZSB3ZSBkb24ndCBuZWVkIGFuIGV2ZW50IGxpc3RlbmVyXHJcblx0XHR9LFxyXG5cclxuXHRcdHBvc3REaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkge1xyXG5cdFx0XHQvLyBJZiBmb3JtIHdhcyBzdWJtaXR0ZWQgYnkgdGhlIHVzZXIsIGJ1YmJsZSB0aGUgZXZlbnQgdXAgdGhlIHRyZWVcclxuXHRcdFx0aWYgKCBldmVudC5fc3VibWl0X2J1YmJsZSApIHtcclxuXHRcdFx0XHRkZWxldGUgZXZlbnQuX3N1Ym1pdF9idWJibGU7XHJcblx0XHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgJiYgIWV2ZW50LmlzVHJpZ2dlciApIHtcclxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5zaW11bGF0ZSggXCJzdWJtaXRcIiwgdGhpcy5wYXJlbnROb2RlLCBldmVudCwgdHJ1ZSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHJcblx0XHR0ZWFyZG93bjogZnVuY3Rpb24oKSB7XHJcblx0XHRcdC8vIE9ubHkgbmVlZCB0aGlzIGZvciBkZWxlZ2F0ZWQgZm9ybSBzdWJtaXQgZXZlbnRzXHJcblx0XHRcdGlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCBcImZvcm1cIiApICkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gUmVtb3ZlIGRlbGVnYXRlZCBoYW5kbGVyczsgY2xlYW5EYXRhIGV2ZW50dWFsbHkgcmVhcHMgc3VibWl0IGhhbmRsZXJzIGF0dGFjaGVkIGFib3ZlXHJcblx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIFwiLl9zdWJtaXRcIiApO1xyXG5cdFx0fVxyXG5cdH07XHJcbn1cclxuXHJcbi8vIElFIGNoYW5nZSBkZWxlZ2F0aW9uIGFuZCBjaGVja2JveC9yYWRpbyBmaXhcclxuaWYgKCAhalF1ZXJ5LnN1cHBvcnQuY2hhbmdlQnViYmxlcyApIHtcclxuXHJcblx0alF1ZXJ5LmV2ZW50LnNwZWNpYWwuY2hhbmdlID0ge1xyXG5cclxuXHRcdHNldHVwOiBmdW5jdGlvbigpIHtcclxuXHJcblx0XHRcdGlmICggcmZvcm1FbGVtcy50ZXN0KCB0aGlzLm5vZGVOYW1lICkgKSB7XHJcblx0XHRcdFx0Ly8gSUUgZG9lc24ndCBmaXJlIGNoYW5nZSBvbiBhIGNoZWNrL3JhZGlvIHVudGlsIGJsdXI7IHRyaWdnZXIgaXQgb24gY2xpY2tcclxuXHRcdFx0XHQvLyBhZnRlciBhIHByb3BlcnR5Y2hhbmdlLiBFYXQgdGhlIGJsdXItY2hhbmdlIGluIHNwZWNpYWwuY2hhbmdlLmhhbmRsZS5cclxuXHRcdFx0XHQvLyBUaGlzIHN0aWxsIGZpcmVzIG9uY2hhbmdlIGEgc2Vjb25kIHRpbWUgZm9yIGNoZWNrL3JhZGlvIGFmdGVyIGJsdXIuXHJcblx0XHRcdFx0aWYgKCB0aGlzLnR5cGUgPT09IFwiY2hlY2tib3hcIiB8fCB0aGlzLnR5cGUgPT09IFwicmFkaW9cIiApIHtcclxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIFwicHJvcGVydHljaGFuZ2UuX2NoYW5nZVwiLCBmdW5jdGlvbiggZXZlbnQgKSB7XHJcblx0XHRcdFx0XHRcdGlmICggZXZlbnQub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUgPT09IFwiY2hlY2tlZFwiICkge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuX2p1c3RfY2hhbmdlZCA9IHRydWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgXCJjbGljay5fY2hhbmdlXCIsIGZ1bmN0aW9uKCBldmVudCApIHtcclxuXHRcdFx0XHRcdFx0aWYgKCB0aGlzLl9qdXN0X2NoYW5nZWQgJiYgIWV2ZW50LmlzVHJpZ2dlciApIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLl9qdXN0X2NoYW5nZWQgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHQvLyBBbGxvdyB0cmlnZ2VyZWQsIHNpbXVsYXRlZCBjaGFuZ2UgZXZlbnRzICgjMTE1MDApXHJcblx0XHRcdFx0XHRcdGpRdWVyeS5ldmVudC5zaW11bGF0ZSggXCJjaGFuZ2VcIiwgdGhpcywgZXZlbnQsIHRydWUgKTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gRGVsZWdhdGVkIGV2ZW50OyBsYXp5LWFkZCBhIGNoYW5nZSBoYW5kbGVyIG9uIGRlc2NlbmRhbnQgaW5wdXRzXHJcblx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIFwiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZVwiLCBmdW5jdGlvbiggZSApIHtcclxuXHRcdFx0XHR2YXIgZWxlbSA9IGUudGFyZ2V0O1xyXG5cclxuXHRcdFx0XHRpZiAoIHJmb3JtRWxlbXMudGVzdCggZWxlbS5ub2RlTmFtZSApICYmICFqUXVlcnkuX2RhdGEoIGVsZW0sIFwiX2NoYW5nZV9hdHRhY2hlZFwiICkgKSB7XHJcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCBlbGVtLCBcImNoYW5nZS5fY2hhbmdlXCIsIGZ1bmN0aW9uKCBldmVudCApIHtcclxuXHRcdFx0XHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgJiYgIWV2ZW50LmlzU2ltdWxhdGVkICYmICFldmVudC5pc1RyaWdnZXIgKSB7XHJcblx0XHRcdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBcImNoYW5nZVwiLCB0aGlzLnBhcmVudE5vZGUsIGV2ZW50LCB0cnVlICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0alF1ZXJ5Ll9kYXRhKCBlbGVtLCBcIl9jaGFuZ2VfYXR0YWNoZWRcIiwgdHJ1ZSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9LFxyXG5cclxuXHRcdGhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkge1xyXG5cdFx0XHR2YXIgZWxlbSA9IGV2ZW50LnRhcmdldDtcclxuXHJcblx0XHRcdC8vIFN3YWxsb3cgbmF0aXZlIGNoYW5nZSBldmVudHMgZnJvbSBjaGVja2JveC9yYWRpbywgd2UgYWxyZWFkeSB0cmlnZ2VyZWQgdGhlbSBhYm92ZVxyXG5cdFx0XHRpZiAoIHRoaXMgIT09IGVsZW0gfHwgZXZlbnQuaXNTaW11bGF0ZWQgfHwgZXZlbnQuaXNUcmlnZ2VyIHx8IChlbGVtLnR5cGUgIT09IFwicmFkaW9cIiAmJiBlbGVtLnR5cGUgIT09IFwiY2hlY2tib3hcIikgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGV2ZW50LmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHJcblx0XHR0ZWFyZG93bjogZnVuY3Rpb24oKSB7XHJcblx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIFwiLl9jaGFuZ2VcIiApO1xyXG5cclxuXHRcdFx0cmV0dXJuICFyZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKTtcclxuXHRcdH1cclxuXHR9O1xyXG59XHJcblxyXG4vLyBDcmVhdGUgXCJidWJibGluZ1wiIGZvY3VzIGFuZCBibHVyIGV2ZW50c1xyXG5pZiAoICFqUXVlcnkuc3VwcG9ydC5mb2N1c2luQnViYmxlcyApIHtcclxuXHRqUXVlcnkuZWFjaCh7IGZvY3VzOiBcImZvY3VzaW5cIiwgYmx1cjogXCJmb2N1c291dFwiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XHJcblxyXG5cdFx0Ly8gQXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dFxyXG5cdFx0dmFyIGF0dGFjaGVzID0gMCxcclxuXHRcdFx0aGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHtcclxuXHRcdFx0XHRqUXVlcnkuZXZlbnQuc2ltdWxhdGUoIGZpeCwgZXZlbnQudGFyZ2V0LCBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApLCB0cnVlICk7XHJcblx0XHRcdH07XHJcblxyXG5cdFx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0ge1xyXG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0aWYgKCBhdHRhY2hlcysrID09PSAwICkge1xyXG5cdFx0XHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHRcdFx0dGVhcmRvd246IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGlmICggLS1hdHRhY2hlcyA9PT0gMCApIHtcclxuXHRcdFx0XHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0fSk7XHJcbn1cclxuXHJcbmpRdWVyeS5mbi5leHRlbmQoe1xyXG5cclxuXHRvbjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIC8qSU5URVJOQUwqLyBvbmUgKSB7XHJcblx0XHR2YXIgb3JpZ0ZuLCB0eXBlO1xyXG5cclxuXHRcdC8vIFR5cGVzIGNhbiBiZSBhIG1hcCBvZiB0eXBlcy9oYW5kbGVyc1xyXG5cdFx0aWYgKCB0eXBlb2YgdHlwZXMgPT09IFwib2JqZWN0XCIgKSB7XHJcblx0XHRcdC8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApXHJcblx0XHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkgeyAvLyAmJiBzZWxlY3RvciAhPSBudWxsXHJcblx0XHRcdFx0Ly8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKVxyXG5cdFx0XHRcdGRhdGEgPSBkYXRhIHx8IHNlbGVjdG9yO1xyXG5cdFx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XHJcblx0XHRcdFx0dGhpcy5vbiggdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7XHJcblx0XHRcdC8vICggdHlwZXMsIGZuIClcclxuXHRcdFx0Zm4gPSBzZWxlY3RvcjtcclxuXHRcdFx0ZGF0YSA9IHNlbGVjdG9yID0gdW5kZWZpbmVkO1xyXG5cdFx0fSBlbHNlIGlmICggZm4gPT0gbnVsbCApIHtcclxuXHRcdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XHJcblx0XHRcdFx0Ly8gKCB0eXBlcywgc2VsZWN0b3IsIGZuIClcclxuXHRcdFx0XHRmbiA9IGRhdGE7XHJcblx0XHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyAoIHR5cGVzLCBkYXRhLCBmbiApXHJcblx0XHRcdFx0Zm4gPSBkYXRhO1xyXG5cdFx0XHRcdGRhdGEgPSBzZWxlY3RvcjtcclxuXHRcdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XHJcblx0XHRcdGZuID0gcmV0dXJuRmFsc2U7XHJcblx0XHR9IGVsc2UgaWYgKCAhZm4gKSB7XHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb25lID09PSAxICkge1xyXG5cdFx0XHRvcmlnRm4gPSBmbjtcclxuXHRcdFx0Zm4gPSBmdW5jdGlvbiggZXZlbnQgKSB7XHJcblx0XHRcdFx0Ly8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvXHJcblx0XHRcdFx0alF1ZXJ5KCkub2ZmKCBldmVudCApO1xyXG5cdFx0XHRcdHJldHVybiBvcmlnRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xyXG5cdFx0XHR9O1xyXG5cdFx0XHQvLyBVc2Ugc2FtZSBndWlkIHNvIGNhbGxlciBjYW4gcmVtb3ZlIHVzaW5nIG9yaWdGblxyXG5cdFx0XHRmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7XHJcblx0XHR9KTtcclxuXHR9LFxyXG5cdG9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgMSApO1xyXG5cdH0sXHJcblx0b2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHtcclxuXHRcdHZhciBoYW5kbGVPYmosIHR5cGU7XHJcblx0XHRpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZlbnREZWZhdWx0ICYmIHR5cGVzLmhhbmRsZU9iaiApIHtcclxuXHRcdFx0Ly8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudFxyXG5cdFx0XHRoYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7XHJcblx0XHRcdGpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoXHJcblx0XHRcdFx0aGFuZGxlT2JqLm5hbWVzcGFjZSA/IGhhbmRsZU9iai5vcmlnVHlwZSArIFwiLlwiICsgaGFuZGxlT2JqLm5hbWVzcGFjZSA6IGhhbmRsZU9iai5vcmlnVHlwZSxcclxuXHRcdFx0XHRoYW5kbGVPYmouc2VsZWN0b3IsXHJcblx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXJcclxuXHRcdFx0KTtcclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblx0XHR9XHJcblx0XHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcclxuXHRcdFx0Ly8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdIClcclxuXHRcdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcclxuXHRcdFx0XHR0aGlzLm9mZiggdHlwZSwgc2VsZWN0b3IsIHR5cGVzWyB0eXBlIF0gKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdH1cclxuXHRcdGlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICkge1xyXG5cdFx0XHQvLyAoIHR5cGVzIFssIGZuXSApXHJcblx0XHRcdGZuID0gc2VsZWN0b3I7XHJcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XHJcblx0XHRcdGZuID0gcmV0dXJuRmFsc2U7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7XHJcblx0XHR9KTtcclxuXHR9LFxyXG5cclxuXHRiaW5kOiBmdW5jdGlvbiggdHlwZXMsIGRhdGEsIGZuICkge1xyXG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApO1xyXG5cdH0sXHJcblx0dW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkge1xyXG5cdFx0cmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTtcclxuXHR9LFxyXG5cclxuXHRsaXZlOiBmdW5jdGlvbiggdHlwZXMsIGRhdGEsIGZuICkge1xyXG5cdFx0alF1ZXJ5KCB0aGlzLmNvbnRleHQgKS5vbiggdHlwZXMsIHRoaXMuc2VsZWN0b3IsIGRhdGEsIGZuICk7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cdGRpZTogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHtcclxuXHRcdGpRdWVyeSggdGhpcy5jb250ZXh0ICkub2ZmKCB0eXBlcywgdGhpcy5zZWxlY3RvciB8fCBcIioqXCIsIGZuICk7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cclxuXHRkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xyXG5cdH0sXHJcblx0dW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7XHJcblx0XHQvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApXHJcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PSAxPyB0aGlzLm9mZiggc2VsZWN0b3IsIFwiKipcIiApIDogdGhpcy5vZmYoIHR5cGVzLCBzZWxlY3RvciB8fCBcIioqXCIsIGZuICk7XHJcblx0fSxcclxuXHJcblx0dHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApO1xyXG5cdFx0fSk7XHJcblx0fSxcclxuXHR0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XHJcblx0XHRpZiAoIHRoaXNbMF0gKSB7XHJcblx0XHRcdHJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpc1swXSwgdHJ1ZSApO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdHRvZ2dsZTogZnVuY3Rpb24oIGZuICkge1xyXG5cdFx0Ly8gU2F2ZSByZWZlcmVuY2UgdG8gYXJndW1lbnRzIGZvciBhY2Nlc3MgaW4gY2xvc3VyZVxyXG5cdFx0dmFyIGFyZ3MgPSBhcmd1bWVudHMsXHJcblx0XHRcdGd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKyssXHJcblx0XHRcdGkgPSAwLFxyXG5cdFx0XHR0b2dnbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkge1xyXG5cdFx0XHRcdC8vIEZpZ3VyZSBvdXQgd2hpY2ggZnVuY3Rpb24gdG8gZXhlY3V0ZVxyXG5cdFx0XHRcdHZhciBsYXN0VG9nZ2xlID0gKCBqUXVlcnkuX2RhdGEoIHRoaXMsIFwibGFzdFRvZ2dsZVwiICsgZm4uZ3VpZCApIHx8IDAgKSAlIGk7XHJcblx0XHRcdFx0alF1ZXJ5Ll9kYXRhKCB0aGlzLCBcImxhc3RUb2dnbGVcIiArIGZuLmd1aWQsIGxhc3RUb2dnbGUgKyAxICk7XHJcblxyXG5cdFx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IGNsaWNrcyBzdG9wXHJcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdFx0Ly8gYW5kIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uXHJcblx0XHRcdFx0cmV0dXJuIGFyZ3NbIGxhc3RUb2dnbGUgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgfHwgZmFsc2U7XHJcblx0XHRcdH07XHJcblxyXG5cdFx0Ly8gbGluayBhbGwgdGhlIGZ1bmN0aW9ucywgc28gYW55IG9mIHRoZW0gY2FuIHVuYmluZCB0aGlzIGNsaWNrIGhhbmRsZXJcclxuXHRcdHRvZ2dsZXIuZ3VpZCA9IGd1aWQ7XHJcblx0XHR3aGlsZSAoIGkgPCBhcmdzLmxlbmd0aCApIHtcclxuXHRcdFx0YXJnc1sgaSsrIF0uZ3VpZCA9IGd1aWQ7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY2xpY2soIHRvZ2dsZXIgKTtcclxuXHR9LFxyXG5cclxuXHRob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTtcclxuXHR9XHJcbn0pO1xyXG5cclxualF1ZXJ5LmVhY2goIChcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIFwiICtcclxuXHRcIm1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIFwiICtcclxuXHRcImNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnVcIikuc3BsaXQoXCIgXCIpLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcclxuXHJcblx0Ly8gSGFuZGxlIGV2ZW50IGJpbmRpbmdcclxuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBkYXRhLCBmbiApIHtcclxuXHRcdGlmICggZm4gPT0gbnVsbCApIHtcclxuXHRcdFx0Zm4gPSBkYXRhO1xyXG5cdFx0XHRkYXRhID0gbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDAgP1xyXG5cdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcclxuXHRcdFx0dGhpcy50cmlnZ2VyKCBuYW1lICk7XHJcblx0fTtcclxuXHJcblx0aWYgKCBya2V5RXZlbnQudGVzdCggbmFtZSApICkge1xyXG5cdFx0alF1ZXJ5LmV2ZW50LmZpeEhvb2tzWyBuYW1lIF0gPSBqUXVlcnkuZXZlbnQua2V5SG9va3M7XHJcblx0fVxyXG5cclxuXHRpZiAoIHJtb3VzZUV2ZW50LnRlc3QoIG5hbWUgKSApIHtcclxuXHRcdGpRdWVyeS5ldmVudC5maXhIb29rc1sgbmFtZSBdID0galF1ZXJ5LmV2ZW50Lm1vdXNlSG9va3M7XHJcblx0fVxyXG59KTtcclxuLyohXHJcbiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lXHJcbiAqICBDb3B5cmlnaHQgMjAxMiBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXHJcbiAqICBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcclxuICogIGh0dHA6Ly9zaXp6bGVqcy5jb20vXHJcbiAqL1xyXG4oZnVuY3Rpb24oIHdpbmRvdywgdW5kZWZpbmVkICkge1xyXG5cclxudmFyIGRpcnJ1bnMsXHJcblx0Y2FjaGVkcnVucyxcclxuXHRhc3NlcnRHZXRJZE5vdE5hbWUsXHJcblx0RXhwcixcclxuXHRnZXRUZXh0LFxyXG5cdGlzWE1MLFxyXG5cdGNvbnRhaW5zLFxyXG5cdGNvbXBpbGUsXHJcblx0c29ydE9yZGVyLFxyXG5cdGhhc0R1cGxpY2F0ZSxcclxuXHJcblx0YmFzZUhhc0R1cGxpY2F0ZSA9IHRydWUsXHJcblx0c3RydW5kZWZpbmVkID0gXCJ1bmRlZmluZWRcIixcclxuXHJcblx0ZXhwYW5kbyA9ICggXCJzaXpjYWNoZVwiICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIFwiLlwiLCBcIlwiICksXHJcblxyXG5cdGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50LFxyXG5cdGRvY0VsZW0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXHJcblx0ZG9uZSA9IDAsXHJcblx0c2xpY2UgPSBbXS5zbGljZSxcclxuXHRwdXNoID0gW10ucHVzaCxcclxuXHJcblx0Ly8gQXVnbWVudCBhIGZ1bmN0aW9uIGZvciBzcGVjaWFsIHVzZSBieSBTaXp6bGVcclxuXHRtYXJrRnVuY3Rpb24gPSBmdW5jdGlvbiggZm4sIHZhbHVlICkge1xyXG5cdFx0Zm5bIGV4cGFuZG8gXSA9IHZhbHVlIHx8IHRydWU7XHJcblx0XHRyZXR1cm4gZm47XHJcblx0fSxcclxuXHJcblx0Y3JlYXRlQ2FjaGUgPSBmdW5jdGlvbigpIHtcclxuXHRcdHZhciBjYWNoZSA9IHt9LFxyXG5cdFx0XHRrZXlzID0gW107XHJcblxyXG5cdFx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcclxuXHRcdFx0Ly8gT25seSBrZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRyaWVzXHJcblx0XHRcdGlmICgga2V5cy5wdXNoKCBrZXkgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7XHJcblx0XHRcdFx0ZGVsZXRlIGNhY2hlWyBrZXlzLnNoaWZ0KCkgXTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIChjYWNoZVsga2V5IF0gPSB2YWx1ZSk7XHJcblx0XHR9LCBjYWNoZSApO1xyXG5cdH0sXHJcblxyXG5cdGNsYXNzQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxyXG5cdHRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxyXG5cdGNvbXBpbGVyQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxyXG5cclxuXHQvLyBSZWdleFxyXG5cclxuXHQvLyBXaGl0ZXNwYWNlIGNoYXJhY3RlcnMgaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI3doaXRlc3BhY2VcclxuXHR3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFxyXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc3ludGF4LyNjaGFyYWN0ZXJzXHJcblx0Y2hhcmFjdGVyRW5jb2RpbmcgPSBcIig/OlxcXFxcXFxcLnxbLVxcXFx3XXxbXlxcXFx4MDAtXFxcXHhhMF0pK1wiLFxyXG5cclxuXHQvLyBMb29zZWx5IG1vZGVsZWQgb24gQ1NTIGlkZW50aWZpZXIgY2hhcmFjdGVyc1xyXG5cdC8vIEFuIHVucXVvdGVkIHZhbHVlIHNob3VsZCBiZSBhIENTUyBpZGVudGlmaWVyIChodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9ycylcclxuXHQvLyBQcm9wZXIgc3ludGF4OiBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjdmFsdWUtZGVmLWlkZW50aWZpZXJcclxuXHRpZGVudGlmaWVyID0gY2hhcmFjdGVyRW5jb2RpbmcucmVwbGFjZSggXCJ3XCIsIFwidyNcIiApLFxyXG5cclxuXHQvLyBBY2NlcHRhYmxlIG9wZXJhdG9ycyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxlY3RvcnNcclxuXHRvcGVyYXRvcnMgPSBcIihbKl4kfCF+XT89KVwiLFxyXG5cdGF0dHJpYnV0ZXMgPSBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKFwiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyBcIilcIiArIHdoaXRlc3BhY2UgK1xyXG5cdFx0XCIqKD86XCIgKyBvcGVyYXRvcnMgKyB3aGl0ZXNwYWNlICsgXCIqKD86KFsnXFxcIl0pKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXSkqPylcXFxcM3woXCIgKyBpZGVudGlmaWVyICsgXCIpfCl8KVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsXHJcblxyXG5cdC8vIFByZWZlciBhcmd1bWVudHMgbm90IGluIHBhcmVucy9icmFja2V0cyxcclxuXHQvLyAgIHRoZW4gYXR0cmlidXRlIHNlbGVjdG9ycyBhbmQgbm9uLXBzZXVkb3MgKGRlbm90ZWQgYnkgOiksXHJcblx0Ly8gICB0aGVuIGFueXRoaW5nIGVsc2VcclxuXHQvLyBUaGVzZSBwcmVmZXJlbmNlcyBhcmUgaGVyZSB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBzZWxlY3RvcnNcclxuXHQvLyAgIG5lZWRpbmcgdG9rZW5pemUgaW4gdGhlIFBTRVVETyBwcmVGaWx0ZXJcclxuXHRwc2V1ZG9zID0gXCI6KFwiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyBcIikoPzpcXFxcKCg/OihbJ1xcXCJdKSgoPzpcXFxcXFxcXC58W15cXFxcXFxcXF0pKj8pXFxcXDJ8KFteKClbXFxcXF1dKnwoPzooPzpcIiArIGF0dHJpYnV0ZXMgKyBcIil8W146XXxcXFxcXFxcXC4pKnwuKikpXFxcXCl8KVwiLFxyXG5cclxuXHQvLyBGb3IgbWF0Y2hFeHByLlBPUyBhbmQgbWF0Y2hFeHByLm5lZWRzQ29udGV4dFxyXG5cdHBvcyA9IFwiOihudGh8ZXF8Z3R8bHR8Zmlyc3R8bGFzdHxldmVufG9kZCkoPzpcXFxcKCgoPzotXFxcXGQpP1xcXFxkKilcXFxcKXwpKD89W14tXXwkKVwiLFxyXG5cclxuXHQvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyXHJcblx0cnRyaW0gPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIit8KCg/Ol58W15cXFxcXFxcXF0pKD86XFxcXFxcXFwuKSopXCIgKyB3aGl0ZXNwYWNlICsgXCIrJFwiLCBcImdcIiApLFxyXG5cclxuXHRyY29tbWEgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIiosXCIgKyB3aGl0ZXNwYWNlICsgXCIqXCIgKSxcclxuXHRyY29tYmluYXRvcnMgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIiooW1xcXFx4MjBcXFxcdFxcXFxyXFxcXG5cXFxcZj4rfl0pXCIgKyB3aGl0ZXNwYWNlICsgXCIqXCIgKSxcclxuXHRycHNldWRvID0gbmV3IFJlZ0V4cCggcHNldWRvcyApLFxyXG5cclxuXHQvLyBFYXNpbHktcGFyc2VhYmxlL3JldHJpZXZhYmxlIElEIG9yIFRBRyBvciBDTEFTUyBzZWxlY3RvcnNcclxuXHRycXVpY2tFeHByID0gL14oPzojKFtcXHdcXC1dKyl8KFxcdyspfFxcLihbXFx3XFwtXSspKSQvLFxyXG5cclxuXHRybm90ID0gL146bm90LyxcclxuXHRyc2libGluZyA9IC9bXFx4MjBcXHRcXHJcXG5cXGZdKlsrfl0vLFxyXG5cdHJlbmRzV2l0aE5vdCA9IC86bm90XFwoJC8sXHJcblxyXG5cdHJoZWFkZXIgPSAvaFxcZC9pLFxyXG5cdHJpbnB1dHMgPSAvaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLFxyXG5cclxuXHRyYmFja3NsYXNoID0gL1xcXFwoPyFcXFxcKS9nLFxyXG5cclxuXHRtYXRjaEV4cHIgPSB7XHJcblx0XHRcIklEXCI6IG5ldyBSZWdFeHAoIFwiXiMoXCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArIFwiKVwiICksXHJcblx0XHRcIkNMQVNTXCI6IG5ldyBSZWdFeHAoIFwiXlxcXFwuKFwiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyBcIilcIiApLFxyXG5cdFx0XCJOQU1FXCI6IG5ldyBSZWdFeHAoIFwiXlxcXFxbbmFtZT1bJ1xcXCJdPyhcIiArIGNoYXJhY3RlckVuY29kaW5nICsgXCIpWydcXFwiXT9cXFxcXVwiICksXHJcblx0XHRcIlRBR1wiOiBuZXcgUmVnRXhwKCBcIl4oXCIgKyBjaGFyYWN0ZXJFbmNvZGluZy5yZXBsYWNlKCBcIndcIiwgXCJ3KlwiICkgKyBcIilcIiApLFxyXG5cdFx0XCJBVFRSXCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgYXR0cmlidXRlcyApLFxyXG5cdFx0XCJQU0VVRE9cIjogbmV3IFJlZ0V4cCggXCJeXCIgKyBwc2V1ZG9zICksXHJcblx0XHRcIkNISUxEXCI6IG5ldyBSZWdFeHAoIFwiXjoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcXFxcKFwiICsgd2hpdGVzcGFjZSArXHJcblx0XHRcdFwiKihldmVufG9kZHwoKFsrLV18KShcXFxcZCopbnwpXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86KFsrLV18KVwiICsgd2hpdGVzcGFjZSArXHJcblx0XHRcdFwiKihcXFxcZCspfCkpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KVwiLCBcImlcIiApLFxyXG5cdFx0XCJQT1NcIjogbmV3IFJlZ0V4cCggcG9zLCBcImlnXCIgKSxcclxuXHRcdC8vIEZvciB1c2UgaW4gbGlicmFyaWVzIGltcGxlbWVudGluZyAuaXMoKVxyXG5cdFx0XCJuZWVkc0NvbnRleHRcIjogbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqWz4rfl18XCIgKyBwb3MsIFwiaVwiIClcclxuXHR9LFxyXG5cclxuXHQvLyBTdXBwb3J0XHJcblxyXG5cdC8vIFVzZWQgZm9yIHRlc3Rpbmcgc29tZXRoaW5nIG9uIGFuIGVsZW1lbnRcclxuXHRhc3NlcnQgPSBmdW5jdGlvbiggZm4gKSB7XHJcblx0XHR2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcblx0XHR0cnkge1xyXG5cdFx0XHRyZXR1cm4gZm4oIGRpdiApO1xyXG5cdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9IGZpbmFsbHkge1xyXG5cdFx0XHQvLyByZWxlYXNlIG1lbW9yeSBpbiBJRVxyXG5cdFx0XHRkaXYgPSBudWxsO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSByZXR1cm5zIG9ubHkgZWxlbWVudHNcclxuXHRhc3NlcnRUYWdOYW1lTm9Db21tZW50cyA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xyXG5cdFx0ZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KFwiXCIpICk7XHJcblx0XHRyZXR1cm4gIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikubGVuZ3RoO1xyXG5cdH0pLFxyXG5cclxuXHQvLyBDaGVjayBpZiBnZXRBdHRyaWJ1dGUgcmV0dXJucyBub3JtYWxpemVkIGhyZWYgYXR0cmlidXRlc1xyXG5cdGFzc2VydEhyZWZOb3ROb3JtYWxpemVkID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XHJcblx0XHRkaXYuaW5uZXJIVE1MID0gXCI8YSBocmVmPScjJz48L2E+XCI7XHJcblx0XHRyZXR1cm4gZGl2LmZpcnN0Q2hpbGQgJiYgdHlwZW9mIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSAhPT0gc3RydW5kZWZpbmVkICYmXHJcblx0XHRcdGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZShcImhyZWZcIikgPT09IFwiI1wiO1xyXG5cdH0pLFxyXG5cclxuXHQvLyBDaGVjayBpZiBhdHRyaWJ1dGVzIHNob3VsZCBiZSByZXRyaWV2ZWQgYnkgYXR0cmlidXRlIG5vZGVzXHJcblx0YXNzZXJ0QXR0cmlidXRlcyA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xyXG5cdFx0ZGl2LmlubmVySFRNTCA9IFwiPHNlbGVjdD48L3NlbGVjdD5cIjtcclxuXHRcdHZhciB0eXBlID0gdHlwZW9mIGRpdi5sYXN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwibXVsdGlwbGVcIik7XHJcblx0XHQvLyBJRTggcmV0dXJucyBhIHN0cmluZyBmb3Igc29tZSBhdHRyaWJ1dGVzIGV2ZW4gd2hlbiBub3QgcHJlc2VudFxyXG5cdFx0cmV0dXJuIHR5cGUgIT09IFwiYm9vbGVhblwiICYmIHR5cGUgIT09IFwic3RyaW5nXCI7XHJcblx0fSksXHJcblxyXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlDbGFzc05hbWUgY2FuIGJlIHRydXN0ZWRcclxuXHRhc3NlcnRVc2FibGVDbGFzc05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcclxuXHRcdC8vIE9wZXJhIGNhbid0IGZpbmQgYSBzZWNvbmQgY2xhc3NuYW1lIChpbiA5LjYpXHJcblx0XHRkaXYuaW5uZXJIVE1MID0gXCI8ZGl2IGNsYXNzPSdoaWRkZW4gZSc+PC9kaXY+PGRpdiBjbGFzcz0naGlkZGVuJz48L2Rpdj5cIjtcclxuXHRcdGlmICggIWRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIHx8ICFkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImVcIikubGVuZ3RoICkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gU2FmYXJpIDMuMiBjYWNoZXMgY2xhc3MgYXR0cmlidXRlcyBhbmQgZG9lc24ndCBjYXRjaCBjaGFuZ2VzXHJcblx0XHRkaXYubGFzdENoaWxkLmNsYXNzTmFtZSA9IFwiZVwiO1xyXG5cdFx0cmV0dXJuIGRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiZVwiKS5sZW5ndGggPT09IDI7XHJcblx0fSksXHJcblxyXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRCeUlkIHJldHVybnMgZWxlbWVudHMgYnkgbmFtZVxyXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlOYW1lIHByaXZpbGVnZXMgZm9ybSBjb250cm9scyBvciByZXR1cm5zIGVsZW1lbnRzIGJ5IElEXHJcblx0YXNzZXJ0VXNhYmxlTmFtZSA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xyXG5cdFx0Ly8gSW5qZWN0IGNvbnRlbnRcclxuXHRcdGRpdi5pZCA9IGV4cGFuZG8gKyAwO1xyXG5cdFx0ZGl2LmlubmVySFRNTCA9IFwiPGEgbmFtZT0nXCIgKyBleHBhbmRvICsgXCInPjwvYT48ZGl2IG5hbWU9J1wiICsgZXhwYW5kbyArIFwiJz48L2Rpdj5cIjtcclxuXHRcdGRvY0VsZW0uaW5zZXJ0QmVmb3JlKCBkaXYsIGRvY0VsZW0uZmlyc3RDaGlsZCApO1xyXG5cclxuXHRcdC8vIFRlc3RcclxuXHRcdHZhciBwYXNzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUgJiZcclxuXHRcdFx0Ly8gYnVnZ3kgYnJvd3NlcnMgd2lsbCByZXR1cm4gZmV3ZXIgdGhhbiB0aGUgY29ycmVjdCAyXHJcblx0XHRcdGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoID09PSAyICtcclxuXHRcdFx0Ly8gYnVnZ3kgYnJvd3NlcnMgd2lsbCByZXR1cm4gbW9yZSB0aGFuIHRoZSBjb3JyZWN0IDBcclxuXHRcdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIGV4cGFuZG8gKyAwICkubGVuZ3RoO1xyXG5cdFx0YXNzZXJ0R2V0SWROb3ROYW1lID0gIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBleHBhbmRvICk7XHJcblxyXG5cdFx0Ly8gQ2xlYW51cFxyXG5cdFx0ZG9jRWxlbS5yZW1vdmVDaGlsZCggZGl2ICk7XHJcblxyXG5cdFx0cmV0dXJuIHBhc3M7XHJcblx0fSk7XHJcblxyXG4vLyBJZiBzbGljZSBpcyBub3QgYXZhaWxhYmxlLCBwcm92aWRlIGEgYmFja3VwXHJcbnRyeSB7XHJcblx0c2xpY2UuY2FsbCggZG9jRWxlbS5jaGlsZE5vZGVzLCAwIClbMF0ubm9kZVR5cGU7XHJcbn0gY2F0Y2ggKCBlICkge1xyXG5cdHNsaWNlID0gZnVuY3Rpb24oIGkgKSB7XHJcblx0XHR2YXIgZWxlbSwgcmVzdWx0cyA9IFtdO1xyXG5cdFx0Zm9yICggOyAoZWxlbSA9IHRoaXNbaV0pOyBpKysgKSB7XHJcblx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJlc3VsdHM7XHJcblx0fTtcclxufVxyXG5cclxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcclxuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcclxuXHRjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDtcclxuXHR2YXIgbWF0Y2gsIGVsZW0sIHhtbCwgbSxcclxuXHRcdG5vZGVUeXBlID0gY29udGV4dC5ub2RlVHlwZTtcclxuXHJcblx0aWYgKCBub2RlVHlwZSAhPT0gMSAmJiBub2RlVHlwZSAhPT0gOSApIHtcclxuXHRcdHJldHVybiBbXTtcclxuXHR9XHJcblxyXG5cdGlmICggIXNlbGVjdG9yIHx8IHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdHJldHVybiByZXN1bHRzO1xyXG5cdH1cclxuXHJcblx0eG1sID0gaXNYTUwoIGNvbnRleHQgKTtcclxuXHJcblx0aWYgKCAheG1sICYmICFzZWVkICkge1xyXG5cdFx0aWYgKCAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICkge1xyXG5cdFx0XHQvLyBTcGVlZC11cDogU2l6emxlKFwiI0lEXCIpXHJcblx0XHRcdGlmICggKG0gPSBtYXRjaFsxXSkgKSB7XHJcblx0XHRcdFx0aWYgKCBub2RlVHlwZSA9PT0gOSApIHtcclxuXHRcdFx0XHRcdGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICk7XHJcblx0XHRcdFx0XHQvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJuc1xyXG5cdFx0XHRcdFx0Ly8gbm9kZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAjNjk2M1xyXG5cdFx0XHRcdFx0aWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHtcclxuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFLCBPcGVyYSwgYW5kIFdlYmtpdCByZXR1cm4gaXRlbXNcclxuXHRcdFx0XHRcdFx0Ly8gYnkgbmFtZSBpbnN0ZWFkIG9mIElEXHJcblx0XHRcdFx0XHRcdGlmICggZWxlbS5pZCA9PT0gbSApIHtcclxuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8vIENvbnRleHQgaXMgbm90IGEgZG9jdW1lbnRcclxuXHRcdFx0XHRcdGlmICggY29udGV4dC5vd25lckRvY3VtZW50ICYmIChlbGVtID0gY29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtICkpICYmXHJcblx0XHRcdFx0XHRcdGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiYgZWxlbS5pZCA9PT0gbSApIHtcclxuXHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XHJcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFNwZWVkLXVwOiBTaXp6bGUoXCJUQUdcIilcclxuXHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7XHJcblx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgc2xpY2UuY2FsbChjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBzZWxlY3RvciApLCAwKSApO1xyXG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xyXG5cclxuXHRcdFx0Ly8gU3BlZWQtdXA6IFNpenpsZShcIi5DTEFTU1wiKVxyXG5cdFx0XHR9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBhc3NlcnRVc2FibGVDbGFzc05hbWUgJiYgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICkge1xyXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNsaWNlLmNhbGwoY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBtICksIDApICk7XHJcblx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIEFsbCBvdGhlcnNcclxuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCwgeG1sICk7XHJcbn1cclxuXHJcblNpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkge1xyXG5cdHJldHVybiBTaXp6bGUoIGV4cHIsIG51bGwsIG51bGwsIGVsZW1lbnRzICk7XHJcbn07XHJcblxyXG5TaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIGVsZW0sIGV4cHIgKSB7XHJcblx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xyXG59O1xyXG5cclxuLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlc1xyXG5mdW5jdGlvbiBjcmVhdGVJbnB1dFBzZXVkbyggdHlwZSApIHtcclxuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcclxuXHRcdHJldHVybiBuYW1lID09PSBcImlucHV0XCIgJiYgZWxlbS50eXBlID09PSB0eXBlO1xyXG5cdH07XHJcbn1cclxuXHJcbi8vIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9uc1xyXG5mdW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7XHJcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRyZXR1cm4gKG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcImJ1dHRvblwiKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XHJcblx0fTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzXHJcbiAqIEBwYXJhbSB7QXJyYXl8RWxlbWVudH0gZWxlbVxyXG4gKi9cclxuZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0dmFyIG5vZGUsXHJcblx0XHRyZXQgPSBcIlwiLFxyXG5cdFx0aSA9IDAsXHJcblx0XHRub2RlVHlwZSA9IGVsZW0ubm9kZVR5cGU7XHJcblxyXG5cdGlmICggbm9kZVR5cGUgKSB7XHJcblx0XHRpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHtcclxuXHRcdFx0Ly8gVXNlIHRleHRDb250ZW50IGZvciBlbGVtZW50c1xyXG5cdFx0XHQvLyBpbm5lclRleHQgdXNhZ2UgcmVtb3ZlZCBmb3IgY29uc2lzdGVuY3kgb2YgbmV3IGxpbmVzIChzZWUgIzExMTUzKVxyXG5cdFx0XHRpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSBcInN0cmluZ1wiICkge1xyXG5cdFx0XHRcdHJldHVybiBlbGVtLnRleHRDb250ZW50O1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlblxyXG5cdFx0XHRcdGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkge1xyXG5cdFx0XHRcdFx0cmV0ICs9IGdldFRleHQoIGVsZW0gKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkge1xyXG5cdFx0XHRyZXR1cm4gZWxlbS5ub2RlVmFsdWU7XHJcblx0XHR9XHJcblx0XHQvLyBEbyBub3QgaW5jbHVkZSBjb21tZW50IG9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbm9kZXNcclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdC8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5XHJcblx0XHRmb3IgKCA7IChub2RlID0gZWxlbVtpXSk7IGkrKyApIHtcclxuXHRcdFx0Ly8gRG8gbm90IHRyYXZlcnNlIGNvbW1lbnQgbm9kZXNcclxuXHRcdFx0cmV0ICs9IGdldFRleHQoIG5vZGUgKTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIHJldDtcclxufTtcclxuXHJcbmlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24gaXNYTUwoIGVsZW0gKSB7XHJcblx0Ly8gZG9jdW1lbnRFbGVtZW50IGlzIHZlcmlmaWVkIGZvciBjYXNlcyB3aGVyZSBpdCBkb2Vzbid0IHlldCBleGlzdFxyXG5cdC8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKVxyXG5cdHZhciBkb2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSkuZG9jdW1lbnRFbGVtZW50O1xyXG5cdHJldHVybiBkb2N1bWVudEVsZW1lbnQgPyBkb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgIT09IFwiSFRNTFwiIDogZmFsc2U7XHJcbn07XHJcblxyXG4vLyBFbGVtZW50IGNvbnRhaW5zIGFub3RoZXJcclxuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnMgPSBkb2NFbGVtLmNvbnRhaW5zID9cclxuXHRmdW5jdGlvbiggYSwgYiApIHtcclxuXHRcdHZhciBhZG93biA9IGEubm9kZVR5cGUgPT09IDkgPyBhLmRvY3VtZW50RWxlbWVudCA6IGEsXHJcblx0XHRcdGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlO1xyXG5cdFx0cmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAmJiBhZG93bi5jb250YWlucyAmJiBhZG93bi5jb250YWlucyhidXApICk7XHJcblx0fSA6XHJcblx0ZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/XHJcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XHJcblx0XHRyZXR1cm4gYiAmJiAhISggYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApICYgMTYgKTtcclxuXHR9IDpcclxuXHRmdW5jdGlvbiggYSwgYiApIHtcclxuXHRcdHdoaWxlICggKGIgPSBiLnBhcmVudE5vZGUpICkge1xyXG5cdFx0XHRpZiAoIGIgPT09IGEgKSB7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHR9O1xyXG5cclxuU2l6emxlLmF0dHIgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcclxuXHR2YXIgYXR0cixcclxuXHRcdHhtbCA9IGlzWE1MKCBlbGVtICk7XHJcblxyXG5cdGlmICggIXhtbCApIHtcclxuXHRcdG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XHJcblx0fVxyXG5cdGlmICggRXhwci5hdHRySGFuZGxlWyBuYW1lIF0gKSB7XHJcblx0XHRyZXR1cm4gRXhwci5hdHRySGFuZGxlWyBuYW1lIF0oIGVsZW0gKTtcclxuXHR9XHJcblx0aWYgKCBhc3NlcnRBdHRyaWJ1dGVzIHx8IHhtbCApIHtcclxuXHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApO1xyXG5cdH1cclxuXHRhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICk7XHJcblx0cmV0dXJuIGF0dHIgP1xyXG5cdFx0dHlwZW9mIGVsZW1bIG5hbWUgXSA9PT0gXCJib29sZWFuXCIgP1xyXG5cdFx0XHRlbGVtWyBuYW1lIF0gPyBuYW1lIDogbnVsbCA6XHJcblx0XHRcdGF0dHIuc3BlY2lmaWVkID8gYXR0ci52YWx1ZSA6IG51bGwgOlxyXG5cdFx0bnVsbDtcclxufTtcclxuXHJcbkV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0ge1xyXG5cclxuXHQvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXJcclxuXHRjYWNoZUxlbmd0aDogNTAsXHJcblxyXG5cdGNyZWF0ZVBzZXVkbzogbWFya0Z1bmN0aW9uLFxyXG5cclxuXHRtYXRjaDogbWF0Y2hFeHByLFxyXG5cclxuXHRvcmRlcjogbmV3IFJlZ0V4cCggXCJJRHxUQUdcIiArXHJcblx0XHQoYXNzZXJ0VXNhYmxlTmFtZSA/IFwifE5BTUVcIiA6IFwiXCIpICtcclxuXHRcdChhc3NlcnRVc2FibGVDbGFzc05hbWUgPyBcInxDTEFTU1wiIDogXCJcIilcclxuXHQpLFxyXG5cclxuXHQvLyBJRTYvNyByZXR1cm4gYSBtb2RpZmllZCBocmVmXHJcblx0YXR0ckhhbmRsZTogYXNzZXJ0SHJlZk5vdE5vcm1hbGl6ZWQgP1xyXG5cdFx0e30gOlxyXG5cdFx0e1xyXG5cdFx0XHRcImhyZWZcIjogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBcImhyZWZcIiwgMiApO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRcInR5cGVcIjogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHJcblx0ZmluZDoge1xyXG5cdFx0XCJJRFwiOiBhc3NlcnRHZXRJZE5vdE5hbWUgP1xyXG5cdFx0XHRmdW5jdGlvbiggaWQsIGNvbnRleHQsIHhtbCApIHtcclxuXHRcdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBzdHJ1bmRlZmluZWQgJiYgIXhtbCApIHtcclxuXHRcdFx0XHRcdHZhciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcclxuXHRcdFx0XHRcdC8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zXHJcblx0XHRcdFx0XHQvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzXHJcblx0XHRcdFx0XHRyZXR1cm4gbSAmJiBtLnBhcmVudE5vZGUgPyBbbV0gOiBbXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gOlxyXG5cdFx0XHRmdW5jdGlvbiggaWQsIGNvbnRleHQsIHhtbCApIHtcclxuXHRcdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBzdHJ1bmRlZmluZWQgJiYgIXhtbCApIHtcclxuXHRcdFx0XHRcdHZhciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gbSA/XHJcblx0XHRcdFx0XHRcdG0uaWQgPT09IGlkIHx8IHR5cGVvZiBtLmdldEF0dHJpYnV0ZU5vZGUgIT09IHN0cnVuZGVmaW5lZCAmJiBtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKS52YWx1ZSA9PT0gaWQgP1xyXG5cdFx0XHRcdFx0XHRcdFttXSA6XHJcblx0XHRcdFx0XHRcdFx0dW5kZWZpbmVkIDpcclxuXHRcdFx0XHRcdFx0W107XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFwiVEFHXCI6IGFzc2VydFRhZ05hbWVOb0NvbW1lbnRzID9cclxuXHRcdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcclxuXHRcdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBzdHJ1bmRlZmluZWQgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IDpcclxuXHRcdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcclxuXHRcdFx0XHR2YXIgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xyXG5cclxuXHRcdFx0XHQvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzXHJcblx0XHRcdFx0aWYgKCB0YWcgPT09IFwiKlwiICkge1xyXG5cdFx0XHRcdFx0dmFyIGVsZW0sXHJcblx0XHRcdFx0XHRcdHRtcCA9IFtdLFxyXG5cdFx0XHRcdFx0XHRpID0gMDtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCA7IChlbGVtID0gcmVzdWx0c1tpXSk7IGkrKyApIHtcclxuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xyXG5cdFx0XHRcdFx0XHRcdHRtcC5wdXNoKCBlbGVtICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gdG1wO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcclxuXHRcdFx0fSxcclxuXHJcblx0XHRcIk5BTUVcIjogZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcclxuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSAhPT0gc3RydW5kZWZpbmVkICkge1xyXG5cdFx0XHRcdHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lKCBuYW1lICk7XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblxyXG5cdFx0XCJDTEFTU1wiOiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0LCB4bWwgKSB7XHJcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gc3RydW5kZWZpbmVkICYmICF4bWwgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggY2xhc3NOYW1lICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRyZWxhdGl2ZToge1xyXG5cdFx0XCI+XCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiwgZmlyc3Q6IHRydWUgfSxcclxuXHRcdFwiIFwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIgfSxcclxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcclxuXHRcdFwiflwiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiB9XHJcblx0fSxcclxuXHJcblx0cHJlRmlsdGVyOiB7XHJcblx0XHRcIkFUVFJcIjogZnVuY3Rpb24oIG1hdGNoICkge1xyXG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJiYWNrc2xhc2gsIFwiXCIgKTtcclxuXHJcblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXHJcblx0XHRcdG1hdGNoWzNdID0gKCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCBcIlwiICkucmVwbGFjZSggcmJhY2tzbGFzaCwgXCJcIiApO1xyXG5cclxuXHRcdFx0aWYgKCBtYXRjaFsyXSA9PT0gXCJ+PVwiICkge1xyXG5cdFx0XHRcdG1hdGNoWzNdID0gXCIgXCIgKyBtYXRjaFszXSArIFwiIFwiO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDQgKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0XCJDSElMRFwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XHJcblx0XHRcdC8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHIuQ0hJTERcclxuXHRcdFx0XHQxIHR5cGUgKG9ubHl8bnRofC4uLilcclxuXHRcdFx0XHQyIGFyZ3VtZW50IChldmVufG9kZHxcXGQqfFxcZCpuKFsrLV1cXGQrKT98Li4uKVxyXG5cdFx0XHRcdDMgeG4tY29tcG9uZW50IG9mIHhuK3kgYXJndW1lbnQgKFsrLV0/XFxkKm58KVxyXG5cdFx0XHRcdDQgc2lnbiBvZiB4bi1jb21wb25lbnRcclxuXHRcdFx0XHQ1IHggb2YgeG4tY29tcG9uZW50XHJcblx0XHRcdFx0NiBzaWduIG9mIHktY29tcG9uZW50XHJcblx0XHRcdFx0NyB5IG9mIHktY29tcG9uZW50XHJcblx0XHRcdCovXHJcblx0XHRcdG1hdGNoWzFdID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKTtcclxuXHJcblx0XHRcdGlmICggbWF0Y2hbMV0gPT09IFwibnRoXCIgKSB7XHJcblx0XHRcdFx0Ly8gbnRoLWNoaWxkIHJlcXVpcmVzIGFyZ3VtZW50XHJcblx0XHRcdFx0aWYgKCAhbWF0Y2hbMl0gKSB7XHJcblx0XHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBudW1lcmljIHggYW5kIHkgcGFyYW1ldGVycyBmb3IgRXhwci5maWx0ZXIuQ0hJTERcclxuXHRcdFx0XHQvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xXHJcblx0XHRcdFx0bWF0Y2hbM10gPSArKCBtYXRjaFszXSA/IG1hdGNoWzRdICsgKG1hdGNoWzVdIHx8IDEpIDogMiAqICggbWF0Y2hbMl0gPT09IFwiZXZlblwiIHx8IG1hdGNoWzJdID09PSBcIm9kZFwiICkgKTtcclxuXHRcdFx0XHRtYXRjaFs0XSA9ICsoICggbWF0Y2hbNl0gKyBtYXRjaFs3XSApIHx8IG1hdGNoWzJdID09PSBcIm9kZFwiICk7XHJcblxyXG5cdFx0XHQvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHNcclxuXHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7XHJcblx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbWF0Y2g7XHJcblx0XHR9LFxyXG5cclxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCwgeG1sICkge1xyXG5cdFx0XHR2YXIgdW5xdW90ZWQsIGV4Y2VzcztcclxuXHRcdFx0aWYgKCBtYXRjaEV4cHJbXCJDSElMRFwiXS50ZXN0KCBtYXRjaFswXSApICkge1xyXG5cdFx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIG1hdGNoWzNdICkge1xyXG5cdFx0XHRcdG1hdGNoWzJdID0gbWF0Y2hbM107XHJcblx0XHRcdH0gZWxzZSBpZiAoICh1bnF1b3RlZCA9IG1hdGNoWzRdKSApIHtcclxuXHRcdFx0XHQvLyBPbmx5IGNoZWNrIGFyZ3VtZW50cyB0aGF0IGNvbnRhaW4gYSBwc2V1ZG9cclxuXHRcdFx0XHRpZiAoIHJwc2V1ZG8udGVzdCh1bnF1b3RlZCkgJiZcclxuXHRcdFx0XHRcdC8vIEdldCBleGNlc3MgZnJvbSB0b2tlbml6ZSAocmVjdXJzaXZlbHkpXHJcblx0XHRcdFx0XHQoZXhjZXNzID0gdG9rZW5pemUoIHVucXVvdGVkLCBjb250ZXh0LCB4bWwsIHRydWUgKSkgJiZcclxuXHRcdFx0XHRcdC8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpc1xyXG5cdFx0XHRcdFx0KGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXhcclxuXHRcdFx0XHRcdHVucXVvdGVkID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApO1xyXG5cdFx0XHRcdFx0bWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCwgZXhjZXNzICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdG1hdGNoWzJdID0gdW5xdW90ZWQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFJldHVybiBvbmx5IGNhcHR1cmVzIG5lZWRlZCBieSB0aGUgcHNldWRvIGZpbHRlciBtZXRob2QgKHR5cGUgYW5kIGFyZ3VtZW50KVxyXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDMgKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRmaWx0ZXI6IHtcclxuXHRcdFwiSURcIjogYXNzZXJ0R2V0SWROb3ROYW1lID9cclxuXHRcdFx0ZnVuY3Rpb24oIGlkICkge1xyXG5cdFx0XHRcdGlkID0gaWQucmVwbGFjZSggcmJhY2tzbGFzaCwgXCJcIiApO1xyXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpID09PSBpZDtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9IDpcclxuXHRcdFx0ZnVuY3Rpb24oIGlkICkge1xyXG5cdFx0XHRcdGlkID0gaWQucmVwbGFjZSggcmJhY2tzbGFzaCwgXCJcIiApO1xyXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHRcdHZhciBub2RlID0gdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gc3RydW5kZWZpbmVkICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZShcImlkXCIpO1xyXG5cdFx0XHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQ7XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fSxcclxuXHJcblx0XHRcIlRBR1wiOiBmdW5jdGlvbiggbm9kZU5hbWUgKSB7XHJcblx0XHRcdGlmICggbm9kZU5hbWUgPT09IFwiKlwiICkge1xyXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH07XHJcblx0XHRcdH1cclxuXHRcdFx0bm9kZU5hbWUgPSBub2RlTmFtZS5yZXBsYWNlKCByYmFja3NsYXNoLCBcIlwiICkudG9Mb3dlckNhc2UoKTtcclxuXHJcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lO1xyXG5cdFx0XHR9O1xyXG5cdFx0fSxcclxuXHJcblx0XHRcIkNMQVNTXCI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7XHJcblx0XHRcdHZhciBwYXR0ZXJuID0gY2xhc3NDYWNoZVsgZXhwYW5kbyBdWyBjbGFzc05hbWUgXTtcclxuXHRcdFx0aWYgKCAhcGF0dGVybiApIHtcclxuXHRcdFx0XHRwYXR0ZXJuID0gY2xhc3NDYWNoZSggY2xhc3NOYW1lLCBuZXcgUmVnRXhwKFwiKF58XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgKyBjbGFzc05hbWUgKyBcIihcIiArIHdoaXRlc3BhY2UgKyBcInwkKVwiKSApO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHRyZXR1cm4gcGF0dGVybi50ZXN0KCBlbGVtLmNsYXNzTmFtZSB8fCAodHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBzdHJ1bmRlZmluZWQgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSkgfHwgXCJcIiApO1xyXG5cdFx0XHR9O1xyXG5cdFx0fSxcclxuXHJcblx0XHRcIkFUVFJcIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHtcclxuXHRcdFx0aWYgKCAhb3BlcmF0b3IgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICkgIT0gbnVsbDtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdFx0dmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICksXHJcblx0XHRcdFx0XHR2YWx1ZSA9IHJlc3VsdCArIFwiXCI7XHJcblxyXG5cdFx0XHRcdGlmICggcmVzdWx0ID09IG51bGwgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiIT1cIjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHN3aXRjaCAoIG9wZXJhdG9yICkge1xyXG5cdFx0XHRcdFx0Y2FzZSBcIj1cIjpcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSBjaGVjaztcclxuXHRcdFx0XHRcdGNhc2UgXCIhPVwiOlxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWUgIT09IGNoZWNrO1xyXG5cdFx0XHRcdFx0Y2FzZSBcIl49XCI6XHJcblx0XHRcdFx0XHRcdHJldHVybiBjaGVjayAmJiB2YWx1ZS5pbmRleE9mKCBjaGVjayApID09PSAwO1xyXG5cdFx0XHRcdFx0Y2FzZSBcIio9XCI6XHJcblx0XHRcdFx0XHRcdHJldHVybiBjaGVjayAmJiB2YWx1ZS5pbmRleE9mKCBjaGVjayApID4gLTE7XHJcblx0XHRcdFx0XHRjYXNlIFwiJD1cIjpcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGNoZWNrICYmIHZhbHVlLnN1YnN0ciggdmFsdWUubGVuZ3RoIC0gY2hlY2subGVuZ3RoICkgPT09IGNoZWNrO1xyXG5cdFx0XHRcdFx0Y2FzZSBcIn49XCI6XHJcblx0XHRcdFx0XHRcdHJldHVybiAoIFwiIFwiICsgdmFsdWUgKyBcIiBcIiApLmluZGV4T2YoIGNoZWNrICkgPiAtMTtcclxuXHRcdFx0XHRcdGNhc2UgXCJ8PVwiOlxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IGNoZWNrIHx8IHZhbHVlLnN1YnN0ciggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fTtcclxuXHRcdH0sXHJcblxyXG5cdFx0XCJDSElMRFwiOiBmdW5jdGlvbiggdHlwZSwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkge1xyXG5cclxuXHRcdFx0aWYgKCB0eXBlID09PSBcIm50aFwiICkge1xyXG5cdFx0XHRcdHZhciBkb25lTmFtZSA9IGRvbmUrKztcclxuXHJcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHRcdFx0dmFyIHBhcmVudCwgZGlmZixcclxuXHRcdFx0XHRcdFx0Y291bnQgPSAwLFxyXG5cdFx0XHRcdFx0XHRub2RlID0gZWxlbTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGZpcnN0ID09PSAxICYmIGxhc3QgPT09IDAgKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHBhcmVudCAmJiAocGFyZW50WyBleHBhbmRvIF0gIT09IGRvbmVOYW1lIHx8ICFlbGVtLnNpenNldCkgKSB7XHJcblx0XHRcdFx0XHRcdGZvciAoIG5vZGUgPSBwYXJlbnQuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcgKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0bm9kZS5zaXpzZXQgPSArK2NvdW50O1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBub2RlID09PSBlbGVtICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdHBhcmVudFsgZXhwYW5kbyBdID0gZG9uZU5hbWU7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0ZGlmZiA9IGVsZW0uc2l6c2V0IC0gbGFzdDtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGZpcnN0ID09PSAwICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZGlmZiA9PT0gMDtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gKCBkaWZmICUgZmlyc3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdFx0dmFyIG5vZGUgPSBlbGVtO1xyXG5cclxuXHRcdFx0XHRzd2l0Y2ggKCB0eXBlICkge1xyXG5cdFx0XHRcdFx0Y2FzZSBcIm9ubHlcIjpcclxuXHRcdFx0XHRcdGNhc2UgXCJmaXJzdFwiOlxyXG5cdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmcpICkge1xyXG5cdFx0XHRcdFx0XHRcdGlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmaXJzdFwiICkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRub2RlID0gZWxlbTtcclxuXHJcblx0XHRcdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cclxuXHRcdFx0XHRcdGNhc2UgXCJsYXN0XCI6XHJcblx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSBub2RlLm5leHRTaWJsaW5nKSApIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH07XHJcblx0XHR9LFxyXG5cclxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50LCBjb250ZXh0LCB4bWwgKSB7XHJcblx0XHRcdC8vIHBzZXVkby1jbGFzcyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZVxyXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI3BzZXVkby1jbGFzc2VzXHJcblx0XHRcdC8vIFByaW9yaXRpemUgYnkgY2FzZSBzZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXJzXHJcblx0XHRcdHZhciBhcmdzLFxyXG5cdFx0XHRcdGZuID0gRXhwci5wc2V1ZG9zWyBwc2V1ZG8gXSB8fCBFeHByLnBzZXVkb3NbIHBzZXVkby50b0xvd2VyQ2FzZSgpIF07XHJcblxyXG5cdFx0XHRpZiAoICFmbiApIHtcclxuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgcHNldWRvOiBcIiArIHBzZXVkbyApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBUaGUgdXNlciBtYXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0XHJcblx0XHRcdC8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uXHJcblx0XHRcdC8vIGp1c3QgYXMgU2l6emxlIGRvZXNcclxuXHRcdFx0aWYgKCAhZm5bIGV4cGFuZG8gXSApIHtcclxuXHRcdFx0XHRpZiAoIGZuLmxlbmd0aCA+IDEgKSB7XHJcblx0XHRcdFx0XHRhcmdzID0gWyBwc2V1ZG8sIHBzZXVkbywgXCJcIiwgYXJndW1lbnQgXTtcclxuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGZuKCBlbGVtLCAwLCBhcmdzICk7XHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gZm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBmbiggYXJndW1lbnQsIGNvbnRleHQsIHhtbCApO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdHBzZXVkb3M6IHtcclxuXHRcdFwibm90XCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHhtbCApIHtcclxuXHRcdFx0Ly8gVHJpbSB0aGUgc2VsZWN0b3IgcGFzc2VkIHRvIGNvbXBpbGVcclxuXHRcdFx0Ly8gdG8gYXZvaWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmdcclxuXHRcdFx0Ly8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzXHJcblx0XHRcdHZhciBtYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApLCBjb250ZXh0LCB4bWwgKTtcclxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHRcdHJldHVybiAhbWF0Y2hlciggZWxlbSApO1xyXG5cdFx0XHR9O1xyXG5cdFx0fSksXHJcblxyXG5cdFx0XCJlbmFibGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2U7XHJcblx0XHR9LFxyXG5cclxuXHRcdFwiZGlzYWJsZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlO1xyXG5cdFx0fSxcclxuXHJcblx0XHRcImNoZWNrZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdC8vIEluIENTUzMsIDpjaGVja2VkIHNob3VsZCByZXR1cm4gYm90aCBjaGVja2VkIGFuZCBzZWxlY3RlZCBlbGVtZW50c1xyXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxyXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdHJldHVybiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSBcIm9wdGlvblwiICYmICEhZWxlbS5zZWxlY3RlZCk7XHJcblx0XHR9LFxyXG5cclxuXHRcdFwic2VsZWN0ZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdC8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHRcclxuXHRcdFx0Ly8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseVxyXG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHtcclxuXHRcdFx0XHRlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7XHJcblx0XHR9LFxyXG5cclxuXHRcdFwicGFyZW50XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHRyZXR1cm4gIUV4cHIucHNldWRvc1tcImVtcHR5XCJdKCBlbGVtICk7XHJcblx0XHR9LFxyXG5cclxuXHRcdFwiZW1wdHlcIjogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jZW1wdHktcHNldWRvXHJcblx0XHRcdC8vIDplbXB0eSBpcyBvbmx5IGFmZmVjdGVkIGJ5IGVsZW1lbnQgbm9kZXMgYW5kIGNvbnRlbnQgbm9kZXMoaW5jbHVkaW5nIHRleHQoMyksIGNkYXRhKDQpKSxcclxuXHRcdFx0Ly8gICBub3QgY29tbWVudCwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIG9yIG90aGVyc1xyXG5cdFx0XHQvLyBUaGFua3MgdG8gRGllZ28gUGVyaW5pIGZvciB0aGUgbm9kZU5hbWUgc2hvcnRjdXRcclxuXHRcdFx0Ly8gICBHcmVhdGVyIHRoYW4gXCJAXCIgbWVhbnMgYWxwaGEgY2hhcmFjdGVycyAoc3BlY2lmaWNhbGx5IG5vdCBzdGFydGluZyB3aXRoIFwiI1wiIG9yIFwiP1wiKVxyXG5cdFx0XHR2YXIgbm9kZVR5cGU7XHJcblx0XHRcdGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7XHJcblx0XHRcdHdoaWxlICggZWxlbSApIHtcclxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZU5hbWUgPiBcIkBcIiB8fCAobm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlKSA9PT0gMyB8fCBub2RlVHlwZSA9PT0gNCApIHtcclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0ZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmc7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9LFxyXG5cclxuXHRcdFwiY29udGFpbnNcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCB0ZXh0ICkge1xyXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdFx0cmV0dXJuICggZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCBnZXRUZXh0KCBlbGVtICkgKS5pbmRleE9mKCB0ZXh0ICkgPiAtMTtcclxuXHRcdFx0fTtcclxuXHRcdH0pLFxyXG5cclxuXHRcdFwiaGFzXCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7XHJcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHRyZXR1cm4gU2l6emxlKCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7XHJcblx0XHRcdH07XHJcblx0XHR9KSxcclxuXHJcblx0XHRcImhlYWRlclwiOiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0cmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApO1xyXG5cdFx0fSxcclxuXHJcblx0XHRcInRleHRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdHZhciB0eXBlLCBhdHRyO1xyXG5cdFx0XHQvLyBJRTYgYW5kIDcgd2lsbCBtYXAgZWxlbS50eXBlIHRvICd0ZXh0JyBmb3IgbmV3IEhUTUw1IHR5cGVzIChzZWFyY2gsIGV0YylcclxuXHRcdFx0Ly8gdXNlIGdldEF0dHJpYnV0ZSBpbnN0ZWFkIHRvIHRlc3QgdGhpcyBjYXNlXHJcblx0XHRcdHJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiAmJlxyXG5cdFx0XHRcdCh0eXBlID0gZWxlbS50eXBlKSA9PT0gXCJ0ZXh0XCIgJiZcclxuXHRcdFx0XHQoIChhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpKSA9PSBudWxsIHx8IGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gdHlwZSApO1xyXG5cdFx0fSxcclxuXHJcblx0XHQvLyBJbnB1dCB0eXBlc1xyXG5cdFx0XCJyYWRpb1wiOiBjcmVhdGVJbnB1dFBzZXVkbyhcInJhZGlvXCIpLFxyXG5cdFx0XCJjaGVja2JveFwiOiBjcmVhdGVJbnB1dFBzZXVkbyhcImNoZWNrYm94XCIpLFxyXG5cdFx0XCJmaWxlXCI6IGNyZWF0ZUlucHV0UHNldWRvKFwiZmlsZVwiKSxcclxuXHRcdFwicGFzc3dvcmRcIjogY3JlYXRlSW5wdXRQc2V1ZG8oXCJwYXNzd29yZFwiKSxcclxuXHRcdFwiaW1hZ2VcIjogY3JlYXRlSW5wdXRQc2V1ZG8oXCJpbWFnZVwiKSxcclxuXHJcblx0XHRcInN1Ym1pdFwiOiBjcmVhdGVCdXR0b25Qc2V1ZG8oXCJzdWJtaXRcIiksXHJcblx0XHRcInJlc2V0XCI6IGNyZWF0ZUJ1dHRvblBzZXVkbyhcInJlc2V0XCIpLFxyXG5cclxuXHRcdFwiYnV0dG9uXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IFwiYnV0dG9uXCIgfHwgbmFtZSA9PT0gXCJidXR0b25cIjtcclxuXHRcdH0sXHJcblxyXG5cdFx0XCJpbnB1dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0cmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApO1xyXG5cdFx0fSxcclxuXHJcblx0XHRcImZvY3VzXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHR2YXIgZG9jID0gZWxlbS5vd25lckRvY3VtZW50O1xyXG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jLmFjdGl2ZUVsZW1lbnQgJiYgKCFkb2MuaGFzRm9jdXMgfHwgZG9jLmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYpO1xyXG5cdFx0fSxcclxuXHJcblx0XHRcImFjdGl2ZVwiOiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGVsZW0ub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50O1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdHNldEZpbHRlcnM6IHtcclxuXHRcdFwiZmlyc3RcIjogZnVuY3Rpb24oIGVsZW1lbnRzLCBhcmd1bWVudCwgbm90ICkge1xyXG5cdFx0XHRyZXR1cm4gbm90ID8gZWxlbWVudHMuc2xpY2UoIDEgKSA6IFsgZWxlbWVudHNbMF0gXTtcclxuXHRcdH0sXHJcblxyXG5cdFx0XCJsYXN0XCI6IGZ1bmN0aW9uKCBlbGVtZW50cywgYXJndW1lbnQsIG5vdCApIHtcclxuXHRcdFx0dmFyIGVsZW0gPSBlbGVtZW50cy5wb3AoKTtcclxuXHRcdFx0cmV0dXJuIG5vdCA/IGVsZW1lbnRzIDogWyBlbGVtIF07XHJcblx0XHR9LFxyXG5cclxuXHRcdFwiZXZlblwiOiBmdW5jdGlvbiggZWxlbWVudHMsIGFyZ3VtZW50LCBub3QgKSB7XHJcblx0XHRcdHZhciByZXN1bHRzID0gW10sXHJcblx0XHRcdFx0aSA9IG5vdCA/IDEgOiAwLFxyXG5cdFx0XHRcdGxlbiA9IGVsZW1lbnRzLmxlbmd0aDtcclxuXHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpID0gaSArIDIgKSB7XHJcblx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtZW50c1tpXSApO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiByZXN1bHRzO1xyXG5cdFx0fSxcclxuXHJcblx0XHRcIm9kZFwiOiBmdW5jdGlvbiggZWxlbWVudHMsIGFyZ3VtZW50LCBub3QgKSB7XHJcblx0XHRcdHZhciByZXN1bHRzID0gW10sXHJcblx0XHRcdFx0aSA9IG5vdCA/IDAgOiAxLFxyXG5cdFx0XHRcdGxlbiA9IGVsZW1lbnRzLmxlbmd0aDtcclxuXHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpID0gaSArIDIgKSB7XHJcblx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtZW50c1tpXSApO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiByZXN1bHRzO1xyXG5cdFx0fSxcclxuXHJcblx0XHRcImx0XCI6IGZ1bmN0aW9uKCBlbGVtZW50cywgYXJndW1lbnQsIG5vdCApIHtcclxuXHRcdFx0cmV0dXJuIG5vdCA/IGVsZW1lbnRzLnNsaWNlKCArYXJndW1lbnQgKSA6IGVsZW1lbnRzLnNsaWNlKCAwLCArYXJndW1lbnQgKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0XCJndFwiOiBmdW5jdGlvbiggZWxlbWVudHMsIGFyZ3VtZW50LCBub3QgKSB7XHJcblx0XHRcdHJldHVybiBub3QgPyBlbGVtZW50cy5zbGljZSggMCwgK2FyZ3VtZW50ICsgMSApIDogZWxlbWVudHMuc2xpY2UoICthcmd1bWVudCArIDEgKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0XCJlcVwiOiBmdW5jdGlvbiggZWxlbWVudHMsIGFyZ3VtZW50LCBub3QgKSB7XHJcblx0XHRcdHZhciBlbGVtID0gZWxlbWVudHMuc3BsaWNlKCArYXJndW1lbnQsIDEgKTtcclxuXHRcdFx0cmV0dXJuIG5vdCA/IGVsZW1lbnRzIDogZWxlbTtcclxuXHRcdH1cclxuXHR9XHJcbn07XHJcblxyXG5mdW5jdGlvbiBzaWJsaW5nQ2hlY2soIGEsIGIsIHJldCApIHtcclxuXHRpZiAoIGEgPT09IGIgKSB7XHJcblx0XHRyZXR1cm4gcmV0O1xyXG5cdH1cclxuXHJcblx0dmFyIGN1ciA9IGEubmV4dFNpYmxpbmc7XHJcblxyXG5cdHdoaWxlICggY3VyICkge1xyXG5cdFx0aWYgKCBjdXIgPT09IGIgKSB7XHJcblx0XHRcdHJldHVybiAtMTtcclxuXHRcdH1cclxuXHJcblx0XHRjdXIgPSBjdXIubmV4dFNpYmxpbmc7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gMTtcclxufVxyXG5cclxuc29ydE9yZGVyID0gZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/XHJcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XHJcblx0XHRpZiAoIGEgPT09IGIgKSB7XHJcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XHJcblx0XHRcdHJldHVybiAwO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAoICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHx8ICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID9cclxuXHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA6XHJcblx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgJiA0XHJcblx0XHQpID8gLTEgOiAxO1xyXG5cdH0gOlxyXG5cdGZ1bmN0aW9uKCBhLCBiICkge1xyXG5cdFx0Ly8gVGhlIG5vZGVzIGFyZSBpZGVudGljYWwsIHdlIGNhbiBleGl0IGVhcmx5XHJcblx0XHRpZiAoIGEgPT09IGIgKSB7XHJcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XHJcblx0XHRcdHJldHVybiAwO1xyXG5cclxuXHRcdC8vIEZhbGxiYWNrIHRvIHVzaW5nIHNvdXJjZUluZGV4IChpbiBJRSkgaWYgaXQncyBhdmFpbGFibGUgb24gYm90aCBub2Rlc1xyXG5cdFx0fSBlbHNlIGlmICggYS5zb3VyY2VJbmRleCAmJiBiLnNvdXJjZUluZGV4ICkge1xyXG5cdFx0XHRyZXR1cm4gYS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGFsLCBibCxcclxuXHRcdFx0YXAgPSBbXSxcclxuXHRcdFx0YnAgPSBbXSxcclxuXHRcdFx0YXVwID0gYS5wYXJlbnROb2RlLFxyXG5cdFx0XHRidXAgPSBiLnBhcmVudE5vZGUsXHJcblx0XHRcdGN1ciA9IGF1cDtcclxuXHJcblx0XHQvLyBJZiB0aGUgbm9kZXMgYXJlIHNpYmxpbmdzIChvciBpZGVudGljYWwpIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrXHJcblx0XHRpZiAoIGF1cCA9PT0gYnVwICkge1xyXG5cdFx0XHRyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7XHJcblxyXG5cdFx0Ly8gSWYgbm8gcGFyZW50cyB3ZXJlIGZvdW5kIHRoZW4gdGhlIG5vZGVzIGFyZSBkaXNjb25uZWN0ZWRcclxuXHRcdH0gZWxzZSBpZiAoICFhdXAgKSB7XHJcblx0XHRcdHJldHVybiAtMTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCAhYnVwICkge1xyXG5cdFx0XHRyZXR1cm4gMTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBPdGhlcndpc2UgdGhleSdyZSBzb21ld2hlcmUgZWxzZSBpbiB0aGUgdHJlZSBzbyB3ZSBuZWVkXHJcblx0XHQvLyB0byBidWlsZCB1cCBhIGZ1bGwgbGlzdCBvZiB0aGUgcGFyZW50Tm9kZXMgZm9yIGNvbXBhcmlzb25cclxuXHRcdHdoaWxlICggY3VyICkge1xyXG5cdFx0XHRhcC51bnNoaWZ0KCBjdXIgKTtcclxuXHRcdFx0Y3VyID0gY3VyLnBhcmVudE5vZGU7XHJcblx0XHR9XHJcblxyXG5cdFx0Y3VyID0gYnVwO1xyXG5cclxuXHRcdHdoaWxlICggY3VyICkge1xyXG5cdFx0XHRicC51bnNoaWZ0KCBjdXIgKTtcclxuXHRcdFx0Y3VyID0gY3VyLnBhcmVudE5vZGU7XHJcblx0XHR9XHJcblxyXG5cdFx0YWwgPSBhcC5sZW5ndGg7XHJcblx0XHRibCA9IGJwLmxlbmd0aDtcclxuXHJcblx0XHQvLyBTdGFydCB3YWxraW5nIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeVxyXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgYWwgJiYgaSA8IGJsOyBpKysgKSB7XHJcblx0XHRcdGlmICggYXBbaV0gIT09IGJwW2ldICkge1xyXG5cdFx0XHRcdHJldHVybiBzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gV2UgZW5kZWQgc29tZXBsYWNlIHVwIHRoZSB0cmVlIHNvIGRvIGEgc2libGluZyBjaGVja1xyXG5cdFx0cmV0dXJuIGkgPT09IGFsID9cclxuXHRcdFx0c2libGluZ0NoZWNrKCBhLCBicFtpXSwgLTEgKSA6XHJcblx0XHRcdHNpYmxpbmdDaGVjayggYXBbaV0sIGIsIDEgKTtcclxuXHR9O1xyXG5cclxuLy8gQWx3YXlzIGFzc3VtZSB0aGUgcHJlc2VuY2Ugb2YgZHVwbGljYXRlcyBpZiBzb3J0IGRvZXNuJ3RcclxuLy8gcGFzcyB0aGVtIHRvIG91ciBjb21wYXJpc29uIGZ1bmN0aW9uIChhcyBpbiBHb29nbGUgQ2hyb21lKS5cclxuWzAsIDBdLnNvcnQoIHNvcnRPcmRlciApO1xyXG5iYXNlSGFzRHVwbGljYXRlID0gIWhhc0R1cGxpY2F0ZTtcclxuXHJcbi8vIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXNcclxuU2l6emxlLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHtcclxuXHR2YXIgZWxlbSxcclxuXHRcdGkgPSAxO1xyXG5cclxuXHRoYXNEdXBsaWNhdGUgPSBiYXNlSGFzRHVwbGljYXRlO1xyXG5cdHJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7XHJcblxyXG5cdGlmICggaGFzRHVwbGljYXRlICkge1xyXG5cdFx0Zm9yICggOyAoZWxlbSA9IHJlc3VsdHNbaV0pOyBpKysgKSB7XHJcblx0XHRcdGlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSAtIDEgXSApIHtcclxuXHRcdFx0XHRyZXN1bHRzLnNwbGljZSggaS0tLCAxICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHJldHVybiByZXN1bHRzO1xyXG59O1xyXG5cclxuU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHtcclxuXHR0aHJvdyBuZXcgRXJyb3IoIFwiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogXCIgKyBtc2cgKTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIHRva2VuaXplKCBzZWxlY3RvciwgY29udGV4dCwgeG1sLCBwYXJzZU9ubHkgKSB7XHJcblx0dmFyIG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsXHJcblx0XHRzb0ZhciwgZ3JvdXBzLCBncm91cCwgaSxcclxuXHRcdHByZUZpbHRlcnMsIGZpbHRlcnMsXHJcblx0XHRjaGVja0NvbnRleHQgPSAheG1sICYmIGNvbnRleHQgIT09IGRvY3VtZW50LFxyXG5cdFx0Ly8gVG9rZW4gY2FjaGUgc2hvdWxkIG1haW50YWluIHNwYWNlc1xyXG5cdFx0a2V5ID0gKCBjaGVja0NvbnRleHQgPyBcIjxzPlwiIDogXCJcIiApICsgc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDE8cz5cIiApLFxyXG5cdFx0Y2FjaGVkID0gdG9rZW5DYWNoZVsgZXhwYW5kbyBdWyBrZXkgXTtcclxuXHJcblx0aWYgKCBjYWNoZWQgKSB7XHJcblx0XHRyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IHNsaWNlLmNhbGwoIGNhY2hlZCwgMCApO1xyXG5cdH1cclxuXHJcblx0c29GYXIgPSBzZWxlY3RvcjtcclxuXHRncm91cHMgPSBbXTtcclxuXHRpID0gMDtcclxuXHRwcmVGaWx0ZXJzID0gRXhwci5wcmVGaWx0ZXI7XHJcblx0ZmlsdGVycyA9IEV4cHIuZmlsdGVyO1xyXG5cclxuXHR3aGlsZSAoIHNvRmFyICkge1xyXG5cclxuXHRcdC8vIENvbW1hIGFuZCBmaXJzdCBydW5cclxuXHRcdGlmICggIW1hdGNoZWQgfHwgKG1hdGNoID0gcmNvbW1hLmV4ZWMoIHNvRmFyICkpICkge1xyXG5cdFx0XHRpZiAoIG1hdGNoICkge1xyXG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApO1xyXG5cdFx0XHRcdHRva2Vucy5zZWxlY3RvciA9IGdyb3VwO1xyXG5cdFx0XHR9XHJcblx0XHRcdGdyb3Vwcy5wdXNoKCB0b2tlbnMgPSBbXSApO1xyXG5cdFx0XHRncm91cCA9IFwiXCI7XHJcblxyXG5cdFx0XHQvLyBOZWVkIHRvIG1ha2Ugc3VyZSB3ZSdyZSB3aXRoaW4gYSBuYXJyb3dlciBjb250ZXh0IGlmIG5lY2Vzc2FyeVxyXG5cdFx0XHQvLyBBZGRpbmcgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3Igd2lsbCBnZW5lcmF0ZSB3aGF0IGlzIG5lZWRlZFxyXG5cdFx0XHRpZiAoIGNoZWNrQ29udGV4dCApIHtcclxuXHRcdFx0XHRzb0ZhciA9IFwiIFwiICsgc29GYXI7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRtYXRjaGVkID0gZmFsc2U7XHJcblxyXG5cdFx0Ly8gQ29tYmluYXRvcnNcclxuXHRcdGlmICggKG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkpICkge1xyXG5cdFx0XHRncm91cCArPSBtYXRjaFswXTtcclxuXHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICk7XHJcblxyXG5cdFx0XHQvLyBDYXN0IGRlc2NlbmRhbnQgY29tYmluYXRvcnMgdG8gc3BhY2VcclxuXHRcdFx0bWF0Y2hlZCA9IHRva2Vucy5wdXNoKHtcclxuXHRcdFx0XHRwYXJ0OiBtYXRjaC5wb3AoKS5yZXBsYWNlKCBydHJpbSwgXCIgXCIgKSxcclxuXHRcdFx0XHRzdHJpbmc6IG1hdGNoWzBdLFxyXG5cdFx0XHRcdGNhcHR1cmVzOiBtYXRjaFxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBGaWx0ZXJzXHJcblx0XHRmb3IgKCB0eXBlIGluIGZpbHRlcnMgKSB7XHJcblx0XHRcdGlmICggKG1hdGNoID0gbWF0Y2hFeHByWyB0eXBlIF0uZXhlYyggc29GYXIgKSkgJiYgKCFwcmVGaWx0ZXJzWyB0eXBlIF0gfHxcclxuXHRcdFx0XHQoIG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKG1hdGNoLCBjb250ZXh0LCB4bWwpICkpICkge1xyXG5cclxuXHRcdFx0XHRncm91cCArPSBtYXRjaFswXTtcclxuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaFswXS5sZW5ndGggKTtcclxuXHRcdFx0XHRtYXRjaGVkID0gdG9rZW5zLnB1c2goe1xyXG5cdFx0XHRcdFx0cGFydDogdHlwZSxcclxuXHRcdFx0XHRcdHN0cmluZzogbWF0Y2guc2hpZnQoKSxcclxuXHRcdFx0XHRcdGNhcHR1cmVzOiBtYXRjaFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCAhbWF0Y2hlZCApIHtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyBBdHRhY2ggdGhlIGZ1bGwgZ3JvdXAgYXMgYSBzZWxlY3RvclxyXG5cdGlmICggZ3JvdXAgKSB7XHJcblx0XHR0b2tlbnMuc2VsZWN0b3IgPSBncm91cDtcclxuXHR9XHJcblxyXG5cdC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnZhbGlkIGV4Y2Vzc1xyXG5cdC8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZ1xyXG5cdC8vIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRva2Vuc1xyXG5cdHJldHVybiBwYXJzZU9ubHkgP1xyXG5cdFx0c29GYXIubGVuZ3RoIDpcclxuXHRcdHNvRmFyID9cclxuXHRcdFx0U2l6emxlLmVycm9yKCBzZWxlY3RvciApIDpcclxuXHRcdFx0Ly8gQ2FjaGUgdGhlIHRva2Vuc1xyXG5cdFx0XHRzbGljZS5jYWxsKCB0b2tlbkNhY2hlKGtleSwgZ3JvdXBzKSwgMCApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRDb21iaW5hdG9yKCBtYXRjaGVyLCBjb21iaW5hdG9yLCBjb250ZXh0LCB4bWwgKSB7XHJcblx0dmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLFxyXG5cdFx0ZG9uZU5hbWUgPSBkb25lKys7XHJcblxyXG5cdGlmICggIW1hdGNoZXIgKSB7XHJcblx0XHQvLyBJZiB0aGVyZSBpcyBubyBtYXRjaGVyIHRvIGNoZWNrLCBjaGVjayBhZ2FpbnN0IHRoZSBjb250ZXh0XHJcblx0XHRtYXRjaGVyID0gZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdHJldHVybiBlbGVtID09PSBjb250ZXh0O1xyXG5cdFx0fTtcclxuXHR9XHJcblx0cmV0dXJuIGNvbWJpbmF0b3IuZmlyc3QgP1xyXG5cdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XHJcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoZXIoIGVsZW0gKSAmJiBlbGVtO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSA6XHJcblx0XHR4bWwgP1xyXG5cdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xyXG5cdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xyXG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0gKSApIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZWxlbTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSA6XHJcblx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHRcdHZhciBjYWNoZSxcclxuXHRcdFx0XHRcdGRpcmtleSA9IGRvbmVOYW1lICsgXCIuXCIgKyBkaXJydW5zLFxyXG5cdFx0XHRcdFx0Y2FjaGVka2V5ID0gZGlya2V5ICsgXCIuXCIgKyBjYWNoZWRydW5zO1xyXG5cdFx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XHJcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XHJcblx0XHRcdFx0XHRcdGlmICggKGNhY2hlID0gZWxlbVsgZXhwYW5kbyBdKSA9PT0gY2FjaGVka2V5ICkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBlbGVtLnNpenNldDtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdHlwZW9mIGNhY2hlID09PSBcInN0cmluZ1wiICYmIGNhY2hlLmluZGV4T2YoZGlya2V5KSA9PT0gMCApIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIGVsZW0uc2l6c2V0ICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGVsZW07XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGVsZW1bIGV4cGFuZG8gXSA9IGNhY2hlZGtleTtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0gKSApIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVsZW0uc2l6c2V0ID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBlbGVtO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRlbGVtLnNpenNldCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRNYXRjaGVyKCBoaWdoZXIsIGRlZXBlciApIHtcclxuXHRyZXR1cm4gaGlnaGVyID9cclxuXHRcdGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHR2YXIgcmVzdWx0ID0gZGVlcGVyKCBlbGVtICk7XHJcblx0XHRcdHJldHVybiByZXN1bHQgJiYgaGlnaGVyKCByZXN1bHQgPT09IHRydWUgPyBlbGVtIDogcmVzdWx0ICk7XHJcblx0XHR9IDpcclxuXHRcdGRlZXBlcjtcclxufVxyXG5cclxuLy8gW1wiVEFHXCIsIFwiPlwiLCBcIklEXCIsIFwiIFwiLCBcIkNMQVNTXCJdXHJcbmZ1bmN0aW9uIG1hdGNoZXJGcm9tVG9rZW5zKCB0b2tlbnMsIGNvbnRleHQsIHhtbCApIHtcclxuXHR2YXIgdG9rZW4sIG1hdGNoZXIsXHJcblx0XHRpID0gMDtcclxuXHJcblx0Zm9yICggOyAodG9rZW4gPSB0b2tlbnNbaV0pOyBpKysgKSB7XHJcblx0XHRpZiAoIEV4cHIucmVsYXRpdmVbIHRva2VuLnBhcnQgXSApIHtcclxuXHRcdFx0bWF0Y2hlciA9IGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIEV4cHIucmVsYXRpdmVbIHRva2VuLnBhcnQgXSwgY29udGV4dCwgeG1sICk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRtYXRjaGVyID0gYWRkTWF0Y2hlciggbWF0Y2hlciwgRXhwci5maWx0ZXJbIHRva2VuLnBhcnQgXS5hcHBseShudWxsLCB0b2tlbi5jYXB0dXJlcy5jb25jYXQoIGNvbnRleHQsIHhtbCApKSApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIG1hdGNoZXI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggbWF0Y2hlcnMgKSB7XHJcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0dmFyIG1hdGNoZXIsXHJcblx0XHRcdGogPSAwO1xyXG5cdFx0Zm9yICggOyAobWF0Y2hlciA9IG1hdGNoZXJzW2pdKTsgaisrICkge1xyXG5cdFx0XHRpZiAoIG1hdGNoZXIoZWxlbSkgKSB7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHR9O1xyXG59XHJcblxyXG5jb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHhtbCApIHtcclxuXHR2YXIgZ3JvdXAsIGksIGxlbixcclxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIGV4cGFuZG8gXVsgc2VsZWN0b3IgXTtcclxuXHJcblx0Ly8gUmV0dXJuIGEgY2FjaGVkIGdyb3VwIGZ1bmN0aW9uIGlmIGFscmVhZHkgZ2VuZXJhdGVkIChjb250ZXh0IGRlcGVuZGVudClcclxuXHRpZiAoIGNhY2hlZCAmJiBjYWNoZWQuY29udGV4dCA9PT0gY29udGV4dCApIHtcclxuXHRcdHJldHVybiBjYWNoZWQ7XHJcblx0fVxyXG5cclxuXHQvLyBHZW5lcmF0ZSBhIGZ1bmN0aW9uIG9mIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjaGVjayBlYWNoIGVsZW1lbnRcclxuXHRncm91cCA9IHRva2VuaXplKCBzZWxlY3RvciwgY29udGV4dCwgeG1sICk7XHJcblx0Zm9yICggaSA9IDAsIGxlbiA9IGdyb3VwLmxlbmd0aDsgaSA8IGxlbjsgaSsrICkge1xyXG5cdFx0Z3JvdXBbaV0gPSBtYXRjaGVyRnJvbVRva2Vucyhncm91cFtpXSwgY29udGV4dCwgeG1sKTtcclxuXHR9XHJcblxyXG5cdC8vIENhY2hlIHRoZSBjb21waWxlZCBmdW5jdGlvblxyXG5cdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGUoIHNlbGVjdG9yLCBtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoZ3JvdXApICk7XHJcblx0Y2FjaGVkLmNvbnRleHQgPSBjb250ZXh0O1xyXG5cdGNhY2hlZC5ydW5zID0gY2FjaGVkLmRpcnJ1bnMgPSAwO1xyXG5cdHJldHVybiBjYWNoZWQ7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciwgY29udGV4dHMsIHJlc3VsdHMsIHNlZWQgKSB7XHJcblx0dmFyIGkgPSAwLFxyXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xyXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xyXG5cdFx0U2l6emxlKCBzZWxlY3RvciwgY29udGV4dHNbaV0sIHJlc3VsdHMsIHNlZWQgKTtcclxuXHR9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhbmRsZVBPU0dyb3VwKCBzZWxlY3RvciwgcG9zZmlsdGVyLCBhcmd1bWVudCwgY29udGV4dHMsIHNlZWQsIG5vdCApIHtcclxuXHR2YXIgcmVzdWx0cyxcclxuXHRcdGZuID0gRXhwci5zZXRGaWx0ZXJzWyBwb3NmaWx0ZXIudG9Mb3dlckNhc2UoKSBdO1xyXG5cclxuXHRpZiAoICFmbiApIHtcclxuXHRcdFNpenpsZS5lcnJvciggcG9zZmlsdGVyICk7XHJcblx0fVxyXG5cclxuXHRpZiAoIHNlbGVjdG9yIHx8ICEocmVzdWx0cyA9IHNlZWQpICkge1xyXG5cdFx0bXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IgfHwgXCIqXCIsIGNvbnRleHRzLCAocmVzdWx0cyA9IFtdKSwgc2VlZCApO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIHJlc3VsdHMubGVuZ3RoID4gMCA/IGZuKCByZXN1bHRzLCBhcmd1bWVudCwgbm90ICkgOiBbXTtcclxufVxyXG5cclxuZnVuY3Rpb24gaGFuZGxlUE9TKCBncm91cHMsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XHJcblx0dmFyIGdyb3VwLCBwYXJ0LCBqLCBncm91cExlbiwgdG9rZW4sIHNlbGVjdG9yLFxyXG5cdFx0YW5jaG9yLCBlbGVtZW50cywgbWF0Y2gsIG1hdGNoZWQsXHJcblx0XHRsYXN0SW5kZXgsIGN1cnJlbnRDb250ZXh0cywgbm90LFxyXG5cdFx0aSA9IDAsXHJcblx0XHRsZW4gPSBncm91cHMubGVuZ3RoLFxyXG5cdFx0cnBvcyA9IG1hdGNoRXhwcltcIlBPU1wiXSxcclxuXHRcdC8vIFRoaXMgaXMgZ2VuZXJhdGVkIGhlcmUgaW4gY2FzZSBtYXRjaEV4cHJbXCJQT1NcIl0gaXMgZXh0ZW5kZWRcclxuXHRcdHJwb3Nncm91cHMgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHJwb3Muc291cmNlICsgXCIoPyFcIiArIHdoaXRlc3BhY2UgKyBcIilcIiwgXCJpXCIgKSxcclxuXHRcdC8vIFRoaXMgaXMgZm9yIG1ha2luZyBzdXJlIG5vbi1wYXJ0aWNpcGF0aW5nXHJcblx0XHQvLyBtYXRjaGluZyBncm91cHMgYXJlIHJlcHJlc2VudGVkIGNyb3NzLWJyb3dzZXIgKElFNi04KVxyXG5cdFx0c2V0VW5kZWZpbmVkID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciBpID0gMSxcclxuXHRcdFx0XHRsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcclxuXHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XHJcblx0XHRcdFx0aWYgKCBhcmd1bWVudHNbaV0gPT09IHVuZGVmaW5lZCApIHtcclxuXHRcdFx0XHRcdG1hdGNoW2ldID0gdW5kZWZpbmVkO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHJcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XHJcblx0XHRncm91cCA9IGdyb3Vwc1tpXTtcclxuXHRcdHBhcnQgPSBcIlwiO1xyXG5cdFx0ZWxlbWVudHMgPSBzZWVkO1xyXG5cdFx0Zm9yICggaiA9IDAsIGdyb3VwTGVuID0gZ3JvdXAubGVuZ3RoOyBqIDwgZ3JvdXBMZW47IGorKyApIHtcclxuXHRcdFx0dG9rZW4gPSBncm91cFtqXTtcclxuXHRcdFx0c2VsZWN0b3IgPSB0b2tlbi5zdHJpbmc7XHJcblx0XHRcdGlmICggdG9rZW4ucGFydCA9PT0gXCJQU0VVRE9cIiApIHtcclxuXHRcdFx0XHQvLyBSZXNldCByZWdleCBpbmRleCB0byAwXHJcblx0XHRcdFx0cnBvcy5leGVjKFwiXCIpO1xyXG5cdFx0XHRcdGFuY2hvciA9IDA7XHJcblx0XHRcdFx0d2hpbGUgKCAobWF0Y2ggPSBycG9zLmV4ZWMoIHNlbGVjdG9yICkpICkge1xyXG5cdFx0XHRcdFx0bWF0Y2hlZCA9IHRydWU7XHJcblx0XHRcdFx0XHRsYXN0SW5kZXggPSBycG9zLmxhc3RJbmRleCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoO1xyXG5cdFx0XHRcdFx0aWYgKCBsYXN0SW5kZXggPiBhbmNob3IgKSB7XHJcblx0XHRcdFx0XHRcdHBhcnQgKz0gc2VsZWN0b3Iuc2xpY2UoIGFuY2hvciwgbWF0Y2guaW5kZXggKTtcclxuXHRcdFx0XHRcdFx0YW5jaG9yID0gbGFzdEluZGV4O1xyXG5cdFx0XHRcdFx0XHRjdXJyZW50Q29udGV4dHMgPSBbIGNvbnRleHQgXTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggcmNvbWJpbmF0b3JzLnRlc3QocGFydCkgKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCBlbGVtZW50cyApIHtcclxuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0cyA9IGVsZW1lbnRzO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRlbGVtZW50cyA9IHNlZWQ7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmICggKG5vdCA9IHJlbmRzV2l0aE5vdC50ZXN0KCBwYXJ0ICkpICkge1xyXG5cdFx0XHRcdFx0XHRcdHBhcnQgPSBwYXJ0LnNsaWNlKCAwLCAtNSApLnJlcGxhY2UoIHJjb21iaW5hdG9ycywgXCIkJipcIiApO1xyXG5cdFx0XHRcdFx0XHRcdGFuY2hvcisrO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoLmxlbmd0aCA+IDEgKSB7XHJcblx0XHRcdFx0XHRcdFx0bWF0Y2hbMF0ucmVwbGFjZSggcnBvc2dyb3Vwcywgc2V0VW5kZWZpbmVkICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0ZWxlbWVudHMgPSBoYW5kbGVQT1NHcm91cCggcGFydCwgbWF0Y2hbMV0sIG1hdGNoWzJdLCBjdXJyZW50Q29udGV4dHMsIGVsZW1lbnRzLCBub3QgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHBhcnQgPSBcIlwiO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggIW1hdGNoZWQgKSB7XHJcblx0XHRcdFx0cGFydCArPSBzZWxlY3RvcjtcclxuXHRcdFx0fVxyXG5cdFx0XHRtYXRjaGVkID0gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBwYXJ0ICkge1xyXG5cdFx0XHRpZiAoIHJjb21iaW5hdG9ycy50ZXN0KHBhcnQpICkge1xyXG5cdFx0XHRcdG11bHRpcGxlQ29udGV4dHMoIHBhcnQsIGVsZW1lbnRzIHx8IFsgY29udGV4dCBdLCByZXN1bHRzLCBzZWVkICk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0U2l6emxlKCBwYXJ0LCBjb250ZXh0LCByZXN1bHRzLCBzZWVkID8gc2VlZC5jb25jYXQoZWxlbWVudHMpIDogZWxlbWVudHMgKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgZWxlbWVudHMgKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIERvIG5vdCBzb3J0IGlmIHRoaXMgaXMgYSBzaW5nbGUgZmlsdGVyXHJcblx0cmV0dXJuIGxlbiA9PT0gMSA/IHJlc3VsdHMgOiBTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZWxlY3QoIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkLCB4bWwgKSB7XHJcblx0Ly8gUmVtb3ZlIGV4Y2Vzc2l2ZSB3aGl0ZXNwYWNlXHJcblx0c2VsZWN0b3IgPSBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICk7XHJcblx0dmFyIGVsZW1lbnRzLCBtYXRjaGVyLCBjYWNoZWQsIGVsZW0sXHJcblx0XHRpLCB0b2tlbnMsIHRva2VuLCBsYXN0VG9rZW4sIGZpbmRDb250ZXh0LCB0eXBlLFxyXG5cdFx0bWF0Y2ggPSB0b2tlbml6ZSggc2VsZWN0b3IsIGNvbnRleHQsIHhtbCApLFxyXG5cdFx0Y29udGV4dE5vZGVUeXBlID0gY29udGV4dC5ub2RlVHlwZTtcclxuXHJcblx0Ly8gUE9TIGhhbmRsaW5nXHJcblx0aWYgKCBtYXRjaEV4cHJbXCJQT1NcIl0udGVzdChzZWxlY3RvcikgKSB7XHJcblx0XHRyZXR1cm4gaGFuZGxlUE9TKCBtYXRjaCwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApO1xyXG5cdH1cclxuXHJcblx0aWYgKCBzZWVkICkge1xyXG5cdFx0ZWxlbWVudHMgPSBzbGljZS5jYWxsKCBzZWVkLCAwICk7XHJcblxyXG5cdC8vIFRvIG1haW50YWluIGRvY3VtZW50IG9yZGVyLCBvbmx5IG5hcnJvdyB0aGVcclxuXHQvLyBzZXQgaWYgdGhlcmUgaXMgb25lIGdyb3VwXHJcblx0fSBlbHNlIGlmICggbWF0Y2gubGVuZ3RoID09PSAxICkge1xyXG5cclxuXHRcdC8vIFRha2UgYSBzaG9ydGN1dCBhbmQgc2V0IHRoZSBjb250ZXh0IGlmIHRoZSByb290IHNlbGVjdG9yIGlzIGFuIElEXHJcblx0XHRpZiAoICh0b2tlbnMgPSBzbGljZS5jYWxsKCBtYXRjaFswXSwgMCApKS5sZW5ndGggPiAyICYmXHJcblx0XHRcdFx0KHRva2VuID0gdG9rZW5zWzBdKS5wYXJ0ID09PSBcIklEXCIgJiZcclxuXHRcdFx0XHRjb250ZXh0Tm9kZVR5cGUgPT09IDkgJiYgIXhtbCAmJlxyXG5cdFx0XHRcdEV4cHIucmVsYXRpdmVbIHRva2Vuc1sxXS5wYXJ0IF0gKSB7XHJcblxyXG5cdFx0XHRjb250ZXh0ID0gRXhwci5maW5kW1wiSURcIl0oIHRva2VuLmNhcHR1cmVzWzBdLnJlcGxhY2UoIHJiYWNrc2xhc2gsIFwiXCIgKSwgY29udGV4dCwgeG1sIClbMF07XHJcblx0XHRcdGlmICggIWNvbnRleHQgKSB7XHJcblx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnN0cmluZy5sZW5ndGggKTtcclxuXHRcdH1cclxuXHJcblx0XHRmaW5kQ29udGV4dCA9ICggKG1hdGNoID0gcnNpYmxpbmcuZXhlYyggdG9rZW5zWzBdLnN0cmluZyApKSAmJiAhbWF0Y2guaW5kZXggJiYgY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dDtcclxuXHJcblx0XHQvLyBSZWR1Y2UgdGhlIHNldCBpZiBwb3NzaWJsZVxyXG5cdFx0bGFzdFRva2VuID0gXCJcIjtcclxuXHRcdGZvciAoIGkgPSB0b2tlbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKSB7XHJcblx0XHRcdHRva2VuID0gdG9rZW5zW2ldO1xyXG5cdFx0XHR0eXBlID0gdG9rZW4ucGFydDtcclxuXHRcdFx0bGFzdFRva2VuID0gdG9rZW4uc3RyaW5nICsgbGFzdFRva2VuO1xyXG5cdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbIHR5cGUgXSApIHtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIEV4cHIub3JkZXIudGVzdCh0eXBlKSApIHtcclxuXHRcdFx0XHRlbGVtZW50cyA9IEV4cHIuZmluZFsgdHlwZSBdKCB0b2tlbi5jYXB0dXJlc1swXS5yZXBsYWNlKCByYmFja3NsYXNoLCBcIlwiICksIGZpbmRDb250ZXh0LCB4bWwgKTtcclxuXHRcdFx0XHRpZiAoIGVsZW1lbnRzID09IG51bGwgKSB7XHJcblx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zbGljZSggMCwgc2VsZWN0b3IubGVuZ3RoIC0gbGFzdFRva2VuLmxlbmd0aCApICtcclxuXHRcdFx0XHRcdFx0bGFzdFRva2VuLnJlcGxhY2UoIG1hdGNoRXhwclsgdHlwZSBdLCBcIlwiICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhc2VsZWN0b3IgKSB7XHJcblx0XHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNsaWNlLmNhbGwoZWxlbWVudHMsIDApICk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyBPbmx5IGxvb3Agb3ZlciB0aGUgZ2l2ZW4gZWxlbWVudHMgb25jZVxyXG5cdGlmICggc2VsZWN0b3IgKSB7XHJcblx0XHRtYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IsIGNvbnRleHQsIHhtbCApO1xyXG5cdFx0ZGlycnVucyA9IG1hdGNoZXIuZGlycnVucysrO1xyXG5cdFx0aWYgKCBlbGVtZW50cyA9PSBudWxsICkge1xyXG5cdFx0XHRlbGVtZW50cyA9IEV4cHIuZmluZFtcIlRBR1wiXSggXCIqXCIsIChyc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIGNvbnRleHQucGFyZW50Tm9kZSkgfHwgY29udGV4dCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGkgPSAwOyAoZWxlbSA9IGVsZW1lbnRzW2ldKTsgaSsrICkge1xyXG5cdFx0XHRjYWNoZWRydW5zID0gbWF0Y2hlci5ydW5zKys7XHJcblx0XHRcdGlmICggbWF0Y2hlcihlbGVtKSApIHtcclxuXHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHJlc3VsdHM7XHJcbn1cclxuXHJcbmlmICggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApIHtcclxuXHQoZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgZGlzY29ubmVjdGVkTWF0Y2gsXHJcblx0XHRcdG9sZFNlbGVjdCA9IHNlbGVjdCxcclxuXHRcdFx0cmVzY2FwZSA9IC8nfFxcXFwvZyxcclxuXHRcdFx0cmF0dHJpYnV0ZVF1b3RlcyA9IC9cXD1bXFx4MjBcXHRcXHJcXG5cXGZdKihbXidcIlxcXV0qKVtcXHgyMFxcdFxcclxcblxcZl0qXFxdL2csXHJcblx0XHRcdHJidWdneVFTQSA9IFtdLFxyXG5cdFx0XHQvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KVxyXG5cdFx0XHQvLyBBIHN1cHBvcnQgdGVzdCB3b3VsZCByZXF1aXJlIHRvbyBtdWNoIGNvZGUgKHdvdWxkIGluY2x1ZGUgZG9jdW1lbnQgcmVhZHkpXHJcblx0XHRcdC8vIGp1c3Qgc2tpcCBtYXRjaGVzU2VsZWN0b3IgZm9yIDphY3RpdmVcclxuXHRcdFx0cmJ1Z2d5TWF0Y2hlcyA9IFtcIjphY3RpdmVcIl0sXHJcblx0XHRcdG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXNTZWxlY3RvciB8fFxyXG5cdFx0XHRcdGRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XHJcblx0XHRcdFx0ZG9jRWxlbS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHxcclxuXHRcdFx0XHRkb2NFbGVtLm9NYXRjaGVzU2VsZWN0b3IgfHxcclxuXHRcdFx0XHRkb2NFbGVtLm1zTWF0Y2hlc1NlbGVjdG9yO1xyXG5cclxuXHRcdC8vIEJ1aWxkIFFTQSByZWdleFxyXG5cdFx0Ly8gUmVnZXggc3RyYXRlZ3kgYWRvcHRlZCBmcm9tIERpZWdvIFBlcmluaVxyXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XHJcblx0XHRcdC8vIFNlbGVjdCBpcyBzZXQgdG8gZW1wdHkgc3RyaW5nIG9uIHB1cnBvc2VcclxuXHRcdFx0Ly8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWN0bHlcclxuXHRcdFx0Ly8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsXHJcblx0XHRcdC8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoXHJcblx0XHRcdC8vIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzU5XHJcblx0XHRcdGRpdi5pbm5lckhUTUwgPSBcIjxzZWxlY3Q+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD5cIjtcclxuXHJcblx0XHRcdC8vIElFOCAtIFNvbWUgYm9vbGVhbiBhdHRyaWJ1dGVzIGFyZSBub3QgdHJlYXRlZCBjb3JyZWN0bHlcclxuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbc2VsZWN0ZWRdXCIpLmxlbmd0aCApIHtcclxuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKig/OmNoZWNrZWR8ZGlzYWJsZWR8aXNtYXB8bXVsdGlwbGV8cmVhZG9ubHl8c2VsZWN0ZWR8dmFsdWUpXCIgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gV2Via2l0L09wZXJhIC0gOmNoZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxlbWVudHNcclxuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcclxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIChkbyBub3QgcHV0IHRlc3RzIGFmdGVyIHRoaXMgb25lKVxyXG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbChcIjpjaGVja2VkXCIpLmxlbmd0aCApIHtcclxuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIjpjaGVja2VkXCIpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHRhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcclxuXHJcblx0XHRcdC8vIE9wZXJhIDEwLTEyL0lFOSAtIF49ICQ9ICo9IGFuZCBlbXB0eSB2YWx1ZXNcclxuXHRcdFx0Ly8gU2hvdWxkIG5vdCBzZWxlY3QgYW55dGhpbmdcclxuXHRcdFx0ZGl2LmlubmVySFRNTCA9IFwiPHAgdGVzdD0nJz48L3A+XCI7XHJcblx0XHRcdGlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbdGVzdF49JyddXCIpLmxlbmd0aCApIHtcclxuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJbKl4kXT1cIiArIHdoaXRlc3BhY2UgKyBcIiooPzpcXFwiXFxcInwnJylcIiApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKVxyXG5cdFx0XHQvLyBJRTggdGhyb3dzIGVycm9yIGhlcmUgKGRvIG5vdCBwdXQgdGVzdHMgYWZ0ZXIgdGhpcyBvbmUpXHJcblx0XHRcdGRpdi5pbm5lckhUTUwgPSBcIjxpbnB1dCB0eXBlPSdoaWRkZW4nLz5cIjtcclxuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCI6ZW5hYmxlZFwiKS5sZW5ndGggKSB7XHJcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCI6ZW5hYmxlZFwiLCBcIjpkaXNhYmxlZFwiKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0cmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbihcInxcIikgKTtcclxuXHJcblx0XHRzZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQsIHhtbCApIHtcclxuXHRcdFx0Ly8gT25seSB1c2UgcXVlcnlTZWxlY3RvckFsbCB3aGVuIG5vdCBmaWx0ZXJpbmcsXHJcblx0XHRcdC8vIHdoZW4gdGhpcyBpcyBub3QgeG1sLFxyXG5cdFx0XHQvLyBhbmQgd2hlbiBubyBRU0EgYnVncyBhcHBseVxyXG5cdFx0XHRpZiAoICFzZWVkICYmICF4bWwgJiYgKCFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBzZWxlY3RvciApKSApIHtcclxuXHRcdFx0XHRpZiAoIGNvbnRleHQubm9kZVR5cGUgPT09IDkgKSB7XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzbGljZS5jYWxsKGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggc2VsZWN0b3IgKSwgMCkgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XHJcblx0XHRcdFx0XHR9IGNhdGNoKHFzYUVycm9yKSB7fVxyXG5cdFx0XHRcdC8vIHFTQSB3b3JrcyBzdHJhbmdlbHkgb24gRWxlbWVudC1yb290ZWQgcXVlcmllc1xyXG5cdFx0XHRcdC8vIFdlIGNhbiB3b3JrIGFyb3VuZCB0aGlzIGJ5IHNwZWNpZnlpbmcgYW4gZXh0cmEgSUQgb24gdGhlIHJvb3RcclxuXHRcdFx0XHQvLyBhbmQgd29ya2luZyB1cCBmcm9tIHRoZXJlIChUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhlIHRlY2huaXF1ZSlcclxuXHRcdFx0XHQvLyBJRSA4IGRvZXNuJ3Qgd29yayBvbiBvYmplY3QgZWxlbWVudHNcclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBjb250ZXh0Lm5vZGVUeXBlID09PSAxICYmIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJvYmplY3RcIiApIHtcclxuXHRcdFx0XHRcdHZhciBncm91cHMsIGksIGxlbixcclxuXHRcdFx0XHRcdFx0b2xkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoXCJpZFwiKSxcclxuXHRcdFx0XHRcdFx0bmlkID0gb2xkIHx8IGV4cGFuZG8sXHJcblx0XHRcdFx0XHRcdG5ld0NvbnRleHQgPSByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIGNvbnRleHQucGFyZW50Tm9kZSB8fCBjb250ZXh0O1xyXG5cclxuXHRcdFx0XHRcdGlmICggb2xkICkge1xyXG5cdFx0XHRcdFx0XHRuaWQgPSBuaWQucmVwbGFjZSggcmVzY2FwZSwgXCJcXFxcJCZcIiApO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRBdHRyaWJ1dGUoIFwiaWRcIiwgbmlkICk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Z3JvdXBzID0gdG9rZW5pemUoc2VsZWN0b3IsIGNvbnRleHQsIHhtbCk7XHJcblx0XHRcdFx0XHQvLyBUcmFpbGluZyBzcGFjZSBpcyB1bm5lY2Vzc2FyeVxyXG5cdFx0XHRcdFx0Ly8gVGhlcmUgaXMgYWx3YXlzIGEgY29udGV4dCBjaGVja1xyXG5cdFx0XHRcdFx0bmlkID0gXCJbaWQ9J1wiICsgbmlkICsgXCInXVwiO1xyXG5cdFx0XHRcdFx0Zm9yICggaSA9IDAsIGxlbiA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsZW47IGkrKyApIHtcclxuXHRcdFx0XHRcdFx0Z3JvdXBzW2ldID0gbmlkICsgZ3JvdXBzW2ldLnNlbGVjdG9yO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgc2xpY2UuY2FsbCggbmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKFxyXG5cdFx0XHRcdFx0XHRcdGdyb3Vwcy5qb2luKFwiLFwiKVxyXG5cdFx0XHRcdFx0XHQpLCAwICkgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XHJcblx0XHRcdFx0XHR9IGNhdGNoKHFzYUVycm9yKSB7XHJcblx0XHRcdFx0XHR9IGZpbmFsbHkge1xyXG5cdFx0XHRcdFx0XHRpZiAoICFvbGQgKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoXCJpZFwiKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIG9sZFNlbGVjdCggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQsIHhtbCApO1xyXG5cdFx0fTtcclxuXHJcblx0XHRpZiAoIG1hdGNoZXMgKSB7XHJcblx0XHRcdGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xyXG5cdFx0XHRcdC8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvclxyXG5cdFx0XHRcdC8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUgKElFIDkpXHJcblx0XHRcdFx0ZGlzY29ubmVjdGVkTWF0Y2ggPSBtYXRjaGVzLmNhbGwoIGRpdiwgXCJkaXZcIiApO1xyXG5cclxuXHRcdFx0XHQvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uXHJcblx0XHRcdFx0Ly8gR2Vja28gZG9lcyBub3QgZXJyb3IsIHJldHVybnMgZmFsc2UgaW5zdGVhZFxyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRtYXRjaGVzLmNhbGwoIGRpdiwgXCJbdGVzdCE9JyddOnNpenpsZVwiICk7XHJcblx0XHRcdFx0XHRyYnVnZ3lNYXRjaGVzLnB1c2goIG1hdGNoRXhwcltcIlBTRVVET1wiXS5zb3VyY2UsIG1hdGNoRXhwcltcIlBPU1wiXS5zb3VyY2UsIFwiIT1cIiApO1xyXG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge31cclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQvLyByYnVnZ3lNYXRjaGVzIGFsd2F5cyBjb250YWlucyA6YWN0aXZlLCBzbyBubyBuZWVkIGZvciBhIGxlbmd0aCBjaGVja1xyXG5cdFx0XHRyYnVnZ3lNYXRjaGVzID0gLyogcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgKi8gbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKFwifFwiKSApO1xyXG5cclxuXHRcdFx0U2l6emxlLm1hdGNoZXNTZWxlY3RvciA9IGZ1bmN0aW9uKCBlbGVtLCBleHByICkge1xyXG5cdFx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IGF0dHJpYnV0ZSBzZWxlY3RvcnMgYXJlIHF1b3RlZFxyXG5cdFx0XHRcdGV4cHIgPSBleHByLnJlcGxhY2UoIHJhdHRyaWJ1dGVRdW90ZXMsIFwiPSckMSddXCIgKTtcclxuXHJcblx0XHRcdFx0Ly8gcmJ1Z2d5TWF0Y2hlcyBhbHdheXMgY29udGFpbnMgOmFjdGl2ZSwgc28gbm8gbmVlZCBmb3IgYW4gZXhpc3RlbmNlIGNoZWNrXHJcblx0XHRcdFx0aWYgKCAhaXNYTUwoIGVsZW0gKSAmJiAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgJiYgKCFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkpICkge1xyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0dmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApO1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2Rlc1xyXG5cdFx0XHRcdFx0XHRpZiAoIHJldCB8fCBkaXNjb25uZWN0ZWRNYXRjaCB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnRcclxuXHRcdFx0XHRcdFx0XHRcdC8vIGZyYWdtZW50IGluIElFIDlcclxuXHRcdFx0XHRcdFx0XHRcdGVsZW0uZG9jdW1lbnQgJiYgZWxlbS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJldDtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBjYXRjaChlKSB7fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cdH0pKCk7XHJcbn1cclxuXHJcbi8vIERlcHJlY2F0ZWRcclxuRXhwci5zZXRGaWx0ZXJzW1wibnRoXCJdID0gRXhwci5zZXRGaWx0ZXJzW1wiZXFcIl07XHJcblxyXG4vLyBCYWNrLWNvbXBhdFxyXG5FeHByLmZpbHRlcnMgPSBFeHByLnBzZXVkb3M7XHJcblxyXG4vLyBPdmVycmlkZSBzaXp6bGUgYXR0cmlidXRlIHJldHJpZXZhbFxyXG5TaXp6bGUuYXR0ciA9IGpRdWVyeS5hdHRyO1xyXG5qUXVlcnkuZmluZCA9IFNpenpsZTtcclxualF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzO1xyXG5qUXVlcnkuZXhwcltcIjpcIl0gPSBqUXVlcnkuZXhwci5wc2V1ZG9zO1xyXG5qUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7XHJcbmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7XHJcbmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDtcclxualF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zO1xyXG5cclxuXHJcbn0pKCB3aW5kb3cgKTtcclxudmFyIHJ1bnRpbCA9IC9VbnRpbCQvLFxyXG5cdHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLFxyXG5cdGlzU2ltcGxlID0gL14uW146I1xcW1xcLixdKiQvLFxyXG5cdHJuZWVkc0NvbnRleHQgPSBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQsXHJcblx0Ly8gbWV0aG9kcyBndWFyYW50ZWVkIHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3RhcnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXRcclxuXHRndWFyYW50ZWVkVW5pcXVlID0ge1xyXG5cdFx0Y2hpbGRyZW46IHRydWUsXHJcblx0XHRjb250ZW50czogdHJ1ZSxcclxuXHRcdG5leHQ6IHRydWUsXHJcblx0XHRwcmV2OiB0cnVlXHJcblx0fTtcclxuXHJcbmpRdWVyeS5mbi5leHRlbmQoe1xyXG5cdGZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcclxuXHRcdHZhciBpLCBsLCBsZW5ndGgsIG4sIHIsIHJldCxcclxuXHRcdFx0c2VsZiA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XHJcblx0XHRcdHJldHVybiBqUXVlcnkoIHNlbGVjdG9yICkuZmlsdGVyKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gc2VsZi5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XHJcblx0XHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0ID0gdGhpcy5wdXNoU3RhY2soIFwiXCIsIFwiZmluZFwiLCBzZWxlY3RvciApO1xyXG5cclxuXHRcdGZvciAoIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XHJcblx0XHRcdGxlbmd0aCA9IHJldC5sZW5ndGg7XHJcblx0XHRcdGpRdWVyeS5maW5kKCBzZWxlY3RvciwgdGhpc1tpXSwgcmV0ICk7XHJcblxyXG5cdFx0XHRpZiAoIGkgPiAwICkge1xyXG5cdFx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXN1bHRzIGFyZSB1bmlxdWVcclxuXHRcdFx0XHRmb3IgKCBuID0gbGVuZ3RoOyBuIDwgcmV0Lmxlbmd0aDsgbisrICkge1xyXG5cdFx0XHRcdFx0Zm9yICggciA9IDA7IHIgPCBsZW5ndGg7IHIrKyApIHtcclxuXHRcdFx0XHRcdFx0aWYgKCByZXRbcl0gPT09IHJldFtuXSApIHtcclxuXHRcdFx0XHRcdFx0XHRyZXQuc3BsaWNlKG4tLSwgMSk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmV0O1xyXG5cdH0sXHJcblxyXG5cdGhhczogZnVuY3Rpb24oIHRhcmdldCApIHtcclxuXHRcdHZhciBpLFxyXG5cdFx0XHR0YXJnZXRzID0galF1ZXJ5KCB0YXJnZXQsIHRoaXMgKSxcclxuXHRcdFx0bGVuID0gdGFyZ2V0cy5sZW5ndGg7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xyXG5cdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzW2ldICkgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH0sXHJcblxyXG5cdG5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xyXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3codGhpcywgc2VsZWN0b3IsIGZhbHNlKSwgXCJub3RcIiwgc2VsZWN0b3IpO1xyXG5cdH0sXHJcblxyXG5cdGZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xyXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3codGhpcywgc2VsZWN0b3IsIHRydWUpLCBcImZpbHRlclwiLCBzZWxlY3RvciApO1xyXG5cdH0sXHJcblxyXG5cdGlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XHJcblx0XHRyZXR1cm4gISFzZWxlY3RvciAmJiAoXHJcblx0XHRcdHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiA/XHJcblx0XHRcdFx0Ly8gSWYgdGhpcyBpcyBhIHBvc2l0aW9uYWwvcmVsYXRpdmUgc2VsZWN0b3IsIGNoZWNrIG1lbWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNldFxyXG5cdFx0XHRcdC8vIHNvICQoXCJwOmZpcnN0XCIpLmlzKFwicDpsYXN0XCIpIHdvbid0IHJldHVybiB0cnVlIGZvciBhIGRvYyB3aXRoIHR3byBcInBcIi5cclxuXHRcdFx0XHRybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgP1xyXG5cdFx0XHRcdFx0alF1ZXJ5KCBzZWxlY3RvciwgdGhpcy5jb250ZXh0ICkuaW5kZXgoIHRoaXNbMF0gKSA+PSAwIDpcclxuXHRcdFx0XHRcdGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCB0aGlzICkubGVuZ3RoID4gMCA6XHJcblx0XHRcdFx0dGhpcy5maWx0ZXIoIHNlbGVjdG9yICkubGVuZ3RoID4gMCApO1xyXG5cdH0sXHJcblxyXG5cdGNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7XHJcblx0XHR2YXIgY3VyLFxyXG5cdFx0XHRpID0gMCxcclxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoLFxyXG5cdFx0XHRyZXQgPSBbXSxcclxuXHRcdFx0cG9zID0gcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvcnMgKSB8fCB0eXBlb2Ygc2VsZWN0b3JzICE9PSBcInN0cmluZ1wiID9cclxuXHRcdFx0XHRqUXVlcnkoIHNlbGVjdG9ycywgY29udGV4dCB8fCB0aGlzLmNvbnRleHQgKSA6XHJcblx0XHRcdFx0MDtcclxuXHJcblx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XHJcblx0XHRcdGN1ciA9IHRoaXNbaV07XHJcblxyXG5cdFx0XHR3aGlsZSAoIGN1ciAmJiBjdXIub3duZXJEb2N1bWVudCAmJiBjdXIgIT09IGNvbnRleHQgJiYgY3VyLm5vZGVUeXBlICE9PSAxMSApIHtcclxuXHRcdFx0XHRpZiAoIHBvcyA/IHBvcy5pbmRleChjdXIpID4gLTEgOiBqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoY3VyLCBzZWxlY3RvcnMpICkge1xyXG5cdFx0XHRcdFx0cmV0LnB1c2goIGN1ciApO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGN1ciA9IGN1ci5wYXJlbnROb2RlO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0ID0gcmV0Lmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlKCByZXQgKSA6IHJldDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgXCJjbG9zZXN0XCIsIHNlbGVjdG9ycyApO1xyXG5cdH0sXHJcblxyXG5cdC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW5cclxuXHQvLyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHNcclxuXHRpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblxyXG5cdFx0Ly8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnRcclxuXHRcdGlmICggIWVsZW0gKSB7XHJcblx0XHRcdHJldHVybiAoIHRoaXNbMF0gJiYgdGhpc1swXS5wYXJlbnROb2RlICkgPyB0aGlzLnByZXZBbGwoKS5sZW5ndGggOiAtMTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBpbmRleCBpbiBzZWxlY3RvclxyXG5cdFx0aWYgKCB0eXBlb2YgZWxlbSA9PT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0cmV0dXJuIGpRdWVyeS5pbkFycmF5KCB0aGlzWzBdLCBqUXVlcnkoIGVsZW0gKSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIExvY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudFxyXG5cdFx0cmV0dXJuIGpRdWVyeS5pbkFycmF5KFxyXG5cdFx0XHQvLyBJZiBpdCByZWNlaXZlcyBhIGpRdWVyeSBvYmplY3QsIHRoZSBmaXJzdCBlbGVtZW50IGlzIHVzZWRcclxuXHRcdFx0ZWxlbS5qcXVlcnkgPyBlbGVtWzBdIDogZWxlbSwgdGhpcyApO1xyXG5cdH0sXHJcblxyXG5cdGFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xyXG5cdFx0dmFyIHNldCA9IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiA/XHJcblx0XHRcdFx0alF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApIDpcclxuXHRcdFx0XHRqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciAmJiBzZWxlY3Rvci5ub2RlVHlwZSA/IFsgc2VsZWN0b3IgXSA6IHNlbGVjdG9yICksXHJcblx0XHRcdGFsbCA9IGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgc2V0ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBpc0Rpc2Nvbm5lY3RlZCggc2V0WzBdICkgfHwgaXNEaXNjb25uZWN0ZWQoIGFsbFswXSApID9cclxuXHRcdFx0YWxsIDpcclxuXHRcdFx0alF1ZXJ5LnVuaXF1ZSggYWxsICkgKTtcclxuXHR9LFxyXG5cclxuXHRhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgP1xyXG5cdFx0XHR0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZPYmplY3QuZmlsdGVyKHNlbGVjdG9yKVxyXG5cdFx0KTtcclxuXHR9XHJcbn0pO1xyXG5cclxualF1ZXJ5LmZuLmFuZFNlbGYgPSBqUXVlcnkuZm4uYWRkQmFjaztcclxuXHJcbi8vIEEgcGFpbmZ1bGx5IHNpbXBsZSBjaGVjayB0byBzZWUgaWYgYW4gZWxlbWVudCBpcyBkaXNjb25uZWN0ZWRcclxuLy8gZnJvbSBhIGRvY3VtZW50IChzaG91bGQgYmUgaW1wcm92ZWQsIHdoZXJlIGZlYXNpYmxlKS5cclxuZnVuY3Rpb24gaXNEaXNjb25uZWN0ZWQoIG5vZGUgKSB7XHJcblx0cmV0dXJuICFub2RlIHx8ICFub2RlLnBhcmVudE5vZGUgfHwgbm9kZS5wYXJlbnROb2RlLm5vZGVUeXBlID09PSAxMTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7XHJcblx0ZG8ge1xyXG5cdFx0Y3VyID0gY3VyWyBkaXIgXTtcclxuXHR9IHdoaWxlICggY3VyICYmIGN1ci5ub2RlVHlwZSAhPT0gMSApO1xyXG5cclxuXHRyZXR1cm4gY3VyO1xyXG59XHJcblxyXG5qUXVlcnkuZWFjaCh7XHJcblx0cGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XHJcblx0XHRyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsO1xyXG5cdH0sXHJcblx0cGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIgKTtcclxuXHR9LFxyXG5cdHBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiLCB1bnRpbCApO1xyXG5cdH0sXHJcblx0bmV4dDogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XHJcblx0fSxcclxuXHRwcmV2OiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XHJcblx0fSxcclxuXHRuZXh0QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcclxuXHR9LFxyXG5cdHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcclxuXHR9LFxyXG5cdG5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiwgdW50aWwgKTtcclxuXHR9LFxyXG5cdHByZXZVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIsIHVudGlsICk7XHJcblx0fSxcclxuXHRzaWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5LnNpYmxpbmcoICggZWxlbS5wYXJlbnROb2RlIHx8IHt9ICkuZmlyc3RDaGlsZCwgZWxlbSApO1xyXG5cdH0sXHJcblx0Y2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5zaWJsaW5nKCBlbGVtLmZpcnN0Q2hpbGQgKTtcclxuXHR9LFxyXG5cdGNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdHJldHVybiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sIFwiaWZyYW1lXCIgKSA/XHJcblx0XHRcdGVsZW0uY29udGVudERvY3VtZW50IHx8IGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudCA6XHJcblx0XHRcdGpRdWVyeS5tZXJnZSggW10sIGVsZW0uY2hpbGROb2RlcyApO1xyXG5cdH1cclxufSwgZnVuY3Rpb24oIG5hbWUsIGZuICkge1xyXG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHtcclxuXHRcdHZhciByZXQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTtcclxuXHJcblx0XHRpZiAoICFydW50aWwudGVzdCggbmFtZSApICkge1xyXG5cdFx0XHRzZWxlY3RvciA9IHVudGlsO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggc2VsZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xyXG5cdFx0XHRyZXQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgcmV0ICk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0ID0gdGhpcy5sZW5ndGggPiAxICYmICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gPyBqUXVlcnkudW5pcXVlKCByZXQgKSA6IHJldDtcclxuXHJcblx0XHRpZiAoIHRoaXMubGVuZ3RoID4gMSAmJiBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkge1xyXG5cdFx0XHRyZXQgPSByZXQucmV2ZXJzZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0LCBuYW1lLCBjb3JlX3NsaWNlLmNhbGwoIGFyZ3VtZW50cyApLmpvaW4oXCIsXCIpICk7XHJcblx0fTtcclxufSk7XHJcblxyXG5qUXVlcnkuZXh0ZW5kKHtcclxuXHRmaWx0ZXI6IGZ1bmN0aW9uKCBleHByLCBlbGVtcywgbm90ICkge1xyXG5cdFx0aWYgKCBub3QgKSB7XHJcblx0XHRcdGV4cHIgPSBcIjpub3QoXCIgKyBleHByICsgXCIpXCI7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGVsZW1zLmxlbmd0aCA9PT0gMSA/XHJcblx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihlbGVtc1swXSwgZXhwcikgPyBbIGVsZW1zWzBdIF0gOiBbXSA6XHJcblx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXMoZXhwciwgZWxlbXMpO1xyXG5cdH0sXHJcblxyXG5cdGRpcjogZnVuY3Rpb24oIGVsZW0sIGRpciwgdW50aWwgKSB7XHJcblx0XHR2YXIgbWF0Y2hlZCA9IFtdLFxyXG5cdFx0XHRjdXIgPSBlbGVtWyBkaXIgXTtcclxuXHJcblx0XHR3aGlsZSAoIGN1ciAmJiBjdXIubm9kZVR5cGUgIT09IDkgJiYgKHVudGlsID09PSB1bmRlZmluZWQgfHwgY3VyLm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnkoIGN1ciApLmlzKCB1bnRpbCApKSApIHtcclxuXHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPT09IDEgKSB7XHJcblx0XHRcdFx0bWF0Y2hlZC5wdXNoKCBjdXIgKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjdXIgPSBjdXJbZGlyXTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBtYXRjaGVkO1xyXG5cdH0sXHJcblxyXG5cdHNpYmxpbmc6IGZ1bmN0aW9uKCBuLCBlbGVtICkge1xyXG5cdFx0dmFyIHIgPSBbXTtcclxuXHJcblx0XHRmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkge1xyXG5cdFx0XHRpZiAoIG4ubm9kZVR5cGUgPT09IDEgJiYgbiAhPT0gZWxlbSApIHtcclxuXHRcdFx0XHRyLnB1c2goIG4gKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByO1xyXG5cdH1cclxufSk7XHJcblxyXG4vLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdFxyXG5mdW5jdGlvbiB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZpZXIsIGtlZXAgKSB7XHJcblxyXG5cdC8vIENhbid0IHBhc3MgbnVsbCBvciB1bmRlZmluZWQgdG8gaW5kZXhPZiBpbiBGaXJlZm94IDRcclxuXHQvLyBTZXQgdG8gMCB0byBza2lwIHN0cmluZyBjaGVja1xyXG5cdHF1YWxpZmllciA9IHF1YWxpZmllciB8fCAwO1xyXG5cclxuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHtcclxuXHRcdHJldHVybiBqUXVlcnkuZ3JlcChlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XHJcblx0XHRcdHZhciByZXRWYWwgPSAhIXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICk7XHJcblx0XHRcdHJldHVybiByZXRWYWwgPT09IGtlZXA7XHJcblx0XHR9KTtcclxuXHJcblx0fSBlbHNlIGlmICggcXVhbGlmaWVyLm5vZGVUeXBlICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcclxuXHRcdFx0cmV0dXJuICggZWxlbSA9PT0gcXVhbGlmaWVyICkgPT09IGtlZXA7XHJcblx0XHR9KTtcclxuXHJcblx0fSBlbHNlIGlmICggdHlwZW9mIHF1YWxpZmllciA9PT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdHZhciBmaWx0ZXJlZCA9IGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7XHJcblx0XHR9KTtcclxuXHJcblx0XHRpZiAoIGlzU2ltcGxlLnRlc3QoIHF1YWxpZmllciApICkge1xyXG5cdFx0XHRyZXR1cm4galF1ZXJ5LmZpbHRlcihxdWFsaWZpZXIsIGZpbHRlcmVkLCAha2VlcCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRxdWFsaWZpZXIgPSBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGZpbHRlcmVkICk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4galF1ZXJ5LmdyZXAoZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xyXG5cdFx0cmV0dXJuICggalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHF1YWxpZmllciApID49IDAgKSA9PT0ga2VlcDtcclxuXHR9KTtcclxufVxyXG5mdW5jdGlvbiBjcmVhdGVTYWZlRnJhZ21lbnQoIGRvY3VtZW50ICkge1xyXG5cdHZhciBsaXN0ID0gbm9kZU5hbWVzLnNwbGl0KCBcInxcIiApLFxyXG5cdHNhZmVGcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xyXG5cclxuXHRpZiAoIHNhZmVGcmFnLmNyZWF0ZUVsZW1lbnQgKSB7XHJcblx0XHR3aGlsZSAoIGxpc3QubGVuZ3RoICkge1xyXG5cdFx0XHRzYWZlRnJhZy5jcmVhdGVFbGVtZW50KFxyXG5cdFx0XHRcdGxpc3QucG9wKClcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIHNhZmVGcmFnO1xyXG59XHJcblxyXG52YXIgbm9kZU5hbWVzID0gXCJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfFwiICtcclxuXHRcdFwiaGVhZGVyfGhncm91cHxtYXJrfG1ldGVyfG5hdnxvdXRwdXR8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRpbWV8dmlkZW9cIixcclxuXHRyaW5saW5lalF1ZXJ5ID0gLyBqUXVlcnlcXGQrPVwiKD86bnVsbHxcXGQrKVwiL2csXHJcblx0cmxlYWRpbmdXaGl0ZXNwYWNlID0gL15cXHMrLyxcclxuXHRyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXFx3Ol0rKVtePl0qKVxcLz4vZ2ksXHJcblx0cnRhZ05hbWUgPSAvPChbXFx3Ol0rKS8sXHJcblx0cnRib2R5ID0gLzx0Ym9keS9pLFxyXG5cdHJodG1sID0gLzx8JiM/XFx3KzsvLFxyXG5cdHJub0lubmVyaHRtbCA9IC88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksXHJcblx0cm5vY2FjaGUgPSAvPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLFxyXG5cdHJub3NoaW1jYWNoZSA9IG5ldyBSZWdFeHAoXCI8KD86XCIgKyBub2RlTmFtZXMgKyBcIilbXFxcXHMvPl1cIiwgXCJpXCIpLFxyXG5cdHJjaGVja2FibGVUeXBlID0gL14oPzpjaGVja2JveHxyYWRpbykkLyxcclxuXHQvLyBjaGVja2VkPVwiY2hlY2tlZFwiIG9yIGNoZWNrZWRcclxuXHRyY2hlY2tlZCA9IC9jaGVja2VkXFxzKig/OltePV18PVxccyouY2hlY2tlZC4pL2ksXHJcblx0cnNjcmlwdFR5cGUgPSAvXFwvKGphdmF8ZWNtYSlzY3JpcHQvaSxcclxuXHRyY2xlYW5TY3JpcHQgPSAvXlxccyo8ISg/OlxcW0NEQVRBXFxbfFxcLVxcLSl8W1xcXVxcLV17Mn0+XFxzKiQvZyxcclxuXHR3cmFwTWFwID0ge1xyXG5cdFx0b3B0aW9uOiBbIDEsIFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLCBcIjwvc2VsZWN0PlwiIF0sXHJcblx0XHRsZWdlbmQ6IFsgMSwgXCI8ZmllbGRzZXQ+XCIsIFwiPC9maWVsZHNldD5cIiBdLFxyXG5cdFx0dGhlYWQ6IFsgMSwgXCI8dGFibGU+XCIsIFwiPC90YWJsZT5cIiBdLFxyXG5cdFx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxyXG5cdFx0dGQ6IFsgMywgXCI8dGFibGU+PHRib2R5Pjx0cj5cIiwgXCI8L3RyPjwvdGJvZHk+PC90YWJsZT5cIiBdLFxyXG5cdFx0Y29sOiBbIDIsIFwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcclxuXHRcdGFyZWE6IFsgMSwgXCI8bWFwPlwiLCBcIjwvbWFwPlwiIF0sXHJcblx0XHRfZGVmYXVsdDogWyAwLCBcIlwiLCBcIlwiIF1cclxuXHR9LFxyXG5cdHNhZmVGcmFnbWVudCA9IGNyZWF0ZVNhZmVGcmFnbWVudCggZG9jdW1lbnQgKSxcclxuXHRmcmFnbWVudERpdiA9IHNhZmVGcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSApO1xyXG5cclxud3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xyXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xyXG53cmFwTWFwLnRoID0gd3JhcE1hcC50ZDtcclxuXHJcbi8vIElFNi04IGNhbid0IHNlcmlhbGl6ZSBsaW5rLCBzY3JpcHQsIHN0eWxlLCBvciBhbnkgaHRtbDUgKE5vU2NvcGUpIHRhZ3MsXHJcbi8vIHVubGVzcyB3cmFwcGVkIGluIGEgZGl2IHdpdGggbm9uLWJyZWFraW5nIGNoYXJhY3RlcnMgaW4gZnJvbnQgb2YgaXQuXHJcbmlmICggIWpRdWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgKSB7XHJcblx0d3JhcE1hcC5fZGVmYXVsdCA9IFsgMSwgXCJYPGRpdj5cIiwgXCI8L2Rpdj5cIiBdO1xyXG59XHJcblxyXG5qUXVlcnkuZm4uZXh0ZW5kKHtcclxuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xyXG5cdFx0XHRyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/XHJcblx0XHRcdFx0alF1ZXJ5LnRleHQoIHRoaXMgKSA6XHJcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZCggKCB0aGlzWzBdICYmIHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApLmNyZWF0ZVRleHROb2RlKCB2YWx1ZSApICk7XHJcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xyXG5cdH0sXHJcblxyXG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xyXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApICkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHtcclxuXHRcdFx0XHRqUXVlcnkodGhpcykud3JhcEFsbCggaHRtbC5jYWxsKHRoaXMsIGkpICk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpc1swXSApIHtcclxuXHRcdFx0Ly8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmRcclxuXHRcdFx0dmFyIHdyYXAgPSBqUXVlcnkoIGh0bWwsIHRoaXNbMF0ub3duZXJEb2N1bWVudCApLmVxKDApLmNsb25lKHRydWUpO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzWzBdLnBhcmVudE5vZGUgKSB7XHJcblx0XHRcdFx0d3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbMF0gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0d3JhcC5tYXAoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0dmFyIGVsZW0gPSB0aGlzO1xyXG5cclxuXHRcdFx0XHR3aGlsZSAoIGVsZW0uZmlyc3RDaGlsZCAmJiBlbGVtLmZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IDEgKSB7XHJcblx0XHRcdFx0XHRlbGVtID0gZWxlbS5maXJzdENoaWxkO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIGVsZW07XHJcblx0XHRcdH0pLmFwcGVuZCggdGhpcyApO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH0sXHJcblxyXG5cdHdyYXBJbm5lcjogZnVuY3Rpb24oIGh0bWwgKSB7XHJcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkge1xyXG5cdFx0XHRcdGpRdWVyeSh0aGlzKS53cmFwSW5uZXIoIGh0bWwuY2FsbCh0aGlzLCBpKSApO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLFxyXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xyXG5cclxuXHRcdFx0aWYgKCBjb250ZW50cy5sZW5ndGggKSB7XHJcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9LFxyXG5cclxuXHR3cmFwOiBmdW5jdGlvbiggaHRtbCApIHtcclxuXHRcdHZhciBpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHtcclxuXHRcdFx0alF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaXNGdW5jdGlvbiA/IGh0bWwuY2FsbCh0aGlzLCBpKSA6IGh0bWwgKTtcclxuXHRcdH0pO1xyXG5cdH0sXHJcblxyXG5cdHVud3JhcDogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRpZiAoICFqUXVlcnkubm9kZU5hbWUoIHRoaXMsIFwiYm9keVwiICkgKSB7XHJcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApO1xyXG5cdFx0XHR9XHJcblx0XHR9KS5lbmQoKTtcclxuXHR9LFxyXG5cclxuXHRhcHBlbmQ6IGZ1bmN0aW9uKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0cnVlLCBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExICkge1xyXG5cdFx0XHRcdHRoaXMuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fSxcclxuXHJcblx0cHJlcGVuZDogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIHRydWUsIGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgKSB7XHJcblx0XHRcdFx0dGhpcy5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMuZmlyc3RDaGlsZCApO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9LFxyXG5cclxuXHRiZWZvcmU6IGZ1bmN0aW9uKCkge1xyXG5cdFx0aWYgKCAhaXNEaXNjb25uZWN0ZWQoIHRoaXNbMF0gKSApIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCBmYWxzZSwgZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XHJcblx0XHRcdHZhciBzZXQgPSBqUXVlcnkuY2xlYW4oIGFyZ3VtZW50cyApO1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tZXJnZSggc2V0LCB0aGlzICksIFwiYmVmb3JlXCIsIHRoaXMuc2VsZWN0b3IgKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XHJcblx0XHRpZiAoICFpc0Rpc2Nvbm5lY3RlZCggdGhpc1swXSApICkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIGZhbHNlLCBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHR0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCApIHtcclxuXHRcdFx0dmFyIHNldCA9IGpRdWVyeS5jbGVhbiggYXJndW1lbnRzICk7XHJcblx0XHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1lcmdlKCB0aGlzLCBzZXQgKSwgXCJhZnRlclwiLCB0aGlzLnNlbGVjdG9yICk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Ly8ga2VlcERhdGEgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LS1kbyBub3QgZG9jdW1lbnRcclxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3Rvciwga2VlcERhdGEgKSB7XHJcblx0XHR2YXIgZWxlbSxcclxuXHRcdFx0aSA9IDA7XHJcblxyXG5cdFx0Zm9yICggOyAoZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7IGkrKyApIHtcclxuXHRcdFx0aWYgKCAhc2VsZWN0b3IgfHwgalF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIFsgZWxlbSBdICkubGVuZ3RoICkge1xyXG5cdFx0XHRcdGlmICggIWtlZXBEYXRhICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XHJcblx0XHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSApO1xyXG5cdFx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggWyBlbGVtIF0gKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICkge1xyXG5cdFx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fSxcclxuXHJcblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIGVsZW0sXHJcblx0XHRcdGkgPSAwO1xyXG5cclxuXHRcdGZvciAoIDsgKGVsZW0gPSB0aGlzW2ldKSAhPSBudWxsOyBpKysgKSB7XHJcblx0XHRcdC8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrc1xyXG5cdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XHJcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gUmVtb3ZlIGFueSByZW1haW5pbmcgbm9kZXNcclxuXHRcdFx0d2hpbGUgKCBlbGVtLmZpcnN0Q2hpbGQgKSB7XHJcblx0XHRcdFx0ZWxlbS5yZW1vdmVDaGlsZCggZWxlbS5maXJzdENoaWxkICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cclxuXHRjbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xyXG5cdFx0ZGF0YUFuZEV2ZW50cyA9IGRhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGZhbHNlIDogZGF0YUFuZEV2ZW50cztcclxuXHRcdGRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50cztcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0cmV0dXJuIGpRdWVyeS5jbG9uZSggdGhpcywgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKTtcclxuXHRcdH0pO1xyXG5cdH0sXHJcblxyXG5cdGh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcclxuXHRcdHJldHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XHJcblx0XHRcdHZhciBlbGVtID0gdGhpc1swXSB8fCB7fSxcclxuXHRcdFx0XHRpID0gMCxcclxuXHRcdFx0XHRsID0gdGhpcy5sZW5ndGg7XHJcblxyXG5cdFx0XHRpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgP1xyXG5cdFx0XHRcdFx0ZWxlbS5pbm5lckhUTUwucmVwbGFjZSggcmlubGluZWpRdWVyeSwgXCJcIiApIDpcclxuXHRcdFx0XHRcdHVuZGVmaW5lZDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxyXG5cdFx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZhbHVlICkgJiZcclxuXHRcdFx0XHQoIGpRdWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgfHwgIXJub3NoaW1jYWNoZS50ZXN0KCB2YWx1ZSApICApICYmXHJcblx0XHRcdFx0KCBqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSB8fCAhcmxlYWRpbmdXaGl0ZXNwYWNlLnRlc3QoIHZhbHVlICkgKSAmJlxyXG5cdFx0XHRcdCF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgW1wiXCIsIFwiXCJdIClbMV0udG9Mb3dlckNhc2UoKSBdICkge1xyXG5cclxuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoIHJ4aHRtbFRhZywgXCI8JDE+PC8kMj5cIiApO1xyXG5cclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0Zm9yICg7IGkgPCBsOyBpKysgKSB7XHJcblx0XHRcdFx0XHRcdC8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrc1xyXG5cdFx0XHRcdFx0XHRlbGVtID0gdGhpc1tpXSB8fCB7fTtcclxuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xyXG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwiKlwiICkgKTtcclxuXHRcdFx0XHRcdFx0XHRlbGVtLmlubmVySFRNTCA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0ZWxlbSA9IDA7XHJcblxyXG5cdFx0XHRcdC8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZFxyXG5cdFx0XHRcdH0gY2F0Y2goZSkge31cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBlbGVtICkge1xyXG5cdFx0XHRcdHRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7XHJcblx0XHRcdH1cclxuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XHJcblx0fSxcclxuXHJcblx0cmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcclxuXHRcdGlmICggIWlzRGlzY29ubmVjdGVkKCB0aGlzWzBdICkgKSB7XHJcblx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBlbGVtZW50cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBET00gYmVmb3JlIHRoZXkgYXJlIGluc2VydGVkXHJcblx0XHRcdC8vIHRoaXMgY2FuIGhlbHAgZml4IHJlcGxhY2luZyBhIHBhcmVudCB3aXRoIGNoaWxkIGVsZW1lbnRzXHJcblx0XHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XHJcblx0XHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7XHJcblx0XHRcdFx0XHR2YXIgc2VsZiA9IGpRdWVyeSh0aGlzKSwgb2xkID0gc2VsZi5odG1sKCk7XHJcblx0XHRcdFx0XHRzZWxmLnJlcGxhY2VXaXRoKCB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBvbGQgKSApO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeSggdmFsdWUgKS5kZXRhY2goKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcclxuXHRcdFx0XHR2YXIgbmV4dCA9IHRoaXMubmV4dFNpYmxpbmcsXHJcblx0XHRcdFx0XHRwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XHJcblxyXG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnJlbW92ZSgpO1xyXG5cclxuXHRcdFx0XHRpZiAoIG5leHQgKSB7XHJcblx0XHRcdFx0XHRqUXVlcnkobmV4dCkuYmVmb3JlKCB2YWx1ZSApO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRqUXVlcnkocGFyZW50KS5hcHBlbmQoIHZhbHVlICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5sZW5ndGggP1xyXG5cdFx0XHR0aGlzLnB1c2hTdGFjayggalF1ZXJ5KGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlKCkgOiB2YWx1ZSksIFwicmVwbGFjZVdpdGhcIiwgdmFsdWUgKSA6XHJcblx0XHRcdHRoaXM7XHJcblx0fSxcclxuXHJcblx0ZGV0YWNoOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5yZW1vdmUoIHNlbGVjdG9yLCB0cnVlICk7XHJcblx0fSxcclxuXHJcblx0ZG9tTWFuaXA6IGZ1bmN0aW9uKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2sgKSB7XHJcblxyXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xyXG5cdFx0YXJncyA9IFtdLmNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTtcclxuXHJcblx0XHR2YXIgcmVzdWx0cywgZmlyc3QsIGZyYWdtZW50LCBpTm9DbG9uZSxcclxuXHRcdFx0aSA9IDAsXHJcblx0XHRcdHZhbHVlID0gYXJnc1swXSxcclxuXHRcdFx0c2NyaXB0cyA9IFtdLFxyXG5cdFx0XHRsID0gdGhpcy5sZW5ndGg7XHJcblxyXG5cdFx0Ly8gV2UgY2FuJ3QgY2xvbmVOb2RlIGZyYWdtZW50cyB0aGF0IGNvbnRhaW4gY2hlY2tlZCwgaW4gV2ViS2l0XHJcblx0XHRpZiAoICFqUXVlcnkuc3VwcG9ydC5jaGVja0Nsb25lICYmIGwgPiAxICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGpRdWVyeSh0aGlzKS5kb21NYW5pcCggYXJncywgdGFibGUsIGNhbGxiYWNrICk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24odmFsdWUpICkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHtcclxuXHRcdFx0XHR2YXIgc2VsZiA9IGpRdWVyeSh0aGlzKTtcclxuXHRcdFx0XHRhcmdzWzBdID0gdmFsdWUuY2FsbCggdGhpcywgaSwgdGFibGUgPyBzZWxmLmh0bWwoKSA6IHVuZGVmaW5lZCApO1xyXG5cdFx0XHRcdHNlbGYuZG9tTWFuaXAoIGFyZ3MsIHRhYmxlLCBjYWxsYmFjayApO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXNbMF0gKSB7XHJcblx0XHRcdHJlc3VsdHMgPSBqUXVlcnkuYnVpbGRGcmFnbWVudCggYXJncywgdGhpcywgc2NyaXB0cyApO1xyXG5cdFx0XHRmcmFnbWVudCA9IHJlc3VsdHMuZnJhZ21lbnQ7XHJcblx0XHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcclxuXHJcblx0XHRcdGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7XHJcblx0XHRcdFx0ZnJhZ21lbnQgPSBmaXJzdDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBmaXJzdCApIHtcclxuXHRcdFx0XHR0YWJsZSA9IHRhYmxlICYmIGpRdWVyeS5ub2RlTmFtZSggZmlyc3QsIFwidHJcIiApO1xyXG5cclxuXHRcdFx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGZyYWdtZW50IGZvciB0aGUgbGFzdCBpdGVtIGluc3RlYWQgb2YgdGhlIGZpcnN0IGJlY2F1c2UgaXQgY2FuIGVuZCB1cFxyXG5cdFx0XHRcdC8vIGJlaW5nIGVtcHRpZWQgaW5jb3JyZWN0bHkgaW4gY2VydGFpbiBzaXR1YXRpb25zICgjODA3MCkuXHJcblx0XHRcdFx0Ly8gRnJhZ21lbnRzIGZyb20gdGhlIGZyYWdtZW50IGNhY2hlIG11c3QgYWx3YXlzIGJlIGNsb25lZCBhbmQgbmV2ZXIgdXNlZCBpbiBwbGFjZS5cclxuXHRcdFx0XHRmb3IgKCBpTm9DbG9uZSA9IHJlc3VsdHMuY2FjaGVhYmxlIHx8IGwgLSAxOyBpIDwgbDsgaSsrICkge1xyXG5cdFx0XHRcdFx0Y2FsbGJhY2suY2FsbChcclxuXHRcdFx0XHRcdFx0dGFibGUgJiYgalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzW2ldLCBcInRhYmxlXCIgKSA/XHJcblx0XHRcdFx0XHRcdFx0ZmluZE9yQXBwZW5kKCB0aGlzW2ldLCBcInRib2R5XCIgKSA6XHJcblx0XHRcdFx0XHRcdFx0dGhpc1tpXSxcclxuXHRcdFx0XHRcdFx0aSA9PT0gaU5vQ2xvbmUgP1xyXG5cdFx0XHRcdFx0XHRcdGZyYWdtZW50IDpcclxuXHRcdFx0XHRcdFx0XHRqUXVlcnkuY2xvbmUoIGZyYWdtZW50LCB0cnVlLCB0cnVlIClcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBGaXggIzExODA5OiBBdm9pZCBsZWFraW5nIG1lbW9yeVxyXG5cdFx0XHRmcmFnbWVudCA9IGZpcnN0ID0gbnVsbDtcclxuXHJcblx0XHRcdGlmICggc2NyaXB0cy5sZW5ndGggKSB7XHJcblx0XHRcdFx0alF1ZXJ5LmVhY2goIHNjcmlwdHMsIGZ1bmN0aW9uKCBpLCBlbGVtICkge1xyXG5cdFx0XHRcdFx0aWYgKCBlbGVtLnNyYyApIHtcclxuXHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuYWpheCApIHtcclxuXHRcdFx0XHRcdFx0XHRqUXVlcnkuYWpheCh7XHJcblx0XHRcdFx0XHRcdFx0XHR1cmw6IGVsZW0uc3JjLFxyXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogXCJHRVRcIixcclxuXHRcdFx0XHRcdFx0XHRcdGRhdGFUeXBlOiBcInNjcmlwdFwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0YXN5bmM6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFx0Z2xvYmFsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdFwidGhyb3dzXCI6IHRydWVcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRqUXVlcnkuZXJyb3IoXCJubyBhamF4XCIpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggKCBlbGVtLnRleHQgfHwgZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVySFRNTCB8fCBcIlwiICkucmVwbGFjZSggcmNsZWFuU2NyaXB0LCBcIlwiICkgKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHtcclxuXHRcdFx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9XHJcbn0pO1xyXG5cclxuZnVuY3Rpb24gZmluZE9yQXBwZW5kKCBlbGVtLCB0YWcgKSB7XHJcblx0cmV0dXJuIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApWzBdIHx8IGVsZW0uYXBwZW5kQ2hpbGQoIGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCB0YWcgKSApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkge1xyXG5cclxuXHRpZiAoIGRlc3Qubm9kZVR5cGUgIT09IDEgfHwgIWpRdWVyeS5oYXNEYXRhKCBzcmMgKSApIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdHZhciB0eXBlLCBpLCBsLFxyXG5cdFx0b2xkRGF0YSA9IGpRdWVyeS5fZGF0YSggc3JjICksXHJcblx0XHRjdXJEYXRhID0galF1ZXJ5Ll9kYXRhKCBkZXN0LCBvbGREYXRhICksXHJcblx0XHRldmVudHMgPSBvbGREYXRhLmV2ZW50cztcclxuXHJcblx0aWYgKCBldmVudHMgKSB7XHJcblx0XHRkZWxldGUgY3VyRGF0YS5oYW5kbGU7XHJcblx0XHRjdXJEYXRhLmV2ZW50cyA9IHt9O1xyXG5cclxuXHRcdGZvciAoIHR5cGUgaW4gZXZlbnRzICkge1xyXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IGV2ZW50c1sgdHlwZSBdLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcclxuXHRcdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCBkZXN0LCB0eXBlLCBldmVudHNbIHR5cGUgXVsgaSBdICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIG1ha2UgdGhlIGNsb25lZCBwdWJsaWMgZGF0YSBvYmplY3QgYSBjb3B5IGZyb20gdGhlIG9yaWdpbmFsXHJcblx0aWYgKCBjdXJEYXRhLmRhdGEgKSB7XHJcblx0XHRjdXJEYXRhLmRhdGEgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyRGF0YS5kYXRhICk7XHJcblx0fVxyXG59XHJcblxyXG5mdW5jdGlvbiBjbG9uZUZpeEF0dHJpYnV0ZXMoIHNyYywgZGVzdCApIHtcclxuXHR2YXIgbm9kZU5hbWU7XHJcblxyXG5cdC8vIFdlIGRvIG5vdCBuZWVkIHRvIGRvIGFueXRoaW5nIGZvciBub24tRWxlbWVudHNcclxuXHRpZiAoIGRlc3Qubm9kZVR5cGUgIT09IDEgKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHQvLyBjbGVhckF0dHJpYnV0ZXMgcmVtb3ZlcyB0aGUgYXR0cmlidXRlcywgd2hpY2ggd2UgZG9uJ3Qgd2FudCxcclxuXHQvLyBidXQgYWxzbyByZW1vdmVzIHRoZSBhdHRhY2hFdmVudCBldmVudHMsIHdoaWNoIHdlICpkbyogd2FudFxyXG5cdGlmICggZGVzdC5jbGVhckF0dHJpYnV0ZXMgKSB7XHJcblx0XHRkZXN0LmNsZWFyQXR0cmlidXRlcygpO1xyXG5cdH1cclxuXHJcblx0Ly8gbWVyZ2VBdHRyaWJ1dGVzLCBpbiBjb250cmFzdCwgb25seSBtZXJnZXMgYmFjayBvbiB0aGVcclxuXHQvLyBvcmlnaW5hbCBhdHRyaWJ1dGVzLCBub3QgdGhlIGV2ZW50c1xyXG5cdGlmICggZGVzdC5tZXJnZUF0dHJpYnV0ZXMgKSB7XHJcblx0XHRkZXN0Lm1lcmdlQXR0cmlidXRlcyggc3JjICk7XHJcblx0fVxyXG5cclxuXHRub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcclxuXHJcblx0aWYgKCBub2RlTmFtZSA9PT0gXCJvYmplY3RcIiApIHtcclxuXHRcdC8vIElFNi0xMCBpbXByb3Blcmx5IGNsb25lcyBjaGlsZHJlbiBvZiBvYmplY3QgZWxlbWVudHMgdXNpbmcgY2xhc3NpZC5cclxuXHRcdC8vIElFMTAgdGhyb3dzIE5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycm9yIGlmIHBhcmVudCBpcyBudWxsLCAjMTIxMzIuXHJcblx0XHRpZiAoIGRlc3QucGFyZW50Tm9kZSApIHtcclxuXHRcdFx0ZGVzdC5vdXRlckhUTUwgPSBzcmMub3V0ZXJIVE1MO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFRoaXMgcGF0aCBhcHBlYXJzIHVuYXZvaWRhYmxlIGZvciBJRTkuIFdoZW4gY2xvbmluZyBhbiBvYmplY3RcclxuXHRcdC8vIGVsZW1lbnQgaW4gSUU5LCB0aGUgb3V0ZXJIVE1MIHN0cmF0ZWd5IGFib3ZlIGlzIG5vdCBzdWZmaWNpZW50LlxyXG5cdFx0Ly8gSWYgdGhlIHNyYyBoYXMgaW5uZXJIVE1MIGFuZCB0aGUgZGVzdGluYXRpb24gZG9lcyBub3QsXHJcblx0XHQvLyBjb3B5IHRoZSBzcmMuaW5uZXJIVE1MIGludG8gdGhlIGRlc3QuaW5uZXJIVE1MLiAjMTAzMjRcclxuXHRcdGlmICggalF1ZXJ5LnN1cHBvcnQuaHRtbDVDbG9uZSAmJiAoc3JjLmlubmVySFRNTCAmJiAhalF1ZXJ5LnRyaW0oZGVzdC5pbm5lckhUTUwpKSApIHtcclxuXHRcdFx0ZGVzdC5pbm5lckhUTUwgPSBzcmMuaW5uZXJIVE1MO1xyXG5cdFx0fVxyXG5cclxuXHR9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIHJjaGVja2FibGVUeXBlLnRlc3QoIHNyYy50eXBlICkgKSB7XHJcblx0XHQvLyBJRTYtOCBmYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94XHJcblx0XHQvLyBvciByYWRpbyBidXR0b24uIFdvcnNlLCBJRTYtNyBmYWlsIHRvIGdpdmUgdGhlIGNsb25lZCBlbGVtZW50XHJcblx0XHQvLyBhIGNoZWNrZWQgYXBwZWFyYW5jZSBpZiB0aGUgZGVmYXVsdENoZWNrZWQgdmFsdWUgaXNuJ3QgYWxzbyBzZXRcclxuXHJcblx0XHRkZXN0LmRlZmF1bHRDaGVja2VkID0gZGVzdC5jaGVja2VkID0gc3JjLmNoZWNrZWQ7XHJcblxyXG5cdFx0Ly8gSUU2LTcgZ2V0IGNvbmZ1c2VkIGFuZCBlbmQgdXAgc2V0dGluZyB0aGUgdmFsdWUgb2YgYSBjbG9uZWRcclxuXHRcdC8vIGNoZWNrYm94L3JhZGlvIGJ1dHRvbiB0byBhbiBlbXB0eSBzdHJpbmcgaW5zdGVhZCBvZiBcIm9uXCJcclxuXHRcdGlmICggZGVzdC52YWx1ZSAhPT0gc3JjLnZhbHVlICkge1xyXG5cdFx0XHRkZXN0LnZhbHVlID0gc3JjLnZhbHVlO1xyXG5cdFx0fVxyXG5cclxuXHQvLyBJRTYtOCBmYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZFxyXG5cdC8vIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zXHJcblx0fSBlbHNlIGlmICggbm9kZU5hbWUgPT09IFwib3B0aW9uXCIgKSB7XHJcblx0XHRkZXN0LnNlbGVjdGVkID0gc3JjLmRlZmF1bHRTZWxlY3RlZDtcclxuXHJcblx0Ly8gSUU2LTggZmFpbHMgdG8gc2V0IHRoZSBkZWZhdWx0VmFsdWUgdG8gdGhlIGNvcnJlY3QgdmFsdWUgd2hlblxyXG5cdC8vIGNsb25pbmcgb3RoZXIgdHlwZXMgb2YgaW5wdXQgZmllbGRzXHJcblx0fSBlbHNlIGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiB8fCBub2RlTmFtZSA9PT0gXCJ0ZXh0YXJlYVwiICkge1xyXG5cdFx0ZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlO1xyXG5cclxuXHQvLyBJRSBibGFua3MgY29udGVudHMgd2hlbiBjbG9uaW5nIHNjcmlwdHNcclxuXHR9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gXCJzY3JpcHRcIiAmJiBkZXN0LnRleHQgIT09IHNyYy50ZXh0ICkge1xyXG5cdFx0ZGVzdC50ZXh0ID0gc3JjLnRleHQ7XHJcblx0fVxyXG5cclxuXHQvLyBFdmVudCBkYXRhIGdldHMgcmVmZXJlbmNlZCBpbnN0ZWFkIG9mIGNvcGllZCBpZiB0aGUgZXhwYW5kb1xyXG5cdC8vIGdldHMgY29waWVkIHRvb1xyXG5cdGRlc3QucmVtb3ZlQXR0cmlidXRlKCBqUXVlcnkuZXhwYW5kbyApO1xyXG59XHJcblxyXG5qUXVlcnkuYnVpbGRGcmFnbWVudCA9IGZ1bmN0aW9uKCBhcmdzLCBjb250ZXh0LCBzY3JpcHRzICkge1xyXG5cdHZhciBmcmFnbWVudCwgY2FjaGVhYmxlLCBjYWNoZWhpdCxcclxuXHRcdGZpcnN0ID0gYXJnc1sgMCBdO1xyXG5cclxuXHQvLyBTZXQgY29udGV4dCBmcm9tIHdoYXQgbWF5IGNvbWUgaW4gYXMgdW5kZWZpbmVkIG9yIGEgalF1ZXJ5IGNvbGxlY3Rpb24gb3IgYSBub2RlXHJcblx0Ly8gVXBkYXRlZCB0byBmaXggIzEyMjY2IHdoZXJlIGFjY2Vzc2luZyBjb250ZXh0WzBdIGNvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiBpbiBJRTkvMTAgJlxyXG5cdC8vIGFsc28gZG91YmxlcyBhcyBmaXggZm9yICM4OTUwIHdoZXJlIHBsYWluIG9iamVjdHMgY2F1c2VkIGNyZWF0ZURvY3VtZW50RnJhZ21lbnQgZXhjZXB0aW9uXHJcblx0Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7XHJcblx0Y29udGV4dCA9ICFjb250ZXh0Lm5vZGVUeXBlICYmIGNvbnRleHRbMF0gfHwgY29udGV4dDtcclxuXHRjb250ZXh0ID0gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQ7XHJcblxyXG5cdC8vIE9ubHkgY2FjaGUgXCJzbWFsbFwiICgxLzIgS0IpIEhUTUwgc3RyaW5ncyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1haW4gZG9jdW1lbnRcclxuXHQvLyBDbG9uaW5nIG9wdGlvbnMgbG9zZXMgdGhlIHNlbGVjdGVkIHN0YXRlLCBzbyBkb24ndCBjYWNoZSB0aGVtXHJcblx0Ly8gSUUgNiBkb2Vzbid0IGxpa2UgaXQgd2hlbiB5b3UgcHV0IDxvYmplY3Q+IG9yIDxlbWJlZD4gZWxlbWVudHMgaW4gYSBmcmFnbWVudFxyXG5cdC8vIEFsc28sIFdlYktpdCBkb2VzIG5vdCBjbG9uZSAnY2hlY2tlZCcgYXR0cmlidXRlcyBvbiBjbG9uZU5vZGUsIHNvIGRvbid0IGNhY2hlXHJcblx0Ly8gTGFzdGx5LCBJRTYsNyw4IHdpbGwgbm90IGNvcnJlY3RseSByZXVzZSBjYWNoZWQgZnJhZ21lbnRzIHRoYXQgd2VyZSBjcmVhdGVkIGZyb20gdW5rbm93biBlbGVtcyAjMTA1MDFcclxuXHRpZiAoIGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBmaXJzdCA9PT0gXCJzdHJpbmdcIiAmJiBmaXJzdC5sZW5ndGggPCA1MTIgJiYgY29udGV4dCA9PT0gZG9jdW1lbnQgJiZcclxuXHRcdGZpcnN0LmNoYXJBdCgwKSA9PT0gXCI8XCIgJiYgIXJub2NhY2hlLnRlc3QoIGZpcnN0ICkgJiZcclxuXHRcdChqUXVlcnkuc3VwcG9ydC5jaGVja0Nsb25lIHx8ICFyY2hlY2tlZC50ZXN0KCBmaXJzdCApKSAmJlxyXG5cdFx0KGpRdWVyeS5zdXBwb3J0Lmh0bWw1Q2xvbmUgfHwgIXJub3NoaW1jYWNoZS50ZXN0KCBmaXJzdCApKSApIHtcclxuXHJcblx0XHQvLyBNYXJrIGNhY2hlYWJsZSBhbmQgbG9vayBmb3IgYSBoaXRcclxuXHRcdGNhY2hlYWJsZSA9IHRydWU7XHJcblx0XHRmcmFnbWVudCA9IGpRdWVyeS5mcmFnbWVudHNbIGZpcnN0IF07XHJcblx0XHRjYWNoZWhpdCA9IGZyYWdtZW50ICE9PSB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHRpZiAoICFmcmFnbWVudCApIHtcclxuXHRcdGZyYWdtZW50ID0gY29udGV4dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XHJcblx0XHRqUXVlcnkuY2xlYW4oIGFyZ3MsIGNvbnRleHQsIGZyYWdtZW50LCBzY3JpcHRzICk7XHJcblxyXG5cdFx0Ly8gVXBkYXRlIHRoZSBjYWNoZSwgYnV0IG9ubHkgc3RvcmUgZmFsc2VcclxuXHRcdC8vIHVubGVzcyB0aGlzIGlzIGEgc2Vjb25kIHBhcnNpbmcgb2YgdGhlIHNhbWUgY29udGVudFxyXG5cdFx0aWYgKCBjYWNoZWFibGUgKSB7XHJcblx0XHRcdGpRdWVyeS5mcmFnbWVudHNbIGZpcnN0IF0gPSBjYWNoZWhpdCAmJiBmcmFnbWVudDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHJldHVybiB7IGZyYWdtZW50OiBmcmFnbWVudCwgY2FjaGVhYmxlOiBjYWNoZWFibGUgfTtcclxufTtcclxuXHJcbmpRdWVyeS5mcmFnbWVudHMgPSB7fTtcclxuXHJcbmpRdWVyeS5lYWNoKHtcclxuXHRhcHBlbmRUbzogXCJhcHBlbmRcIixcclxuXHRwcmVwZW5kVG86IFwicHJlcGVuZFwiLFxyXG5cdGluc2VydEJlZm9yZTogXCJiZWZvcmVcIixcclxuXHRpbnNlcnRBZnRlcjogXCJhZnRlclwiLFxyXG5cdHJlcGxhY2VBbGw6IFwicmVwbGFjZVdpdGhcIlxyXG59LCBmdW5jdGlvbiggbmFtZSwgb3JpZ2luYWwgKSB7XHJcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XHJcblx0XHR2YXIgZWxlbXMsXHJcblx0XHRcdGkgPSAwLFxyXG5cdFx0XHRyZXQgPSBbXSxcclxuXHRcdFx0aW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLFxyXG5cdFx0XHRsID0gaW5zZXJ0Lmxlbmd0aCxcclxuXHRcdFx0cGFyZW50ID0gdGhpcy5sZW5ndGggPT09IDEgJiYgdGhpc1swXS5wYXJlbnROb2RlO1xyXG5cclxuXHRcdGlmICggKHBhcmVudCA9PSBudWxsIHx8IHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgPT09IDExICYmIHBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSkgJiYgbCA9PT0gMSApIHtcclxuXHRcdFx0aW5zZXJ0WyBvcmlnaW5hbCBdKCB0aGlzWzBdICk7XHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xyXG5cdFx0XHRcdGVsZW1zID0gKCBpID4gMCA/IHRoaXMuY2xvbmUodHJ1ZSkgOiB0aGlzICkuZ2V0KCk7XHJcblx0XHRcdFx0alF1ZXJ5KCBpbnNlcnRbaV0gKVsgb3JpZ2luYWwgXSggZWxlbXMgKTtcclxuXHRcdFx0XHRyZXQgPSByZXQuY29uY2F0KCBlbGVtcyApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgbmFtZSwgaW5zZXJ0LnNlbGVjdG9yICk7XHJcblx0XHR9XHJcblx0fTtcclxufSk7XHJcblxyXG5mdW5jdGlvbiBnZXRBbGwoIGVsZW0gKSB7XHJcblx0aWYgKCB0eXBlb2YgZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcclxuXHRcdHJldHVybiBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcIipcIiApO1xyXG5cclxuXHR9IGVsc2UgaWYgKCB0eXBlb2YgZWxlbS5xdWVyeVNlbGVjdG9yQWxsICE9PSBcInVuZGVmaW5lZFwiICkge1xyXG5cdFx0cmV0dXJuIGVsZW0ucXVlcnlTZWxlY3RvckFsbCggXCIqXCIgKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHRcdHJldHVybiBbXTtcclxuXHR9XHJcbn1cclxuXHJcbi8vIFVzZWQgaW4gY2xlYW4sIGZpeGVzIHRoZSBkZWZhdWx0Q2hlY2tlZCBwcm9wZXJ0eVxyXG5mdW5jdGlvbiBmaXhEZWZhdWx0Q2hlY2tlZCggZWxlbSApIHtcclxuXHRpZiAoIHJjaGVja2FibGVUeXBlLnRlc3QoIGVsZW0udHlwZSApICkge1xyXG5cdFx0ZWxlbS5kZWZhdWx0Q2hlY2tlZCA9IGVsZW0uY2hlY2tlZDtcclxuXHR9XHJcbn1cclxuXHJcbmpRdWVyeS5leHRlbmQoe1xyXG5cdGNsb25lOiBmdW5jdGlvbiggZWxlbSwgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XHJcblx0XHR2YXIgc3JjRWxlbWVudHMsXHJcblx0XHRcdGRlc3RFbGVtZW50cyxcclxuXHRcdFx0aSxcclxuXHRcdFx0Y2xvbmU7XHJcblxyXG5cdFx0aWYgKCBqUXVlcnkuc3VwcG9ydC5odG1sNUNsb25lIHx8IGpRdWVyeS5pc1hNTERvYyhlbGVtKSB8fCAhcm5vc2hpbWNhY2hlLnRlc3QoIFwiPFwiICsgZWxlbS5ub2RlTmFtZSArIFwiPlwiICkgKSB7XHJcblx0XHRcdGNsb25lID0gZWxlbS5jbG9uZU5vZGUoIHRydWUgKTtcclxuXHJcblx0XHQvLyBJRTw9OCBkb2VzIG5vdCBwcm9wZXJseSBjbG9uZSBkZXRhY2hlZCwgdW5rbm93biBlbGVtZW50IG5vZGVzXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRmcmFnbWVudERpdi5pbm5lckhUTUwgPSBlbGVtLm91dGVySFRNTDtcclxuXHRcdFx0ZnJhZ21lbnREaXYucmVtb3ZlQ2hpbGQoIGNsb25lID0gZnJhZ21lbnREaXYuZmlyc3RDaGlsZCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggKCFqUXVlcnkuc3VwcG9ydC5ub0Nsb25lRXZlbnQgfHwgIWpRdWVyeS5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkKSAmJlxyXG5cdFx0XHRcdChlbGVtLm5vZGVUeXBlID09PSAxIHx8IGVsZW0ubm9kZVR5cGUgPT09IDExKSAmJiAhalF1ZXJ5LmlzWE1MRG9jKGVsZW0pICkge1xyXG5cdFx0XHQvLyBJRSBjb3BpZXMgZXZlbnRzIGJvdW5kIHZpYSBhdHRhY2hFdmVudCB3aGVuIHVzaW5nIGNsb25lTm9kZS5cclxuXHRcdFx0Ly8gQ2FsbGluZyBkZXRhY2hFdmVudCBvbiB0aGUgY2xvbmUgd2lsbCBhbHNvIHJlbW92ZSB0aGUgZXZlbnRzXHJcblx0XHRcdC8vIGZyb20gdGhlIG9yaWdpbmFsLiBJbiBvcmRlciB0byBnZXQgYXJvdW5kIHRoaXMsIHdlIHVzZSBzb21lXHJcblx0XHRcdC8vIHByb3ByaWV0YXJ5IG1ldGhvZHMgdG8gY2xlYXIgdGhlIGV2ZW50cy4gVGhhbmtzIHRvIE1vb1Rvb2xzXHJcblx0XHRcdC8vIGd1eXMgZm9yIHRoaXMgaG90bmVzcy5cclxuXHJcblx0XHRcdGNsb25lRml4QXR0cmlidXRlcyggZWxlbSwgY2xvbmUgKTtcclxuXHJcblx0XHRcdC8vIFVzaW5nIFNpenpsZSBoZXJlIGlzIGNyYXp5IHNsb3csIHNvIHdlIHVzZSBnZXRFbGVtZW50c0J5VGFnTmFtZSBpbnN0ZWFkXHJcblx0XHRcdHNyY0VsZW1lbnRzID0gZ2V0QWxsKCBlbGVtICk7XHJcblx0XHRcdGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUgKTtcclxuXHJcblx0XHRcdC8vIFdlaXJkIGl0ZXJhdGlvbiBiZWNhdXNlIElFIHdpbGwgcmVwbGFjZSB0aGUgbGVuZ3RoIHByb3BlcnR5XHJcblx0XHRcdC8vIHdpdGggYW4gZWxlbWVudCBpZiB5b3UgYXJlIGNsb25pbmcgdGhlIGJvZHkgYW5kIG9uZSBvZiB0aGVcclxuXHRcdFx0Ly8gZWxlbWVudHMgb24gdGhlIHBhZ2UgaGFzIGEgbmFtZSBvciBpZCBvZiBcImxlbmd0aFwiXHJcblx0XHRcdGZvciAoIGkgPSAwOyBzcmNFbGVtZW50c1tpXTsgKytpICkge1xyXG5cdFx0XHRcdC8vIEVuc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBub2RlIGlzIG5vdCBudWxsOyBGaXhlcyAjOTU4N1xyXG5cdFx0XHRcdGlmICggZGVzdEVsZW1lbnRzW2ldICkge1xyXG5cdFx0XHRcdFx0Y2xvbmVGaXhBdHRyaWJ1dGVzKCBzcmNFbGVtZW50c1tpXSwgZGVzdEVsZW1lbnRzW2ldICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZVxyXG5cdFx0aWYgKCBkYXRhQW5kRXZlbnRzICkge1xyXG5cdFx0XHRjbG9uZUNvcHlFdmVudCggZWxlbSwgY2xvbmUgKTtcclxuXHJcblx0XHRcdGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7XHJcblx0XHRcdFx0c3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTtcclxuXHRcdFx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7XHJcblxyXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBzcmNFbGVtZW50c1tpXTsgKytpICkge1xyXG5cdFx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzW2ldLCBkZXN0RWxlbWVudHNbaV0gKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRzcmNFbGVtZW50cyA9IGRlc3RFbGVtZW50cyA9IG51bGw7XHJcblxyXG5cdFx0Ly8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0XHJcblx0XHRyZXR1cm4gY2xvbmU7XHJcblx0fSxcclxuXHJcblx0Y2xlYW46IGZ1bmN0aW9uKCBlbGVtcywgY29udGV4dCwgZnJhZ21lbnQsIHNjcmlwdHMgKSB7XHJcblx0XHR2YXIgaSwgaiwgZWxlbSwgdGFnLCB3cmFwLCBkZXB0aCwgZGl2LCBoYXNCb2R5LCB0Ym9keSwgbGVuLCBoYW5kbGVTY3JpcHQsIGpzVGFncyxcclxuXHRcdFx0c2FmZSA9IGNvbnRleHQgPT09IGRvY3VtZW50ICYmIHNhZmVGcmFnbWVudCxcclxuXHRcdFx0cmV0ID0gW107XHJcblxyXG5cdFx0Ly8gRW5zdXJlIHRoYXQgY29udGV4dCBpcyBhIGRvY3VtZW50XHJcblx0XHRpZiAoICFjb250ZXh0IHx8IHR5cGVvZiBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQgPT09IFwidW5kZWZpbmVkXCIgKSB7XHJcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBVc2UgdGhlIGFscmVhZHktY3JlYXRlZCBzYWZlIGZyYWdtZW50IGlmIGNvbnRleHQgcGVybWl0c1xyXG5cdFx0Zm9yICggaSA9IDA7IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHtcclxuXHRcdFx0aWYgKCB0eXBlb2YgZWxlbSA9PT0gXCJudW1iZXJcIiApIHtcclxuXHRcdFx0XHRlbGVtICs9IFwiXCI7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggIWVsZW0gKSB7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIENvbnZlcnQgaHRtbCBzdHJpbmcgaW50byBET00gbm9kZXNcclxuXHRcdFx0aWYgKCB0eXBlb2YgZWxlbSA9PT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0XHRpZiAoICFyaHRtbC50ZXN0KCBlbGVtICkgKSB7XHJcblx0XHRcdFx0XHRlbGVtID0gY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyBFbnN1cmUgYSBzYWZlIGNvbnRhaW5lciBpbiB3aGljaCB0byByZW5kZXIgdGhlIGh0bWxcclxuXHRcdFx0XHRcdHNhZmUgPSBzYWZlIHx8IGNyZWF0ZVNhZmVGcmFnbWVudCggY29udGV4dCApO1xyXG5cdFx0XHRcdFx0ZGl2ID0gY29udGV4dC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0XHRcdFx0c2FmZS5hcHBlbmRDaGlsZCggZGl2ICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gRml4IFwiWEhUTUxcIi1zdHlsZSB0YWdzIGluIGFsbCBicm93c2Vyc1xyXG5cdFx0XHRcdFx0ZWxlbSA9IGVsZW0ucmVwbGFjZShyeGh0bWxUYWcsIFwiPCQxPjwvJDI+XCIpO1xyXG5cclxuXHRcdFx0XHRcdC8vIEdvIHRvIGh0bWwgYW5kIGJhY2ssIHRoZW4gcGVlbCBvZmYgZXh0cmEgd3JhcHBlcnNcclxuXHRcdFx0XHRcdHRhZyA9ICggcnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFtcIlwiLCBcIlwiXSApWzFdLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0XHR3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwgd3JhcE1hcC5fZGVmYXVsdDtcclxuXHRcdFx0XHRcdGRlcHRoID0gd3JhcFswXTtcclxuXHRcdFx0XHRcdGRpdi5pbm5lckhUTUwgPSB3cmFwWzFdICsgZWxlbSArIHdyYXBbMl07XHJcblxyXG5cdFx0XHRcdFx0Ly8gTW92ZSB0byB0aGUgcmlnaHQgZGVwdGhcclxuXHRcdFx0XHRcdHdoaWxlICggZGVwdGgtLSApIHtcclxuXHRcdFx0XHRcdFx0ZGl2ID0gZGl2Lmxhc3RDaGlsZDtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBSZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQgPHRib2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50c1xyXG5cdFx0XHRcdFx0aWYgKCAhalF1ZXJ5LnN1cHBvcnQudGJvZHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBTdHJpbmcgd2FzIGEgPHRhYmxlPiwgKm1heSogaGF2ZSBzcHVyaW91cyA8dGJvZHk+XHJcblx0XHRcdFx0XHRcdGhhc0JvZHkgPSBydGJvZHkudGVzdChlbGVtKTtcclxuXHRcdFx0XHRcdFx0XHR0Ym9keSA9IHRhZyA9PT0gXCJ0YWJsZVwiICYmICFoYXNCb2R5ID9cclxuXHRcdFx0XHRcdFx0XHRcdGRpdi5maXJzdENoaWxkICYmIGRpdi5maXJzdENoaWxkLmNoaWxkTm9kZXMgOlxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8vIFN0cmluZyB3YXMgYSBiYXJlIDx0aGVhZD4gb3IgPHRmb290PlxyXG5cdFx0XHRcdFx0XHRcdFx0d3JhcFsxXSA9PT0gXCI8dGFibGU+XCIgJiYgIWhhc0JvZHkgP1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRkaXYuY2hpbGROb2RlcyA6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFtdO1xyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICggaiA9IHRib2R5Lmxlbmd0aCAtIDE7IGogPj0gMCA7IC0taiApIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGJvZHlbIGogXSwgXCJ0Ym9keVwiICkgJiYgIXRib2R5WyBqIF0uY2hpbGROb2Rlcy5sZW5ndGggKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0Ym9keVsgaiBdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRib2R5WyBqIF0gKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBJRSBjb21wbGV0ZWx5IGtpbGxzIGxlYWRpbmcgd2hpdGVzcGFjZSB3aGVuIGlubmVySFRNTCBpcyB1c2VkXHJcblx0XHRcdFx0XHRpZiAoICFqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSAmJiBybGVhZGluZ1doaXRlc3BhY2UudGVzdCggZWxlbSApICkge1xyXG5cdFx0XHRcdFx0XHRkaXYuaW5zZXJ0QmVmb3JlKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBybGVhZGluZ1doaXRlc3BhY2UuZXhlYyhlbGVtKVswXSApLCBkaXYuZmlyc3RDaGlsZCApO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGVsZW0gPSBkaXYuY2hpbGROb2RlcztcclxuXHJcblx0XHRcdFx0XHQvLyBUYWtlIG91dCBvZiBmcmFnbWVudCBjb250YWluZXIgKHdlIG5lZWQgYSBmcmVzaCBkaXYgZWFjaCB0aW1lKVxyXG5cdFx0XHRcdFx0ZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGRpdiApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlICkge1xyXG5cdFx0XHRcdHJldC5wdXNoKCBlbGVtICk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCByZXQsIGVsZW0gKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEZpeCAjMTEzNTY6IENsZWFyIGVsZW1lbnRzIGZyb20gc2FmZUZyYWdtZW50XHJcblx0XHRpZiAoIGRpdiApIHtcclxuXHRcdFx0ZWxlbSA9IGRpdiA9IHNhZmUgPSBudWxsO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFJlc2V0IGRlZmF1bHRDaGVja2VkIGZvciBhbnkgcmFkaW9zIGFuZCBjaGVja2JveGVzXHJcblx0XHQvLyBhYm91dCB0byBiZSBhcHBlbmRlZCB0byB0aGUgRE9NIGluIElFIDYvNyAoIzgwNjApXHJcblx0XHRpZiAoICFqUXVlcnkuc3VwcG9ydC5hcHBlbmRDaGVja2VkICkge1xyXG5cdFx0XHRmb3IgKCBpID0gMDsgKGVsZW0gPSByZXRbaV0pICE9IG51bGw7IGkrKyApIHtcclxuXHRcdFx0XHRpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgKSB7XHJcblx0XHRcdFx0XHRmaXhEZWZhdWx0Q2hlY2tlZCggZWxlbSApO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHR5cGVvZiBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xyXG5cdFx0XHRcdFx0alF1ZXJ5LmdyZXAoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJpbnB1dFwiKSwgZml4RGVmYXVsdENoZWNrZWQgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBBcHBlbmQgZWxlbWVudHMgdG8gYSBwcm92aWRlZCBkb2N1bWVudCBmcmFnbWVudFxyXG5cdFx0aWYgKCBmcmFnbWVudCApIHtcclxuXHRcdFx0Ly8gU3BlY2lhbCBoYW5kbGluZyBvZiBlYWNoIHNjcmlwdCBlbGVtZW50XHJcblx0XHRcdGhhbmRsZVNjcmlwdCA9IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHRcdC8vIENoZWNrIGlmIHdlIGNvbnNpZGVyIGl0IGV4ZWN1dGFibGVcclxuXHRcdFx0XHRpZiAoICFlbGVtLnR5cGUgfHwgcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlICkgKSB7XHJcblx0XHRcdFx0XHQvLyBEZXRhY2ggdGhlIHNjcmlwdCBhbmQgc3RvcmUgaXQgaW4gdGhlIHNjcmlwdHMgYXJyYXkgKGlmIHByb3ZpZGVkKSBvciB0aGUgZnJhZ21lbnRcclxuXHRcdFx0XHRcdC8vIFJldHVybiB0cnV0aHkgdG8gaW5kaWNhdGUgdGhhdCBpdCBoYXMgYmVlbiBoYW5kbGVkXHJcblx0XHRcdFx0XHRyZXR1cm4gc2NyaXB0cyA/XHJcblx0XHRcdFx0XHRcdHNjcmlwdHMucHVzaCggZWxlbS5wYXJlbnROb2RlID8gZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICkgOiBlbGVtICkgOlxyXG5cdFx0XHRcdFx0XHRmcmFnbWVudC5hcHBlbmRDaGlsZCggZWxlbSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGZvciAoIGkgPSAwOyAoZWxlbSA9IHJldFtpXSkgIT0gbnVsbDsgaSsrICkge1xyXG5cdFx0XHRcdC8vIENoZWNrIGlmIHdlJ3JlIGRvbmUgYWZ0ZXIgaGFuZGxpbmcgYW4gZXhlY3V0YWJsZSBzY3JpcHRcclxuXHRcdFx0XHRpZiAoICEoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJzY3JpcHRcIiApICYmIGhhbmRsZVNjcmlwdCggZWxlbSApICkgKSB7XHJcblx0XHRcdFx0XHQvLyBBcHBlbmQgdG8gZnJhZ21lbnQgYW5kIGhhbmRsZSBlbWJlZGRlZCBzY3JpcHRzXHJcblx0XHRcdFx0XHRmcmFnbWVudC5hcHBlbmRDaGlsZCggZWxlbSApO1xyXG5cdFx0XHRcdFx0aWYgKCB0eXBlb2YgZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcclxuXHRcdFx0XHRcdFx0Ly8gaGFuZGxlU2NyaXB0IGFsdGVycyB0aGUgRE9NLCBzbyB1c2UgalF1ZXJ5Lm1lcmdlIHRvIGVuc3VyZSBzbmFwc2hvdCBpdGVyYXRpb25cclxuXHRcdFx0XHRcdFx0anNUYWdzID0galF1ZXJ5LmdyZXAoIGpRdWVyeS5tZXJnZSggW10sIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIikgKSwgaGFuZGxlU2NyaXB0ICk7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBTcGxpY2UgdGhlIHNjcmlwdHMgaW50byByZXQgYWZ0ZXIgdGhlaXIgZm9ybWVyIGFuY2VzdG9yIGFuZCBhZHZhbmNlIG91ciBpbmRleCBiZXlvbmQgdGhlbVxyXG5cdFx0XHRcdFx0XHRyZXQuc3BsaWNlLmFwcGx5KCByZXQsIFtpICsgMSwgMF0uY29uY2F0KCBqc1RhZ3MgKSApO1xyXG5cdFx0XHRcdFx0XHRpICs9IGpzVGFncy5sZW5ndGg7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJldDtcclxuXHR9LFxyXG5cclxuXHRjbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcywgLyogaW50ZXJuYWwgKi8gYWNjZXB0RGF0YSApIHtcclxuXHRcdHZhciBkYXRhLCBpZCwgZWxlbSwgdHlwZSxcclxuXHRcdFx0aSA9IDAsXHJcblx0XHRcdGludGVybmFsS2V5ID0galF1ZXJ5LmV4cGFuZG8sXHJcblx0XHRcdGNhY2hlID0galF1ZXJ5LmNhY2hlLFxyXG5cdFx0XHRkZWxldGVFeHBhbmRvID0galF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyxcclxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsO1xyXG5cclxuXHRcdGZvciAoIDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkge1xyXG5cclxuXHRcdFx0aWYgKCBhY2NlcHREYXRhIHx8IGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7XHJcblxyXG5cdFx0XHRcdGlkID0gZWxlbVsgaW50ZXJuYWxLZXkgXTtcclxuXHRcdFx0XHRkYXRhID0gaWQgJiYgY2FjaGVbIGlkIF07XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YSApIHtcclxuXHRcdFx0XHRcdGlmICggZGF0YS5ldmVudHMgKSB7XHJcblx0XHRcdFx0XHRcdGZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCBzcGVjaWFsWyB0eXBlIF0gKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBhdm9pZCBqUXVlcnkuZXZlbnQucmVtb3ZlJ3Mgb3ZlcmhlYWRcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIFJlbW92ZSBjYWNoZSBvbmx5IGlmIGl0IHdhcyBub3QgYWxyZWFkeSByZW1vdmVkIGJ5IGpRdWVyeS5ldmVudC5yZW1vdmVcclxuXHRcdFx0XHRcdGlmICggY2FjaGVbIGlkIF0gKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRkZWxldGUgY2FjaGVbIGlkIF07XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBJRSBkb2VzIG5vdCBhbGxvdyB1cyB0byBkZWxldGUgZXhwYW5kbyBwcm9wZXJ0aWVzIGZyb20gbm9kZXMsXHJcblx0XHRcdFx0XHRcdC8vIG5vciBkb2VzIGl0IGhhdmUgYSByZW1vdmVBdHRyaWJ1dGUgZnVuY3Rpb24gb24gRG9jdW1lbnQgbm9kZXM7XHJcblx0XHRcdFx0XHRcdC8vIHdlIG11c3QgaGFuZGxlIGFsbCBvZiB0aGVzZSBjYXNlc1xyXG5cdFx0XHRcdFx0XHRpZiAoIGRlbGV0ZUV4cGFuZG8gKSB7XHJcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIGVsZW1bIGludGVybmFsS2V5IF07XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBlbGVtLnJlbW92ZUF0dHJpYnV0ZSApIHtcclxuXHRcdFx0XHRcdFx0XHRlbGVtLnJlbW92ZUF0dHJpYnV0ZSggaW50ZXJuYWxLZXkgKTtcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0ZWxlbVsgaW50ZXJuYWxLZXkgXSA9IG51bGw7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGpRdWVyeS5kZWxldGVkSWRzLnB1c2goIGlkICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG59KTtcclxuLy8gTGltaXQgc2NvcGUgcG9sbHV0aW9uIGZyb20gYW55IGRlcHJlY2F0ZWQgQVBJXHJcbihmdW5jdGlvbigpIHtcclxuXHJcbnZhciBtYXRjaGVkLCBicm93c2VyO1xyXG5cclxuLy8gVXNlIG9mIGpRdWVyeS5icm93c2VyIGlzIGZyb3duZWQgdXBvbi5cclxuLy8gTW9yZSBkZXRhaWxzOiBodHRwOi8vYXBpLmpxdWVyeS5jb20valF1ZXJ5LmJyb3dzZXJcclxuLy8galF1ZXJ5LnVhTWF0Y2ggbWFpbnRhaW5lZCBmb3IgYmFjay1jb21wYXRcclxualF1ZXJ5LnVhTWF0Y2ggPSBmdW5jdGlvbiggdWEgKSB7XHJcblx0dWEgPSB1YS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuXHR2YXIgbWF0Y2ggPSAvKGNocm9tZSlbIFxcL10oW1xcdy5dKykvLmV4ZWMoIHVhICkgfHxcclxuXHRcdC8od2Via2l0KVsgXFwvXShbXFx3Ll0rKS8uZXhlYyggdWEgKSB8fFxyXG5cdFx0LyhvcGVyYSkoPzouKnZlcnNpb258KVsgXFwvXShbXFx3Ll0rKS8uZXhlYyggdWEgKSB8fFxyXG5cdFx0Lyhtc2llKSAoW1xcdy5dKykvLmV4ZWMoIHVhICkgfHxcclxuXHRcdHVhLmluZGV4T2YoXCJjb21wYXRpYmxlXCIpIDwgMCAmJiAvKG1vemlsbGEpKD86Lio/IHJ2OihbXFx3Ll0rKXwpLy5leGVjKCB1YSApIHx8XHJcblx0XHRbXTtcclxuXHJcblx0cmV0dXJuIHtcclxuXHRcdGJyb3dzZXI6IG1hdGNoWyAxIF0gfHwgXCJcIixcclxuXHRcdHZlcnNpb246IG1hdGNoWyAyIF0gfHwgXCIwXCJcclxuXHR9O1xyXG59O1xyXG5cclxubWF0Y2hlZCA9IGpRdWVyeS51YU1hdGNoKCBuYXZpZ2F0b3IudXNlckFnZW50ICk7XHJcbmJyb3dzZXIgPSB7fTtcclxuXHJcbmlmICggbWF0Y2hlZC5icm93c2VyICkge1xyXG5cdGJyb3dzZXJbIG1hdGNoZWQuYnJvd3NlciBdID0gdHJ1ZTtcclxuXHRicm93c2VyLnZlcnNpb24gPSBtYXRjaGVkLnZlcnNpb247XHJcbn1cclxuXHJcbi8vIENocm9tZSBpcyBXZWJraXQsIGJ1dCBXZWJraXQgaXMgYWxzbyBTYWZhcmkuXHJcbmlmICggYnJvd3Nlci5jaHJvbWUgKSB7XHJcblx0YnJvd3Nlci53ZWJraXQgPSB0cnVlO1xyXG59IGVsc2UgaWYgKCBicm93c2VyLndlYmtpdCApIHtcclxuXHRicm93c2VyLnNhZmFyaSA9IHRydWU7XHJcbn1cclxuXHJcbmpRdWVyeS5icm93c2VyID0gYnJvd3NlcjtcclxuXHJcbmpRdWVyeS5zdWIgPSBmdW5jdGlvbigpIHtcclxuXHRmdW5jdGlvbiBqUXVlcnlTdWIoIHNlbGVjdG9yLCBjb250ZXh0ICkge1xyXG5cdFx0cmV0dXJuIG5ldyBqUXVlcnlTdWIuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQgKTtcclxuXHR9XHJcblx0alF1ZXJ5LmV4dGVuZCggdHJ1ZSwgalF1ZXJ5U3ViLCB0aGlzICk7XHJcblx0alF1ZXJ5U3ViLnN1cGVyY2xhc3MgPSB0aGlzO1xyXG5cdGpRdWVyeVN1Yi5mbiA9IGpRdWVyeVN1Yi5wcm90b3R5cGUgPSB0aGlzKCk7XHJcblx0alF1ZXJ5U3ViLmZuLmNvbnN0cnVjdG9yID0galF1ZXJ5U3ViO1xyXG5cdGpRdWVyeVN1Yi5zdWIgPSB0aGlzLnN1YjtcclxuXHRqUXVlcnlTdWIuZm4uaW5pdCA9IGZ1bmN0aW9uIGluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICkge1xyXG5cdFx0aWYgKCBjb250ZXh0ICYmIGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgJiYgIShjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5U3ViKSApIHtcclxuXHRcdFx0Y29udGV4dCA9IGpRdWVyeVN1YiggY29udGV4dCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBqUXVlcnkuZm4uaW5pdC5jYWxsKCB0aGlzLCBzZWxlY3RvciwgY29udGV4dCwgcm9vdGpRdWVyeVN1YiApO1xyXG5cdH07XHJcblx0alF1ZXJ5U3ViLmZuLmluaXQucHJvdG90eXBlID0galF1ZXJ5U3ViLmZuO1xyXG5cdHZhciByb290alF1ZXJ5U3ViID0galF1ZXJ5U3ViKGRvY3VtZW50KTtcclxuXHRyZXR1cm4galF1ZXJ5U3ViO1xyXG59O1xyXG5cclxufSkoKTtcclxudmFyIGN1ckNTUywgaWZyYW1lLCBpZnJhbWVEb2MsXHJcblx0cmFscGhhID0gL2FscGhhXFwoW14pXSpcXCkvaSxcclxuXHRyb3BhY2l0eSA9IC9vcGFjaXR5PShbXildKikvLFxyXG5cdHJwb3NpdGlvbiA9IC9eKHRvcHxyaWdodHxib3R0b218bGVmdCkkLyxcclxuXHQvLyBzd2FwcGFibGUgaWYgZGlzcGxheSBpcyBub25lIG9yIHN0YXJ0cyB3aXRoIHRhYmxlIGV4Y2VwdCBcInRhYmxlXCIsIFwidGFibGUtY2VsbFwiLCBvciBcInRhYmxlLWNhcHRpb25cIlxyXG5cdC8vIHNlZSBoZXJlIGZvciBkaXNwbGF5IHZhbHVlczogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9DU1MvZGlzcGxheVxyXG5cdHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxcclxuXHRybWFyZ2luID0gL15tYXJnaW4vLFxyXG5cdHJudW1zcGxpdCA9IG5ldyBSZWdFeHAoIFwiXihcIiArIGNvcmVfcG51bSArIFwiKSguKikkXCIsIFwiaVwiICksXHJcblx0cm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggXCJeKFwiICsgY29yZV9wbnVtICsgXCIpKD8hcHgpW2EteiVdKyRcIiwgXCJpXCIgKSxcclxuXHRycmVsTnVtID0gbmV3IFJlZ0V4cCggXCJeKFstK10pPShcIiArIGNvcmVfcG51bSArIFwiKVwiLCBcImlcIiApLFxyXG5cdGVsZW1kaXNwbGF5ID0ge30sXHJcblxyXG5cdGNzc1Nob3cgPSB7IHBvc2l0aW9uOiBcImFic29sdXRlXCIsIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsIGRpc3BsYXk6IFwiYmxvY2tcIiB9LFxyXG5cdGNzc05vcm1hbFRyYW5zZm9ybSA9IHtcclxuXHRcdGxldHRlclNwYWNpbmc6IDAsXHJcblx0XHRmb250V2VpZ2h0OiA0MDBcclxuXHR9LFxyXG5cclxuXHRjc3NFeHBhbmQgPSBbIFwiVG9wXCIsIFwiUmlnaHRcIiwgXCJCb3R0b21cIiwgXCJMZWZ0XCIgXSxcclxuXHRjc3NQcmVmaXhlcyA9IFsgXCJXZWJraXRcIiwgXCJPXCIsIFwiTW96XCIsIFwibXNcIiBdLFxyXG5cclxuXHRldmVudHNUb2dnbGUgPSBqUXVlcnkuZm4udG9nZ2xlO1xyXG5cclxuLy8gcmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eVxyXG5mdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggc3R5bGUsIG5hbWUgKSB7XHJcblxyXG5cdC8vIHNob3J0Y3V0IGZvciBuYW1lcyB0aGF0IGFyZSBub3QgdmVuZG9yIHByZWZpeGVkXHJcblx0aWYgKCBuYW1lIGluIHN0eWxlICkge1xyXG5cdFx0cmV0dXJuIG5hbWU7XHJcblx0fVxyXG5cclxuXHQvLyBjaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzXHJcblx0dmFyIGNhcE5hbWUgPSBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSxcclxuXHRcdG9yaWdOYW1lID0gbmFtZSxcclxuXHRcdGkgPSBjc3NQcmVmaXhlcy5sZW5ndGg7XHJcblxyXG5cdHdoaWxlICggaS0tICkge1xyXG5cdFx0bmFtZSA9IGNzc1ByZWZpeGVzWyBpIF0gKyBjYXBOYW1lO1xyXG5cdFx0aWYgKCBuYW1lIGluIHN0eWxlICkge1xyXG5cdFx0XHRyZXR1cm4gbmFtZTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHJldHVybiBvcmlnTmFtZTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNIaWRkZW4oIGVsZW0sIGVsICkge1xyXG5cdGVsZW0gPSBlbCB8fCBlbGVtO1xyXG5cdHJldHVybiBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApID09PSBcIm5vbmVcIiB8fCAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd0hpZGUoIGVsZW1lbnRzLCBzaG93ICkge1xyXG5cdHZhciBlbGVtLCBkaXNwbGF5LFxyXG5cdFx0dmFsdWVzID0gW10sXHJcblx0XHRpbmRleCA9IDAsXHJcblx0XHRsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XHJcblxyXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XHJcblx0XHRlbGVtID0gZWxlbWVudHNbIGluZGV4IF07XHJcblx0XHRpZiAoICFlbGVtLnN0eWxlICkge1xyXG5cdFx0XHRjb250aW51ZTtcclxuXHRcdH1cclxuXHRcdHZhbHVlc1sgaW5kZXggXSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgXCJvbGRkaXNwbGF5XCIgKTtcclxuXHRcdGlmICggc2hvdyApIHtcclxuXHRcdFx0Ly8gUmVzZXQgdGhlIGlubGluZSBkaXNwbGF5IG9mIHRoaXMgZWxlbWVudCB0byBsZWFybiBpZiBpdCBpc1xyXG5cdFx0XHQvLyBiZWluZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Igbm90XHJcblx0XHRcdGlmICggIXZhbHVlc1sgaW5kZXggXSAmJiBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiICkge1xyXG5cdFx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFNldCBlbGVtZW50cyB3aGljaCBoYXZlIGJlZW4gb3ZlcnJpZGRlbiB3aXRoIGRpc3BsYXk6IG5vbmVcclxuXHRcdFx0Ly8gaW4gYSBzdHlsZXNoZWV0IHRvIHdoYXRldmVyIHRoZSBkZWZhdWx0IGJyb3dzZXIgc3R5bGUgaXNcclxuXHRcdFx0Ly8gZm9yIHN1Y2ggYW4gZWxlbWVudFxyXG5cdFx0XHRpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJiBpc0hpZGRlbiggZWxlbSApICkge1xyXG5cdFx0XHRcdHZhbHVlc1sgaW5kZXggXSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgXCJvbGRkaXNwbGF5XCIsIGNzc19kZWZhdWx0RGlzcGxheShlbGVtLm5vZGVOYW1lKSApO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRkaXNwbGF5ID0gY3VyQ1NTKCBlbGVtLCBcImRpc3BsYXlcIiApO1xyXG5cclxuXHRcdFx0aWYgKCAhdmFsdWVzWyBpbmRleCBdICYmIGRpc3BsYXkgIT09IFwibm9uZVwiICkge1xyXG5cdFx0XHRcdGpRdWVyeS5fZGF0YSggZWxlbSwgXCJvbGRkaXNwbGF5XCIsIGRpc3BsYXkgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gU2V0IHRoZSBkaXNwbGF5IG9mIG1vc3Qgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3BcclxuXHQvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93XHJcblx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcclxuXHRcdGVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTtcclxuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XHJcblx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCAhc2hvdyB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiIHx8IGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiApIHtcclxuXHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/IHZhbHVlc1sgaW5kZXggXSB8fCBcIlwiIDogXCJub25lXCI7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZWxlbWVudHM7XHJcbn1cclxuXHJcbmpRdWVyeS5mbi5leHRlbmQoe1xyXG5cdGNzczogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcclxuXHRcdFx0cmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgP1xyXG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6XHJcblx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApO1xyXG5cdFx0fSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XHJcblx0fSxcclxuXHRzaG93OiBmdW5jdGlvbigpIHtcclxuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApO1xyXG5cdH0sXHJcblx0aGlkZTogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMgKTtcclxuXHR9LFxyXG5cdHRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlLCBmbjIgKSB7XHJcblx0XHR2YXIgYm9vbCA9IHR5cGVvZiBzdGF0ZSA9PT0gXCJib29sZWFuXCI7XHJcblxyXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc3RhdGUgKSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggZm4yICkgKSB7XHJcblx0XHRcdHJldHVybiBldmVudHNUb2dnbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XHJcblx0XHRcdGlmICggYm9vbCA/IHN0YXRlIDogaXNIaWRkZW4oIHRoaXMgKSApIHtcclxuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5zaG93KCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuaGlkZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcbn0pO1xyXG5cclxualF1ZXJ5LmV4dGVuZCh7XHJcblx0Ly8gQWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tzIGZvciBvdmVycmlkaW5nIHRoZSBkZWZhdWx0XHJcblx0Ly8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5XHJcblx0Y3NzSG9va3M6IHtcclxuXHRcdG9wYWNpdHk6IHtcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XHJcblx0XHRcdFx0aWYgKCBjb21wdXRlZCApIHtcclxuXHRcdFx0XHRcdC8vIFdlIHNob3VsZCBhbHdheXMgZ2V0IGEgbnVtYmVyIGJhY2sgZnJvbSBvcGFjaXR5XHJcblx0XHRcdFx0XHR2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCBcIm9wYWNpdHlcIiApO1xyXG5cdFx0XHRcdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiMVwiIDogcmV0O1xyXG5cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHQvLyBFeGNsdWRlIHRoZSBmb2xsb3dpbmcgY3NzIHByb3BlcnRpZXMgdG8gYWRkIHB4XHJcblx0Y3NzTnVtYmVyOiB7XHJcblx0XHRcImZpbGxPcGFjaXR5XCI6IHRydWUsXHJcblx0XHRcImZvbnRXZWlnaHRcIjogdHJ1ZSxcclxuXHRcdFwibGluZUhlaWdodFwiOiB0cnVlLFxyXG5cdFx0XCJvcGFjaXR5XCI6IHRydWUsXHJcblx0XHRcIm9ycGhhbnNcIjogdHJ1ZSxcclxuXHRcdFwid2lkb3dzXCI6IHRydWUsXHJcblx0XHRcInpJbmRleFwiOiB0cnVlLFxyXG5cdFx0XCJ6b29tXCI6IHRydWVcclxuXHR9LFxyXG5cclxuXHQvLyBBZGQgaW4gcHJvcGVydGllcyB3aG9zZSBuYW1lcyB5b3Ugd2lzaCB0byBmaXggYmVmb3JlXHJcblx0Ly8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZVxyXG5cdGNzc1Byb3BzOiB7XHJcblx0XHQvLyBub3JtYWxpemUgZmxvYXQgY3NzIHByb3BlcnR5XHJcblx0XHRcImZsb2F0XCI6IGpRdWVyeS5zdXBwb3J0LmNzc0Zsb2F0ID8gXCJjc3NGbG9hdFwiIDogXCJzdHlsZUZsb2F0XCJcclxuXHR9LFxyXG5cclxuXHQvLyBHZXQgYW5kIHNldCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZVxyXG5cdHN0eWxlOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIGV4dHJhICkge1xyXG5cdFx0Ly8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXHJcblx0XHRpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZVxyXG5cdFx0dmFyIHJldCwgdHlwZSwgaG9va3MsXHJcblx0XHRcdG9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApLFxyXG5cdFx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XHJcblxyXG5cdFx0bmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSB8fCAoIGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBzdHlsZSwgb3JpZ05hbWUgKSApO1xyXG5cclxuXHRcdC8vIGdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb25cclxuXHRcdC8vIGZvbGxvd2VkIGJ5IHRoZSB1bnByZWZpeGVkIHZlcnNpb25cclxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xyXG5cclxuXHRcdC8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZVxyXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHR0eXBlID0gdHlwZW9mIHZhbHVlO1xyXG5cclxuXHRcdFx0Ly8gY29udmVydCByZWxhdGl2ZSBudW1iZXIgc3RyaW5ncyAoKz0gb3IgLT0pIHRvIHJlbGF0aXZlIG51bWJlcnMuICM3MzQ1XHJcblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAocmV0ID0gcnJlbE51bS5leGVjKCB2YWx1ZSApKSApIHtcclxuXHRcdFx0XHR2YWx1ZSA9ICggcmV0WzFdICsgMSApICogcmV0WzJdICsgcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApICk7XHJcblx0XHRcdFx0Ly8gRml4ZXMgYnVnICM5MjM3XHJcblx0XHRcdFx0dHlwZSA9IFwibnVtYmVyXCI7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IE5hTiBhbmQgbnVsbCB2YWx1ZXMgYXJlbid0IHNldC4gU2VlOiAjNzExNlxyXG5cdFx0XHRpZiAoIHZhbHVlID09IG51bGwgfHwgdHlwZSA9PT0gXCJudW1iZXJcIiAmJiBpc05hTiggdmFsdWUgKSApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIElmIGEgbnVtYmVyIHdhcyBwYXNzZWQgaW4sIGFkZCAncHgnIHRvIHRoZSAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKVxyXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwibnVtYmVyXCIgJiYgIWpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gKSB7XHJcblx0XHRcdFx0dmFsdWUgKz0gXCJweFwiO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWVcclxuXHRcdFx0aWYgKCAhaG9va3MgfHwgIShcInNldFwiIGluIGhvb2tzKSB8fCAodmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApKSAhPT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRcdC8vIFdyYXBwZWQgdG8gcHJldmVudCBJRSBmcm9tIHRocm93aW5nIGVycm9ycyB3aGVuICdpbnZhbGlkJyB2YWx1ZXMgYXJlIHByb3ZpZGVkXHJcblx0XHRcdFx0Ly8gRml4ZXMgYnVnICM1NTA5XHJcblx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSB2YWx1ZTtcclxuXHRcdFx0XHR9IGNhdGNoKGUpIHt9XHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgbm9uLWNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcclxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIGZhbHNlLCBleHRyYSApKSAhPT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRcdHJldHVybiByZXQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0XHJcblx0XHRcdHJldHVybiBzdHlsZVsgbmFtZSBdO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdGNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIG51bWVyaWMsIGV4dHJhICkge1xyXG5cdFx0dmFyIHZhbCwgbnVtLCBob29rcyxcclxuXHRcdFx0b3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICk7XHJcblxyXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lXHJcblx0XHRuYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIGVsZW0uc3R5bGUsIG9yaWdOYW1lICkgKTtcclxuXHJcblx0XHQvLyBnZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uXHJcblx0XHQvLyBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCB2ZXJzaW9uXHJcblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcclxuXHJcblx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxyXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICkge1xyXG5cdFx0XHR2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXRcclxuXHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdHZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vY29udmVydCBcIm5vcm1hbFwiIHRvIGNvbXB1dGVkIHZhbHVlXHJcblx0XHRpZiAoIHZhbCA9PT0gXCJub3JtYWxcIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHtcclxuXHRcdFx0dmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUmV0dXJuLCBjb252ZXJ0aW5nIHRvIG51bWJlciBpZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIgd2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJpY1xyXG5cdFx0aWYgKCBudW1lcmljIHx8IGV4dHJhICE9PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdG51bSA9IHBhcnNlRmxvYXQoIHZhbCApO1xyXG5cdFx0XHRyZXR1cm4gbnVtZXJpYyB8fCBqUXVlcnkuaXNOdW1lcmljKCBudW0gKSA/IG51bSB8fCAwIDogdmFsO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHZhbDtcclxuXHR9LFxyXG5cclxuXHQvLyBBIG1ldGhvZCBmb3IgcXVpY2tseSBzd2FwcGluZyBpbi9vdXQgQ1NTIHByb3BlcnRpZXMgdG8gZ2V0IGNvcnJlY3QgY2FsY3VsYXRpb25zXHJcblx0c3dhcDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrICkge1xyXG5cdFx0dmFyIHJldCwgbmFtZSxcclxuXHRcdFx0b2xkID0ge307XHJcblxyXG5cdFx0Ly8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzXHJcblx0XHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XHJcblx0XHRcdG9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdO1xyXG5cdFx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1lIF07XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0ID0gY2FsbGJhY2suY2FsbCggZWxlbSApO1xyXG5cclxuXHRcdC8vIFJldmVydCB0aGUgb2xkIHZhbHVlc1xyXG5cdFx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xyXG5cdFx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmV0O1xyXG5cdH1cclxufSk7XHJcblxyXG4vLyBOT1RFOiBUbyBhbnkgZnV0dXJlIG1haW50YWluZXIsIHdlJ3ZlIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlXHJcbi8vIGJlY2F1c2UganNkb20gb24gbm9kZS5qcyB3aWxsIGJyZWFrIHdpdGhvdXQgaXQuXHJcbmlmICggd2luZG93LmdldENvbXB1dGVkU3R5bGUgKSB7XHJcblx0Y3VyQ1NTID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XHJcblx0XHR2YXIgcmV0LCB3aWR0aCwgbWluV2lkdGgsIG1heFdpZHRoLFxyXG5cdFx0XHRjb21wdXRlZCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICksXHJcblx0XHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcclxuXHJcblx0XHRpZiAoIGNvbXB1dGVkICkge1xyXG5cclxuXHRcdFx0cmV0ID0gY29tcHV0ZWRbIG5hbWUgXTtcclxuXHRcdFx0aWYgKCByZXQgPT09IFwiXCIgJiYgIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7XHJcblx0XHRcdFx0cmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEEgdHJpYnV0ZSB0byB0aGUgXCJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXCJcclxuXHRcdFx0Ly8gQ2hyb21lIDwgMTcgYW5kIFNhZmFyaSA1LjAgdXNlcyBcImNvbXB1dGVkIHZhbHVlXCIgaW5zdGVhZCBvZiBcInVzZWQgdmFsdWVcIiBmb3IgbWFyZ2luLXJpZ2h0XHJcblx0XHRcdC8vIFNhZmFyaSA1LjEuNyAoYXQgbGVhc3QpIHJldHVybnMgcGVyY2VudGFnZSBmb3IgYSBsYXJnZXIgc2V0IG9mIHZhbHVlcywgYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVsc1xyXG5cdFx0XHQvLyB0aGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6IGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXNcclxuXHRcdFx0aWYgKCBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcm1hcmdpbi50ZXN0KCBuYW1lICkgKSB7XHJcblx0XHRcdFx0d2lkdGggPSBzdHlsZS53aWR0aDtcclxuXHRcdFx0XHRtaW5XaWR0aCA9IHN0eWxlLm1pbldpZHRoO1xyXG5cdFx0XHRcdG1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7XHJcblxyXG5cdFx0XHRcdHN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDtcclxuXHRcdFx0XHRyZXQgPSBjb21wdXRlZC53aWR0aDtcclxuXHJcblx0XHRcdFx0c3R5bGUud2lkdGggPSB3aWR0aDtcclxuXHRcdFx0XHRzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoO1xyXG5cdFx0XHRcdHN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmV0O1xyXG5cdH07XHJcbn0gZWxzZSBpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUgKSB7XHJcblx0Y3VyQ1NTID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XHJcblx0XHR2YXIgbGVmdCwgcnNMZWZ0LFxyXG5cdFx0XHRyZXQgPSBlbGVtLmN1cnJlbnRTdHlsZSAmJiBlbGVtLmN1cnJlbnRTdHlsZVsgbmFtZSBdLFxyXG5cdFx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XHJcblxyXG5cdFx0Ly8gQXZvaWQgc2V0dGluZyByZXQgdG8gZW1wdHkgc3RyaW5nIGhlcmVcclxuXHRcdC8vIHNvIHdlIGRvbid0IGRlZmF1bHQgdG8gYXV0b1xyXG5cdFx0aWYgKCByZXQgPT0gbnVsbCAmJiBzdHlsZSAmJiBzdHlsZVsgbmFtZSBdICkge1xyXG5cdFx0XHRyZXQgPSBzdHlsZVsgbmFtZSBdO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEZyb20gdGhlIGF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHNcclxuXHRcdC8vIGh0dHA6Ly9lcmlrLmVhZS5uZXQvYXJjaGl2ZXMvMjAwNy8wNy8yNy8xOC41NC4xNS8jY29tbWVudC0xMDIyOTFcclxuXHJcblx0XHQvLyBJZiB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgcmVndWxhciBwaXhlbCBudW1iZXJcclxuXHRcdC8vIGJ1dCBhIG51bWJlciB0aGF0IGhhcyBhIHdlaXJkIGVuZGluZywgd2UgbmVlZCB0byBjb252ZXJ0IGl0IHRvIHBpeGVsc1xyXG5cdFx0Ly8gYnV0IG5vdCBwb3NpdGlvbiBjc3MgYXR0cmlidXRlcywgYXMgdGhvc2UgYXJlIHByb3BvcnRpb25hbCB0byB0aGUgcGFyZW50IGVsZW1lbnQgaW5zdGVhZFxyXG5cdFx0Ly8gYW5kIHdlIGNhbid0IG1lYXN1cmUgdGhlIHBhcmVudCBpbnN0ZWFkIGJlY2F1c2UgaXQgbWlnaHQgdHJpZ2dlciBhIFwic3RhY2tpbmcgZG9sbHNcIiBwcm9ibGVtXHJcblx0XHRpZiAoIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiAhcnBvc2l0aW9uLnRlc3QoIG5hbWUgKSApIHtcclxuXHJcblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXNcclxuXHRcdFx0bGVmdCA9IHN0eWxlLmxlZnQ7XHJcblx0XHRcdHJzTGVmdCA9IGVsZW0ucnVudGltZVN0eWxlICYmIGVsZW0ucnVudGltZVN0eWxlLmxlZnQ7XHJcblxyXG5cdFx0XHQvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XHJcblx0XHRcdGlmICggcnNMZWZ0ICkge1xyXG5cdFx0XHRcdGVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSBlbGVtLmN1cnJlbnRTdHlsZS5sZWZ0O1xyXG5cdFx0XHR9XHJcblx0XHRcdHN0eWxlLmxlZnQgPSBuYW1lID09PSBcImZvbnRTaXplXCIgPyBcIjFlbVwiIDogcmV0O1xyXG5cdFx0XHRyZXQgPSBzdHlsZS5waXhlbExlZnQgKyBcInB4XCI7XHJcblxyXG5cdFx0XHQvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzXHJcblx0XHRcdHN0eWxlLmxlZnQgPSBsZWZ0O1xyXG5cdFx0XHRpZiAoIHJzTGVmdCApIHtcclxuXHRcdFx0XHRlbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gcnNMZWZ0O1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiYXV0b1wiIDogcmV0O1xyXG5cdH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7XHJcblx0dmFyIG1hdGNoZXMgPSBybnVtc3BsaXQuZXhlYyggdmFsdWUgKTtcclxuXHRyZXR1cm4gbWF0Y2hlcyA/XHJcblx0XHRcdE1hdGgubWF4KCAwLCBtYXRjaGVzWyAxIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAyIF0gfHwgXCJweFwiICkgOlxyXG5cdFx0XHR2YWx1ZTtcclxufVxyXG5cclxuZnVuY3Rpb24gYXVnbWVudFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhLCBpc0JvcmRlckJveCApIHtcclxuXHR2YXIgaSA9IGV4dHJhID09PSAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICkgP1xyXG5cdFx0Ly8gSWYgd2UgYWxyZWFkeSBoYXZlIHRoZSByaWdodCBtZWFzdXJlbWVudCwgYXZvaWQgYXVnbWVudGF0aW9uXHJcblx0XHQ0IDpcclxuXHRcdC8vIE90aGVyd2lzZSBpbml0aWFsaXplIGZvciBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHByb3BlcnRpZXNcclxuXHRcdG5hbWUgPT09IFwid2lkdGhcIiA/IDEgOiAwLFxyXG5cclxuXHRcdHZhbCA9IDA7XHJcblxyXG5cdGZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHtcclxuXHRcdC8vIGJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpbiwgc28gYWRkIGl0IGlmIHdlIHdhbnQgaXRcclxuXHRcdGlmICggZXh0cmEgPT09IFwibWFyZ2luXCIgKSB7XHJcblx0XHRcdC8vIHdlIHVzZSBqUXVlcnkuY3NzIGluc3RlYWQgb2YgY3VyQ1NTIGhlcmVcclxuXHRcdFx0Ly8gYmVjYXVzZSBvZiB0aGUgcmVsaWFibGVNYXJnaW5SaWdodCBDU1MgaG9vayFcclxuXHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIGV4dHJhICsgY3NzRXhwYW5kWyBpIF0sIHRydWUgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBGcm9tIHRoaXMgcG9pbnQgb24gd2UgdXNlIGN1ckNTUyBmb3IgbWF4aW11bSBwZXJmb3JtYW5jZSAocmVsZXZhbnQgaW4gYW5pbWF0aW9ucylcclxuXHRcdGlmICggaXNCb3JkZXJCb3ggKSB7XHJcblx0XHRcdC8vIGJvcmRlci1ib3ggaW5jbHVkZXMgcGFkZGluZywgc28gcmVtb3ZlIGl0IGlmIHdlIHdhbnQgY29udGVudFxyXG5cdFx0XHRpZiAoIGV4dHJhID09PSBcImNvbnRlbnRcIiApIHtcclxuXHRcdFx0XHR2YWwgLT0gcGFyc2VGbG9hdCggY3VyQ1NTKCBlbGVtLCBcInBhZGRpbmdcIiArIGNzc0V4cGFuZFsgaSBdICkgKSB8fCAwO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBhdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBib3JkZXIgbm9yIG1hcmdpbiwgc28gcmVtb3ZlIGJvcmRlclxyXG5cdFx0XHRpZiAoIGV4dHJhICE9PSBcIm1hcmdpblwiICkge1xyXG5cdFx0XHRcdHZhbCAtPSBwYXJzZUZsb2F0KCBjdXJDU1MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiApICkgfHwgMDtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCwgc28gYWRkIHBhZGRpbmdcclxuXHRcdFx0dmFsICs9IHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSApICkgfHwgMDtcclxuXHJcblx0XHRcdC8vIGF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGNvbnRlbnQgbm9yIHBhZGRpbmcsIHNvIGFkZCBib3JkZXJcclxuXHRcdFx0aWYgKCBleHRyYSAhPT0gXCJwYWRkaW5nXCIgKSB7XHJcblx0XHRcdFx0dmFsICs9IHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiICkgKSB8fCAwO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gdmFsO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApIHtcclxuXHJcblx0Ly8gU3RhcnQgd2l0aCBvZmZzZXQgcHJvcGVydHksIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGJvcmRlci1ib3ggdmFsdWVcclxuXHR2YXIgdmFsID0gbmFtZSA9PT0gXCJ3aWR0aFwiID8gZWxlbS5vZmZzZXRXaWR0aCA6IGVsZW0ub2Zmc2V0SGVpZ2h0LFxyXG5cdFx0dmFsdWVJc0JvcmRlckJveCA9IHRydWUsXHJcblx0XHRpc0JvcmRlckJveCA9IGpRdWVyeS5zdXBwb3J0LmJveFNpemluZyAmJiBqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiICkgPT09IFwiYm9yZGVyLWJveFwiO1xyXG5cclxuXHQvLyBzb21lIG5vbi1odG1sIGVsZW1lbnRzIHJldHVybiB1bmRlZmluZWQgZm9yIG9mZnNldFdpZHRoLCBzbyBjaGVjayBmb3IgbnVsbC91bmRlZmluZWRcclxuXHQvLyBzdmcgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02NDkyODVcclxuXHQvLyBNYXRoTUwgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD00OTE2NjhcclxuXHRpZiAoIHZhbCA8PSAwIHx8IHZhbCA9PSBudWxsICkge1xyXG5cdFx0Ly8gRmFsbCBiYWNrIHRvIGNvbXB1dGVkIHRoZW4gdW5jb21wdXRlZCBjc3MgaWYgbmVjZXNzYXJ5XHJcblx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUgKTtcclxuXHRcdGlmICggdmFsIDwgMCB8fCB2YWwgPT0gbnVsbCApIHtcclxuXHRcdFx0dmFsID0gZWxlbS5zdHlsZVsgbmFtZSBdO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENvbXB1dGVkIHVuaXQgaXMgbm90IHBpeGVscy4gU3RvcCBoZXJlIGFuZCByZXR1cm4uXHJcblx0XHRpZiAoIHJudW1ub25weC50ZXN0KHZhbCkgKSB7XHJcblx0XHRcdHJldHVybiB2YWw7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gd2UgbmVlZCB0aGUgY2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXNcclxuXHRcdC8vIGZvciBnZXRDb21wdXRlZFN0eWxlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gdGhlIHJlbGlhYmxlIGVsZW0uc3R5bGVcclxuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveCAmJiAoIGpRdWVyeS5zdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlIHx8IHZhbCA9PT0gZWxlbS5zdHlsZVsgbmFtZSBdICk7XHJcblxyXG5cdFx0Ly8gTm9ybWFsaXplIFwiXCIsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYVxyXG5cdFx0dmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDtcclxuXHR9XHJcblxyXG5cdC8vIHVzZSB0aGUgYWN0aXZlIGJveC1zaXppbmcgbW9kZWwgdG8gYWRkL3N1YnRyYWN0IGlycmVsZXZhbnQgc3R5bGVzXHJcblx0cmV0dXJuICggdmFsICtcclxuXHRcdGF1Z21lbnRXaWR0aE9ySGVpZ2h0KFxyXG5cdFx0XHRlbGVtLFxyXG5cdFx0XHRuYW1lLFxyXG5cdFx0XHRleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICksXHJcblx0XHRcdHZhbHVlSXNCb3JkZXJCb3hcclxuXHRcdClcclxuXHQpICsgXCJweFwiO1xyXG59XHJcblxyXG5cclxuLy8gVHJ5IHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBkaXNwbGF5IHZhbHVlIG9mIGFuIGVsZW1lbnRcclxuZnVuY3Rpb24gY3NzX2RlZmF1bHREaXNwbGF5KCBub2RlTmFtZSApIHtcclxuXHRpZiAoIGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdICkge1xyXG5cdFx0cmV0dXJuIGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdO1xyXG5cdH1cclxuXHJcblx0dmFyIGVsZW0gPSBqUXVlcnkoIFwiPFwiICsgbm9kZU5hbWUgKyBcIj5cIiApLmFwcGVuZFRvKCBkb2N1bWVudC5ib2R5ICksXHJcblx0XHRkaXNwbGF5ID0gZWxlbS5jc3MoXCJkaXNwbGF5XCIpO1xyXG5cdGVsZW0ucmVtb3ZlKCk7XHJcblxyXG5cdC8vIElmIHRoZSBzaW1wbGUgd2F5IGZhaWxzLFxyXG5cdC8vIGdldCBlbGVtZW50J3MgcmVhbCBkZWZhdWx0IGRpc3BsYXkgYnkgYXR0YWNoaW5nIGl0IHRvIGEgdGVtcCBpZnJhbWVcclxuXHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiIHx8IGRpc3BsYXkgPT09IFwiXCIgKSB7XHJcblx0XHQvLyBVc2UgdGhlIGFscmVhZHktY3JlYXRlZCBpZnJhbWUgaWYgcG9zc2libGVcclxuXHRcdGlmcmFtZSA9IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoXHJcblx0XHRcdGlmcmFtZSB8fCBqUXVlcnkuZXh0ZW5kKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpLCB7XHJcblx0XHRcdFx0ZnJhbWVCb3JkZXI6IDAsXHJcblx0XHRcdFx0d2lkdGg6IDAsXHJcblx0XHRcdFx0aGVpZ2h0OiAwXHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdC8vIENyZWF0ZSBhIGNhY2hlYWJsZSBjb3B5IG9mIHRoZSBpZnJhbWUgZG9jdW1lbnQgb24gZmlyc3QgY2FsbC5cclxuXHRcdC8vIElFIGFuZCBPcGVyYSB3aWxsIGFsbG93IHVzIHRvIHJldXNlIHRoZSBpZnJhbWVEb2Mgd2l0aG91dCByZS13cml0aW5nIHRoZSBmYWtlIEhUTUxcclxuXHRcdC8vIGRvY3VtZW50IHRvIGl0OyBXZWJLaXQgJiBGaXJlZm94IHdvbid0IGFsbG93IHJldXNpbmcgdGhlIGlmcmFtZSBkb2N1bWVudC5cclxuXHRcdGlmICggIWlmcmFtZURvYyB8fCAhaWZyYW1lLmNyZWF0ZUVsZW1lbnQgKSB7XHJcblx0XHRcdGlmcmFtZURvYyA9ICggaWZyYW1lLmNvbnRlbnRXaW5kb3cgfHwgaWZyYW1lLmNvbnRlbnREb2N1bWVudCApLmRvY3VtZW50O1xyXG5cdFx0XHRpZnJhbWVEb2Mud3JpdGUoXCI8IWRvY3R5cGUgaHRtbD48aHRtbD48Ym9keT5cIik7XHJcblx0XHRcdGlmcmFtZURvYy5jbG9zZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGVsZW0gPSBpZnJhbWVEb2MuYm9keS5hcHBlbmRDaGlsZCggaWZyYW1lRG9jLmNyZWF0ZUVsZW1lbnQobm9kZU5hbWUpICk7XHJcblxyXG5cdFx0ZGlzcGxheSA9IGN1ckNTUyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcclxuXHRcdGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoIGlmcmFtZSApO1xyXG5cdH1cclxuXHJcblx0Ly8gU3RvcmUgdGhlIGNvcnJlY3QgZGVmYXVsdCBkaXNwbGF5XHJcblx0ZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF0gPSBkaXNwbGF5O1xyXG5cclxuXHRyZXR1cm4gZGlzcGxheTtcclxufVxyXG5cclxualF1ZXJ5LmVhY2goWyBcImhlaWdodFwiLCBcIndpZHRoXCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XHJcblx0alF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gPSB7XHJcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7XHJcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XHJcblx0XHRcdFx0Ly8gY2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtXHJcblx0XHRcdFx0Ly8gaG93ZXZlciwgaXQgbXVzdCBoYXZlIGEgY3VycmVudCBkaXNwbGF5IHN0eWxlIHRoYXQgd291bGQgYmVuZWZpdCBmcm9tIHRoaXNcclxuXHRcdFx0XHRpZiAoIGVsZW0ub2Zmc2V0V2lkdGggPT09IDAgJiYgcmRpc3BsYXlzd2FwLnRlc3QoIGN1ckNTUyggZWxlbSwgXCJkaXNwbGF5XCIgKSApICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5zd2FwKCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cclxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBleHRyYSApIHtcclxuXHRcdFx0cmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgZXh0cmEgP1xyXG5cdFx0XHRcdGF1Z21lbnRXaWR0aE9ySGVpZ2h0KFxyXG5cdFx0XHRcdFx0ZWxlbSxcclxuXHRcdFx0XHRcdG5hbWUsXHJcblx0XHRcdFx0XHRleHRyYSxcclxuXHRcdFx0XHRcdGpRdWVyeS5zdXBwb3J0LmJveFNpemluZyAmJiBqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiICkgPT09IFwiYm9yZGVyLWJveFwiXHJcblx0XHRcdFx0KSA6IDBcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHR9O1xyXG59KTtcclxuXHJcbmlmICggIWpRdWVyeS5zdXBwb3J0Lm9wYWNpdHkgKSB7XHJcblx0alF1ZXJ5LmNzc0hvb2tzLm9wYWNpdHkgPSB7XHJcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcclxuXHRcdFx0Ly8gSUUgdXNlcyBmaWx0ZXJzIGZvciBvcGFjaXR5XHJcblx0XHRcdHJldHVybiByb3BhY2l0eS50ZXN0KCAoY29tcHV0ZWQgJiYgZWxlbS5jdXJyZW50U3R5bGUgPyBlbGVtLmN1cnJlbnRTdHlsZS5maWx0ZXIgOiBlbGVtLnN0eWxlLmZpbHRlcikgfHwgXCJcIiApID9cclxuXHRcdFx0XHQoIDAuMDEgKiBwYXJzZUZsb2F0KCBSZWdFeHAuJDEgKSApICsgXCJcIiA6XHJcblx0XHRcdFx0Y29tcHV0ZWQgPyBcIjFcIiA6IFwiXCI7XHJcblx0XHR9LFxyXG5cclxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xyXG5cdFx0XHR2YXIgc3R5bGUgPSBlbGVtLnN0eWxlLFxyXG5cdFx0XHRcdGN1cnJlbnRTdHlsZSA9IGVsZW0uY3VycmVudFN0eWxlLFxyXG5cdFx0XHRcdG9wYWNpdHkgPSBqUXVlcnkuaXNOdW1lcmljKCB2YWx1ZSApID8gXCJhbHBoYShvcGFjaXR5PVwiICsgdmFsdWUgKiAxMDAgKyBcIilcIiA6IFwiXCIsXHJcblx0XHRcdFx0ZmlsdGVyID0gY3VycmVudFN0eWxlICYmIGN1cnJlbnRTdHlsZS5maWx0ZXIgfHwgc3R5bGUuZmlsdGVyIHx8IFwiXCI7XHJcblxyXG5cdFx0XHQvLyBJRSBoYXMgdHJvdWJsZSB3aXRoIG9wYWNpdHkgaWYgaXQgZG9lcyBub3QgaGF2ZSBsYXlvdXRcclxuXHRcdFx0Ly8gRm9yY2UgaXQgYnkgc2V0dGluZyB0aGUgem9vbSBsZXZlbFxyXG5cdFx0XHRzdHlsZS56b29tID0gMTtcclxuXHJcblx0XHRcdC8vIGlmIHNldHRpbmcgb3BhY2l0eSB0byAxLCBhbmQgbm8gb3RoZXIgZmlsdGVycyBleGlzdCAtIGF0dGVtcHQgdG8gcmVtb3ZlIGZpbHRlciBhdHRyaWJ1dGUgIzY2NTJcclxuXHRcdFx0aWYgKCB2YWx1ZSA+PSAxICYmIGpRdWVyeS50cmltKCBmaWx0ZXIucmVwbGFjZSggcmFscGhhLCBcIlwiICkgKSA9PT0gXCJcIiAmJlxyXG5cdFx0XHRcdHN0eWxlLnJlbW92ZUF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRcdFx0Ly8gU2V0dGluZyBzdHlsZS5maWx0ZXIgdG8gbnVsbCwgXCJcIiAmIFwiIFwiIHN0aWxsIGxlYXZlIFwiZmlsdGVyOlwiIGluIHRoZSBjc3NUZXh0XHJcblx0XHRcdFx0Ly8gaWYgXCJmaWx0ZXI6XCIgaXMgcHJlc2VudCBhdCBhbGwsIGNsZWFyVHlwZSBpcyBkaXNhYmxlZCwgd2Ugd2FudCB0byBhdm9pZCB0aGlzXHJcblx0XHRcdFx0Ly8gc3R5bGUucmVtb3ZlQXR0cmlidXRlIGlzIElFIE9ubHksIGJ1dCBzbyBhcHBhcmVudGx5IGlzIHRoaXMgY29kZSBwYXRoLi4uXHJcblx0XHRcdFx0c3R5bGUucmVtb3ZlQXR0cmlidXRlKCBcImZpbHRlclwiICk7XHJcblxyXG5cdFx0XHRcdC8vIGlmIHRoZXJlIHRoZXJlIGlzIG5vIGZpbHRlciBzdHlsZSBhcHBsaWVkIGluIGEgY3NzIHJ1bGUsIHdlIGFyZSBkb25lXHJcblx0XHRcdFx0aWYgKCBjdXJyZW50U3R5bGUgJiYgIWN1cnJlbnRTdHlsZS5maWx0ZXIgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBvdGhlcndpc2UsIHNldCBuZXcgZmlsdGVyIHZhbHVlc1xyXG5cdFx0XHRzdHlsZS5maWx0ZXIgPSByYWxwaGEudGVzdCggZmlsdGVyICkgP1xyXG5cdFx0XHRcdGZpbHRlci5yZXBsYWNlKCByYWxwaGEsIG9wYWNpdHkgKSA6XHJcblx0XHRcdFx0ZmlsdGVyICsgXCIgXCIgKyBvcGFjaXR5O1xyXG5cdFx0fVxyXG5cdH07XHJcbn1cclxuXHJcbi8vIFRoZXNlIGhvb2tzIGNhbm5vdCBiZSBhZGRlZCB1bnRpbCBET00gcmVhZHkgYmVjYXVzZSB0aGUgc3VwcG9ydCB0ZXN0XHJcbi8vIGZvciBpdCBpcyBub3QgcnVuIHVudGlsIGFmdGVyIERPTSByZWFkeVxyXG5qUXVlcnkoZnVuY3Rpb24oKSB7XHJcblx0aWYgKCAhalF1ZXJ5LnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCApIHtcclxuXHRcdGpRdWVyeS5jc3NIb29rcy5tYXJnaW5SaWdodCA9IHtcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XHJcblx0XHRcdFx0Ly8gV2ViS2l0IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyB3cm9uZyB2YWx1ZSBmb3IgbWFyZ2luLXJpZ2h0XHJcblx0XHRcdFx0Ly8gV29yayBhcm91bmQgYnkgdGVtcG9yYXJpbHkgc2V0dGluZyBlbGVtZW50IGRpc3BsYXkgdG8gaW5saW5lLWJsb2NrXHJcblx0XHRcdFx0cmV0dXJuIGpRdWVyeS5zd2FwKCBlbGVtLCB7IFwiZGlzcGxheVwiOiBcImlubGluZS1ibG9ja1wiIH0sIGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdFx0aWYgKCBjb21wdXRlZCApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGN1ckNTUyggZWxlbSwgXCJtYXJnaW5SaWdodFwiICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0fVxyXG5cclxuXHQvLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODRcclxuXHQvLyBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgcGVyY2VudCB3aGVuIHNwZWNpZmllZCBmb3IgdG9wL2xlZnQvYm90dG9tL3JpZ2h0XHJcblx0Ly8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIHdlIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmVcclxuXHRpZiAoICFqUXVlcnkuc3VwcG9ydC5waXhlbFBvc2l0aW9uICYmIGpRdWVyeS5mbi5wb3NpdGlvbiApIHtcclxuXHRcdGpRdWVyeS5lYWNoKCBbIFwidG9wXCIsIFwibGVmdFwiIF0sIGZ1bmN0aW9uKCBpLCBwcm9wICkge1xyXG5cdFx0XHRqUXVlcnkuY3NzSG9va3NbIHByb3AgXSA9IHtcclxuXHRcdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcclxuXHRcdFx0XHRcdGlmICggY29tcHV0ZWQgKSB7XHJcblx0XHRcdFx0XHRcdHZhciByZXQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTtcclxuXHRcdFx0XHRcdFx0Ly8gaWYgY3VyQ1NTIHJldHVybnMgcGVyY2VudGFnZSwgZmFsbGJhY2sgdG8gb2Zmc2V0XHJcblx0XHRcdFx0XHRcdHJldHVybiBybnVtbm9ucHgudGVzdCggcmV0ICkgPyBqUXVlcnkoIGVsZW0gKS5wb3NpdGlvbigpWyBwcm9wIF0gKyBcInB4XCIgOiByZXQ7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9O1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxufSk7XHJcblxyXG5pZiAoIGpRdWVyeS5leHByICYmIGpRdWVyeS5leHByLmZpbHRlcnMgKSB7XHJcblx0alF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW4gPSBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdHJldHVybiAoIGVsZW0ub2Zmc2V0V2lkdGggPT09IDAgJiYgZWxlbS5vZmZzZXRIZWlnaHQgPT09IDAgKSB8fCAoIWpRdWVyeS5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyAmJiAoKGVsZW0uc3R5bGUgJiYgZWxlbS5zdHlsZS5kaXNwbGF5KSB8fCBjdXJDU1MoIGVsZW0sIFwiZGlzcGxheVwiICkpID09PSBcIm5vbmVcIik7XHJcblx0fTtcclxuXHJcblx0alF1ZXJ5LmV4cHIuZmlsdGVycy52aXNpYmxlID0gZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRyZXR1cm4gIWpRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuKCBlbGVtICk7XHJcblx0fTtcclxufVxyXG5cclxuLy8gVGhlc2UgaG9va3MgYXJlIHVzZWQgYnkgYW5pbWF0ZSB0byBleHBhbmQgcHJvcGVydGllc1xyXG5qUXVlcnkuZWFjaCh7XHJcblx0bWFyZ2luOiBcIlwiLFxyXG5cdHBhZGRpbmc6IFwiXCIsXHJcblx0Ym9yZGVyOiBcIldpZHRoXCJcclxufSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkge1xyXG5cdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0gPSB7XHJcblx0XHRleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcclxuXHRcdFx0dmFyIGksXHJcblxyXG5cdFx0XHRcdC8vIGFzc3VtZXMgYSBzaW5nbGUgbnVtYmVyIGlmIG5vdCBhIHN0cmluZ1xyXG5cdFx0XHRcdHBhcnRzID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUuc3BsaXQoXCIgXCIpIDogWyB2YWx1ZSBdLFxyXG5cdFx0XHRcdGV4cGFuZGVkID0ge307XHJcblxyXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IDQ7IGkrKyApIHtcclxuXHRcdFx0XHRleHBhbmRlZFsgcHJlZml4ICsgY3NzRXhwYW5kWyBpIF0gKyBzdWZmaXggXSA9XHJcblx0XHRcdFx0XHRwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBleHBhbmRlZDtcclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHRpZiAoICFybWFyZ2luLnRlc3QoIHByZWZpeCApICkge1xyXG5cdFx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXS5zZXQgPSBzZXRQb3NpdGl2ZU51bWJlcjtcclxuXHR9XHJcbn0pO1xyXG52YXIgcjIwID0gLyUyMC9nLFxyXG5cdHJicmFja2V0ID0gL1xcW1xcXSQvLFxyXG5cdHJDUkxGID0gL1xccj9cXG4vZyxcclxuXHRyaW5wdXQgPSAvXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksXHJcblx0cnNlbGVjdFRleHRhcmVhID0gL14oPzpzZWxlY3R8dGV4dGFyZWEpL2k7XHJcblxyXG5qUXVlcnkuZm4uZXh0ZW5kKHtcclxuXHRzZXJpYWxpemU6IGZ1bmN0aW9uKCkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxpemVBcnJheSgpICk7XHJcblx0fSxcclxuXHRzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtcclxuXHRcdFx0cmV0dXJuIHRoaXMuZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KCB0aGlzLmVsZW1lbnRzICkgOiB0aGlzO1xyXG5cdFx0fSlcclxuXHRcdC5maWx0ZXIoZnVuY3Rpb24oKXtcclxuXHRcdFx0cmV0dXJuIHRoaXMubmFtZSAmJiAhdGhpcy5kaXNhYmxlZCAmJlxyXG5cdFx0XHRcdCggdGhpcy5jaGVja2VkIHx8IHJzZWxlY3RUZXh0YXJlYS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgfHxcclxuXHRcdFx0XHRcdHJpbnB1dC50ZXN0KCB0aGlzLnR5cGUgKSApO1xyXG5cdFx0fSlcclxuXHRcdC5tYXAoZnVuY3Rpb24oIGksIGVsZW0gKXtcclxuXHRcdFx0dmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpO1xyXG5cclxuXHRcdFx0cmV0dXJuIHZhbCA9PSBudWxsID9cclxuXHRcdFx0XHRudWxsIDpcclxuXHRcdFx0XHRqUXVlcnkuaXNBcnJheSggdmFsICkgP1xyXG5cdFx0XHRcdFx0alF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsLCBpICl7XHJcblx0XHRcdFx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XHJcblx0XHRcdFx0XHR9KSA6XHJcblx0XHRcdFx0XHR7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XHJcblx0XHR9KS5nZXQoKTtcclxuXHR9XHJcbn0pO1xyXG5cclxuLy9TZXJpYWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBvZlxyXG4vL2tleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZ1xyXG5qUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7XHJcblx0dmFyIHByZWZpeCxcclxuXHRcdHMgPSBbXSxcclxuXHRcdGFkZCA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xyXG5cdFx0XHQvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMgdmFsdWVcclxuXHRcdFx0dmFsdWUgPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSA/IHZhbHVlKCkgOiAoIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKTtcclxuXHRcdFx0c1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgKTtcclxuXHRcdH07XHJcblxyXG5cdC8vIFNldCB0cmFkaXRpb25hbCB0byB0cnVlIGZvciBqUXVlcnkgPD0gMS4zLjIgYmVoYXZpb3IuXHJcblx0aWYgKCB0cmFkaXRpb25hbCA9PT0gdW5kZWZpbmVkICkge1xyXG5cdFx0dHJhZGl0aW9uYWwgPSBqUXVlcnkuYWpheFNldHRpbmdzICYmIGpRdWVyeS5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWw7XHJcblx0fVxyXG5cclxuXHQvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzLlxyXG5cdGlmICggalF1ZXJ5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7XHJcblx0XHQvLyBTZXJpYWxpemUgdGhlIGZvcm0gZWxlbWVudHNcclxuXHRcdGpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHtcclxuXHRcdFx0YWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTtcclxuXHRcdH0pO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cdFx0Ly8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgXCJvbGRcIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXJcclxuXHRcdC8vIGRpZCBpdCksIG90aGVyd2lzZSBlbmNvZGUgcGFyYW1zIHJlY3Vyc2l2ZWx5LlxyXG5cdFx0Zm9yICggcHJlZml4IGluIGEgKSB7XHJcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uXHJcblx0cmV0dXJuIHMuam9pbiggXCImXCIgKS5yZXBsYWNlKCByMjAsIFwiK1wiICk7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlvbmFsLCBhZGQgKSB7XHJcblx0dmFyIG5hbWU7XHJcblxyXG5cdGlmICggalF1ZXJ5LmlzQXJyYXkoIG9iaiApICkge1xyXG5cdFx0Ly8gU2VyaWFsaXplIGFycmF5IGl0ZW0uXHJcblx0XHRqUXVlcnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwgdiApIHtcclxuXHRcdFx0aWYgKCB0cmFkaXRpb25hbCB8fCByYnJhY2tldC50ZXN0KCBwcmVmaXggKSApIHtcclxuXHRcdFx0XHQvLyBUcmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMgYSBzY2FsYXIuXHJcblx0XHRcdFx0YWRkKCBwcmVmaXgsIHYgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gSWYgYXJyYXkgaXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzXHJcblx0XHRcdFx0Ly8gbnVtZXJpYyBpbmRleCB0byByZXNvbHZlIGRlc2VyaWFsaXphdGlvbiBhbWJpZ3VpdHkgaXNzdWVzLlxyXG5cdFx0XHRcdC8vIE5vdGUgdGhhdCByYWNrIChhcyBvZiAxLjAuMCkgY2FuJ3QgY3VycmVudGx5IGRlc2VyaWFsaXplXHJcblx0XHRcdFx0Ly8gbmVzdGVkIGFycmF5cyBwcm9wZXJseSwgYW5kIGF0dGVtcHRpbmcgdG8gZG8gc28gbWF5IGNhdXNlXHJcblx0XHRcdFx0Ly8gYSBzZXJ2ZXIgZXJyb3IuIFBvc3NpYmxlIGZpeGVzIGFyZSB0byBtb2RpZnkgcmFjaydzXHJcblx0XHRcdFx0Ly8gZGVzZXJpYWxpemF0aW9uIGFsZ29yaXRobSBvciB0byBwcm92aWRlIGFuIG9wdGlvbiBvciBmbGFnXHJcblx0XHRcdFx0Ly8gdG8gZm9yY2UgYXJyYXkgc2VyaWFsaXphdGlvbiB0byBiZSBzaGFsbG93LlxyXG5cdFx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArICggdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgPyBpIDogXCJcIiApICsgXCJdXCIsIHYsIHRyYWRpdGlvbmFsLCBhZGQgKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdH0gZWxzZSBpZiAoICF0cmFkaXRpb25hbCAmJiBqUXVlcnkudHlwZSggb2JqICkgPT09IFwib2JqZWN0XCIgKSB7XHJcblx0XHQvLyBTZXJpYWxpemUgb2JqZWN0IGl0ZW0uXHJcblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcclxuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCArIFwiW1wiICsgbmFtZSArIFwiXVwiLCBvYmpbIG5hbWUgXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xyXG5cdFx0fVxyXG5cclxuXHR9IGVsc2Uge1xyXG5cdFx0Ly8gU2VyaWFsaXplIHNjYWxhciBpdGVtLlxyXG5cdFx0YWRkKCBwcmVmaXgsIG9iaiApO1xyXG5cdH1cclxufVxyXG52YXIgLy8gRG9jdW1lbnQgbG9jYXRpb25cclxuXHRhamF4TG9jYXRpb24sXHJcblx0Ly8gRG9jdW1lbnQgbG9jYXRpb24gc2VnbWVudHNcclxuXHRhamF4TG9jUGFydHMsXHJcblxyXG5cdHJoYXNoID0gLyMuKiQvLFxyXG5cdHJoZWFkZXJzID0gL14oLio/KTpbIFxcdF0qKFteXFxyXFxuXSopXFxyPyQvbWcsIC8vIElFIGxlYXZlcyBhbiBcXHIgY2hhcmFjdGVyIGF0IEVPTFxyXG5cdC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvblxyXG5cdHJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwXFwtc3RvcmFnZXwuK1xcLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFxyXG5cdHJub0NvbnRlbnQgPSAvXig/OkdFVHxIRUFEKSQvLFxyXG5cdHJwcm90b2NvbCA9IC9eXFwvXFwvLyxcclxuXHRycXVlcnkgPSAvXFw/LyxcclxuXHRyc2NyaXB0ID0gLzxzY3JpcHRcXGJbXjxdKig/Oig/ITxcXC9zY3JpcHQ+KTxbXjxdKikqPFxcL3NjcmlwdD4vZ2ksXHJcblx0cnRzID0gLyhbPyZdKV89W14mXSovLFxyXG5cdHJ1cmwgPSAvXihbXFx3XFwrXFwuXFwtXSs6KSg/OlxcL1xcLyhbXlxcLz8jOl0qKSg/OjooXFxkKyl8KXwpLyxcclxuXHJcblx0Ly8gS2VlcCBhIGNvcHkgb2YgdGhlIG9sZCBsb2FkIG1ldGhvZFxyXG5cdF9sb2FkID0galF1ZXJ5LmZuLmxvYWQsXHJcblxyXG5cdC8qIFByZWZpbHRlcnNcclxuXHQgKiAxKSBUaGV5IGFyZSB1c2VmdWwgdG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMgKHNlZSBhamF4L2pzb25wLmpzIGZvciBhbiBleGFtcGxlKVxyXG5cdCAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6XHJcblx0ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydFxyXG5cdCAqICAgIC0gQUZURVIgcGFyYW0gc2VyaWFsaXphdGlvbiAocy5kYXRhIGlzIGEgc3RyaW5nIGlmIHMucHJvY2Vzc0RhdGEgaXMgdHJ1ZSlcclxuXHQgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlXHJcblx0ICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxyXG5cdCAqIDUpIGV4ZWN1dGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGNvbnRpbnVlIGRvd24gdG8gXCIqXCIgaWYgbmVlZGVkXHJcblx0ICovXHJcblx0cHJlZmlsdGVycyA9IHt9LFxyXG5cclxuXHQvKiBUcmFuc3BvcnRzIGJpbmRpbmdzXHJcblx0ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZVxyXG5cdCAqIDIpIHRoZSBjYXRjaGFsbCBzeW1ib2wgXCIqXCIgY2FuIGJlIHVzZWRcclxuXHQgKiAzKSBzZWxlY3Rpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBnbyB0byBcIipcIiBpZiBuZWVkZWRcclxuXHQgKi9cclxuXHR0cmFuc3BvcnRzID0ge30sXHJcblxyXG5cdC8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxyXG5cdGFsbFR5cGVzID0gW1wiKi9cIl0gKyBbXCIqXCJdO1xyXG5cclxuLy8gIzgxMzgsIElFIG1heSB0aHJvdyBhbiBleGNlcHRpb24gd2hlbiBhY2Nlc3NpbmdcclxuLy8gYSBmaWVsZCBmcm9tIHdpbmRvdy5sb2NhdGlvbiBpZiBkb2N1bWVudC5kb21haW4gaGFzIGJlZW4gc2V0XHJcbnRyeSB7XHJcblx0YWpheExvY2F0aW9uID0gbG9jYXRpb24uaHJlZjtcclxufSBjYXRjaCggZSApIHtcclxuXHQvLyBVc2UgdGhlIGhyZWYgYXR0cmlidXRlIG9mIGFuIEEgZWxlbWVudFxyXG5cdC8vIHNpbmNlIElFIHdpbGwgbW9kaWZ5IGl0IGdpdmVuIGRvY3VtZW50LmxvY2F0aW9uXHJcblx0YWpheExvY2F0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJhXCIgKTtcclxuXHRhamF4TG9jYXRpb24uaHJlZiA9IFwiXCI7XHJcblx0YWpheExvY2F0aW9uID0gYWpheExvY2F0aW9uLmhyZWY7XHJcbn1cclxuXHJcbi8vIFNlZ21lbnQgbG9jYXRpb24gaW50byBwYXJ0c1xyXG5hamF4TG9jUGFydHMgPSBydXJsLmV4ZWMoIGFqYXhMb2NhdGlvbi50b0xvd2VyQ2FzZSgpICkgfHwgW107XHJcblxyXG4vLyBCYXNlIFwiY29uc3RydWN0b3JcIiBmb3IgalF1ZXJ5LmFqYXhQcmVmaWx0ZXIgYW5kIGpRdWVyeS5hamF4VHJhbnNwb3J0XHJcbmZ1bmN0aW9uIGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlICkge1xyXG5cclxuXHQvLyBkYXRhVHlwZUV4cHJlc3Npb24gaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIFwiKlwiXHJcblx0cmV0dXJuIGZ1bmN0aW9uKCBkYXRhVHlwZUV4cHJlc3Npb24sIGZ1bmMgKSB7XHJcblxyXG5cdFx0aWYgKCB0eXBlb2YgZGF0YVR5cGVFeHByZXNzaW9uICE9PSBcInN0cmluZ1wiICkge1xyXG5cdFx0XHRmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uO1xyXG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgZGF0YVR5cGUsIGxpc3QsIHBsYWNlQmVmb3JlLFxyXG5cdFx0XHRkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5zcGxpdCggY29yZV9yc3BhY2UgKSxcclxuXHRcdFx0aSA9IDAsXHJcblx0XHRcdGxlbmd0aCA9IGRhdGFUeXBlcy5sZW5ndGg7XHJcblxyXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZnVuYyApICkge1xyXG5cdFx0XHQvLyBGb3IgZWFjaCBkYXRhVHlwZSBpbiB0aGUgZGF0YVR5cGVFeHByZXNzaW9uXHJcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xyXG5cdFx0XHRcdGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpIF07XHJcblx0XHRcdFx0Ly8gV2UgY29udHJvbCBpZiB3ZSdyZSBhc2tlZCB0byBhZGQgYmVmb3JlXHJcblx0XHRcdFx0Ly8gYW55IGV4aXN0aW5nIGVsZW1lbnRcclxuXHRcdFx0XHRwbGFjZUJlZm9yZSA9IC9eXFwrLy50ZXN0KCBkYXRhVHlwZSApO1xyXG5cdFx0XHRcdGlmICggcGxhY2VCZWZvcmUgKSB7XHJcblx0XHRcdFx0XHRkYXRhVHlwZSA9IGRhdGFUeXBlLnN1YnN0ciggMSApIHx8IFwiKlwiO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRsaXN0ID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdO1xyXG5cdFx0XHRcdC8vIHRoZW4gd2UgYWRkIHRvIHRoZSBzdHJ1Y3R1cmUgYWNjb3JkaW5nbHlcclxuXHRcdFx0XHRsaXN0WyBwbGFjZUJlZm9yZSA/IFwidW5zaGlmdFwiIDogXCJwdXNoXCIgXSggZnVuYyApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fTtcclxufVxyXG5cclxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXHJcbmZ1bmN0aW9uIGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIsXHJcblx0XHRkYXRhVHlwZSAvKiBpbnRlcm5hbCAqLywgaW5zcGVjdGVkIC8qIGludGVybmFsICovICkge1xyXG5cclxuXHRkYXRhVHlwZSA9IGRhdGFUeXBlIHx8IG9wdGlvbnMuZGF0YVR5cGVzWyAwIF07XHJcblx0aW5zcGVjdGVkID0gaW5zcGVjdGVkIHx8IHt9O1xyXG5cclxuXHRpbnNwZWN0ZWRbIGRhdGFUeXBlIF0gPSB0cnVlO1xyXG5cclxuXHR2YXIgc2VsZWN0aW9uLFxyXG5cdFx0bGlzdCA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSxcclxuXHRcdGkgPSAwLFxyXG5cdFx0bGVuZ3RoID0gbGlzdCA/IGxpc3QubGVuZ3RoIDogMCxcclxuXHRcdGV4ZWN1dGVPbmx5ID0gKCBzdHJ1Y3R1cmUgPT09IHByZWZpbHRlcnMgKTtcclxuXHJcblx0Zm9yICggOyBpIDwgbGVuZ3RoICYmICggZXhlY3V0ZU9ubHkgfHwgIXNlbGVjdGlvbiApOyBpKysgKSB7XHJcblx0XHRzZWxlY3Rpb24gPSBsaXN0WyBpIF0oIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcclxuXHRcdC8vIElmIHdlIGdvdCByZWRpcmVjdGVkIHRvIGFub3RoZXIgZGF0YVR5cGVcclxuXHRcdC8vIHdlIHRyeSB0aGVyZSBpZiBleGVjdXRpbmcgb25seSBhbmQgbm90IGRvbmUgYWxyZWFkeVxyXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0aW9uID09PSBcInN0cmluZ1wiICkge1xyXG5cdFx0XHRpZiAoICFleGVjdXRlT25seSB8fCBpbnNwZWN0ZWRbIHNlbGVjdGlvbiBdICkge1xyXG5cdFx0XHRcdHNlbGVjdGlvbiA9IHVuZGVmaW5lZDtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBzZWxlY3Rpb24gKTtcclxuXHRcdFx0XHRzZWxlY3Rpb24gPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyhcclxuXHRcdFx0XHRcdFx0c3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSLCBzZWxlY3Rpb24sIGluc3BlY3RlZCApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdC8vIElmIHdlJ3JlIG9ubHkgZXhlY3V0aW5nIG9yIG5vdGhpbmcgd2FzIHNlbGVjdGVkXHJcblx0Ly8gd2UgdHJ5IHRoZSBjYXRjaGFsbCBkYXRhVHlwZSBpZiBub3QgZG9uZSBhbHJlYWR5XHJcblx0aWYgKCAoIGV4ZWN1dGVPbmx5IHx8ICFzZWxlY3Rpb24gKSAmJiAhaW5zcGVjdGVkWyBcIipcIiBdICkge1xyXG5cdFx0c2VsZWN0aW9uID0gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoXHJcblx0XHRcdFx0c3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSLCBcIipcIiwgaW5zcGVjdGVkICk7XHJcblx0fVxyXG5cdC8vIHVubmVjZXNzYXJ5IHdoZW4gb25seSBleGVjdXRpbmcgKHByZWZpbHRlcnMpXHJcblx0Ly8gYnV0IGl0J2xsIGJlIGlnbm9yZWQgYnkgdGhlIGNhbGxlciBpbiB0aGF0IGNhc2VcclxuXHRyZXR1cm4gc2VsZWN0aW9uO1xyXG59XHJcblxyXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcclxuLy8gdGhhdCB0YWtlcyBcImZsYXRcIiBvcHRpb25zIChub3QgdG8gYmUgZGVlcCBleHRlbmRlZClcclxuLy8gRml4ZXMgIzk4ODdcclxuZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7XHJcblx0dmFyIGtleSwgZGVlcCxcclxuXHRcdGZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTtcclxuXHRmb3IgKCBrZXkgaW4gc3JjICkge1xyXG5cdFx0aWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdCggZmxhdE9wdGlvbnNbIGtleSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8ICggZGVlcCA9IHt9ICkgKSApWyBrZXkgXSA9IHNyY1sga2V5IF07XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmICggZGVlcCApIHtcclxuXHRcdGpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApO1xyXG5cdH1cclxufVxyXG5cclxualF1ZXJ5LmZuLmxvYWQgPSBmdW5jdGlvbiggdXJsLCBwYXJhbXMsIGNhbGxiYWNrICkge1xyXG5cdGlmICggdHlwZW9mIHVybCAhPT0gXCJzdHJpbmdcIiAmJiBfbG9hZCApIHtcclxuXHRcdHJldHVybiBfbG9hZC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XHJcblx0fVxyXG5cclxuXHQvLyBEb24ndCBkbyBhIHJlcXVlc3QgaWYgbm8gZWxlbWVudHMgYXJlIGJlaW5nIHJlcXVlc3RlZFxyXG5cdGlmICggIXRoaXMubGVuZ3RoICkge1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cclxuXHR2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNlLFxyXG5cdFx0c2VsZiA9IHRoaXMsXHJcblx0XHRvZmYgPSB1cmwuaW5kZXhPZihcIiBcIik7XHJcblxyXG5cdGlmICggb2ZmID49IDAgKSB7XHJcblx0XHRzZWxlY3RvciA9IHVybC5zbGljZSggb2ZmLCB1cmwubGVuZ3RoICk7XHJcblx0XHR1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApO1xyXG5cdH1cclxuXHJcblx0Ly8gSWYgaXQncyBhIGZ1bmN0aW9uXHJcblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcGFyYW1zICkgKSB7XHJcblxyXG5cdFx0Ly8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2tcclxuXHRcdGNhbGxiYWNrID0gcGFyYW1zO1xyXG5cdFx0cGFyYW1zID0gdW5kZWZpbmVkO1xyXG5cclxuXHQvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nXHJcblx0fSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgKSB7XHJcblx0XHR0eXBlID0gXCJQT1NUXCI7XHJcblx0fVxyXG5cclxuXHQvLyBSZXF1ZXN0IHRoZSByZW1vdGUgZG9jdW1lbnRcclxuXHRqUXVlcnkuYWpheCh7XHJcblx0XHR1cmw6IHVybCxcclxuXHJcblx0XHQvLyBpZiBcInR5cGVcIiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZW4gXCJHRVRcIiBtZXRob2Qgd2lsbCBiZSB1c2VkXHJcblx0XHR0eXBlOiB0eXBlLFxyXG5cdFx0ZGF0YVR5cGU6IFwiaHRtbFwiLFxyXG5cdFx0ZGF0YTogcGFyYW1zLFxyXG5cdFx0Y29tcGxldGU6IGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkge1xyXG5cdFx0XHRpZiAoIGNhbGxiYWNrICkge1xyXG5cdFx0XHRcdHNlbGYuZWFjaCggY2FsbGJhY2ssIHJlc3BvbnNlIHx8IFsganFYSFIucmVzcG9uc2VUZXh0LCBzdGF0dXMsIGpxWEhSIF0gKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0pLmRvbmUoZnVuY3Rpb24oIHJlc3BvbnNlVGV4dCApIHtcclxuXHJcblx0XHQvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2tcclxuXHRcdHJlc3BvbnNlID0gYXJndW1lbnRzO1xyXG5cclxuXHRcdC8vIFNlZSBpZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWRcclxuXHRcdHNlbGYuaHRtbCggc2VsZWN0b3IgP1xyXG5cclxuXHRcdFx0Ly8gQ3JlYXRlIGEgZHVtbXkgZGl2IHRvIGhvbGQgdGhlIHJlc3VsdHNcclxuXHRcdFx0alF1ZXJ5KFwiPGRpdj5cIilcclxuXHJcblx0XHRcdFx0Ly8gaW5qZWN0IHRoZSBjb250ZW50cyBvZiB0aGUgZG9jdW1lbnQgaW4sIHJlbW92aW5nIHRoZSBzY3JpcHRzXHJcblx0XHRcdFx0Ly8gdG8gYXZvaWQgYW55ICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzIGluIElFXHJcblx0XHRcdFx0LmFwcGVuZCggcmVzcG9uc2VUZXh0LnJlcGxhY2UoIHJzY3JpcHQsIFwiXCIgKSApXHJcblxyXG5cdFx0XHRcdC8vIExvY2F0ZSB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzXHJcblx0XHRcdFx0LmZpbmQoIHNlbGVjdG9yICkgOlxyXG5cclxuXHRcdFx0Ly8gSWYgbm90LCBqdXN0IGluamVjdCB0aGUgZnVsbCByZXN1bHRcclxuXHRcdFx0cmVzcG9uc2VUZXh0ICk7XHJcblxyXG5cdH0pO1xyXG5cclxuXHRyZXR1cm4gdGhpcztcclxufTtcclxuXHJcbi8vIEF0dGFjaCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY29tbW9uIEFKQVggZXZlbnRzXHJcbmpRdWVyeS5lYWNoKCBcImFqYXhTdGFydCBhamF4U3RvcCBhamF4Q29tcGxldGUgYWpheEVycm9yIGFqYXhTdWNjZXNzIGFqYXhTZW5kXCIuc3BsaXQoIFwiIFwiICksIGZ1bmN0aW9uKCBpLCBvICl7XHJcblx0alF1ZXJ5LmZuWyBvIF0gPSBmdW5jdGlvbiggZiApe1xyXG5cdFx0cmV0dXJuIHRoaXMub24oIG8sIGYgKTtcclxuXHR9O1xyXG59KTtcclxuXHJcbmpRdWVyeS5lYWNoKCBbIFwiZ2V0XCIsIFwicG9zdFwiIF0sIGZ1bmN0aW9uKCBpLCBtZXRob2QgKSB7XHJcblx0alF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkge1xyXG5cdFx0Ly8gc2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWRcclxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHtcclxuXHRcdFx0dHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7XHJcblx0XHRcdGNhbGxiYWNrID0gZGF0YTtcclxuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4galF1ZXJ5LmFqYXgoe1xyXG5cdFx0XHR0eXBlOiBtZXRob2QsXHJcblx0XHRcdHVybDogdXJsLFxyXG5cdFx0XHRkYXRhOiBkYXRhLFxyXG5cdFx0XHRzdWNjZXNzOiBjYWxsYmFjayxcclxuXHRcdFx0ZGF0YVR5cGU6IHR5cGVcclxuXHRcdH0pO1xyXG5cdH07XHJcbn0pO1xyXG5cclxualF1ZXJ5LmV4dGVuZCh7XHJcblxyXG5cdGdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCB1bmRlZmluZWQsIGNhbGxiYWNrLCBcInNjcmlwdFwiICk7XHJcblx0fSxcclxuXHJcblx0Z2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCBkYXRhLCBjYWxsYmFjaywgXCJqc29uXCIgKTtcclxuXHR9LFxyXG5cclxuXHQvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldFxyXG5cdC8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy5cclxuXHQvLyBJZiB0YXJnZXQgaXMgb21pdHRlZCwgd3JpdGVzIGludG8gYWpheFNldHRpbmdzLlxyXG5cdGFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7XHJcblx0XHRpZiAoIHNldHRpbmdzICkge1xyXG5cdFx0XHQvLyBCdWlsZGluZyBhIHNldHRpbmdzIG9iamVjdFxyXG5cdFx0XHRhamF4RXh0ZW5kKCB0YXJnZXQsIGpRdWVyeS5hamF4U2V0dGluZ3MgKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3NcclxuXHRcdFx0c2V0dGluZ3MgPSB0YXJnZXQ7XHJcblx0XHRcdHRhcmdldCA9IGpRdWVyeS5hamF4U2V0dGluZ3M7XHJcblx0XHR9XHJcblx0XHRhamF4RXh0ZW5kKCB0YXJnZXQsIHNldHRpbmdzICk7XHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cdH0sXHJcblxyXG5cdGFqYXhTZXR0aW5nczoge1xyXG5cdFx0dXJsOiBhamF4TG9jYXRpb24sXHJcblx0XHRpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBhamF4TG9jUGFydHNbIDEgXSApLFxyXG5cdFx0Z2xvYmFsOiB0cnVlLFxyXG5cdFx0dHlwZTogXCJHRVRcIixcclxuXHRcdGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOFwiLFxyXG5cdFx0cHJvY2Vzc0RhdGE6IHRydWUsXHJcblx0XHRhc3luYzogdHJ1ZSxcclxuXHRcdC8qXHJcblx0XHR0aW1lb3V0OiAwLFxyXG5cdFx0ZGF0YTogbnVsbCxcclxuXHRcdGRhdGFUeXBlOiBudWxsLFxyXG5cdFx0dXNlcm5hbWU6IG51bGwsXHJcblx0XHRwYXNzd29yZDogbnVsbCxcclxuXHRcdGNhY2hlOiBudWxsLFxyXG5cdFx0dGhyb3dzOiBmYWxzZSxcclxuXHRcdHRyYWRpdGlvbmFsOiBmYWxzZSxcclxuXHRcdGhlYWRlcnM6IHt9LFxyXG5cdFx0Ki9cclxuXHJcblx0XHRhY2NlcHRzOiB7XHJcblx0XHRcdHhtbDogXCJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sXCIsXHJcblx0XHRcdGh0bWw6IFwidGV4dC9odG1sXCIsXHJcblx0XHRcdHRleHQ6IFwidGV4dC9wbGFpblwiLFxyXG5cdFx0XHRqc29uOiBcImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdFwiLFxyXG5cdFx0XHRcIipcIjogYWxsVHlwZXNcclxuXHRcdH0sXHJcblxyXG5cdFx0Y29udGVudHM6IHtcclxuXHRcdFx0eG1sOiAveG1sLyxcclxuXHRcdFx0aHRtbDogL2h0bWwvLFxyXG5cdFx0XHRqc29uOiAvanNvbi9cclxuXHRcdH0sXHJcblxyXG5cdFx0cmVzcG9uc2VGaWVsZHM6IHtcclxuXHRcdFx0eG1sOiBcInJlc3BvbnNlWE1MXCIsXHJcblx0XHRcdHRleHQ6IFwicmVzcG9uc2VUZXh0XCJcclxuXHRcdH0sXHJcblxyXG5cdFx0Ly8gTGlzdCBvZiBkYXRhIGNvbnZlcnRlcnNcclxuXHRcdC8vIDEpIGtleSBmb3JtYXQgaXMgXCJzb3VyY2VfdHlwZSBkZXN0aW5hdGlvbl90eXBlXCIgKGEgc2luZ2xlIHNwYWNlIGluLWJldHdlZW4pXHJcblx0XHQvLyAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkIGZvciBzb3VyY2VfdHlwZVxyXG5cdFx0Y29udmVydGVyczoge1xyXG5cclxuXHRcdFx0Ly8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0XHJcblx0XHRcdFwiKiB0ZXh0XCI6IHdpbmRvdy5TdHJpbmcsXHJcblxyXG5cdFx0XHQvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbilcclxuXHRcdFx0XCJ0ZXh0IGh0bWxcIjogdHJ1ZSxcclxuXHJcblx0XHRcdC8vIEV2YWx1YXRlIHRleHQgYXMgYSBqc29uIGV4cHJlc3Npb25cclxuXHRcdFx0XCJ0ZXh0IGpzb25cIjogalF1ZXJ5LnBhcnNlSlNPTixcclxuXHJcblx0XHRcdC8vIFBhcnNlIHRleHQgYXMgeG1sXHJcblx0XHRcdFwidGV4dCB4bWxcIjogalF1ZXJ5LnBhcnNlWE1MXHJcblx0XHR9LFxyXG5cclxuXHRcdC8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6XHJcblx0XHQvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmXHJcblx0XHQvLyBhbmQgd2hlbiB5b3UgY3JlYXRlIG9uZSB0aGF0IHNob3VsZG4ndCBiZVxyXG5cdFx0Ly8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpXHJcblx0XHRmbGF0T3B0aW9uczoge1xyXG5cdFx0XHRjb250ZXh0OiB0cnVlLFxyXG5cdFx0XHR1cmw6IHRydWVcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRhamF4UHJlZmlsdGVyOiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMgKSxcclxuXHRhamF4VHJhbnNwb3J0OiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMgKSxcclxuXHJcblx0Ly8gTWFpbiBtZXRob2RcclxuXHRhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkge1xyXG5cclxuXHRcdC8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlXHJcblx0XHRpZiAoIHR5cGVvZiB1cmwgPT09IFwib2JqZWN0XCIgKSB7XHJcblx0XHRcdG9wdGlvbnMgPSB1cmw7XHJcblx0XHRcdHVybCA9IHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBGb3JjZSBvcHRpb25zIHRvIGJlIGFuIG9iamVjdFxyXG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XHJcblxyXG5cdFx0dmFyIC8vIGlmTW9kaWZpZWQga2V5XHJcblx0XHRcdGlmTW9kaWZpZWRLZXksXHJcblx0XHRcdC8vIFJlc3BvbnNlIGhlYWRlcnNcclxuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nLFxyXG5cdFx0XHRyZXNwb25zZUhlYWRlcnMsXHJcblx0XHRcdC8vIHRyYW5zcG9ydFxyXG5cdFx0XHR0cmFuc3BvcnQsXHJcblx0XHRcdC8vIHRpbWVvdXQgaGFuZGxlXHJcblx0XHRcdHRpbWVvdXRUaW1lcixcclxuXHRcdFx0Ly8gQ3Jvc3MtZG9tYWluIGRldGVjdGlvbiB2YXJzXHJcblx0XHRcdHBhcnRzLFxyXG5cdFx0XHQvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWRcclxuXHRcdFx0ZmlyZUdsb2JhbHMsXHJcblx0XHRcdC8vIExvb3AgdmFyaWFibGVcclxuXHRcdFx0aSxcclxuXHRcdFx0Ly8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdFxyXG5cdFx0XHRzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSxcclxuXHRcdFx0Ly8gQ2FsbGJhY2tzIGNvbnRleHRcclxuXHRcdFx0Y2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsXHJcblx0XHRcdC8vIENvbnRleHQgZm9yIGdsb2JhbCBldmVudHNcclxuXHRcdFx0Ly8gSXQncyB0aGUgY2FsbGJhY2tDb250ZXh0IGlmIG9uZSB3YXMgcHJvdmlkZWQgaW4gdGhlIG9wdGlvbnNcclxuXHRcdFx0Ly8gYW5kIGlmIGl0J3MgYSBET00gbm9kZSBvciBhIGpRdWVyeSBjb2xsZWN0aW9uXHJcblx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dCA9IGNhbGxiYWNrQ29udGV4dCAhPT0gcyAmJlxyXG5cdFx0XHRcdCggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSApID9cclxuXHRcdFx0XHRcdFx0alF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6IGpRdWVyeS5ldmVudCxcclxuXHRcdFx0Ly8gRGVmZXJyZWRzXHJcblx0XHRcdGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksXHJcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcclxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3NcclxuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcclxuXHRcdFx0Ly8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSlcclxuXHRcdFx0cmVxdWVzdEhlYWRlcnMgPSB7fSxcclxuXHRcdFx0cmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LFxyXG5cdFx0XHQvLyBUaGUganFYSFIgc3RhdGVcclxuXHRcdFx0c3RhdGUgPSAwLFxyXG5cdFx0XHQvLyBEZWZhdWx0IGFib3J0IG1lc3NhZ2VcclxuXHRcdFx0c3RyQWJvcnQgPSBcImNhbmNlbGVkXCIsXHJcblx0XHRcdC8vIEZha2UgeGhyXHJcblx0XHRcdGpxWEhSID0ge1xyXG5cclxuXHRcdFx0XHRyZWFkeVN0YXRlOiAwLFxyXG5cclxuXHRcdFx0XHQvLyBDYWNoZXMgdGhlIGhlYWRlclxyXG5cdFx0XHRcdHNldFJlcXVlc3RIZWFkZXI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcclxuXHRcdFx0XHRcdGlmICggIXN0YXRlICkge1xyXG5cdFx0XHRcdFx0XHR2YXIgbG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0XHRcdG5hbWUgPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5hbWUgXSB8fCBuYW1lO1xyXG5cdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc1sgbmFtZSBdID0gdmFsdWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdFx0XHR9LFxyXG5cclxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXHJcblx0XHRcdFx0Z2V0QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdHJldHVybiBzdGF0ZSA9PT0gMiA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7XHJcblx0XHRcdFx0fSxcclxuXHJcblx0XHRcdFx0Ly8gQnVpbGRzIGhlYWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZFxyXG5cdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkge1xyXG5cdFx0XHRcdFx0dmFyIG1hdGNoO1xyXG5cdFx0XHRcdFx0aWYgKCBzdGF0ZSA9PT0gMiApIHtcclxuXHRcdFx0XHRcdFx0aWYgKCAhcmVzcG9uc2VIZWFkZXJzICkge1xyXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVycyA9IHt9O1xyXG5cdFx0XHRcdFx0XHRcdHdoaWxlKCAoIG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5nICkgKSApIHtcclxuXHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbMV0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0bWF0Y2ggPSByZXNwb25zZUhlYWRlcnNbIGtleS50b0xvd2VyQ2FzZSgpIF07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT09IHVuZGVmaW5lZCA/IG51bGwgOiBtYXRjaDtcclxuXHRcdFx0XHR9LFxyXG5cclxuXHRcdFx0XHQvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlclxyXG5cdFx0XHRcdG92ZXJyaWRlTWltZVR5cGU6IGZ1bmN0aW9uKCB0eXBlICkge1xyXG5cdFx0XHRcdFx0aWYgKCAhc3RhdGUgKSB7XHJcblx0XHRcdFx0XHRcdHMubWltZVR5cGUgPSB0eXBlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XHJcblx0XHRcdFx0fSxcclxuXHJcblx0XHRcdFx0Ly8gQ2FuY2VsIHRoZSByZXF1ZXN0XHJcblx0XHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkge1xyXG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7XHJcblx0XHRcdFx0XHRpZiAoIHRyYW5zcG9ydCApIHtcclxuXHRcdFx0XHRcdFx0dHJhbnNwb3J0LmFib3J0KCBzdGF0dXNUZXh0ICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRkb25lKCAwLCBzdGF0dXNUZXh0ICk7XHJcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH07XHJcblxyXG5cdFx0Ly8gQ2FsbGJhY2sgZm9yIHdoZW4gZXZlcnl0aGluZyBpcyBkb25lXHJcblx0XHQvLyBJdCBpcyBkZWZpbmVkIGhlcmUgYmVjYXVzZSBqc2xpbnQgY29tcGxhaW5zIGlmIGl0IGlzIGRlY2xhcmVkXHJcblx0XHQvLyBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiAod2hpY2ggd291bGQgYmUgbW9yZSBsb2dpY2FsIGFuZCByZWFkYWJsZSlcclxuXHRcdGZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkge1xyXG5cdFx0XHR2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLFxyXG5cdFx0XHRcdHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0O1xyXG5cclxuXHRcdFx0Ly8gQ2FsbGVkIG9uY2VcclxuXHRcdFx0aWYgKCBzdGF0ZSA9PT0gMiApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFN0YXRlIGlzIFwiZG9uZVwiIG5vd1xyXG5cdFx0XHRzdGF0ZSA9IDI7XHJcblxyXG5cdFx0XHQvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0c1xyXG5cdFx0XHRpZiAoIHRpbWVvdXRUaW1lciApIHtcclxuXHRcdFx0XHRjbGVhclRpbWVvdXQoIHRpbWVvdXRUaW1lciApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvblxyXG5cdFx0XHQvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhIUiBvYmplY3Qgd2lsbCBiZSB1c2VkKVxyXG5cdFx0XHR0cmFuc3BvcnQgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0XHQvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJzXHJcblx0XHRcdHJlc3BvbnNlSGVhZGVyc1N0cmluZyA9IGhlYWRlcnMgfHwgXCJcIjtcclxuXHJcblx0XHRcdC8vIFNldCByZWFkeVN0YXRlXHJcblx0XHRcdGpxWEhSLnJlYWR5U3RhdGUgPSBzdGF0dXMgPiAwID8gNCA6IDA7XHJcblxyXG5cdFx0XHQvLyBHZXQgcmVzcG9uc2UgZGF0YVxyXG5cdFx0XHRpZiAoIHJlc3BvbnNlcyApIHtcclxuXHRcdFx0XHRyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmdcclxuXHRcdFx0aWYgKCBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCB8fCBzdGF0dXMgPT09IDMwNCApIHtcclxuXHJcblx0XHRcdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cclxuXHRcdFx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcclxuXHJcblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKFwiTGFzdC1Nb2RpZmllZFwiKTtcclxuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XHJcblx0XHRcdFx0XHRcdGpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSA9IG1vZGlmaWVkO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlcihcIkV0YWdcIik7XHJcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xyXG5cdFx0XHRcdFx0XHRqUXVlcnkuZXRhZ1sgaWZNb2RpZmllZEtleSBdID0gbW9kaWZpZWQ7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBJZiBub3QgbW9kaWZpZWRcclxuXHRcdFx0XHRpZiAoIHN0YXR1cyA9PT0gMzA0ICkge1xyXG5cclxuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vdG1vZGlmaWVkXCI7XHJcblx0XHRcdFx0XHRpc1N1Y2Nlc3MgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGRhdGFcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGlzU3VjY2VzcyA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSApO1xyXG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IGlzU3VjY2Vzcy5zdGF0ZTtcclxuXHRcdFx0XHRcdHN1Y2Nlc3MgPSBpc1N1Y2Nlc3MuZGF0YTtcclxuXHRcdFx0XHRcdGVycm9yID0gaXNTdWNjZXNzLmVycm9yO1xyXG5cdFx0XHRcdFx0aXNTdWNjZXNzID0gIWVycm9yO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyBXZSBleHRyYWN0IGVycm9yIGZyb20gc3RhdHVzVGV4dFxyXG5cdFx0XHRcdC8vIHRoZW4gbm9ybWFsaXplIHN0YXR1c1RleHQgYW5kIHN0YXR1cyBmb3Igbm9uLWFib3J0c1xyXG5cdFx0XHRcdGVycm9yID0gc3RhdHVzVGV4dDtcclxuXHRcdFx0XHRpZiAoICFzdGF0dXNUZXh0IHx8IHN0YXR1cyApIHtcclxuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcImVycm9yXCI7XHJcblx0XHRcdFx0XHRpZiAoIHN0YXR1cyA8IDAgKSB7XHJcblx0XHRcdFx0XHRcdHN0YXR1cyA9IDA7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdFxyXG5cdFx0XHRqcVhIUi5zdGF0dXMgPSBzdGF0dXM7XHJcblx0XHRcdGpxWEhSLnN0YXR1c1RleHQgPSBcIlwiICsgKCBuYXRpdmVTdGF0dXNUZXh0IHx8IHN0YXR1c1RleHQgKTtcclxuXHJcblx0XHRcdC8vIFN1Y2Nlc3MvRXJyb3JcclxuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XHJcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0LCBlcnJvciBdICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXHJcblx0XHRcdGpxWEhSLnN0YXR1c0NvZGUoIHN0YXR1c0NvZGUgKTtcclxuXHRcdFx0c3RhdHVzQ29kZSA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XHJcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheFwiICsgKCBpc1N1Y2Nlc3MgPyBcIlN1Y2Nlc3NcIiA6IFwiRXJyb3JcIiApLFxyXG5cdFx0XHRcdFx0XHRbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBDb21wbGV0ZVxyXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApO1xyXG5cclxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcclxuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4Q29tcGxldGVcIiwgWyBqcVhIUiwgcyBdICk7XHJcblx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyXHJcblx0XHRcdFx0aWYgKCAhKCAtLWpRdWVyeS5hY3RpdmUgKSApIHtcclxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBcImFqYXhTdG9wXCIgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBBdHRhY2ggZGVmZXJyZWRzXHJcblx0XHRkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApO1xyXG5cdFx0anFYSFIuc3VjY2VzcyA9IGpxWEhSLmRvbmU7XHJcblx0XHRqcVhIUi5lcnJvciA9IGpxWEhSLmZhaWw7XHJcblx0XHRqcVhIUi5jb21wbGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuYWRkO1xyXG5cclxuXHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXHJcblx0XHRqcVhIUi5zdGF0dXNDb2RlID0gZnVuY3Rpb24oIG1hcCApIHtcclxuXHRcdFx0aWYgKCBtYXAgKSB7XHJcblx0XHRcdFx0dmFyIHRtcDtcclxuXHRcdFx0XHRpZiAoIHN0YXRlIDwgMiApIHtcclxuXHRcdFx0XHRcdGZvciAoIHRtcCBpbiBtYXAgKSB7XHJcblx0XHRcdFx0XHRcdHN0YXR1c0NvZGVbIHRtcCBdID0gWyBzdGF0dXNDb2RlW3RtcF0sIG1hcFt0bXBdIF07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHRtcCA9IG1hcFsganFYSFIuc3RhdHVzIF07XHJcblx0XHRcdFx0XHRqcVhIUi5hbHdheXMoIHRtcCApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gUmVtb3ZlIGhhc2ggY2hhcmFjdGVyICgjNzUzMTogYW5kIHN0cmluZyBwcm9tb3Rpb24pXHJcblx0XHQvLyBBZGQgcHJvdG9jb2wgaWYgbm90IHByb3ZpZGVkICgjNTg2NjogSUU3IGlzc3VlIHdpdGggcHJvdG9jb2wtbGVzcyB1cmxzKVxyXG5cdFx0Ly8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlXHJcblx0XHRzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgKSArIFwiXCIgKS5yZXBsYWNlKCByaGFzaCwgXCJcIiApLnJlcGxhY2UoIHJwcm90b2NvbCwgYWpheExvY1BhcnRzWyAxIF0gKyBcIi8vXCIgKTtcclxuXHJcblx0XHQvLyBFeHRyYWN0IGRhdGFUeXBlcyBsaXN0XHJcblx0XHRzLmRhdGFUeXBlcyA9IGpRdWVyeS50cmltKCBzLmRhdGFUeXBlIHx8IFwiKlwiICkudG9Mb3dlckNhc2UoKS5zcGxpdCggY29yZV9yc3BhY2UgKTtcclxuXHJcblx0XHQvLyBEZXRlcm1pbmUgaWYgYSBjcm9zcy1kb21haW4gcmVxdWVzdCBpcyBpbiBvcmRlclxyXG5cdFx0aWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7XHJcblx0XHRcdHBhcnRzID0gcnVybC5leGVjKCBzLnVybC50b0xvd2VyQ2FzZSgpICk7XHJcblx0XHRcdHMuY3Jvc3NEb21haW4gPSAhISggcGFydHMgJiZcclxuXHRcdFx0XHQoIHBhcnRzWyAxIF0gIT0gYWpheExvY1BhcnRzWyAxIF0gfHwgcGFydHNbIDIgXSAhPSBhamF4TG9jUGFydHNbIDIgXSB8fFxyXG5cdFx0XHRcdFx0KCBwYXJ0c1sgMyBdIHx8ICggcGFydHNbIDEgXSA9PT0gXCJodHRwOlwiID8gODAgOiA0NDMgKSApICE9XHJcblx0XHRcdFx0XHRcdCggYWpheExvY1BhcnRzWyAzIF0gfHwgKCBhamF4TG9jUGFydHNbIDEgXSA9PT0gXCJodHRwOlwiID8gODAgOiA0NDMgKSApIClcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmdcclxuXHRcdGlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0cy5kYXRhID0galF1ZXJ5LnBhcmFtKCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBBcHBseSBwcmVmaWx0ZXJzXHJcblx0XHRpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTtcclxuXHJcblx0XHQvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZVxyXG5cdFx0aWYgKCBzdGF0ZSA9PT0gMiApIHtcclxuXHRcdFx0cmV0dXJuIGpxWEhSO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFdlIGNhbiBmaXJlIGdsb2JhbCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2VkIHRvXHJcblx0XHRmaXJlR2xvYmFscyA9IHMuZ2xvYmFsO1xyXG5cclxuXHRcdC8vIFVwcGVyY2FzZSB0aGUgdHlwZVxyXG5cdFx0cy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7XHJcblxyXG5cdFx0Ly8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnRcclxuXHRcdHMuaGFzQ29udGVudCA9ICFybm9Db250ZW50LnRlc3QoIHMudHlwZSApO1xyXG5cclxuXHRcdC8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHNcclxuXHRcdGlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkge1xyXG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggXCJhamF4U3RhcnRcIiApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50XHJcblx0XHRpZiAoICFzLmhhc0NvbnRlbnQgKSB7XHJcblxyXG5cdFx0XHQvLyBJZiBkYXRhIGlzIGF2YWlsYWJsZSwgYXBwZW5kIGRhdGEgdG8gdXJsXHJcblx0XHRcdGlmICggcy5kYXRhICkge1xyXG5cdFx0XHRcdHMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIHMudXJsICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGE7XHJcblx0XHRcdFx0Ly8gIzk2ODI6IHJlbW92ZSBkYXRhIHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeVxyXG5cdFx0XHRcdGRlbGV0ZSBzLmRhdGE7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEdldCBpZk1vZGlmaWVkS2V5IGJlZm9yZSBhZGRpbmcgdGhlIGFudGktY2FjaGUgcGFyYW1ldGVyXHJcblx0XHRcdGlmTW9kaWZpZWRLZXkgPSBzLnVybDtcclxuXHJcblx0XHRcdC8vIEFkZCBhbnRpLWNhY2hlIGluIHVybCBpZiBuZWVkZWRcclxuXHRcdFx0aWYgKCBzLmNhY2hlID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0dmFyIHRzID0galF1ZXJ5Lm5vdygpLFxyXG5cdFx0XHRcdFx0Ly8gdHJ5IHJlcGxhY2luZyBfPSBpZiBpdCBpcyB0aGVyZVxyXG5cdFx0XHRcdFx0cmV0ID0gcy51cmwucmVwbGFjZSggcnRzLCBcIiQxXz1cIiArIHRzICk7XHJcblxyXG5cdFx0XHRcdC8vIGlmIG5vdGhpbmcgd2FzIHJlcGxhY2VkLCBhZGQgdGltZXN0YW1wIHRvIHRoZSBlbmRcclxuXHRcdFx0XHRzLnVybCA9IHJldCArICggKCByZXQgPT09IHMudXJsICkgPyAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gXCImXCIgOiBcIj9cIiApICsgXCJfPVwiICsgdHMgOiBcIlwiICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnRcclxuXHRcdGlmICggcy5kYXRhICYmIHMuaGFzQ29udGVudCAmJiBzLmNvbnRlbnRUeXBlICE9PSBmYWxzZSB8fCBvcHRpb25zLmNvbnRlbnRUeXBlICkge1xyXG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiLCBzLmNvbnRlbnRUeXBlICk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cclxuXHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xyXG5cdFx0XHRpZk1vZGlmaWVkS2V5ID0gaWZNb2RpZmllZEtleSB8fCBzLnVybDtcclxuXHRcdFx0aWYgKCBqUXVlcnkubGFzdE1vZGlmaWVkWyBpZk1vZGlmaWVkS2V5IF0gKSB7XHJcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Nb2RpZmllZC1TaW5jZVwiLCBqUXVlcnkubGFzdE1vZGlmaWVkWyBpZk1vZGlmaWVkS2V5IF0gKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIGpRdWVyeS5ldGFnWyBpZk1vZGlmaWVkS2V5IF0gKSB7XHJcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Ob25lLU1hdGNoXCIsIGpRdWVyeS5ldGFnWyBpZk1vZGlmaWVkS2V5IF0gKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGVcclxuXHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoXHJcblx0XHRcdFwiQWNjZXB0XCIsXHJcblx0XHRcdHMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdID9cclxuXHRcdFx0XHRzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWzBdIF0gKyAoIHMuZGF0YVR5cGVzWyAwIF0gIT09IFwiKlwiID8gXCIsIFwiICsgYWxsVHlwZXMgKyBcIjsgcT0wLjAxXCIgOiBcIlwiICkgOlxyXG5cdFx0XHRcdHMuYWNjZXB0c1sgXCIqXCIgXVxyXG5cdFx0KTtcclxuXHJcblx0XHQvLyBDaGVjayBmb3IgaGVhZGVycyBvcHRpb25cclxuXHRcdGZvciAoIGkgaW4gcy5oZWFkZXJzICkge1xyXG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnRcclxuXHRcdGlmICggcy5iZWZvcmVTZW5kICYmICggcy5iZWZvcmVTZW5kLmNhbGwoIGNhbGxiYWNrQ29udGV4dCwganFYSFIsIHMgKSA9PT0gZmFsc2UgfHwgc3RhdGUgPT09IDIgKSApIHtcclxuXHRcdFx0XHQvLyBBYm9ydCBpZiBub3QgZG9uZSBhbHJlYWR5IGFuZCByZXR1cm5cclxuXHRcdFx0XHRyZXR1cm4ganFYSFIuYWJvcnQoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYWJvcnRpbmcgaXMgbm8gbG9uZ2VyIGEgY2FuY2VsbGF0aW9uXHJcblx0XHRzdHJBYm9ydCA9IFwiYWJvcnRcIjtcclxuXHJcblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrcyBvbiBkZWZlcnJlZHNcclxuXHRcdGZvciAoIGkgaW4geyBzdWNjZXNzOiAxLCBlcnJvcjogMSwgY29tcGxldGU6IDEgfSApIHtcclxuXHRcdFx0anFYSFJbIGkgXSggc1sgaSBdICk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gR2V0IHRyYW5zcG9ydFxyXG5cdFx0dHJhbnNwb3J0ID0gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMsIHMsIG9wdGlvbnMsIGpxWEhSICk7XHJcblxyXG5cdFx0Ly8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0XHJcblx0XHRpZiAoICF0cmFuc3BvcnQgKSB7XHJcblx0XHRcdGRvbmUoIC0xLCBcIk5vIFRyYW5zcG9ydFwiICk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gMTtcclxuXHRcdFx0Ly8gU2VuZCBnbG9iYWwgZXZlbnRcclxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcclxuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4U2VuZFwiLCBbIGpxWEhSLCBzIF0gKTtcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBUaW1lb3V0XHJcblx0XHRcdGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkge1xyXG5cdFx0XHRcdHRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoIGZ1bmN0aW9uKCl7XHJcblx0XHRcdFx0XHRqcVhIUi5hYm9ydCggXCJ0aW1lb3V0XCIgKTtcclxuXHRcdFx0XHR9LCBzLnRpbWVvdXQgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRzdGF0ZSA9IDE7XHJcblx0XHRcdFx0dHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7XHJcblx0XHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0XHQvLyBQcm9wYWdhdGUgZXhjZXB0aW9uIGFzIGVycm9yIGlmIG5vdCBkb25lXHJcblx0XHRcdFx0aWYgKCBzdGF0ZSA8IDIgKSB7XHJcblx0XHRcdFx0XHRkb25lKCAtMSwgZSApO1xyXG5cdFx0XHRcdC8vIFNpbXBseSByZXRocm93IG90aGVyd2lzZVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aHJvdyBlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBqcVhIUjtcclxuXHR9LFxyXG5cclxuXHQvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXNcclxuXHRhY3RpdmU6IDAsXHJcblxyXG5cdC8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3RcclxuXHRsYXN0TW9kaWZpZWQ6IHt9LFxyXG5cdGV0YWc6IHt9XHJcblxyXG59KTtcclxuXHJcbi8qIEhhbmRsZXMgcmVzcG9uc2VzIHRvIGFuIGFqYXggcmVxdWVzdDpcclxuICogLSBzZXRzIGFsbCByZXNwb25zZVhYWCBmaWVsZHMgYWNjb3JkaW5nbHlcclxuICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSlcclxuICogLSByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXHJcbiAqL1xyXG5mdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkge1xyXG5cclxuXHR2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsXHJcblx0XHRjb250ZW50cyA9IHMuY29udGVudHMsXHJcblx0XHRkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcyxcclxuXHRcdHJlc3BvbnNlRmllbGRzID0gcy5yZXNwb25zZUZpZWxkcztcclxuXHJcblx0Ly8gRmlsbCByZXNwb25zZVhYWCBmaWVsZHNcclxuXHRmb3IgKCB0eXBlIGluIHJlc3BvbnNlRmllbGRzICkge1xyXG5cdFx0aWYgKCB0eXBlIGluIHJlc3BvbnNlcyApIHtcclxuXHRcdFx0anFYSFJbIHJlc3BvbnNlRmllbGRzW3R5cGVdIF0gPSByZXNwb25zZXNbIHR5cGUgXTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzXHJcblx0d2hpbGUoIGRhdGFUeXBlc1sgMCBdID09PSBcIipcIiApIHtcclxuXHRcdGRhdGFUeXBlcy5zaGlmdCgpO1xyXG5cdFx0aWYgKCBjdCA9PT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRjdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiY29udGVudC10eXBlXCIgKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZVxyXG5cdGlmICggY3QgKSB7XHJcblx0XHRmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkge1xyXG5cdFx0XHRpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkge1xyXG5cdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0eXBlICk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZVxyXG5cdGlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkge1xyXG5cdFx0ZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdO1xyXG5cdH0gZWxzZSB7XHJcblx0XHQvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzXHJcblx0XHRmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHtcclxuXHRcdFx0aWYgKCAhZGF0YVR5cGVzWyAwIF0gfHwgcy5jb252ZXJ0ZXJzWyB0eXBlICsgXCIgXCIgKyBkYXRhVHlwZXNbMF0gXSApIHtcclxuXHRcdFx0XHRmaW5hbERhdGFUeXBlID0gdHlwZTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoICFmaXJzdERhdGFUeXBlICkge1xyXG5cdFx0XHRcdGZpcnN0RGF0YVR5cGUgPSB0eXBlO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHQvLyBPciBqdXN0IHVzZSBmaXJzdCBvbmVcclxuXHRcdGZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7XHJcblx0fVxyXG5cclxuXHQvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlXHJcblx0Ly8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWRcclxuXHQvLyBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXHJcblx0aWYgKCBmaW5hbERhdGFUeXBlICkge1xyXG5cdFx0aWYgKCBmaW5hbERhdGFUeXBlICE9PSBkYXRhVHlwZXNbIDAgXSApIHtcclxuXHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIGZpbmFsRGF0YVR5cGUgKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTtcclxuXHR9XHJcbn1cclxuXHJcbi8vIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2VcclxuZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlICkge1xyXG5cclxuXHR2YXIgY29udiwgY29udjIsIGN1cnJlbnQsIHRtcCxcclxuXHRcdC8vIFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNpb25cclxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCksXHJcblx0XHRwcmV2ID0gZGF0YVR5cGVzWyAwIF0sXHJcblx0XHRjb252ZXJ0ZXJzID0ge30sXHJcblx0XHRpID0gMDtcclxuXHJcblx0Ly8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWRcclxuXHRpZiAoIHMuZGF0YUZpbHRlciApIHtcclxuXHRcdHJlc3BvbnNlID0gcy5kYXRhRmlsdGVyKCByZXNwb25zZSwgcy5kYXRhVHlwZSApO1xyXG5cdH1cclxuXHJcblx0Ly8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNlZCBrZXlzXHJcblx0aWYgKCBkYXRhVHlwZXNbIDEgXSApIHtcclxuXHRcdGZvciAoIGNvbnYgaW4gcy5jb252ZXJ0ZXJzICkge1xyXG5cdFx0XHRjb252ZXJ0ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gQ29udmVydCB0byBlYWNoIHNlcXVlbnRpYWwgZGF0YVR5cGUsIHRvbGVyYXRpbmcgbGlzdCBtb2RpZmljYXRpb25cclxuXHRmb3IgKCA7IChjdXJyZW50ID0gZGF0YVR5cGVzWysraV0pOyApIHtcclxuXHJcblx0XHQvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBjdXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvXHJcblx0XHRpZiAoIGN1cnJlbnQgIT09IFwiKlwiICkge1xyXG5cclxuXHRcdFx0Ly8gQ29udmVydCByZXNwb25zZSBpZiBwcmV2IGRhdGFUeXBlIGlzIG5vbi1hdXRvIGFuZCBkaWZmZXJzIGZyb20gY3VycmVudFxyXG5cdFx0XHRpZiAoIHByZXYgIT09IFwiKlwiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7XHJcblxyXG5cdFx0XHRcdC8vIFNlZWsgYSBkaXJlY3QgY29udmVydGVyXHJcblx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIGN1cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyBcIiogXCIgKyBjdXJyZW50IF07XHJcblxyXG5cdFx0XHRcdC8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyXHJcblx0XHRcdFx0aWYgKCAhY29udiApIHtcclxuXHRcdFx0XHRcdGZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBJZiBjb252MiBvdXRwdXRzIGN1cnJlbnRcclxuXHRcdFx0XHRcdFx0dG1wID0gY29udjIuc3BsaXQoXCIgXCIpO1xyXG5cdFx0XHRcdFx0XHRpZiAoIHRtcFsgMSBdID09PSBjdXJyZW50ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvLyBJZiBwcmV2IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYWNjZXB0ZWQgaW5wdXRcclxuXHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgdG1wWyAwIF0gXSB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyc1sgXCIqIFwiICsgdG1wWyAwIF0gXTtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvLyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJzXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgPT09IHRydWUgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGVcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnZlcnRlcnNbIGNvbnYyIF0gIT09IHRydWUgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnQgPSB0bXBbIDAgXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZGF0YVR5cGVzLnNwbGljZSggaS0tLCAwLCBjdXJyZW50ICk7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSlcclxuXHRcdFx0XHRpZiAoIGNvbnYgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbVxyXG5cdFx0XHRcdFx0aWYgKCBjb252ICYmIHNbXCJ0aHJvd3NcIl0gKSB7XHJcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xyXG5cdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4geyBzdGF0ZTogXCJwYXJzZXJlcnJvclwiLCBlcnJvcjogY29udiA/IGUgOiBcIk5vIGNvbnZlcnNpb24gZnJvbSBcIiArIHByZXYgKyBcIiB0byBcIiArIGN1cnJlbnQgfTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gVXBkYXRlIHByZXYgZm9yIG5leHQgaXRlcmF0aW9uXHJcblx0XHRcdHByZXYgPSBjdXJyZW50O1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHsgc3RhdGU6IFwic3VjY2Vzc1wiLCBkYXRhOiByZXNwb25zZSB9O1xyXG59XHJcbnZhciBvbGRDYWxsYmFja3MgPSBbXSxcclxuXHRycXVlc3Rpb24gPSAvXFw/LyxcclxuXHRyanNvbnAgPSAvKD0pXFw/KD89JnwkKXxcXD9cXD8vLFxyXG5cdG5vbmNlID0galF1ZXJ5Lm5vdygpO1xyXG5cclxuLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5nc1xyXG5qUXVlcnkuYWpheFNldHVwKHtcclxuXHRqc29ucDogXCJjYWxsYmFja1wiLFxyXG5cdGpzb25wQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyBcIl9cIiArICggbm9uY2UrKyApICk7XHJcblx0XHR0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTtcclxuXHRcdHJldHVybiBjYWxsYmFjaztcclxuXHR9XHJcbn0pO1xyXG5cclxuLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzXHJcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcImpzb24ganNvbnBcIiwgZnVuY3Rpb24oIHMsIG9yaWdpbmFsU2V0dGluZ3MsIGpxWEhSICkge1xyXG5cclxuXHR2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsXHJcblx0XHRkYXRhID0gcy5kYXRhLFxyXG5cdFx0dXJsID0gcy51cmwsXHJcblx0XHRoYXNDYWxsYmFjayA9IHMuanNvbnAgIT09IGZhbHNlLFxyXG5cdFx0cmVwbGFjZUluVXJsID0gaGFzQ2FsbGJhY2sgJiYgcmpzb25wLnRlc3QoIHVybCApLFxyXG5cdFx0cmVwbGFjZUluRGF0YSA9IGhhc0NhbGxiYWNrICYmICFyZXBsYWNlSW5VcmwgJiYgdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgJiZcclxuXHRcdFx0ISggcy5jb250ZW50VHlwZSB8fCBcIlwiICkuaW5kZXhPZihcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKSAmJlxyXG5cdFx0XHRyanNvbnAudGVzdCggZGF0YSApO1xyXG5cclxuXHQvLyBIYW5kbGUgaWZmIHRoZSBleHBlY3RlZCBkYXRhIHR5cGUgaXMgXCJqc29ucFwiIG9yIHdlIGhhdmUgYSBwYXJhbWV0ZXIgdG8gc2V0XHJcblx0aWYgKCBzLmRhdGFUeXBlc1sgMCBdID09PSBcImpzb25wXCIgfHwgcmVwbGFjZUluVXJsIHx8IHJlcGxhY2VJbkRhdGEgKSB7XHJcblxyXG5cdFx0Ly8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdFxyXG5cdFx0Y2FsbGJhY2tOYW1lID0gcy5qc29ucENhbGxiYWNrID0galF1ZXJ5LmlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID9cclxuXHRcdFx0cy5qc29ucENhbGxiYWNrKCkgOlxyXG5cdFx0XHRzLmpzb25wQ2FsbGJhY2s7XHJcblx0XHRvdmVyd3JpdHRlbiA9IHdpbmRvd1sgY2FsbGJhY2tOYW1lIF07XHJcblxyXG5cdFx0Ly8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YVxyXG5cdFx0aWYgKCByZXBsYWNlSW5VcmwgKSB7XHJcblx0XHRcdHMudXJsID0gdXJsLnJlcGxhY2UoIHJqc29ucCwgXCIkMVwiICsgY2FsbGJhY2tOYW1lICk7XHJcblx0XHR9IGVsc2UgaWYgKCByZXBsYWNlSW5EYXRhICkge1xyXG5cdFx0XHRzLmRhdGEgPSBkYXRhLnJlcGxhY2UoIHJqc29ucCwgXCIkMVwiICsgY2FsbGJhY2tOYW1lICk7XHJcblx0XHR9IGVsc2UgaWYgKCBoYXNDYWxsYmFjayApIHtcclxuXHRcdFx0cy51cmwgKz0gKCBycXVlc3Rpb24udGVzdCggdXJsICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmpzb25wICsgXCI9XCIgKyBjYWxsYmFja05hbWU7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVXNlIGRhdGEgY29udmVydGVyIHRvIHJldHJpZXZlIGpzb24gYWZ0ZXIgc2NyaXB0IGV4ZWN1dGlvblxyXG5cdFx0cy5jb252ZXJ0ZXJzW1wic2NyaXB0IGpzb25cIl0gPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0aWYgKCAhcmVzcG9uc2VDb250YWluZXIgKSB7XHJcblx0XHRcdFx0alF1ZXJ5LmVycm9yKCBjYWxsYmFja05hbWUgKyBcIiB3YXMgbm90IGNhbGxlZFwiICk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07XHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIGZvcmNlIGpzb24gZGF0YVR5cGVcclxuXHRcdHMuZGF0YVR5cGVzWyAwIF0gPSBcImpzb25cIjtcclxuXHJcblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrXHJcblx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzO1xyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29udmVydGVycylcclxuXHRcdGpxWEhSLmFsd2F5cyhmdW5jdGlvbigpIHtcclxuXHRcdFx0Ly8gUmVzdG9yZSBwcmVleGlzdGluZyB2YWx1ZVxyXG5cdFx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47XHJcblxyXG5cdFx0XHQvLyBTYXZlIGJhY2sgYXMgZnJlZVxyXG5cdFx0XHRpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkge1xyXG5cdFx0XHRcdC8vIG1ha2Ugc3VyZSB0aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25zIGRvZXNuJ3Qgc2NyZXcgdGhpbmdzIGFyb3VuZFxyXG5cdFx0XHRcdHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjaztcclxuXHJcblx0XHRcdFx0Ly8gc2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZVxyXG5cdFx0XHRcdG9sZENhbGxiYWNrcy5wdXNoKCBjYWxsYmFja05hbWUgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlXHJcblx0XHRcdGlmICggcmVzcG9uc2VDb250YWluZXIgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIG92ZXJ3cml0dGVuICkgKSB7XHJcblx0XHRcdFx0b3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIERlbGVnYXRlIHRvIHNjcmlwdFxyXG5cdFx0cmV0dXJuIFwic2NyaXB0XCI7XHJcblx0fVxyXG59KTtcclxuLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGVcclxualF1ZXJ5LmFqYXhTZXR1cCh7XHJcblx0YWNjZXB0czoge1xyXG5cdFx0c2NyaXB0OiBcInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0XCJcclxuXHR9LFxyXG5cdGNvbnRlbnRzOiB7XHJcblx0XHRzY3JpcHQ6IC9qYXZhc2NyaXB0fGVjbWFzY3JpcHQvXHJcblx0fSxcclxuXHRjb252ZXJ0ZXJzOiB7XHJcblx0XHRcInRleHQgc2NyaXB0XCI6IGZ1bmN0aW9uKCB0ZXh0ICkge1xyXG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggdGV4dCApO1xyXG5cdFx0XHRyZXR1cm4gdGV4dDtcclxuXHRcdH1cclxuXHR9XHJcbn0pO1xyXG5cclxuLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBnbG9iYWxcclxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xyXG5cdGlmICggcy5jYWNoZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cdFx0cy5jYWNoZSA9IGZhbHNlO1xyXG5cdH1cclxuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XHJcblx0XHRzLnR5cGUgPSBcIkdFVFwiO1xyXG5cdFx0cy5nbG9iYWwgPSBmYWxzZTtcclxuXHR9XHJcbn0pO1xyXG5cclxuLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0XHJcbmpRdWVyeS5hamF4VHJhbnNwb3J0KCBcInNjcmlwdFwiLCBmdW5jdGlvbihzKSB7XHJcblxyXG5cdC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gcmVxdWVzdHNcclxuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XHJcblxyXG5cdFx0dmFyIHNjcmlwdCxcclxuXHRcdFx0aGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwiaGVhZFwiIClbMF0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xyXG5cclxuXHRcdHJldHVybiB7XHJcblxyXG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggXywgY2FsbGJhY2sgKSB7XHJcblxyXG5cdFx0XHRcdHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwic2NyaXB0XCIgKTtcclxuXHJcblx0XHRcdFx0c2NyaXB0LmFzeW5jID0gXCJhc3luY1wiO1xyXG5cclxuXHRcdFx0XHRpZiAoIHMuc2NyaXB0Q2hhcnNldCApIHtcclxuXHRcdFx0XHRcdHNjcmlwdC5jaGFyc2V0ID0gcy5zY3JpcHRDaGFyc2V0O1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0c2NyaXB0LnNyYyA9IHMudXJsO1xyXG5cclxuXHRcdFx0XHQvLyBBdHRhY2ggaGFuZGxlcnMgZm9yIGFsbCBicm93c2Vyc1xyXG5cdFx0XHRcdHNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpc0Fib3J0IHx8ICFzY3JpcHQucmVhZHlTdGF0ZSB8fCAvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KCBzY3JpcHQucmVhZHlTdGF0ZSApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIG1lbW9yeSBsZWFrIGluIElFXHJcblx0XHRcdFx0XHRcdHNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcclxuXHJcblx0XHRcdFx0XHRcdC8vIFJlbW92ZSB0aGUgc2NyaXB0XHJcblx0XHRcdFx0XHRcdGlmICggaGVhZCAmJiBzY3JpcHQucGFyZW50Tm9kZSApIHtcclxuXHRcdFx0XHRcdFx0XHRoZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0Ly8gRGVyZWZlcmVuY2UgdGhlIHNjcmlwdFxyXG5cdFx0XHRcdFx0XHRzY3JpcHQgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBDYWxsYmFjayBpZiBub3QgYWJvcnRcclxuXHRcdFx0XHRcdFx0aWYgKCAhaXNBYm9ydCApIHtcclxuXHRcdFx0XHRcdFx0XHRjYWxsYmFjayggMjAwLCBcInN1Y2Nlc3NcIiApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHQvLyBVc2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQgb2YgYXBwZW5kQ2hpbGQgIHRvIGNpcmN1bXZlbnQgYW4gSUU2IGJ1Zy5cclxuXHRcdFx0XHQvLyBUaGlzIGFyaXNlcyB3aGVuIGEgYmFzZSBub2RlIGlzIHVzZWQgKCMyNzA5IGFuZCAjNDM3OCkuXHJcblx0XHRcdFx0aGVhZC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgaGVhZC5maXJzdENoaWxkICk7XHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0aWYgKCBzY3JpcHQgKSB7XHJcblx0XHRcdFx0XHRzY3JpcHQub25sb2FkKCAwLCAxICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cdH1cclxufSk7XHJcbnZhciB4aHJDYWxsYmFja3MsXHJcblx0Ly8gIzUyODA6IEludGVybmV0IEV4cGxvcmVyIHdpbGwga2VlcCBjb25uZWN0aW9ucyBhbGl2ZSBpZiB3ZSBkb24ndCBhYm9ydCBvbiB1bmxvYWRcclxuXHR4aHJPblVubG9hZEFib3J0ID0gd2luZG93LkFjdGl2ZVhPYmplY3QgPyBmdW5jdGlvbigpIHtcclxuXHRcdC8vIEFib3J0IGFsbCBwZW5kaW5nIHJlcXVlc3RzXHJcblx0XHRmb3IgKCB2YXIga2V5IGluIHhockNhbGxiYWNrcyApIHtcclxuXHRcdFx0eGhyQ2FsbGJhY2tzWyBrZXkgXSggMCwgMSApO1xyXG5cdFx0fVxyXG5cdH0gOiBmYWxzZSxcclxuXHR4aHJJZCA9IDA7XHJcblxyXG4vLyBGdW5jdGlvbnMgdG8gY3JlYXRlIHhocnNcclxuZnVuY3Rpb24gY3JlYXRlU3RhbmRhcmRYSFIoKSB7XHJcblx0dHJ5IHtcclxuXHRcdHJldHVybiBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XHJcblx0fSBjYXRjaCggZSApIHt9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUFjdGl2ZVhIUigpIHtcclxuXHR0cnkge1xyXG5cdFx0cmV0dXJuIG5ldyB3aW5kb3cuQWN0aXZlWE9iamVjdCggXCJNaWNyb3NvZnQuWE1MSFRUUFwiICk7XHJcblx0fSBjYXRjaCggZSApIHt9XHJcbn1cclxuXHJcbi8vIENyZWF0ZSB0aGUgcmVxdWVzdCBvYmplY3RcclxuLy8gKFRoaXMgaXMgc3RpbGwgYXR0YWNoZWQgdG8gYWpheFNldHRpbmdzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxyXG5qUXVlcnkuYWpheFNldHRpbmdzLnhociA9IHdpbmRvdy5BY3RpdmVYT2JqZWN0ID9cclxuXHQvKiBNaWNyb3NvZnQgZmFpbGVkIHRvIHByb3Blcmx5XHJcblx0ICogaW1wbGVtZW50IHRoZSBYTUxIdHRwUmVxdWVzdCBpbiBJRTcgKGNhbid0IHJlcXVlc3QgbG9jYWwgZmlsZXMpLFxyXG5cdCAqIHNvIHdlIHVzZSB0aGUgQWN0aXZlWE9iamVjdCB3aGVuIGl0IGlzIGF2YWlsYWJsZVxyXG5cdCAqIEFkZGl0aW9uYWxseSBYTUxIdHRwUmVxdWVzdCBjYW4gYmUgZGlzYWJsZWQgaW4gSUU3L0lFOCBzb1xyXG5cdCAqIHdlIG5lZWQgYSBmYWxsYmFjay5cclxuXHQgKi9cclxuXHRmdW5jdGlvbigpIHtcclxuXHRcdHJldHVybiAhdGhpcy5pc0xvY2FsICYmIGNyZWF0ZVN0YW5kYXJkWEhSKCkgfHwgY3JlYXRlQWN0aXZlWEhSKCk7XHJcblx0fSA6XHJcblx0Ly8gRm9yIGFsbCBvdGhlciBicm93c2VycywgdXNlIHRoZSBzdGFuZGFyZCBYTUxIdHRwUmVxdWVzdCBvYmplY3RcclxuXHRjcmVhdGVTdGFuZGFyZFhIUjtcclxuXHJcbi8vIERldGVybWluZSBzdXBwb3J0IHByb3BlcnRpZXNcclxuKGZ1bmN0aW9uKCB4aHIgKSB7XHJcblx0alF1ZXJ5LmV4dGVuZCggalF1ZXJ5LnN1cHBvcnQsIHtcclxuXHRcdGFqYXg6ICEheGhyLFxyXG5cdFx0Y29yczogISF4aHIgJiYgKCBcIndpdGhDcmVkZW50aWFsc1wiIGluIHhociApXHJcblx0fSk7XHJcbn0pKCBqUXVlcnkuYWpheFNldHRpbmdzLnhocigpICk7XHJcblxyXG4vLyBDcmVhdGUgdHJhbnNwb3J0IGlmIHRoZSBicm93c2VyIGNhbiBwcm92aWRlIGFuIHhoclxyXG5pZiAoIGpRdWVyeS5zdXBwb3J0LmFqYXggKSB7XHJcblxyXG5cdGpRdWVyeS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKCBzICkge1xyXG5cdFx0Ly8gQ3Jvc3MgZG9tYWluIG9ubHkgYWxsb3dlZCBpZiBzdXBwb3J0ZWQgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdFxyXG5cdFx0aWYgKCAhcy5jcm9zc0RvbWFpbiB8fCBqUXVlcnkuc3VwcG9ydC5jb3JzICkge1xyXG5cclxuXHRcdFx0dmFyIGNhbGxiYWNrO1xyXG5cclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRzZW5kOiBmdW5jdGlvbiggaGVhZGVycywgY29tcGxldGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gR2V0IGEgbmV3IHhoclxyXG5cdFx0XHRcdFx0dmFyIGhhbmRsZSwgaSxcclxuXHRcdFx0XHRcdFx0eGhyID0gcy54aHIoKTtcclxuXHJcblx0XHRcdFx0XHQvLyBPcGVuIHRoZSBzb2NrZXRcclxuXHRcdFx0XHRcdC8vIFBhc3NpbmcgbnVsbCB1c2VybmFtZSwgZ2VuZXJhdGVzIGEgbG9naW4gcG9wdXAgb24gT3BlcmEgKCMyODY1KVxyXG5cdFx0XHRcdFx0aWYgKCBzLnVzZXJuYW1lICkge1xyXG5cdFx0XHRcdFx0XHR4aHIub3Blbiggcy50eXBlLCBzLnVybCwgcy5hc3luYywgcy51c2VybmFtZSwgcy5wYXNzd29yZCApO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0eGhyLm9wZW4oIHMudHlwZSwgcy51cmwsIHMuYXN5bmMgKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBBcHBseSBjdXN0b20gZmllbGRzIGlmIHByb3ZpZGVkXHJcblx0XHRcdFx0XHRpZiAoIHMueGhyRmllbGRzICkge1xyXG5cdFx0XHRcdFx0XHRmb3IgKCBpIGluIHMueGhyRmllbGRzICkge1xyXG5cdFx0XHRcdFx0XHRcdHhoclsgaSBdID0gcy54aHJGaWVsZHNbIGkgXTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWRcclxuXHRcdFx0XHRcdGlmICggcy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHtcclxuXHRcdFx0XHRcdFx0eGhyLm92ZXJyaWRlTWltZVR5cGUoIHMubWltZVR5cGUgKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlclxyXG5cdFx0XHRcdFx0Ly8gRm9yIGNyb3NzLWRvbWFpbiByZXF1ZXN0cywgc2VlaW5nIGFzIGNvbmRpdGlvbnMgZm9yIGEgcHJlZmxpZ2h0IGFyZVxyXG5cdFx0XHRcdFx0Ly8gYWtpbiB0byBhIGppZ3NhdyBwdXp6bGUsIHdlIHNpbXBseSBuZXZlciBzZXQgaXQgdG8gYmUgc3VyZS5cclxuXHRcdFx0XHRcdC8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKVxyXG5cdFx0XHRcdFx0Ly8gRm9yIHNhbWUtZG9tYWluIHJlcXVlc3RzLCB3b24ndCBjaGFuZ2UgaGVhZGVyIGlmIGFscmVhZHkgcHJvdmlkZWQuXHJcblx0XHRcdFx0XHRpZiAoICFzLmNyb3NzRG9tYWluICYmICFoZWFkZXJzW1wiWC1SZXF1ZXN0ZWQtV2l0aFwiXSApIHtcclxuXHRcdFx0XHRcdFx0aGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSA9IFwiWE1MSHR0cFJlcXVlc3RcIjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBOZWVkIGFuIGV4dHJhIHRyeS9jYXRjaCBmb3IgY3Jvc3MgZG9tYWluIHJlcXVlc3RzIGluIEZpcmVmb3ggM1xyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0Zm9yICggaSBpbiBoZWFkZXJzICkge1xyXG5cdFx0XHRcdFx0XHRcdHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBjYXRjaCggXyApIHt9XHJcblxyXG5cdFx0XHRcdFx0Ly8gRG8gc2VuZCB0aGUgcmVxdWVzdFxyXG5cdFx0XHRcdFx0Ly8gVGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uIHdoaWNoIGlzIGFjdHVhbGx5XHJcblx0XHRcdFx0XHQvLyBoYW5kbGVkIGluIGpRdWVyeS5hamF4IChzbyBubyB0cnkvY2F0Y2ggaGVyZSlcclxuXHRcdFx0XHRcdHhoci5zZW5kKCAoIHMuaGFzQ29udGVudCAmJiBzLmRhdGEgKSB8fCBudWxsICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gTGlzdGVuZXJcclxuXHRcdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHR2YXIgc3RhdHVzLFxyXG5cdFx0XHRcdFx0XHRcdHN0YXR1c1RleHQsXHJcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzLFxyXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlcyxcclxuXHRcdFx0XHRcdFx0XHR4bWw7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBGaXJlZm94IHRocm93cyBleGNlcHRpb25zIHdoZW4gYWNjZXNzaW5nIHByb3BlcnRpZXNcclxuXHRcdFx0XHRcdFx0Ly8gb2YgYW4geGhyIHdoZW4gYSBuZXR3b3JrIGVycm9yIG9jY3VycmVkXHJcblx0XHRcdFx0XHRcdC8vIGh0dHA6Ly9oZWxwZnVsLmtub2JzLWRpYWxzLmNvbS9pbmRleC5waHAvQ29tcG9uZW50X3JldHVybmVkX2ZhaWx1cmVfY29kZTpfMHg4MDA0MDExMV8oTlNfRVJST1JfTk9UX0FWQUlMQUJMRSlcclxuXHRcdFx0XHRcdFx0dHJ5IHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Ly8gV2FzIG5ldmVyIGNhbGxlZCBhbmQgaXMgYWJvcnRlZCBvciBjb21wbGV0ZVxyXG5cdFx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sgJiYgKCBpc0Fib3J0IHx8IHhoci5yZWFkeVN0YXRlID09PSA0ICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBjYWxsZWQgb25jZVxyXG5cdFx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gRG8gbm90IGtlZXAgYXMgYWN0aXZlIGFueW1vcmVcclxuXHRcdFx0XHRcdFx0XHRcdGlmICggaGFuZGxlICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0galF1ZXJ5Lm5vb3A7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggeGhyT25VbmxvYWRBYm9ydCApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWxldGUgeGhyQ2FsbGJhY2tzWyBoYW5kbGUgXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8vIElmIGl0J3MgYW4gYWJvcnRcclxuXHRcdFx0XHRcdFx0XHRcdGlmICggaXNBYm9ydCApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQWJvcnQgaXQgbWFudWFsbHkgaWYgbmVlZGVkXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggeGhyLnJlYWR5U3RhdGUgIT09IDQgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLmFib3J0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHN0YXR1cyA9IHhoci5zdGF0dXM7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVycyA9IHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VzID0ge307XHJcblx0XHRcdFx0XHRcdFx0XHRcdHhtbCA9IHhoci5yZXNwb25zZVhNTDtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8vIENvbnN0cnVjdCByZXNwb25zZSBsaXN0XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggeG1sICYmIHhtbC5kb2N1bWVudEVsZW1lbnQgLyogIzQ5NTggKi8gKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VzLnhtbCA9IHhtbDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiByZXF1ZXN0aW5nIGJpbmFyeSBkYXRhLCBJRTYtOSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBvbiBhbnkgYXR0ZW1wdCB0byBhY2Nlc3MgcmVzcG9uc2VUZXh0ICgjMTE0MjYpXHJcblx0XHRcdFx0XHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VzLnRleHQgPSB4aHIucmVzcG9uc2VUZXh0O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGNhdGNoKCBfICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBGaXJlZm94IHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBhY2Nlc3NpbmdcclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gc3RhdHVzVGV4dCBmb3IgZmF1bHR5IGNyb3NzLWRvbWFpbiByZXF1ZXN0c1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0YXR1c1RleHQgPSB4aHIuc3RhdHVzVGV4dDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCggZSApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBXZSBub3JtYWxpemUgd2l0aCBXZWJraXQgZ2l2aW5nIGFuIGVtcHR5IHN0YXR1c1RleHRcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gRmlsdGVyIHN0YXR1cyBmb3Igbm9uIHN0YW5kYXJkIGJlaGF2aW9yc1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHJlcXVlc3QgaXMgbG9jYWwgYW5kIHdlIGhhdmUgZGF0YTogYXNzdW1lIGEgc3VjY2Vzc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyAoc3VjY2VzcyB3aXRoIG5vIGRhdGEgd29uJ3QgZ2V0IG5vdGlmaWVkLCB0aGF0J3MgdGhlIGJlc3Qgd2VcclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gY2FuIGRvIGdpdmVuIGN1cnJlbnQgaW1wbGVtZW50YXRpb25zKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoICFzdGF0dXMgJiYgcy5pc0xvY2FsICYmICFzLmNyb3NzRG9tYWluICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0YXR1cyA9IHJlc3BvbnNlcy50ZXh0ID8gMjAwIDogNDA0O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBJRSAtICMxNDUwOiBzb21ldGltZXMgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDEyMjMgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3RhdHVzID0gMjA0O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGNhdGNoKCBmaXJlZm94QWNjZXNzRXhjZXB0aW9uICkge1xyXG5cdFx0XHRcdFx0XHRcdGlmICggIWlzQWJvcnQgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggLTEsIGZpcmVmb3hBY2Nlc3NFeGNlcHRpb24gKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8vIENhbGwgY29tcGxldGUgaWYgbmVlZGVkXHJcblx0XHRcdFx0XHRcdGlmICggcmVzcG9uc2VzICkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCBzdGF0dXMsIHN0YXR1c1RleHQsIHJlc3BvbnNlcywgcmVzcG9uc2VIZWFkZXJzICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhcy5hc3luYyApIHtcclxuXHRcdFx0XHRcdFx0Ly8gaWYgd2UncmUgaW4gc3luYyBtb2RlIHdlIGZpcmUgdGhlIGNhbGxiYWNrXHJcblx0XHRcdFx0XHRcdGNhbGxiYWNrKCk7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHtcclxuXHRcdFx0XHRcdFx0Ly8gKElFNiAmIElFNykgaWYgaXQncyBpbiBjYWNoZSBhbmQgaGFzIGJlZW5cclxuXHRcdFx0XHRcdFx0Ly8gcmV0cmlldmVkIGRpcmVjdGx5IHdlIG5lZWQgdG8gZmlyZSB0aGUgY2FsbGJhY2tcclxuXHRcdFx0XHRcdFx0c2V0VGltZW91dCggY2FsbGJhY2ssIDAgKTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGhhbmRsZSA9ICsreGhySWQ7XHJcblx0XHRcdFx0XHRcdGlmICggeGhyT25VbmxvYWRBYm9ydCApIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBDcmVhdGUgdGhlIGFjdGl2ZSB4aHJzIGNhbGxiYWNrcyBsaXN0IGlmIG5lZWRlZFxyXG5cdFx0XHRcdFx0XHRcdC8vIGFuZCBhdHRhY2ggdGhlIHVubG9hZCBoYW5kbGVyXHJcblx0XHRcdFx0XHRcdFx0aWYgKCAheGhyQ2FsbGJhY2tzICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0eGhyQ2FsbGJhY2tzID0ge307XHJcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkoIHdpbmRvdyApLnVubG9hZCggeGhyT25VbmxvYWRBYm9ydCApO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHQvLyBBZGQgdG8gbGlzdCBvZiBhY3RpdmUgeGhycyBjYWxsYmFja3NcclxuXHRcdFx0XHRcdFx0XHR4aHJDYWxsYmFja3NbIGhhbmRsZSBdID0gY2FsbGJhY2s7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGNhbGxiYWNrO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblxyXG5cdFx0XHRcdGFib3J0OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XHJcblx0XHRcdFx0XHRcdGNhbGxiYWNrKDAsMSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cdH0pO1xyXG59XHJcbnZhciBmeE5vdywgdGltZXJJZCxcclxuXHRyZnh0eXBlcyA9IC9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxcclxuXHRyZnhudW0gPSBuZXcgUmVnRXhwKCBcIl4oPzooWy0rXSk9fCkoXCIgKyBjb3JlX3BudW0gKyBcIikoW2EteiVdKikkXCIsIFwiaVwiICksXHJcblx0cnJ1biA9IC9xdWV1ZUhvb2tzJC8sXHJcblx0YW5pbWF0aW9uUHJlZmlsdGVycyA9IFsgZGVmYXVsdFByZWZpbHRlciBdLFxyXG5cdHR3ZWVuZXJzID0ge1xyXG5cdFx0XCIqXCI6IFtmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7XHJcblx0XHRcdHZhciBlbmQsIHVuaXQsIHByZXZTY2FsZSxcclxuXHRcdFx0XHR0d2VlbiA9IHRoaXMuY3JlYXRlVHdlZW4oIHByb3AsIHZhbHVlICksXHJcblx0XHRcdFx0cGFydHMgPSByZnhudW0uZXhlYyggdmFsdWUgKSxcclxuXHRcdFx0XHR0YXJnZXQgPSB0d2Vlbi5jdXIoKSxcclxuXHRcdFx0XHRzdGFydCA9ICt0YXJnZXQgfHwgMCxcclxuXHRcdFx0XHRzY2FsZSA9IDE7XHJcblxyXG5cdFx0XHRpZiAoIHBhcnRzICkge1xyXG5cdFx0XHRcdGVuZCA9ICtwYXJ0c1syXTtcclxuXHRcdFx0XHR1bml0ID0gcGFydHNbM10gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyBcIlwiIDogXCJweFwiICk7XHJcblxyXG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gY29tcHV0ZSBzdGFydGluZyB2YWx1ZVxyXG5cdFx0XHRcdGlmICggdW5pdCAhPT0gXCJweFwiICYmIHN0YXJ0ICkge1xyXG5cdFx0XHRcdFx0Ly8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnRcclxuXHRcdFx0XHRcdC8vIFByZWZlciB0aGUgY3VycmVudCBwcm9wZXJ0eSwgYmVjYXVzZSB0aGlzIHByb2Nlc3Mgd2lsbCBiZSB0cml2aWFsIGlmIGl0IHVzZXMgdGhlIHNhbWUgdW5pdHNcclxuXHRcdFx0XHRcdC8vIEZhbGxiYWNrIHRvIGVuZCBvciBhIHNpbXBsZSBjb25zdGFudFxyXG5cdFx0XHRcdFx0c3RhcnQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCBwcm9wLCB0cnVlICkgfHwgZW5kIHx8IDE7XHJcblxyXG5cdFx0XHRcdFx0ZG8ge1xyXG5cdFx0XHRcdFx0XHQvLyBJZiBwcmV2aW91cyBpdGVyYXRpb24gemVyb2VkIG91dCwgZG91YmxlIHVudGlsIHdlIGdldCAqc29tZXRoaW5nKlxyXG5cdFx0XHRcdFx0XHQvLyBVc2UgYSBzdHJpbmcgZm9yIGRvdWJsaW5nIGZhY3RvciBzbyB3ZSBkb24ndCBhY2NpZGVudGFsbHkgc2VlIHNjYWxlIGFzIHVuY2hhbmdlZCBiZWxvd1xyXG5cdFx0XHRcdFx0XHRwcmV2U2NhbGUgPSBzY2FsZSA9IHNjYWxlIHx8IFwiLjVcIjtcclxuXHJcblx0XHRcdFx0XHRcdC8vIEFkanVzdCBhbmQgYXBwbHlcclxuXHRcdFx0XHRcdFx0c3RhcnQgPSBzdGFydCAvIHNjYWxlO1xyXG5cdFx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0sIHByb3AsIHN0YXJ0ICsgdW5pdCApO1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gVXBkYXRlIHNjYWxlLCB0b2xlcmF0aW5nIHplcm9lcyBmcm9tIHR3ZWVuLmN1cigpXHJcblx0XHRcdFx0XHRcdHNjYWxlID0gdHdlZW4uY3VyKCkgLyB0YXJnZXQ7XHJcblxyXG5cdFx0XHRcdFx0Ly8gU3RvcCBsb29waW5nIGlmIHdlJ3ZlIGhpdCB0aGUgbWFyayBvciBzY2FsZSBpcyB1bmNoYW5nZWRcclxuXHRcdFx0XHRcdH0gd2hpbGUgKCBzY2FsZSAhPT0gMSAmJiBzY2FsZSAhPT0gcHJldlNjYWxlICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR0d2Vlbi51bml0ID0gdW5pdDtcclxuXHRcdFx0XHR0d2Vlbi5zdGFydCA9IHN0YXJ0O1xyXG5cdFx0XHRcdC8vIElmIGEgKz0vLT0gdG9rZW4gd2FzIHByb3ZpZGVkLCB3ZSdyZSBkb2luZyBhIHJlbGF0aXZlIGFuaW1hdGlvblxyXG5cdFx0XHRcdHR3ZWVuLmVuZCA9IHBhcnRzWzFdID8gc3RhcnQgKyAoIHBhcnRzWzFdICsgMSApICogZW5kIDogZW5kO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiB0d2VlbjtcclxuXHRcdH1dXHJcblx0fTtcclxuXHJcbi8vIEFuaW1hdGlvbnMgY3JlYXRlZCBzeW5jaHJvbm91c2x5IHdpbGwgcnVuIHN5bmNocm9ub3VzbHlcclxuZnVuY3Rpb24gY3JlYXRlRnhOb3coKSB7XHJcblx0c2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xyXG5cdH0sIDAgKTtcclxuXHRyZXR1cm4gKCBmeE5vdyA9IGpRdWVyeS5ub3coKSApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVUd2VlbnMoIGFuaW1hdGlvbiwgcHJvcHMgKSB7XHJcblx0alF1ZXJ5LmVhY2goIHByb3BzLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7XHJcblx0XHR2YXIgY29sbGVjdGlvbiA9ICggdHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggdHdlZW5lcnNbIFwiKlwiIF0gKSxcclxuXHRcdFx0aW5kZXggPSAwLFxyXG5cdFx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcclxuXHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XHJcblx0XHRcdGlmICggY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHtcclxuXHR2YXIgcmVzdWx0LFxyXG5cdFx0aW5kZXggPSAwLFxyXG5cdFx0dHdlZW5lckluZGV4ID0gMCxcclxuXHRcdGxlbmd0aCA9IGFuaW1hdGlvblByZWZpbHRlcnMubGVuZ3RoLFxyXG5cdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkge1xyXG5cdFx0XHQvLyBkb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3JcclxuXHRcdFx0ZGVsZXRlIHRpY2suZWxlbTtcclxuXHRcdH0pLFxyXG5cdFx0dGljayA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxyXG5cdFx0XHRcdHJlbWFpbmluZyA9IE1hdGgubWF4KCAwLCBhbmltYXRpb24uc3RhcnRUaW1lICsgYW5pbWF0aW9uLmR1cmF0aW9uIC0gY3VycmVudFRpbWUgKSxcclxuXHRcdFx0XHRwZXJjZW50ID0gMSAtICggcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAgKSxcclxuXHRcdFx0XHRpbmRleCA9IDAsXHJcblx0XHRcdFx0bGVuZ3RoID0gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGg7XHJcblxyXG5cdFx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHtcclxuXHRcdFx0XHRhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggcGVyY2VudCApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgcGVyY2VudCwgcmVtYWluaW5nIF0pO1xyXG5cclxuXHRcdFx0aWYgKCBwZXJjZW50IDwgMSAmJiBsZW5ndGggKSB7XHJcblx0XHRcdFx0cmV0dXJuIHJlbWFpbmluZztcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24gXSApO1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2Uoe1xyXG5cdFx0XHRlbGVtOiBlbGVtLFxyXG5cdFx0XHRwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSxcclxuXHRcdFx0b3B0czogalF1ZXJ5LmV4dGVuZCggdHJ1ZSwgeyBzcGVjaWFsRWFzaW5nOiB7fSB9LCBvcHRpb25zICksXHJcblx0XHRcdG9yaWdpbmFsUHJvcGVydGllczogcHJvcGVydGllcyxcclxuXHRcdFx0b3JpZ2luYWxPcHRpb25zOiBvcHRpb25zLFxyXG5cdFx0XHRzdGFydFRpbWU6IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksXHJcblx0XHRcdGR1cmF0aW9uOiBvcHRpb25zLmR1cmF0aW9uLFxyXG5cdFx0XHR0d2VlbnM6IFtdLFxyXG5cdFx0XHRjcmVhdGVUd2VlbjogZnVuY3Rpb24oIHByb3AsIGVuZCwgZWFzaW5nICkge1xyXG5cdFx0XHRcdHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCxcclxuXHRcdFx0XHRcdFx0YW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZ1sgcHJvcCBdIHx8IGFuaW1hdGlvbi5vcHRzLmVhc2luZyApO1xyXG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnMucHVzaCggdHdlZW4gKTtcclxuXHRcdFx0XHRyZXR1cm4gdHdlZW47XHJcblx0XHRcdH0sXHJcblx0XHRcdHN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkge1xyXG5cdFx0XHRcdHZhciBpbmRleCA9IDAsXHJcblx0XHRcdFx0XHQvLyBpZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVuZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnNcclxuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3ZSBza2lwIHRoaXMgcGFydFxyXG5cdFx0XHRcdFx0bGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDtcclxuXHJcblx0XHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XHJcblx0XHRcdFx0XHRhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gcmVzb2x2ZSB3aGVuIHdlIHBsYXllZCB0aGUgbGFzdCBmcmFtZVxyXG5cdFx0XHRcdC8vIG90aGVyd2lzZSwgcmVqZWN0XHJcblx0XHRcdFx0aWYgKCBnb3RvRW5kICkge1xyXG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdFx0fVxyXG5cdFx0fSksXHJcblx0XHRwcm9wcyA9IGFuaW1hdGlvbi5wcm9wcztcclxuXHJcblx0cHJvcEZpbHRlciggcHJvcHMsIGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmcgKTtcclxuXHJcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XHJcblx0XHRyZXN1bHQgPSBhbmltYXRpb25QcmVmaWx0ZXJzWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgZWxlbSwgcHJvcHMsIGFuaW1hdGlvbi5vcHRzICk7XHJcblx0XHRpZiAoIHJlc3VsdCApIHtcclxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGNyZWF0ZVR3ZWVucyggYW5pbWF0aW9uLCBwcm9wcyApO1xyXG5cclxuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkge1xyXG5cdFx0YW5pbWF0aW9uLm9wdHMuc3RhcnQuY2FsbCggZWxlbSwgYW5pbWF0aW9uICk7XHJcblx0fVxyXG5cclxuXHRqUXVlcnkuZngudGltZXIoXHJcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7XHJcblx0XHRcdGFuaW06IGFuaW1hdGlvbixcclxuXHRcdFx0cXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlLFxyXG5cdFx0XHRlbGVtOiBlbGVtXHJcblx0XHR9KVxyXG5cdCk7XHJcblxyXG5cdC8vIGF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zXHJcblx0cmV0dXJuIGFuaW1hdGlvbi5wcm9ncmVzcyggYW5pbWF0aW9uLm9wdHMucHJvZ3Jlc3MgKVxyXG5cdFx0LmRvbmUoIGFuaW1hdGlvbi5vcHRzLmRvbmUsIGFuaW1hdGlvbi5vcHRzLmNvbXBsZXRlIClcclxuXHRcdC5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsIClcclxuXHRcdC5hbHdheXMoIGFuaW1hdGlvbi5vcHRzLmFsd2F5cyApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwcm9wRmlsdGVyKCBwcm9wcywgc3BlY2lhbEVhc2luZyApIHtcclxuXHR2YXIgaW5kZXgsIG5hbWUsIGVhc2luZywgdmFsdWUsIGhvb2tzO1xyXG5cclxuXHQvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3NcclxuXHRmb3IgKCBpbmRleCBpbiBwcm9wcyApIHtcclxuXHRcdG5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBpbmRleCApO1xyXG5cdFx0ZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdO1xyXG5cdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXTtcclxuXHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7XHJcblx0XHRcdGVhc2luZyA9IHZhbHVlWyAxIF07XHJcblx0XHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggaW5kZXggIT09IG5hbWUgKSB7XHJcblx0XHRcdHByb3BzWyBuYW1lIF0gPSB2YWx1ZTtcclxuXHRcdFx0ZGVsZXRlIHByb3BzWyBpbmRleCBdO1xyXG5cdFx0fVxyXG5cclxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF07XHJcblx0XHRpZiAoIGhvb2tzICYmIFwiZXhwYW5kXCIgaW4gaG9va3MgKSB7XHJcblx0XHRcdHZhbHVlID0gaG9va3MuZXhwYW5kKCB2YWx1ZSApO1xyXG5cdFx0XHRkZWxldGUgcHJvcHNbIG5hbWUgXTtcclxuXHJcblx0XHRcdC8vIG5vdCBxdWl0ZSAkLmV4dGVuZCwgdGhpcyB3b250IG92ZXJ3cml0ZSBrZXlzIGFscmVhZHkgcHJlc2VudC5cclxuXHRcdFx0Ly8gYWxzbyAtIHJldXNpbmcgJ2luZGV4JyBmcm9tIGFib3ZlIGJlY2F1c2Ugd2UgaGF2ZSB0aGUgY29ycmVjdCBcIm5hbWVcIlxyXG5cdFx0XHRmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHtcclxuXHRcdFx0XHRpZiAoICEoIGluZGV4IGluIHByb3BzICkgKSB7XHJcblx0XHRcdFx0XHRwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyBpbmRleCBdO1xyXG5cdFx0XHRcdFx0c3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZztcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuXHJcbmpRdWVyeS5BbmltYXRpb24gPSBqUXVlcnkuZXh0ZW5kKCBBbmltYXRpb24sIHtcclxuXHJcblx0dHdlZW5lcjogZnVuY3Rpb24oIHByb3BzLCBjYWxsYmFjayApIHtcclxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHByb3BzICkgKSB7XHJcblx0XHRcdGNhbGxiYWNrID0gcHJvcHM7XHJcblx0XHRcdHByb3BzID0gWyBcIipcIiBdO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cHJvcHMgPSBwcm9wcy5zcGxpdChcIiBcIik7XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIHByb3AsXHJcblx0XHRcdGluZGV4ID0gMCxcclxuXHRcdFx0bGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xyXG5cclxuXHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkge1xyXG5cdFx0XHRwcm9wID0gcHJvcHNbIGluZGV4IF07XHJcblx0XHRcdHR3ZWVuZXJzWyBwcm9wIF0gPSB0d2VlbmVyc1sgcHJvcCBdIHx8IFtdO1xyXG5cdFx0XHR0d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0cHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7XHJcblx0XHRpZiAoIHByZXBlbmQgKSB7XHJcblx0XHRcdGFuaW1hdGlvblByZWZpbHRlcnMudW5zaGlmdCggY2FsbGJhY2sgKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGFuaW1hdGlvblByZWZpbHRlcnMucHVzaCggY2FsbGJhY2sgKTtcclxuXHRcdH1cclxuXHR9XHJcbn0pO1xyXG5cclxuZnVuY3Rpb24gZGVmYXVsdFByZWZpbHRlciggZWxlbSwgcHJvcHMsIG9wdHMgKSB7XHJcblx0dmFyIGluZGV4LCBwcm9wLCB2YWx1ZSwgbGVuZ3RoLCBkYXRhU2hvdywgdHdlZW4sIGhvb2tzLCBvbGRmaXJlLFxyXG5cdFx0YW5pbSA9IHRoaXMsXHJcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGUsXHJcblx0XHRvcmlnID0ge30sXHJcblx0XHRoYW5kbGVkID0gW10sXHJcblx0XHRoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuKCBlbGVtICk7XHJcblxyXG5cdC8vIGhhbmRsZSBxdWV1ZTogZmFsc2UgcHJvbWlzZXNcclxuXHRpZiAoICFvcHRzLnF1ZXVlICkge1xyXG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xyXG5cdFx0aWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkge1xyXG5cdFx0XHRob29rcy51bnF1ZXVlZCA9IDA7XHJcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xyXG5cdFx0XHRob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0aWYgKCAhaG9va3MudW5xdWV1ZWQgKSB7XHJcblx0XHRcdFx0XHRvbGRmaXJlKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cdFx0aG9va3MudW5xdWV1ZWQrKztcclxuXHJcblx0XHRhbmltLmFsd2F5cyhmdW5jdGlvbigpIHtcclxuXHRcdFx0Ly8gZG9pbmcgdGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIGNvbXBsZXRlIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWRcclxuXHRcdFx0Ly8gYmVmb3JlIHRoaXMgY29tcGxldGVzXHJcblx0XHRcdGFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGhvb2tzLnVucXVldWVkLS07XHJcblx0XHRcdFx0aWYgKCAhalF1ZXJ5LnF1ZXVlKCBlbGVtLCBcImZ4XCIgKS5sZW5ndGggKSB7XHJcblx0XHRcdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0Ly8gaGVpZ2h0L3dpZHRoIG92ZXJmbG93IHBhc3NcclxuXHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBcImhlaWdodFwiIGluIHByb3BzIHx8IFwid2lkdGhcIiBpbiBwcm9wcyApICkge1xyXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVha3Mgb3V0XHJcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90XHJcblx0XHQvLyBjaGFuZ2UgdGhlIG92ZXJmbG93IGF0dHJpYnV0ZSB3aGVuIG92ZXJmbG93WCBhbmRcclxuXHRcdC8vIG92ZXJmbG93WSBhcmUgc2V0IHRvIHRoZSBzYW1lIHZhbHVlXHJcblx0XHRvcHRzLm92ZXJmbG93ID0gWyBzdHlsZS5vdmVyZmxvdywgc3R5bGUub3ZlcmZsb3dYLCBzdHlsZS5vdmVyZmxvd1kgXTtcclxuXHJcblx0XHQvLyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBpbmxpbmUtYmxvY2sgZm9yIGhlaWdodC93aWR0aFxyXG5cdFx0Ly8gYW5pbWF0aW9ucyBvbiBpbmxpbmUgZWxlbWVudHMgdGhhdCBhcmUgaGF2aW5nIHdpZHRoL2hlaWdodCBhbmltYXRlZFxyXG5cdFx0aWYgKCBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApID09PSBcImlubGluZVwiICYmXHJcblx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJmbG9hdFwiICkgPT09IFwibm9uZVwiICkge1xyXG5cclxuXHRcdFx0Ly8gaW5saW5lLWxldmVsIGVsZW1lbnRzIGFjY2VwdCBpbmxpbmUtYmxvY2s7XHJcblx0XHRcdC8vIGJsb2NrLWxldmVsIGVsZW1lbnRzIG5lZWQgdG8gYmUgaW5saW5lIHdpdGggbGF5b3V0XHJcblx0XHRcdGlmICggIWpRdWVyeS5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQgfHwgY3NzX2RlZmF1bHREaXNwbGF5KCBlbGVtLm5vZGVOYW1lICkgPT09IFwiaW5saW5lXCIgKSB7XHJcblx0XHRcdFx0c3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHN0eWxlLnpvb20gPSAxO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRpZiAoIG9wdHMub3ZlcmZsb3cgKSB7XHJcblx0XHRzdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XHJcblx0XHRpZiAoICFqUXVlcnkuc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzICkge1xyXG5cdFx0XHRhbmltLmRvbmUoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XHJcblx0XHRcdFx0c3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdO1xyXG5cdFx0XHRcdHN0eWxlLm92ZXJmbG93WSA9IG9wdHMub3ZlcmZsb3dbIDIgXTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0Ly8gc2hvdy9oaWRlIHBhc3NcclxuXHRmb3IgKCBpbmRleCBpbiBwcm9wcyApIHtcclxuXHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF07XHJcblx0XHRpZiAoIHJmeHR5cGVzLmV4ZWMoIHZhbHVlICkgKSB7XHJcblx0XHRcdGRlbGV0ZSBwcm9wc1sgaW5kZXggXTtcclxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gKCBoaWRkZW4gPyBcImhpZGVcIiA6IFwic2hvd1wiICkgKSB7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHRcdFx0aGFuZGxlZC5wdXNoKCBpbmRleCApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0bGVuZ3RoID0gaGFuZGxlZC5sZW5ndGg7XHJcblx0aWYgKCBsZW5ndGggKSB7XHJcblx0XHRkYXRhU2hvdyA9IGpRdWVyeS5fZGF0YSggZWxlbSwgXCJmeHNob3dcIiApIHx8IGpRdWVyeS5fZGF0YSggZWxlbSwgXCJmeHNob3dcIiwge30gKTtcclxuXHRcdGlmICggaGlkZGVuICkge1xyXG5cdFx0XHRqUXVlcnkoIGVsZW0gKS5zaG93KCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRhbmltLmRvbmUoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0alF1ZXJ5KCBlbGVtICkuaGlkZSgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHRcdGFuaW0uZG9uZShmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIHByb3A7XHJcblx0XHRcdGpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCBcImZ4c2hvd1wiLCB0cnVlICk7XHJcblx0XHRcdGZvciAoIHByb3AgaW4gb3JpZyApIHtcclxuXHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIG9yaWdbIHByb3AgXSApO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdGZvciAoIGluZGV4ID0gMCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHtcclxuXHRcdFx0cHJvcCA9IGhhbmRsZWRbIGluZGV4IF07XHJcblx0XHRcdHR3ZWVuID0gYW5pbS5jcmVhdGVUd2VlbiggcHJvcCwgaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAgKTtcclxuXHRcdFx0b3JpZ1sgcHJvcCBdID0gZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTtcclxuXHJcblx0XHRcdGlmICggISggcHJvcCBpbiBkYXRhU2hvdyApICkge1xyXG5cdFx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSB0d2Vlbi5zdGFydDtcclxuXHRcdFx0XHRpZiAoIGhpZGRlbiApIHtcclxuXHRcdFx0XHRcdHR3ZWVuLmVuZCA9IHR3ZWVuLnN0YXJ0O1xyXG5cdFx0XHRcdFx0dHdlZW4uc3RhcnQgPSBwcm9wID09PSBcIndpZHRoXCIgfHwgcHJvcCA9PT0gXCJoZWlnaHRcIiA/IDEgOiAwO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuZnVuY3Rpb24gVHdlZW4oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICkge1xyXG5cdHJldHVybiBuZXcgVHdlZW4ucHJvdG90eXBlLmluaXQoIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICk7XHJcbn1cclxualF1ZXJ5LlR3ZWVuID0gVHdlZW47XHJcblxyXG5Ud2Vlbi5wcm90b3R5cGUgPSB7XHJcblx0Y29uc3RydWN0b3I6IFR3ZWVuLFxyXG5cdGluaXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZywgdW5pdCApIHtcclxuXHRcdHRoaXMuZWxlbSA9IGVsZW07XHJcblx0XHR0aGlzLnByb3AgPSBwcm9wO1xyXG5cdFx0dGhpcy5lYXNpbmcgPSBlYXNpbmcgfHwgXCJzd2luZ1wiO1xyXG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuXHRcdHRoaXMuc3RhcnQgPSB0aGlzLm5vdyA9IHRoaXMuY3VyKCk7XHJcblx0XHR0aGlzLmVuZCA9IGVuZDtcclxuXHRcdHRoaXMudW5pdCA9IHVuaXQgfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyBcIlwiIDogXCJweFwiICk7XHJcblx0fSxcclxuXHRjdXI6IGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTtcclxuXHJcblx0XHRyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID9cclxuXHRcdFx0aG9va3MuZ2V0KCB0aGlzICkgOlxyXG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7XHJcblx0fSxcclxuXHRydW46IGZ1bmN0aW9uKCBwZXJjZW50ICkge1xyXG5cdFx0dmFyIGVhc2VkLFxyXG5cdFx0XHRob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XHJcblxyXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7XHJcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKFxyXG5cdFx0XHRcdHBlcmNlbnQsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiAqIHBlcmNlbnQsIDAsIDEsIHRoaXMub3B0aW9ucy5kdXJhdGlvblxyXG5cdFx0XHQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7XHJcblx0XHR9XHJcblx0XHR0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHtcclxuXHRcdFx0dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkge1xyXG5cdFx0XHRob29rcy5zZXQoIHRoaXMgKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxufTtcclxuXHJcblR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTtcclxuXHJcblR3ZWVuLnByb3BIb29rcyA9IHtcclxuXHRfZGVmYXVsdDoge1xyXG5cdFx0Z2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XHJcblx0XHRcdHZhciByZXN1bHQ7XHJcblxyXG5cdFx0XHRpZiAoIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSAhPSBudWxsICYmXHJcblx0XHRcdFx0KCF0d2Vlbi5lbGVtLnN0eWxlIHx8IHR3ZWVuLmVsZW0uc3R5bGVbIHR3ZWVuLnByb3AgXSA9PSBudWxsKSApIHtcclxuXHRcdFx0XHRyZXR1cm4gdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBwYXNzaW5nIGFueSB2YWx1ZSBhcyBhIDR0aCBwYXJhbWV0ZXIgdG8gLmNzcyB3aWxsIGF1dG9tYXRpY2FsbHlcclxuXHRcdFx0Ly8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlsc1xyXG5cdFx0XHQvLyBzbywgc2ltcGxlIHZhbHVlcyBzdWNoIGFzIFwiMTBweFwiIGFyZSBwYXJzZWQgdG8gRmxvYXQuXHJcblx0XHRcdC8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgXCJyb3RhdGUoMXJhZClcIiBhcmUgcmV0dXJuZWQgYXMgaXMuXHJcblx0XHRcdHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIGZhbHNlLCBcIlwiICk7XHJcblx0XHRcdC8vIEVtcHR5IHN0cmluZ3MsIG51bGwsIHVuZGVmaW5lZCBhbmQgXCJhdXRvXCIgYXJlIGNvbnZlcnRlZCB0byAwLlxyXG5cdFx0XHRyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09IFwiYXV0b1wiID8gMCA6IHJlc3VsdDtcclxuXHRcdH0sXHJcblx0XHRzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcclxuXHRcdFx0Ly8gdXNlIHN0ZXAgaG9vayBmb3IgYmFjayBjb21wYXQgLSB1c2UgY3NzSG9vayBpZiBpdHMgdGhlcmUgLSB1c2UgLnN0eWxlIGlmIGl0c1xyXG5cdFx0XHQvLyBhdmFpbGFibGUgYW5kIHVzZSBwbGFpbiBwcm9wZXJ0aWVzIHdoZXJlIGF2YWlsYWJsZVxyXG5cdFx0XHRpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7XHJcblx0XHRcdFx0alF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSggdHdlZW4gKTtcclxuXHRcdFx0fSBlbHNlIGlmICggdHdlZW4uZWxlbS5zdHlsZSAmJiAoIHR3ZWVuLmVsZW0uc3R5bGVbIGpRdWVyeS5jc3NQcm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVsbCB8fCBqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnByb3AgXSApICkge1xyXG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuXHJcbi8vIFJlbW92ZSBpbiAyLjAgLSB0aGlzIHN1cHBvcnRzIElFOCdzIHBhbmljIGJhc2VkIGFwcHJvYWNoXHJcbi8vIHRvIHNldHRpbmcgdGhpbmdzIG9uIGRpc2Nvbm5lY3RlZCBub2Rlc1xyXG5cclxuVHdlZW4ucHJvcEhvb2tzLnNjcm9sbFRvcCA9IFR3ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0ID0ge1xyXG5cdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xyXG5cdFx0aWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICYmIHR3ZWVuLmVsZW0ucGFyZW50Tm9kZSApIHtcclxuXHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuXHJcbmpRdWVyeS5lYWNoKFsgXCJ0b2dnbGVcIiwgXCJzaG93XCIsIFwiaGlkZVwiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xyXG5cdHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdO1xyXG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xyXG5cdFx0cmV0dXJuIHNwZWVkID09IG51bGwgfHwgdHlwZW9mIHNwZWVkID09PSBcImJvb2xlYW5cIiB8fFxyXG5cdFx0XHQvLyBzcGVjaWFsIGNoZWNrIGZvciAudG9nZ2xlKCBoYW5kbGVyLCBoYW5kbGVyLCAuLi4gKVxyXG5cdFx0XHQoICFpICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBzcGVlZCApICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBlYXNpbmcgKSApID9cclxuXHRcdFx0Y3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDpcclxuXHRcdFx0dGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xyXG5cdH07XHJcbn0pO1xyXG5cclxualF1ZXJ5LmZuLmV4dGVuZCh7XHJcblx0ZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkge1xyXG5cclxuXHRcdC8vIHNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMFxyXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBpc0hpZGRlbiApLmNzcyggXCJvcGFjaXR5XCIsIDAgKS5zaG93KClcclxuXHJcblx0XHRcdC8vIGFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZFxyXG5cdFx0XHQuZW5kKCkuYW5pbWF0ZSh7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XHJcblx0fSxcclxuXHRhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XHJcblx0XHR2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLFxyXG5cdFx0XHRvcHRhbGwgPSBqUXVlcnkuc3BlZWQoIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICksXHJcblx0XHRcdGRvQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0Ly8gT3BlcmF0ZSBvbiBhIGNvcHkgb2YgcHJvcCBzbyBwZXItcHJvcGVydHkgZWFzaW5nIHdvbid0IGJlIGxvc3RcclxuXHRcdFx0XHR2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7XHJcblxyXG5cdFx0XHRcdC8vIEVtcHR5IGFuaW1hdGlvbnMgcmVzb2x2ZSBpbW1lZGlhdGVseVxyXG5cdFx0XHRcdGlmICggZW1wdHkgKSB7XHJcblx0XHRcdFx0XHRhbmltLnN0b3AoIHRydWUgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH07XHJcblxyXG5cdFx0cmV0dXJuIGVtcHR5IHx8IG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2UgP1xyXG5cdFx0XHR0aGlzLmVhY2goIGRvQW5pbWF0aW9uICkgOlxyXG5cdFx0XHR0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7XHJcblx0fSxcclxuXHRzdG9wOiBmdW5jdGlvbiggdHlwZSwgY2xlYXJRdWV1ZSwgZ290b0VuZCApIHtcclxuXHRcdHZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7XHJcblx0XHRcdHZhciBzdG9wID0gaG9va3Muc3RvcDtcclxuXHRcdFx0ZGVsZXRlIGhvb2tzLnN0b3A7XHJcblx0XHRcdHN0b3AoIGdvdG9FbmQgKTtcclxuXHRcdH07XHJcblxyXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0Z290b0VuZCA9IGNsZWFyUXVldWU7XHJcblx0XHRcdGNsZWFyUXVldWUgPSB0eXBlO1xyXG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCBjbGVhclF1ZXVlICYmIHR5cGUgIT09IGZhbHNlICkge1xyXG5cdFx0XHR0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgZGVxdWV1ZSA9IHRydWUsXHJcblx0XHRcdFx0aW5kZXggPSB0eXBlICE9IG51bGwgJiYgdHlwZSArIFwicXVldWVIb29rc1wiLFxyXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXHJcblx0XHRcdFx0ZGF0YSA9IGpRdWVyeS5fZGF0YSggdGhpcyApO1xyXG5cclxuXHRcdFx0aWYgKCBpbmRleCApIHtcclxuXHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkge1xyXG5cdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGZvciAoIGluZGV4IGluIGRhdGEgKSB7XHJcblx0XHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHtcclxuXHRcdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xyXG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiYgKHR5cGUgPT0gbnVsbCB8fCB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUpICkge1xyXG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApO1xyXG5cdFx0XHRcdFx0ZGVxdWV1ZSA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIHN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWRcclxuXHRcdFx0Ly8gdGltZXJzIGN1cnJlbnRseSB3aWxsIGNhbGwgdGhlaXIgY29tcGxldGUgY2FsbGJhY2tzLCB3aGljaCB3aWxsIGRlcXVldWVcclxuXHRcdFx0Ly8gYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmRcclxuXHRcdFx0aWYgKCBkZXF1ZXVlIHx8ICFnb3RvRW5kICkge1xyXG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxufSk7XHJcblxyXG4vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvblxyXG5mdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkge1xyXG5cdHZhciB3aGljaCxcclxuXHRcdGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfSxcclxuXHRcdGkgPSAwO1xyXG5cclxuXHQvLyBpZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsXHJcblx0Ly8gaWYgd2UgZG9uJ3QgaW5jbHVkZSB3aWR0aCwgc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodFxyXG5cdGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aD8gMSA6IDA7XHJcblx0Zm9yKCA7IGkgPCA0IDsgaSArPSAyIC0gaW5jbHVkZVdpZHRoICkge1xyXG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcclxuXHRcdGF0dHJzWyBcIm1hcmdpblwiICsgd2hpY2ggXSA9IGF0dHJzWyBcInBhZGRpbmdcIiArIHdoaWNoIF0gPSB0eXBlO1xyXG5cdH1cclxuXHJcblx0aWYgKCBpbmNsdWRlV2lkdGggKSB7XHJcblx0XHRhdHRycy5vcGFjaXR5ID0gYXR0cnMud2lkdGggPSB0eXBlO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIGF0dHJzO1xyXG59XHJcblxyXG4vLyBHZW5lcmF0ZSBzaG9ydGN1dHMgZm9yIGN1c3RvbSBhbmltYXRpb25zXHJcbmpRdWVyeS5lYWNoKHtcclxuXHRzbGlkZURvd246IGdlbkZ4KFwic2hvd1wiKSxcclxuXHRzbGlkZVVwOiBnZW5GeChcImhpZGVcIiksXHJcblx0c2xpZGVUb2dnbGU6IGdlbkZ4KFwidG9nZ2xlXCIpLFxyXG5cdGZhZGVJbjogeyBvcGFjaXR5OiBcInNob3dcIiB9LFxyXG5cdGZhZGVPdXQ6IHsgb3BhY2l0eTogXCJoaWRlXCIgfSxcclxuXHRmYWRlVG9nZ2xlOiB7IG9wYWNpdHk6IFwidG9nZ2xlXCIgfVxyXG59LCBmdW5jdGlvbiggbmFtZSwgcHJvcHMgKSB7XHJcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcclxuXHR9O1xyXG59KTtcclxuXHJcbmpRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHtcclxuXHR2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSBcIm9iamVjdFwiID8galF1ZXJ5LmV4dGVuZCgge30sIHNwZWVkICkgOiB7XHJcblx0XHRjb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fFxyXG5cdFx0XHRqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCxcclxuXHRcdGR1cmF0aW9uOiBzcGVlZCxcclxuXHRcdGVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZ1xyXG5cdH07XHJcblxyXG5cdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5vZmYgPyAwIDogdHlwZW9mIG9wdC5kdXJhdGlvbiA9PT0gXCJudW1iZXJcIiA/IG9wdC5kdXJhdGlvbiA6XHJcblx0XHRvcHQuZHVyYXRpb24gaW4galF1ZXJ5LmZ4LnNwZWVkcyA/IGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdIDogalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDtcclxuXHJcblx0Ly8gbm9ybWFsaXplIG9wdC5xdWV1ZSAtIHRydWUvdW5kZWZpbmVkL251bGwgLT4gXCJmeFwiXHJcblx0aWYgKCBvcHQucXVldWUgPT0gbnVsbCB8fCBvcHQucXVldWUgPT09IHRydWUgKSB7XHJcblx0XHRvcHQucXVldWUgPSBcImZ4XCI7XHJcblx0fVxyXG5cclxuXHQvLyBRdWV1ZWluZ1xyXG5cdG9wdC5vbGQgPSBvcHQuY29tcGxldGU7XHJcblxyXG5cdG9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkge1xyXG5cdFx0XHRvcHQub2xkLmNhbGwoIHRoaXMgKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG9wdC5xdWV1ZSApIHtcclxuXHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIG9wdC5xdWV1ZSApO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdHJldHVybiBvcHQ7XHJcbn07XHJcblxyXG5qUXVlcnkuZWFzaW5nID0ge1xyXG5cdGxpbmVhcjogZnVuY3Rpb24oIHAgKSB7XHJcblx0XHRyZXR1cm4gcDtcclxuXHR9LFxyXG5cdHN3aW5nOiBmdW5jdGlvbiggcCApIHtcclxuXHRcdHJldHVybiAwLjUgLSBNYXRoLmNvcyggcCpNYXRoLlBJICkgLyAyO1xyXG5cdH1cclxufTtcclxuXHJcbmpRdWVyeS50aW1lcnMgPSBbXTtcclxualF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7XHJcbmpRdWVyeS5meC50aWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dmFyIHRpbWVyLFxyXG5cdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcclxuXHRcdGkgPSAwO1xyXG5cclxuXHRmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7XHJcblx0XHR0aW1lciA9IHRpbWVyc1sgaSBdO1xyXG5cdFx0Ly8gQ2hlY2tzIHRoZSB0aW1lciBoYXMgbm90IGFscmVhZHkgYmVlbiByZW1vdmVkXHJcblx0XHRpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHtcclxuXHRcdFx0dGltZXJzLnNwbGljZSggaS0tLCAxICk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRpZiAoICF0aW1lcnMubGVuZ3RoICkge1xyXG5cdFx0alF1ZXJ5LmZ4LnN0b3AoKTtcclxuXHR9XHJcbn07XHJcblxyXG5qUXVlcnkuZngudGltZXIgPSBmdW5jdGlvbiggdGltZXIgKSB7XHJcblx0aWYgKCB0aW1lcigpICYmIGpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKSAmJiAhdGltZXJJZCApIHtcclxuXHRcdHRpbWVySWQgPSBzZXRJbnRlcnZhbCggalF1ZXJ5LmZ4LnRpY2ssIGpRdWVyeS5meC5pbnRlcnZhbCApO1xyXG5cdH1cclxufTtcclxuXHJcbmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzO1xyXG5cclxualF1ZXJ5LmZ4LnN0b3AgPSBmdW5jdGlvbigpIHtcclxuXHRjbGVhckludGVydmFsKCB0aW1lcklkICk7XHJcblx0dGltZXJJZCA9IG51bGw7XHJcbn07XHJcblxyXG5qUXVlcnkuZnguc3BlZWRzID0ge1xyXG5cdHNsb3c6IDYwMCxcclxuXHRmYXN0OiAyMDAsXHJcblx0Ly8gRGVmYXVsdCBzcGVlZFxyXG5cdF9kZWZhdWx0OiA0MDBcclxufTtcclxuXHJcbi8vIEJhY2sgQ29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50XHJcbmpRdWVyeS5meC5zdGVwID0ge307XHJcblxyXG5pZiAoIGpRdWVyeS5leHByICYmIGpRdWVyeS5leHByLmZpbHRlcnMgKSB7XHJcblx0alF1ZXJ5LmV4cHIuZmlsdGVycy5hbmltYXRlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHtcclxuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGZuLmVsZW07XHJcblx0XHR9KS5sZW5ndGg7XHJcblx0fTtcclxufVxyXG52YXIgcnJvb3QgPSAvXig/OmJvZHl8aHRtbCkkL2k7XHJcblxyXG5qUXVlcnkuZm4ub2Zmc2V0ID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XHJcblx0aWYgKCBhcmd1bWVudHMubGVuZ3RoICkge1xyXG5cdFx0cmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/XHJcblx0XHRcdHRoaXMgOlxyXG5cdFx0XHR0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7XHJcblx0XHRcdFx0alF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTtcclxuXHRcdFx0fSk7XHJcblx0fVxyXG5cclxuXHR2YXIgYm94LCBkb2NFbGVtLCBib2R5LCB3aW4sIGNsaWVudFRvcCwgY2xpZW50TGVmdCwgc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0LCB0b3AsIGxlZnQsXHJcblx0XHRlbGVtID0gdGhpc1sgMCBdLFxyXG5cdFx0ZG9jID0gZWxlbSAmJiBlbGVtLm93bmVyRG9jdW1lbnQ7XHJcblxyXG5cdGlmICggIWRvYyApIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdGlmICggKGJvZHkgPSBkb2MuYm9keSkgPT09IGVsZW0gKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KCBlbGVtICk7XHJcblx0fVxyXG5cclxuXHRkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudDtcclxuXHJcblx0Ly8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSBkaXNjb25uZWN0ZWQgRE9NIG5vZGVcclxuXHRpZiAoICFqUXVlcnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHtcclxuXHRcdHJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9O1xyXG5cdH1cclxuXHJcblx0Ym94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHR3aW4gPSBnZXRXaW5kb3coIGRvYyApO1xyXG5cdGNsaWVudFRvcCAgPSBkb2NFbGVtLmNsaWVudFRvcCAgfHwgYm9keS5jbGllbnRUb3AgIHx8IDA7XHJcblx0Y2xpZW50TGVmdCA9IGRvY0VsZW0uY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMDtcclxuXHRzY3JvbGxUb3AgID0gd2luLnBhZ2VZT2Zmc2V0IHx8IGRvY0VsZW0uc2Nyb2xsVG9wO1xyXG5cdHNjcm9sbExlZnQgPSB3aW4ucGFnZVhPZmZzZXQgfHwgZG9jRWxlbS5zY3JvbGxMZWZ0O1xyXG5cdHRvcCAgPSBib3gudG9wICArIHNjcm9sbFRvcCAgLSBjbGllbnRUb3A7XHJcblx0bGVmdCA9IGJveC5sZWZ0ICsgc2Nyb2xsTGVmdCAtIGNsaWVudExlZnQ7XHJcblxyXG5cdHJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07XHJcbn07XHJcblxyXG5qUXVlcnkub2Zmc2V0ID0ge1xyXG5cclxuXHRib2R5T2Zmc2V0OiBmdW5jdGlvbiggYm9keSApIHtcclxuXHRcdHZhciB0b3AgPSBib2R5Lm9mZnNldFRvcCxcclxuXHRcdFx0bGVmdCA9IGJvZHkub2Zmc2V0TGVmdDtcclxuXHJcblx0XHRpZiAoIGpRdWVyeS5zdXBwb3J0LmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0ICkge1xyXG5cdFx0XHR0b3AgICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoYm9keSwgXCJtYXJnaW5Ub3BcIikgKSB8fCAwO1xyXG5cdFx0XHRsZWZ0ICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoYm9keSwgXCJtYXJnaW5MZWZ0XCIpICkgfHwgMDtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9O1xyXG5cdH0sXHJcblxyXG5cdHNldE9mZnNldDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGkgKSB7XHJcblx0XHR2YXIgcG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKTtcclxuXHJcblx0XHQvLyBzZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtXHJcblx0XHRpZiAoIHBvc2l0aW9uID09PSBcInN0YXRpY1wiICkge1xyXG5cdFx0XHRlbGVtLnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBjdXJFbGVtID0galF1ZXJ5KCBlbGVtICksXHJcblx0XHRcdGN1ck9mZnNldCA9IGN1ckVsZW0ub2Zmc2V0KCksXHJcblx0XHRcdGN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwidG9wXCIgKSxcclxuXHRcdFx0Y3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwibGVmdFwiICksXHJcblx0XHRcdGNhbGN1bGF0ZVBvc2l0aW9uID0gKCBwb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiIHx8IHBvc2l0aW9uID09PSBcImZpeGVkXCIgKSAmJiBqUXVlcnkuaW5BcnJheShcImF1dG9cIiwgW2N1ckNTU1RvcCwgY3VyQ1NTTGVmdF0pID4gLTEsXHJcblx0XHRcdHByb3BzID0ge30sIGN1clBvc2l0aW9uID0ge30sIGN1clRvcCwgY3VyTGVmdDtcclxuXHJcblx0XHQvLyBuZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlciB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWRcclxuXHRcdGlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7XHJcblx0XHRcdGN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpO1xyXG5cdFx0XHRjdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7XHJcblx0XHRcdGN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0O1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y3VyVG9wID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9wICkgfHwgMDtcclxuXHRcdFx0Y3VyTGVmdCA9IHBhcnNlRmxvYXQoIGN1ckNTU0xlZnQgKSB8fCAwO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHtcclxuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgY3VyT2Zmc2V0ICk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkge1xyXG5cdFx0XHRwcm9wcy50b3AgPSAoIG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0LnRvcCApICsgY3VyVG9wO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHtcclxuXHRcdFx0cHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBcInVzaW5nXCIgaW4gb3B0aW9ucyApIHtcclxuXHRcdFx0b3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y3VyRWxlbS5jc3MoIHByb3BzICk7XHJcblx0XHR9XHJcblx0fVxyXG59O1xyXG5cclxuXHJcbmpRdWVyeS5mbi5leHRlbmQoe1xyXG5cclxuXHRwb3NpdGlvbjogZnVuY3Rpb24oKSB7XHJcblx0XHRpZiAoICF0aGlzWzBdICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGVsZW0gPSB0aGlzWzBdLFxyXG5cclxuXHRcdC8vIEdldCAqcmVhbCogb2Zmc2V0UGFyZW50XHJcblx0XHRvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCgpLFxyXG5cclxuXHRcdC8vIEdldCBjb3JyZWN0IG9mZnNldHNcclxuXHRcdG9mZnNldCAgICAgICA9IHRoaXMub2Zmc2V0KCksXHJcblx0XHRwYXJlbnRPZmZzZXQgPSBycm9vdC50ZXN0KG9mZnNldFBhcmVudFswXS5ub2RlTmFtZSkgPyB7IHRvcDogMCwgbGVmdDogMCB9IDogb2Zmc2V0UGFyZW50Lm9mZnNldCgpO1xyXG5cclxuXHRcdC8vIFN1YnRyYWN0IGVsZW1lbnQgbWFyZ2luc1xyXG5cdFx0Ly8gbm90ZTogd2hlbiBhbiBlbGVtZW50IGhhcyBtYXJnaW46IGF1dG8gdGhlIG9mZnNldExlZnQgYW5kIG1hcmdpbkxlZnRcclxuXHRcdC8vIGFyZSB0aGUgc2FtZSBpbiBTYWZhcmkgY2F1c2luZyBvZmZzZXQubGVmdCB0byBpbmNvcnJlY3RseSBiZSAwXHJcblx0XHRvZmZzZXQudG9wICAtPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKGVsZW0sIFwibWFyZ2luVG9wXCIpICkgfHwgMDtcclxuXHRcdG9mZnNldC5sZWZ0IC09IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoZWxlbSwgXCJtYXJnaW5MZWZ0XCIpICkgfHwgMDtcclxuXHJcblx0XHQvLyBBZGQgb2Zmc2V0UGFyZW50IGJvcmRlcnNcclxuXHRcdHBhcmVudE9mZnNldC50b3AgICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3Mob2Zmc2V0UGFyZW50WzBdLCBcImJvcmRlclRvcFdpZHRoXCIpICkgfHwgMDtcclxuXHRcdHBhcmVudE9mZnNldC5sZWZ0ICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3Mob2Zmc2V0UGFyZW50WzBdLCBcImJvcmRlckxlZnRXaWR0aFwiKSApIHx8IDA7XHJcblxyXG5cdFx0Ly8gU3VidHJhY3QgdGhlIHR3byBvZmZzZXRzXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHR0b3A6ICBvZmZzZXQudG9wICAtIHBhcmVudE9mZnNldC50b3AsXHJcblx0XHRcdGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnRcclxuXHRcdH07XHJcblx0fSxcclxuXHJcblx0b2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHtcclxuXHRcdHJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50LmJvZHk7XHJcblx0XHRcdHdoaWxlICggb2Zmc2V0UGFyZW50ICYmICghcnJvb3QudGVzdChvZmZzZXRQYXJlbnQubm9kZU5hbWUpICYmIGpRdWVyeS5jc3Mob2Zmc2V0UGFyZW50LCBcInBvc2l0aW9uXCIpID09PSBcInN0YXRpY1wiKSApIHtcclxuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50O1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnQuYm9keTtcclxuXHRcdH0pO1xyXG5cdH1cclxufSk7XHJcblxyXG5cclxuLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzXHJcbmpRdWVyeS5lYWNoKCB7c2Nyb2xsTGVmdDogXCJwYWdlWE9mZnNldFwiLCBzY3JvbGxUb3A6IFwicGFnZVlPZmZzZXRcIn0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7XHJcblx0dmFyIHRvcCA9IC9ZLy50ZXN0KCBwcm9wICk7XHJcblxyXG5cdGpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdmFsICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBtZXRob2QsIHZhbCApIHtcclxuXHRcdFx0dmFyIHdpbiA9IGdldFdpbmRvdyggZWxlbSApO1xyXG5cclxuXHRcdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcclxuXHRcdFx0XHRyZXR1cm4gd2luID8gKHByb3AgaW4gd2luKSA/IHdpblsgcHJvcCBdIDpcclxuXHRcdFx0XHRcdHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIG1ldGhvZCBdIDpcclxuXHRcdFx0XHRcdGVsZW1bIG1ldGhvZCBdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHdpbiApIHtcclxuXHRcdFx0XHR3aW4uc2Nyb2xsVG8oXHJcblx0XHRcdFx0XHQhdG9wID8gdmFsIDogalF1ZXJ5KCB3aW4gKS5zY3JvbGxMZWZ0KCksXHJcblx0XHRcdFx0XHQgdG9wID8gdmFsIDogalF1ZXJ5KCB3aW4gKS5zY3JvbGxUb3AoKVxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGVsZW1bIG1ldGhvZCBdID0gdmFsO1xyXG5cdFx0XHR9XHJcblx0XHR9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCwgbnVsbCApO1xyXG5cdH07XHJcbn0pO1xyXG5cclxuZnVuY3Rpb24gZ2V0V2luZG93KCBlbGVtICkge1xyXG5cdHJldHVybiBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSA/XHJcblx0XHRlbGVtIDpcclxuXHRcdGVsZW0ubm9kZVR5cGUgPT09IDkgP1xyXG5cdFx0XHRlbGVtLmRlZmF1bHRWaWV3IHx8IGVsZW0ucGFyZW50V2luZG93IDpcclxuXHRcdFx0ZmFsc2U7XHJcbn1cclxuLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzXHJcbmpRdWVyeS5lYWNoKCB7IEhlaWdodDogXCJoZWlnaHRcIiwgV2lkdGg6IFwid2lkdGhcIiB9LCBmdW5jdGlvbiggbmFtZSwgdHlwZSApIHtcclxuXHRqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiBcImlubmVyXCIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCBcIlwiOiBcIm91dGVyXCIgKyBuYW1lIH0sIGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkge1xyXG5cdFx0Ly8gbWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0LCBvdXRlcldpZHRoXHJcblx0XHRqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHtcclxuXHRcdFx0dmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gXCJib29sZWFuXCIgKSxcclxuXHRcdFx0XHRleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/IFwibWFyZ2luXCIgOiBcImJvcmRlclwiICk7XHJcblxyXG5cdFx0XHRyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkge1xyXG5cdFx0XHRcdHZhciBkb2M7XHJcblxyXG5cdFx0XHRcdGlmICggalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7XHJcblx0XHRcdFx0XHQvLyBBcyBvZiA1LzgvMjAxMiB0aGlzIHdpbGwgeWllbGQgaW5jb3JyZWN0IHJlc3VsdHMgZm9yIE1vYmlsZSBTYWZhcmksIGJ1dCB0aGVyZVxyXG5cdFx0XHRcdFx0Ly8gaXNuJ3QgYSB3aG9sZSBsb3Qgd2UgY2FuIGRvLiBTZWUgcHVsbCByZXF1ZXN0IGF0IHRoaXMgVVJMIGZvciBkaXNjdXNzaW9uOlxyXG5cdFx0XHRcdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC83NjRcclxuXHRcdFx0XHRcdHJldHVybiBlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgXCJjbGllbnRcIiArIG5hbWUgXTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHRcclxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7XHJcblx0XHRcdFx0XHRkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDtcclxuXHJcblx0XHRcdFx0XHQvLyBFaXRoZXIgc2Nyb2xsW1dpZHRoL0hlaWdodF0gb3Igb2Zmc2V0W1dpZHRoL0hlaWdodF0gb3IgY2xpZW50W1dpZHRoL0hlaWdodF0sIHdoaWNoZXZlciBpcyBncmVhdGVzdFxyXG5cdFx0XHRcdFx0Ly8gdW5mb3J0dW5hdGVseSwgdGhpcyBjYXVzZXMgYnVnICMzODM4IGluIElFNi84IG9ubHksIGJ1dCB0aGVyZSBpcyBjdXJyZW50bHkgbm8gZ29vZCwgc21hbGwgd2F5IHRvIGZpeCBpdC5cclxuXHRcdFx0XHRcdHJldHVybiBNYXRoLm1heChcclxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcInNjcm9sbFwiICsgbmFtZSBdLCBkb2NbIFwic2Nyb2xsXCIgKyBuYW1lIF0sXHJcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJvZmZzZXRcIiArIG5hbWUgXSwgZG9jWyBcIm9mZnNldFwiICsgbmFtZSBdLFxyXG5cdFx0XHRcdFx0XHRkb2NbIFwiY2xpZW50XCIgKyBuYW1lIF1cclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/XHJcblx0XHRcdFx0XHQvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0XHJcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCB2YWx1ZSwgZXh0cmEgKSA6XHJcblxyXG5cdFx0XHRcdFx0Ly8gU2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudFxyXG5cdFx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCB0eXBlLCB2YWx1ZSwgZXh0cmEgKTtcclxuXHRcdFx0fSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUsIG51bGwgKTtcclxuXHRcdH07XHJcblx0fSk7XHJcbn0pO1xyXG4vLyBFeHBvc2UgalF1ZXJ5IHRvIHRoZSBnbG9iYWwgb2JqZWN0XHJcbndpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTtcclxuXHJcbi8vIEV4cG9zZSBqUXVlcnkgYXMgYW4gQU1EIG1vZHVsZSwgYnV0IG9ubHkgZm9yIEFNRCBsb2FkZXJzIHRoYXRcclxuLy8gdW5kZXJzdGFuZCB0aGUgaXNzdWVzIHdpdGggbG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBqUXVlcnlcclxuLy8gaW4gYSBwYWdlIHRoYXQgYWxsIG1pZ2h0IGNhbGwgZGVmaW5lKCkuIFRoZSBsb2FkZXIgd2lsbCBpbmRpY2F0ZVxyXG4vLyB0aGV5IGhhdmUgc3BlY2lhbCBhbGxvd2FuY2VzIGZvciBtdWx0aXBsZSBqUXVlcnkgdmVyc2lvbnMgYnlcclxuLy8gc3BlY2lmeWluZyBkZWZpbmUuYW1kLmpRdWVyeSA9IHRydWUuIFJlZ2lzdGVyIGFzIGEgbmFtZWQgbW9kdWxlLFxyXG4vLyBzaW5jZSBqUXVlcnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyIGZpbGVzIHRoYXQgbWF5IHVzZSBkZWZpbmUsXHJcbi8vIGJ1dCBub3QgdXNlIGEgcHJvcGVyIGNvbmNhdGVuYXRpb24gc2NyaXB0IHRoYXQgdW5kZXJzdGFuZHMgYW5vbnltb3VzXHJcbi8vIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0IHdheSB0byByZWdpc3Rlci5cclxuLy8gTG93ZXJjYXNlIGpxdWVyeSBpcyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmUgZGVyaXZlZCBmcm9tXHJcbi8vIGZpbGUgbmFtZXMsIGFuZCBqUXVlcnkgaXMgbm9ybWFsbHkgZGVsaXZlcmVkIGluIGEgbG93ZXJjYXNlIGZpbGUgbmFtZS5cclxuLy8gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50cyB0byBjYWxsXHJcbi8vIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuXHJcbmlmICggdHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQgJiYgZGVmaW5lLmFtZC5qUXVlcnkgKSB7XHJcblx0ZGVmaW5lKCBcImpxdWVyeVwiLCBbXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4galF1ZXJ5OyB9ICk7XHJcbn1cclxuXHJcbn0pKCB3aW5kb3cgKTtcclxuIl19
|