(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory(require("jquery"));
else if(typeof define === 'function' && define.amd)
define("Survey", ["jquery"], factory);
else if(typeof exports === 'object')
exports["Survey"] = factory(require("jquery"));
else
root["Survey"] = factory(root["jQuery"]);
})(this, function(__WEBPACK_EXTERNAL_MODULE_44__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // identity function for calling harmony imports with the correct context
/******/ __webpack_require__.i = function(value) { return value; };
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 107);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return __assign; });
/* harmony export (immutable) */ __webpack_exports__["b"] = __extends;
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return __decorate; });
var __assign = Object["assign"] || function (target) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p))
target[p] = s[p];
}
return target;
};
function __extends(thisClass, baseClass) {
for (var p in baseClass)
if (baseClass.hasOwnProperty(p))
thisClass[p] = baseClass[p];
function __() { this.constructor = thisClass; }
thisClass.prototype = baseClass === null ? Object.create(baseClass) : (__.prototype = baseClass.prototype, new __());
}
;
var __decorate = function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
r = Reflect.decorate(decorators, target, key, desc);
else
for (var i = decorators.length - 1; i >= 0; i--)
if (d = decorators[i])
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
/***/ }),
/* 1 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return surveyLocalization; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return surveyStrings; });
var surveyLocalization = {
currentLocale: "",
defaultLocale: "en",
locales: {},
supportedLocales: [],
getString: function (strName) {
var loc = this.currentLocale ? this.locales[this.currentLocale] : this.locales[this.defaultLocale];
if (!loc || !loc[strName])
loc = this.locales[this.defaultLocale];
return loc[strName];
},
getLocales: function () {
var res = [];
res.push("");
if (this.supportedLocales && this.supportedLocales.length > 0) {
for (var i = 0; i < this.supportedLocales.length; i++) {
res.push(this.supportedLocales[i]);
}
}
else {
for (var key in this.locales) {
res.push(key);
}
}
res.sort();
return res;
}
};
var surveyStrings = {
pagePrevText: "Previous",
pageNextText: "Next",
completeText: "Complete",
otherItemText: "Other (describe)",
progressText: "Page {0} of {1}",
emptySurvey: "There is no visible page or question in the survey.",
completingSurvey: "Thank you for completing the survey!",
completingSurveyBefore: "Our records show that you have already completed this survey.",
loadingSurvey: "Survey is loading...",
optionsCaption: "Choose...",
value: "value",
requiredError: "Please answer the question.",
requiredInAllRowsError: "Please answer questions in all rows.",
numericError: "The value should be numeric.",
textMinLength: "Please enter at least {0} characters.",
textMaxLength: "Please enter less than {0} characters.",
textMinMaxLength: "Please enter more than {0} and less than {1} characters.",
minRowCountError: "Please fill in at least {0} rows.",
minSelectError: "Please select at least {0} variants.",
maxSelectError: "Please select no more than {0} variants.",
numericMinMax: "The '{0}' should be equal or more than {1} and equal or less than {2}",
numericMin: "The '{0}' should be equal or more than {1}",
numericMax: "The '{0}' should be equal or less than {1}",
invalidEmail: "Please enter a valid e-mail address.",
urlRequestError: "The request returned error '{0}'. {1}",
urlGetChoicesError: "The request returned empty data or the 'path' property is incorrect",
exceedMaxSize: "The file size should not exceed {0}.",
otherRequiredError: "Please enter the other value.",
uploadingFile: "Your file is uploading. Please wait several seconds and try again.",
confirmDelete: "Do you want to delete the record?",
keyDuplicationError: "This value should be unique.",
addRow: "Add row",
removeRow: "Remove",
addPanel: "Add new",
removePanel: "Remove",
choices_Item: "item",
matrix_column: "Column",
matrix_row: "Row",
savingData: "The results are saving on the server...",
savingDataError: "An error occurred and we could not save the results.",
savingDataSuccess: "The results were saved successfully!",
saveAgainButton: "Try again",
timerMin: "min",
timerSec: "sec",
timerSpentAll: "You have spent {0} on this page and {1} in total.",
timerSpentPage: "You have spent {0} on this page.",
timerSpentSurvey: "You have spent {0} in total.",
timerLimitAll: "You have spent {0} of {1} on this page and {2} of {3} in total.",
timerLimitPage: "You have spent {0} of {1} on this page.",
timerLimitSurvey: "You have spent {0} of {1} in total."
};
surveyLocalization.locales["en"] = surveyStrings;
/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(process) {
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.unstable_renderSubtreeIntoContainer = exports.PureComponent = exports.Component = exports.unmountComponentAtNode = exports.findDOMNode = exports.isValidElement = exports.cloneElement = exports.createElement = exports.createFactory = exports.createClass = exports.render = exports.Children = exports.PropTypes = exports.DOM = exports.version = undefined;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _proptypes = __webpack_require__(48);
var _proptypes2 = _interopRequireDefault(_proptypes);
var _preact = __webpack_require__(46);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var version = '15.1.0'; // trick libraries to think we are react
var ELEMENTS = 'a abbr address area article aside audio b base bdi bdo big blockquote body br button canvas caption cite code col colgroup data datalist dd del details dfn dialog div dl dt em embed fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 head header hgroup hr html i iframe img input ins kbd keygen label legend li link main map mark menu menuitem meta meter nav noscript object ol optgroup option output p param picture pre progress q rp rt ruby s samp script section select small source span strong style sub summary sup table tbody td textarea tfoot th thead time title tr track u ul var video wbr circle clipPath defs ellipse g image line linearGradient mask path pattern polygon polyline radialGradient rect stop svg text tspan'.split(' ');
var REACT_ELEMENT_TYPE = typeof Symbol !== 'undefined' && Symbol.for && Symbol.for('react.element') || 0xeac7;
var COMPONENT_WRAPPER_KEY = typeof Symbol !== 'undefined' ? Symbol.for('__preactCompatWrapper') : '__preactCompatWrapper';
// don't autobind these methods since they already have guaranteed context.
var AUTOBIND_BLACKLIST = {
constructor: 1,
render: 1,
shouldComponentUpdate: 1,
componentWillReceiveProps: 1,
componentWillUpdate: 1,
componentDidUpdate: 1,
componentWillMount: 1,
componentDidMount: 1,
componentWillUnmount: 1,
componentDidUnmount: 1
};
var CAMEL_PROPS = /^(?:accent|alignment|arabic|baseline|cap|clip|color|fill|flood|font|glyph|horiz|marker|overline|paint|stop|strikethrough|stroke|text|underline|unicode|units|v|vert|word|writing|x)[A-Z]/;
var BYPASS_HOOK = {};
/*global process*/
var DEV = typeof process === 'undefined' || !process.env || process.env.NODE_ENV !== 'production';
// a component that renders nothing. Used to replace components for unmountComponentAtNode.
function EmptyComponent() {
return null;
}
// make react think we're react.
var VNode = (0, _preact.h)('a', null).constructor;
VNode.prototype.$$typeof = REACT_ELEMENT_TYPE;
VNode.prototype.preactCompatUpgraded = false;
VNode.prototype.preactCompatNormalized = false;
Object.defineProperty(VNode.prototype, 'type', {
get: function get() {
return this.nodeName;
},
set: function set(v) {
this.nodeName = v;
},
configurable: true
});
Object.defineProperty(VNode.prototype, 'props', {
get: function get() {
return this.attributes;
},
set: function set(v) {
this.attributes = v;
},
configurable: true
});
var oldEventHook = _preact.options.event;
_preact.options.event = function (e) {
if (oldEventHook) e = oldEventHook(e);
e.persist = Object;
e.nativeEvent = e;
return e;
};
var oldVnodeHook = _preact.options.vnode;
_preact.options.vnode = function (vnode) {
if (!vnode.preactCompatUpgraded) {
vnode.preactCompatUpgraded = true;
var tag = vnode.nodeName,
attrs = vnode.attributes;
if (!attrs) attrs = vnode.attributes = {};
if (typeof tag === 'function') {
if (tag[COMPONENT_WRAPPER_KEY] === true || tag.prototype && 'isReactComponent' in tag.prototype) {
if (vnode.children && !vnode.children.length) vnode.children = undefined;
if (vnode.children) attrs.children = vnode.children;
if (!vnode.preactCompatNormalized) {
normalizeVNode(vnode);
}
handleComponentVNode(vnode);
}
} else {
if (vnode.children && !vnode.children.length) vnode.children = undefined;
if (vnode.children) attrs.children = vnode.children;
if (attrs.defaultValue) {
if (!attrs.value && attrs.value !== 0) {
attrs.value = attrs.defaultValue;
}
delete attrs.defaultValue;
}
handleElementVNode(vnode, attrs);
}
}
if (oldVnodeHook) oldVnodeHook(vnode);
};
function handleComponentVNode(vnode) {
var tag = vnode.nodeName,
a = vnode.attributes;
vnode.attributes = {};
if (tag.defaultProps) extend(vnode.attributes, tag.defaultProps);
if (a) extend(vnode.attributes, a);
}
function handleElementVNode(vnode, a) {
var shouldSanitize = void 0,
attrs = void 0,
i = void 0;
if (a) {
for (i in a) {
if (shouldSanitize = CAMEL_PROPS.test(i)) break;
}if (shouldSanitize) {
attrs = vnode.attributes = {};
for (i in a) {
if (a.hasOwnProperty(i)) {
attrs[CAMEL_PROPS.test(i) ? i.replace(/([A-Z0-9])/, '-$1').toLowerCase() : i] = a[i];
}
}
}
}
}
// proxy render() since React returns a Component reference.
function render(vnode, parent, callback) {
var prev = parent && parent._preactCompatRendered;
// ignore impossible previous renders
if (prev && prev.parentNode !== parent) prev = null;
// default to first Element child
if (!prev) prev = parent.children[0];
// remove unaffected siblings
for (var i = parent.childNodes.length; i--;) {
if (parent.childNodes[i] !== prev) {
parent.removeChild(parent.childNodes[i]);
}
}
var out = (0, _preact.render)(vnode, parent, prev);
if (parent) parent._preactCompatRendered = out;
if (typeof callback === 'function') callback();
return out && out._component || out.base;
}
var ContextProvider = function () {
function ContextProvider() {
_classCallCheck(this, ContextProvider);
}
_createClass(ContextProvider, [{
key: 'getChildContext',
value: function getChildContext() {
return this.props.context;
}
}, {
key: 'render',
value: function render(props) {
return props.children[0];
}
}]);
return ContextProvider;
}();
function renderSubtreeIntoContainer(parentComponent, vnode, container, callback) {
var wrap = (0, _preact.h)(ContextProvider, { context: parentComponent.context }, vnode);
var c = render(wrap, container);
if (callback) callback(c);
return c;
}
function unmountComponentAtNode(container) {
var existing = container._preactCompatRendered;
if (existing && existing.parentNode === container) {
(0, _preact.render)((0, _preact.h)(EmptyComponent), container, existing);
return true;
}
return false;
}
var ARR = [];
// This API is completely unnecessary for Preact, so it's basically passthrough.
var Children = {
map: function map(children, fn, ctx) {
if (children == null) return null;
children = Children.toArray(children);
if (ctx && ctx !== children) fn = fn.bind(ctx);
return children.map(fn);
},
forEach: function forEach(children, fn, ctx) {
if (children == null) return null;
children = Children.toArray(children);
if (ctx && ctx !== children) fn = fn.bind(ctx);
children.forEach(fn);
},
count: function count(children) {
return children && children.length || 0;
},
only: function only(children) {
children = Children.toArray(children);
if (children.length !== 1) throw new Error('Children.only() expects only one child.');
return children[0];
},
toArray: function toArray(children) {
return Array.isArray && Array.isArray(children) ? children : ARR.concat(children);
}
};
/** Track current render() component for ref assignment */
var currentComponent = void 0;
function createFactory(type) {
return createElement.bind(null, type);
}
var DOM = {};
for (var i = ELEMENTS.length; i--;) {
DOM[ELEMENTS[i]] = createFactory(ELEMENTS[i]);
}
function upgradeToVNodes(arr, offset) {
for (var _i = offset || 0; _i < arr.length; _i++) {
var obj = arr[_i];
if (Array.isArray(obj)) {
upgradeToVNodes(obj);
} else if (obj && (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && !isValidElement(obj) && (obj.props && obj.type || obj.attributes && obj.nodeName || obj.children)) {
arr[_i] = createElement(obj.type || obj.nodeName, obj.props || obj.attributes, obj.children);
}
}
}
function isStatelessComponent(c) {
return typeof c === 'function' && !(c.prototype && c.prototype.render);
}
// wraps stateless functional components in a PropTypes validator
function wrapStatelessComponent(WrappedComponent) {
return createClass({
displayName: WrappedComponent.displayName || WrappedComponent.name,
render: function render() {
return WrappedComponent(this.props, this.context);
}
});
}
function statelessComponentHook(Ctor) {
var Wrapped = Ctor[COMPONENT_WRAPPER_KEY];
if (Wrapped) return Wrapped === true ? Ctor : Wrapped;
Wrapped = wrapStatelessComponent(Ctor);
Object.defineProperty(Wrapped, COMPONENT_WRAPPER_KEY, { configurable: true, value: true });
Wrapped.displayName = Ctor.displayName;
Wrapped.propTypes = Ctor.propTypes;
Wrapped.defaultProps = Ctor.defaultProps;
Object.defineProperty(Ctor, COMPONENT_WRAPPER_KEY, { configurable: true, value: Wrapped });
return Wrapped;
}
function createElement() {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
upgradeToVNodes(args, 2);
return normalizeVNode(_preact.h.apply(undefined, args));
}
function normalizeVNode(vnode) {
vnode.preactCompatNormalized = true;
applyClassName(vnode);
if (isStatelessComponent(vnode.nodeName)) {
vnode.nodeName = statelessComponentHook(vnode.nodeName);
}
var ref = vnode.attributes.ref,
type = ref && (typeof ref === 'undefined' ? 'undefined' : _typeof(ref));
if (currentComponent && (type === 'string' || type === 'number')) {
vnode.attributes.ref = createStringRefProxy(ref, currentComponent);
}
applyEventNormalization(vnode);
return vnode;
}
function cloneElement(element, props) {
if (!isValidElement(element)) return element;
var elementProps = element.attributes || element.props;
var node = (0, _preact.h)(element.nodeName || element.type, elementProps, element.children || elementProps && elementProps.children);
for (var _len2 = arguments.length, children = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
children[_key2 - 2] = arguments[_key2];
}
return normalizeVNode(_preact.cloneElement.apply(undefined, [node, props].concat(children)));
}
function isValidElement(element) {
return element && (element instanceof VNode || element.$$typeof === REACT_ELEMENT_TYPE);
}
function createStringRefProxy(name, component) {
return component._refProxies[name] || (component._refProxies[name] = function (resolved) {
if (component && component.refs) {
component.refs[name] = resolved;
if (resolved === null) {
delete component._refProxies[name];
component = null;
}
}
});
}
function applyEventNormalization(_ref) {
var nodeName = _ref.nodeName,
attributes = _ref.attributes;
if (!attributes || typeof nodeName !== 'string') return;
var props = {};
for (var _i2 in attributes) {
props[_i2.toLowerCase()] = _i2;
}
if (props.ondoubleclick) {
attributes.ondblclick = attributes[props.ondoubleclick];
delete attributes[props.ondoubleclick];
}
// for *textual inputs* (incl textarea), normalize `onChange` -> `onInput`:
if (props.onchange && (nodeName === 'textarea' || nodeName.toLowerCase() === 'input' && !/^fil|che|rad/i.test(attributes.type))) {
var normalized = props.oninput || 'oninput';
if (!attributes[normalized]) {
attributes[normalized] = multihook([attributes[normalized], attributes[props.onchange]]);
delete attributes[props.onchange];
}
}
}
function applyClassName(_ref2) {
var attributes = _ref2.attributes;
if (!attributes) return;
var cl = attributes.className || attributes.class;
if (cl) attributes.className = cl;
}
function extend(base, props) {
for (var key in props) {
if (props.hasOwnProperty(key)) {
base[key] = props[key];
}
}
return base;
}
function shallowDiffers(a, b) {
for (var _i3 in a) {
if (!(_i3 in b)) return true;
}for (var _i4 in b) {
if (a[_i4] !== b[_i4]) return true;
}return false;
}
function findDOMNode(component) {
return component && component.base || component;
}
function F() {}
function createClass(obj) {
function cl(props, context) {
bindAll(this);
Component.call(this, props, context, BYPASS_HOOK);
newComponentHook.call(this, props, context);
}
obj = extend({ constructor: cl }, obj);
// We need to apply mixins here so that getDefaultProps is correctly mixed
if (obj.mixins) {
applyMixins(obj, collateMixins(obj.mixins));
}
if (obj.statics) {
extend(cl, obj.statics);
}
if (obj.propTypes) {
cl.propTypes = obj.propTypes;
}
if (obj.defaultProps) {
cl.defaultProps = obj.defaultProps;
}
if (obj.getDefaultProps) {
cl.defaultProps = obj.getDefaultProps();
}
F.prototype = Component.prototype;
cl.prototype = extend(new F(), obj);
cl.displayName = obj.displayName || 'Component';
return cl;
}
// Flatten an Array of mixins to a map of method name to mixin implementations
function collateMixins(mixins) {
var keyed = {};
for (var _i5 = 0; _i5 < mixins.length; _i5++) {
var mixin = mixins[_i5];
for (var key in mixin) {
if (mixin.hasOwnProperty(key) && typeof mixin[key] === 'function') {
(keyed[key] || (keyed[key] = [])).push(mixin[key]);
}
}
}
return keyed;
}
// apply a mapping of Arrays of mixin methods to a component prototype
function applyMixins(proto, mixins) {
for (var key in mixins) {
if (mixins.hasOwnProperty(key)) {
proto[key] = multihook(mixins[key].concat(proto[key] || ARR), key === 'getDefaultProps' || key === 'getInitialState' || key === 'getChildContext');
}
}
}
function bindAll(ctx) {
for (var _i6 in ctx) {
var v = ctx[_i6];
if (typeof v === 'function' && !v.__bound && !AUTOBIND_BLACKLIST.hasOwnProperty(_i6)) {
(ctx[_i6] = v.bind(ctx)).__bound = true;
}
}
}
function callMethod(ctx, m, args) {
if (typeof m === 'string') {
m = ctx.constructor.prototype[m];
}
if (typeof m === 'function') {
return m.apply(ctx, args);
}
}
function multihook(hooks, skipDuplicates) {
return function () {
var ret = void 0;
for (var _i7 = 0; _i7 < hooks.length; _i7++) {
var r = callMethod(this, hooks[_i7], arguments);
if (skipDuplicates && r != null) {
if (!ret) ret = {};
for (var key in r) {
if (r.hasOwnProperty(key)) {
ret[key] = r[key];
}
}
} else if (typeof r !== 'undefined') ret = r;
}
return ret;
};
}
function newComponentHook(props, context) {
propsHook.call(this, props, context);
this.componentWillReceiveProps = multihook([propsHook, this.componentWillReceiveProps || 'componentWillReceiveProps']);
this.render = multihook([propsHook, beforeRender, this.render || 'render', afterRender]);
}
function propsHook(props, context) {
if (!props) return;
// React annoyingly special-cases single children, and some react components are ridiculously strict about this.
var c = props.children;
if (c && Array.isArray(c) && c.length === 1) {
props.children = c[0];
// but its totally still going to be an Array.
if (props.children && _typeof(props.children) === 'object') {
props.children.length = 1;
props.children[0] = props.children;
}
}
// add proptype checking
if (DEV) {
var ctor = typeof this === 'function' ? this : this.constructor,
propTypes = this.propTypes || ctor.propTypes;
if (propTypes) {
for (var prop in propTypes) {
if (propTypes.hasOwnProperty(prop) && typeof propTypes[prop] === 'function') {
var displayName = this.displayName || ctor.name;
var err = propTypes[prop](props, prop, displayName, 'prop');
if (err) console.error(new Error(err.message || err));
}
}
}
}
}
function beforeRender(props) {
currentComponent = this;
}
function afterRender() {
if (currentComponent === this) {
currentComponent = null;
}
}
function Component(props, context, opts) {
_preact.Component.call(this, props, context);
this.state = this.getInitialState ? this.getInitialState() : {};
this.refs = {};
this._refProxies = {};
if (opts !== BYPASS_HOOK) {
newComponentHook.call(this, props, context);
}
}
extend(Component.prototype = new _preact.Component(), {
constructor: Component,
isReactComponent: {},
replaceState: function replaceState(state, callback) {
this.setState(state, callback);
for (var _i8 in this.state) {
if (!(_i8 in state)) {
delete this.state[_i8];
}
}
},
getDOMNode: function getDOMNode() {
return this.base;
},
isMounted: function isMounted() {
return !!this.base;
}
});
function PureComponent(props, context) {
Component.call(this, props, context);
}
F.prototype = Component.prototype;
PureComponent.prototype = new F();
PureComponent.prototype.shouldComponentUpdate = function (props, state) {
return shallowDiffers(this.props, props) || shallowDiffers(this.state, state);
};
exports.version = version;
exports.DOM = DOM;
exports.PropTypes = _proptypes2.default;
exports.Children = Children;
exports.render = render;
exports.createClass = createClass;
exports.createFactory = createFactory;
exports.createElement = createElement;
exports.cloneElement = cloneElement;
exports.isValidElement = isValidElement;
exports.findDOMNode = findDOMNode;
exports.unmountComponentAtNode = unmountComponentAtNode;
exports.Component = Component;
exports.PureComponent = PureComponent;
exports.unstable_renderSubtreeIntoContainer = renderSubtreeIntoContainer;
exports.default = {
version: version,
DOM: DOM,
PropTypes: _proptypes2.default,
Children: Children,
render: render,
createClass: createClass,
createFactory: createFactory,
createElement: createElement,
cloneElement: cloneElement,
isValidElement: isValidElement,
findDOMNode: findDOMNode,
unmountComponentAtNode: unmountComponentAtNode,
Component: Component,
PureComponent: PureComponent,
unstable_renderSubtreeIntoContainer: renderSubtreeIntoContainer
};
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(47)))
/***/ }),
/* 3 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(13);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return JsonObjectProperty; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return CustomPropertiesCollection; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return JsonMetadataClass; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return JsonMetadata; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return JsonError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "k", function() { return JsonUnknownPropertyError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return JsonMissingTypeErrorBase; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return JsonMissingTypeError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return JsonIncorrectTypeError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return JsonRequiredPropertyError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return JsonObject; });
var JsonObjectProperty = (function () {
function JsonObjectProperty(name, isRequired) {
if (isRequired === void 0) { isRequired = false; }
this.name = name;
this.typeValue = null;
this.choicesValue = null;
this.isRequiredValue = false;
this.readOnlyValue = null;
this.visibleValue = null;
this.isLocalizableValue = null;
this.choicesfunc = null;
this.className = null;
this.alternativeName = null;
this.classNamePart = null;
this.baseClassName = null;
this.defaultValue = null;
this.serializationProperty = null;
this.onGetValue = null;
this.onSetValue = null;
this.isRequiredValue = isRequired;
}
Object.defineProperty(JsonObjectProperty.prototype, "type", {
get: function () { return this.typeValue ? this.typeValue : "string"; },
set: function (value) { this.typeValue = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "isRequired", {
get: function () { return this.isRequiredValue; },
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "hasToUseGetValue", {
get: function () { return this.onGetValue || this.serializationProperty; },
enumerable: true,
configurable: true
});
JsonObjectProperty.prototype.isDefaultValue = function (value) {
return (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(this.defaultValue)) ? (this.defaultValue == value) : !(value);
};
JsonObjectProperty.prototype.getValue = function (obj) {
if (this.onGetValue)
return this.onGetValue(obj);
if (this.serializationProperty)
return obj[this.serializationProperty].getJson();
return obj[this.name];
};
JsonObjectProperty.prototype.getPropertyValue = function (obj) {
if (this.isLocalizable)
return obj[this.serializationProperty].text;
return this.getValue(obj);
};
Object.defineProperty(JsonObjectProperty.prototype, "hasToUseSetValue", {
get: function () { return this.onSetValue || this.serializationProperty; },
enumerable: true,
configurable: true
});
JsonObjectProperty.prototype.setValue = function (obj, value, jsonConv) {
if (this.onSetValue) {
this.onSetValue(obj, value, jsonConv);
}
else {
if (this.serializationProperty)
obj[this.serializationProperty].setJson(value);
else {
if (value && typeof value === "string") {
if (this.type == "number") {
value = parseInt(value);
}
if (this.type == "boolean") {
value = value.toLowerCase() === "true";
}
}
obj[this.name] = value;
}
}
};
JsonObjectProperty.prototype.getObjType = function (objType) {
if (!this.classNamePart)
return objType;
return objType.replace(this.classNamePart, "");
};
JsonObjectProperty.prototype.getClassName = function (className) {
return (this.classNamePart && className.indexOf(this.classNamePart) < 0) ? className + this.classNamePart : className;
};
Object.defineProperty(JsonObjectProperty.prototype, "choices", {
get: function () {
if (this.choicesValue != null)
return this.choicesValue;
if (this.choicesfunc != null)
return this.choicesfunc();
return null;
},
enumerable: true,
configurable: true
});
JsonObjectProperty.prototype.setChoices = function (value, valueFunc) {
this.choicesValue = value;
this.choicesfunc = valueFunc;
};
Object.defineProperty(JsonObjectProperty.prototype, "readOnly", {
get: function () { return this.readOnlyValue != null ? this.readOnlyValue : false; },
set: function (val) { this.readOnlyValue = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "visible", {
get: function () { return this.visibleValue != null ? this.visibleValue : true; },
set: function (val) { this.visibleValue = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "isLocalizable", {
get: function () { return this.isLocalizableValue != null ? this.isLocalizableValue : false; },
set: function (val) { this.isLocalizableValue = val; },
enumerable: true,
configurable: true
});
JsonObjectProperty.prototype.mergeWith = function (prop) {
var valuesNames = JsonObjectProperty.mergableValues;
for (var i = 0; i < valuesNames.length; i++) {
this.mergeValue(prop, valuesNames[i]);
}
};
JsonObjectProperty.prototype.mergeValue = function (prop, valueName) {
if (this[valueName] == null && prop[valueName] != null) {
this[valueName] = prop[valueName];
}
};
return JsonObjectProperty;
}());
JsonObjectProperty.mergableValues = ["typeValue", "choicesValue", "readOnlyValue", "visibleValue", "isLocalizableValue", "className",
"alternativeName", "classNamePart", "baseClassName", "defaultValue", "serializationProperty", "onGetValue", "onSetValue"];
var CustomPropertiesCollection = (function () {
function CustomPropertiesCollection() {
}
CustomPropertiesCollection.addProperty = function (className, property) {
var props = CustomPropertiesCollection.properties;
if (!props[className]) {
props[className] = [];
}
props[className].push(property);
};
CustomPropertiesCollection.removeProperty = function (className, propertyName) {
var props = CustomPropertiesCollection.properties;
if (!props[className])
return;
var properties = props[className];
for (var i = 0; i < properties.length; i++) {
if (properties[i].name == propertyName) {
props[className].splice(i, 1);
break;
}
}
};
CustomPropertiesCollection.addClass = function (className, parentClassName) {
CustomPropertiesCollection.parentClasses[className] = parentClassName;
};
CustomPropertiesCollection.getProperties = function (className) {
var res = [];
var props = CustomPropertiesCollection.properties;
while (className) {
var properties = props[className];
if (properties) {
for (var i = 0; i < properties.length; i++) {
res.push(properties[i]);
}
}
className = CustomPropertiesCollection.parentClasses[className];
}
return res;
};
CustomPropertiesCollection.createProperties = function (obj) {
if (!obj || !obj.getType)
return;
CustomPropertiesCollection.createPropertiesCore(obj, obj.getType());
};
CustomPropertiesCollection.createPropertiesCore = function (obj, className) {
var props = CustomPropertiesCollection.properties;
if (props[className]) {
CustomPropertiesCollection.createPropertiesInObj(obj, props[className]);
}
var parentClass = CustomPropertiesCollection.parentClasses[className];
if (parentClass) {
CustomPropertiesCollection.createPropertiesCore(obj, parentClass);
}
};
CustomPropertiesCollection.createPropertiesInObj = function (obj, properties) {
for (var i = 0; i < properties.length; i++) {
CustomPropertiesCollection.createPropertyInObj(obj, properties[i]);
}
};
CustomPropertiesCollection.createPropertyInObj = function (obj, prop) {
if (obj[prop.name] || obj.hasOwnProperty(prop.name))
return;
var desc = {
get: function () { return obj.getPropertyValue(prop.name, prop.defaultValue); },
set: function (v) { obj.setPropertyValue(prop.name, v); }
};
Object.defineProperty(obj, prop.name, desc);
};
return CustomPropertiesCollection;
}());
CustomPropertiesCollection.properties = {};
CustomPropertiesCollection.parentClasses = {};
var JsonMetadataClass = (function () {
function JsonMetadataClass(name, properties, creator, parentName) {
if (creator === void 0) { creator = null; }
if (parentName === void 0) { parentName = null; }
this.name = name;
this.creator = creator;
this.parentName = parentName;
this.properties = null;
this.requiredProperties = null;
if (parentName) {
CustomPropertiesCollection.addClass(name, parentName);
}
this.properties = new Array();
for (var i = 0; i < properties.length; i++) {
var prop = this.createProperty(properties[i]);
if (prop) {
this.properties.push(prop);
}
}
}
JsonMetadataClass.prototype.find = function (name) {
for (var i = 0; i < this.properties.length; i++) {
if (this.properties[i].name == name)
return this.properties[i];
}
return null;
};
JsonMetadataClass.prototype.createProperty = function (propInfo) {
var propertyName = typeof propInfo === "string" ? propInfo : propInfo.name;
if (!propertyName)
return;
var propertyType = null;
var typeIndex = propertyName.indexOf(JsonMetadataClass.typeSymbol);
if (typeIndex > -1) {
propertyType = propertyName.substring(typeIndex + 1);
propertyName = propertyName.substring(0, typeIndex);
}
var isRequired = this.getIsPropertyNameRequired(propertyName);
propertyName = this.getPropertyName(propertyName);
var prop = new JsonObjectProperty(propertyName, isRequired);
if (propertyType) {
prop.type = propertyType;
}
if (typeof propInfo === "object") {
if (propInfo.type) {
prop.type = propInfo.type;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.default)) {
prop.defaultValue = propInfo.default;
}
if (propInfo.visible === false) {
prop.visible = false;
}
if (propInfo.isRequired) {
this.makePropertyRequired(prop.name);
}
if (propInfo.choices) {
var choicesFunc = typeof propInfo.choices === "function" ? propInfo.choices : null;
var choicesValue = typeof propInfo.choices !== "function" ? propInfo.choices : null;
prop.setChoices(choicesValue, choicesFunc);
}
if (propInfo.onGetValue) {
prop.onGetValue = propInfo.onGetValue;
}
if (propInfo.onSetValue) {
prop.onSetValue = propInfo.onSetValue;
}
if (propInfo.serializationProperty) {
prop.serializationProperty = propInfo.serializationProperty;
var s;
if (prop.serializationProperty && prop.serializationProperty.indexOf("loc") == 0) {
prop.isLocalizable = true;
}
}
if (propInfo.isLocalizable) {
prop.isLocalizable = propInfo.isLocalizable;
}
if (propInfo.className) {
prop.className = propInfo.className;
}
if (propInfo.baseClassName) {
prop.baseClassName = propInfo.baseClassName;
}
if (propInfo.classNamePart) {
prop.classNamePart = propInfo.classNamePart;
}
if (propInfo.alternativeName) {
prop.alternativeName = propInfo.alternativeName;
}
}
return prop;
};
JsonMetadataClass.prototype.getIsPropertyNameRequired = function (propertyName) {
return propertyName.length > 0 && propertyName[0] == JsonMetadataClass.requiredSymbol;
};
JsonMetadataClass.prototype.getPropertyName = function (propertyName) {
if (!this.getIsPropertyNameRequired(propertyName))
return propertyName;
propertyName = propertyName.slice(1);
this.makePropertyRequired(propertyName);
return propertyName;
};
JsonMetadataClass.prototype.makePropertyRequired = function (propertyName) {
if (!this.requiredProperties) {
this.requiredProperties = new Array();
}
this.requiredProperties.push(propertyName);
};
return JsonMetadataClass;
}());
JsonMetadataClass.requiredSymbol = '!';
JsonMetadataClass.typeSymbol = ':';
var JsonMetadata = (function () {
function JsonMetadata() {
this.classes = {};
this.childrenClasses = {};
this.classProperties = {};
this.classRequiredProperties = {};
}
JsonMetadata.prototype.addClass = function (name, properties, creator, parentName) {
if (creator === void 0) { creator = null; }
if (parentName === void 0) { parentName = null; }
var metaDataClass = new JsonMetadataClass(name, properties, creator, parentName);
this.classes[name] = metaDataClass;
if (parentName) {
var children = this.childrenClasses[parentName];
if (!children) {
this.childrenClasses[parentName] = [];
}
this.childrenClasses[parentName].push(metaDataClass);
}
return metaDataClass;
};
JsonMetadata.prototype.overrideClassCreatore = function (name, creator) {
var metaDataClass = this.findClass(name);
if (metaDataClass) {
metaDataClass.creator = creator;
}
};
JsonMetadata.prototype.getProperties = function (className) {
var properties = this.classProperties[className];
if (!properties) {
properties = new Array();
this.fillProperties(className, properties);
this.classProperties[className] = properties;
}
return properties;
};
JsonMetadata.prototype.findProperty = function (className, propertyName) {
var properties = this.getProperties(className);
for (var i = 0; i < properties.length; i++) {
if (properties[i].name == propertyName)
return properties[i];
}
return null;
};
JsonMetadata.prototype.createClass = function (name) {
var metaDataClass = this.findClass(name);
if (!metaDataClass)
return null;
if (metaDataClass.creator)
return metaDataClass.creator();
var parentName = metaDataClass.parentName;
while (parentName) {
metaDataClass = this.findClass(parentName);
if (!metaDataClass)
return null;
parentName = metaDataClass.parentName;
if (metaDataClass.creator)
return this.createCustomType(name, metaDataClass.creator);
}
return null;
};
JsonMetadata.prototype.createCustomType = function (name, creator) {
var res = creator();
res.customTypeName = name;
res.customTemplateName = res.getTemplate ? res.getTemplate() : res.getType();
res.getType = function () { return res.customTypeName; };
res.getTemplate = function () { return res.customTemplateName; };
CustomPropertiesCollection.createProperties(res);
return res;
};
JsonMetadata.prototype.getChildrenClasses = function (name, canBeCreated) {
if (canBeCreated === void 0) { canBeCreated = false; }
var result = [];
this.fillChildrenClasses(name, canBeCreated, result);
return result;
};
JsonMetadata.prototype.getRequiredProperties = function (name) {
var properties = this.classRequiredProperties[name];
if (!properties) {
properties = new Array();
this.fillRequiredProperties(name, properties);
this.classRequiredProperties[name] = properties;
}
return properties;
};
JsonMetadata.prototype.addProperties = function (className, propertiesInfos) {
var metaDataClass = this.findClass(className);
for (var i = 0; i < propertiesInfos.length; i++) {
this.addCustomPropertyCore(metaDataClass, propertiesInfos[i]);
}
};
JsonMetadata.prototype.addProperty = function (className, propertyInfo) {
this.addCustomPropertyCore(this.findClass(className), propertyInfo);
};
JsonMetadata.prototype.addCustomPropertyCore = function (metaDataClass, propertyInfo) {
if (!metaDataClass)
return;
var property = metaDataClass.createProperty(propertyInfo);
if (property) {
this.addPropertyToClass(metaDataClass, property);
this.emptyClassPropertiesHash(metaDataClass);
CustomPropertiesCollection.addProperty(metaDataClass.name, property);
}
};
JsonMetadata.prototype.removeProperty = function (className, propertyName) {
var metaDataClass = this.findClass(className);
if (!metaDataClass)
return false;
var property = metaDataClass.find(propertyName);
if (property) {
this.removePropertyFromClass(metaDataClass, property);
this.emptyClassPropertiesHash(metaDataClass);
CustomPropertiesCollection.removeProperty(className, propertyName);
}
};
JsonMetadata.prototype.addPropertyToClass = function (metaDataClass, property) {
if (metaDataClass.find(property.name) != null)
return;
metaDataClass.properties.push(property);
};
JsonMetadata.prototype.removePropertyFromClass = function (metaDataClass, property) {
var index = metaDataClass.properties.indexOf(property);
if (index < 0)
return;
metaDataClass.properties.splice(index, 1);
if (metaDataClass.requiredProperties) {
index = metaDataClass.requiredProperties.indexOf(property.name);
if (index >= 0) {
metaDataClass.requiredProperties.splice(index, 1);
}
}
};
JsonMetadata.prototype.emptyClassPropertiesHash = function (metaDataClass) {
this.classProperties[metaDataClass.name] = null;
var childClasses = this.getChildrenClasses(metaDataClass.name);
for (var i = 0; i < childClasses.length; i++) {
this.classProperties[childClasses[i].name] = null;
}
};
JsonMetadata.prototype.fillChildrenClasses = function (name, canBeCreated, result) {
var children = this.childrenClasses[name];
if (!children)
return;
for (var i = 0; i < children.length; i++) {
if (!canBeCreated || children[i].creator) {
result.push(children[i]);
}
this.fillChildrenClasses(children[i].name, canBeCreated, result);
}
};
JsonMetadata.prototype.findClass = function (name) {
return this.classes[name];
};
JsonMetadata.prototype.fillProperties = function (name, list) {
var metaDataClass = this.findClass(name);
if (!metaDataClass)
return;
if (metaDataClass.parentName) {
this.fillProperties(metaDataClass.parentName, list);
}
for (var i = 0; i < metaDataClass.properties.length; i++) {
this.addPropertyCore(metaDataClass.properties[i], list, list.length);
}
};
JsonMetadata.prototype.addPropertyCore = function (property, list, endIndex) {
var index = -1;
for (var i = 0; i < endIndex; i++) {
if (list[i].name == property.name) {
index = i;
break;
}
}
if (index < 0) {
list.push(property);
}
else {
property.mergeWith(list[index]);
list[index] = property;
}
};
JsonMetadata.prototype.fillRequiredProperties = function (name, list) {
var metaDataClass = this.findClass(name);
if (!metaDataClass)
return;
if (metaDataClass.requiredProperties) {
Array.prototype.push.apply(list, metaDataClass.requiredProperties);
}
if (metaDataClass.parentName) {
this.fillRequiredProperties(metaDataClass.parentName, list);
}
};
return JsonMetadata;
}());
var JsonError = (function () {
function JsonError(type, message) {
this.type = type;
this.message = message;
this.description = "";
this.at = -1;
}
JsonError.prototype.getFullDescription = function () {
return this.message + (this.description ? "\n" + this.description : "");
};
return JsonError;
}());
var JsonUnknownPropertyError = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](JsonUnknownPropertyError, _super);
function JsonUnknownPropertyError(propertyName, className) {
var _this = _super.call(this, "unknownproperty", "The property '" + propertyName + "' in class '" + className + "' is unknown.") || this;
_this.propertyName = propertyName;
_this.className = className;
var properties = JsonObject.metaData.getProperties(className);
if (properties) {
_this.description = "The list of available properties are: ";
for (var i = 0; i < properties.length; i++) {
if (i > 0)
_this.description += ", ";
_this.description += properties[i].name;
}
_this.description += '.';
}
return _this;
}
return JsonUnknownPropertyError;
}(JsonError));
var JsonMissingTypeErrorBase = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](JsonMissingTypeErrorBase, _super);
function JsonMissingTypeErrorBase(baseClassName, type, message) {
var _this = _super.call(this, type, message) || this;
_this.baseClassName = baseClassName;
_this.type = type;
_this.message = message;
_this.description = "The following types are available: ";
var types = JsonObject.metaData.getChildrenClasses(baseClassName, true);
for (var i = 0; i < types.length; i++) {
if (i > 0)
_this.description += ", ";
_this.description += "'" + types[i].name + "'";
}
_this.description += ".";
return _this;
}
return JsonMissingTypeErrorBase;
}(JsonError));
var JsonMissingTypeError = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](JsonMissingTypeError, _super);
function JsonMissingTypeError(propertyName, baseClassName) {
var _this = _super.call(this, baseClassName, "missingtypeproperty", "The property type is missing in the object. Please take a look at property: '" + propertyName + "'.") || this;
_this.propertyName = propertyName;
_this.baseClassName = baseClassName;
return _this;
}
return JsonMissingTypeError;
}(JsonMissingTypeErrorBase));
var JsonIncorrectTypeError = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](JsonIncorrectTypeError, _super);
function JsonIncorrectTypeError(propertyName, baseClassName) {
var _this = _super.call(this, baseClassName, "incorrecttypeproperty", "The property type is incorrect in the object. Please take a look at property: '" + propertyName + "'.") || this;
_this.propertyName = propertyName;
_this.baseClassName = baseClassName;
return _this;
}
return JsonIncorrectTypeError;
}(JsonMissingTypeErrorBase));
var JsonRequiredPropertyError = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](JsonRequiredPropertyError, _super);
function JsonRequiredPropertyError(propertyName, className) {
var _this = _super.call(this, "requiredproperty", "The property '" + propertyName + "' is required in class '" + className + "'.") || this;
_this.propertyName = propertyName;
_this.className = className;
return _this;
}
return JsonRequiredPropertyError;
}(JsonError));
var JsonObject = (function () {
function JsonObject() {
this.errors = new Array();
}
Object.defineProperty(JsonObject, "metaData", {
get: function () { return JsonObject.metaDataValue; },
enumerable: true,
configurable: true
});
JsonObject.prototype.toJsonObject = function (obj) {
return this.toJsonObjectCore(obj, null);
};
JsonObject.prototype.toObject = function (jsonObj, obj) {
if (!jsonObj)
return;
var properties = null;
if (obj.getType) {
properties = JsonObject.metaData.getProperties(obj.getType());
}
if (!properties)
return;
if (obj.startLoadingFromJson) {
obj.startLoadingFromJson();
}
for (var key in jsonObj) {
if (key == JsonObject.typePropertyName)
continue;
if (key == JsonObject.positionPropertyName) {
obj[key] = jsonObj[key];
continue;
}
var property = this.findProperty(properties, key);
if (!property) {
this.addNewError(new JsonUnknownPropertyError(key.toString(), obj.getType()), jsonObj);
continue;
}
this.valueToObj(jsonObj[key], obj, key, property);
}
if (obj.endLoadingFromJson) {
obj.endLoadingFromJson();
}
};
JsonObject.prototype.toJsonObjectCore = function (obj, property) {
if (!obj.getType)
return obj;
var result = {};
if (property != null && (!property.className)) {
result[JsonObject.typePropertyName] = property.getObjType(obj.getType());
}
var properties = JsonObject.metaData.getProperties(obj.getType());
for (var i = 0; i < properties.length; i++) {
this.valueToJson(obj, result, properties[i]);
}
return result;
};
JsonObject.prototype.valueToJson = function (obj, result, property) {
var value = property.getValue(obj);
if (value === undefined || value === null)
return;
if (property.isDefaultValue(value))
return;
if (this.isValueArray(value)) {
var arrValue = [];
for (var i = 0; i < value.length; i++) {
arrValue.push(this.toJsonObjectCore(value[i], property));
}
value = arrValue.length > 0 ? arrValue : null;
}
else {
value = this.toJsonObjectCore(value, property);
}
if (!property.isDefaultValue(value)) {
result[property.name] = value;
}
};
JsonObject.prototype.valueToObj = function (value, obj, key, property) {
if (value == null)
return;
if (property != null && property.hasToUseSetValue) {
property.setValue(obj, value, this);
return;
}
if (this.isValueArray(value)) {
this.valueToArray(value, obj, property.name, property);
return;
}
var newObj = this.createNewObj(value, property);
if (newObj.newObj) {
this.toObject(value, newObj.newObj);
value = newObj.newObj;
}
if (!newObj.error) {
if (property != null) {
property.setValue(obj, value, this);
}
else {
obj[property.name] = value;
}
}
};
JsonObject.prototype.isValueArray = function (value) { return value && Array.isArray(value); };
JsonObject.prototype.createNewObj = function (value, property) {
var result = { newObj: null, error: null };
var className = value[JsonObject.typePropertyName];
if (!className && property != null && property.className) {
className = property.className;
}
className = property.getClassName(className);
result.newObj = (className) ? JsonObject.metaData.createClass(className) : null;
result.error = this.checkNewObjectOnErrors(result.newObj, value, property, className);
return result;
};
JsonObject.prototype.checkNewObjectOnErrors = function (newObj, value, property, className) {
var error = null;
if (newObj) {
var requiredProperties = JsonObject.metaData.getRequiredProperties(className);
if (requiredProperties) {
for (var i = 0; i < requiredProperties.length; i++) {
if (!value[requiredProperties[i]]) {
error = new JsonRequiredPropertyError(requiredProperties[i], className);
break;
}
}
}
}
else {
if (property.baseClassName) {
if (!className) {
error = new JsonMissingTypeError(property.name, property.baseClassName);
}
else {
error = new JsonIncorrectTypeError(property.name, property.baseClassName);
}
}
}
if (error) {
this.addNewError(error, value);
}
return error;
};
JsonObject.prototype.addNewError = function (error, jsonObj) {
if (jsonObj && jsonObj[JsonObject.positionPropertyName]) {
error.at = jsonObj[JsonObject.positionPropertyName].start;
}
this.errors.push(error);
};
JsonObject.prototype.valueToArray = function (value, obj, key, property) {
if (obj[key] && value.length > 0)
obj[key].splice(0, obj[key].length);
if (!obj[key])
obj[key] = [];
for (var i = 0; i < value.length; i++) {
var newValue = this.createNewObj(value[i], property);
if (newValue.newObj) {
obj[key].push(newValue.newObj);
this.toObject(value[i], newValue.newObj);
}
else {
if (!newValue.error) {
obj[key].push(value[i]);
}
}
}
};
JsonObject.prototype.findProperty = function (properties, key) {
if (!properties)
return null;
for (var i = 0; i < properties.length; i++) {
var prop = properties[i];
if (prop.name == key || prop.alternativeName == key)
return prop;
}
return null;
};
return JsonObject;
}());
JsonObject.typePropertyName = "type";
JsonObject.positionPropertyName = "pos";
JsonObject.metaDataValue = new JsonMetadata();
/***/ }),
/* 4 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyElementBase; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return ReactSurveyElement; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionElementBase; });
var SurveyElementBase = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyElementBase, _super);
function SurveyElementBase(props) {
var _this = _super.call(this, props) || this;
_this.isDisplayMode = props.isDisplayMode || false;
return _this;
}
SurveyElementBase.renderLocString = function (locStr, style) {
if (style === void 0) { style = null; }
if (locStr.hasHtml) {
var htmlValue = { __html: locStr.renderedHtml };
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { style: style, dangerouslySetInnerHTML: htmlValue });
}
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { style: style }, locStr.renderedHtml);
};
SurveyElementBase.prototype.componentWillReceiveProps = function (nextProps) {
this.isDisplayMode = nextProps.isDisplayMode || false;
};
SurveyElementBase.prototype.renderLocString = function (locStr, style) {
if (style === void 0) { style = null; }
return SurveyElementBase.renderLocString(locStr, style);
};
return SurveyElementBase;
}(__WEBPACK_IMPORTED_MODULE_1_react__["Component"]));
var ReactSurveyElement = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](ReactSurveyElement, _super);
function ReactSurveyElement(props) {
var _this = _super.call(this, props) || this;
_this.cssClasses = props.cssClasses;
return _this;
}
ReactSurveyElement.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.cssClasses = nextProps.cssClasses;
};
return ReactSurveyElement;
}(SurveyElementBase));
var SurveyQuestionElementBase = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionElementBase, _super);
function SurveyQuestionElementBase(props) {
var _this = _super.call(this, props) || this;
_this.questionBase = props.question;
_this.creator = props.creator;
return _this;
}
SurveyQuestionElementBase.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.questionBase = nextProps.question;
this.creator = nextProps.creator;
};
SurveyQuestionElementBase.prototype.shouldComponentUpdate = function () {
return !this.questionBase.customWidget
|| !!this.questionBase.customWidgetData.isNeedRender
|| !!this.questionBase.customWidget.widgetJson.render;
};
return SurveyQuestionElementBase;
}(SurveyElementBase));
/***/ }),
/* 5 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionFactory; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return ElementFactory; });
//TODO replace completely with ElementFactory
var QuestionFactory = (function () {
function QuestionFactory() {
this.creatorHash = {};
}
Object.defineProperty(QuestionFactory, "DefaultChoices", {
get: function () {
return [__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("choices_Item") + "1", __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("choices_Item") + "2", __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("choices_Item") + "3"];
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFactory, "DefaultColums", {
get: function () {
var colName = __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("matrix_column") + " ";
return [colName + "1", colName + "2", colName + "3"];
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFactory, "DefaultRows", {
get: function () {
var rowName = __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("matrix_row") + " ";
return [rowName + "1", rowName + "2"];
},
enumerable: true,
configurable: true
});
QuestionFactory.prototype.registerQuestion = function (questionType, questionCreator) {
this.creatorHash[questionType] = questionCreator;
};
QuestionFactory.prototype.clear = function () {
this.creatorHash = {};
};
QuestionFactory.prototype.getAllTypes = function () {
var result = new Array();
for (var key in this.creatorHash) {
result.push(key);
}
return result.sort();
};
QuestionFactory.prototype.createQuestion = function (questionType, name) {
var creator = this.creatorHash[questionType];
if (creator == null)
return null;
return creator(name);
};
return QuestionFactory;
}());
QuestionFactory.Instance = new QuestionFactory();
var ElementFactory = (function () {
function ElementFactory() {
this.creatorHash = {};
}
ElementFactory.prototype.registerElement = function (elementType, elementCreator) {
this.creatorHash[elementType] = elementCreator;
};
ElementFactory.prototype.clear = function () {
this.creatorHash = {};
};
ElementFactory.prototype.getAllTypes = function () {
var result = QuestionFactory.Instance.getAllTypes();
for (var key in this.creatorHash) {
result.push(key);
}
return result.sort();
};
ElementFactory.prototype.createElement = function (elementType, name) {
var creator = this.creatorHash[elementType];
if (creator == null)
return QuestionFactory.Instance.createQuestion(elementType, name);
return creator(name);
};
return ElementFactory;
}());
ElementFactory.Instance = new ElementFactory();
/***/ }),
/* 6 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ReactQuestionFactory; });
var ReactQuestionFactory = (function () {
function ReactQuestionFactory() {
this.creatorHash = {};
}
ReactQuestionFactory.prototype.registerQuestion = function (questionType, questionCreator) {
this.creatorHash[questionType] = questionCreator;
};
ReactQuestionFactory.prototype.getAllTypes = function () {
var result = new Array();
for (var key in this.creatorHash) {
result.push(key);
}
return result.sort();
};
ReactQuestionFactory.prototype.createQuestion = function (questionType, params) {
var creator = this.creatorHash[questionType];
if (creator == null)
return null;
return creator(params);
};
return ReactQuestionFactory;
}());
ReactQuestionFactory.Instance = new ReactQuestionFactory();
/***/ }),
/* 7 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__localizablestring__ = __webpack_require__(22);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helpers__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__itemvalue__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(3);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return Base; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return SurveyError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyElement; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return Event; });
/**
* The base class for SurveyJS objects.
*/
var Base = (function () {
function Base() {
this.propertyHash = {};
this.localizableStrings = {};
this.arraysInfo = {};
this.onPropChangeFunctions = [];
this.isLoadingFromJsonValue = false;
this.onPropertyChanged = new Event();
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["b" /* CustomPropertiesCollection */].createProperties(this);
}
/**
* A static methods that returns true if a value underfined, null, empty string or empty array.
* @param value
*/
Base.prototype.isValueEmpty = function (value) {
return __WEBPACK_IMPORTED_MODULE_2__helpers__["a" /* Helpers */].isValueEmpty(value);
};
Base.prototype.IsPropertyEmpty = function (value) {
return value !== "" && this.isValueEmpty(value);
};
/**
* Returns the type of the object as a string as it represents in the json.
*/
Base.prototype.getType = function () { return "base"; };
/**
* Returns the element template name without prefix. Typically it equals to getType()
* @see getType
*/
Base.prototype.getTemplate = function () { return this.getType(); };
Object.defineProperty(Base.prototype, "isLoadingFromJson", {
/**
* Returns true if the object is loading from Json at the current moment.
*/
get: function () { return this.isLoadingFromJsonValue; },
enumerable: true,
configurable: true
});
Base.prototype.startLoadingFromJson = function () {
this.isLoadingFromJsonValue = true;
};
Base.prototype.endLoadingFromJson = function () {
this.isLoadingFromJsonValue = false;
};
Base.prototype.onLocaleChanged = function () {
for (var key in this.arraysInfo) {
var item = this.arraysInfo[key];
if (item && item.isItemValues) {
var arr = this.getPropertyValue(key);
if (arr)
__WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].NotifyArrayOnLocaleChanged(arr);
}
}
for (var key in this.localizableStrings) {
var item = this.getLocalizableString(key);
if (item)
item.onChanged();
}
};
/**
* Returns the property value by name
* @param name property name
*/
Base.prototype.getPropertyValue = function (name, defaultValue) {
if (defaultValue === void 0) { defaultValue = null; }
var res = this.propertyHash[name];
if (this.IsPropertyEmpty(res) && defaultValue != null)
return defaultValue;
return res;
};
Base.prototype.setPropertyValueCore = function (propertiesHash, name, val) {
if (this.setPropertyValueCoreHandler)
this.setPropertyValueCoreHandler(propertiesHash, name, val);
else
propertiesHash[name] = val;
};
/**
* set property value
* @param name property name
* @param val new property value
*/
Base.prototype.setPropertyValue = function (name, val) {
var oldValue = this.propertyHash[name];
if (oldValue && Array.isArray(oldValue)) {
if (this.isTwoValueEquals(oldValue, val))
return;
var arrayInfo = this.arraysInfo[name];
this.setArray(oldValue, val, arrayInfo ? arrayInfo.isItemValues : false, arrayInfo ? arrayInfo.onPush : null);
this.propertyValueChanged(name, oldValue, oldValue);
}
else {
this.setPropertyValueCore(this.propertyHash, name, val);
if (!this.isTwoValueEquals(oldValue, val)) {
this.propertyValueChanged(name, oldValue, val);
}
}
};
Base.prototype.propertyValueChanged = function (name, oldValue, newValue) {
if (this.isLoadingFromJson)
return;
this.onPropertyChanged.fire(this, { name: name, oldValue: oldValue, newValue: newValue });
for (var i = 0; i < this.onPropChangeFunctions.length; i++) {
if (this.onPropChangeFunctions[i].name == name)
this.onPropChangeFunctions[i].func();
}
};
/**
* Register a function that will be called on a property value changed.
* @param name the property name
* @param func the function with no parameters that will be called on property changed.
* @param key an optional parameter. If there is already a registered function for this property witht the same key, it will be overwritten.
*/
Base.prototype.registerFunctionOnPropertyValueChanged = function (name, func, key) {
if (key === void 0) { key = null; }
if (key) {
for (var i = 0; i < this.onPropChangeFunctions.length; i++) {
var item = this.onPropChangeFunctions[i];
if (item.name == name && item.key == key) {
item.func = func;
return;
}
}
}
this.onPropChangeFunctions.push({ name: name, func: func, key: key });
};
/**
* Register a function that will be called on a property value changed from the names list.
* @param names the list of properties names
* @param func the function with no parameters that will be called on property changed.
* @param key an optional parameter. If there is already a registered function for this property witht the same key, it will be overwritten.
*/
Base.prototype.registerFunctionOnPropertiesValueChanged = function (names, func, key) {
if (key === void 0) { key = null; }
for (var i = 0; i < names.length; i++) {
this.registerFunctionOnPropertyValueChanged(names[i], func, key);
}
};
/**
* Unregister notification on property value changed
* @param name the property name
* @param key the key with which you have registered the notification for this property. It can be null.
*/
Base.prototype.unRegisterFunctionOnPropertyValueChanged = function (name, key) {
if (key === void 0) { key = null; }
for (var i = 0; i < this.onPropChangeFunctions.length; i++) {
var item = this.onPropChangeFunctions[i];
if (item.name == name && item.key == key) {
this.onPropChangeFunctions.splice(i, 1);
return;
}
}
};
/**
* Unregister notification on property value changed for all properties in the names list.
* @param names the list of properties names
* @param key the key with which you have registered the notification for this property. It can be null.
*/
Base.prototype.unRegisterFunctionOnPropertiesValueChanged = function (names, key) {
if (key === void 0) { key = null; }
for (var i = 0; i < names.length; i++) {
this.unRegisterFunctionOnPropertyValueChanged(names[i], key);
}
};
Base.prototype.createLocalizableString = function (name, owner, useMarkDown) {
if (useMarkDown === void 0) { useMarkDown = false; }
var locStr = new __WEBPACK_IMPORTED_MODULE_1__localizablestring__["a" /* LocalizableString */](owner, useMarkDown);
this.localizableStrings[name] = locStr;
return locStr;
};
Base.prototype.getLocalizableString = function (name) {
return this.localizableStrings[name];
};
Base.prototype.getLocalizableStringText = function (name, defaultStr) {
if (defaultStr === void 0) { defaultStr = ""; }
var locStr = this.getLocalizableString(name);
if (!locStr)
return "";
var res = locStr.text;
return res ? res : defaultStr;
};
Base.prototype.setLocalizableStringText = function (name, value) {
var locStr = this.getLocalizableString(name);
if (!locStr)
return;
var oldValue = locStr.text;
if (oldValue === value)
return;
locStr.text = value;
this.propertyValueChanged(name, oldValue, value);
};
Base.prototype.createItemValues = function (name) {
var self = this;
var result = this.createNewArray(name, function (item) { item.locOwner = self; });
this.arraysInfo[name].isItemValues = true;
return result;
};
Base.prototype.createNewArray = function (name, onPush, onRemove) {
if (onPush === void 0) { onPush = null; }
if (onRemove === void 0) { onRemove = null; }
var newArray = new Array();
this.setPropertyValueCore(this.propertyHash, name, newArray);
this.arraysInfo[name] = { onPush: onPush, isItemValues: false };
var self = this;
newArray.push = function (value) {
var result = Array.prototype.push.call(newArray, value);
if (onPush)
onPush(value);
self.propertyValueChanged(name, newArray, newArray);
return result;
};
newArray.pop = function () {
var result = Array.prototype.pop.call(newArray);
if (onRemove)
onRemove(result);
self.propertyValueChanged(name, newArray, newArray);
return result;
};
newArray.splice = function (start, deleteCount) {
var items = [];
for (var _i = 2; _i < arguments.length; _i++) {
items[_i - 2] = arguments[_i];
}
if (!start)
start = 0;
if (!deleteCount)
deleteCount = 0;
var result = (_a = Array.prototype.splice).call.apply(_a, [newArray, start, deleteCount].concat(items));
if (!items)
items = [];
if (onRemove && result) {
for (var i = 0; i < result.length; i++) {
onRemove(result[i]);
}
}
if (onPush) {
for (var i = 0; i < items.length; i++) {
onPush(items[i], start + i);
}
}
self.propertyValueChanged(name, newArray, newArray);
return result;
var _a;
};
return newArray;
};
Base.prototype.setArray = function (src, dest, isItemValues, onPush) {
src.length = 0;
if (!dest)
return;
for (var i = 0; i < dest.length; i++) {
if (isItemValues) {
var item = dest[i];
item = new __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */](null);
item.setData(dest[i]);
Array.prototype.push.call(src, item);
}
else {
Array.prototype.push.call(src, dest[i]);
}
if (onPush)
onPush(src[i]);
}
};
Base.prototype.isTwoValueEquals = function (x, y) {
if (x === y)
return true;
if (!(x instanceof Object) || !(y instanceof Object))
return false;
for (var p in x) {
if (!x.hasOwnProperty(p))
continue;
if (!y.hasOwnProperty(p))
return false;
if (x[p] === y[p])
continue;
if (typeof (x[p]) !== "object")
return false;
if (!this.isTwoValueEquals(x[p], y[p]))
return false;
}
for (p in y) {
if (y.hasOwnProperty(p) && !x.hasOwnProperty(p))
return false;
}
return true;
};
return Base;
}());
Base.commentPrefix = "-Comment";
var SurveyError = (function () {
function SurveyError() {
}
SurveyError.prototype.getText = function () {
throw new Error('This method is abstract');
};
return SurveyError;
}());
var SurveyElement = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyElement, _super);
function SurveyElement(name) {
var _this = _super.call(this) || this;
_this.name = name;
_this.selectedElementInDesignValue = _this;
return _this;
}
SurveyElement.ScrollElementToTop = function (elementId) {
if (!elementId)
return false;
var el = document.getElementById(elementId);
if (!el || !el.scrollIntoView)
return false;
var elemTop = el.getBoundingClientRect().top;
if (elemTop < 0)
el.scrollIntoView();
return elemTop < 0;
};
SurveyElement.GetFirstNonTextElement = function (elements) {
if (!elements || !elements.length)
return;
for (var i = 0; i < elements.length; i++) {
if (elements[i].nodeName != "#text" && elements[i].nodeName != "#comment")
return elements[i];
}
return null;
};
SurveyElement.FocusElement = function (elementId) {
if (!elementId)
return false;
var el = document.getElementById(elementId);
if (el) {
el.focus();
return true;
}
return false;
};
SurveyElement.setVisibleIndex = function (questions, index, showIndex) {
var startIndex = index;
for (var i = 0; i < questions.length; i++) {
var q = questions[i];
if (!showIndex || !q.visible || !q.hasTitle) {
q.setVisibleIndex(-1);
}
else {
index += q.setVisibleIndex(index);
}
}
return index - startIndex;
};
SurveyElement.prototype.setSurveyImpl = function (value) {
this.surveyImplValue = value;
if (!this.surveyImplValue)
return;
this.surveyDataValue = this.surveyImplValue.geSurveyData();
this.surveyValue = this.surveyImplValue.getSurvey();
this.textProcessorValue = this.surveyImplValue.getTextProcessor();
this.onSetData();
};
Object.defineProperty(SurveyElement.prototype, "surveyImpl", {
get: function () { return this.surveyImplValue; },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "data", {
get: function () { return this.surveyDataValue; },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "survey", {
/**
* Returns the survey object.
*/
get: function () { return this.surveyValue; },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "isLoadingFromJson", {
get: function () {
if (this.survey)
return this.survey.isLoadingFromJson;
return this.isLoadingFromJsonValue;
},
enumerable: true,
configurable: true
});
SurveyElement.prototype.getElementsInDesign = function (includeHidden) {
if (includeHidden === void 0) { includeHidden = false; }
return [];
};
Object.defineProperty(SurveyElement.prototype, "selectedElementInDesign", {
get: function () { return this.selectedElementInDesignValue; },
set: function (val) { this.selectedElementInDesignValue = val; },
enumerable: true,
configurable: true
});
SurveyElement.prototype.updateCustomWidgets = function () { };
SurveyElement.prototype.onSurveyLoad = function () { };
SurveyElement.prototype.endLoadingFromJson = function () {
_super.prototype.endLoadingFromJson.call(this);
if (!this.survey) {
this.onSurveyLoad();
}
};
Object.defineProperty(SurveyElement.prototype, "textProcessor", {
get: function () { return this.textProcessorValue; },
enumerable: true,
configurable: true
});
SurveyElement.prototype.getProcessedHtml = function (html) {
if (!html || !this.textProcessor)
return html;
return this.textProcessor.processText(html, true);
};
SurveyElement.prototype.onSetData = function () { };
return SurveyElement;
}(Base));
var Event = (function () {
function Event() {
}
Object.defineProperty(Event.prototype, "isEmpty", {
get: function () { return this.callbacks == null || this.callbacks.length == 0; },
enumerable: true,
configurable: true
});
Event.prototype.fire = function (sender, options) {
if (this.callbacks == null)
return;
for (var i = 0; i < this.callbacks.length; i++) {
var callResult = this.callbacks[i](sender, options);
}
};
Event.prototype.add = function (func) {
if (this.callbacks == null) {
this.callbacks = new Array();
}
this.callbacks.push(func);
};
Event.prototype.remove = function (func) {
if (this.callbacks == null)
return;
var index = this.callbacks.indexOf(func, 0);
if (index != undefined) {
this.callbacks.splice(index, 1);
}
};
return Event;
}());
/***/ }),
/* 8 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionbase__ = __webpack_require__(25);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__validator__ = __webpack_require__(29);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__textPreProcessor__ = __webpack_require__(17);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__conditions__ = __webpack_require__(12);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Question; });
/**
* Extends question base class with title, value, errors and other functionality
*/
var Question = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](Question, _super);
function Question(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.errorsValue = [];
_this.validatorsValue = _this.createNewArray("validators");
_this.isvalueChangedCallbackFiring = false;
_this.isValueChangedInSurvey = false;
var self = _this;
var locTitleValue = _this.createLocalizableString("title", _this, true);
locTitleValue.onRenderedHtmlCallback = function (text) { return self.fullTitle; };
var locDescriptionValue = _this.createLocalizableString("description", _this, true);
locDescriptionValue.onGetTextCallback = function (html) { return self.getProcessedHtml(html); };
_this.createLocalizableString("commentText", _this, true);
_this.createLocalizableString("requiredErrorText", _this);
return _this;
}
Object.defineProperty(Question.prototype, "isAllowTitleLeft", {
/**
* Returns true if the question may have a title located on the left
*/
get: function () { return true; },
enumerable: true,
configurable: true
});
Question.prototype.getType = function () { return "question"; };
Object.defineProperty(Question.prototype, "hasTitle", {
get: function () { return true; },
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasDescription", {
get: function () { return this.description != ""; },
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "titleLocation", {
get: function () {
var location = "top";
if (this.parent) {
location = this.parent.getQuestionTitleLocation();
}
else if (this.survey) {
location = this.survey.questionTitleLocation;
}
if (location === "left" && !this.isAllowTitleLeft)
location = "top";
return location;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "errorLocation", {
get: function () { return this.survey ? this.survey.questionErrorLocation : "top"; },
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasInput", {
get: function () { return true; },
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "inputId", {
get: function () { return this.id + "i"; },
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "title", {
/**
* Question title. Use survey questionTitleTemplate property to change the title question is rendered. If it is empty, then question name property is used.
* @see SurveyModel.questionTitleTemplate
*/
get: function () {
return this.getLocalizableStringText("title", this.name);
},
set: function (val) {
this.setLocalizableStringText("title", val);
this.fireCallback(this.titleChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "locTitle", {
get: function () { return this.getLocalizableString("title"); },
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "description", {
/**
* Question description. It renders under question title by using smaller font. Unlike the title, description can be empty.
* @see title
*/
get: function () { return this.getLocalizableStringText("description"); },
set: function (val) { this.setLocalizableStringText("description", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "locDescription", {
get: function () { return this.getLocalizableString("description"); },
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "requiredErrorText", {
/**
* The custom text that will be shown on required error. Use this property, if you do not want to show the default text.
*/
get: function () { return this.getLocalizableStringText("requiredErrorText"); },
set: function (val) { this.setLocalizableStringText("requiredErrorText", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "locRequiredErrorText", {
get: function () { return this.getLocalizableString("requiredErrorText"); },
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "commentText", {
/**
* Use it to get or set the comment value.
*/
get: function () { return this.getLocalizableStringText("commentText", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("otherItemText")); },
set: function (val) { this.setLocalizableStringText("commentText", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "locCommentText", {
get: function () { return this.getLocalizableString("commentText"); },
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "locTitleHtml", {
get: function () {
var res = this.locTitle.textOrHtml;
return res ? res : this.name;
},
enumerable: true,
configurable: true
});
/**
* Returns a copy of question errors survey. For some questions like matrix and panel dynamic it includes the errors of nested questions.
*/
Question.prototype.getAllErrors = function () { return this.errors.slice(); };
Object.defineProperty(Question.prototype, "processedTitle", {
/**
* Returns the rendred question title.
*/
get: function () { return this.getProcessedHtml(this.locTitleHtml); },
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "fullTitle", {
/**
* Returns the title after processing the question template.
* @see SurveyModel.questionTitleTemplate
*/
get: function () {
if (this.survey && this.survey.getQuestionTitleTemplate()) {
if (!this.textPreProcessor) {
var self = this;
this.textPreProcessor = new __WEBPACK_IMPORTED_MODULE_7__textPreProcessor__["a" /* TextPreProcessor */]();
this.textPreProcessor.onHasValue = function (name) { return self.canProcessedTextValues(name.toLowerCase()); };
this.textPreProcessor.onProcess = function (name) { return self.getProcessedTextValue(name); };
}
return this.textPreProcessor.process(this.survey.getQuestionTitleTemplate());
}
var requireText = this.requiredText;
if (requireText)
requireText += " ";
var no = this.no;
if (no)
no += ". ";
return no + requireText + this.processedTitle;
},
enumerable: true,
configurable: true
});
Question.prototype.focus = function (onError) {
if (onError === void 0) { onError = false; }
__WEBPACK_IMPORTED_MODULE_3__base__["a" /* SurveyElement */].ScrollElementToTop(this.id);
var id = !onError ? this.getFirstInputElementId() : this.getFirstErrorInputElementId();
if (__WEBPACK_IMPORTED_MODULE_3__base__["a" /* SurveyElement */].FocusElement(id)) {
this.fireCallback(this.focusCallback);
}
};
Question.prototype.updateCssClasses = function (res, surveyCss) {
_super.prototype.updateCssClasses.call(this, res, surveyCss);
if (this.isRequired) {
if (surveyCss.question.required) {
res.root += " " + surveyCss.question.required;
}
if (surveyCss.question.titleRequired) {
res.title += " " + surveyCss.question.titleRequired;
}
}
};
Question.prototype.getFirstInputElementId = function () {
return this.inputId;
};
Question.prototype.getFirstErrorInputElementId = function () {
return this.getFirstInputElementId();
};
Question.prototype.canProcessedTextValues = function (name) {
return name == "no" || name == "title" || name == "require";
};
Question.prototype.getProcessedTextValue = function (name) {
if (name == "no")
return this.no;
if (name == "title")
return this.processedTitle;
if (name == "require")
return this.requiredText;
return null;
};
Question.prototype.supportComment = function () { return false; };
Question.prototype.supportOther = function () { return false; };
Object.defineProperty(Question.prototype, "isRequired", {
/**
* Set this property to true, to make the question a required. If a user doesn't answer the question then a validation error will be generated.
*/
get: function () { return this.getPropertyValue("isRequired", false); },
set: function (val) {
if (this.isRequired == val)
return;
this.setPropertyValue("isRequired", val);
this.fireCallback(this.titleChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasComment", {
get: function () { return this.getPropertyValue("hasComment", false); },
set: function (val) {
if (!this.supportComment())
return;
this.setPropertyValue("hasComment", val);
if (this.hasComment)
this.hasOther = false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasOther", {
get: function () { return this.getPropertyValue("hasOther", false); },
set: function (val) {
if (!this.supportOther() || this.hasOther == val)
return;
this.setPropertyValue("hasOther", val);
if (this.hasOther)
this.hasComment = false;
this.hasOtherChanged();
},
enumerable: true,
configurable: true
});
Question.prototype.hasOtherChanged = function () { };
Object.defineProperty(Question.prototype, "isReadOnly", {
/**
* Retuns true if readOnly property is true or survey is in display mode.
* @see SurveyModel.model
* @see readOnly
*/
get: function () { return this.readOnly || (this.survey != null && this.survey.isDisplayMode); },
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "readOnly", {
/**
* Set it to true to make a question readonly.
*/
/**
* Set it to true to make the question readonly.
*/
get: function () { return this.getPropertyValue("readOnly", false); },
set: function (val) {
if (this.readOnly == val)
return;
this.setPropertyValue("readOnly", val);
this.onReadOnlyChanged();
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "enableIf", {
/**
* An expression that returns true or false. If it returns false the Question becomes read only and an end-user will not able to answer on the qustion. The library runs the expression on survey start and on changing a question value. If the property is empty then readOnly property is used.
* @see readOnly
* @see isReadOnly
*/
get: function () { return this.getPropertyValue("enableIf", ""); },
set: function (val) { this.setPropertyValue("enableIf", val); },
enumerable: true,
configurable: true
});
Question.prototype.runCondition = function (values) {
_super.prototype.runCondition.call(this, values);
if (!this.enableIf)
return;
if (!this.conditionEnabelRunner)
this.conditionEnabelRunner = new __WEBPACK_IMPORTED_MODULE_8__conditions__["a" /* ConditionRunner */](this.enableIf);
this.conditionEnabelRunner.expression = this.enableIf;
this.readOnly = !this.conditionEnabelRunner.run(values);
};
Question.prototype.onReadOnlyChanged = function () {
this.setPropertyValue("isReadOnly", this.isReadOnly);
};
Question.prototype.onAnyValueChanged = function (name) {
if (!name)
return;
var titleValue = this.locTitle.text;
if (!titleValue)
return;
if (titleValue.toLocaleLowerCase().indexOf('{' + name.toLowerCase()) > -1) {
this.fireCallback(this.titleChangedCallback);
}
};
Object.defineProperty(Question.prototype, "no", {
get: function () {
if (this.visibleIndex < 0)
return "";
var startIndex = 1;
var isNumeric = true;
var str = "";
if (this.survey && this.survey.questionStartIndex) {
str = this.survey.questionStartIndex;
if (parseInt(str))
startIndex = parseInt(str);
else if (str.length == 1)
isNumeric = false;
}
if (isNumeric)
return (this.visibleIndex + startIndex).toString();
return String.fromCharCode(str.charCodeAt(0) + this.visibleIndex);
},
enumerable: true,
configurable: true
});
Question.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
if (this.defaultValue) {
this.updateValueWithDefaults();
}
};
Question.prototype.onSetData = function () {
_super.prototype.onSetData.call(this);
this.onSurveyValueChanged(this.value);
if (this.defaultValue) {
this.updateValueWithDefaults();
}
};
Object.defineProperty(Question.prototype, "value", {
/**
* Get/Set the question value.
* @see SurveyMode.setValue
* @see SurveyMode.getValue
*/
get: function () {
return this.valueFromData(this.getValueCore());
},
set: function (newValue) {
this.setNewValue(newValue);
if (this.isvalueChangedCallbackFiring)
return;
this.isvalueChangedCallbackFiring = true;
this.fireCallback(this.valueChangedCallback);
this.isvalueChangedCallbackFiring = false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "displayValue", {
get: function () {
return this.value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "defaultValue", {
/**
* Set the default value to the question. It will be assign to the question on loading the survey from JSON or adding a question to the survey or on setting this property of the value is empty.
*/
get: function () { return this.getPropertyValue("defaultValue"); },
set: function (val) {
this.setPropertyValue("defaultValue", val);
this.updateValueWithDefaults();
},
enumerable: true,
configurable: true
});
Question.prototype.updateValueWithDefaults = function () {
if (this.isLoadingFromJson || (!this.isDesignMode && this.isValueEmpty(this.defaultValue)))
return;
if (!this.isDesignMode && !this.isEmpty())
return;
this.setDefaultValue();
};
Question.prototype.setDefaultValue = function () {
this.value = this.defaultValue;
};
Object.defineProperty(Question.prototype, "comment", {
/**
* The question comment value.
*/
get: function () { return this.getComment(); },
set: function (newValue) {
if (this.comment == newValue)
return;
this.setComment(newValue);
this.fireCallback(this.commentChangedCallback);
},
enumerable: true,
configurable: true
});
Question.prototype.getComment = function () { return this.data != null ? this.data.getComment(this.name) : this.questionComment; };
Question.prototype.setComment = function (newValue) {
this.setNewComment(newValue);
};
/**
* Returns true if the question value is empty
*/
Question.prototype.isEmpty = function () { return this.isValueEmpty(this.value); };
Object.defineProperty(Question.prototype, "validators", {
/**
* The list of question validators.
*/
get: function () { return this.validatorsValue; },
set: function (val) { this.setPropertyValue("validators", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "errors", {
/**
* The list of errors. It is created by callig hasErrors functions
* @see hasErrors
*/
get: function () { return this.errorsValue; },
set: function (val) { this.errorsValue = val; },
enumerable: true,
configurable: true
});
/**
* Returns true if threre is a validation error(s) in the question.
* @param fireCallback set it to true to show an error in UI.
*/
Question.prototype.hasErrors = function (fireCallback) {
if (fireCallback === void 0) { fireCallback = true; }
this.checkForErrors(fireCallback);
return this.errors.length > 0;
};
Object.defineProperty(Question.prototype, "currentErrorCount", {
/**
* Returns the validation errors count.
*/
get: function () { return this.errors.length; },
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "requiredText", {
/**
* Returns the char/string for a required question.
* @see SurveyModel.requiredText
*/
get: function () { return this.survey != null && this.isRequired ? this.survey.requiredText : ""; },
enumerable: true,
configurable: true
});
/**
* Add error into the question error list.
* @param error
*/
Question.prototype.addError = function (error) {
this.errors.push(error);
this.fireCallback(this.errorsChangedCallback);
};
Question.prototype.checkForErrors = function (fireCallback) {
var errorLength = this.errors ? this.errors.length : 0;
this.errors = [];
this.onCheckForErrors(this.errors);
if (this.errors.length == 0 && !this.isEmpty()) {
var error = this.runValidators();
if (error) {
//validators may change the question value.
this.errors = [];
this.errors.push(error);
}
}
if (this.survey && this.errors.length == 0) {
var error = this.fireSurveyValidation();
if (error) {
this.errors.push(error);
}
}
if (fireCallback && (errorLength != this.errors.length || errorLength > 0)) {
this.fireCallback(this.errorsChangedCallback);
}
};
Question.prototype.fireSurveyValidation = function () {
if (this.validateValueCallback)
return this.validateValueCallback();
return this.survey ? this.survey.validateQuestion(this.name) : null;
};
Question.prototype.onCheckForErrors = function (errors) {
if (this.hasRequiredError()) {
this.errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["a" /* AnswerRequiredError */](this.requiredErrorText));
}
};
Question.prototype.hasRequiredError = function () {
return this.isRequired && this.isEmpty();
};
Question.prototype.runValidators = function () {
return new __WEBPACK_IMPORTED_MODULE_6__validator__["a" /* ValidatorRunner */]().run(this);
};
Question.prototype.setNewValue = function (newValue) {
this.setNewValueInData(newValue);
this.onValueChanged();
};
Question.prototype.setNewValueInData = function (newValue) {
if (!this.isValueChangedInSurvey) {
newValue = this.valueToData(newValue);
this.setValueCore(newValue);
}
};
Question.prototype.getValueCore = function () {
return this.data != null ? this.data.getValue(this.name) : this.questionValue;
};
Question.prototype.setValueCore = function (newValue) {
if (this.data != null) {
this.data.setValue(this.name, newValue);
}
else {
this.questionValue = newValue;
}
};
Question.prototype.valueFromData = function (val) { return val; };
Question.prototype.valueToData = function (val) { return val; };
Question.prototype.onValueChanged = function () { };
Question.prototype.setNewComment = function (newValue) {
if (this.data != null) {
this.data.setComment(this.name, newValue);
}
else
this.questionComment = newValue;
};
//IQuestion
Question.prototype.onSurveyValueChanged = function (newValue) {
this.isValueChangedInSurvey = true;
this.value = this.valueFromData(newValue);
this.fireCallback(this.commentChangedCallback);
this.isValueChangedInSurvey = false;
};
//IValidatorOwner
Question.prototype.getValidatorTitle = function () { return null; };
Object.defineProperty(Question.prototype, "validatedValue", {
get: function () { return this.value; },
set: function (val) { this.value = val; },
enumerable: true,
configurable: true
});
return Question;
}(__WEBPACK_IMPORTED_MODULE_2__questionbase__["a" /* QuestionBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */].metaData.addClass("question", [{ name: "title:text", serializationProperty: "locTitle" },
{ name: "description:text", serializationProperty: "locDescription" },
{ name: "commentText", serializationProperty: "locCommentText" }, "enableIf:condition", "defaultValue:value",
"isRequired:boolean", { name: "requiredErrorText:text", serializationProperty: "locRequiredErrorText" },
"readOnly:boolean", { name: "validators:validators", baseClassName: "surveyvalidator", classNamePart: "validator" }], null, "questionbase");
/***/ }),
/* 9 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(7);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return AnswerRequiredError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return RequreNumericError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return ExceedSizeError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return CustomError; });
var AnswerRequiredError = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](AnswerRequiredError, _super);
function AnswerRequiredError(customErrorText) {
if (customErrorText === void 0) { customErrorText = null; }
var _this = _super.call(this) || this;
_this.customErrorText = customErrorText;
return _this;
}
AnswerRequiredError.prototype.getText = function () {
return this.customErrorText ? this.customErrorText : __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("requiredError");
};
return AnswerRequiredError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var RequreNumericError = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](RequreNumericError, _super);
function RequreNumericError() {
return _super.call(this) || this;
}
RequreNumericError.prototype.getText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("numericError");
};
return RequreNumericError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var ExceedSizeError = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](ExceedSizeError, _super);
function ExceedSizeError(maxSize) {
var _this = _super.call(this) || this;
_this.maxSize = maxSize;
return _this;
}
ExceedSizeError.prototype.getText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("exceedMaxSize")["format"](this.getTextSize());
};
ExceedSizeError.prototype.getTextSize = function () {
var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
var fixed = [0, 0, 2, 3, 3];
if (this.maxSize == 0)
return '0 Byte';
var i = Math.floor(Math.log(this.maxSize) / Math.log(1024));
var value = this.maxSize / Math.pow(1024, i);
return value.toFixed(fixed[i]) + ' ' + sizes[i];
};
return ExceedSizeError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var CustomError = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](CustomError, _super);
function CustomError(text) {
var _this = _super.call(this) || this;
_this.text = text;
return _this;
}
CustomError.prototype.getText = function () {
return this.text;
};
return CustomError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
/***/ }),
/* 10 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__localizablestring__ = __webpack_require__(22);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(3);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ItemValue; });
/**
* Array of ItemValue is used in checkox, dropdown and radiogroup choices, matrix columns and rows.
* It has two main properties: value and text. If text is empty, value is used for displaying.
* The text property is localizable and support markdown.
*/
var ItemValue = (function () {
function ItemValue(value, text) {
if (text === void 0) { text = null; }
this.locTextValue = new __WEBPACK_IMPORTED_MODULE_0__localizablestring__["a" /* LocalizableString */](null, true);
var self = this;
this.locTextValue.onGetTextCallback = function (text) { return text ? text : (!self.isValueEmpty ? self.value.toString() : null); };
if (text)
this.locText.text = text;
this.value = value;
}
ItemValue.createArray = function (locOwner) {
var items = [];
ItemValue.setupArray(items, locOwner);
return items;
};
ItemValue.setupArray = function (items, locOwner) {
items.push = function (value) {
var result = Array.prototype.push.call(this, value);
value.locOwner = locOwner;
return result;
};
items.splice = function (start, deleteCount) {
var items = [];
for (var _i = 2; _i < arguments.length; _i++) {
items[_i - 2] = arguments[_i];
}
var result = (_a = Array.prototype.splice).call.apply(_a, [this, start, deleteCount].concat(items));
if (!items)
items = [];
for (var i = 0; i < items.length; i++) {
items[i].locOwner = locOwner;
}
return result;
var _a;
};
};
ItemValue.setData = function (items, values) {
items.length = 0;
for (var i = 0; i < values.length; i++) {
var value = values[i];
var item = new ItemValue(null);
item.setData(value);
items.push(item);
}
};
ItemValue.getData = function (items) {
var result = new Array();
for (var i = 0; i < items.length; i++) {
result.push(items[i].getData());
}
return result;
};
ItemValue.getItemByValue = function (items, val) {
for (var i = 0; i < items.length; i++) {
if (items[i].value == val)
return items[i];
}
return null;
};
ItemValue.getTextOrHtmlByValue = function (items, val) {
var item = ItemValue.getItemByValue(items, val);
return item !== null ? item.locText.textOrHtml : "";
};
ItemValue.NotifyArrayOnLocaleChanged = function (items) {
for (var i = 0; i < items.length; i++) {
items[i].locText.onChanged();
}
};
ItemValue.prototype.getType = function () { return "itemvalue"; };
Object.defineProperty(ItemValue.prototype, "locText", {
get: function () { return this.locTextValue; },
enumerable: true,
configurable: true
});
Object.defineProperty(ItemValue.prototype, "locOwner", {
get: function () { return this.locText.owner; },
set: function (value) { this.locText.owner = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(ItemValue.prototype, "value", {
get: function () { return this.itemValue; },
set: function (newValue) {
this.itemValue = newValue;
if (!this.itemValue)
return;
var str = this.itemValue.toString();
var index = str.indexOf(ItemValue.Separator);
if (index > -1) {
this.itemValue = str.slice(0, index);
this.text = str.slice(index + 1);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(ItemValue.prototype, "hasText", {
get: function () { return this.locText.pureText ? true : false; },
enumerable: true,
configurable: true
});
Object.defineProperty(ItemValue.prototype, "text", {
get: function () { return this.locText.text; },
set: function (newText) {
this.locText.text = newText;
},
enumerable: true,
configurable: true
});
ItemValue.prototype.getData = function () {
var customAttributes = this.getCustomAttributes();
var textJson = this.locText.getJson();
if (!customAttributes && !textJson)
return this.value;
var result = { value: this.value };
if (textJson)
result["text"] = textJson;
if (customAttributes) {
for (var key in customAttributes) {
result[key] = customAttributes[key];
}
}
return result;
};
ItemValue.prototype.setData = function (value) {
if (typeof (value.value) !== 'undefined') {
var exception = null;
if (this.isObjItemValue(value)) {
value.itemValue = value.itemValue;
this.locText.setJson(value.locText.getJson());
exception = ItemValue.itemValueProp;
}
this.copyAttributes(value, exception);
}
else {
this.value = value;
}
};
Object.defineProperty(ItemValue.prototype, "isValueEmpty", {
get: function () { return !this.itemValue && this.itemValue !== 0 && this.itemValue !== false; },
enumerable: true,
configurable: true
});
ItemValue.prototype.isObjItemValue = function (obj) { return typeof (obj.getType) !== 'undefined' && obj.getType() == 'itemvalue'; };
ItemValue.prototype.copyAttributes = function (src, exceptons) {
for (var key in src) {
if ((typeof src[key] == 'function'))
continue;
if (exceptons && exceptons.indexOf(key) > -1)
continue;
if (key == "text") {
this.locText.setJson(src[key]);
}
else {
this[key] = src[key];
}
}
};
ItemValue.prototype.getCustomAttributes = function () {
var result = null;
for (var key in this) {
if ((typeof this[key] == 'function') || ItemValue.itemValueProp.indexOf(key) > -1 || key == "itemValue")
continue;
if (result == null)
result = {};
result[key] = this[key];
}
return result;
};
return ItemValue;
}());
ItemValue.Separator = '|';
ItemValue.itemValueProp = ["text", "value", "hasText", "locOwner", "locText", "isValueEmpty", "locTextValue", "pos"];
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */].metaData.addClass("itemvalue", ["!value", { name: "text", onGetValue: function (obj) { return obj.locText.pureText; } }]);
/***/ }),
/* 11 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return surveyCss; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return defaultStandardCss; });
var surveyCss = {
currentType: "",
getCss: function () {
var loc = this.currentType ? this[this.currentType] : defaultStandardCss;
if (!loc)
loc = defaultStandardCss;
return loc;
},
};
var defaultStandardCss = {
root: "sv_main",
header: "",
body: "sv_body",
footer: "sv_nav",
navigationButton: "", navigation: { complete: "sv_complete_btn", prev: "sv_prev_btn", next: "sv_next_btn" },
progress: "sv_progress", progressBar: "",
pageTitle: "sv_p_title", pageDescription: "",
row: "sv_row",
question: { mainRoot: "sv_q sv_qstn", title: "sv_q_title", description: "sv_q_description", comment: "", required: "", titleRequired: "", indent: 20 },
panel: { title: "sv_p_title", description: "", container: "sv_p_container" },
error: { root: "sv_q_erbox", icon: "", item: "" },
boolean: { root: "sv_qcbc sv_qbln", item: "sv_q_checkbox" },
checkbox: { root: "sv_qcbc sv_qcbx", item: "sv_q_checkbox", other: "sv_q_other sv_q_checkbox_other" },
comment: "",
dropdown: { root: "", control: "", other: "sv_q_other" },
matrix: { root: "sv_q_matrix", label: "sv_q_m_label" },
matrixdropdown: { root: "sv_q_matrix" },
matrixdynamic: { root: "table", button: "" },
paneldynamic: { root: "", button: "" },
multipletext: { root: "", itemTitle: "", row: "", itemValue: "sv_q_mt_item_value" },
radiogroup: { root: "sv_qcbc", item: "sv_q_radiogroup", label: "", other: "sv_q_other sv_q_radiogroup_other" },
rating: { root: "sv_q_rating", item: "sv_q_rating_item", selected: "active" },
text: "",
expression: "",
saveData: { root: "", saving: "", error: "", success: "", saveAgainButton: "" },
window: {
root: "sv_window", body: "sv_window_content",
header: {
root: "sv_window_title", title: "", button: "", buttonExpanded: "", buttonCollapsed: ""
}
}
};
surveyCss["standard"] = defaultStandardCss;
/***/ }),
/* 12 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__conditionsParser__ = __webpack_require__(31);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__functionsfactory__ = __webpack_require__(33);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__conditionProcessValue__ = __webpack_require__(15);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return Operand; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return FunctionOperand; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return ExpressionOperand; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return Condition; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return ConditionNode; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return ExpressionRunner; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ConditionRunner; });
var Operand = (function () {
function Operand(origionalValue) {
this.origionalValue = origionalValue;
}
Operand.prototype.getValue = function (processValue) {
var res = this.getSimpleValue(this.origionalValue);
if (res.isSimple)
return res.value;
var val = this.removeQuotes(this.origionalValue);
if (processValue) {
var name = this.getValueName(val);
if (name) {
if (!processValue.hasValue(name))
return null;
val = processValue.getValue(name);
return this.getSimpleValue(val).value;
}
}
return val;
};
Object.defineProperty(Operand.prototype, "isBoolean", {
get: function () { return this.isBooleanValue(this.origionalValue); },
enumerable: true,
configurable: true
});
Operand.prototype.toString = function () {
var val = this.origionalValue;
if (val && (!this.isNumeric(val) && !this.isBooleanValue(val)))
val = "'" + val + "'";
return val;
};
Operand.prototype.removeQuotes = function (val) {
if (val.length > 0 && (val[0] == "'" || val[0] == '"'))
val = val.substr(1);
var len = val.length;
if (len > 0 && (val[len - 1] == "'" || val[len - 1] == '"'))
val = val.substr(0, len - 1);
return val;
};
Operand.prototype.getValueName = function (val) {
if (val.length < 3 || val[0] != '{' || val[val.length - 1] != '}')
return null;
return val.substr(1, val.length - 2);
};
Operand.prototype.isBooleanValue = function (value) {
return value && (value.toLowerCase() === "true" || value.toLowerCase() === "false");
};
Operand.prototype.isNumeric = function (value) {
if (value && (value.indexOf('-') > -1 || value.indexOf('+') > 1 || value.indexOf('*') > -1 || value.indexOf('/') > -1))
return false;
var val = parseFloat(value);
if (isNaN(val))
return false;
return isFinite(val);
};
Operand.prototype.getSimpleValue = function (val) {
var res = { isSimple: false, value: val };
if (val === undefined || val === 'undefined') {
res.value = null;
res.isSimple = true;
return res;
}
if (!val || (typeof val != "string")) {
res.isSimple = true;
return res;
}
if (this.isNumeric(val)) {
res.isSimple = true;
res.value = parseFloat(val);
return res;
}
if (this.isBooleanValue(val)) {
res.value = val.toLowerCase() == "true";
res.isSimple = true;
return res;
}
return res;
};
return Operand;
}());
var FunctionOperand = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](FunctionOperand, _super);
function FunctionOperand(origionalValue) {
var _this = _super.call(this, origionalValue) || this;
_this.origionalValue = origionalValue;
_this.parameters = new Array();
return _this;
}
FunctionOperand.prototype.getValue = function (processValue) {
var paramValues = [];
for (var i = 0; i < this.parameters.length; i++) {
paramValues.push(this.parameters[i].getValue(processValue));
}
return __WEBPACK_IMPORTED_MODULE_2__functionsfactory__["a" /* FunctionFactory */].Instance.run(this.origionalValue, paramValues);
};
FunctionOperand.prototype.toString = function () {
var res = this.origionalValue + "(";
for (var i = 0; i < this.parameters.length; i++) {
if (i > 0)
res += ", ";
res += this.parameters[i].toString();
}
return res;
};
return FunctionOperand;
}(Operand));
var ExpressionOperand = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](ExpressionOperand, _super);
function ExpressionOperand() {
return _super.call(this, null) || this;
}
ExpressionOperand.prototype.getValue = function (processValue) {
if (!this.left || !this.right)
return null;
var l = this.left.getValue(processValue);
var r = this.right.getValue(processValue);
if (this.operator == '+') {
return l + r;
}
if (this.operator == '-') {
return l - r;
}
if (this.operator == '*') {
return l * r;
}
if (this.operator == '/') {
if (!r)
return null;
return l / r;
}
return null;
};
ExpressionOperand.prototype.toString = function () {
var res = this.left ? this.left.toString() : "";
res += ' ' + this.operator + ' ';
if (this.right)
res += this.right.toString();
return res;
};
return ExpressionOperand;
}(Operand));
var Condition = (function () {
function Condition() {
this.opValue = "equal";
this.leftValue = null;
this.rightValue = null;
}
Object.defineProperty(Condition, "operators", {
get: function () {
if (Condition.operatorsValue != null)
return Condition.operatorsValue;
Condition.operatorsValue = {
empty: function (left, right) {
if (left == null)
return true;
return !left;
},
notempty: function (left, right) {
if (left == null)
return false;
return !(!left);
},
equal: function (left, right) {
if (left == null && right != null || left != null && right == null)
return false;
if (left == null && right == null)
return true;
return left == right;
},
notequal: function (left, right) {
if (left == null && right != null || left != null && right == null)
return true;
if (left == null && right == null)
return false;
return left != right;
},
contains: function (left, right) {
if (!left || !left.length)
return false;
for (var i = 0; i < left.length; i++) {
if (left[i] == right)
return true;
}
return false;
},
notcontains: function (left, right) {
if (!left || !left.length)
return true;
for (var i = 0; i < left.length; i++) {
if (left[i] == right)
return false;
}
return true;
},
greater: function (left, right) {
if (left == null)
return false;
if (right == null)
return true;
return left > right;
},
less: function (left, right) {
if (right == null)
return false;
if (left == null)
return true;
return left < right;
},
greaterorequal: function (left, right) {
if (left == null && right != null)
return false;
if (right == null)
return true;
return left >= right;
},
lessorequal: function (left, right) {
if (left != null && right == null)
return false;
if (left == null)
return true;
return left <= right;
}
};
return Condition.operatorsValue;
},
enumerable: true,
configurable: true
});
Condition.getOperator = function (opName) {
return Condition.operators[opName];
};
Condition.setOperator = function (opName, func) {
Condition.operators[opName] = func;
};
Condition.isCorrectOperator = function (opName) {
if (!opName)
return false;
opName = opName.toLowerCase();
return Condition.operators[opName] != undefined;
};
Condition.isNoRightOperation = function (op) {
return op == "empty" || op == "notempty";
};
Object.defineProperty(Condition.prototype, "left", {
get: function () { return this.leftValue; },
set: function (val) { this.leftValue = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(Condition.prototype, "right", {
get: function () { return this.rightValue; },
set: function (val) { this.rightValue = val; },
enumerable: true,
configurable: true
});
Object.defineProperty(Condition.prototype, "operator", {
get: function () { return this.opValue; },
set: function (value) {
if (!value)
return;
value = value.toLowerCase();
if (!Condition.operators[value])
return;
this.opValue = value;
},
enumerable: true,
configurable: true
});
Condition.prototype.perform = function (left, right, processValue) {
if (left === void 0) { left = null; }
if (right === void 0) { right = null; }
if (processValue === void 0) { processValue = null; }
if (!left)
left = this.left;
if (!right)
right = this.right;
return this.performExplicit(left, right, processValue);
};
Condition.prototype.performExplicit = function (left, right, processValue) {
var leftValue = left ? left.getValue(processValue) : null;
if (!right && (leftValue === true || leftValue === false))
return leftValue;
var rightValue = right ? right.getValue(processValue) : null;
return Condition.operators[this.operator](leftValue, rightValue);
};
Condition.prototype.toString = function () {
if (!this.right || !this.operator)
return "";
var left = this.left.toString();
var res = left + ' ' + this.operationToString();
if (Condition.isNoRightOperation(this.operator))
return res;
var right = this.right.toString();
return res + ' ' + right;
};
Condition.prototype.operationToString = function () {
var op = this.operator;
if (op == "equal")
return "=";
if (op == "notequal")
return "!=";
if (op == "greater")
return ">";
if (op == "less")
return "<";
if (op == "greaterorequal")
return ">=";
if (op == "lessorequal")
return "<=";
return op;
};
return Condition;
}());
Condition.operatorsValue = null;
var ConditionNode = (function () {
function ConditionNode() {
this.connectiveValue = "and";
this.children = [];
}
Object.defineProperty(ConditionNode.prototype, "connective", {
get: function () { return this.connectiveValue; },
set: function (value) {
if (!value)
return;
value = value.toLowerCase();
if (value == "&" || value == "&&")
value = "and";
if (value == "|" || value == "||")
value = "or";
if (value != "and" && value != "or")
return;
this.connectiveValue = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ConditionNode.prototype, "isEmpty", {
get: function () { return this.children.length == 0; },
enumerable: true,
configurable: true
});
ConditionNode.prototype.clear = function () {
this.children = [];
this.connective = "and";
};
ConditionNode.prototype.toString = function () {
if (this.isEmpty)
return "";
var res = "";
for (var i = 0; i < this.children.length; i++) {
var child = this.children[i];
var nodeText = child.toString();
if (child.children && child.children.length > 0) {
nodeText = '(' + nodeText + ')';
}
if (nodeText) {
if (res)
res += ' ' + this.connective + ' ';
res += nodeText;
}
}
return res;
};
return ConditionNode;
}());
var ExpressionRunner = (function () {
function ExpressionRunner(expression) {
this.expression = expression;
this.processValue = new __WEBPACK_IMPORTED_MODULE_3__conditionProcessValue__["a" /* ProcessValue */]();
}
Object.defineProperty(ExpressionRunner.prototype, "expression", {
get: function () { return this.expressionValue; },
set: function (value) {
if (this.expression == value)
return;
this.expressionValue = value;
this.operand = new __WEBPACK_IMPORTED_MODULE_1__conditionsParser__["a" /* ConditionsParser */]().parseExpression(this.expressionValue);
},
enumerable: true,
configurable: true
});
ExpressionRunner.prototype.run = function (values) {
if (!this.operand)
return null;
this.processValue.values = values;
return this.operand.getValue(this.processValue);
};
return ExpressionRunner;
}());
var ConditionRunner = (function () {
function ConditionRunner(expression) {
this.root = new ConditionNode();
this.expression = expression;
this.processValue = new __WEBPACK_IMPORTED_MODULE_3__conditionProcessValue__["a" /* ProcessValue */]();
}
Object.defineProperty(ConditionRunner.prototype, "expression", {
get: function () { return this.expressionValue; },
set: function (value) {
if (this.expression == value)
return;
this.expressionValue = value;
new __WEBPACK_IMPORTED_MODULE_1__conditionsParser__["a" /* ConditionsParser */]().parse(this.expressionValue, this.root);
},
enumerable: true,
configurable: true
});
ConditionRunner.prototype.run = function (values) {
this.processValue.values = values;
return this.runNode(this.root);
};
ConditionRunner.prototype.runNode = function (node) {
var onFirstFail = node.connective == "and";
for (var i = 0; i < node.children.length; i++) {
var res = this.runNodeCondition(node.children[i]);
if (!res && onFirstFail)
return false;
if (res && !onFirstFail)
return true;
}
return onFirstFail;
};
ConditionRunner.prototype.runNodeCondition = function (value) {
if (value["children"])
return this.runNode(value);
if (value["left"])
return this.runCondition(value);
return false;
};
ConditionRunner.prototype.runCondition = function (condition) {
return condition.performExplicit(condition.left, condition.right, this.processValue);
};
return ConditionRunner;
}());
/***/ }),
/* 13 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Helpers; });
var Helpers = (function () {
function Helpers() {
}
/**
* A static methods that returns true if a value underfined, null, empty string or empty array.
* @param value
*/
Helpers.isValueEmpty = function (value) {
if (Array.isArray(value) && value.length === 0)
return true;
if (value && (typeof value === 'string' || value instanceof String)) {
value = value.trim();
}
return !value && value !== 0 && value !== false;
};
return Helpers;
}());
if (!String.prototype["format"]) {
String.prototype["format"] = function () {
var args = arguments;
return this.replace(/{(\d+)}/g, function (match, number) {
return typeof args[number] != 'undefined'
? args[number]
: match;
});
};
}
/***/ }),
/* 14 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionComment; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionCommentItem; });
var SurveyQuestionComment = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionComment, _super);
function SurveyQuestionComment(props) {
var _this = _super.call(this, props) || this;
_this.state = { value: _this.getStateValue() };
_this.handleOnChange = _this.handleOnChange.bind(_this);
_this.handleOnBlur = _this.handleOnBlur.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionComment.prototype, "question", {
get: function () { return this.questionBase; },
enumerable: true,
configurable: true
});
SurveyQuestionComment.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.setState({ value: this.getStateValue() });
};
SurveyQuestionComment.prototype.handleOnChange = function (event) {
this.setState({ value: event.target.value });
};
SurveyQuestionComment.prototype.handleOnBlur = function (event) {
this.question.value = event.target.value;
this.setState({ value: this.getStateValue() });
};
SurveyQuestionComment.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("textarea", { id: this.question.inputId, className: cssClasses.root, type: "text", readOnly: this.isDisplayMode, value: this.state.value, placeholder: this.question.placeHolder, onBlur: this.handleOnBlur, onChange: this.handleOnChange, cols: this.question.cols, rows: this.question.rows, "aria-label": this.question.locTitle.renderedHtml }));
};
SurveyQuestionComment.prototype.getStateValue = function () { return !this.question.isEmpty() ? this.question.value : ''; };
return SurveyQuestionComment;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
var SurveyQuestionCommentItem = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionCommentItem, _super);
function SurveyQuestionCommentItem(props) {
var _this = _super.call(this, props) || this;
_this.question = props.question;
_this.comment = _this.question.comment;
_this.otherCss = props.otherCss;
_this.state = { value: _this.comment };
_this.handleOnChange = _this.handleOnChange.bind(_this);
_this.handleOnBlur = _this.handleOnBlur.bind(_this);
return _this;
}
SurveyQuestionCommentItem.prototype.handleOnChange = function (event) {
this.comment = event.target.value;
this.setState({ value: this.comment });
};
SurveyQuestionCommentItem.prototype.handleOnBlur = function (event) {
this.question.comment = this.comment;
};
SurveyQuestionCommentItem.prototype.componentWillReceiveProps = function (nextProps) {
this.question = nextProps.question;
};
SurveyQuestionCommentItem.prototype.render = function () {
if (!this.question)
return null;
if (this.isDisplayMode)
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.cssClasses.comment }, this.comment));
var className = this.otherCss ? this.otherCss : this.cssClasses.comment;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { type: "text", className: className, value: this.state.value, onChange: this.handleOnChange, onBlur: this.handleOnBlur, "aria-label": this.question.locTitle.renderedHtml }));
};
return SurveyQuestionCommentItem;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["c" /* ReactSurveyElement */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("comment", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionComment, props);
});
/***/ }),
/* 15 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ProcessValue; });
var ProcessValue = (function () {
function ProcessValue() {
this.values = null;
}
ProcessValue.prototype.getFirstName = function (text) {
if (!text)
return text;
var res = "";
for (var i = 0; i < text.length; i++) {
var ch = text[i];
if (ch == '.' || ch == '[')
break;
res += ch;
}
return res;
};
ProcessValue.prototype.hasValue = function (text, values) {
if (values === void 0) { values = null; }
if (!values)
values = this.values;
var res = this.getValueCore(text, values);
return res.hasValue;
};
ProcessValue.prototype.getValue = function (text, values) {
if (values === void 0) { values = null; }
if (!values)
values = this.values;
var res = this.getValueCore(text, values);
return res.value;
};
ProcessValue.prototype.getValueCore = function (text, values) {
var res = { hasValue: false, value: null };
var curValue = values;
if (!curValue)
return res;
var isFirst = true;
while (text && text.length > 0) {
var isArray = !isFirst && text[0] == '[';
if (!isArray) {
if (!isFirst)
text = text.substr(1);
var curName = this.getFirstName(text);
if (!curName)
return res;
if (!curValue[curName])
return res;
curValue = curValue[curName];
text = text.substr(curName.length);
}
else {
if (!Array.isArray(curValue))
return res;
var index = 1;
var str = "";
while (index < text.length && text[index] != ']') {
str += text[index];
index++;
}
text = index < text.length ? text.substr(index + 1) : "";
index = this.getIntValue(str);
if (index < 0 || index >= curValue.length)
return res;
curValue = curValue[index];
}
isFirst = false;
}
res.value = curValue;
res.hasValue = true;
return res;
};
ProcessValue.prototype.getIntValue = function (str) {
if (str == "0" || ((str | 0) > 0 && str % 1 == 0))
return Number(str);
return -1;
};
return ProcessValue;
}());
/***/ }),
/* 16 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__itemvalue__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__choicesRestfull__ = __webpack_require__(21);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionSelectBase; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionCheckboxBase; });
/**
* It is a base class for checkbox, dropdown and radiogroup questions.
*/
var QuestionSelectBase = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionSelectBase, _super);
function QuestionSelectBase(name) {
var _this = _super.call(this, name) || this;
_this.visibleChoicesCache = null;
_this.otherItemValue = new __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */]("other", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("otherItemText"));
_this.choicesFromUrl = null;
_this.cachedValueForUrlRequests = null;
_this.isSettingComment = false;
var self = _this;
_this.choicesValues = _this.createItemValues("choices");
_this.choicesByUrl = _this.createRestfull();
_this.choicesByUrl.owner = _this;
_this.createLocalizableString("otherText", _this, true);
_this.createLocalizableString("otherErrorText", _this, true);
_this.otherItemValue.locOwner = _this;
_this.choicesByUrl.getResultCallback = function (items) { self.onLoadChoicesFromUrl(items); };
return _this;
}
Object.defineProperty(QuestionSelectBase.prototype, "otherItem", {
/**
* Returns the other item. By using this property, you may change programmatically it's value and text.
*/
get: function () {
this.otherItemValue.text = this.otherText ? this.otherText : __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("otherItemText");
return this.otherItemValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "isOtherSelected", {
/**
* Returns true if a user select the 'other' item.
*/
get: function () {
return this.getStoreOthersAsComment() ? this.getHasOther(this.value) : this.getHasOther(this.cachedValue);
},
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.getHasOther = function (val) {
return val == this.otherItem.value;
};
Object.defineProperty(QuestionSelectBase.prototype, "validatedValue", {
get: function () { return this.valueToDataCore(this.value); },
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.createRestfull = function () { return new __WEBPACK_IMPORTED_MODULE_6__choicesRestfull__["a" /* ChoicesRestfull */](); };
QuestionSelectBase.prototype.getComment = function () {
if (this.getStoreOthersAsComment())
return _super.prototype.getComment.call(this);
return this.commentValue;
};
QuestionSelectBase.prototype.setComment = function (newValue) {
if (this.getStoreOthersAsComment())
_super.prototype.setComment.call(this, newValue);
else {
if (!this.isSettingComment && newValue != this.commentValue) {
this.isSettingComment = true;
this.commentValue = newValue;
if (this.isOtherSelected) {
this.setNewValueInData(this.cachedValue);
}
this.isSettingComment = false;
}
}
};
QuestionSelectBase.prototype.setNewValue = function (newValue) {
this.cachedValueForUrlRequests = newValue;
_super.prototype.setNewValue.call(this, newValue);
};
QuestionSelectBase.prototype.valueFromData = function (val) {
if (this.getStoreOthersAsComment())
return _super.prototype.valueFromData.call(this, val);
this.cachedValue = this.valueFromDataCore(val);
return this.cachedValue;
};
QuestionSelectBase.prototype.valueToData = function (val) {
if (this.getStoreOthersAsComment())
return _super.prototype.valueToData.call(this, val);
this.cachedValue = val;
return this.valueToDataCore(val);
};
QuestionSelectBase.prototype.valueFromDataCore = function (val) {
if (!this.hasUnknownValue(val))
return val;
if (val == this.otherItem.value)
return val;
this.comment = val;
return this.otherItem.value;
};
QuestionSelectBase.prototype.valueToDataCore = function (val) {
if (val == this.otherItem.value && this.getComment()) {
val = this.getComment();
}
return val;
};
QuestionSelectBase.prototype.hasUnknownValue = function (val) {
if (!val)
return false;
var items = this.activeChoices;
for (var i = 0; i < items.length; i++) {
if (items[i].value == val)
return false;
}
return true;
};
Object.defineProperty(QuestionSelectBase.prototype, "choices", {
/**
* The list of items. Every item has value and text. If text is empty, the value is rendered. The item text supports markdown.
* @see choicesByUrl
*/
get: function () { return this.choicesValues; },
set: function (newValue) {
this.setPropertyValue("choices", newValue);
this.onVisibleChoicesChanged();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "storeOthersAsComment", {
/**
* By default the entered text in the others input in the checkbox/radiogroup/dropdown are stored as "question name " + "-Comment". The value itself is "question name": "others". Set this property to false, to store the entered text directly in the "question name" key.
* @see SurveyModel.storeOthersAsComment
*/
get: function () { return this.getPropertyValue("storeOthersAsComment", true); },
set: function (val) { this.setPropertyValue("storeOthersAsComment", val); },
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.hasOtherChanged = function () {
this.onVisibleChoicesChanged();
};
Object.defineProperty(QuestionSelectBase.prototype, "choicesOrder", {
/**
* Use this property to render items in a specific order.
*/
get: function () { return this.getPropertyValue("choicesOrder", "none"); },
set: function (val) {
val = val.toLowerCase();
if (val == this.choicesOrder)
return;
this.setPropertyValue("choicesOrder", val);
this.onVisibleChoicesChanged();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "otherText", {
/**
* Use this property to set the different text for other item.
*/
get: function () { return this.getLocalizableStringText("otherText"); },
set: function (val) {
this.setLocalizableStringText("otherText", val);
this.onVisibleChoicesChanged();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "locOtherText", {
get: function () { return this.getLocalizableString("otherText"); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "otherErrorText", {
/**
* The text that shows when the other item is choosed by the other input is empty.
*/
get: function () { return this.getLocalizableStringText("otherErrorText"); },
set: function (val) { this.setLocalizableStringText("otherErrorText", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "locOtherErrorText", {
get: function () { return this.getLocalizableString("otherErrorText"); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "visibleChoices", {
/**
* The list of items as they will be rendered. If needed items are sorted and the other item is added.
* @see hasOther
* @see choicesOrder
*/
get: function () {
if (!this.hasOther && this.choicesOrder == "none")
return this.activeChoices;
if (!this.visibleChoicesCache) {
this.visibleChoicesCache = this.sortVisibleChoices(this.activeChoices.slice());
if (this.hasOther) {
this.visibleChoicesCache.push(this.otherItem);
}
}
return this.visibleChoicesCache;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "displayValue", {
/**
* Returns the text for the current value. If the value is null then returns empty string. If 'other' is selected then returns the text for other value.
*/
get: function () {
if (this.isEmpty())
return "";
return this.getDisplayValue(this.visibleChoices, this.value);
},
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.getDisplayValue = function (items, val) {
if (val == this.otherItemValue.value)
return this.comment ? this.comment : "";
var str = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(items, val);
return (str == "" && val) ? val : str;
};
Object.defineProperty(QuestionSelectBase.prototype, "activeChoices", {
get: function () { return this.choicesFromUrl ? this.choicesFromUrl : this.choices; },
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.supportComment = function () { return true; };
QuestionSelectBase.prototype.supportOther = function () { return true; };
QuestionSelectBase.prototype.onCheckForErrors = function (errors) {
_super.prototype.onCheckForErrors.call(this, errors);
if (!this.isOtherSelected || this.comment)
return;
var text = this.otherErrorText;
if (!text) {
text = __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("otherRequiredError");
}
errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["c" /* CustomError */](text));
};
QuestionSelectBase.prototype.onLocaleChanged = function () {
_super.prototype.onLocaleChanged.call(this);
this.onVisibleChoicesChanged();
};
QuestionSelectBase.prototype.getStoreOthersAsComment = function () { return this.storeOthersAsComment && (this.survey != null ? this.survey.storeOthersAsComment : true); };
QuestionSelectBase.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
this.runChoicesByUrl();
this.onVisibleChoicesChanged();
};
QuestionSelectBase.prototype.onAnyValueChanged = function (name) {
_super.prototype.onAnyValueChanged.call(this, name);
this.runChoicesByUrl();
};
QuestionSelectBase.prototype.runChoicesByUrl = function () {
if (this.choicesByUrl) {
var processor = this.surveyImpl ? this.surveyImpl.getTextProcessor() : this.survey;
this.choicesByUrl.run(processor);
}
};
QuestionSelectBase.prototype.onLoadChoicesFromUrl = function (array) {
var errorCount = this.errors.length;
this.errors = [];
if (this.choicesByUrl && this.choicesByUrl.error) {
this.errors.push(this.choicesByUrl.error);
}
if (errorCount > 0 || this.errors.length > 0) {
this.fireCallback(this.errorsChangedCallback);
}
var newChoices = null;
var cachedValues = this.createCachedValueForUrlRequests(this.cachedValueForUrlRequests);
if (array && array.length > 0) {
newChoices = new Array();
__WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].setData(newChoices, array);
}
this.choicesFromUrl = newChoices;
if (newChoices) {
var newValue = this.updateCachedValueForUrlRequests(cachedValues);
if (newValue) {
this.value = newValue.value;
}
}
this.onVisibleChoicesChanged();
};
QuestionSelectBase.prototype.createCachedValueForUrlRequests = function (val) {
if (this.isValueEmpty(val))
return null;
if (Array.isArray(val)) {
var res = [];
for (var i = 0; i < val.length; i++) {
res.push(this.createCachedValueForUrlRequests(val[i]));
}
return res;
}
return { value: val, isExists: !this.hasUnknownValue(val) };
};
QuestionSelectBase.prototype.updateCachedValueForUrlRequests = function (val) {
if (this.isValueEmpty(val))
return null;
if (Array.isArray(val)) {
var res = [];
for (var i = 0; i < val.length; i++) {
var updatedValue = this.updateCachedValueForUrlRequests(val[i]);
if (updatedValue && !this.isValueEmpty(updatedValue.value)) {
res.push(updatedValue.value);
}
}
return { value: res };
}
var value = val.isExists && this.hasUnknownValue(val.value) ? null : val.value;
return { value: value };
};
QuestionSelectBase.prototype.onVisibleChoicesChanged = function () {
if (this.isLoadingFromJson)
return;
this.visibleChoicesCache = null;
this.fireCallback(this.choicesChangedCallback);
};
QuestionSelectBase.prototype.sortVisibleChoices = function (array) {
var order = this.choicesOrder.toLowerCase();
if (order == "asc")
return this.sortArray(array, 1);
if (order == "desc")
return this.sortArray(array, -1);
if (order == "random")
return this.randomizeArray(array);
return array;
};
QuestionSelectBase.prototype.sortArray = function (array, mult) {
return array.sort(function (a, b) {
if (a.text < b.text)
return -1 * mult;
if (a.text > b.text)
return 1 * mult;
return 0;
});
};
QuestionSelectBase.prototype.randomizeArray = function (array) {
for (var i = array.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
return array;
};
QuestionSelectBase.prototype.clearUnusedValues = function () {
_super.prototype.clearUnusedValues.call(this);
if (!this.isOtherSelected && !this.hasComment) {
this.comment = null;
}
};
return QuestionSelectBase;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
/**
* A base class for checkbox and radiogroup questions. It introduced a colCount property.
*/
var QuestionCheckboxBase = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionCheckboxBase, _super);
function QuestionCheckboxBase(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.colCountValue = 1;
return _this;
}
Object.defineProperty(QuestionCheckboxBase.prototype, "colCount", {
/**
* The number of columns for radiogroup and checkbox questions. Items are rendred in one line if the value is 0.
*/
get: function () { return this.colCountValue; },
set: function (value) {
if (value < 0 || value > 4)
return;
this.colCountValue = value;
this.fireCallback(this.colCountChangedCallback);
},
enumerable: true,
configurable: true
});
return QuestionCheckboxBase;
}(QuestionSelectBase));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */].metaData.addClass("selectbase", ["hasComment:boolean", "hasOther:boolean",
{ name: "choices:itemvalues", onGetValue: function (obj) { return __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getData(obj.choices); }, onSetValue: function (obj, value) { obj.choices = value; } },
{ name: "choicesOrder", default: "none", choices: ["none", "asc", "desc", "random"] },
{ name: "choicesByUrl:restfull", className: "ChoicesRestfull", onGetValue: function (obj) { return obj.choicesByUrl.getData(); }, onSetValue: function (obj, value) { obj.choicesByUrl.setData(value); } },
{ name: "otherText", serializationProperty: "locOtherText" }, { name: "otherErrorText", serializationProperty: "locOtherErrorText" },
{ name: "storeOthersAsComment:boolean", default: true }], null, "question");
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */].metaData.addClass("checkboxbase", [{ name: "colCount:number", default: 1, choices: [0, 1, 2, 3, 4] }], null, "selectbase");
/***/ }),
/* 17 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* unused harmony export TextPreProcessorItem */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return TextPreProcessor; });
var TextPreProcessorItem = (function () {
function TextPreProcessorItem() {
}
return TextPreProcessorItem;
}());
var TextPreProcessor = (function () {
function TextPreProcessor() {
this.hasAllValuesOnLastRunValue = false;
}
TextPreProcessor.prototype.process = function (text, returnDisplayValue) {
if (returnDisplayValue === void 0) { returnDisplayValue = false; }
this.hasAllValuesOnLastRunValue = true;
if (!text)
return text;
if (!this.onProcess)
return text;
var items = this.getItems(text);
for (var i = items.length - 1; i >= 0; i--) {
var item = items[i];
var name = this.getName(text.substring(item.start + 1, item.end));
if (!this.canProcessName(name))
continue;
if (this.onHasValue && !this.onHasValue(name)) {
this.hasAllValuesOnLastRunValue = false;
continue;
}
var value = this.onProcess(name, returnDisplayValue);
if (value == null) {
value = "";
this.hasAllValuesOnLastRunValue = false;
}
text = text.substr(0, item.start) + value + text.substr(item.end + 1);
}
return text;
};
Object.defineProperty(TextPreProcessor.prototype, "hasAllValuesOnLastRun", {
get: function () { return this.hasAllValuesOnLastRunValue; },
enumerable: true,
configurable: true
});
TextPreProcessor.prototype.getItems = function (text) {
var items = [];
var length = text.length;
var start = -1;
var ch = '';
for (var i = 0; i < length; i++) {
ch = text[i];
if (ch == '{')
start = i;
if (ch == '}') {
if (start > -1) {
var item = new TextPreProcessorItem();
item.start = start;
item.end = i;
items.push(item);
}
start = -1;
}
}
return items;
};
TextPreProcessor.prototype.getName = function (name) {
if (!name)
return;
return name.trim();
};
TextPreProcessor.prototype.canProcessName = function (name) {
if (!name)
return false;
for (var i = 0; i < name.length; i++) {
var ch = name[i];
if (ch == ' ' || ch == '-' || ch == '&')
return false;
}
return true;
};
return TextPreProcessor;
}());
/***/ }),
/* 18 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__page__ = __webpack_require__(34);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__textPreProcessor__ = __webpack_require__(17);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__conditionProcessValue__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__dxSurveyService__ = __webpack_require__(32);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__error__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__stylesmanager__ = __webpack_require__(104);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__surveytimer__ = __webpack_require__(42);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyModel; });
/**
* Survey object contains information about the survey. Pages, Questions, flow logic and etc.
*/
var SurveyModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyModel, _super);
function SurveyModel(jsonObj) {
if (jsonObj === void 0) { jsonObj = null; }
var _this = _super.call(this) || this;
_this.currentPageValue = null;
_this.valuesHash = {};
_this.variablesHash = {};
_this.localeValue = "";
_this.isCompleted = false;
_this.isCompletedBefore = false;
_this.isLoading = false;
_this.processedTextValues = {};
_this.completedStateValue = "";
_this.completedStateTextValue = "";
_this.isTimerStarted = false;
/**
* The event is fired after a user click on 'Complete' button and finished the survey. You may use it to send the data to your web server.
*
sender the survey object that fires the event
*
options.showDataSaving(text) call this method to show that the survey is saving the data on your server. The text is an optional parameter to show your message instead of default.
*
options.showDataSavingError(text) call this method to show that there is an error on saving the data on your server. If you want to show a custom error, use an optional text parameter.
*
options.showDataSavingSuccess(text) call this method to show that the data were successful saved on the server.
*
options.showDataSavingClear call this method to hide the text about the saving progress.
* @see data
* @see clearInvisibleValues
* @see completeLastPage
* @see surveyPostId
*/
_this.onComplete = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired on clicking 'Next' page if sendResultOnPageNext is set to true. You may use it to save the intermediate results, for example, if your survey is large enough.
*
sender the survey object that fires the event
* @see sendResultOnPageNext
*/
_this.onPartialSend = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired when another page becomes the current. Typically it happens when a user click on 'Next' or 'Prev' buttons.
*
sender the survey object that fires the event
*
option.oldCurrentPage the previous current/active page
*
option.newCurrentPage a new current/active page
* @see currentPage
* @see currentPageNo
* @see nextPage
* @see prevPage
* @see completeLastPage
*/
_this.onCurrentPageChanged = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired when the question value is changed. It can be done via UI by a user or programmatically on calling setValue method.
*
sender the survey object that fires the event
*
options.name the value name that has been changed
*
options.question a question which question.name equals to the value name. If there are several questions with the same name, the first question is taken. If there is no such questions, the options.question is null.
*
options.value a new value
* @see setValue
*/
_this.onValueChanged = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired on changing a question visibility.
*
sender the survey object that fires the event
*
options.question a question which visibility has been changed
*
options.name a question name
*
options.visible a question visible boolean value
* @see QuestionBase.visibile
* @see QuestionBase.visibileIf
*/
_this.onVisibleChanged = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired on changing a page visibility.
*
sender the survey object that fires the event
*
options.page a page which visibility has been changed
*
options.visible a page visible boolean value
* @see PageModel.visibile
* @see PageModel.visibileIf
*/
_this.onPageVisibleChanged = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired on changing a panel visibility.
*
sender the survey object that fires the event
*
options.panel a panel which visibility has been changed
*
options.visible a panel visible boolean value
* @see PanelModel.visibile
* @see PanelModel.visibileIf
*/
_this.onPanelVisibleChanged = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired on adding a new question into survey.
* 'question': question, 'name': question.name, 'index': index, 'parentPanel': parentPanel, 'rootPanel': rootPanel
*
sender the survey object that fires the event
*
options.question a newly added question object.
*
options.name a question name
*
options.index a index of the question in the container (page or panel)
*
options.parentPanel a container where question is located. It can be page or panel.
*
options.rootPanel typically it is a page.
* @see QuestionBase
*/
_this.onQuestionAdded = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired on removing a question from survey
*
sender the survey object that fires the event
*
options.question a removed question object.
*
options.name a question name
* @see QuestionBase
*/
_this.onQuestionRemoved = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired on adding a panel into survey
*
sender the survey object that fires the event
*
options.panel a newly added panel object.
*
options.name a panel name
*
options.index a index of the panel in the container (page or panel)
*
options.parentPanel a container where question is located. It can be page or panel.
*
options.rootPanel typically it is a page.
* @see PanelModel
*/
_this.onPanelAdded = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired on removing a panel from survey
*
sender the survey object that fires the event
*
options.panel a removed panel object.
*
options.name a panel name
* @see PanelModel
*/
_this.onPanelRemoved = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired on adding a page into survey
*
sender the survey object that fires the event
*
options.page a newly added panel object.
* @see PanelModel
*/
_this.onPageAdded = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired on validating value in a question. Set your error to options.error and survey will show the error for the question and block completing the survey or going to the next page.
*
sender the survey object that fires the event
*
options.name a question name
*
options.value the current question value
*
options.error an error string. It is empty by default.
* @see onServerValidateQuestions
*/
_this.onValidateQuestion = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* Use this event to modify the html before rendering, for example html on 'Thank you' page. Options has one parameter: options.html.
*
sender the survey object that fires the event
*
options.html an html that you may change before text processing and then rendering.
* @see completedHtml
* @see loadingHtml
* @see QuestionHtmlModel.html
*/
_this.onProcessHtml = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* Use this event to process the markdown text.
*
sender the survey object that fires the event
*
options.text a text that is going to be rendered
*
options.html a html. It is null by default. Set it and survey will use it instead of options.text
*/
_this.onTextMarkdown = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event fires when it get response from the [dxsurvey.com](http://www.dxsurvey.com) service on saving survey results. Use it to find out if the results have been saved successful.
*
sender the survey object that fires the event
*
options.success it is true if the results were sent to the service successful
*
options.response a response from the service
*/
_this.onSendResult = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* Use it to get results after calling the getResult method. It returns a simple analytic from [dxsurvey.com](http://www.dxsurvey.com) service.
*
sender the survey object that fires the event
*
options.success it is true if the results were got from the service successful
*
options.data the object {AnswersCount, QuestionResult : {} }. AnswersCount is the number of posted survey results. QuestionResult is an object with all possible unique answers to the question and number of these answers.
*
options.dataList an array of objects {name, value}, where 'name' is an unique value/answer to the question and value is a number/count of such answers.
*
options.response the server response
* @see getResult
*/
_this.onGetResult = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired on uploading the file in QuestionFile. You may use it to change the file name or tells the library do not accept the file. There are three properties in options: options.name, options.file and options.accept.
*
sender the survey object that fires the event
* name: name, file: file, accept: accept
*
name the file name
*
file the Javascript File object
*
accept a boolean value, true by default. Set it to false to deny this file to upload
* @see uploadFile
*/
_this.onUploadFile = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired before rendering a question. Use it to override the default question css classes.
* There are two parameters in options: options.question and options.cssClasses
*
sender the survey object that fires the event
*
options.question a question for which you may change the css classes
*
options.cssClasses an object with css classes. For example {root: "table", button: "button"}. You may change them to your own css classes.
*/
_this.onUpdateQuestionCssClasses = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired right after survey is rendered in DOM. options.htmlElement is the root element.
*
sender the survey object that fires the event
*
options.htmlElement a root html element binded with the survey object
*/
_this.onAfterRenderSurvey = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired right after a page is rendred in DOM. Use it to modify html elements. There are two parameters in options: options.currentPage, options.htmlElement
*
sender the survey object that fires the event
*
options.page a page object for which the event is fired. Typically the current/active page.
*
options.htmlElement an html element binded with the page object
*/
_this.onAfterRenderPage = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired right after a question is rendred in DOM. Use it to modify html elements. There are two parameters in options: options.question, options.htmlElement
*
sender the survey object that fires the event
*
options.question a question object for which the event is fired
*
options.htmlElement an html element binded with the question object
*/
_this.onAfterRenderQuestion = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired right after a panel is rendred in DOM. Use it to modify html elements. There are two parameters in options: options.panel, options.htmlElement
*
sender the survey object that fires the event
*
options.panel a panel object for which the event is fired
*
options.htmlElement an html element binded with the panel object
*/
_this.onAfterRenderPanel = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired on adding a new row in Matrix Dynamic quesiton.
*
sender the survey object that fires the event
*
options.question a matrix question.
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDynamicModel.visibleRows
*/
_this.onMatrixRowAdded = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired on adding a new row in Matrix Dynamic quesiton.
*
sender the survey object that fires the event
*
options.question a matrix question.
*
options.rowIndex a removed row index.
*
options.row a removed row object.
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDynamicModel.visibleRows
*/
_this.onMatrixRowRemoved = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired for every cell created in Matrix Dymic and Matrix Dropdown questions.
*
options.question - the matrix question
*
options.cell - the matrix cell
*
options.cellQuestion - the question/editor in the cell. You may customize it, change it's properties, like choices or visible.
*
options.rowValue - the value of the current row. To access the value of paticular column use: options.rowValue["columnValue"]
*
options.column - the matrix column object
*
options.columName - the matrix column name
*
options.row - the matrix row object
* @see onMatrixRowAdded
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDropdownModel
*/
_this.onMatrixCellCreated = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired for every cell after is has been rendered in DOM.
*
options.question - the matrix question
*
options.cell - the matrix cell
*
options.cellQuestion - the question/editor in the cell.
*
options.htmlElement a html element binded with the cellQuestion object
*
options.column - the matrix column object
*
options.row - the matrix row object
* @see onMatrixCellCreated
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDropdownModel
*/
_this.onMatrixAfterCellRender = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired when cell value is changed in Matrix Dymic and Matrix Dropdown questions.
*
options.question - the matrix question
*
options.columName - the matrix column name
*
options.value - a new value
*
options.row - the matrix row object
*
options.getCellQuestion(columnName) - the function that returns the cell question by column name.
* @see onMatrixRowAdded
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDropdownModel
*/
_this.onMatrixCellValueChanged = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired when Matrix Dymic and Matrix Dropdown questions validate the cell value.
*
options.question - the matrix question
*
options.columName - the matrix column name
*
options.value - a cell value
*
options.row - the matrix row object
*
options.getCellQuestion(columnName) - the function that returns the cell question by column name.
* @see onMatrixRowAdded
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDropdownModel
*/
_this.onMatrixCellValidate = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired every second if the method startTimer has been called.
* @see startTimer
* @see timeSpent
* @see Page.timeSpent
*/
_this.onTimer = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The event is fired before displaying a new information in the Timer Panel. Use it to change the default text.
*
options.text - the timer panel info text.
*/
_this.onTimerPanelInfoText = new __WEBPACK_IMPORTED_MODULE_2__base__["b" /* Event */]();
/**
* The list of errors on loading survey json. If the list is empty after loading a json then the json is correct and there is no errors in it.
* @see JsonError
*/
_this.jsonErrors = null;
_this.timerFunc = null;
var self = _this;
var locTitleValue = _this.createLocalizableString("title", _this, true);
locTitleValue.onRenderedHtmlCallback = function (text) { return self.processedTitle; };
_this.createLocalizableString("completedHtml", _this);
_this.createLocalizableString("completedBeforeHtml", _this);
_this.createLocalizableString("loadingHtml", _this);
_this.createLocalizableString("pagePrev", _this);
_this.createLocalizableString("pageNext", _this);
_this.createLocalizableString("complete", _this);
_this.createLocalizableString("questionTitleTemplate", _this, true);
_this.textPreProcessor = new __WEBPACK_IMPORTED_MODULE_4__textPreProcessor__["a" /* TextPreProcessor */]();
_this.textPreProcessor.onHasValue = function (name) { return self.hasProcessedTextValue(name); };
_this.textPreProcessor.onProcess = function (name, returnDisplayValue) { return self.getProcessedTextValue(name, returnDisplayValue); };
_this.pagesValue = _this.createNewArray("pages", function (value) { self.doOnPageAdded(value); });
_this.triggersValue = _this.createNewArray("triggers", function (value) { value.setOwner(self); });
_this.updateProcessedTextValues();
_this.onBeforeCreating();
if (jsonObj) {
if (typeof jsonObj === 'string' || jsonObj instanceof String) {
jsonObj = JSON.parse(jsonObj);
}
if (jsonObj && jsonObj.clientId) {
_this.clientId = jsonObj.clientId;
}
_this.setJsonObject(jsonObj);
if (_this.surveyId) {
_this.loadSurveyFromService(_this.surveyId, _this.clientId);
}
}
_this.onCreating();
return _this;
}
Object.defineProperty(SurveyModel.prototype, "platformName", {
get: function () { return SurveyModel.platform; },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "commentPrefix", {
/**
* You may show comments input for the most of questions. The entered text in the comment input will be saved as 'question name' + 'commentPrefix'.
* @see data
*/
get: function () { return __WEBPACK_IMPORTED_MODULE_2__base__["c" /* Base */].commentPrefix; },
set: function (val) { __WEBPACK_IMPORTED_MODULE_2__base__["c" /* Base */].commentPrefix = val; },
enumerable: true,
configurable: true
});
SurveyModel.prototype.getType = function () { return "survey"; };
Object.defineProperty(SurveyModel.prototype, "pages", {
/**
* The list of all pages in the survey, including invisible.
* @see PageModel
* @see visiblePages
*/
get: function () { return this.pagesValue; },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "triggers", {
/**
* The list of triggers in the survey.
* @see SurveyTrigger
*/
get: function () { return this.triggersValue; },
set: function (val) { this.setPropertyValue("triggers", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "surveyId", {
/**
* Set this property to automatically load survey Json from [dxsurvey.com](http://www.dxsurvey.com) service.
* @see loadSurveyFromService
*/
get: function () { return this.getPropertyValue("surveyId", ""); },
set: function (val) { this.setPropertyValue("surveyId", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "surveyPostId", {
/**
* Set this property to automatically save the data into the [dxsurvey.com](http://www.dxsurvey.com) service.
* @see onComplete
* @see surveyShowDataSaving
*/
get: function () { return this.getPropertyValue("surveyPostId", ""); },
set: function (val) { this.setPropertyValue("surveyPostId", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "clientId", {
/**
* Use this property as indentificator for a user, for example e-mail or unique customer id in your web application. If you are loading survey or posting survey results from/to [dxsurvey.com](http://www.dxsurvey.com) service, then the library do not allow to run the same survey the second time. On the second run, the user will see the 'Thank you' page.
*/
get: function () { return this.getPropertyValue("clientId", ""); },
set: function (val) { this.setPropertyValue("clientId", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "cookieName", {
/**
* If the property is not empty, before starting to run the survey, the library checkes if the cookie with this name exists. If it is true, the survey goes to complete mode and an user sees the 'Thank you' page. On completing the survey the cookie with this name is created.
*/
get: function () { return this.getPropertyValue("cookieName", ""); },
set: function (val) { this.setPropertyValue("cookieName", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "sendResultOnPageNext", {
/**
* Set it to true, to save results on completing every page. onPartialSend event is fired.
* @see onPartialSend
* @see clientId
*/
get: function () { return this.getPropertyValue("sendResultOnPageNext", false); },
set: function (val) { this.setPropertyValue("sendResultOnPageNext", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "surveyShowDataSaving", {
/**
* Set this property to true, to show the progress on saving/sending data into the [dxsurvey.com](http://www.dxsurvey.com) service.
* @see surveyPostId
*/
get: function () { return this.getPropertyValue("surveyShowDataSaving", false); },
set: function (val) { this.setPropertyValue("surveyShowDataSaving", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "focusFirstQuestionAutomatic", {
/**
* On showing the next or previous page, a first input is focused, if the property set to true.
*/
get: function () { return this.getPropertyValue("focusFirstQuestionAutomatic", true); },
set: function (val) { this.setPropertyValue("focusFirstQuestionAutomatic", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showNavigationButtons", {
/**
* Set it to false to hide 'Prev', 'Next' and 'Complete' buttons. It makes sense if you are going to create a custom navigation or have just one page or on setting goNextPageAutomatic property.
* @see goNextPageAutomatic
* @see showPrevButton
*/
get: function () { return this.getPropertyValue("showNavigationButtons", true); },
set: function (val) { this.setPropertyValue("showNavigationButtons", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showPrevButton", {
/**
* Set it to false to hide the 'Prev' to disable for end-users go back to their answers.
* @see showNavigationButtons
*/
get: function () { return this.getPropertyValue("showPrevButton", true); },
set: function (val) { this.setPropertyValue("showPrevButton", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showTitle", {
/**
* Set it to false hide survey title.
* @see title
*/
get: function () { return this.getPropertyValue("showTitle", true); },
set: function (val) { this.setPropertyValue("showTitle", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showPageTitles", {
/**
* Set it to false to hide page titles.
* @see PageModel.title
*/
get: function () { return this.getPropertyValue("showPageTitles", true); },
set: function (val) { this.setPropertyValue("showPageTitles", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showCompletedPage", {
/**
* On finishing the survey the 'Thank you', page on complete, is shown. Set the property to false, to hide the 'Thank you' page.
* @see data
* @see onComplete
*/
get: function () { return this.getPropertyValue("showCompletedPage", true); },
set: function (val) { this.setPropertyValue("showCompletedPage", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "requiredText", {
/**
* A char/string that will be rendered in the title required questions.
* @see QuestionBase.title
*/
get: function () { return this.getPropertyValue("requiredText", "*"); },
set: function (val) { this.setPropertyValue("requiredText", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "questionStartIndex", {
/**
* By default the first question index is 1. You may start it from 100 or from 'A', by setting 100 or 'A' to this property.
* @see QuestionBase.title
* @see requiredText
*/
get: function () { return this.getPropertyValue("questionStartIndex", ""); },
set: function (val) { this.setPropertyValue("questionStartIndex", val); },
enumerable: true,
configurable: true
});
;
Object.defineProperty(SurveyModel.prototype, "storeOthersAsComment", {
/**
* By default the entered text in the others input in the checkbox/radiogroup/dropdown are stored as "question name " + "-Comment". The value itself is "question name": "others". Set this property to false, to store the entered text directly in the "question name" key.
* @see commentPrefix
*/
get: function () { return this.getPropertyValue("storeOthersAsComment", true); },
set: function (val) { this.setPropertyValue("storeOthersAsComment", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "goNextPageAutomatic", {
/**
* Set it true if you want to go to the next page without pressing 'Next' button when all questions are anwered.
* @see showNavigationButtons
*/
get: function () { return this.getPropertyValue("goNextPageAutomatic", false); },
set: function (val) { this.setPropertyValue("goNextPageAutomatic", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "clearInvisibleValues", {
/**
* Set it to 'onComplete', to remove from data property values of invisible questions on survey complete. In this case, the invisible questions will not be stored on the server.
* Set it to 'onHidden' to clear the question value when it becomes invisible.
* The default value is 'none'.
* @see QuestionBase.visible
* @see onComplete
*/
get: function () { return this.getPropertyValue("clearInvisibleValues", "none"); },
set: function (val) {
if (val === true)
val = "onComplete";
if (val === false)
val = "none";
this.setPropertyValue("clearInvisibleValues", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locale", {
/**
* Use it to change the survey locale. By default it is empty, 'en'. You may set it to 'de' - german, 'fr' - french and so on. The library has built-in localization for several languages. The library has a multi-language support as well.
*/
get: function () { return this.localeValue; },
set: function (value) {
this.localeValue = value;
this.setPropertyValue("locale", value);
__WEBPACK_IMPORTED_MODULE_7__surveyStrings__["a" /* surveyLocalization */].currentLocale = value;
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].onLocaleChanged();
}
},
enumerable: true,
configurable: true
});
//ILocalizableOwner
SurveyModel.prototype.getLocale = function () { return this.locale; };
SurveyModel.prototype.getMarkdownHtml = function (text) {
var options = { text: text, html: null };
this.onTextMarkdown.fire(this, options);
return options.html;
};
SurveyModel.prototype.getLocString = function (str) { return __WEBPACK_IMPORTED_MODULE_7__surveyStrings__["a" /* surveyLocalization */].getString(str); };
Object.defineProperty(SurveyModel.prototype, "emptySurveyText", {
/**
* Returns the text that renders when there is no any visible page and question.
*/
get: function () { return this.getLocString("emptySurvey"); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "title", {
/**
* Survey title.
*/
get: function () { return this.getLocalizableStringText("title"); },
set: function (value) { this.setLocalizableStringText("title", value); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locTitle", {
get: function () { return this.getLocalizableString("title"); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "completedHtml", {
/**
* The html that shows on completed ('Thank you') page. Set it to change the default text.
* @see showCompletedPage
* @see locale
*/
get: function () { return this.getLocalizableStringText("completedHtml"); },
set: function (value) { this.setLocalizableStringText("completedHtml", value); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locCompletedHtml", {
get: function () { return this.getLocalizableString("completedHtml"); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "completedBeforeHtml", {
/**
* The html that shows if the end user has already completed the survey.
* @see clientId
* @see locale
*/
get: function () { return this.getLocalizableStringText("completedBeforeHtml"); },
set: function (value) { this.setLocalizableStringText("completedBeforeHtml", value); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locCompletedBeforeHtml", {
get: function () { return this.getLocalizableString("completedBeforeHtml"); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "loadingHtml", {
/**
* The html that shows on loading survey Json from the dxsurvey.com service.
* @see surveyId
* @see locale
*/
get: function () { return this.getLocalizableStringText("loadingHtml"); },
set: function (value) { this.setLocalizableStringText("loadingHtml", value); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locLoadingHtml", {
get: function () { return this.getLocalizableString("loadingHtml"); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "pagePrevText", {
/**
* A text that renders on the 'Prev' button. Set it to change the default text.
* @see locale
*/
get: function () { return this.getLocalizableStringText("pagePrev", this.getLocString("pagePrevText")); },
set: function (newValue) { this.setLocalizableStringText("pagePrev", newValue); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locPagePrevText", {
get: function () { return this.getLocalizableString("pagePrev"); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "pageNextText", {
/**
* A text that renders on the 'Next' button. Set it to change the default text.
* @see locale
*/
get: function () { return this.getLocalizableStringText("pageNext", this.getLocString("pageNextText")); },
set: function (newValue) { this.setLocalizableStringText("pageNext", newValue); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locPageNextText", {
get: function () { return this.getLocalizableString("pageNext"); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "completeText", {
/**
* A text that renders on the 'Complete' button. Set it to change the default text.
* @see locale
*/
get: function () { return this.getLocalizableStringText("complete", this.getLocString("completeText")); },
set: function (newValue) { this.setLocalizableStringText("complete", newValue); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locCompleteText", {
get: function () { return this.getLocalizableString("complete"); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "questionTitleTemplate", {
/**
* A template for a question title.
* @see QuestionModel.title
*/
get: function () { return this.getLocalizableStringText("questionTitleTemplate"); },
set: function (value) { this.setLocalizableStringText("questionTitleTemplate", value); },
enumerable: true,
configurable: true
});
/**
* Returns the question title template
* @see questionTitleTemplate
* @see QuestionModel.title
*/
SurveyModel.prototype.getQuestionTitleTemplate = function () { return this.locQuestionTitleTemplate.textOrHtml; };
Object.defineProperty(SurveyModel.prototype, "locQuestionTitleTemplate", {
get: function () { return this.getLocalizableString("questionTitleTemplate"); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showPageNumbers", {
/**
* Set this property to false to turn off the numbering on pages titles.
*/
get: function () { return this.getPropertyValue("showPageNumbers", false); },
set: function (value) {
if (value === this.showPageNumbers)
return;
this.setPropertyValue("showPageNumbers", value);
this.updateVisibleIndexes();
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showQuestionNumbers", {
/**
* Set this property to "off" to turn off the numbering on questions titles or "onpage" to start numbering on every page. The default value is "on".
*/
get: function () { return this.getPropertyValue("showQuestionNumbers", "on"); },
set: function (value) {
value = value.toLowerCase();
value = (value === "onpage") ? "onPage" : value;
if (value === this.showQuestionNumbers)
return;
this.setPropertyValue("showQuestionNumbers", value);
this.updateVisibleIndexes();
},
enumerable: true,
configurable: true
});
;
;
Object.defineProperty(SurveyModel.prototype, "showProgressBar", {
/**
* Set this property to "top" to show the progress bar on the bottom or to "bottom" to show it on the bottom.
*/
get: function () { return this.getPropertyValue("showProgressBar", "off"); },
set: function (newValue) {
this.setPropertyValue("showProgressBar", newValue.toLowerCase());
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "processedTitle", {
/**
* Returns the text/html that renders as survey title.
*/
get: function () { return this.processText(this.locTitle.textOrHtml, true); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "questionTitleLocation", {
/**
* Set this property to 'bottom' or 'left' to show question title under the question or on the left.
*
Note: Some questions, for example matrixes, do not support 'left' value. The title for them will be displayed on the top.
*/
get: function () { return this.getPropertyValue("questionTitleLocation", "top"); },
set: function (value) {
this.setPropertyValue("questionTitleLocation", value.toLowerCase());
},
enumerable: true,
configurable: true
});
;
;
Object.defineProperty(SurveyModel.prototype, "questionErrorLocation", {
/**
* Set this property to 'bottom' to show question error(s) under the question.
*/
get: function () { return this.getPropertyValue("questionErrorLocation", "top"); },
set: function (value) {
this.setPropertyValue("questionErrorLocation", value.toLowerCase());
},
enumerable: true,
configurable: true
});
;
;
Object.defineProperty(SurveyModel.prototype, "mode", {
/**
* Set this mode to 'display' to make the survey read-only. The default value is 'edit'.
*/
get: function () { return this.getPropertyValue("mode", "edit"); },
set: function (value) {
value = value.toLowerCase();
if (value == this.mode)
return;
if (value != "edit" && value != "display")
return;
this.setPropertyValue("mode", value);
var questions = this.getAllQuestions();
for (var i = 0; i < questions.length; i++) {
questions[i].onReadOnlyChanged();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "data", {
/**
* An object that stores the survey results/data. You may set it directly as { 'question name': questionValue, ... }
* @see setValue
* @see getValue
*/
get: function () {
var result = {};
for (var key in this.valuesHash) {
result[key] = this.valuesHash[key];
}
return result;
},
set: function (data) {
this.valuesHash = {};
if (data) {
for (var key in data) {
this.setDataValueCore(this.valuesHash, key, data[key]);
this.checkTriggers(key, data[key], false);
if (!this.processedTextValues[key.toLowerCase()]) {
this.processedTextValues[key.toLowerCase()] = "value";
}
}
}
this.notifyAllQuestionsOnValueChanged();
this.runConditions();
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getAllValues = function () { return this.data; };
SurveyModel.prototype.setDataValueCore = function (valuesHash, key, value) {
valuesHash[key] = value;
};
Object.defineProperty(SurveyModel.prototype, "comments", {
/**
* Returns all comments from the data.
* @see data
*/
get: function () {
var result = {};
for (var key in this.valuesHash) {
if (key.indexOf(this.commentPrefix) > 0) {
result[key] = this.valuesHash[key];
}
}
return result;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "visiblePages", {
/**
* Returns the list of visible pages. If all pages are visible then it is the same as pages property.
* @see pages
* @see PageModel.visible
* @see PageModel.visibleIf
*/
get: function () {
if (this.isDesignMode)
return this.pages;
var result = new Array();
for (var i = 0; i < this.pages.length; i++) {
if (this.pages[i].isVisible) {
result.push(this.pages[i]);
}
}
return result;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isEmpty", {
/**
* Returns true if there is no any page in the survey. The survey is empty.
*/
get: function () { return this.pages.length == 0; },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "PageCount", {
/**
* depricated, misspelling, use pageCount property
*/
get: function () { return this.pageCount; },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "pageCount", {
/**
* Returns the survey pages count.
* @see visiblePageCount
* @see pages
*/
get: function () {
return this.pages.length;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "visiblePageCount", {
/**
* Returns the survey visible pages count
* @see pageCount
* @see visiblePages
*/
get: function () {
return this.visiblePages.length;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "currentPage", {
/**
* Returns the current survey page. If survey is rendred then it is a page that a user can see/edit.
*/
get: function () {
var vPages = this.visiblePages;
if (this.currentPageValue != null) {
if (vPages.indexOf(this.currentPageValue) < 0) {
this.currentPage = null;
}
}
if (this.currentPageValue == null && vPages.length > 0) {
this.currentPage = vPages[0];
}
return this.currentPageValue;
},
set: function (value) {
var vPages = this.visiblePages;
if (value != null && vPages.indexOf(value) < 0)
return;
if (value == this.currentPageValue)
return;
var oldValue = this.currentPageValue;
this.currentPageValue = value;
if (value)
value.updateCustomWidgets();
this.currentPageChanged(value, oldValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "currentPageNo", {
/**
* The index of the current page in the visible pages array. It starts from 0.
*/
get: function () {
return this.visiblePages.indexOf(this.currentPage);
},
set: function (value) {
var vPages = this.visiblePages;
if (value < 0 || value >= this.visiblePages.length)
return;
this.currentPage = this.visiblePages[value];
},
enumerable: true,
configurable: true
});
/**
* Set the input focus to the first question with the input.
*/
SurveyModel.prototype.focusFirstQuestion = function () {
var page = this.currentPage;
if (page) {
page.scrollToTop();
page.focusFirstQuestion();
}
};
SurveyModel.prototype.scrollToTopOnPageChange = function () {
var page = this.currentPage;
if (!page)
return;
page.scrollToTop();
if (this.focusFirstQuestionAutomatic) {
page.focusFirstQuestion();
}
};
Object.defineProperty(SurveyModel.prototype, "state", {
/**
* Returns the current survey state: 'loading' - loading from the json, 'completed' - a user has completed the survey, 'running' - a user answers a questions right now, 'empty' - there is nothing to show in the current survey.
*/
get: function () {
if (this.isLoading)
return "loading";
if (this.isCompleted)
return "completed";
if (this.isCompletedBefore)
return "completedbefore";
return (this.currentPage) ? "running" : "empty";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "completedState", {
get: function () { return this.completedStateValue; },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "completedStateText", {
get: function () { return this.completedStateTextValue; },
enumerable: true,
configurable: true
});
SurveyModel.prototype.setCompletedState = function (value, text) {
this.completedStateValue = value;
if (!text) {
if (value == "saving")
text = this.getLocString("savingData");
if (value == "error")
text = this.getLocString("savingDataError");
if (value == "success")
text = this.getLocString("savingDataSuccess");
}
this.completedStateTextValue = text;
};
/**
* Clear the survey data and state. If the survey has a 'completed' state, it will have a 'running' state.
* @param clearData clear the data
* @param gotoFirstPage make the first page as a current page.
* @see data
* @see state
* @see currentPage
*/
SurveyModel.prototype.clear = function (clearData, gotoFirstPage) {
if (clearData === void 0) { clearData = true; }
if (gotoFirstPage === void 0) { gotoFirstPage = true; }
if (clearData) {
this.data = null;
this.variablesHash = {};
}
this.setTimeSpent(0);
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].timeSpent = 0;
}
this.isCompleted = false;
this.isCompletedBefore = false;
this.isLoading = false;
if (gotoFirstPage && this.visiblePageCount > 0) {
this.currentPage = this.visiblePages[0];
}
};
SurveyModel.prototype.mergeValues = function (src, dest) {
if (!dest || !src)
return;
for (var key in src) {
var value = src[key];
if (value && typeof value === 'object') {
if (!dest[key])
dest[key] = {};
this.mergeValues(value, dest[key]);
}
else {
dest[key] = value;
}
}
};
SurveyModel.prototype.updateCustomWidgets = function (page) {
if (!page)
return;
page.updateCustomWidgets();
};
SurveyModel.prototype.currentPageChanged = function (newValue, oldValue) {
this.onCurrentPageChanged.fire(this, { 'oldCurrentPage': oldValue, 'newCurrentPage': newValue });
};
/**
* Returns the progress that a user made by answering on the survey.
*/
SurveyModel.prototype.getProgress = function () {
if (this.currentPage == null)
return 0;
var index = this.visiblePages.indexOf(this.currentPage) + 1;
return Math.ceil((index * 100 / this.visiblePageCount));
};
Object.defineProperty(SurveyModel.prototype, "isNavigationButtonsShowing", {
/**
* Returns true if navigation buttons: 'Prev', 'Next' or 'Complete' are shown.
*/
get: function () {
if (this.isDesignMode)
return false;
var page = this.currentPage;
if (!page)
return false;
return page.navigationButtonsVisibility == "show" ||
(page.navigationButtonsVisibility != "hide" && this.showNavigationButtons);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isEditMode", {
/**
* Returns true if the survey in the edit mode.
* @see mode
*/
get: function () { return this.mode == "edit"; },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isDisplayMode", {
/**
* Returns true if the survey in the display mode.
* @see mode
*/
get: function () { return this.mode == "display"; },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isDesignMode", {
/**
* Returns true if the survey in the design mode. It is used by SurveyJS Editor
* @see setDesignMode
*/
get: function () { return this.getPropertyValue("isDesignMode", false); },
enumerable: true,
configurable: true
});
/**
* Call it to set the survey into the design mode.
* @param value use true to set the survey into the design mode.
*/
SurveyModel.prototype.setDesignMode = function (value) {
this.setPropertyValue("isDesignMode", value);
};
Object.defineProperty(SurveyModel.prototype, "hasCookie", {
/**
* Returns true, if a user has already completed the survey on this browser and there is a cookie about it. Survey goes to 'completed' state if the function returns true.
* @see cookieName
* @see setCookie
* @see deleteCookie
* @see state
*/
get: function () {
if (!this.cookieName)
return false;
var cookies = document.cookie;
return cookies && cookies.indexOf(this.cookieName + "=true") > -1;
},
enumerable: true,
configurable: true
});
/**
* Set the cookie with cookieName in the browser. It is done automatically on survey complete if cookieName is not empty.
* @see cookieName
* @see hasCookie
* @see deleteCookie
*/
SurveyModel.prototype.setCookie = function () {
if (!this.cookieName)
return;
document.cookie = this.cookieName + "=true; expires=Fri, 31 Dec 9999 0:0:0 GMT";
};
/**
* Delete the cookie with cookieName in the browser.
* @see cookieName
* @see hasCookie
* @see setCookie
*/
SurveyModel.prototype.deleteCookie = function () {
if (!this.cookieName)
return;
document.cookie = this.cookieName + "=;";
};
/**
* Call it to go to the next page. It returns false, if it is the last page. If there is an error, for example required question is empty, the function returns false as well.
* @see isCurrentPageHasErrors
* @see prevPage
* @see completeLastPage
*/
SurveyModel.prototype.nextPage = function () {
if (this.isLastPage)
return false;
if (this.isEditMode && this.isCurrentPageHasErrors)
return false;
if (this.doServerValidation())
return false;
this.doNextPage();
return true;
};
Object.defineProperty(SurveyModel.prototype, "isCurrentPageHasErrors", {
/**
* Returns true, if there is any error on the current page. For example, the required question is empty or a question validation is failed.
* @see nextPage
*/
get: function () {
if (this.currentPage == null)
return true;
return this.currentPage.hasErrors(true, true);
},
enumerable: true,
configurable: true
});
/**
* Call it to go to the previous page. It returns false if the current page is the first page already. It doesn't perform any checks, required questions can be empty.
* @see isFirstPage
*/
SurveyModel.prototype.prevPage = function () {
if (this.isFirstPage)
return false;
var vPages = this.visiblePages;
var index = vPages.indexOf(this.currentPage);
this.currentPage = vPages[index - 1];
};
/**
* Call it to complete the survey, if the current page is the last one. It returns false if there is an error on the page. If there is no errors on the page, it calls doComplete and returns true.
* @see isCurrentPageHasErrors
* @see nextPage
* @see doComplete
*/
SurveyModel.prototype.completeLastPage = function () {
if (this.isEditMode && this.isCurrentPageHasErrors)
return false;
if (this.doServerValidation())
return false;
this.doComplete();
return true;
};
Object.defineProperty(SurveyModel.prototype, "isFirstPage", {
/**
* Returns true if the current page is the first one.
*/
get: function () {
if (this.currentPage == null)
return true;
return this.visiblePages.indexOf(this.currentPage) == 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isShowPrevButton", {
get: function () {
if (this.isFirstPage || !this.showPrevButton)
return false;
if (this.maxTimeToFinish > 0)
return false;
var page = this.visiblePages[this.currentPageNo - 1];
return this.getPageMaxTimeToFinish(page) <= 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isLastPage", {
/**
* Returns true if the current page is the last one.
*/
get: function () {
if (this.currentPage == null)
return true;
var vPages = this.visiblePages;
return vPages.indexOf(this.currentPage) == vPages.length - 1;
},
enumerable: true,
configurable: true
});
/**
* Call it to complete the survey. It writes cookie if cookieName property is not empty, set the survey into 'completed' state, fire onComplete event and sendResult into [dxsurvey.com](http://www.dxsurvey.com) service if surveyPostId property is not empty. It doesn't perform any validation, unlike completeLastPage function.
* @see cookieName
* @see state
* @see onComplete
* @see surveyPostId
* @see completeLastPage
*/
SurveyModel.prototype.doComplete = function () {
var previousCookie = this.hasCookie;
this.stopTimer();
this.clearUnusedValues();
this.setCookie();
this.setCompleted();
var self = this;
var onCompleteOptions = {
showDataSaving: function (text) { self.setCompletedState("saving", text); },
showDataSavingError: function (text) { self.setCompletedState("error", text); },
showDataSavingSuccess: function (text) { self.setCompletedState("success", text); },
showDataSavingClear: function (text) { self.setCompletedState("", ""); }
};
this.onComplete.fire(this, onCompleteOptions);
if (!previousCookie && this.surveyPostId) {
this.sendResult();
}
};
Object.defineProperty(SurveyModel.prototype, "isValidatingOnServer", {
/**
* Returns true, if at the current moment the question values on the current page are validating on the server.
* @see onServerValidateQuestions
*/
get: function () { return this.getPropertyValue("isValidatingOnServer", false); },
enumerable: true,
configurable: true
});
SurveyModel.prototype.setIsValidatingOnServer = function (val) {
if (val == this.isValidatingOnServer)
return;
this.setPropertyValue("isValidatingOnServer", val);
this.onIsValidatingOnServerChanged();
};
SurveyModel.prototype.onIsValidatingOnServerChanged = function () { };
SurveyModel.prototype.doServerValidation = function () {
if (!this.onServerValidateQuestions)
return false;
var self = this;
var options = { data: {}, errors: {}, survey: this, complete: function () { self.completeServerValidation(options); } };
for (var i = 0; i < this.currentPage.questions.length; i++) {
var question = this.currentPage.questions[i];
if (!question.visible)
continue;
var value = this.getValue(question.name);
if (!this.isValueEmpty(value))
options.data[question.name] = value;
}
this.setIsValidatingOnServer(true);
this.onServerValidateQuestions(this, options);
return true;
};
SurveyModel.prototype.completeServerValidation = function (options) {
this.setIsValidatingOnServer(false);
if (!options && !options.survey)
return;
var self = options.survey;
var hasErrors = false;
if (options.errors) {
for (var name in options.errors) {
var question = self.getQuestionByName(name);
if (question && question["errors"]) {
hasErrors = true;
question["addError"](new __WEBPACK_IMPORTED_MODULE_8__error__["c" /* CustomError */](options.errors[name]));
}
}
}
if (!hasErrors) {
if (self.isLastPage)
self.doComplete();
else
self.doNextPage();
}
};
SurveyModel.prototype.doNextPage = function () {
this.checkOnPageTriggers();
if (this.sendResultOnPageNext) {
this.sendResult(this.surveyPostId, this.clientId, true);
}
var vPages = this.visiblePages;
var index = vPages.indexOf(this.currentPage);
this.currentPage = vPages[index + 1];
};
SurveyModel.prototype.setCompleted = function () {
this.isCompleted = true;
};
Object.defineProperty(SurveyModel.prototype, "processedCompletedHtml", {
/**
* Returns the html for completed 'Thank you' page.
* @see completedHtml
*/
get: function () {
if (this.completedHtml) {
return this.processHtml(this.completedHtml);
}
return "
" + this.getLocString("completingSurvey") + "
";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "processedCompletedBeforeHtml", {
/**
* Returns the html showing that the user has already completed the survey
* @see completedHtml
*/
get: function () {
if (this.completedBeforeHtml) {
return this.processHtml(this.completedBeforeHtml);
}
return "" + this.getLocString("completingSurveyBefore") + "
";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "processedLoadingHtml", {
/**
* Returns the html that shows on loading the json.
*/
get: function () {
if (this.loadingHtml) {
return this.processHtml(this.loadingHtml);
}
return "" + this.getLocString("loadingSurvey") + "
";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "progressText", {
/**
* Returns the text for the current progress.
*/
get: function () {
if (this.currentPage == null)
return "";
var vPages = this.visiblePages;
var index = vPages.indexOf(this.currentPage) + 1;
return this.getLocString("progressText")["format"](index, vPages.length);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.afterRenderSurvey = function (htmlElement) {
this.onAfterRenderSurvey.fire(this, { survey: this, htmlElement: htmlElement });
};
SurveyModel.prototype.updateQuestionCssClasses = function (question, cssClasses) {
this.onUpdateQuestionCssClasses.fire(this, { question: question, cssClasses: cssClasses });
};
SurveyModel.prototype.afterRenderPage = function (htmlElement) {
if (this.onAfterRenderPage.isEmpty)
return;
this.onAfterRenderPage.fire(this, { page: this.currentPage, htmlElement: htmlElement });
};
SurveyModel.prototype.afterRenderQuestion = function (question, htmlElement) {
this.onAfterRenderQuestion.fire(this, { question: question, htmlElement: htmlElement });
};
SurveyModel.prototype.afterRenderPanel = function (panel, htmlElement) {
this.onAfterRenderPanel.fire(this, { panel: panel, htmlElement: htmlElement });
};
SurveyModel.prototype.matrixRowAdded = function (question) {
this.onMatrixRowAdded.fire(this, { question: question });
};
SurveyModel.prototype.matrixRowRemoved = function (question, rowIndex, row) {
this.onMatrixRowRemoved.fire(this, { question: question, rowIndex: rowIndex, row: row });
};
SurveyModel.prototype.matrixCellCreated = function (question, options) {
options.question = question;
this.onMatrixCellCreated.fire(this, options);
};
SurveyModel.prototype.matrixAfterCellRender = function (question, options) {
options.question = question;
this.onMatrixAfterCellRender.fire(this, options);
};
SurveyModel.prototype.matrixCellValueChanged = function (question, options) {
options.question = question;
this.onMatrixCellValueChanged.fire(this, options);
};
SurveyModel.prototype.matrixCellValidate = function (question, options) {
options.question = question;
this.onMatrixCellValidate.fire(this, options);
return options.error ? new __WEBPACK_IMPORTED_MODULE_8__error__["c" /* CustomError */](options.error) : null;
};
/**
* Upload the file into servey
* @param name question name
* @param file uploading file
* @param storeDataAsText set it to true to encode file content into the survey results
* @param uploadingCallback a call back function to get the status on uploading the file
*/
SurveyModel.prototype.uploadFile = function (name, file, storeDataAsText, uploadingCallback) {
var accept = true;
this.onUploadFile.fire(this, { name: name, file: file, accept: accept });
if (!accept)
return false;
if (!storeDataAsText && this.surveyPostId) {
this.uploadFileCore(name, file, uploadingCallback);
}
return true;
};
SurveyModel.prototype.createSurveyService = function () {
return new __WEBPACK_IMPORTED_MODULE_6__dxSurveyService__["a" /* dxSurveyService */]();
};
SurveyModel.prototype.uploadFileCore = function (name, file, uploadingCallback) {
var self = this;
if (uploadingCallback)
uploadingCallback("uploading");
this.createSurveyService().sendFile(this.surveyPostId, file, function (success, response) {
if (uploadingCallback)
uploadingCallback(success ? "success" : "error");
if (success) {
self.setValue(name, response);
}
});
};
SurveyModel.prototype.getPage = function (index) {
return this.pages[index];
};
/**
* Add a page into the survey
* @param page
* @see addNewPage
*/
SurveyModel.prototype.addPage = function (page) {
if (page == null)
return;
this.pages.push(page);
this.updateVisibleIndexes();
};
/**
* Creates a new page and adds it into the survey. Genarates a new name if the name parameter is not set.
* @param name a page name
* @see addPage
*/
SurveyModel.prototype.addNewPage = function (name) {
if (name === void 0) { name = null; }
var page = this.createNewPage(name);
this.addPage(page);
return page;
};
/**
* Remove the page from the survey
* @param page
*/
SurveyModel.prototype.removePage = function (page) {
var index = this.pages.indexOf(page);
if (index < 0)
return;
this.pages.splice(index, 1);
if (this.currentPageValue == page) {
this.currentPage = this.pages.length > 0 ? this.pages[0] : null;
}
this.updateVisibleIndexes();
};
/**
* Returns a question by its name
* @param name a question name
* @param caseInsensitive
*/
SurveyModel.prototype.getQuestionByName = function (name, caseInsensitive) {
if (caseInsensitive === void 0) { caseInsensitive = false; }
var questions = this.getAllQuestions();
if (caseInsensitive)
name = name.toLowerCase();
for (var i = 0; i < questions.length; i++) {
var questionName = questions[i].name;
if (caseInsensitive)
questionName = questionName.toLowerCase();
if (questionName == name)
return questions[i];
}
return null;
};
/**
* Get a list of questions by their names
* @param names the array of names
* @param caseInsensitive
*/
SurveyModel.prototype.getQuestionsByNames = function (names, caseInsensitive) {
if (caseInsensitive === void 0) { caseInsensitive = false; }
var result = [];
if (!names)
return result;
for (var i = 0; i < names.length; i++) {
if (!names[i])
continue;
var question = this.getQuestionByName(names[i], caseInsensitive);
if (question)
result.push(question);
}
return result;
};
/**
* Returns a page on which an element (question or panel) is placed.
* @param element Question or Panel
*/
SurveyModel.prototype.getPageByElement = function (element) {
for (var i = 0; i < this.pages.length; i++) {
var page = this.pages[i];
if (page.containsElement(element))
return page;
}
return null;
};
/**
* Returns a page on which a question is located
* @param question
*/
SurveyModel.prototype.getPageByQuestion = function (question) {
return this.getPageByElement(question);
};
/**
* Returns a page by it's name.
* @param name
*/
SurveyModel.prototype.getPageByName = function (name) {
for (var i = 0; i < this.pages.length; i++) {
if (this.pages[i].name == name)
return this.pages[i];
}
return null;
};
/**
* Rertuns a list of pages by their names
* @param names a list of pages names
*/
SurveyModel.prototype.getPagesByNames = function (names) {
var result = [];
if (!names)
return result;
for (var i = 0; i < names.length; i++) {
if (!names[i])
continue;
var page = this.getPageByName(names[i]);
if (page)
result.push(page);
}
return result;
};
/**
* Returns the list of all questions in the survey
* @param visibleOnly set it true, if you want to get only visible questions
*/
SurveyModel.prototype.getAllQuestions = function (visibleOnly, includingDesignTime) {
if (visibleOnly === void 0) { visibleOnly = false; }
if (includingDesignTime === void 0) { includingDesignTime = false; }
var result = new Array();
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].addQuestionsToList(result, visibleOnly, includingDesignTime);
}
return result;
};
/**
* Returns the list of all panels in the survey
*/
SurveyModel.prototype.getAllPanels = function (visibleOnly, includingDesignTime) {
if (visibleOnly === void 0) { visibleOnly = false; }
if (includingDesignTime === void 0) { includingDesignTime = false; }
var result = new Array();
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].addPanelsIntoList(result, visibleOnly, includingDesignTime);
}
return result;
};
SurveyModel.prototype.createNewPage = function (name) { return new __WEBPACK_IMPORTED_MODULE_3__page__["a" /* PageModel */](name); };
SurveyModel.prototype.notifyQuestionOnValueChanged = function (name, newValue) {
var questions = this.getAllQuestions();
var question = null;
for (var i = 0; i < questions.length; i++) {
if (questions[i].name != name)
continue;
question = questions[i];
this.doSurveyValueChanged(question, newValue);
this.onValueChanged.fire(this, { 'name': name, 'question': question, 'value': newValue });
}
if (!question) {
this.onValueChanged.fire(this, { 'name': name, 'question': null, 'value': newValue });
}
this.notifyElementsOnAnyValueOrVariableChanged(name);
};
SurveyModel.prototype.notifyElementsOnAnyValueOrVariableChanged = function (name) {
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].onAnyValueChanged(name);
}
};
SurveyModel.prototype.notifyAllQuestionsOnValueChanged = function () {
var questions = this.getAllQuestions();
for (var i = 0; i < questions.length; i++) {
this.doSurveyValueChanged(questions[i], this.getValue(questions[i].name));
}
};
SurveyModel.prototype.doSurveyValueChanged = function (question, newValue) {
question.onSurveyValueChanged(newValue);
};
SurveyModel.prototype.checkOnPageTriggers = function () {
var questions = this.getCurrentPageQuestions();
for (var i = 0; i < questions.length; i++) {
var question = questions[i];
var value = this.getValue(question.name);
this.checkTriggers(question.name, value, true);
}
};
SurveyModel.prototype.getCurrentPageQuestions = function () {
var result = [];
var page = this.currentPage;
if (!page)
return result;
for (var i = 0; i < page.questions.length; i++) {
var question = page.questions[i];
if (!question.visible || !question.name)
continue;
result.push(question);
}
return result;
};
SurveyModel.prototype.checkTriggers = function (name, newValue, isOnNextPage) {
for (var i = 0; i < this.triggers.length; i++) {
var trigger = this.triggers[i];
if (trigger.name == name && trigger.isOnNextPage == isOnNextPage) {
trigger.check(newValue);
}
}
};
SurveyModel.prototype.doElementsOnLoad = function () {
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].onSurveyLoad();
}
};
SurveyModel.prototype.runConditions = function () {
var pages = this.pages;
for (var i = 0; i < pages.length; i++) {
pages[i].runCondition(this.valuesHash);
}
};
/**
* Send the survey result into [dxsurvey.com](http://www.dxsurvey.com) service.
* @param postId [dxsurvey.com](http://www.dxsurvey.com) service postId
* @param clientId Typically a customer e-mail or an identificator
* @param isPartialCompleted Set it to true if the survey is not completed yet and it is an intermediate results
* @see surveyPostId
* @see clientId
*/
SurveyModel.prototype.sendResult = function (postId, clientId, isPartialCompleted) {
if (postId === void 0) { postId = null; }
if (clientId === void 0) { clientId = null; }
if (isPartialCompleted === void 0) { isPartialCompleted = false; }
if (!this.isEditMode)
return;
if (isPartialCompleted && this.onPartialSend) {
this.onPartialSend.fire(this, null);
}
if (!postId && this.surveyPostId) {
postId = this.surveyPostId;
}
if (!postId)
return;
if (clientId) {
this.clientId = clientId;
}
if (isPartialCompleted && !this.clientId)
return;
var self = this;
if (this.surveyShowDataSaving) {
this.setCompletedState("saving", "");
}
this.createSurveyService().sendResult(postId, this.data, function (success, response) {
if (self.surveyShowDataSaving) {
if (success) {
self.setCompletedState("success", "");
}
else {
self.setCompletedState("error", "");
}
}
self.onSendResult.fire(self, { success: success, response: response });
}, this.clientId, isPartialCompleted);
};
/**
* It calls the [dxsurvey.com](http://www.dxsurvey.com) service and on callback fires onGetResult event with all answers that your users made for a question.
* @param resultId [dxsurvey.com](http://www.dxsurvey.com) service resultId
* @param name The question name
* @see onGetResult
*/
SurveyModel.prototype.getResult = function (resultId, name) {
var self = this;
this.createSurveyService().getResult(resultId, name, function (success, data, dataList, response) {
self.onGetResult.fire(self, { success: success, data: data, dataList: dataList, response: response });
});
};
/**
* Loads the survey Json from the [dxsurvey.com](http://www.dxsurvey.com) service. If clientId is not null and user has already completed the survey, the survey will go into "completedbefore" state.
* @param surveyId [dxsurvey.com](http://www.dxsurvey.com) service surveyId
* @param clientId indentificator for a user, for example e-mail or unique customer id in your web application.
* @see state
*/
SurveyModel.prototype.loadSurveyFromService = function (surveyId, cliendId) {
if (surveyId === void 0) { surveyId = null; }
if (cliendId === void 0) { cliendId = null; }
if (surveyId) {
this.surveyId = surveyId;
}
if (cliendId) {
this.clientId = cliendId;
}
var self = this;
this.isLoading = true;
this.onLoadingSurveyFromService();
if (cliendId) {
this.createSurveyService().getSurveyJsonAndIsCompleted(this.surveyId, this.clientId, function (success, json, isCompleted, response) {
self.isLoading = false;
if (success) {
self.isCompletedBefore = isCompleted == "completed";
self.loadSurveyFromServiceJson(json);
}
});
}
else {
this.createSurveyService().loadSurvey(this.surveyId, function (success, result, response) {
self.isLoading = false;
if (success) {
self.loadSurveyFromServiceJson(result);
}
});
}
};
SurveyModel.prototype.loadSurveyFromServiceJson = function (json) {
if (!json)
return;
this.setJsonObject(json);
this.notifyAllQuestionsOnValueChanged();
this.onLoadSurveyFromService();
};
SurveyModel.prototype.onLoadingSurveyFromService = function () {
};
SurveyModel.prototype.onLoadSurveyFromService = function () {
};
SurveyModel.prototype.checkPageVisibility = function (question, oldQuestionVisible) {
var page = this.getPageByQuestion(question);
if (!page)
return;
var newValue = page.isVisible;
if (newValue != page.getIsPageVisible(question) || oldQuestionVisible) {
this.pageVisibilityChanged(page, newValue);
}
};
SurveyModel.prototype.updateVisibleIndexes = function () {
this.updatePageVisibleIndexes(this.showPageNumbers);
if (this.showQuestionNumbers == "onPage") {
var visPages = this.visiblePages;
for (var i = 0; i < visPages.length; i++) {
this.updateQuestionVisibleIndexes(visPages[i].questions, true);
}
}
else {
this.updateQuestionVisibleIndexes(this.getAllQuestions(false), this.showQuestionNumbers == "on");
}
};
SurveyModel.prototype.updatePageVisibleIndexes = function (showIndex) {
var index = 0;
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].visibleIndex = this.pages[i].visible ? (index++) : -1;
this.pages[i].num = showIndex && this.pages[i].visible ? this.pages[i].visibleIndex + 1 : -1;
}
};
SurveyModel.prototype.updateQuestionVisibleIndexes = function (questions, showIndex) {
__WEBPACK_IMPORTED_MODULE_2__base__["a" /* SurveyElement */].setVisibleIndex(questions, 0, showIndex);
};
SurveyModel.prototype.setJsonObject = function (jsonObj) {
if (!jsonObj)
return;
this.jsonErrors = null;
var jsonConverter = new __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */]();
jsonConverter.toObject(jsonObj, this);
if (jsonConverter.errors.length > 0) {
this.jsonErrors = jsonConverter.errors;
}
};
SurveyModel.prototype.endLoadingFromJson = function () {
this.runConditions();
this.updateVisibleIndexes();
this.updateProcessedTextValues();
_super.prototype.endLoadingFromJson.call(this);
if (this.hasCookie) {
this.doComplete();
}
this.doElementsOnLoad();
};
SurveyModel.prototype.onBeforeCreating = function () { };
SurveyModel.prototype.onCreating = function () { };
SurveyModel.prototype.updateProcessedTextValues = function () {
this.processedTextValues = {};
var self = this;
this.processedTextValues["pageno"] = function (name) { return self.currentPage != null ? self.visiblePages.indexOf(self.currentPage) + 1 : 0; };
this.processedTextValues["pagecount"] = function (name) { return self.visiblePageCount; };
var questions = this.getAllQuestions();
for (var i = 0; i < questions.length; i++) {
this.addQuestionToProcessedTextValues(questions[i]);
}
};
SurveyModel.prototype.addQuestionToProcessedTextValues = function (question) {
this.processedTextValues[question.name.toLowerCase()] = "question";
};
SurveyModel.prototype.hasProcessedTextValue = function (name) {
var firstName = new __WEBPACK_IMPORTED_MODULE_5__conditionProcessValue__["a" /* ProcessValue */]().getFirstName(name);
return this.processedTextValues[firstName.toLowerCase()];
};
SurveyModel.prototype.getProcessedTextValue = function (name, returnDisplayValue) {
var firstName = new __WEBPACK_IMPORTED_MODULE_5__conditionProcessValue__["a" /* ProcessValue */]().getFirstName(name);
var val = this.processedTextValues[firstName.toLowerCase()];
if (!val)
return null;
if (val == "variable") {
return this.getVariable(name.toLowerCase());
}
if (val == "question") {
var question = this.getQuestionByName(firstName, true);
if (!question)
return null;
name = question.name + name.substr(firstName.length);
var values = {};
values[firstName] = returnDisplayValue ? question.displayValue : this.getValue(firstName);
return new __WEBPACK_IMPORTED_MODULE_5__conditionProcessValue__["a" /* ProcessValue */]().getValue(name, values);
}
if (val == "value") {
return new __WEBPACK_IMPORTED_MODULE_5__conditionProcessValue__["a" /* ProcessValue */]().getValue(name, this.valuesHash);
}
return val(name);
};
SurveyModel.prototype.clearUnusedValues = function () {
var questions = this.getAllQuestions();
for (var i = 0; i < questions.length; i++) {
questions[i].clearUnusedValues();
}
if (this.clearInvisibleValues == "onComplete") {
this.clearInvisibleQuestionValues();
}
};
SurveyModel.prototype.clearInvisibleQuestionValues = function () {
var questions = this.getAllQuestions();
for (var i = 0; i < questions.length; i++) {
if (questions[i].visible)
continue;
this.clearValue(questions[i].name);
}
};
/**
* Returns a variable value. Variable, unlike values, are not stored in the survey results.
* @param name A variable name
* @see SetVariable
*/
SurveyModel.prototype.getVariable = function (name) {
if (!name)
return null;
return this.variablesHash[name];
};
/**
* Sets a variable value. Variable, unlike values, are not stored in the survey results.
* @param name A variable name
* @param newValue
* @see GetVariable
*/
SurveyModel.prototype.setVariable = function (name, newValue) {
if (!name)
return;
this.variablesHash[name] = newValue;
this.processedTextValues[name.toLowerCase()] = "variable";
this.notifyElementsOnAnyValueOrVariableChanged(name);
};
//ISurvey data
SurveyModel.prototype.getUnbindValue = function (value) {
if (value && value instanceof Object) {
//do not return the same object instance!!!
return JSON.parse(JSON.stringify(value));
}
return value;
};
/**
* Returns a question value
* @param name A question name
* @see data
* @see setValue
*/
SurveyModel.prototype.getValue = function (name) {
if (!name || name.length == 0)
return null;
var value = this.valuesHash[name];
return this.getUnbindValue(value);
};
/**
* Sets a question value. It runs all triggers and conditions (visibleIf properties). Goes to the next page if goNextPageAutomatic is true and all questions on the current page are answered correctly.
* @param name A question name
* @param newValue
* @see data
* @see getValue
* @see PageModel.visibleIf
* @see QuestionBase.visibleIf
* @see goNextPageAutomatic
*/
SurveyModel.prototype.setValue = function (name, newValue) {
if (this.isValueEqual(name, newValue))
return;
if (this.isValueEmpty(newValue)) {
delete this.valuesHash[name];
}
else {
newValue = this.getUnbindValue(newValue);
this.setDataValueCore(this.valuesHash, name, newValue);
var processedVar = this.processedTextValues[name.toLowerCase()];
if (!processedVar) {
this.processedTextValues[name.toLowerCase()] = "value";
}
}
this.notifyQuestionOnValueChanged(name, newValue);
this.checkTriggers(name, newValue, false);
this.runConditions();
this.tryGoNextPageAutomatic(name);
};
SurveyModel.prototype.isValueEqual = function (name, newValue) {
if (newValue == "")
newValue = null;
var oldValue = this.getValue(name);
if (newValue === null || oldValue === null)
return newValue === oldValue;
return this.isTwoValueEquals(newValue, oldValue);
};
SurveyModel.prototype.doOnPageAdded = function (page) {
page.setSurveyImpl(this);
if (!page.name)
page.name = this.generateNewName(this.pages, "page");
var options = { page: page };
this.onPageAdded.fire(this, options);
};
SurveyModel.prototype.generateNewName = function (elements, baseName) {
var keys = {};
for (var i = 0; i < elements.length; i++)
keys[elements[i]["name"]] = true;
var index = 1;
while (keys[baseName + index])
index++;
return baseName + index;
};
SurveyModel.prototype.tryGoNextPageAutomatic = function (name) {
if (!this.goNextPageAutomatic || !this.currentPage)
return;
var question = this.getQuestionByName(name);
if (question && (!question.visible || !question.supportGoNextPageAutomatic()))
return;
var questions = this.getCurrentPageQuestions();
for (var i = 0; i < questions.length; i++) {
var value = this.getValue(questions[i].name);
if (questions[i].hasInput && this.isValueEmpty(value))
return;
}
if (!this.currentPage.hasErrors(true, false)) {
if (!this.isLastPage) {
this.nextPage();
}
else {
this.completeLastPage();
}
}
};
/**
* Returns the comment value
* @param name
* @see setComment
*/
SurveyModel.prototype.getComment = function (name) {
var result = this.data[name + this.commentPrefix];
if (result == null)
result = "";
return result;
};
/**
* Set the comment value
* @param name
* @param newValue
* @see getComment
*/
SurveyModel.prototype.setComment = function (name, newValue) {
var commentName = name + this.commentPrefix;
if (newValue === "" || newValue === null) {
delete this.valuesHash[commentName];
}
else {
this.setDataValueCore(this.valuesHash, commentName, newValue);
this.tryGoNextPageAutomatic(name);
}
var question = this.getQuestionByName(name);
if (question) {
this.onValueChanged.fire(this, { 'name': commentName, 'question': question, 'value': newValue });
}
};
/**
* Remove the value from the survey result.
* @param {string} name The name of the value. Typically it is a question name
*/
SurveyModel.prototype.clearValue = function (name) {
this.setValue(name, null);
this.setComment(name, null);
};
SurveyModel.prototype.questionVisibilityChanged = function (question, newValue) {
this.updateVisibleIndexes();
this.onVisibleChanged.fire(this, { 'question': question, 'name': question.name, 'visible': newValue });
this.checkPageVisibility(question, !newValue);
if (question && !question.visible && this.clearInvisibleValues == "onHidden") {
this.clearValue(question.name);
}
};
SurveyModel.prototype.pageVisibilityChanged = function (page, newValue) {
this.updateVisibleIndexes();
this.onPageVisibleChanged.fire(this, { 'page': page, 'visible': newValue });
};
SurveyModel.prototype.panelVisibilityChanged = function (panel, newValue) {
this.updateVisibleIndexes();
this.onPanelVisibleChanged.fire(this, { 'panel': panel, 'visible': newValue });
};
SurveyModel.prototype.questionAdded = function (question, index, parentPanel, rootPanel) {
if (!question.name)
question.name = this.generateNewName(this.getAllQuestions(false, true), "question");
this.updateVisibleIndexes();
this.addQuestionToProcessedTextValues(question);
this.onQuestionAdded.fire(this, { 'question': question, 'name': question.name, 'index': index, 'parentPanel': parentPanel, 'rootPanel': rootPanel });
};
SurveyModel.prototype.questionRemoved = function (question) {
this.updateVisibleIndexes();
this.onQuestionRemoved.fire(this, { 'question': question, 'name': question.name });
};
SurveyModel.prototype.panelAdded = function (panel, index, parentPanel, rootPanel) {
if (!panel.name)
panel.name = this.generateNewName(this.getAllPanels(false, true), "panel");
this.updateVisibleIndexes();
this.onPanelAdded.fire(this, { 'panel': panel, 'name': panel.name, 'index': index, 'parentPanel': parentPanel, 'rootPanel': rootPanel });
};
SurveyModel.prototype.panelRemoved = function (panel) {
this.updateVisibleIndexes();
this.onPanelRemoved.fire(this, { 'panel': panel, 'name': panel.name });
};
SurveyModel.prototype.validateQuestion = function (name) {
if (this.onValidateQuestion.isEmpty)
return null;
var options = { name: name, value: this.getValue(name), error: null };
this.onValidateQuestion.fire(this, options);
return options.error ? new __WEBPACK_IMPORTED_MODULE_8__error__["c" /* CustomError */](options.error) : null;
};
SurveyModel.prototype.processHtml = function (html) {
var options = { html: html };
this.onProcessHtml.fire(this, options);
return this.processText(options.html, true);
};
SurveyModel.prototype.processText = function (text, returnDisplayValue) {
return this.textPreProcessor.process(text, returnDisplayValue);
};
SurveyModel.prototype.processTextEx = function (text) {
var res = { text: this.textPreProcessor.process(text), hasAllValuesOnLastRun: true };
res.hasAllValuesOnLastRun = this.textPreProcessor.hasAllValuesOnLastRun;
return res;
};
Object.defineProperty(SurveyModel.prototype, "showTimerPanel", {
/**
* Set it to 'top' or 'bottom' if you want to show the Panel with information about how much time the end-user spent of the survey/page.
* If the value doesn't equal 'none' then survey calls startTimer() method on survey rendering.
* @see showTimerPanelMode
* @see startTimer
* @see stopTimer
*/
get: function () { return this.getPropertyValue("showTimerPanel", "none"); },
set: function (val) {
this.setPropertyValue("showTimerPanel", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isTimerPanelShowingOnTop", {
get: function () { return this.isTimerStarted && this.showTimerPanel == "top"; },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isTimerPanelShowingOnBottom", {
get: function () { return this.isTimerStarted && this.showTimerPanel == "bottom"; },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showTimerPanelMode", {
/**
* Set this property to 'page' or 'survey' to show the timer information for page or survey only.
* Use onTimerPanelInfoText event to change the default text.
* @see showTimerPanel
* @see onTimerPanelInfoText
*/
get: function () { return this.getPropertyValue("showTimerPanelMode", "all"); },
set: function (val) { this.setPropertyValue("showTimerPanelMode", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "timerInfoText", {
get: function () {
var options = { text: this.getTimerInfoText() };
this.onTimerPanelInfoText.fire(this, options);
return options.text;
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getTimerInfoText = function () {
var page = this.currentPage;
if (!page)
return "";
var pageSpent = this.getDisplayTime(page.timeSpent);
var surveySpent = this.getDisplayTime(this.timeSpent);
var pageLimitSec = this.getPageMaxTimeToFinish(page);
var pageLimit = this.getDisplayTime(pageLimitSec);
var surveyLimit = this.getDisplayTime(this.maxTimeToFinish);
if (this.showTimerPanelMode == "page")
return this.getTimerInfoPageText(page, pageSpent, pageLimit);
if (this.showTimerPanelMode == "survey")
return this.getTimerInfoSurveyText(surveySpent, surveyLimit);
if (this.showTimerPanelMode == "all") {
if (pageLimitSec <= 0 && this.maxTimeToFinish <= 0) {
return this.getLocString("timerSpentAll")["format"](pageSpent, surveySpent);
}
if (pageLimitSec > 0 && this.maxTimeToFinish > 0) {
return this.getLocString("timerLimitAll")["format"](pageSpent, pageLimit, surveySpent, surveyLimit);
}
var pageText = this.getTimerInfoPageText(page, pageSpent, pageLimit);
var surveyText = this.getTimerInfoSurveyText(surveySpent, surveyLimit);
return pageText + ' ' + surveyText;
}
return "";
};
SurveyModel.prototype.getTimerInfoPageText = function (page, pageSpent, pageLimit) {
return this.getPageMaxTimeToFinish(page) > 0 ? this.getLocString("timerLimitPage")["format"](pageSpent, pageLimit) : this.getLocString("timerSpentPage")["format"](pageSpent, pageLimit);
};
SurveyModel.prototype.getTimerInfoSurveyText = function (surveySpent, surveyLimit) {
return this.maxTimeToFinish > 0 ? this.getLocString("timerLimitSurvey")["format"](surveySpent, surveyLimit) : this.getLocString("timerSpentSurvey")["format"](surveySpent, surveyLimit);
};
SurveyModel.prototype.getDisplayTime = function (val) {
var min = Math.floor(val / 60);
var sec = val % 60;
var res = "";
if (min > 0) {
res += min + ' ' + this.getLocString("timerMin");
}
if (res && sec == 0)
return res;
if (res)
res += ' ';
return res + sec + ' ' + this.getLocString("timerSec");
};
/**
* Call this method to start timer that will calculate how much time end-user spends on the survey or on pages
* @see stopTimer
* @see timeSpent
*/
SurveyModel.prototype.startTimer = function () {
if (this.isTimerStarted || this.isDesignMode)
return;
var self = this;
this.timerFunc = function () { self.doTimer(); };
this.isTimerStarted = true;
__WEBPACK_IMPORTED_MODULE_10__surveytimer__["a" /* SurveyTimer */].instance.start(this.timerFunc);
};
/**
* Stop the timer.
* @see startTimer
* @see timeSpent
*/
SurveyModel.prototype.stopTimer = function () {
if (!this.isTimerStarted)
return;
this.isTimerStarted = false;
__WEBPACK_IMPORTED_MODULE_10__surveytimer__["a" /* SurveyTimer */].instance.stop(this.timerFunc);
};
Object.defineProperty(SurveyModel.prototype, "timeSpent", {
/**
* Returns the time in seconds end-user spends on the survey
* @see startTimer
* @see PageModel.timeSpent
*/
get: function () { return this.getPropertyValue("timeSpent", 0); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "maxTimeToFinish", {
/**
* The maximum time in seconds that end-user has to complete the survey. If the value is 0 or less, the end-user has unlimited number of time to finish the survey.
* @see startTimer
* @see maxTimeToFinishPage
*/
get: function () { return this.getPropertyValue("maxTimeToFinish", 0); },
set: function (val) { this.setPropertyValue("maxTimeToFinish", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "maxTimeToFinishPage", {
/**
* The maximum time in seconds that end-user has to complete a page in the survey. If the value is 0 or less, the end-user has unlimited time. You may override this value for every page.
* @see startTimer
* @see maxTimeToFinish
* @see PageModel.maxTimeToFinish
*/
get: function () { return this.getPropertyValue("maxTimeToFinishPage", 0); },
set: function (val) { this.setPropertyValue("maxTimeToFinishPage", val); },
enumerable: true,
configurable: true
});
SurveyModel.prototype.getPageMaxTimeToFinish = function (page) {
if (!page || page.maxTimeToFinish < 0)
return 0;
return page.maxTimeToFinish > 0 ? page.maxTimeToFinish : this.maxTimeToFinishPage;
};
SurveyModel.prototype.doTimer = function () {
var page = this.currentPage;
if (page) {
page.timeSpent = page.timeSpent + 1;
}
this.setTimeSpent(this.timeSpent + 1);
this.onTimer.fire(this, {});
if (this.maxTimeToFinish > 0 && this.maxTimeToFinish == this.timeSpent) {
this.completeLastPage();
}
if (page) {
var pageLimit = this.getPageMaxTimeToFinish(page);
if (pageLimit > 0 && pageLimit == page.timeSpent) {
if (this.isLastPage) {
this.completeLastPage();
}
else {
this.nextPage();
}
}
}
};
SurveyModel.prototype.setTimeSpent = function (val) { this.setPropertyValue("timeSpent", val); };
//ISurveyImplementor
SurveyModel.prototype.geSurveyData = function () { return this; };
SurveyModel.prototype.getSurvey = function () { return this; };
SurveyModel.prototype.getTextProcessor = function () { return this; };
//ISurveyTriggerOwner
SurveyModel.prototype.getObjects = function (pages, questions) {
var result = [];
Array.prototype.push.apply(result, this.getPagesByNames(pages));
Array.prototype.push.apply(result, this.getQuestionsByNames(questions));
return result;
};
SurveyModel.prototype.setTriggerValue = function (name, value, isVariable) {
if (!name)
return;
if (isVariable) {
this.setVariable(name, value);
}
else {
this.setValue(name, value);
}
};
return SurveyModel;
}(__WEBPACK_IMPORTED_MODULE_2__base__["c" /* Base */]));
SurveyModel.stylesManager = new __WEBPACK_IMPORTED_MODULE_9__stylesmanager__["a" /* StylesManager */]();
SurveyModel.platform = "unknown";
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */].metaData.addClass("survey", [{ name: "locale", choices: function () { return __WEBPACK_IMPORTED_MODULE_7__surveyStrings__["a" /* surveyLocalization */].getLocales(); } },
{ name: "title:text", serializationProperty: "locTitle" }, { name: "focusFirstQuestionAutomatic:boolean", default: true },
{ name: "completedHtml:html", serializationProperty: "locCompletedHtml" }, { name: "completedBeforeHtml:html", serializationProperty: "locCompletedBeforeHtml" },
{ name: "loadingHtml:html", serializationProperty: "locLoadingHtml" }, { name: "pages", className: "page", visible: false },
{ name: "questions", alternativeName: "elements", baseClassName: "question", visible: false, onGetValue: function (obj) { return null; }, onSetValue: function (obj, value, jsonConverter) { var page = obj.addNewPage(""); jsonConverter.toObject({ questions: value }, page); } },
{ name: "triggers:triggers", baseClassName: "surveytrigger", classNamePart: "trigger" },
{ name: "surveyId", visible: false }, { name: "surveyPostId", visible: false }, { name: "surveyShowDataSaving", visible: false }, "cookieName", "sendResultOnPageNext:boolean",
{ name: "showNavigationButtons:boolean", default: true }, { name: "showPrevButton:boolean", default: true }, { name: "showTitle:boolean", default: true },
{ name: "showPageTitles:boolean", default: true }, { name: "showCompletedPage:boolean", default: true },
"showPageNumbers:boolean", { name: "showQuestionNumbers", default: "on", choices: ["on", "onPage", "off"] },
{ name: "questionTitleLocation", default: "top", choices: ["top", "bottom", "left"] },
{ name: "questionErrorLocation", default: "top", choices: ["top", "bottom"] },
{ name: "showProgressBar", default: "off", choices: ["off", "top", "bottom"] },
{ name: "mode", default: "edit", choices: ["edit", "display"] },
{ name: "storeOthersAsComment:boolean", default: true }, "goNextPageAutomatic:boolean",
{ name: "clearInvisibleValues", default: "none", choices: ["none", "onComplete", "onHidden"] },
{ name: "pagePrevText", serializationProperty: "locPagePrevText" },
{ name: "pageNextText", serializationProperty: "locPageNextText" },
{ name: "completeText", serializationProperty: "locCompleteText" },
{ name: "requiredText", default: "*" }, "questionStartIndex", { name: "questionTitleTemplate", serializationProperty: "locQuestionTitleTemplate" },
{ name: "maxTimeToFinish:number", default: 0 }, { name: "maxTimeToFinishPage:number", default: 0 },
{ name: "showTimerPanel", default: "none", choices: ["none", "top", "bottom"] }, { name: "showTimerPanelMode", default: "all", choices: ["all", "page", "survey"] }]);
/***/ }),
/* 19 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__survey__ = __webpack_require__(18);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__surveyWindow__ = __webpack_require__(41);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ReactSurveyModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return ReactWindowModel; });
var ReactSurveyModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](ReactSurveyModel, _super);
function ReactSurveyModel(jsonObj) {
if (jsonObj === void 0) { jsonObj = null; }
return _super.call(this, jsonObj) || this;
}
ReactSurveyModel.prototype.render = function () {
if (this.renderCallback) {
this.renderCallback();
}
};
ReactSurveyModel.prototype.mergeCss = function (src, dest) {
this.mergeValues(src, dest);
};
ReactSurveyModel.prototype.doAfterRenderSurvey = function (el) {
this.afterRenderSurvey(el);
};
ReactSurveyModel.prototype.onLoadSurveyFromService = function () {
this.render();
};
ReactSurveyModel.prototype.onLoadingSurveyFromService = function () {
this.render();
};
ReactSurveyModel.prototype.setCompletedState = function (value, text) {
_super.prototype.setCompletedState.call(this, value, text);
this.render();
};
return ReactSurveyModel;
}(__WEBPACK_IMPORTED_MODULE_1__survey__["a" /* SurveyModel */]));
var ReactWindowModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](ReactWindowModel, _super);
function ReactWindowModel(jsonObj, model) {
if (jsonObj === void 0) { jsonObj = null; }
if (model === void 0) { model = null; }
return _super.call(this, jsonObj, model) || this;
}
//public get reactSurvey(): ReactSurveyModel { return this.survey; }
ReactWindowModel.prototype.createSurvey = function (jsonObj) {
return new ReactSurveyModel(jsonObj);
};
return ReactWindowModel;
}(__WEBPACK_IMPORTED_MODULE_2__surveyWindow__["a" /* SurveyWindowModel */]));
__WEBPACK_IMPORTED_MODULE_1__survey__["a" /* SurveyModel */].platform = "react";
/***/ }),
/* 20 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactsurveymodel__ = __webpack_require__(19);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactpage__ = __webpack_require__(27);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactSurveyNavigation__ = __webpack_require__(37);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__reactquestionfactory__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__defaultCss_cssstandard__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__reactSurveyProgress__ = __webpack_require__(38);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__reacttimerpanel__ = __webpack_require__(40);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__reactquestionelement__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Survey; });
var Survey = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](Survey, _super);
function Survey(props) {
var _this = _super.call(this, props) || this;
_this.isCurrentPageChanged = false;
_this.handleTryAgainClick = _this.handleTryAgainClick.bind(_this);
_this.state = _this.getState();
_this.updateSurvey(props);
return _this;
}
Object.defineProperty(Survey, "cssType", {
get: function () { return __WEBPACK_IMPORTED_MODULE_6__defaultCss_cssstandard__["b" /* surveyCss */].currentType; },
set: function (value) { __WEBPACK_IMPORTED_MODULE_6__defaultCss_cssstandard__["b" /* surveyCss */].currentType = value; },
enumerable: true,
configurable: true
});
Survey.prototype.componentWillReceiveProps = function (nextProps) {
this.setState(this.getState());
this.updateSurvey(nextProps);
};
Survey.prototype.componentDidUpdate = function () {
if (this.isCurrentPageChanged) {
this.isCurrentPageChanged = false;
this.survey.scrollToTopOnPageChange();
}
};
Survey.prototype.componentDidMount = function () {
var el = this.refs["root"];
if (el && this.survey)
this.survey.doAfterRenderSurvey(el);
if (this.survey && this.survey.showTimerPanel != "all") {
this.survey.startTimer();
}
};
Survey.prototype.componentWillUnmount = function () {
if (this.survey) {
this.survey.stopTimer();
}
};
Survey.prototype.render = function () {
if (this.survey.state == "completed")
return this.renderCompleted();
if (this.survey.state == "completedbefore")
return this.renderCompletedBefore();
if (this.survey.state == "loading")
return this.renderLoading();
return this.renderSurvey();
};
Object.defineProperty(Survey.prototype, "css", {
get: function () { return __WEBPACK_IMPORTED_MODULE_6__defaultCss_cssstandard__["b" /* surveyCss */].getCss(); },
set: function (value) {
this.survey.mergeCss(value, this.css);
},
enumerable: true,
configurable: true
});
Survey.prototype.handleTryAgainClick = function (event) {
this.survey.doComplete();
};
Survey.prototype.renderCompleted = function () {
if (!this.survey.showCompletedPage)
return null;
var completedState = null;
if (this.survey.completedState) {
var tryAgainButton = null;
if (this.survey.completedState == "error") {
var btnText = this.survey.getLocString('saveAgainButton');
tryAgainButton = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { type: "button", value: btnText, className: this.css.saveData.saveAgainButton, onClick: this.handleTryAgainClick }));
}
var css = this.css.saveData[this.survey.completedState];
completedState = __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.saveData.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: css },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", null, this.survey.completedStateText),
tryAgainButton));
}
var htmlValue = { __html: this.survey.processedCompletedHtml };
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { dangerouslySetInnerHTML: htmlValue }),
completedState));
};
Survey.prototype.renderCompletedBefore = function () {
var htmlValue = { __html: this.survey.processedCompletedBeforeHtml };
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { dangerouslySetInnerHTML: htmlValue }));
};
Survey.prototype.renderLoading = function () {
var htmlValue = { __html: this.survey.processedLoadingHtml };
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { dangerouslySetInnerHTML: htmlValue }));
};
Survey.prototype.renderSurvey = function () {
var title = this.survey.title && this.survey.showTitle ? this.renderTitle() : null;
var currentPage = this.survey.currentPage ? this.renderPage() : null;
var pageId = this.survey.currentPage ? this.survey.currentPage.id : "";
var topProgress = this.survey.showProgressBar == "top" ? this.renderProgress(true) : null;
var bottomProgress = this.survey.showProgressBar == "bottom" ? this.renderProgress(false) : null;
var buttons = (currentPage && this.survey.isNavigationButtonsShowing) ? this.renderNavigation() : null;
if (!currentPage) {
currentPage = this.renderEmptySurvey();
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: "root", className: this.css.root },
title,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { id: pageId, className: this.css.body },
topProgress,
this.renderTimerPanel("top"),
currentPage,
this.renderTimerPanel("bottom"),
bottomProgress),
buttons));
};
Survey.prototype.renderTitle = function () {
var title = __WEBPACK_IMPORTED_MODULE_9__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.survey.locTitle);
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.header },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("h3", null, title));
};
Survey.prototype.renderTimerPanel = function (location) {
if (this.survey.showTimerPanel != location)
return null;
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_8__reacttimerpanel__["a" /* SurveyTimerPanel */], { survey: this.survey, css: this.css });
};
Survey.prototype.renderPage = function () {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactpage__["a" /* SurveyPage */], { survey: this.survey, page: this.survey.currentPage, css: this.css, creator: this });
};
Survey.prototype.renderProgress = function (isTop) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_7__reactSurveyProgress__["a" /* SurveyProgress */], { survey: this.survey, css: this.css, isTop: isTop });
};
Survey.prototype.renderNavigation = function () {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_4__reactSurveyNavigation__["a" /* SurveyNavigation */], { survey: this.survey, css: this.css });
};
Survey.prototype.renderEmptySurvey = function () {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", null, this.survey.emptySurveyText));
};
Survey.prototype.updateSurvey = function (newProps) {
if (newProps) {
if (newProps.model) {
this.survey = newProps.model;
}
else {
if (newProps.json) {
this.survey = new __WEBPACK_IMPORTED_MODULE_2__reactsurveymodel__["a" /* ReactSurveyModel */](newProps.json);
}
}
}
else {
this.survey = new __WEBPACK_IMPORTED_MODULE_2__reactsurveymodel__["a" /* ReactSurveyModel */]();
}
if (newProps) {
var _loop_1 = function () {
if (key == "model" || key == "children")
return "continue";
if (key == "css") {
this_1.survey.mergeCss(newProps.css, this_1.css);
return "continue";
}
if (key.indexOf("on") == 0 && this_1.survey[key] && this_1.survey[key].add) {
var funcBody_1 = newProps[key];
var func = function (sender, options) { funcBody_1(sender, options); };
this_1.survey[key].add(func);
}
else {
this_1.survey[key] = newProps[key];
}
};
var this_1 = this;
for (var key in newProps) {
_loop_1();
}
}
//set the first page
var dummy = this.survey.currentPage;
this.setSurveyEvents(newProps);
};
Survey.prototype.getState = function () { return { pageIndexChange: 0, isCompleted: false, modelChanged: 0 }; };
Survey.prototype.setSurveyEvents = function (newProps) {
var self = this;
this.survey.renderCallback = function () {
self.state.modelChanged = self.state.modelChanged + 1;
self.setState(self.state);
};
this.survey.onComplete.add(function (sender) { self.state.isCompleted = true; self.setState(self.state); });
this.survey.onPartialSend.add(function (sender) { self.setState(self.state); });
this.survey.onCurrentPageChanged.add(function (sender, options) {
self.isCurrentPageChanged = true;
self.state.pageIndexChange = self.state.pageIndexChange + 1;
self.setState(self.state);
if (newProps && newProps.onCurrentPageChanged)
newProps.onCurrentPageChanged(sender, options);
});
this.survey.onVisibleChanged.add(function (sender, options) {
if (options.question && options.question.react) {
var state = options.question.react.state;
state.visible = options.question.visible;
options.question.react.setState(state);
}
});
this.survey.onValueChanged.add(function (sender, options) {
if (options.question && options.question.react) {
var state = options.question.react.state;
state.value = options.value;
options.question.react.setState(state);
}
if (newProps && newProps.data)
newProps.data[options.name] = options.value;
});
};
//ISurveyCreator
Survey.prototype.createQuestionElement = function (question) {
return __WEBPACK_IMPORTED_MODULE_5__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.createQuestion(question.getTemplate(), {
question: question, isDisplayMode: question.isReadOnly, creator: this
});
};
Survey.prototype.renderError = function (key, errorText, cssClasses) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { key: key, className: cssClasses.error.item }, errorText);
};
Survey.prototype.questionTitleLocation = function () { return this.survey.questionTitleLocation; };
Survey.prototype.questionErrorLocation = function () { return this.survey.questionErrorLocation; };
return Survey;
}(__WEBPACK_IMPORTED_MODULE_1_react__["Component"]));
/***/ }),
/* 21 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__itemvalue__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ChoicesRestfull; });
/**
* A definition for filling choices for checkbox, dropdown and radiogroup questions from resfull services.
* The run method call a restfull service and results can be get on getREsultCallback.
*/
var ChoicesRestfull = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](ChoicesRestfull, _super);
function ChoicesRestfull() {
var _this = _super.call(this) || this;
_this.lastObjHash = "";
_this.processedUrl = "";
_this.processedPath = "";
_this.error = null;
return _this;
}
ChoicesRestfull.getCachedItemsResult = function (obj) {
var hash = obj.objHash;
var res = ChoicesRestfull.itemsResult[hash];
if (!res)
return false;
if (obj.getResultCallback) {
obj.getResultCallback(res);
}
return true;
};
ChoicesRestfull.prototype.run = function (textProcessor) {
if (textProcessor === void 0) { textProcessor = null; }
if (!this.url || !this.getResultCallback)
return;
this.processedText(textProcessor);
if (!this.processedUrl) {
this.getResultCallback([]);
return;
}
if (this.lastObjHash == this.objHash)
return;
this.lastObjHash = this.objHash;
if (this.useChangedItemsResults())
return;
this.error = null;
this.sendRequest();
};
ChoicesRestfull.prototype.useChangedItemsResults = function () {
return ChoicesRestfull.getCachedItemsResult(this);
};
ChoicesRestfull.prototype.processedText = function (textProcessor) {
if (textProcessor) {
var pUrl = textProcessor.processTextEx(this.url);
var pPath = textProcessor.processTextEx(this.path);
if (!pUrl.hasAllValuesOnLastRun || !pPath.hasAllValuesOnLastRun) {
this.processedUrl = "";
this.processedPath = "";
}
else {
this.processedUrl = pUrl.text;
this.processedPath = pPath.text;
}
}
else {
this.processedUrl = this.url;
this.processedPath = this.path;
}
};
ChoicesRestfull.prototype.sendRequest = function () {
var xhr = new XMLHttpRequest();
xhr.open('GET', this.processedUrl);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
var self = this;
xhr.onload = function () {
if (xhr.status == 200) {
self.onLoad(JSON.parse(xhr.response));
}
else {
self.onError(xhr.statusText, xhr.responseText);
}
};
xhr.send();
};
ChoicesRestfull.prototype.getType = function () { return "choicesByUrl"; };
Object.defineProperty(ChoicesRestfull.prototype, "isEmpty", {
get: function () {
return !this.url && !this.path && !this.valueName && !this.titleName;
},
enumerable: true,
configurable: true
});
ChoicesRestfull.prototype.getCustomPropertiesNames = function () {
var properties = this.getCustomProperties();
var res = new Array();
for (var i = 0; i < properties.length; i++) {
res.push(this.getCustomPropertyName(properties[i].name));
}
return res;
};
ChoicesRestfull.prototype.getCustomPropertyName = function (propertyName) { return propertyName + "Name"; };
ChoicesRestfull.prototype.getCustomProperties = function () {
var properties = __WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* JsonObject */].metaData.getProperties(this.itemValueType);
var res = [];
for (var i = 0; i < properties.length; i++) {
if (properties[i].name == "value" || properties[i].name == "text")
continue;
res.push(properties[i]);
}
return res;
};
ChoicesRestfull.prototype.setData = function (json) {
this.clear();
if (json.url)
this.url = json.url;
if (json.path)
this.path = json.path;
if (json.valueName)
this.valueName = json.valueName;
if (json.titleName)
this.titleName = json.titleName;
var properties = this.getCustomPropertiesNames();
for (var i = 0; i < properties.length; i++) {
if (json[properties[i]])
this[properties[i]] = json[properties[i]];
}
};
ChoicesRestfull.prototype.getData = function () {
if (this.isEmpty)
return null;
var res = {};
if (this.url)
res["url"] = this.url;
if (this.path)
res["path"] = this.path;
if (this.valueName)
res["valueName"] = this.valueName;
if (this.titleName)
res["titleName"] = this.titleName;
var properties = this.getCustomPropertiesNames();
for (var i = 0; i < properties.length; i++) {
if (this[properties[i]])
res[properties[i]] = this[properties[i]];
}
return res;
};
Object.defineProperty(ChoicesRestfull.prototype, "url", {
get: function () { return this.getPropertyValue("url", ""); },
set: function (val) { this.setPropertyValue("url", val); },
enumerable: true,
configurable: true
});
;
;
Object.defineProperty(ChoicesRestfull.prototype, "path", {
get: function () { return this.getPropertyValue("path", ""); },
set: function (val) { this.setPropertyValue("path", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(ChoicesRestfull.prototype, "valueName", {
get: function () { return this.getPropertyValue("valueName", ""); },
set: function (val) { this.setPropertyValue("valueName", val); },
enumerable: true,
configurable: true
});
;
;
Object.defineProperty(ChoicesRestfull.prototype, "titleName", {
get: function () { return this.getPropertyValue("titleName", ""); },
set: function (val) { this.setPropertyValue("titleName", val); },
enumerable: true,
configurable: true
});
;
;
Object.defineProperty(ChoicesRestfull.prototype, "itemValueType", {
get: function () {
if (!this.owner)
return "itemvalue";
var prop = __WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* JsonObject */].metaData.findProperty(this.owner.getType(), "choices");
if (!prop)
return "itemvalue";
if (prop.type == "itemvalues")
return "itemvalue";
return prop.type;
},
enumerable: true,
configurable: true
});
ChoicesRestfull.prototype.clear = function () {
this.url = "";
this.path = "";
this.valueName = "";
this.titleName = "";
var properties = this.getCustomPropertiesNames();
for (var i = 0; i < properties.length; i++) {
if (this[properties[i]])
this[properties[i]] = "";
}
};
ChoicesRestfull.prototype.onLoad = function (result) {
var items = [];
result = this.getResultAfterPath(result);
if (result && result["length"]) {
for (var i = 0; i < result.length; i++) {
var itemValue = result[i];
if (!itemValue)
continue;
var value = this.getValue(itemValue);
var title = this.getTitle(itemValue);
var item = new __WEBPACK_IMPORTED_MODULE_2__itemvalue__["a" /* ItemValue */](value, title);
this.setCustomProperties(item, itemValue);
items.push(item);
}
}
else {
this.error = new __WEBPACK_IMPORTED_MODULE_5__error__["c" /* CustomError */](__WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("urlGetChoicesError"));
}
ChoicesRestfull.itemsResult[this.objHash] = items;
this.getResultCallback(items);
};
ChoicesRestfull.prototype.setCustomProperties = function (item, itemValue) {
var properties = this.getCustomProperties();
for (var i = 0; i < properties.length; i++) {
var prop = properties[i];
var val = this.getValueCore(itemValue, this.getPropertyBinding(prop.name));
if (!this.isValueEmpty(val)) {
item[prop.name] = val;
}
}
};
ChoicesRestfull.prototype.getPropertyBinding = function (propertyName) {
if (this[this.getCustomPropertyName(propertyName)])
return this[this.getCustomPropertyName(propertyName)];
if (this[propertyName])
return this[propertyName];
return propertyName;
};
ChoicesRestfull.prototype.onError = function (status, response) {
this.error = new __WEBPACK_IMPORTED_MODULE_5__error__["c" /* CustomError */](__WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("urlRequestError")["format"](status, response));
this.getResultCallback([]);
};
ChoicesRestfull.prototype.getResultAfterPath = function (result) {
if (!result)
return result;
if (!this.processedPath)
return result;
var pathes = this.getPathes();
for (var i = 0; i < pathes.length; i++) {
result = result[pathes[i]];
if (!result)
return null;
}
return result;
};
ChoicesRestfull.prototype.getPathes = function () {
var pathes = [];
if (this.processedPath.indexOf(';') > -1) {
pathes = this.path.split(';');
}
else {
pathes = this.processedPath.split(',');
}
if (pathes.length == 0)
pathes.push(this.processedPath);
return pathes;
};
ChoicesRestfull.prototype.getValue = function (item) {
if (!item)
return null;
if (this.valueName)
return this.getValueCore(item, this.valueName);
if (!(item instanceof Object))
return item;
var len = Object.keys(item).length;
if (len < 1)
return null;
return item[Object.keys(item)[0]];
};
ChoicesRestfull.prototype.getTitle = function (item) {
var title = this.titleName ? this.titleName : "title";
return this.getValueCore(item, title);
};
ChoicesRestfull.prototype.getValueCore = function (item, property) {
if (!item)
return null;
if (property.indexOf('.') < 0)
return item[property];
var properties = property.split('.');
for (var i = 0; i < properties.length; i++) {
item = item[properties[i]];
if (!item)
return null;
}
return item;
};
Object.defineProperty(ChoicesRestfull.prototype, "objHash", {
get: function () { return this.processedUrl + ";" + this.processedPath + ";" + this.valueName + ";" + this.titleName; },
enumerable: true,
configurable: true
});
return ChoicesRestfull;
}(__WEBPACK_IMPORTED_MODULE_1__base__["c" /* Base */]));
ChoicesRestfull.itemsResult = {};
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* JsonObject */].metaData.addClass("choicesByUrl", ["url", "path", "valueName", "titleName"], function () { return new ChoicesRestfull(); });
/***/ }),
/* 22 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return LocalizableString; });
/**
* The class represents the string that supports multi-languages and markdown.
* It uses in all objects where support for multi-languages and markdown is required.
*/
var LocalizableString = (function () {
function LocalizableString(owner, useMarkdown) {
if (useMarkdown === void 0) { useMarkdown = false; }
this.owner = owner;
this.useMarkdown = useMarkdown;
this.values = {};
this.htmlValues = {};
this.onGetTextCallback = null;
this.onCreating();
}
Object.defineProperty(LocalizableString.prototype, "locale", {
get: function () { return this.owner ? this.owner.getLocale() : ""; },
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "text", {
get: function () {
var res = this.pureText;
if (this.onGetTextCallback)
res = this.onGetTextCallback(res);
return res;
},
set: function (value) {
this.setLocaleText(this.locale, value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "pureText", {
get: function () {
var loc = this.locale;
if (!loc)
loc = LocalizableString.defaultLocale;
var res = this.values[loc];
if (!res && loc !== LocalizableString.defaultLocale) {
res = this.values[LocalizableString.defaultLocale];
}
if (!res)
res = "";
return res;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "hasHtml", {
get: function () {
return this.hasHtmlValue();
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "html", {
get: function () {
if (!this.hasHtml)
return "";
return this.getHtmlValue();
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "textOrHtml", {
get: function () {
return this.hasHtml ? this.getHtmlValue() : this.text;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "renderedHtml", {
get: function () {
var res = this.textOrHtml;
return this.onRenderedHtmlCallback ? this.onRenderedHtmlCallback(res) : res;
},
enumerable: true,
configurable: true
});
LocalizableString.prototype.getLocaleText = function (loc) {
if (!loc)
loc = LocalizableString.defaultLocale;
var res = this.values[loc];
return res ? res : "";
};
LocalizableString.prototype.setLocaleText = function (loc, value) {
if (value == this.getLocaleText(loc))
return;
if (!loc)
loc = LocalizableString.defaultLocale;
delete this.htmlValues[loc];
if (!value) {
if (this.values[loc])
delete this.values[loc];
}
else {
if (typeof value === 'string') {
if (loc != LocalizableString.defaultLocale && value == this.getLocaleText(LocalizableString.defaultLocale)) {
this.setLocaleText(loc, null);
}
else {
this.values[loc] = value;
if (loc == LocalizableString.defaultLocale) {
this.deleteValuesEqualsToDefault(value);
}
}
}
}
this.onChanged();
};
LocalizableString.prototype.getJson = function () {
var keys = Object.keys(this.values);
if (keys.length == 0)
return null;
if (keys.length == 1 && keys[0] == LocalizableString.defaultLocale)
return this.values[keys[0]];
return this.values;
};
LocalizableString.prototype.setJson = function (value) {
this.values = {};
this.htmlValues = {};
if (!value)
return;
if (typeof value === 'string') {
this.setLocaleText(null, value);
}
else {
for (var key in value) {
this.setLocaleText(key, value[key]);
}
}
this.onChanged();
};
LocalizableString.prototype.onChanged = function () { };
LocalizableString.prototype.onCreating = function () { };
LocalizableString.prototype.hasHtmlValue = function () {
if (!this.owner || !this.useMarkdown)
return false;
var text = this.text;
if (!text)
return false;
var loc = this.locale;
if (!loc)
loc = LocalizableString.defaultLocale;
if (!(loc in this.htmlValues)) {
this.htmlValues[loc] = this.owner.getMarkdownHtml(text);
}
return this.htmlValues[loc] ? true : false;
};
LocalizableString.prototype.getHtmlValue = function () {
var loc = this.locale;
if (!loc)
loc = LocalizableString.defaultLocale;
return this.htmlValues[loc];
};
LocalizableString.prototype.deleteValuesEqualsToDefault = function (defaultValue) {
var keys = Object.keys(this.values);
for (var i = 0; i < keys.length; i++) {
if (keys[i] == LocalizableString.defaultLocale)
continue;
if (this.values[keys[i]] == defaultValue)
delete this.values[keys[i]];
}
};
return LocalizableString;
}());
LocalizableString.defaultLocale = "default";
/***/ }),
/* 23 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__conditions__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__defaultCss_cssstandard__ = __webpack_require__(11);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return QuestionRowModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return PanelModelBase; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return PanelModel; });
var QuestionRowModel = (function () {
function QuestionRowModel(panel) {
this.panel = panel;
this.elements = [];
this.visibleValue = panel.survey && panel.survey.isDesignMode;
}
Object.defineProperty(QuestionRowModel.prototype, "questions", {
//TODO remove after updating react and vue
get: function () { return this.elements; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRowModel.prototype, "visible", {
get: function () { return this.visibleValue; },
set: function (val) {
if (val == this.visible)
return;
this.visibleValue = val;
this.onVisibleChanged();
},
enumerable: true,
configurable: true
});
QuestionRowModel.prototype.updateVisible = function () {
this.visible = this.calcVisible();
this.setWidth();
};
QuestionRowModel.prototype.addElement = function (q) {
this.elements.push(q);
this.updateVisible();
};
QuestionRowModel.prototype.onVisibleChanged = function () {
if (this.visibilityChangedCallback)
this.visibilityChangedCallback();
};
QuestionRowModel.prototype.setWidth = function () {
var visCount = this.getVisibleCount();
if (visCount == 0)
return;
var counter = 0;
for (var i = 0; i < this.elements.length; i++) {
if (this.elements[i].isVisible) {
var q = this.elements[i];
q.renderWidth = q.width ? q.width : Math.floor(100 / visCount) + '%';
q.rightIndent = counter < visCount - 1 ? 1 : 0;
counter++;
}
else {
this.elements[i].renderWidth = "";
}
}
};
QuestionRowModel.prototype.getVisibleCount = function () {
var res = 0;
for (var i = 0; i < this.elements.length; i++) {
if (this.elements[i].isVisible)
res++;
}
return res;
};
QuestionRowModel.prototype.calcVisible = function () { return this.getVisibleCount() > 0; };
return QuestionRowModel;
}());
/**
* A base class for a Panel and Page objects.
*/
var PanelModelBase = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](PanelModelBase, _super);
function PanelModelBase(name) {
if (name === void 0) { name = ""; }
var _this = _super.call(this, name) || this;
_this.name = name;
_this.rowValues = null;
_this.conditionRunner = null;
_this.isQuestionsReady = false;
_this.questionsValue = new Array();
_this.elementsValue = _this.createNewArray("elements", function (item) { self.onAddElement(item, self.elementsValue.length); }, function (item) { self.onRemoveElement(item); });
_this.registerFunctionOnPropertyValueChanged("elements", function () { self.markQuestionListDirty(); self.onRowsChanged(); });
_this.id = PanelModelBase.getPanelId();
var self = _this;
var locTitleValue = _this.createLocalizableString("title", _this, true);
locTitleValue.onRenderedHtmlCallback = function (text) { return self.getRenderedTitle(text); };
var locDescriptionValue = _this.createLocalizableString("description", _this, true);
locDescriptionValue.onGetTextCallback = function (html) { return self.getProcessedHtml(html); };
return _this;
}
PanelModelBase.getPanelId = function () {
return "sp_" + PanelModelBase.panelCounter++;
};
PanelModelBase.prototype.setSurveyImpl = function (value) {
_super.prototype.setSurveyImpl.call(this, value);
if (this.survey && this.survey.isDesignMode)
this.onVisibleChanged();
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].setSurveyImpl(value);
}
};
PanelModelBase.prototype.endLoadingFromJson = function () {
_super.prototype.endLoadingFromJson.call(this);
this.markQuestionListDirty();
this.onRowsChanged();
};
Object.defineProperty(PanelModelBase.prototype, "title", {
/**
* PanelModel or PageModel title property.
* @description
*/
get: function () { return this.getLocalizableStringText("title"); },
set: function (val) { this.setLocalizableStringText("title", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "locTitle", {
get: function () { return this.getLocalizableString("title"); },
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "description", {
/**
* PanelModel or PageModel description property. It renders under title by using smaller font. Unlike the title, description can be empty.
* @see title
*/
get: function () { return this.getLocalizableStringText("description"); },
set: function (val) { this.setLocalizableStringText("description", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "locDescription", {
get: function () { return this.getLocalizableString("description"); },
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "hasDescription", {
get: function () { return this.description != ""; },
enumerable: true,
configurable: true
});
PanelModelBase.prototype.getLocale = function () { return this.survey ? this.survey.getLocale() : ""; };
PanelModelBase.prototype.getMarkdownHtml = function (text) { return this.survey ? this.survey.getMarkdownHtml(text) : null; };
Object.defineProperty(PanelModelBase.prototype, "parent", {
/**
* A parent element. It is always null for the Page object and always not null for the Panel object. Panel object may contain Questions and other Panels.
*/
get: function () { return this.getPropertyValue("parent", null); },
set: function (val) { this.setPropertyValue("parent", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "visibleIf", {
/**
* An expression that returns true or false. If it returns true the Panel becomes visible and if it returns false the Panel becomes invisible. The library runs the expression on survey start and on changing a question value. If the property is empty then visible property is used.
* @see visible
*/
get: function () { return this.getPropertyValue("visibleIf", ""); },
set: function (val) { this.setPropertyValue("visibleIf", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "cssClasses", {
get: function () {
return this.css;
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "css", {
get: function () { return __WEBPACK_IMPORTED_MODULE_5__defaultCss_cssstandard__["b" /* surveyCss */].getCss(); },
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "id", {
/**
* A unique element identificator. It is generated automatically.
*/
get: function () { return this.getPropertyValue("id"); },
set: function (val) { this.setPropertyValue("id", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "isPanel", {
/**
* Returns true if the current object is Panel. Returns false if the current object is Page (a root Panel).
*/
get: function () { return false; },
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "questions", {
/**
* Returns the list of all questions located in the Panel/Page, including in the nested Panels.
* @see QuestionBase
* @see elements
*/
get: function () {
if (!this.isQuestionsReady) {
this.questionsValue = [];
for (var i = 0; i < this.elements.length; i++) {
var el = this.elements[i];
if (el.isPanel) {
var qs = el.questions;
for (var j = 0; j < qs.length; j++) {
this.questionsValue.push(qs[j]);
}
}
else {
this.questionsValue.push(el);
}
}
this.isQuestionsReady = true;
}
return this.questionsValue;
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.getQuestionByName = function (name) {
var questions = this.questions;
for (var i = 0; i < questions.length; i++) {
if (questions[i].name == name)
return questions[i];
}
return null;
};
PanelModelBase.prototype.markQuestionListDirty = function () {
this.isQuestionsReady = false;
if (this.parent)
this.parent.markQuestionListDirty();
};
Object.defineProperty(PanelModelBase.prototype, "elements", {
/**
* Returns the list of the elements in the object, Panel/Page. Elements can be questions or panels. The function doesn't return elements in the nested Panels.
*/
get: function () { return this.elementsValue; },
enumerable: true,
configurable: true
});
PanelModelBase.prototype.getElementsInDesign = function (includeHidden) {
if (includeHidden === void 0) { includeHidden = false; }
return this.elements;
};
/**
* Returns true if the current element belongs to the Panel/Page. It looks in nested Panels as well.
* @param element
* @see PanelModel
*/
PanelModelBase.prototype.containsElement = function (element) {
for (var i = 0; i < this.elements.length; i++) {
var el = this.elements[i];
if (el == element)
return true;
if (el.isPanel) {
if (el.containsElement(element))
return true;
}
}
return false;
};
/**
* Returns true, if there is an error on this Page or inside the current Panel
* @param fireCallback set it to true, to show errors in UI
* @param focuseOnFirstError set it to true to focuse on the first question that doesn't pass the validation
*/
PanelModelBase.prototype.hasErrors = function (fireCallback, focuseOnFirstError) {
if (fireCallback === void 0) { fireCallback = true; }
if (focuseOnFirstError === void 0) { focuseOnFirstError = false; }
var result = false;
var firstErrorQuestion = null;
var visibleQuestions = [];
this.addQuestionsToList(visibleQuestions, true);
for (var i = 0; i < visibleQuestions.length; i++) {
var question = visibleQuestions[i];
if (question.isReadOnly)
continue;
if (question.hasErrors(fireCallback)) {
if (focuseOnFirstError && firstErrorQuestion == null) {
firstErrorQuestion = question;
}
result = true;
}
}
if (firstErrorQuestion)
firstErrorQuestion.focus(true);
return result;
};
/**
* Fill list array with the questions.
* @param list
* @param visibleOnly set it to true to get visible questions only
*/
PanelModelBase.prototype.addQuestionsToList = function (list, visibleOnly, includingDesignTime) {
if (visibleOnly === void 0) { visibleOnly = false; }
if (includingDesignTime === void 0) { includingDesignTime = false; }
this.addElementsToList(list, visibleOnly, includingDesignTime, false);
};
/**
* Fill list array with the panels.
* @param list
*/
PanelModelBase.prototype.addPanelsIntoList = function (list, visibleOnly, includingDesignTime) {
if (visibleOnly === void 0) { visibleOnly = false; }
if (includingDesignTime === void 0) { includingDesignTime = false; }
this.addElementsToList(list, visibleOnly, includingDesignTime, true);
};
PanelModelBase.prototype.addElementsToList = function (list, visibleOnly, includingDesignTime, isPanel) {
if (visibleOnly && !this.visible)
return;
this.addElementsToListCore(list, this.elements, visibleOnly, includingDesignTime, isPanel);
};
PanelModelBase.prototype.addElementsToListCore = function (list, elements, visibleOnly, includingDesignTime, isPanel) {
for (var i = 0; i < elements.length; i++) {
var el = elements[i];
if (visibleOnly && !el.visible)
continue;
if (isPanel && el.isPanel || !isPanel && !el.isPanel) {
list.push(el);
}
if (el.isPanel) {
el.addElementsToListCore(list, el.elements, visibleOnly, includingDesignTime, isPanel);
}
else {
if (includingDesignTime) {
this.addElementsToListCore(list, el.getElementsInDesign(false), visibleOnly, includingDesignTime, isPanel);
}
}
}
};
Object.defineProperty(PanelModelBase.prototype, "rows", {
get: function () {
if (!this.rowValues) {
this.rowValues = this.buildRows();
}
return this.rowValues;
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "isActive", {
/**
* Returns true if the current object is Page and it is the current page.
*/
get: function () { return (!this.survey) || this.survey.currentPage == this.root; },
enumerable: true,
configurable: true
});
PanelModelBase.prototype.updateCustomWidgets = function () {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].updateCustomWidgets();
}
};
Object.defineProperty(PanelModelBase.prototype, "questionTitleLocation", {
/**
* Set this property different from "default" to set the specific question title location for this panel/page.
* @see SurveyModel.questionTitleLocation
*/
get: function () { return this.getPropertyValue("questionTitleLocation", "default"); },
set: function (value) {
this.setPropertyValue("questionTitleLocation", value.toLowerCase());
},
enumerable: true,
configurable: true
});
;
;
PanelModelBase.prototype.getQuestionTitleLocation = function () {
if (this.questionTitleLocation != "default")
return this.questionTitleLocation;
if (this.parent)
return this.parent.getQuestionTitleLocation();
return this.survey ? this.survey.questionTitleLocation : "top";
};
Object.defineProperty(PanelModelBase.prototype, "root", {
get: function () {
var res = this;
while (res.parent)
res = res.parent;
return res;
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.createRow = function () { return new QuestionRowModel(this); };
PanelModelBase.prototype.onSurveyLoad = function () {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].onSurveyLoad();
}
if (this.rowsChangedCallback)
this.rowsChangedCallback();
};
PanelModelBase.prototype.onRowsChanged = function () {
this.rowValues = null;
if (this.rowsChangedCallback && !this.isLoadingFromJson)
this.rowsChangedCallback();
};
Object.defineProperty(PanelModelBase.prototype, "isDesignMode", {
get: function () { return this.survey && this.survey.isDesignMode; },
enumerable: true,
configurable: true
});
PanelModelBase.prototype.onAddElement = function (element, index) {
element.setSurveyImpl(this.surveyImpl);
element.parent = this;
if (element.isPanel) {
var p = element;
if (this.survey) {
this.survey.panelAdded(p, index, this, this.root);
}
}
else {
if (this.survey) {
var q = element;
this.survey.questionAdded(q, index, this, this.root);
}
}
var self = this;
element.registerFunctionOnPropertiesValueChanged(["visible", "isVisible"], function () { self.onElementVisibilityChanged(element); }, this.id);
element.registerFunctionOnPropertyValueChanged("startWithNewLine", function () { self.onElementStartWithNewLineChanged(element); }, this.id);
};
PanelModelBase.prototype.onRemoveElement = function (element) {
element.parent = null;
element.unRegisterFunctionOnPropertiesValueChanged(["visible", "isVisible", "startWithNewLine"], this.id);
if (!element.isPanel) {
if (this.survey)
this.survey.questionRemoved(element);
}
else {
if (this.survey)
this.survey.panelRemoved(element);
}
};
PanelModelBase.prototype.onElementVisibilityChanged = function (element) {
if (this.rowValues) {
this.updateRowsVisibility(element);
}
if (this.parent) {
this.parent.onElementVisibilityChanged(this);
}
};
PanelModelBase.prototype.onElementStartWithNewLineChanged = function (element) {
this.onRowsChanged();
};
PanelModelBase.prototype.updateRowsVisibility = function (element) {
for (var i = 0; i < this.rowValues.length; i++) {
var row = this.rowValues[i];
if (row.elements.indexOf(element) > -1) {
row.updateVisible();
break;
}
}
};
PanelModelBase.prototype.buildRows = function () {
var result = new Array();
var lastRowVisibleIndex = -1;
var self = this;
for (var i = 0; i < this.elements.length; i++) {
var el = this.elements[i];
var isNewRow = i == 0 || el.startWithNewLine;
var row = isNewRow ? this.createRow() : result[result.length - 1];
if (isNewRow)
result.push(row);
row.addElement(el);
}
for (var i = 0; i < result.length; i++) {
result[i].updateVisible();
}
return result;
};
Object.defineProperty(PanelModelBase.prototype, "processedTitle", {
/**
* Returns rendered title text or html.
*/
get: function () {
return this.getRenderedTitle(this.locTitle.textOrHtml);
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.getRenderedTitle = function (str) {
if (!str && this.isPanel && this.isDesignMode)
return "[" + this.name + "]";
return this.textProcessor != null ? this.textProcessor.processText(str, true) : str;
};
Object.defineProperty(PanelModelBase.prototype, "visible", {
/**
* Use it to get/set the object visibility.
* @see visibleIf
*/
get: function () { return this.getPropertyValue("visible", true); },
set: function (value) {
if (value === this.visible)
return;
this.setPropertyValue("visible", value);
this.setPropertyValue("isVisible", this.isVisible);
if (!this.isLoadingFromJson)
this.onVisibleChanged();
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.onVisibleChanged = function () {
this.setPropertyValue("isVisible", this.isVisible);
};
Object.defineProperty(PanelModelBase.prototype, "isVisible", {
/**
* Returns true if object is visible or survey is in design mode right now.
*/
get: function () { return (this.survey && this.survey.isDesignMode) || this.getIsPageVisible(null); },
enumerable: true,
configurable: true
});
PanelModelBase.prototype.getIsPageVisible = function (exceptionQuestion) {
if (!this.visible)
return false;
for (var i = 0; i < this.questions.length; i++) {
if (this.questions[i] == exceptionQuestion)
continue;
if (this.questions[i].visible)
return true;
}
return false;
};
/**
* Add an elememnt into Panel or Page.
* @param element
* @param index element index in the elements array
*/
PanelModelBase.prototype.addElement = function (element, index) {
if (index === void 0) { index = -1; }
if (element == null)
return;
if (index < 0 || index >= this.elements.length) {
this.elements.push(element);
}
else {
this.elements.splice(index, 0, element);
}
};
/**
* Add a question into Panel or Page.
* @param question
* @param index element index in the elements array
*/
PanelModelBase.prototype.addQuestion = function (question, index) {
if (index === void 0) { index = -1; }
this.addElement(question, index);
};
/**
* Add a panel into Panel or Page.
* @param panel
* @param index element index in the elements array
*/
PanelModelBase.prototype.addPanel = function (panel, index) {
if (index === void 0) { index = -1; }
this.addElement(panel, index);
};
/**
* Creates a new question and adds it into the end of the elements list.
* @param questionType the possible values are: "text", "checkbox", "dropdown", "matrix", "html", "matrixdynamic", "matrixdropdown" and so on.
* @param name a question name
*/
PanelModelBase.prototype.addNewQuestion = function (questionType, name) {
if (name === void 0) { name = null; }
var question = __WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.createQuestion(questionType, name);
this.addQuestion(question);
return question;
};
/**
* Creates a new panel and adds it into the end of the elements list.
* @param name a panel name
*/
PanelModelBase.prototype.addNewPanel = function (name) {
if (name === void 0) { name = null; }
var panel = this.createNewPanel(name);
this.addPanel(panel);
return panel;
};
PanelModelBase.prototype.createNewPanel = function (name) {
return new PanelModel(name);
};
/**
* Remove an element (Panel or Question) from the elements list.
* @param element
* @see elements
*/
PanelModelBase.prototype.removeElement = function (element) {
var index = this.elements.indexOf(element);
if (index < 0) {
for (var i = 0; i < this.elements.length; i++) {
if (this.elements[i].removeElement(element))
return true;
}
return false;
}
this.elements.splice(index, 1);
return true;
};
/**
* Remove question from the elements list.
* @param question
* @see elements
* @see removeElement
*/
PanelModelBase.prototype.removeQuestion = function (question) {
this.removeElement(question);
};
PanelModelBase.prototype.runCondition = function (values) {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].runCondition(values);
}
if (!this.visibleIf)
return;
if (!this.conditionRunner)
this.conditionRunner = new __WEBPACK_IMPORTED_MODULE_3__conditions__["a" /* ConditionRunner */](this.visibleIf);
this.conditionRunner.expression = this.visibleIf;
this.visible = this.conditionRunner.run(values);
};
PanelModelBase.prototype.onLocaleChanged = function () {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].onLocaleChanged();
}
this.locTitle.onChanged();
};
PanelModelBase.prototype.onAnyValueChanged = function (name) {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].onAnyValueChanged(name);
}
var titleValue = this.locTitle.text;
if (!titleValue)
return;
if (titleValue.toLocaleLowerCase().indexOf('{' + name.toLowerCase()) > -1) {
this.locTitle.onChanged();
}
};
return PanelModelBase;
}(__WEBPACK_IMPORTED_MODULE_2__base__["a" /* SurveyElement */]));
PanelModelBase.panelCounter = 100;
/**
* A container element, similar to the Page objects. However, unlike the Page, Panel can't be a root.
* It may contain questions and other panels.
*/
var PanelModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](PanelModel, _super);
function PanelModel(name) {
if (name === void 0) { name = ""; }
var _this = _super.call(this, name) || this;
_this.name = name;
return _this;
}
PanelModel.prototype.getType = function () { return "panel"; };
Object.defineProperty(PanelModel.prototype, "isPanel", {
get: function () { return true; },
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "width", {
/**
* The Panel width.
*/
get: function () { return this.getPropertyValue("width"); },
set: function (val) { this.setPropertyValue("width", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "innerIndent", {
/**
* The inner indent. Set this property to increase the panel content margin.
*/
get: function () { return this.getPropertyValue("innerIndent", 0); },
set: function (val) { this.setPropertyValue("innerIndent", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "renderWidth", {
get: function () { return this.getPropertyValue("renderWidth"); },
set: function (val) { this.setPropertyValue("renderWidth", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "startWithNewLine", {
/**
* The Panel renders on the new line if the property is true. If the property is false, the panel tries to render on the same line/row with a previous question/panel.
*/
get: function () { return this.getPropertyValue("startWithNewLine", true); },
set: function (value) { this.setPropertyValue("startWithNewLine", value); },
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "rightIndent", {
/**
* The right indent of the Panel.
*/
get: function () { return this.getPropertyValue("rightIndent", 0); },
set: function (val) { this.setPropertyValue("rightIndent", val); },
enumerable: true,
configurable: true
});
PanelModel.prototype.onVisibleChanged = function () {
_super.prototype.onVisibleChanged.call(this);
this.setPropertyValue("isVisible", this.isVisible);
if (this.survey != null) {
this.survey.panelVisibilityChanged(this, this.visible);
}
};
return PanelModel;
}(PanelModelBase));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */].metaData.addClass("panelbase", ["name", { name: "elements", alternativeName: "questions", baseClassName: "question", visible: false },
{ name: "visible:boolean", default: true }, "visibleIf:condition",
{ name: "questionTitleLocation", default: "default", choices: ["default", "top", "bottom", "left"] },
{ name: "title:text", serializationProperty: "locTitle" },
{ name: "description:text", serializationProperty: "locDescription" }], function () { return new PanelModelBase(); });
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */].metaData.addClass("panel", [{ name: "startWithNewLine:boolean", default: true }, { name: "innerIndent:number", default: 0, choices: [0, 1, 2, 3] }], function () { return new PanelModel(); }, "panelbase");
/***/ }),
/* 24 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__helpers__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__textPreProcessor__ = __webpack_require__(17);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__itemvalue__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__question_baseselect__ = __webpack_require__(16);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__choicesRestfull__ = __webpack_require__(21);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__questionfactory__ = __webpack_require__(5);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return MatrixDropdownColumn; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MatrixDropdownCell; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return MatrixDropdownRowModelBase; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return QuestionMatrixDropdownModelBase; });
var MatrixDropdownColumn = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](MatrixDropdownColumn, _super);
function MatrixDropdownColumn(name, title) {
if (title === void 0) { title = null; }
var _this = _super.call(this) || this;
_this.colOwner = null;
_this.validators = new Array();
_this.name = name;
_this.choicesValue = _this.createItemValues("choices");
var self = _this;
var locTitleValue = _this.createLocalizableString("title", _this, true);
locTitleValue.onRenderedHtmlCallback = function (text) { return self.getFullTitle(text); };
_this.createLocalizableString("optionsCaption", _this);
_this.createLocalizableString("placeHolder", _this);
_this.choicesByUrl = new __WEBPACK_IMPORTED_MODULE_10__choicesRestfull__["a" /* ChoicesRestfull */]();
if (title)
_this.title = title;
return _this;
}
MatrixDropdownColumn.prototype.getType = function () { return "matrixdropdowncolumn"; };
Object.defineProperty(MatrixDropdownColumn.prototype, "name", {
get: function () { return this.getPropertyValue("name"); },
set: function (val) { this.setPropertyValue("name", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "choicesOrder", {
get: function () { return this.getPropertyValue("choicesOrder", "none"); },
set: function (val) {
val = val.toLocaleLowerCase();
this.setPropertyValue("choicesOrder", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "inputType", {
get: function () { return this.getPropertyValue("inputType", "text"); },
set: function (val) {
val = val.toLocaleLowerCase();
this.setPropertyValue("inputType", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "cellType", {
get: function () { return this.getPropertyValue("cellType", "default"); },
set: function (val) {
val = val.toLocaleLowerCase();
this.setPropertyValue("cellType", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "title", {
get: function () { return this.getLocalizableStringText("title", this.name); },
set: function (val) { this.setLocalizableStringText("title", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "locTitle", {
get: function () { return this.getLocalizableString("title"); },
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "fullTitle", {
get: function () { return this.getFullTitle(this.locTitle.textOrHtml); },
enumerable: true,
configurable: true
});
MatrixDropdownColumn.prototype.getFullTitle = function (str) {
if (!str)
str = this.name;
if (this.isRequired) {
var requireText = this.colOwner ? this.colOwner.getRequiredText() : "";
if (requireText)
requireText += " ";
str = requireText + str;
}
return str;
};
Object.defineProperty(MatrixDropdownColumn.prototype, "optionsCaption", {
get: function () { return this.getLocalizableStringText("optionsCaption"); },
set: function (val) { this.setLocalizableStringText("optionsCaption", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "locOptionsCaption", {
get: function () { return this.getLocalizableString("optionsCaption"); },
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "placeHolder", {
get: function () { return this.getLocalizableStringText("placeHolder"); },
set: function (val) { this.setLocalizableStringText("placeHolder", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "locPlaceHolder", {
get: function () { return this.getLocalizableString("placeHolder"); },
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "choices", {
get: function () { return this.choicesValue; },
set: function (newValue) { this.setPropertyValue("choices", newValue); },
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "colCount", {
get: function () { return this.getPropertyValue("colCount", -1); },
set: function (val) {
if (val < -1 || val > 4)
return;
this.setPropertyValue("colCount", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "isRequired", {
get: function () { return this.getPropertyValue("isRequired", false); },
set: function (val) { this.setPropertyValue("isRequired", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "hasOther", {
get: function () { return this.getPropertyValue("hasOther", false); },
set: function (val) { this.setPropertyValue("hasOther", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "minWidth", {
get: function () { return this.getPropertyValue("minWidth", ""); },
set: function (val) { this.setPropertyValue("minWidth", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "visibleIf", {
get: function () { return this.getPropertyValue("visibleIf", ""); },
set: function (val) { this.setPropertyValue("visibleIf", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "booleanDefaultValue", {
get: function () { return this.getPropertyValue("booleanDefaultValue", "indeterminate"); },
set: function (val) {
this.setPropertyValue("booleanDefaultValue", val);
},
enumerable: true,
configurable: true
});
MatrixDropdownColumn.prototype.getLocale = function () { return this.colOwner ? this.colOwner.getLocale() : ""; };
MatrixDropdownColumn.prototype.getMarkdownHtml = function (text) { return this.colOwner ? this.colOwner.getMarkdownHtml(text) : null; };
MatrixDropdownColumn.prototype.propertyValueChanged = function (name, oldValue, newValue) {
_super.prototype.propertyValueChanged.call(this, name, oldValue, newValue);
if (this.colOwner != null && !this.isLoadingFromJson) {
this.colOwner.onColumnPropertiesChanged(this);
}
};
return MatrixDropdownColumn;
}(__WEBPACK_IMPORTED_MODULE_4__base__["c" /* Base */]));
var MatrixDropdownCell = (function () {
function MatrixDropdownCell(column, row, data) {
var _this = this;
this.column = column;
this.row = row;
this.data = data;
this.questionValue = data.createQuestion(this.row, this.column);
this.questionValue.validateValueCallback = function () { return data.validateCell(row, column.name, row.value); };
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* CustomPropertiesCollection */].getProperties(column.getType()).forEach(function (property) {
var propertyName = property.name;
if (column[propertyName] !== undefined && _this.questionValue.getPropertyValue(propertyName, null) == null) {
_this.questionValue[propertyName] = column[propertyName];
}
});
Object.keys(column).forEach(function (key) {
});
this.questionValue.updateCustomWidget();
}
Object.defineProperty(MatrixDropdownCell.prototype, "question", {
get: function () { return this.questionValue; },
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownCell.prototype, "value", {
get: function () { return this.question.value; },
set: function (value) {
this.question.value = value;
},
enumerable: true,
configurable: true
});
MatrixDropdownCell.prototype.runCondition = function (values) {
this.question.runCondition(values);
};
return MatrixDropdownCell;
}());
var MatrixDropdownRowModelBase = (function () {
function MatrixDropdownRowModelBase(data, value) {
this.rowValues = {};
this.isSettingValue = false;
this.textPreProcessor = new __WEBPACK_IMPORTED_MODULE_5__textPreProcessor__["a" /* TextPreProcessor */]();
this.cells = [];
this.data = data;
this.value = value;
this.textPreProcessor = new __WEBPACK_IMPORTED_MODULE_5__textPreProcessor__["a" /* TextPreProcessor */]();
var self = this;
this.textPreProcessor.onHasValue = function (name) { return self.hasProcessedTextValue(name); };
this.textPreProcessor.onProcess = function (name, returnDisplayValue) { return self.getProcessedTextValue(name, returnDisplayValue); };
for (var i = 0; i < this.data.columns.length; i++) {
if (this.rowValues[this.data.columns[i].name] === undefined) {
this.rowValues[this.data.columns[i].name] = null;
}
}
this.idValue = MatrixDropdownRowModelBase.getId();
}
MatrixDropdownRowModelBase.getId = function () { return "srow_" + MatrixDropdownRowModelBase.idCounter++; };
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "id", {
get: function () { return this.idValue; },
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "rowName", {
get: function () { return null; },
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "value", {
get: function () { return this.rowValues; },
set: function (value) {
this.isSettingValue = true;
this.rowValues = {};
if (value != null) {
for (var key in value) {
this.rowValues[key] = value[key];
}
}
for (var i = 0; i < this.cells.length; i++) {
this.cells[i].question.onSurveyValueChanged(this.getValue(this.cells[i].column.name));
}
this.isSettingValue = false;
},
enumerable: true,
configurable: true
});
MatrixDropdownRowModelBase.prototype.getAllValues = function () { return this.value; };
MatrixDropdownRowModelBase.prototype.onAnyValueChanged = function (name) {
for (var i = 0; i < this.cells.length; i++) {
this.cells[i].question.onAnyValueChanged(name);
}
};
MatrixDropdownRowModelBase.prototype.getValue = function (name) {
return this.rowValues[name];
};
MatrixDropdownRowModelBase.prototype.setValue = function (name, newValue) {
if (this.isSettingValue)
return;
if (newValue === "")
newValue = null;
if (newValue != null) {
this.rowValues[name] = newValue;
}
else {
delete this.rowValues[name];
}
this.data.onRowChanged(this, name, this.value);
this.onAnyValueChanged("row");
};
MatrixDropdownRowModelBase.prototype.getComment = function (name) {
var result = this.getValue(name + __WEBPACK_IMPORTED_MODULE_4__base__["c" /* Base */].commentPrefix);
return result ? result : "";
};
MatrixDropdownRowModelBase.prototype.setComment = function (name, newValue) {
this.setValue(name + __WEBPACK_IMPORTED_MODULE_4__base__["c" /* Base */].commentPrefix, newValue);
};
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "isEmpty", {
get: function () {
var val = this.value;
if (__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isValueEmpty(val))
return true;
for (var key in val) {
if (val[key] !== undefined && val[key] !== null)
return false;
}
return true;
},
enumerable: true,
configurable: true
});
MatrixDropdownRowModelBase.prototype.getQuestionByColumn = function (column) {
for (var i = 0; i < this.cells.length; i++) {
if (this.cells[i].column == column)
return this.cells[i].question;
}
return null;
};
MatrixDropdownRowModelBase.prototype.getLocale = function () { return this.data ? this.data.getLocale() : ""; };
MatrixDropdownRowModelBase.prototype.getMarkdownHtml = function (text) { return this.data ? this.data.getMarkdownHtml(text) : null; };
MatrixDropdownRowModelBase.prototype.onLocaleChanged = function () {
for (var i = 0; i < this.cells.length; i++) {
this.cells[i].question.onLocaleChanged();
}
};
MatrixDropdownRowModelBase.prototype.runCondition = function (values) {
values["row"] = this.value;
for (var i = 0; i < this.cells.length; i++) {
this.cells[i].runCondition(values);
}
};
MatrixDropdownRowModelBase.prototype.buildCells = function () {
var columns = this.data.columns;
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
this.cells.push(this.createCell(column));
}
};
MatrixDropdownRowModelBase.prototype.createCell = function (column) {
return new MatrixDropdownCell(column, this, this.data);
};
MatrixDropdownRowModelBase.prototype.geSurveyData = function () { return this; };
MatrixDropdownRowModelBase.prototype.getSurvey = function () { return this.data ? this.data.getSurvey() : null; };
//ITextProcessor
MatrixDropdownRowModelBase.prototype.hasProcessedTextValue = function (name) {
var firstName = new __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__["a" /* ProcessValue */]().getFirstName(name);
return firstName == "row";
};
MatrixDropdownRowModelBase.prototype.getProcessedTextValue = function (name, returnDisplayValue) {
//name should start with the row
var values = { row: this.value };
return new __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__["a" /* ProcessValue */]().getValue(name, values);
};
MatrixDropdownRowModelBase.prototype.getTextProcessor = function () { return this; };
MatrixDropdownRowModelBase.prototype.processText = function (text, returnDisplayValue) {
text = this.textPreProcessor.process(text, returnDisplayValue);
return this.getSurvey().processText(text, returnDisplayValue);
};
MatrixDropdownRowModelBase.prototype.processTextEx = function (text) {
text = this.processText(text, true);
var hasAllValuesOnLastRun = this.textPreProcessor.hasAllValuesOnLastRun;
var res = this.getSurvey().processTextEx(text);
res.hasAllValuesOnLastRun = res.hasAllValuesOnLastRun && hasAllValuesOnLastRun;
return res;
};
return MatrixDropdownRowModelBase;
}());
MatrixDropdownRowModelBase.idCounter = 1;
/**
* A base class for matrix dropdown and matrix dynamic questions.
*/
var QuestionMatrixDropdownModelBase = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMatrixDropdownModelBase, _super);
function QuestionMatrixDropdownModelBase(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.isRowChanging = false;
_this.generatedVisibleRows = null;
var self = _this;
_this.columnsValue = _this.createNewArray("columns", function (item) { item.colOwner = self; });
_this.choicesValue = _this.createItemValues("choices");
_this.createLocalizableString("optionsCaption", _this);
_this.registerFunctionOnPropertyValueChanged("columns", function () { self.generatedVisibleRows = null; self.fireCallback(self.columnsChangedCallback); });
return _this;
}
QuestionMatrixDropdownModelBase.addDefaultColumns = function (matrix) {
var colNames = __WEBPACK_IMPORTED_MODULE_11__questionfactory__["a" /* QuestionFactory */].DefaultColums;
for (var i = 0; i < colNames.length; i++)
matrix.addColumn(colNames[i]);
};
QuestionMatrixDropdownModelBase.prototype.getType = function () {
return "matrixdropdownbase";
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "isAllowTitleLeft", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columns", {
/**
* The list of matrix columns.
*/
get: function () { return this.columnsValue; },
set: function (value) {
this.setPropertyValue("columns", value);
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.onMatrixRowCreated = function (row) {
if (!this.survey)
return;
var options = { rowValue: row.value, row: row, column: null, columnName: null, cell: null, cellQuestion: null, value: null };
for (var i = 0; i < this.columns.length; i++) {
options.column = this.columns[i];
options.columnName = options.column.name;
var cell = row.cells[i];
options.cell = cell;
options.cellQuestion = cell.question;
options.value = cell.value;
this.survey.matrixCellCreated(this, options);
}
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "cellType", {
/**
* Use this property to change the default cell type.
*/
get: function () { return this.getPropertyValue("cellType", "dropdown"); },
set: function (val) {
val = val.toLowerCase();
if (this.cellType == val)
return;
this.setPropertyValue("cellType", val);
this.fireCallback(this.updateCellsCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columnColCount", {
/**
* The default column count for radiogroup and checkbox cell types.
*/
get: function () { return this.getPropertyValue("columnColCount", 0); },
set: function (value) {
if (value < 0 || value > 4)
return;
this.setPropertyValue("columnColCount", value);
this.fireCallback(this.updateCellsCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columnMinWidth", {
/**
* Use this property to set the mimimum column width.
*/
get: function () { return this.getPropertyValue("columnMinWidth", ""); },
set: function (val) { this.setPropertyValue("columnMinWidth", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "horizontalScroll", {
/**
* Set this property to true to show the horizontal scroll.
*/
get: function () { return this.getPropertyValue("horizontalScroll", false); },
set: function (val) { this.setPropertyValue("horizontalScroll", val); },
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.getRequiredText = function () { return this.survey ? this.survey.requiredText : ""; };
QuestionMatrixDropdownModelBase.prototype.onColumnPropertiesChanged = function (column) {
if (!this.generatedVisibleRows)
return;
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var row = this.generatedVisibleRows[i];
for (var j = 0; j < row.cells.length; j++) {
if (row.cells[j].column !== column)
continue;
this.setQuestionProperties(row.cells[j].question, column, row);
break;
}
}
};
QuestionMatrixDropdownModelBase.prototype.runCondition = function (values) {
_super.prototype.runCondition.call(this, values);
this.runCellsCondition(values);
};
QuestionMatrixDropdownModelBase.prototype.runCellsCondition = function (values) {
if (!this.generatedVisibleRows)
return;
var newValues = {};
if (values && values instanceof Object) {
newValues = JSON.parse(JSON.stringify(values));
}
newValues["row"] = {};
var rows = this.generatedVisibleRows;
for (var i = 0; i < rows.length; i++) {
rows[i].runCondition(newValues);
}
};
QuestionMatrixDropdownModelBase.prototype.onLocaleChanged = function () {
_super.prototype.onLocaleChanged.call(this);
for (var i = 0; i < this.columns.length; i++) {
this.columns[i].onLocaleChanged();
}
var rows = this.visibleRows;
if (!rows)
return;
for (var i = 0; i < rows.length; i++) {
rows[i].onLocaleChanged();
}
this.fireCallback(this.updateCellsCallback);
};
/**
* Returns the column by it's name. Retuns null if a column with this name doesn't exist.
* @param column
*/
QuestionMatrixDropdownModelBase.prototype.getColumnName = function (columnName) {
for (var i = 0; i < this.columns.length; i++) {
if (this.columns[i].name == columnName)
return this.columns[i];
}
return null;
};
/**
* Returns the column width.
* @param column
*/
QuestionMatrixDropdownModelBase.prototype.getColumnWidth = function (column) {
return column.minWidth ? column.minWidth : this.columnMinWidth;
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "choices", {
/**
* The default choices for dropdown, checkbox and radiogroup cell types.
*/
get: function () { return this.choicesValue; },
set: function (val) {
this.setPropertyValue("choices", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "optionsCaption", {
/**
* The default options caption for dropdown cell type.
*/
get: function () { return this.getLocalizableStringText("optionsCaption", __WEBPACK_IMPORTED_MODULE_8__surveyStrings__["a" /* surveyLocalization */].getString("optionsCaption")); },
set: function (val) { this.setLocalizableStringText("optionsCaption", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "locOptionsCaption", {
get: function () { return this.getLocalizableString("optionsCaption"); },
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.addColumn = function (name, title) {
if (title === void 0) { title = null; }
var column = new MatrixDropdownColumn(name, title);
this.columnsValue.push(column);
return column;
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "visibleRows", {
/**
* Returns the rows model objects that used during rendering.
*/
get: function () {
if (this.isLoadingFromJson)
return;
if (!this.generatedVisibleRows) {
this.generatedVisibleRows = this.generateRows();
if (this.data) {
this.runCellsCondition(this.data.getAllValues());
}
}
return this.generatedVisibleRows;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
this.generatedVisibleRows = null;
};
/**
* Returns the row value. If the row value is empty, the object is empty: {}.
* @param rowIndex row index from 0 to visible row count - 1.
*/
QuestionMatrixDropdownModelBase.prototype.getRowValue = function (rowIndex) {
if (rowIndex < 0)
return null;
var visRows = this.visibleRows;
if (rowIndex >= visRows.length)
return null;
var newValue = this.createNewValue(this.value);
return this.getRowValueCore(visRows[rowIndex], newValue);
};
/**
* Set the row value.
* @param rowIndex row index from 0 to visible row count - 1.
* @param rowValue an object {"column name": columnValue,... }
*/
QuestionMatrixDropdownModelBase.prototype.setRowValue = function (rowIndex, rowValue) {
if (rowIndex < 0)
return null;
var visRows = this.visibleRows;
if (rowIndex >= visRows.length)
return null;
this.onRowChanged(visRows[rowIndex], "", rowValue);
this.onValueChanged();
};
QuestionMatrixDropdownModelBase.prototype.generateRows = function () { return null; };
QuestionMatrixDropdownModelBase.prototype.createNewValue = function (curValue) { return !curValue ? {} : curValue; };
QuestionMatrixDropdownModelBase.prototype.getRowValueCore = function (row, questionValue, create) {
if (create === void 0) { create = false; }
var result = questionValue[row.rowName] ? questionValue[row.rowName] : null;
if (!result && create) {
result = {};
questionValue[row.rowName] = result;
}
return result;
};
QuestionMatrixDropdownModelBase.prototype.getRowDisplayValue = function (row, rowValue) {
for (var i = 0; i < this.columns.length; i++) {
var column = this.columns[i];
if (rowValue[column.name]) {
rowValue[column.name] = row.cells[i].question.displayValue;
}
}
return rowValue;
};
QuestionMatrixDropdownModelBase.prototype.onBeforeValueChanged = function (val) {
};
QuestionMatrixDropdownModelBase.prototype.onValueChanged = function () {
if (this.isRowChanging)
return;
this.onBeforeValueChanged(this.value);
if (!(this.generatedVisibleRows) || this.generatedVisibleRows.length == 0)
return;
this.isRowChanging = true;
var val = this.createNewValue(this.value);
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var row = this.generatedVisibleRows[i];
this.generatedVisibleRows[i].value = this.getRowValueCore(row, val);
}
this.isRowChanging = false;
};
QuestionMatrixDropdownModelBase.prototype.supportGoNextPageAutomatic = function () {
var rows = this.generatedVisibleRows;
if (!rows)
rows = this.visibleRows;
if (!rows)
return true;
for (var i = 0; i < rows.length; i++) {
var cells = this.generatedVisibleRows[i].cells;
if (!cells)
continue;
for (var colIndex = 0; colIndex < cells.length; colIndex++) {
var question = cells[colIndex].question;
if (question && (!question.supportGoNextPageAutomatic() || !question.value))
return false;
}
}
return true;
};
QuestionMatrixDropdownModelBase.prototype.hasErrors = function (fireCallback) {
if (fireCallback === void 0) { fireCallback = true; }
var errosInColumns = this.hasErrorInColumns(fireCallback);
return _super.prototype.hasErrors.call(this, fireCallback) || errosInColumns;
};
QuestionMatrixDropdownModelBase.prototype.getAllErrors = function () {
var result = _super.prototype.getAllErrors.call(this);
var rows = this.generatedVisibleRows;
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
for (var j = 0; j < row.cells.length; j++) {
var errors = row.cells[j].question.getAllErrors();
if (errors && errors.length > 0) {
result = result.concat(errors);
}
}
}
return result;
};
QuestionMatrixDropdownModelBase.prototype.hasErrorInColumns = function (fireCallback) {
if (!this.generatedVisibleRows)
return false;
var res = false;
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var cells = this.generatedVisibleRows[i].cells;
if (!cells)
continue;
for (var colIndex = 0; colIndex < this.columns.length; colIndex++) {
if (!cells[colIndex])
continue;
var question = cells[colIndex].question;
res = question && question.visible && question.hasErrors(fireCallback) || res;
}
}
return res;
};
QuestionMatrixDropdownModelBase.prototype.getFirstInputElementId = function () {
var question = this.getFirstCellQuestion(false);
return question ? question.inputId : _super.prototype.getFirstInputElementId.call(this);
};
QuestionMatrixDropdownModelBase.prototype.getFirstErrorInputElementId = function () {
var question = this.getFirstCellQuestion(true);
return question ? question.inputId : _super.prototype.getFirstErrorInputElementId.call(this);
};
QuestionMatrixDropdownModelBase.prototype.getFirstCellQuestion = function (onError) {
if (!this.generatedVisibleRows)
return null;
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var cells = this.generatedVisibleRows[i].cells;
for (var colIndex = 0; colIndex < this.columns.length; colIndex++) {
if (!onError)
return cells[colIndex].question;
if (cells[colIndex].question.currentErrorCount > 0)
return cells[colIndex].question;
}
}
return null;
};
//IMatrixDropdownData
QuestionMatrixDropdownModelBase.prototype.createQuestion = function (row, column) {
return this.createQuestionCore(row, column);
};
QuestionMatrixDropdownModelBase.prototype.createQuestionCore = function (row, column) {
var cellType = column.cellType == "default" ? this.cellType : column.cellType;
var question = this.createCellQuestion(cellType, column.name);
question.setSurveyImpl(row);
this.setQuestionProperties(question, column, row);
return question;
};
QuestionMatrixDropdownModelBase.prototype.getColumnChoices = function (column) {
return column.choices && column.choices.length > 0 ? column.choices : this.choices;
};
QuestionMatrixDropdownModelBase.prototype.getColumnOptionsCaption = function (column) {
return column.optionsCaption ? column.optionsCaption : this.optionsCaption;
};
QuestionMatrixDropdownModelBase.prototype.setQuestionProperties = function (question, column, row) {
if (!question)
return;
question.name = column.name;
question.isRequired = column.isRequired;
question.hasOther = column.hasOther;
question.readOnly = this.readOnly;
question.validators = column.validators;
question.visibleIf = column.visibleIf;
if (column.hasOther) {
if (question instanceof __WEBPACK_IMPORTED_MODULE_9__question_baseselect__["b" /* QuestionSelectBase */]) {
question.storeOthersAsComment = false;
}
}
var t = question.getType();
if (t == "checkbox" || t == "radiogroup") {
question.colCount = column.colCount > -1 ? column.colCount : this.columnColCount;
this.setSelectBaseProperties(question, column, row);
}
if (t == "dropdown") {
question.optionsCaption = this.getColumnOptionsCaption(column);
this.setSelectBaseProperties(question, column, row);
}
if (t == "text") {
question.inputType = column.inputType;
question.placeHolder = column.placeHolder;
}
if (t == "comment") {
question.placeHolder = column.placeHolder;
}
if (t == "boolean") {
question.defaultValue = column.booleanDefaultValue;
question.showTitle = true;
}
};
QuestionMatrixDropdownModelBase.prototype.setSelectBaseProperties = function (question, column, row) {
question.choicesOrder = column.choicesOrder;
question.choices = this.getColumnChoices(column);
question.choicesByUrl.setData(column.choicesByUrl);
if (!question.choicesByUrl.isEmpty) {
question.choicesByUrl.run(row);
}
};
QuestionMatrixDropdownModelBase.prototype.createCellQuestion = function (questionType, name) {
return __WEBPACK_IMPORTED_MODULE_11__questionfactory__["a" /* QuestionFactory */].Instance.createQuestion(questionType, name);
};
QuestionMatrixDropdownModelBase.prototype.deleteRowValue = function (newValue, row) {
delete newValue[row.rowName];
return Object.keys(newValue).length == 0 ? null : newValue;
};
QuestionMatrixDropdownModelBase.prototype.onAnyValueChanged = function (name) {
if (this.isLoadingFromJson)
return;
var rows = this.visibleRows;
for (var i = 0; i < rows.length; i++) {
rows[i].onAnyValueChanged(name);
}
};
QuestionMatrixDropdownModelBase.prototype.onCellValueChanged = function (row, columnName, rowValue) {
if (!this.survey)
return;
var self = this;
var getQuestion = function (colName) {
for (var i = 0; self.columns.length; i++) {
if (self.columns[i].name == colName) {
return row.cells[i].question;
}
}
return null;
};
var options = { row: row, columnName: columnName, rowValue: rowValue, value: rowValue[columnName], getCellQuestion: getQuestion };
this.survey.matrixCellValueChanged(this, options);
};
QuestionMatrixDropdownModelBase.prototype.validateCell = function (row, columnName, rowValue) {
if (!this.survey)
return;
var self = this;
var options = { row: row, columnName: columnName, rowValue: rowValue, value: rowValue[columnName] };
return this.survey.matrixCellValidate(this, options);
};
QuestionMatrixDropdownModelBase.prototype.onRowChanged = function (row, columnName, newRowValue) {
var oldValue = this.createNewValue(this.value);
if (this.isMatrixValueEmpty(oldValue))
oldValue = null;
var newValue = this.createNewValue(this.value);
var rowValue = this.getRowValueCore(row, newValue, true);
if (!rowValue)
rowValue = {};
for (var key in rowValue)
delete rowValue[key];
if (newRowValue) {
newRowValue = JSON.parse(JSON.stringify(newRowValue));
for (var key in newRowValue) {
if (!this.isValueEmpty(newRowValue[key])) {
rowValue[key] = newRowValue[key];
}
}
}
if (Object.keys(rowValue).length == 0) {
newValue = this.deleteRowValue(newValue, row);
}
if (this.isTwoValueEquals(oldValue, newValue))
return;
this.isRowChanging = true;
this.setNewValue(newValue);
this.isRowChanging = false;
if (columnName) {
this.onCellValueChanged(row, columnName, rowValue);
}
};
QuestionMatrixDropdownModelBase.prototype.isMatrixValueEmpty = function (val) {
if (!val)
return;
if (Array.isArray(val)) {
for (var i = 0; i < val.length; i++) {
if (Object.keys(val[i]).length > 0)
return false;
}
return true;
}
return Object.keys(val).length == 0;
};
QuestionMatrixDropdownModelBase.prototype.getSurvey = function () { return this.survey; };
return QuestionMatrixDropdownModelBase;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */].metaData.addClass("matrixdropdowncolumn", ["name", { name: "title", serializationProperty: "locTitle" },
{ name: "choices:itemvalues", onGetValue: function (obj) { return __WEBPACK_IMPORTED_MODULE_7__itemvalue__["a" /* ItemValue */].getData(obj.choices); }, onSetValue: function (obj, value) { obj.choices = value; } },
{ name: "optionsCaption", serializationProperty: "locOptionsCaption" }, { name: "cellType", default: "default", choices: ["default", "dropdown", "checkbox", "radiogroup", "text", "comment", "boolean"] },
{ name: "colCount", default: -1, choices: [-1, 0, 1, 2, 3, 4] }, "isRequired:boolean", "hasOther:boolean", "minWidth", { name: "placeHolder", serializationProperty: "locPlaceHolder" },
{ name: "choicesOrder", default: "none", choices: ["none", "asc", "desc", "random"] },
{ name: "choicesByUrl:restfull", className: "ChoicesRestfull", onGetValue: function (obj) { return obj.choicesByUrl.isEmpty ? null : obj.choicesByUrl; }, onSetValue: function (obj, value) { obj.choicesByUrl.setData(value); } },
{ name: "booleanDefaultValue", default: "indeterminate", choices: ["indeterminate", "false", "true"] },
{ name: "inputType", default: "text", choices: ["color", "date", "datetime", "datetime-local", "email", "month", "number", "password", "range", "tel", "text", "time", "url", "week"] },
"visibleIf:condition", { name: "validators:validators", baseClassName: "surveyvalidator", classNamePart: "validator" }], function () { return new MatrixDropdownColumn(""); });
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */].metaData.addClass("matrixdropdownbase", [{ name: "columns:matrixdropdowncolumns", className: "matrixdropdowncolumn" },
"horizontalScroll:boolean",
{ name: "choices:itemvalues", onGetValue: function (obj) { return __WEBPACK_IMPORTED_MODULE_7__itemvalue__["a" /* ItemValue */].getData(obj.choices); }, onSetValue: function (obj, value) { obj.choices = value; } },
{ name: "optionsCaption", serializationProperty: "locOptionsCaption" },
{ name: "cellType", default: "dropdown", choices: ["dropdown", "checkbox", "radiogroup", "text", "comment", "boolean"] },
{ name: "columnColCount", default: 0, choices: [0, 1, 2, 3, 4] }, "columnMinWidth"], function () { return new QuestionMatrixDropdownModelBase(""); }, "question");
/***/ }),
/* 25 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__conditions__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__defaultCss_cssstandard__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__questionCustomWidgets__ = __webpack_require__(35);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionBase; });
/**
* A base class for all questions. QuestionBase doesn't have information about title, values, errors and so on.
* Those properties are defined in the Question class.
*/
var QuestionBase = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionBase, _super);
function QuestionBase(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.conditionRunner = null;
_this.isCustomWidgetRequested = false;
_this.customWidgetData = { isNeedRender: true };
/**
* The event is fired when the survey change it's locale
* @see SurveyModel.locale
*/
_this.localeChanged = new __WEBPACK_IMPORTED_MODULE_1__base__["b" /* Event */]();
_this.id = QuestionBase.getQuestionId();
_this.onCreating();
return _this;
}
QuestionBase.getQuestionId = function () {
return "sq_" + QuestionBase.questionCounter++;
};
QuestionBase.prototype.getType = function () { return "questionbase"; };
Object.defineProperty(QuestionBase.prototype, "parent", {
/**
* A parent element. It can be panel or page.
*/
get: function () { return this.getPropertyValue("parent", null); },
set: function (val) { this.setPropertyValue("parent", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "isPanel", {
/**
* Always returns false.
*/
get: function () { return false; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "visible", {
/**
* Use it to get/set the question visibility.
* @see visibleIf
*/
get: function () { return this.getPropertyValue("visible", true); },
set: function (val) {
if (val == this.visible)
return;
this.setPropertyValue("visible", val);
this.setPropertyValue("isVisible", this.isVisible);
if (this.survey) {
this.survey.questionVisibilityChanged(this, this.visible);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "visibleIf", {
/**
* An expression that returns true or false. If it returns true the Question becomes visible and if it returns false the Question becomes invisible. The library runs the expression on survey start and on changing a question value. If the property is empty then visible property is used.
* @see visible
*/
get: function () { return this.getPropertyValue("visibleIf", ""); },
set: function (val) { this.setPropertyValue("visibleIf", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "isVisible", {
/**
* Returns true if the question is visible or survey is in design mode right now.
*/
get: function () { return this.visible || this.isDesignMode; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "isDesignMode", {
/**
* Returns true if the question in design mode right now.
*/
get: function () { return this.survey && this.survey.isDesignMode; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "isReadOnly", {
/**
* Returns true if there is no input in the question. It always returns true for html question or survey is in 'display' mode.
* @see QuestionHtmlModel
* @see SurveyModel.mode
* @see Question.readOnly
*/
get: function () { return true; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "visibleIndex", {
/**
* Returns the visible index of the question in the survey. It can be from 0 to all visible questions count - 1
*/
get: function () { return this.getPropertyValue("visibleIndex", -1); },
enumerable: true,
configurable: true
});
/**
* Returns true if there is at least one error on question validation.
* @param fireCallback set it to true to show error in UI
*/
QuestionBase.prototype.hasErrors = function (fireCallback) {
if (fireCallback === void 0) { fireCallback = true; }
return false;
};
Object.defineProperty(QuestionBase.prototype, "currentErrorCount", {
/**
* Returns the number of erros on validation.
*/
get: function () { return 0; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "hasTitle", {
/**
* Returns false if the question doesn't have a title property, for example: QuestionHtmlModel
*/
get: function () { return false; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "hasDescription", {
/**
* Returns false if the question doesn't have a description property, for example: QuestionHtmlModel, or description property is empty.
*/
get: function () { return false; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "hasInput", {
/**
* Returns false if the question doesn't have an input element, for example: QuestionHtmlModel
*/
get: function () { return false; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "hasComment", {
/**
* Returns true, if you can have a comment for the question.
*/
get: function () { return false; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "id", {
/**
* The unique identificator. It is generated automatically.
*/
get: function () { return this.getPropertyValue("id"); },
set: function (val) { this.setPropertyValue("id", val); },
enumerable: true,
configurable: true
});
/**
* Returns the list of errors that has in the question. For example, isRequired error.
*/
QuestionBase.prototype.getAllErrors = function () { return []; };
Object.defineProperty(QuestionBase.prototype, "customWidget", {
/**
* The link to the custom widget.
*/
get: function () {
if (!this.isCustomWidgetRequested && !this.customWidgetValue) {
this.isCustomWidgetRequested = true;
this.updateCustomWidget();
}
return this.customWidgetValue;
},
enumerable: true,
configurable: true
});
QuestionBase.prototype.updateCustomWidget = function () {
this.customWidgetValue = __WEBPACK_IMPORTED_MODULE_5__questionCustomWidgets__["a" /* CustomWidgetCollection */].Instance.getCustomWidget(this);
};
Object.defineProperty(QuestionBase.prototype, "startWithNewLine", {
/**
* The Question renders on the new line if the property is true. If the property is false, the question tries to render on the same line/row with a previous question/panel.
*/
get: function () { return this.getPropertyValue("startWithNewLine", true); },
set: function (val) {
if (this.startWithNewLine == val)
return;
this.setPropertyValue("startWithNewLine", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "cssClasses", {
/**
* Returns all css classes that used for rendering the question. You may use survey.updateQuestionCssClasses event to override css classes for a question.
* @see SurveyModel.updateQuestionCssClasses
*/
get: function () {
var surveyCss = this.css;
var classes = { error: {} };
this.copyCssClasses(classes, surveyCss.question);
this.copyCssClasses(classes.error, surveyCss.error);
this.updateCssClasses(classes, surveyCss);
if (this.survey) {
this.survey.updateQuestionCssClasses(this, classes);
}
return classes;
},
enumerable: true,
configurable: true
});
QuestionBase.prototype.getRootCss = function (classes) { return classes.question.root; };
QuestionBase.prototype.updateCssClasses = function (res, surveyCss) {
var objCss = surveyCss[this.getType()];
if (objCss === undefined || objCss === null)
return;
if (typeof objCss === 'string' || objCss instanceof String) {
res.root = objCss;
}
else {
for (var key in objCss) {
res[key] = objCss[key];
}
}
};
QuestionBase.prototype.copyCssClasses = function (dest, source) {
if (!source)
return;
if (typeof source === 'string' || source instanceof String) {
dest["root"] = source;
}
else {
for (var key in source) {
dest[key] = source[key];
}
}
};
Object.defineProperty(QuestionBase.prototype, "css", {
get: function () { return __WEBPACK_IMPORTED_MODULE_4__defaultCss_cssstandard__["b" /* surveyCss */].getCss(); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "width", {
/**
* Use it to set the specific width to the question.
*/
get: function () { return this.getPropertyValue("width", ""); },
set: function (val) { this.setPropertyValue("width", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "renderWidth", {
/**
* The rendered width of the question.
*/
get: function () { return this.getPropertyValue("renderWidth", ""); },
set: function (val) { this.setPropertyValue("renderWidth", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "indent", {
/**
* Set it different from 0 to increase the left padding.
*/
get: function () { return this.getPropertyValue("indent", 0); },
set: function (val) { this.setPropertyValue("indent", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "rightIndent", {
/**
* Set it different from 0 to increase the right padding.
*/
get: function () { return this.getPropertyValue("rightIndent", 0); },
set: function (val) { this.setPropertyValue("rightIndent", val); },
enumerable: true,
configurable: true
});
/**
* Focus the question input.
* @param onError Focus if there is an error.
*/
QuestionBase.prototype.focus = function (onError) {
if (onError === void 0) { onError = false; }
};
QuestionBase.prototype.fireCallback = function (callback) {
if (callback)
callback();
};
QuestionBase.prototype.onCreating = function () { };
/**
* Run visibleIf and enableIf expressions. If visibleIf or/and enabledIf are not empty, then the results of performing the expression (true or false) set to the visible/readOnly properties.
* @param values Typically survey results
* @see visible
* @see visibleIf
* @see readOnly
* @see enableIf
*/
QuestionBase.prototype.runCondition = function (values) {
if (!this.visibleIf)
return;
if (!this.conditionRunner)
this.conditionRunner = new __WEBPACK_IMPORTED_MODULE_3__conditions__["a" /* ConditionRunner */](this.visibleIf);
this.conditionRunner.expression = this.visibleIf;
this.visible = this.conditionRunner.run(values);
};
//IQuestion
QuestionBase.prototype.onSurveyValueChanged = function (newValue) {
};
QuestionBase.prototype.onSurveyLoad = function () {
this.fireCallback(this.surveyLoadCallback);
};
QuestionBase.prototype.setVisibleIndex = function (val) {
if (this.visibleIndex == val)
return 1;
this.setPropertyValue("visibleIndex", val);
return 1;
};
QuestionBase.prototype.removeElement = function (element) { return false; };
QuestionBase.prototype.supportGoNextPageAutomatic = function () { return false; };
QuestionBase.prototype.clearUnusedValues = function () { };
Object.defineProperty(QuestionBase.prototype, "displayValue", {
get: function () {
return "";
},
enumerable: true,
configurable: true
});
QuestionBase.prototype.onLocaleChanged = function () {
_super.prototype.onLocaleChanged.call(this);
this.localeChanged.fire(this, this.getLocale());
};
QuestionBase.prototype.onReadOnlyChanged = function () { };
QuestionBase.prototype.onAnyValueChanged = function (name) { };
//ILocalizableOwner
/**
* Returns the current survey locale
* @see SurveyModel.locale
*/
QuestionBase.prototype.getLocale = function () { return this.survey ? this.survey.getLocale() : ""; };
QuestionBase.prototype.getMarkdownHtml = function (text) { return this.survey ? this.survey.getMarkdownHtml(text) : null; };
return QuestionBase;
}(__WEBPACK_IMPORTED_MODULE_1__base__["a" /* SurveyElement */]));
QuestionBase.questionCounter = 100;
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("questionbase", ["!name", { name: "visible:boolean", default: true }, "visibleIf:condition",
{ name: "width" }, { name: "startWithNewLine:boolean", default: true }, { name: "indent:number", default: 0, choices: [0, 1, 2, 3] }]);
/***/ }),
/* 26 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyNavigationBase; });
var SurveyNavigationBase = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyNavigationBase, _super);
function SurveyNavigationBase(props) {
var _this = _super.call(this, props) || this;
_this.updateStateFunction = null;
_this.survey = props.survey;
_this.css = props.css;
_this.state = { update: 0 };
return _this;
}
SurveyNavigationBase.prototype.componentWillReceiveProps = function (nextProps) {
this.survey = nextProps.survey;
this.css = nextProps.css;
};
SurveyNavigationBase.prototype.componentDidMount = function () {
if (this.survey) {
var self = this;
this.updateStateFunction = function () {
self.state.update = self.state.update + 1;
self.setState(self.state);
};
this.survey.onPageVisibleChanged.add(this.updateStateFunction);
}
};
SurveyNavigationBase.prototype.componentWillUnmount = function () {
if (this.survey && this.updateStateFunction) {
this.survey.onPageVisibleChanged.remove(this.updateStateFunction);
this.updateStateFunction = null;
}
};
return SurveyNavigationBase;
}(__WEBPACK_IMPORTED_MODULE_1_react__["Component"]));
/***/ }),
/* 27 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestion__ = __webpack_require__(28);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionelement__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyPage; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return SurveyPanel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyRow; });
var SurveyPage = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyPage, _super);
function SurveyPage(props) {
var _this = _super.call(this, props) || this;
_this.page = props.page;
_this.survey = props.survey;
_this.creator = props.creator;
_this.css = props.css;
return _this;
}
SurveyPage.prototype.componentWillReceiveProps = function (nextProps) {
this.page = nextProps.page;
this.survey = nextProps.survey;
this.creator = nextProps.creator;
this.css = nextProps.css;
};
SurveyPage.prototype.componentDidMount = function () {
var el = this.refs["root"];
if (el && this.survey)
this.survey.afterRenderPage(el);
};
SurveyPage.prototype.render = function () {
if (this.page == null || this.survey == null || this.creator == null)
return null;
var title = this.renderTitle();
var description = this.renderDescription();
var rows = [];
var questionRows = this.page.rows;
for (var i = 0; i < questionRows.length; i++) {
rows.push(this.createRow(questionRows[i], i));
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: "root" },
title,
description,
rows));
};
SurveyPage.prototype.createRow = function (row, index) {
var rowName = "row" + (index + 1);
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyRow, { key: rowName, row: row, survey: this.survey, creator: this.creator, css: this.css });
};
SurveyPage.prototype.renderTitle = function () {
if (!this.page.title || !this.survey.showPageTitles)
return null;
var text = __WEBPACK_IMPORTED_MODULE_3__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.page.locTitle);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("h4", { className: this.css.pageTitle }, text));
};
SurveyPage.prototype.renderDescription = function () {
if (!this.page.description || !this.survey.showPageTitles)
return null;
var text = __WEBPACK_IMPORTED_MODULE_3__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.page.locDescription);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.pageDescription }, text));
};
return SurveyPage;
}(__WEBPACK_IMPORTED_MODULE_1_react__["Component"]));
var SurveyPanel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyPanel, _super);
function SurveyPanel(props) {
var _this = _super.call(this, props) || this;
_this.panel = props.panel;
_this.survey = props.survey;
_this.creator = props.creator;
_this.css = props.css;
_this.state = { modelChanged: 0 };
return _this;
}
SurveyPanel.prototype.componentWillReceiveProps = function (nextProps) {
this.panel = nextProps.panel;
this.survey = nextProps.survey;
this.creator = nextProps.creator;
this.css = nextProps.css;
};
SurveyPanel.prototype.componentDidMount = function () {
var self = this;
var el = this.refs['root'];
if (el && this.survey) {
this.survey.afterRenderPanel(this.panel, el);
}
this.panel.registerFunctionOnPropertiesValueChanged(["isVisible", "renderWidth", "innerIndent", "rightIndent"], function () {
self.state.modelChanged = self.state.modelChanged + 1;
self.setState(self.state);
}, "react");
};
SurveyPanel.prototype.componentWillUnmount = function () {
if (this.panel) {
this.panel.unRegisterFunctionOnPropertiesValueChanged(["isVisible", "renderWidth", "innerIndent", "rightIndent"], "react");
}
};
SurveyPanel.prototype.render = function () {
if (this.panel == null || this.survey == null || this.creator == null)
return null;
if (!this.panel.isVisible)
return null;
var title = this.renderTitle();
var description = this.renderDescription();
var rows = [];
var questionRows = this.panel.rows;
for (var i = 0; i < questionRows.length; i++) {
rows.push(this.createRow(questionRows[i], i));
}
var style = { "paddingLeft": this.panel.innerIndent * this.css.question.indent + 'px' };
var rootStyle = {};
if (this.panel.renderWidth)
rootStyle["width"] = this.panel.renderWidth;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: "root", className: this.css.panel.container, style: rootStyle },
title,
description,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { style: style }, rows)));
};
SurveyPanel.prototype.createRow = function (row, index) {
var rowName = "row" + (index + 1);
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyRow, { key: rowName, row: row, survey: this.survey, creator: this.creator, css: this.css });
};
SurveyPanel.prototype.renderTitle = function () {
if (!this.panel.title)
return null;
var text = __WEBPACK_IMPORTED_MODULE_3__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.panel.locTitle);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("h4", { className: this.css.panel.title }, text));
};
SurveyPanel.prototype.renderDescription = function () {
if (!this.panel.description)
return null;
var text = __WEBPACK_IMPORTED_MODULE_3__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.panel.locDescription);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.panel.description }, text));
};
return SurveyPanel;
}(__WEBPACK_IMPORTED_MODULE_1_react__["Component"]));
var SurveyRow = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyRow, _super);
function SurveyRow(props) {
var _this = _super.call(this, props) || this;
_this.setProperties(props);
return _this;
}
SurveyRow.prototype.componentWillReceiveProps = function (nextProps) {
this.setProperties(nextProps);
};
SurveyRow.prototype.setProperties = function (props) {
this.row = props.row;
if (this.row) {
var self = this;
this.row.visibilityChangedCallback = function () { self.setState({ visible: self.row.visible }); };
}
this.survey = props.survey;
this.creator = props.creator;
this.css = props.css;
};
SurveyRow.prototype.render = function () {
if (this.row == null || this.survey == null || this.creator == null)
return null;
var questions = null;
if (this.row.visible) {
questions = [];
for (var i = 0; i < this.row.elements.length; i++) {
var question = this.row.elements[i];
questions.push(this.createQuestion(question));
}
}
var style = this.row.visible ? {} : { display: "none" };
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.row, style: style }, questions));
};
SurveyRow.prototype.createQuestion = function (question) {
if (question.isPanel) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyPanel, { key: question.name, panel: question, creator: this.creator, survey: this.survey, css: this.css });
}
else {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_2__reactquestion__["a" /* SurveyQuestion */], { key: question.name, question: question, creator: this.creator, css: this.css });
}
};
return SurveyRow;
}(__WEBPACK_IMPORTED_MODULE_1_react__["Component"]));
/***/ }),
/* 28 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__ = __webpack_require__(14);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionelement__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__custom_widget__ = __webpack_require__(36);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestion; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionErrors; });
var SurveyQuestion = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestion, _super);
function SurveyQuestion(props) {
var _this = _super.call(this, props) || this;
_this.setQuestion(props.question);
_this.state = _this.getState();
_this.creator = props.creator;
return _this;
}
SurveyQuestion.prototype.componentWillReceiveProps = function (nextProps) {
this.creator = nextProps.creator;
this.setQuestion(nextProps.question);
this.setState(this.getState());
};
SurveyQuestion.prototype.setQuestion = function (question) {
this.questionBase = question;
this.question = question instanceof __WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */] ? question : null;
};
SurveyQuestion.prototype.getState = function () {
var value = this.question ? this.question.value : null;
return {
visible: this.questionBase.visible, value: value, error: 0, renderWidth: 0,
visibleIndexValue: -1, isReadOnly: this.questionBase.isReadOnly
};
};
SurveyQuestion.prototype.componentDidMount = function () {
if (this.questionBase) {
var self = this;
this.questionBase["react"] = self;
this.questionBase.registerFunctionOnPropertiesValueChanged(["renderWidth", "indent", "rightIndent"], function () {
self.state.renderWidth = self.state.renderWidth + 1;
self.setState(self.state);
}, "react");
this.questionBase.registerFunctionOnPropertyValueChanged("visibleIndex", function () {
self.state.visibleIndexValue = self.questionBase.visibleIndex;
self.setState(self.state);
}, "react");
this.questionBase.registerFunctionOnPropertyValueChanged("isReadOnly", function () {
self.state.isReadOnly = self.questionBase.isReadOnly;
self.setState(self.state);
}, "react");
var el = this.refs["root"];
if (el && this.questionBase.survey)
this.questionBase.survey.afterRenderQuestion(this.questionBase, el);
}
};
SurveyQuestion.prototype.componentWillUnmount = function () {
if (this.questionBase) {
this.questionBase["react"] = null;
this.questionBase.unRegisterFunctionOnPropertiesValueChanged(["visibleIndex", "renderWidth", "indent", "rightIndent, isReadOnly"], "react");
}
};
SurveyQuestion.prototype.render = function () {
if (!this.questionBase || !this.creator)
return null;
if (!this.questionBase.visible)
return null;
var cssClasses = this.questionBase.cssClasses;
var questionRender = this.renderQuestion();
var title = this.questionBase.hasTitle ? this.renderTitle(cssClasses) : null;
var description = this.renderDescription(cssClasses);
var titleTop = (this.question && this.question.titleLocation == "top") ? title : null;
var titleBottom = (this.question && this.question.titleLocation == "bottom") ? title : null;
var titleLeft = (this.question && this.question.titleLocation == "left") ? title : null;
var titleLeftClass = (this.question && this.question.titleLocation === 'left') ? "title-left" : null;
var contentLeftClass = (this.question && this.question.titleLocation === 'left') ? "content-left" : null;
var descriptionLeft = (this.question && this.question.titleLocation == "left") ? description : null;
var descriptionTop = (this.question && this.question.titleLocation == "top") ? description : null;
var descriptionBottom = (this.question && this.question.titleLocation == "bottom") ? description : null;
var comment = (this.question && this.question.hasComment) ? this.renderComment(cssClasses) : null;
var errors = this.renderErrors(cssClasses);
var errorsTop = this.creator.questionErrorLocation() == "top" ? errors : null;
var errorsBottom = this.creator.questionErrorLocation() == "bottom" ? errors : null;
var paddingLeft = (this.questionBase.indent > 0) ? this.questionBase.indent * cssClasses.indent + "px" : null;
var paddingRight = (this.questionBase.rightIndent > 0) ? this.questionBase.rightIndent * cssClasses.indent + "px" : null;
var rootStyle = {};
if (this.questionBase.renderWidth)
rootStyle["width"] = this.questionBase.renderWidth;
if (paddingLeft)
rootStyle["paddingLeft"] = paddingLeft;
if (paddingRight)
rootStyle["paddingRight"] = paddingRight;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: "root", id: this.questionBase.id, className: cssClasses.mainRoot, style: rootStyle },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: titleLeftClass },
titleTop,
descriptionTop,
titleLeft,
descriptionLeft),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: contentLeftClass },
errorsTop,
questionRender,
comment,
errorsBottom,
titleBottom,
descriptionBottom)));
};
SurveyQuestion.prototype.renderQuestion = function () {
var customWidget = this.questionBase.customWidget;
if (!customWidget) {
return this.creator.createQuestionElement(this.questionBase);
}
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_5__custom_widget__["a" /* SurveyCustomWidget */], { creator: this.creator, question: this.questionBase });
};
SurveyQuestion.prototype.renderTitle = function (cssClasses) {
var titleText = __WEBPACK_IMPORTED_MODULE_4__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.question.locTitle);
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("h5", { className: cssClasses.title }, titleText);
};
SurveyQuestion.prototype.renderDescription = function (cssClasses) {
if (!this.questionBase.hasDescription)
return null;
var descriptionText = __WEBPACK_IMPORTED_MODULE_4__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.question.locDescription);
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.description }, descriptionText);
};
SurveyQuestion.prototype.renderComment = function (cssClasses) {
var commentText = __WEBPACK_IMPORTED_MODULE_4__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.question.locCommentText);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null, commentText),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__["a" /* SurveyQuestionCommentItem */], { question: this.question, cssClasses: cssClasses })));
};
SurveyQuestion.prototype.renderErrors = function (cssClasses) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionErrors, { question: this.question, cssClasses: cssClasses, creator: this.creator });
};
return SurveyQuestion;
}(__WEBPACK_IMPORTED_MODULE_1_react__["Component"]));
var SurveyQuestionErrors = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionErrors, _super);
function SurveyQuestionErrors(props) {
var _this = _super.call(this, props) || this;
_this.setQuestion(props.question);
_this.state = _this.getState();
_this.creator = props.creator;
return _this;
}
SurveyQuestionErrors.prototype.componentWillReceiveProps = function (nextProps) {
this.setQuestion(nextProps.question);
this.setState(this.getState());
this.creator = nextProps.creator;
};
SurveyQuestionErrors.prototype.setQuestion = function (question) {
var _this = this;
this.question = question instanceof __WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */] ? question : null;
if (this.question) {
this.question.errorsChangedCallback = function () {
_this.setState(_this.getState(_this.state));
};
}
};
SurveyQuestionErrors.prototype.getState = function (prevState) {
if (prevState === void 0) { prevState = null; }
return !prevState ? { error: 0 } : { error: prevState.error + 1 };
};
SurveyQuestionErrors.prototype.render = function () {
if (!this.question || this.question.errors.length == 0)
return null;
var errors = [];
for (var i = 0; i < this.question.errors.length; i++) {
var errorText = this.question.errors[i].getText();
var key = "error" + i;
errors.push(this.creator.renderError(key, errorText, this.cssClasses));
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { role: "alert", className: this.cssClasses.error.root }, errors));
};
return SurveyQuestionErrors;
}(__WEBPACK_IMPORTED_MODULE_4__reactquestionelement__["c" /* ReactSurveyElement */]));
/***/ }),
/* 29 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__error__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(3);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return ValidatorResult; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return SurveyValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ValidatorRunner; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return NumericValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return TextValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return AnswerCountValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return RegexValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return EmailValidator; });
var ValidatorResult = (function () {
function ValidatorResult(value, error) {
if (error === void 0) { error = null; }
this.value = value;
this.error = error;
}
return ValidatorResult;
}());
/**
* Base SurveyJS validator class.
*/
var SurveyValidator = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyValidator, _super);
function SurveyValidator() {
var _this = _super.call(this) || this;
_this.text = "";
return _this;
}
SurveyValidator.prototype.getErrorText = function (name) {
if (this.text)
return this.text;
return this.getDefaultErrorText(name);
};
SurveyValidator.prototype.getDefaultErrorText = function (name) {
return "";
};
SurveyValidator.prototype.validate = function (value, name) {
if (name === void 0) { name = null; }
return null;
};
return SurveyValidator;
}(__WEBPACK_IMPORTED_MODULE_1__base__["c" /* Base */]));
var ValidatorRunner = (function () {
function ValidatorRunner() {
}
ValidatorRunner.prototype.run = function (owner) {
for (var i = 0; i < owner.validators.length; i++) {
var validatorResult = owner.validators[i].validate(owner.validatedValue, owner.getValidatorTitle());
if (validatorResult != null) {
if (validatorResult.error)
return validatorResult.error;
if (validatorResult.value) {
owner.validatedValue = validatorResult.value;
}
}
}
return null;
};
return ValidatorRunner;
}());
/**
* Validate numeric values.
*/
var NumericValidator = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](NumericValidator, _super);
function NumericValidator(minValue, maxValue) {
if (minValue === void 0) { minValue = null; }
if (maxValue === void 0) { maxValue = null; }
var _this = _super.call(this) || this;
_this.minValue = minValue;
_this.maxValue = maxValue;
return _this;
}
NumericValidator.prototype.getType = function () { return "numericvalidator"; };
NumericValidator.prototype.validate = function (value, name) {
if (name === void 0) { name = null; }
if (!this.isNumber(value)) {
return new ValidatorResult(null, new __WEBPACK_IMPORTED_MODULE_2__error__["b" /* RequreNumericError */]());
}
var result = new ValidatorResult(parseFloat(value));
if (this.minValue !== null && this.minValue > result.value) {
result.error = new __WEBPACK_IMPORTED_MODULE_2__error__["c" /* CustomError */](this.getErrorText(name));
return result;
}
if (this.maxValue !== null && this.maxValue < result.value) {
result.error = new __WEBPACK_IMPORTED_MODULE_2__error__["c" /* CustomError */](this.getErrorText(name));
return result;
}
return (typeof value === 'number') ? null : result;
};
NumericValidator.prototype.getDefaultErrorText = function (name) {
var vName = name ? name : __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("value");
if (this.minValue !== null && this.maxValue !== null) {
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("numericMinMax")["format"](vName, this.minValue, this.maxValue);
}
else {
if (this.minValue !== null) {
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("numericMin")["format"](vName, this.minValue);
}
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("numericMax")["format"](vName, this.maxValue);
}
};
NumericValidator.prototype.isNumber = function (value) {
return !isNaN(parseFloat(value)) && isFinite(value);
};
return NumericValidator;
}(SurveyValidator));
/**
* Validate text values
*/
var TextValidator = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](TextValidator, _super);
function TextValidator(minLength, maxLength) {
if (minLength === void 0) { minLength = 0; }
if (maxLength === void 0) { maxLength = 0; }
var _this = _super.call(this) || this;
_this.minLength = minLength;
_this.maxLength = maxLength;
return _this;
}
TextValidator.prototype.getType = function () { return "textvalidator"; };
TextValidator.prototype.validate = function (value, name) {
if (name === void 0) { name = null; }
if (this.minLength > 0 && value.length < this.minLength) {
return new ValidatorResult(null, new __WEBPACK_IMPORTED_MODULE_2__error__["c" /* CustomError */](this.getErrorText(name)));
}
if (this.maxLength > 0 && value.length > this.maxLength) {
return new ValidatorResult(null, new __WEBPACK_IMPORTED_MODULE_2__error__["c" /* CustomError */](this.getErrorText(name)));
}
return null;
};
TextValidator.prototype.getDefaultErrorText = function (name) {
if (this.minLength > 0 && this.maxLength > 0)
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("textMinMaxLength")["format"](this.minLength, this.maxLength);
if (this.minLength > 0)
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("textMinLength")["format"](this.minLength);
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("textMaxLength")["format"](this.maxLength);
};
return TextValidator;
}(SurveyValidator));
var AnswerCountValidator = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](AnswerCountValidator, _super);
function AnswerCountValidator(minCount, maxCount) {
if (minCount === void 0) { minCount = null; }
if (maxCount === void 0) { maxCount = null; }
var _this = _super.call(this) || this;
_this.minCount = minCount;
_this.maxCount = maxCount;
return _this;
}
AnswerCountValidator.prototype.getType = function () { return "answercountvalidator"; };
AnswerCountValidator.prototype.validate = function (value, name) {
if (name === void 0) { name = null; }
if (value == null || value.constructor != Array)
return null;
var count = value.length;
if (this.minCount && count < this.minCount) {
return new ValidatorResult(null, new __WEBPACK_IMPORTED_MODULE_2__error__["c" /* CustomError */](this.getErrorText(__WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("minSelectError")["format"](this.minCount))));
}
if (this.maxCount && count > this.maxCount) {
return new ValidatorResult(null, new __WEBPACK_IMPORTED_MODULE_2__error__["c" /* CustomError */](this.getErrorText(__WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("maxSelectError")["format"](this.maxCount))));
}
return null;
};
AnswerCountValidator.prototype.getDefaultErrorText = function (name) {
return name;
};
return AnswerCountValidator;
}(SurveyValidator));
/**
* Use it to validate the text by regular expressions.
*/
var RegexValidator = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](RegexValidator, _super);
function RegexValidator(regex) {
if (regex === void 0) { regex = null; }
var _this = _super.call(this) || this;
_this.regex = regex;
return _this;
}
RegexValidator.prototype.getType = function () { return "regexvalidator"; };
RegexValidator.prototype.validate = function (value, name) {
if (name === void 0) { name = null; }
if (!this.regex || !value)
return null;
var re = new RegExp(this.regex);
if (Array.isArray(value)) {
for (var i = 0; i < value.length; i++) {
var res = this.hasError(re, value[i], name);
if (res)
return res;
}
}
return this.hasError(re, value, name);
;
};
RegexValidator.prototype.hasError = function (re, value, name) {
if (re.test(value))
return null;
return new ValidatorResult(value, new __WEBPACK_IMPORTED_MODULE_2__error__["c" /* CustomError */](this.getErrorText(name)));
};
return RegexValidator;
}(SurveyValidator));
/**
* Validate e-mail address in the text input
*/
var EmailValidator = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](EmailValidator, _super);
function EmailValidator() {
var _this = _super.call(this) || this;
_this.re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
return _this;
}
EmailValidator.prototype.getType = function () { return "emailvalidator"; };
EmailValidator.prototype.validate = function (value, name) {
if (name === void 0) { name = null; }
if (!value)
return null;
if (this.re.test(value))
return null;
return new ValidatorResult(value, new __WEBPACK_IMPORTED_MODULE_2__error__["c" /* CustomError */](this.getErrorText(name)));
};
EmailValidator.prototype.getDefaultErrorText = function (name) {
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("invalidEmail");
};
return EmailValidator;
}(SurveyValidator));
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* JsonObject */].metaData.addClass("surveyvalidator", ["text"]);
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* JsonObject */].metaData.addClass("numericvalidator", ["minValue:number", "maxValue:number"], function () { return new NumericValidator(); }, "surveyvalidator");
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* JsonObject */].metaData.addClass("textvalidator", ["minLength:number", "maxLength:number"], function () { return new TextValidator(); }, "surveyvalidator");
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* JsonObject */].metaData.addClass("answercountvalidator", ["minCount:number", "maxCount:number"], function () { return new AnswerCountValidator(); }, "surveyvalidator");
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* JsonObject */].metaData.addClass("regexvalidator", ["regex"], function () { return new RegexValidator(); }, "surveyvalidator");
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* JsonObject */].metaData.addClass("emailvalidator", [], function () { return new EmailValidator(); }, "surveyvalidator");
/***/ }),
/* 30 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactSurvey__ = __webpack_require__(20);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactsurveymodel__ = __webpack_require__(19);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionelement__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyWindow; });
var SurveyWindow = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyWindow, _super);
function SurveyWindow(props) {
var _this = _super.call(this, props) || this;
_this.handleOnExpanded = _this.handleOnExpanded.bind(_this);
return _this;
}
SurveyWindow.prototype.componentWillReceiveProps = function (nextProps) {
this.updateSurvey(nextProps);
};
SurveyWindow.prototype.handleOnExpanded = function (event) {
this.window.isExpanded = !this.window.isExpanded;
};
SurveyWindow.prototype.render = function () {
if (!this.window.isShowing)
return null;
var header = this.renderHeader();
var body = this.window.isExpanded ? this.renderBody() : null;
var style = { position: "fixed", bottom: 3, right: 10 };
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.window.root, style: style },
header,
body);
};
SurveyWindow.prototype.renderHeader = function () {
var styleA = { width: '100%', cursor: 'pointer' };
var styleTitle = { paddingRight: "10px" };
var glyphClassName = this.window.isExpanded ? this.css.window.header.buttonCollapsed : this.css.window.header.buttonExpanded;
glyphClassName = "glyphicon pull-right " + glyphClassName;
var title = __WEBPACK_IMPORTED_MODULE_4__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.survey.locTitle);
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.window.header.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { onClick: this.handleOnExpanded, style: styleA },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.css.window.header.title, style: styleTitle }, title),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: glyphClassName, "aria-hidden": "true" })));
};
SurveyWindow.prototype.renderBody = function () {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.window.body }, this.renderSurvey());
};
SurveyWindow.prototype.updateSurvey = function (newProps) {
if (!newProps)
newProps = {};
if (newProps.window) {
this.window = newProps.window;
}
else {
if (newProps.json) {
this.window = new __WEBPACK_IMPORTED_MODULE_3__reactsurveymodel__["b" /* ReactWindowModel */](newProps.json);
}
else {
if (newProps.model) {
this.window = new __WEBPACK_IMPORTED_MODULE_3__reactsurveymodel__["b" /* ReactWindowModel */](null, newProps.model);
}
}
}
if (!this.window) {
this.window = new __WEBPACK_IMPORTED_MODULE_3__reactsurveymodel__["b" /* ReactWindowModel */]();
}
newProps.model = this.window.survey;
if (newProps.expanded || newProps.isExpanded)
this.window.expand();
this.window.isShowing = true;
_super.prototype.updateSurvey.call(this, newProps);
this.setState({ expanded: this.window.isExpanded, isShowing: this.window.isShowing });
var self = this;
this.window.expandedChangedCallback = function () {
self.state.expanded = self.window.isExpanded;
self.setState(self.state);
};
this.window.showingChangedCallback = function () {
self.state.isShowing = self.window.isShowing;
self.setState(self.state);
};
this.survey.onComplete.add(function (s) {
self.window.hide();
});
};
return SurveyWindow;
}(__WEBPACK_IMPORTED_MODULE_2__reactSurvey__["a" /* Survey */]));
/***/ }),
/* 31 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__conditions__ = __webpack_require__(12);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ConditionsParser; });
var ConditionsParser = (function () {
function ConditionsParser() {
}
ConditionsParser.prototype.parse = function (text, root) {
this.setProperties(text, root);
return this.parseText();
};
ConditionsParser.prototype.parseExpression = function (text) {
this.setProperties(text, new __WEBPACK_IMPORTED_MODULE_0__conditions__["b" /* ConditionNode */]());
return this.readExpressionOperand();
};
ConditionsParser.prototype.setProperties = function (text, root) {
this.text = text;
this.at = 0;
this.length = this.text.length;
this.root = root;
this.root.clear();
this.node = this.root;
this.expressionNodes = [];
this.expressionNodes.push(this.node);
};
ConditionsParser.prototype.toString = function (root) { return root.toString(); };
ConditionsParser.prototype.parseText = function () {
var res = this.readConditions();
return res && this.at >= this.length;
};
ConditionsParser.prototype.readConditions = function () {
var res = this.readCondition();
if (!res)
return res;
var connective = this.readConnective();
if (connective) {
this.addConnective(connective);
return this.readConditions();
}
return true;
};
ConditionsParser.prototype.readCondition = function () {
var expRes = this.readExpression();
if (expRes < 0)
return false;
if (expRes == 1)
return true;
var left = this.readExpressionOperand();
if (!left)
return false;
var op = this.readOperator();
if (!op) {
if (left.isBoolean) {
var c = new __WEBPACK_IMPORTED_MODULE_0__conditions__["c" /* Condition */]();
c.left = left;
this.addCondition(c);
return true;
}
return false;
}
var c = new __WEBPACK_IMPORTED_MODULE_0__conditions__["c" /* Condition */]();
c.left = left;
c.operator = op;
if (!__WEBPACK_IMPORTED_MODULE_0__conditions__["c" /* Condition */].isNoRightOperation(op)) {
var right = this.readExpressionOperand();
if (!right)
return false;
c.right = right;
}
this.addCondition(c);
return true;
};
ConditionsParser.prototype.readOperand = function () {
var str = this.readString();
if (!str)
return null;
var params = this.readParameters();
if (params) {
var res = new __WEBPACK_IMPORTED_MODULE_0__conditions__["d" /* FunctionOperand */](str);
res.parameters = params;
return res;
}
return new __WEBPACK_IMPORTED_MODULE_0__conditions__["e" /* Operand */](str);
};
ConditionsParser.prototype.readExpression = function () {
this.skip();
if (this.at >= this.length || this.ch != '(')
return 0;
this.at++;
this.pushExpression();
var res = this.readConditions();
if (res) {
this.skip();
res = this.ch == ')';
this.at++;
this.popExpression();
return 1;
}
return -1;
};
ConditionsParser.prototype.readExpressionOperand = function (prevExpr, stack) {
if (prevExpr === void 0) { prevExpr = null; }
if (stack === void 0) { stack = null; }
this.skip();
if (this.at >= this.length)
return null;
var isOpenBracket = this.isOpenBracket(this.ch);
if (isOpenBracket) {
this.at++;
this.pushExpression();
}
var a = this.readOperand();
if (!a)
return null;
var operator = this.readOperandOperator();
if (!operator) {
if (prevExpr != null) {
prevExpr.right = a;
a = prevExpr;
}
if (this.isCloseBracket(this.ch)) {
prevExpr = stack && stack.length > 0 ? stack.pop() : null;
var saveAt = this.at;
this.at++;
operator = this.readOperandOperator();
var doPopExpression = operator || (prevExpr && prevExpr["isOpenBracket"]);
if (!operator) {
this.at = saveAt + (doPopExpression ? 1 : 0);
}
if (doPopExpression) {
this.popExpression();
}
}
if (operator) {
var expr = new __WEBPACK_IMPORTED_MODULE_0__conditions__["f" /* ExpressionOperand */]();
expr.left = prevExpr ? prevExpr : a;
expr.operator = operator;
return this.readExpressionOperand(expr, stack);
}
return a;
}
var expr = new __WEBPACK_IMPORTED_MODULE_0__conditions__["f" /* ExpressionOperand */]();
expr["isOpenBracket"] = isOpenBracket;
expr.left = a;
expr.operator = operator;
if (!stack) {
stack = [];
}
if (stack.length == 0 || isOpenBracket) {
stack.push(expr);
}
if (prevExpr) {
if (!isOpenBracket && (this.isHighPriorityOperand(prevExpr.operator) || !this.isHighPriorityOperand(operator))) {
prevExpr.right = a;
expr.left = prevExpr;
var index = stack.indexOf(prevExpr);
if (index > -1) {
stack[index] = expr;
}
}
else {
prevExpr.right = this.readExpressionOperand(expr, stack);
return prevExpr;
}
}
return this.readExpressionOperand(expr, stack);
};
Object.defineProperty(ConditionsParser.prototype, "ch", {
get: function () { return this.text.charAt(this.at); },
enumerable: true,
configurable: true
});
ConditionsParser.prototype.skip = function () {
while (this.at < this.length && this.isSpace(this.ch))
this.at++;
};
ConditionsParser.prototype.isSpace = function (c) {
return c == ' ' || c == '\n' || c == '\t' || c == '\r';
};
ConditionsParser.prototype.isQuotes = function (c) {
return c == "'" || c == '"';
};
ConditionsParser.prototype.isComma = function (c) { return c == ','; };
ConditionsParser.prototype.isOperatorChar = function (c) {
return c == '>' || c == '<' || c == '=' || c == '!' || c == '+' || c == '-' || c == '*' || c == '/';
};
ConditionsParser.prototype.isOpenBracket = function (c) { return c == '('; };
ConditionsParser.prototype.isCloseBracket = function (c) { return c == ')'; };
ConditionsParser.prototype.isBrackets = function (c) {
return this.isOpenBracket(c) || this.isCloseBracket(c);
};
ConditionsParser.prototype.readString = function () {
this.skip();
if (this.at >= this.length)
return null;
var start = this.at;
var hasQuotes = this.isQuotes(this.ch);
var hasBraces = this.ch == '{';
if (hasQuotes)
this.at++;
var isFirstOpCh = this.isOperatorChar(this.ch);
while (this.at < this.length) {
if (!hasQuotes && this.isSpace(this.ch))
break;
if (this.isQuotes(this.ch)) {
if (hasQuotes)
this.at++;
break;
}
if (!hasQuotes) {
if ((!hasBraces || this.ch != '-') && isFirstOpCh != this.isOperatorChar(this.ch))
break;
if (this.isBrackets(this.ch) || this.isComma(this.ch))
break;
}
this.at++;
}
if (this.at <= start)
return null;
var res = this.text.substr(start, this.at - start);
if (res) {
if (res.length > 1 && this.isQuotes(res[0])) {
var len = res.length - 1;
if (this.isQuotes(res[res.length - 1]))
len--;
res = res.substr(1, len);
}
}
return res;
};
ConditionsParser.prototype.readParameters = function () {
if (!this.isOpenBracket(this.ch))
return null;
var params = [];
while (this.at < this.length && !this.isCloseBracket(this.ch)) {
this.at++;
var operand = this.readOperand();
if (operand) {
params.push(operand);
}
}
this.at++;
return params;
};
ConditionsParser.prototype.isHighPriorityOperand = function (op) { return op == "*" || op == "/"; };
ConditionsParser.prototype.readOperandOperator = function () {
this.skip();
if (this.ch == '+' || this.ch == '-' || this.ch == '*' || this.ch == '/') {
var res = this.ch;
this.at++;
return res;
}
return null;
};
ConditionsParser.prototype.readOperator = function () {
this.skip();
var curAt = this.at;
var op = this.readString();
if (!op)
return null;
op = op.toLowerCase();
if (op == '>')
op = "greater";
if (op == '<')
op = "less";
if (op == '>=' || op == '=>')
op = "greaterorequal";
if (op == '<=' || op == '=<')
op = "lessorequal";
if (op == '=' || op == '==')
op = "equal";
if (op == '<>' || op == '!=')
op = "notequal";
if (op == 'contain' || op == '*=')
op = "contains";
if (op == 'notcontain')
op = "notcontains";
if (__WEBPACK_IMPORTED_MODULE_0__conditions__["c" /* Condition */].isCorrectOperator(op))
return op;
this.at = curAt;
return null;
};
ConditionsParser.prototype.readConnective = function () {
var con = this.readString();
if (!con)
return null;
con = con.toLowerCase();
if (con == "&" || con == "&&")
con = "and";
if (con == "|" || con == "||")
con = "or";
if (con != "and" && con != "or")
con = null;
return con;
};
ConditionsParser.prototype.pushExpression = function () {
var node = null;
this.expressionNodes.push(node);
this.node = node;
};
ConditionsParser.prototype.makeNodeCondition = function () {
if (!this.node || !this.node.children) {
this.node = new __WEBPACK_IMPORTED_MODULE_0__conditions__["b" /* ConditionNode */]();
this.expressionNodes[this.expressionNodes.length - 1] = this.node;
}
};
ConditionsParser.prototype.popExpression = function () {
var node = this.expressionNodes.pop();
this.node = this.expressionNodes[this.expressionNodes.length - 1];
if (node) {
this.makeNodeCondition();
this.node.children.push(node);
}
};
ConditionsParser.prototype.addCondition = function (c) {
this.makeNodeCondition();
this.node.children.push(c);
};
ConditionsParser.prototype.addConnective = function (con) {
this.makeNodeCondition();
if (this.node.children.length < 2) {
this.node.connective = con;
}
else {
if (this.node.connective != con) {
var oldCon = this.node.connective;
var oldChildren = this.node.children;
this.node.clear();
this.node.connective = con;
var oldNode = new __WEBPACK_IMPORTED_MODULE_0__conditions__["b" /* ConditionNode */]();
oldNode.connective = oldCon;
oldNode.children = oldChildren;
this.node.children.push(oldNode);
var newNode = new __WEBPACK_IMPORTED_MODULE_0__conditions__["b" /* ConditionNode */]();
this.node.children.push(newNode);
this.node = newNode;
}
}
};
return ConditionsParser;
}());
/***/ }),
/* 32 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return dxSurveyService; });
/**
* The class contains methods to work with www.dxsurvey.com service.
*/
var dxSurveyService = (function () {
//public static serviceUrl: string = "http://localhost:50488/api/Survey";
function dxSurveyService() {
}
dxSurveyService.prototype.loadSurvey = function (surveyId, onLoad) {
var xhr = new XMLHttpRequest();
xhr.open('GET', dxSurveyService.serviceUrl + '/getSurvey?surveyId=' + surveyId);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload = function () {
var result = JSON.parse(xhr.response);
onLoad(xhr.status == 200, result, xhr.response);
};
xhr.send();
};
dxSurveyService.prototype.getSurveyJsonAndIsCompleted = function (surveyId, clientId, onLoad) {
var xhr = new XMLHttpRequest();
xhr.open('GET', dxSurveyService.serviceUrl + '/getSurveyAndIsCompleted?surveyId=' + surveyId + '&clientId=' + clientId);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload = function () {
var result = JSON.parse(xhr.response);
var surveyJson = result ? result.survey : null;
var isCompleted = result ? result.isCompleted : null;
onLoad(xhr.status == 200, surveyJson, isCompleted, xhr.response);
};
xhr.send();
};
dxSurveyService.prototype.sendResult = function (postId, result, onSendResult, clientId, isPartialCompleted) {
if (clientId === void 0) { clientId = null; }
if (isPartialCompleted === void 0) { isPartialCompleted = false; }
var xhr = new XMLHttpRequest();
xhr.open('POST', dxSurveyService.serviceUrl + '/post/');
xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
var data = { postId: postId, surveyResult: JSON.stringify(result) };
if (clientId)
data['clientId'] = clientId;
if (isPartialCompleted)
data['isPartialCompleted'] = true;
var dataStringify = JSON.stringify(data);
var self = this;
xhr.onload = xhr.onerror = function () {
if (!onSendResult)
return;
onSendResult(xhr.status == 200, xhr.response);
};
xhr.send(dataStringify);
};
dxSurveyService.prototype.sendFile = function (postId, file, onSendFile) {
var xhr = new XMLHttpRequest();
xhr.onload = xhr.onerror = function () {
if (!onSendFile)
return;
onSendFile(xhr.status == 200, JSON.parse(xhr.response));
};
xhr.open("POST", dxSurveyService.serviceUrl + '/upload/', true);
var formData = new FormData();
formData.append("file", file);
formData.append("postId", postId);
xhr.send(formData);
};
dxSurveyService.prototype.getResult = function (resultId, name, onGetResult) {
var xhr = new XMLHttpRequest();
var data = 'resultId=' + resultId + '&name=' + name;
xhr.open('GET', dxSurveyService.serviceUrl + '/getResult?' + data);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
var self = this;
xhr.onload = function () {
var result = null;
var list = null;
if (xhr.status == 200) {
result = JSON.parse(xhr.response);
list = [];
for (var key in result.QuestionResult) {
var el = { name: key, value: result.QuestionResult[key] };
list.push(el);
}
}
onGetResult(xhr.status == 200, result, list, xhr.response);
};
xhr.send();
};
dxSurveyService.prototype.isCompleted = function (resultId, clientId, onIsCompleted) {
var xhr = new XMLHttpRequest();
var data = 'resultId=' + resultId + '&clientId=' + clientId;
xhr.open('GET', dxSurveyService.serviceUrl + '/isCompleted?' + data);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
var self = this;
xhr.onload = function () {
var result = null;
if (xhr.status == 200) {
result = JSON.parse(xhr.response);
}
onIsCompleted(xhr.status == 200, result, xhr.response);
};
xhr.send();
};
return dxSurveyService;
}());
dxSurveyService.serviceUrl = "https://dxsurveyapi.azurewebsites.net/api/Survey";
/***/ }),
/* 33 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return FunctionFactory; });
var FunctionFactory = (function () {
function FunctionFactory() {
this.functionHash = {};
}
FunctionFactory.prototype.register = function (name, func) {
this.functionHash[name] = func;
};
FunctionFactory.prototype.clear = function () {
this.functionHash = {};
};
FunctionFactory.prototype.getAll = function () {
var result = [];
for (var key in this.functionHash) {
result.push(key);
}
return result.sort();
};
FunctionFactory.prototype.run = function (name, params) {
var func = this.functionHash[name];
if (!func)
return null;
return func(params);
};
return FunctionFactory;
}());
FunctionFactory.Instance = new FunctionFactory();
function sum(params) {
var res = 0;
for (var i = 0; i < params.length; i++) {
res += params[i];
}
return res;
}
FunctionFactory.Instance.register("sum", sum);
function sumInArray(params) {
if (params.length != 2)
return 0;
var arr = params[0];
if (!Array.isArray(arr))
return;
var name = params[1];
if (typeof name !== 'string' && !(name instanceof String))
return 0;
var res = 0;
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
if (item && item[name]) {
res += item[name];
}
}
return res;
}
FunctionFactory.Instance.register("sumInArray", sumInArray);
function age(params) {
if (params.length < 1)
return -1;
var birthDay = new Date(params[0]);
var ageDifMs = Date.now() - birthDay.getTime();
var ageDate = new Date(ageDifMs); // miliseconds from epoch
return Math.abs(ageDate.getUTCFullYear() - 1970);
}
FunctionFactory.Instance.register("age", age);
/***/ }),
/* 34 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__panel__ = __webpack_require__(23);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return PageModel; });
/**
* The page object. It has elements collection, that contains questions and panels.
*/
var PageModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](PageModel, _super);
function PageModel(name) {
if (name === void 0) { name = ""; }
var _this = _super.call(this, name) || this;
_this.name = name;
return _this;
}
PageModel.prototype.getType = function () { return "page"; };
Object.defineProperty(PageModel.prototype, "visibleIndex", {
/**
* The visible index of the page. It has values from 0 to visible page count - 1.
* @see SurveyModel.visiblePages
* @see SurveyModel.pages
*/
get: function () { return this.getPropertyValue("visibleIndex", -1); },
set: function (val) { this.setPropertyValue("visibleIndex", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(PageModel.prototype, "num", {
get: function () { return this.getPropertyValue("num", -1); },
set: function (val) {
if (this.num == val)
return;
this.setPropertyValue("num", val);
this.onNumChanged(val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PageModel.prototype, "navigationButtonsVisibility", {
/**
* Set this property to "hide" to make "Prev", "Next" and "Complete" buttons are invisible for this page. Set this property to "show" to make these buttons visible, even if survey showNavigationButtons property is false.
* @see SurveyMode.showNavigationButtons
*/
get: function () { return this.getPropertyValue("navigationButtonsVisibility", "inherit"); },
set: function (val) {
this.setPropertyValue("navigationButtonsVisibility", val.toLowerCase());
},
enumerable: true,
configurable: true
});
PageModel.prototype.getRenderedTitle = function (str) {
str = _super.prototype.getRenderedTitle.call(this, str);
if (this.num > 0) {
str = this.num + ". " + str;
}
return str;
};
/**
* Call it to focus the input on the first question
*/
PageModel.prototype.focusFirstQuestion = function () {
for (var i = 0; i < this.questions.length; i++) {
var question = this.questions[i];
if (!question.visible || !question.hasInput)
continue;
this.questions[i].focus();
break;
}
};
/**
* Call it to focus the input of the first question that has an error.
*/
PageModel.prototype.focusFirstErrorQuestion = function () {
for (var i = 0; i < this.questions.length; i++) {
if (!this.questions[i].visible || this.questions[i].currentErrorCount == 0)
continue;
this.questions[i].focus(true);
break;
}
};
/**
* Call it to scroll to the page top.
*/
PageModel.prototype.scrollToTop = function () {
__WEBPACK_IMPORTED_MODULE_2__base__["a" /* SurveyElement */].ScrollElementToTop(this.id);
};
Object.defineProperty(PageModel.prototype, "timeSpent", {
/**
* Time in seconds end-user spent on this page
*/
get: function () { return this.getPropertyValue("timeSpent", 0); },
set: function (val) { this.setPropertyValue("timeSpent", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(PageModel.prototype, "maxTimeToFinish", {
/**
* The maximum time in seconds that end-user has to complete the page. If the value is 0 or less, the end-user has unlimited number of time to finish the page.
* @see startTimer
* @see SurveyModel.maxTimeToFinishPage
*/
get: function () { return this.getPropertyValue("maxTimeToFinish", 0); },
set: function (val) { this.setPropertyValue("maxTimeToFinish", val); },
enumerable: true,
configurable: true
});
PageModel.prototype.onNumChanged = function (value) {
};
PageModel.prototype.onVisibleChanged = function () {
_super.prototype.onVisibleChanged.call(this);
if (this.survey != null) {
this.survey.pageVisibilityChanged(this, this.visible);
}
};
return PageModel;
}(__WEBPACK_IMPORTED_MODULE_3__panel__["b" /* PanelModelBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */].metaData.addClass("page", [{ name: "navigationButtonsVisibility", default: "inherit", choices: ["inherit", "show", "hide"] },
{ name: "maxTimeToFinish:number", default: 0 }], function () { return new PageModel(); }, "panelbase");
/***/ }),
/* 35 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base__ = __webpack_require__(7);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionCustomWidget; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return CustomWidgetCollection; });
var QuestionCustomWidget = (function () {
function QuestionCustomWidget(name, widgetJson) {
this.name = name;
this.widgetJson = widgetJson;
this.htmlTemplate = widgetJson.htmlTemplate ? widgetJson.htmlTemplate : "";
}
QuestionCustomWidget.prototype.afterRender = function (question, el) {
if (this.widgetJson.afterRender)
this.widgetJson.afterRender(question, el);
};
QuestionCustomWidget.prototype.willUnmount = function (question, el) {
if (this.widgetJson.willUnmount)
this.widgetJson.willUnmount(question, el);
};
QuestionCustomWidget.prototype.isFit = function (question) {
if (this.isLibraryLoaded() && this.widgetJson.isFit)
return this.widgetJson.isFit(question);
return false;
};
QuestionCustomWidget.prototype.activatedByChanged = function (activatedBy) {
if (this.isLibraryLoaded() && this.widgetJson.activatedByChanged) {
this.widgetJson.activatedByChanged(activatedBy);
}
};
QuestionCustomWidget.prototype.isLibraryLoaded = function () {
if (this.widgetJson.widgetIsLoaded)
return this.widgetJson.widgetIsLoaded() == true;
return true;
};
Object.defineProperty(QuestionCustomWidget.prototype, "isDefaultRender", {
get: function () { return this.widgetJson.isDefaultRender; },
enumerable: true,
configurable: true
});
return QuestionCustomWidget;
}());
var CustomWidgetCollection = (function () {
function CustomWidgetCollection() {
this.widgetsValues = [];
this.widgetsActivatedBy = {};
this.onCustomWidgetAdded = new __WEBPACK_IMPORTED_MODULE_0__base__["b" /* Event */]();
}
Object.defineProperty(CustomWidgetCollection.prototype, "widgets", {
get: function () { return this.widgetsValues; },
enumerable: true,
configurable: true
});
CustomWidgetCollection.prototype.addCustomWidget = function (widgetJson, activatedBy) {
if (activatedBy === void 0) { activatedBy = "property"; }
var name = widgetJson.name;
if (!name) {
name = "widget_" + this.widgets.length + 1;
}
var customWidget = new QuestionCustomWidget(name, widgetJson);
this.widgetsValues.push(customWidget);
this.widgetsActivatedBy[name] = activatedBy;
customWidget.activatedByChanged(activatedBy);
this.onCustomWidgetAdded.fire(customWidget, null);
};
/**
* Returns the way the custom wiget is activated. It can be activated by a property ("property"), question type ("type") or by new/custom question type ("customtype").
* @param widgetName the custom widget name
* @see setActivatedBy
*/
CustomWidgetCollection.prototype.getActivatedBy = function (widgetName) {
var res = this.widgetsActivatedBy[widgetName];
return res ? res : "property";
};
/**
* Sets the way the custom wiget is activated. The activation types are: property ("property"), question type ("type") or new/custom question type ("customtype"). A custom wiget may support all or only some of this activation types.
* @param widgetName
* @param activatedBy there are three possible variants: "property", "type" and "customtype"
*/
CustomWidgetCollection.prototype.setActivatedBy = function (widgetName, activatedBy) {
if (!widgetName || !activatedBy)
return;
var widget = this.getCustomWidgetByName(widgetName);
if (!widget)
return;
this.widgetsActivatedBy[widgetName] = activatedBy;
widget.activatedByChanged(activatedBy);
};
CustomWidgetCollection.prototype.clear = function () { this.widgetsValues = []; };
CustomWidgetCollection.prototype.getCustomWidgetByName = function (name) {
for (var i = 0; i < this.widgets.length; i++) {
if (this.widgets[i].name == name)
return this.widgets[i];
}
return null;
};
CustomWidgetCollection.prototype.getCustomWidget = function (question) {
for (var i = 0; i < this.widgetsValues.length; i++) {
if (this.widgetsValues[i].isFit(question))
return this.widgetsValues[i];
}
return null;
};
return CustomWidgetCollection;
}());
CustomWidgetCollection.Instance = new CustomWidgetCollection();
/***/ }),
/* 36 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyCustomWidget; });
var SurveyCustomWidget = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyCustomWidget, _super);
function SurveyCustomWidget(props) {
var _this = _super.call(this, props) || this;
_this.localeChangedHandler = function (sender) { return sender.customWidgetData.isNeedRender = true; };
return _this;
}
SurveyCustomWidget.prototype._afterRender = function () {
if (this.questionBase.customWidget) {
var el = this.refs['widget'];
if (!!el) {
this.questionBase.customWidget.afterRender(this.questionBase, el);
this.questionBase.customWidgetData.isNeedRender = false;
}
}
};
SurveyCustomWidget.prototype.componentDidMount = function () {
if (this.questionBase) {
this._afterRender();
this.questionBase.localeChanged.add(this.localeChangedHandler);
}
};
SurveyCustomWidget.prototype.componentDidUpdate = function () {
if (this.questionBase) {
this._afterRender();
}
};
SurveyCustomWidget.prototype.componentWillUnmount = function () {
if (this.questionBase.customWidget) {
var el = this.refs['widget'];
if (!!el) {
this.questionBase.customWidget.willUnmount(this.questionBase, el);
}
}
this.questionBase.localeChanged.remove(this.localeChangedHandler);
};
SurveyCustomWidget.prototype.render = function () {
if (!this.questionBase || !this.creator) {
return null;
}
if (!this.questionBase.visible) {
return null;
}
var customWidget = this.questionBase.customWidget;
if (customWidget.isDefaultRender) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: 'widget' }, this.creator.createQuestionElement(this.questionBase));
}
var widget = null;
if (customWidget.widgetJson.render) {
widget = customWidget.widgetJson.render(this.questionBase);
}
else {
if (customWidget.htmlTemplate) {
var htmlValue = { __html: customWidget.htmlTemplate };
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: 'widget', dangerouslySetInnerHTML: htmlValue });
}
}
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: 'widget' }, widget);
};
return SurveyCustomWidget;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
/***/ }),
/* 37 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactSurveyNavigationBase__ = __webpack_require__(26);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyNavigation; });
var SurveyNavigation = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyNavigation, _super);
function SurveyNavigation(props) {
var _this = _super.call(this, props) || this;
_this.handlePrevClick = _this.handlePrevClick.bind(_this);
_this.handleNextClick = _this.handleNextClick.bind(_this);
_this.handleCompleteClick = _this.handleCompleteClick.bind(_this);
return _this;
}
SurveyNavigation.prototype.handlePrevClick = function (event) {
this.survey.prevPage();
};
SurveyNavigation.prototype.handleNextClick = function (event) {
this.survey.nextPage();
};
SurveyNavigation.prototype.handleCompleteClick = function (event) {
this.survey.completeLastPage();
};
SurveyNavigation.prototype.render = function () {
if (!this.survey || !this.survey.isNavigationButtonsShowing)
return null;
var prevButton = !this.survey.isFirstPage && this.survey.isShowPrevButton ? this.renderButton(this.handlePrevClick, this.survey.pagePrevText, this.css.navigation.prev) : null;
var nextButton = !this.survey.isLastPage ? this.renderButton(this.handleNextClick, this.survey.pageNextText, this.css.navigation.next) : null;
var completeButton = this.survey.isLastPage && this.survey.isEditMode ? this.renderButton(this.handleCompleteClick, this.survey.completeText, this.css.navigation.complete) : null;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.footer },
prevButton,
nextButton,
completeButton));
};
SurveyNavigation.prototype.renderButton = function (click, text, btnClassName) {
var style = { marginRight: "5px" };
var className = this.css.navigationButton + (btnClassName ? ' ' + btnClassName : "");
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { className: className, style: style, type: "button", onClick: click, value: text });
};
return SurveyNavigation;
}(__WEBPACK_IMPORTED_MODULE_2__reactSurveyNavigationBase__["a" /* SurveyNavigationBase */]));
/***/ }),
/* 38 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactSurveyNavigationBase__ = __webpack_require__(26);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyProgress; });
var SurveyProgress = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyProgress, _super);
function SurveyProgress(props) {
var _this = _super.call(this, props) || this;
_this.isTop = props.isTop;
return _this;
}
SurveyProgress.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.isTop = nextProps.isTop;
};
Object.defineProperty(SurveyProgress.prototype, "progress", {
get: function () { return this.survey.getProgress(); },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyProgress.prototype, "progressText", {
get: function () { return this.survey.progressText; },
enumerable: true,
configurable: true
});
SurveyProgress.prototype.render = function () {
var style = this.isTop ? { width: "60%" } : { width: "60%", marginTop: "10px" };
var progressStyle = { width: "auto", minWidth: this.progress + "%", paddingLeft: "2px", paddingRight: "2px" };
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.progress, style: style },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { style: progressStyle, className: this.css.progressBar, role: "progressbar", "aria-valuemin": "0", "aria-valuemax": "100" },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", null, this.progressText))));
};
return SurveyProgress;
}(__WEBPACK_IMPORTED_MODULE_2__reactSurveyNavigationBase__["a" /* SurveyNavigationBase */]));
/***/ }),
/* 39 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestion__ = __webpack_require__(28);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__custom_widget__ = __webpack_require__(36);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionMatrixDropdown; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionMatrixDropdownRow; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return SurveyQuestionMatrixDropdownCell; });
var SurveyQuestionMatrixDropdown = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionMatrixDropdown, _super);
function SurveyQuestionMatrixDropdown(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyQuestionMatrixDropdown.prototype, "question", {
get: function () { return this.questionBase; },
enumerable: true,
configurable: true
});
SurveyQuestionMatrixDropdown.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
var headers = [];
for (var i = 0; i < this.question.columns.length; i++) {
var column = this.question.columns[i];
var key = "column" + i;
var minWidth = this.question.getColumnWidth(column);
var columnStyle = minWidth ? { minWidth: minWidth } : {};
var columnTitle = this.renderLocString(column.locTitle);
headers.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("th", { key: key, style: columnStyle }, columnTitle));
}
var rows = [];
var visibleRows = this.question.visibleRows;
for (var i = 0; i < visibleRows.length; i++) {
var row = visibleRows[i];
rows.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMatrixDropdownRow, { key: i, row: row, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode, creator: this.creator }));
}
var divStyle = this.question.horizontalScroll ? { overflowX: 'scroll' } : {};
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { style: divStyle },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("table", { className: cssClasses.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("thead", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tr", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", null),
headers)),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tbody", null, rows))));
};
return SurveyQuestionMatrixDropdown;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
var SurveyQuestionMatrixDropdownRow = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionMatrixDropdownRow, _super);
function SurveyQuestionMatrixDropdownRow(props) {
var _this = _super.call(this, props) || this;
_this.setProperties(props);
return _this;
}
SurveyQuestionMatrixDropdownRow.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.setProperties(nextProps);
};
SurveyQuestionMatrixDropdownRow.prototype.setProperties = function (nextProps) {
this.row = nextProps.row;
this.creator = nextProps.creator;
};
SurveyQuestionMatrixDropdownRow.prototype.render = function () {
if (!this.row)
return null;
var tds = [];
for (var i = 0; i < this.row.cells.length; i++) {
var cell = this.row.cells[i];
var cellElement = __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMatrixDropdownCell, { key: "row" + i, cssClasses: this.cssClasses, cell: cell, creator: this.creator });
tds.push(cellElement);
}
var rowText = this.renderLocString(this.row.locText);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tr", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", null, rowText),
tds));
};
return SurveyQuestionMatrixDropdownRow;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["c" /* ReactSurveyElement */]));
var SurveyQuestionMatrixDropdownCell = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionMatrixDropdownCell, _super);
function SurveyQuestionMatrixDropdownCell(props) {
var _this = _super.call(this, props) || this;
_this.setProperties(props);
if (_this.cell && _this.cell.question) {
var q = _this.cell.question;
_this.state = { isReadOnly: q.isReadOnly, visible: q.visible };
}
return _this;
}
SurveyQuestionMatrixDropdownCell.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.setProperties(nextProps);
};
SurveyQuestionMatrixDropdownCell.prototype.setProperties = function (nextProps) {
this.cell = nextProps.cell;
this.creator = nextProps.creator;
};
SurveyQuestionMatrixDropdownCell.prototype.componentDidMount = function () {
var el = this.refs["cell"];
if (el && this.cell && this.cell.question.survey) {
var options = { cell: this.cell, cellQuestion: this.cell.question, htmlElement: el, row: this.cell.row, column: this.cell.column };
this.cell.question.survey.matrixAfterCellRender(this.cell.question, options);
}
if (this.cell && this.cell.question) {
var self = this;
this.cell.question.registerFunctionOnPropertyValueChanged("isReadOnly", function () {
self.state.isReadOnly = self.cell.question.isReadOnly;
self.setState(self.state);
}, "react");
this.cell.question.registerFunctionOnPropertyValueChanged("visible", function () {
self.state.visible = self.cell.question.visible;
self.setState(self.state);
}, "react");
}
};
SurveyQuestionMatrixDropdownCell.prototype.componentWillUnmount = function () {
if (this.cell && this.cell.question) {
this.cell.question.unRegisterFunctionOnPropertiesValueChanged(["visible", "isReadOnly"], "react");
}
};
SurveyQuestionMatrixDropdownCell.prototype.render = function () {
if (!this.cell)
return null;
var errors = __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactquestion__["b" /* SurveyQuestionErrors */], { question: this.cell.question, cssClasses: this.cssClasses, creator: this.creator });
var renderedCell = this.renderCell();
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", { ref: "cell", className: this.cssClasses.itemValue },
errors,
renderedCell));
};
SurveyQuestionMatrixDropdownCell.prototype.renderCell = function () {
if (!this.cell.question.visible)
return null;
var customWidget = this.cell.question.customWidget;
if (!customWidget) {
return this.creator.createQuestionElement(this.cell.question);
}
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_5__custom_widget__["a" /* SurveyCustomWidget */], { creator: this.creator, question: this.cell.question });
};
return SurveyQuestionMatrixDropdownCell;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["c" /* ReactSurveyElement */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("matrixdropdown", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMatrixDropdown, props);
});
/***/ }),
/* 40 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyTimerPanel; });
var SurveyTimerPanel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyTimerPanel, _super);
function SurveyTimerPanel(props) {
var _this = _super.call(this, props) || this;
_this.survey = props.survey;
_this.css = props.css;
_this.state = { timeSpent: 0 };
return _this;
}
SurveyTimerPanel.prototype.componentWillReceiveProps = function (nextProps) {
this.survey = nextProps.survey;
this.css = nextProps.css;
};
SurveyTimerPanel.prototype.componentDidMount = function () {
if (this.survey) {
var self = this;
this.survey.registerFunctionOnPropertyValueChanged("timeSpent", function () {
self.state.timeSpent = self.survey.timeSpent;
self.setState(self.state);
}, "timerPanel");
}
};
SurveyTimerPanel.prototype.componentWillUnmount = function () {
if (this.survey) {
this.survey.unRegisterFunctionOnPropertyValueChanged("timeSpent", "timerPanel");
}
};
SurveyTimerPanel.prototype.render = function () {
if (!this.survey)
return;
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null, this.survey.timerInfoText);
};
return SurveyTimerPanel;
}(__WEBPACK_IMPORTED_MODULE_1_react__["Component"]));
/***/ }),
/* 41 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__survey__ = __webpack_require__(18);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyWindowModel; });
/**
* A Model for a survey running in the Window.
*/
var SurveyWindowModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyWindowModel, _super);
function SurveyWindowModel(jsonObj, initialModel) {
if (initialModel === void 0) { initialModel = null; }
var _this = _super.call(this) || this;
_this.isExpandedValue = false;
if (initialModel) {
_this.surveyValue = initialModel;
}
else {
_this.surveyValue = _this.createSurvey(jsonObj);
}
_this.surveyValue.showTitle = false;
if ("undefined" !== typeof document) {
_this.windowElement = document.createElement("div");
}
return _this;
}
SurveyWindowModel.prototype.getType = function () { return "window"; };
Object.defineProperty(SurveyWindowModel.prototype, "survey", {
/**
* A survey object.
* @see SurveyModel
*/
get: function () { return this.surveyValue; },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyWindowModel.prototype, "isShowing", {
/**
* Returns true if the window is currently showing. Set it to true to show the window and false to hide it.
* @see show
* @see hide
*/
get: function () { return this.isShowingValue; },
set: function (val) {
if (this.isShowing == val)
return;
this.isShowingValue = val;
if (this.showingChangedCallback)
this.showingChangedCallback();
},
enumerable: true,
configurable: true
});
/**
* Show the window
* @see hide
* @see isShowing
*/
SurveyWindowModel.prototype.show = function () { this.isShowing = true; };
/**
* Hide the window
* @see show
* @see isShowing
*/
SurveyWindowModel.prototype.hide = function () { this.isShowing = false; };
Object.defineProperty(SurveyWindowModel.prototype, "isExpanded", {
/**
* Returns true if the window is expanded. Set it to true to expand the window or false to collapse it.
* @see expand
* @see collapse
*/
get: function () { return this.isExpandedValue; },
set: function (val) {
if (val)
this.expand();
else
this.collapse();
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyWindowModel.prototype, "title", {
/**
* The window and survey title.
*/
get: function () { return this.survey.title; },
set: function (value) { this.survey.title = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyWindowModel.prototype, "locTitle", {
get: function () { return this.survey.locTitle; },
enumerable: true,
configurable: true
});
/**
* Expand the window to show the survey.
*/
SurveyWindowModel.prototype.expand = function () {
this.expandcollapse(true);
};
/**
* Collapse the window and show survey title only.
*/
SurveyWindowModel.prototype.collapse = function () {
this.expandcollapse(false);
};
SurveyWindowModel.prototype.createSurvey = function (jsonObj) {
return new __WEBPACK_IMPORTED_MODULE_2__survey__["a" /* SurveyModel */](jsonObj);
};
SurveyWindowModel.prototype.expandcollapse = function (value) {
if (this.isExpandedValue == value)
return;
this.isExpandedValue = value;
if (this.expandedChangedCallback)
this.expandedChangedCallback();
};
return SurveyWindowModel;
}(__WEBPACK_IMPORTED_MODULE_1__base__["c" /* Base */]));
SurveyWindowModel.surveyElementName = "windowSurveyJS";
/***/ }),
/* 42 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base__ = __webpack_require__(7);
/* unused harmony export surveyTimerFunctions */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyTimer; });
var surveyTimerFunctions = {
setInterval: function (func) {
return window.setInterval(func, 1000);
},
clearInterval: function (timerId) {
window.clearInterval(timerId);
}
};
var SurveyTimer = (function () {
function SurveyTimer() {
this.listenerCounter = 0;
this.timerId = -1;
this.onTimer = new __WEBPACK_IMPORTED_MODULE_0__base__["b" /* Event */]();
}
Object.defineProperty(SurveyTimer, "instance", {
get: function () {
if (!SurveyTimer.instanceValue) {
SurveyTimer.instanceValue = new SurveyTimer();
}
return SurveyTimer.instanceValue;
},
enumerable: true,
configurable: true
});
SurveyTimer.prototype.start = function (func) {
if (func === void 0) { func = null; }
if (func) {
this.onTimer.add(func);
}
if (this.timerId < 0) {
var self = this;
this.timerId = surveyTimerFunctions.setInterval(function () { self.doTimer(); });
}
this.listenerCounter++;
};
SurveyTimer.prototype.stop = function (func) {
if (func === void 0) { func = null; }
if (func) {
this.onTimer.remove(func);
}
this.listenerCounter--;
if (this.listenerCounter == 0 && this.timerId > -1) {
surveyTimerFunctions.clearInterval(this.timerId);
this.timerId = -1;
}
};
SurveyTimer.prototype.doTimer = function () {
if (this.timerId < 0)
return;
this.onTimer.fire(this, {});
};
return SurveyTimer;
}());
SurveyTimer.instanceValue = null;
/***/ }),
/* 43 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__chunks_model__ = __webpack_require__(52);
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "T", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["a"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "U", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["b"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "V", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["c"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "W", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["d"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "X", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["e"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "Y", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["f"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "Z", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["g"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_0", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["h"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_1", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["i"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_2", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["j"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_3", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["k"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_4", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["l"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_5", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["m"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_6", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["n"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_7", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["o"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_8", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["p"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_9", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["q"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_10", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["r"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_11", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["s"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_12", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["t"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_13", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["u"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_14", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["v"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_15", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["w"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_16", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["x"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_17", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["y"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_18", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["z"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_19", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["A"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_20", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["B"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_21", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["C"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_22", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["D"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_23", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["E"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_24", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["F"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_25", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["G"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_26", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["H"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_27", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["I"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_28", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["J"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_29", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["K"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_30", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["L"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_31", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["M"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_32", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["N"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_33", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["O"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_34", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["P"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_35", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["Q"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_36", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["R"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_37", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["S"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_38", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["T"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_39", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["U"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_40", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["V"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_41", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["W"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_42", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["X"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_43", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["Y"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_44", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["Z"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_45", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_0"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_46", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_1"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_47", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_2"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_48", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_3"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_49", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_4"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_50", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_5"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_51", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_6"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_52", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_7"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_53", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_8"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_54", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_9"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_55", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_10"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_56", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_11"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_57", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_12"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_58", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_13"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_59", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_14"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_60", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_15"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_61", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_16"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_62", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_17"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_63", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_18"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_64", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_19"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_65", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_20"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_66", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_21"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_67", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_22"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_68", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_23"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_69", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_24"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_70", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_25"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_71", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_26"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_72", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_27"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_73", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_28"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_74", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_29"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_75", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_30"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_76", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_31"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__chunks_localization__ = __webpack_require__(51);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__chunks_helpers__ = __webpack_require__(0);
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "a", function() { return __WEBPACK_IMPORTED_MODULE_2__chunks_helpers__["a"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_2__chunks_helpers__["b"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "c", function() { return __WEBPACK_IMPORTED_MODULE_2__chunks_helpers__["c"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__defaultCss_cssstandard__ = __webpack_require__(11);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return __WEBPACK_IMPORTED_MODULE_3__defaultCss_cssstandard__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__defaultCss_cssbootstrap__ = __webpack_require__(49);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return __WEBPACK_IMPORTED_MODULE_4__defaultCss_cssbootstrap__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__defaultCss_cssbootstrapmaterial__ = __webpack_require__(50);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return __WEBPACK_IMPORTED_MODULE_5__defaultCss_cssbootstrapmaterial__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__react_reactSurvey__ = __webpack_require__(20);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return __WEBPACK_IMPORTED_MODULE_6__react_reactSurvey__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__react_reactsurveymodel__ = __webpack_require__(19);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return __WEBPACK_IMPORTED_MODULE_7__react_reactsurveymodel__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return __WEBPACK_IMPORTED_MODULE_7__react_reactsurveymodel__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return __WEBPACK_IMPORTED_MODULE_7__react_reactsurveymodel__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "k", function() { return __WEBPACK_IMPORTED_MODULE_7__react_reactsurveymodel__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__react_reactSurveyNavigationBase__ = __webpack_require__(26);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "l", function() { return __WEBPACK_IMPORTED_MODULE_8__react_reactSurveyNavigationBase__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__react_reacttimerpanel__ = __webpack_require__(40);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "m", function() { return __WEBPACK_IMPORTED_MODULE_9__react_reacttimerpanel__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__react_reactSurveyNavigation__ = __webpack_require__(37);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "n", function() { return __WEBPACK_IMPORTED_MODULE_10__react_reactSurveyNavigation__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__react_reactpage__ = __webpack_require__(27);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "o", function() { return __WEBPACK_IMPORTED_MODULE_11__react_reactpage__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "p", function() { return __WEBPACK_IMPORTED_MODULE_11__react_reactpage__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__react_reactquestion__ = __webpack_require__(28);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "q", function() { return __WEBPACK_IMPORTED_MODULE_12__react_reactquestion__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "r", function() { return __WEBPACK_IMPORTED_MODULE_12__react_reactquestion__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__react_reactquestionelement__ = __webpack_require__(4);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "s", function() { return __WEBPACK_IMPORTED_MODULE_13__react_reactquestionelement__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "t", function() { return __WEBPACK_IMPORTED_MODULE_13__react_reactquestionelement__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__react_reactquestioncomment__ = __webpack_require__(14);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "u", function() { return __WEBPACK_IMPORTED_MODULE_14__react_reactquestioncomment__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "v", function() { return __WEBPACK_IMPORTED_MODULE_14__react_reactquestioncomment__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__react_reactquestioncheckbox__ = __webpack_require__(91);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "w", function() { return __WEBPACK_IMPORTED_MODULE_15__react_reactquestioncheckbox__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "x", function() { return __WEBPACK_IMPORTED_MODULE_15__react_reactquestioncheckbox__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__react_reactquestiondropdown__ = __webpack_require__(92);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "y", function() { return __WEBPACK_IMPORTED_MODULE_16__react_reactquestiondropdown__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__react_reactquestionmatrixdropdown__ = __webpack_require__(39);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "z", function() { return __WEBPACK_IMPORTED_MODULE_17__react_reactquestionmatrixdropdown__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "A", function() { return __WEBPACK_IMPORTED_MODULE_17__react_reactquestionmatrixdropdown__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__react_reactquestionmatrix__ = __webpack_require__(97);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "B", function() { return __WEBPACK_IMPORTED_MODULE_18__react_reactquestionmatrix__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "C", function() { return __WEBPACK_IMPORTED_MODULE_18__react_reactquestionmatrix__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__react_reactquestionhtml__ = __webpack_require__(96);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "D", function() { return __WEBPACK_IMPORTED_MODULE_19__react_reactquestionhtml__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__react_reactquestionfile__ = __webpack_require__(95);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "E", function() { return __WEBPACK_IMPORTED_MODULE_20__react_reactquestionfile__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__react_reactquestionmultipletext__ = __webpack_require__(99);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "F", function() { return __WEBPACK_IMPORTED_MODULE_21__react_reactquestionmultipletext__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "G", function() { return __WEBPACK_IMPORTED_MODULE_21__react_reactquestionmultipletext__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__react_reactquestionradiogroup__ = __webpack_require__(101);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "H", function() { return __WEBPACK_IMPORTED_MODULE_22__react_reactquestionradiogroup__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__react_reactquestiontext__ = __webpack_require__(103);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "I", function() { return __WEBPACK_IMPORTED_MODULE_23__react_reactquestiontext__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__react_reactquestionboolean__ = __webpack_require__(90);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "J", function() { return __WEBPACK_IMPORTED_MODULE_24__react_reactquestionboolean__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__react_reactquestionempty__ = __webpack_require__(93);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "K", function() { return __WEBPACK_IMPORTED_MODULE_25__react_reactquestionempty__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__react_reactquestionmatrixdynamic__ = __webpack_require__(98);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "L", function() { return __WEBPACK_IMPORTED_MODULE_26__react_reactquestionmatrixdynamic__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "M", function() { return __WEBPACK_IMPORTED_MODULE_26__react_reactquestionmatrixdynamic__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__react_reactquestionpaneldynamic__ = __webpack_require__(100);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "N", function() { return __WEBPACK_IMPORTED_MODULE_27__react_reactquestionpaneldynamic__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__react_reactSurveyProgress__ = __webpack_require__(38);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "O", function() { return __WEBPACK_IMPORTED_MODULE_28__react_reactSurveyProgress__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__react_reactquestionrating__ = __webpack_require__(102);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "P", function() { return __WEBPACK_IMPORTED_MODULE_29__react_reactquestionrating__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__react_reactquestionexpression__ = __webpack_require__(94);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Q", function() { return __WEBPACK_IMPORTED_MODULE_30__react_reactquestionexpression__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__react_reactSurveyWindow__ = __webpack_require__(30);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "R", function() { return __WEBPACK_IMPORTED_MODULE_31__react_reactSurveyWindow__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_32__react_reactquestionfactory__ = __webpack_require__(6);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "S", function() { return __WEBPACK_IMPORTED_MODULE_32__react_reactquestionfactory__["a"]; });
// model
// localization
// helpers
// css standard
// css bootstrap
// css bootstrap + material
// react
//Uncomment to include the "date" question type.
//export {default as SurveyQuestionDate} from "../plugins/react/reactquestiondate";
/***/ }),
/* 44 */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE_44__;
/***/ }),
/* 45 */
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
/***/ }),
/* 46 */
/***/ (function(module, exports, __webpack_require__) {
!function(global, factory) {
true ? factory(exports) : 'function' == typeof define && define.amd ? define([ 'exports' ], factory) : factory(global.preact = global.preact || {});
}(this, function(exports) {
function VNode(nodeName, attributes, children) {
this.nodeName = nodeName;
this.attributes = attributes;
this.children = children;
this.key = attributes && attributes.key;
}
function h(nodeName, attributes) {
var children, lastSimple, child, simple, i;
for (i = arguments.length; i-- > 2; ) stack.push(arguments[i]);
if (attributes && attributes.children) {
if (!stack.length) stack.push(attributes.children);
delete attributes.children;
}
while (stack.length) if ((child = stack.pop()) instanceof Array) for (i = child.length; i--; ) stack.push(child[i]); else if (null != child && child !== !0 && child !== !1) {
if ('number' == typeof child) child = String(child);
simple = 'string' == typeof child;
if (simple && lastSimple) children[children.length - 1] += child; else {
(children || (children = [])).push(child);
lastSimple = simple;
}
}
var p = new VNode(nodeName, attributes || void 0, children || EMPTY_CHILDREN);
if (options.vnode) options.vnode(p);
return p;
}
function extend(obj, props) {
if (props) for (var i in props) obj[i] = props[i];
return obj;
}
function clone(obj) {
return extend({}, obj);
}
function delve(obj, key) {
for (var p = key.split('.'), i = 0; i < p.length && obj; i++) obj = obj[p[i]];
return obj;
}
function isFunction(obj) {
return 'function' == typeof obj;
}
function isString(obj) {
return 'string' == typeof obj;
}
function hashToClassName(c) {
var str = '';
for (var prop in c) if (c[prop]) {
if (str) str += ' ';
str += prop;
}
return str;
}
function cloneElement(vnode, props) {
return h(vnode.nodeName, extend(clone(vnode.attributes), props), arguments.length > 2 ? [].slice.call(arguments, 2) : vnode.children);
}
function createLinkedState(component, key, eventPath) {
var path = key.split('.');
return function(e) {
var t = e && e.target || this, state = {}, obj = state, v = isString(eventPath) ? delve(e, eventPath) : t.nodeName ? t.type.match(/^che|rad/) ? t.checked : t.value : e, i = 0;
for (;i < path.length - 1; i++) obj = obj[path[i]] || (obj[path[i]] = !i && component.state[path[i]] || {});
obj[path[i]] = v;
component.setState(state);
};
}
function enqueueRender(component) {
if (!component._dirty && (component._dirty = !0) && 1 == items.push(component)) (options.debounceRendering || defer)(rerender);
}
function rerender() {
var p, list = items;
items = [];
while (p = list.pop()) if (p._dirty) renderComponent(p);
}
function isFunctionalComponent(vnode) {
var nodeName = vnode && vnode.nodeName;
return nodeName && isFunction(nodeName) && !(nodeName.prototype && nodeName.prototype.render);
}
function buildFunctionalComponent(vnode, context) {
return vnode.nodeName(getNodeProps(vnode), context || EMPTY);
}
function isSameNodeType(node, vnode) {
if (isString(vnode)) return node instanceof Text;
if (isString(vnode.nodeName)) return !node._componentConstructor && isNamedNode(node, vnode.nodeName);
if (isFunction(vnode.nodeName)) return (node._componentConstructor ? node._componentConstructor === vnode.nodeName : !0) || isFunctionalComponent(vnode); else ;
}
function isNamedNode(node, nodeName) {
return node.normalizedNodeName === nodeName || toLowerCase(node.nodeName) === toLowerCase(nodeName);
}
function getNodeProps(vnode) {
var props = clone(vnode.attributes);
props.children = vnode.children;
var defaultProps = vnode.nodeName.defaultProps;
if (defaultProps) for (var i in defaultProps) if (void 0 === props[i]) props[i] = defaultProps[i];
return props;
}
function removeNode(node) {
var p = node.parentNode;
if (p) p.removeChild(node);
}
function setAccessor(node, name, old, value, isSvg) {
if ('className' === name) name = 'class';
if ('class' === name && value && 'object' == typeof value) value = hashToClassName(value);
if ('key' === name) ; else if ('class' === name && !isSvg) node.className = value || ''; else if ('style' === name) {
if (!value || isString(value) || isString(old)) node.style.cssText = value || '';
if (value && 'object' == typeof value) {
if (!isString(old)) for (var i in old) if (!(i in value)) node.style[i] = '';
for (var i in value) node.style[i] = 'number' == typeof value[i] && !NON_DIMENSION_PROPS[i] ? value[i] + 'px' : value[i];
}
} else if ('dangerouslySetInnerHTML' === name) {
if (value) node.innerHTML = value.__html || '';
} else if ('o' == name[0] && 'n' == name[1]) {
var l = node._listeners || (node._listeners = {});
name = toLowerCase(name.substring(2));
if (value) {
if (!l[name]) node.addEventListener(name, eventProxy, !!NON_BUBBLING_EVENTS[name]);
} else if (l[name]) node.removeEventListener(name, eventProxy, !!NON_BUBBLING_EVENTS[name]);
l[name] = value;
} else if ('list' !== name && 'type' !== name && !isSvg && name in node) {
setProperty(node, name, null == value ? '' : value);
if (null == value || value === !1) node.removeAttribute(name);
} else {
var ns = isSvg && name.match(/^xlink\:?(.+)/);
if (null == value || value === !1) if (ns) node.removeAttributeNS('http://www.w3.org/1999/xlink', toLowerCase(ns[1])); else node.removeAttribute(name); else if ('object' != typeof value && !isFunction(value)) if (ns) node.setAttributeNS('http://www.w3.org/1999/xlink', toLowerCase(ns[1]), value); else node.setAttribute(name, value);
}
}
function setProperty(node, name, value) {
try {
node[name] = value;
} catch (e) {}
}
function eventProxy(e) {
return this._listeners[e.type](options.event && options.event(e) || e);
}
function collectNode(node) {
removeNode(node);
if (node instanceof Element) {
node._component = node._componentConstructor = null;
var _name = node.normalizedNodeName || toLowerCase(node.nodeName);
(nodes[_name] || (nodes[_name] = [])).push(node);
}
}
function createNode(nodeName, isSvg) {
var name = toLowerCase(nodeName), node = nodes[name] && nodes[name].pop() || (isSvg ? document.createElementNS('http://www.w3.org/2000/svg', nodeName) : document.createElement(nodeName));
node.normalizedNodeName = name;
return node;
}
function flushMounts() {
var c;
while (c = mounts.pop()) {
if (options.afterMount) options.afterMount(c);
if (c.componentDidMount) c.componentDidMount();
}
}
function diff(dom, vnode, context, mountAll, parent, componentRoot) {
if (!diffLevel++) {
isSvgMode = parent && 'undefined' != typeof parent.ownerSVGElement;
hydrating = dom && !(ATTR_KEY in dom);
}
var ret = idiff(dom, vnode, context, mountAll);
if (parent && ret.parentNode !== parent) parent.appendChild(ret);
if (!--diffLevel) {
hydrating = !1;
if (!componentRoot) flushMounts();
}
return ret;
}
function idiff(dom, vnode, context, mountAll) {
var ref = vnode && vnode.attributes && vnode.attributes.ref;
while (isFunctionalComponent(vnode)) vnode = buildFunctionalComponent(vnode, context);
if (null == vnode) vnode = '';
if (isString(vnode)) {
if (dom && dom instanceof Text && dom.parentNode) {
if (dom.nodeValue != vnode) dom.nodeValue = vnode;
} else {
if (dom) recollectNodeTree(dom);
dom = document.createTextNode(vnode);
}
return dom;
}
if (isFunction(vnode.nodeName)) return buildComponentFromVNode(dom, vnode, context, mountAll);
var out = dom, nodeName = String(vnode.nodeName), prevSvgMode = isSvgMode, vchildren = vnode.children;
isSvgMode = 'svg' === nodeName ? !0 : 'foreignObject' === nodeName ? !1 : isSvgMode;
if (!dom) out = createNode(nodeName, isSvgMode); else if (!isNamedNode(dom, nodeName)) {
out = createNode(nodeName, isSvgMode);
while (dom.firstChild) out.appendChild(dom.firstChild);
if (dom.parentNode) dom.parentNode.replaceChild(out, dom);
recollectNodeTree(dom);
}
var fc = out.firstChild, props = out[ATTR_KEY];
if (!props) {
out[ATTR_KEY] = props = {};
for (var a = out.attributes, i = a.length; i--; ) props[a[i].name] = a[i].value;
}
if (!hydrating && vchildren && 1 === vchildren.length && 'string' == typeof vchildren[0] && fc && fc instanceof Text && !fc.nextSibling) {
if (fc.nodeValue != vchildren[0]) fc.nodeValue = vchildren[0];
} else if (vchildren && vchildren.length || fc) innerDiffNode(out, vchildren, context, mountAll, !!props.dangerouslySetInnerHTML);
diffAttributes(out, vnode.attributes, props);
if (ref) (props.ref = ref)(out);
isSvgMode = prevSvgMode;
return out;
}
function innerDiffNode(dom, vchildren, context, mountAll, absorb) {
var j, c, vchild, child, originalChildren = dom.childNodes, children = [], keyed = {}, keyedLen = 0, min = 0, len = originalChildren.length, childrenLen = 0, vlen = vchildren && vchildren.length;
if (len) for (var i = 0; i < len; i++) {
var _child = originalChildren[i], props = _child[ATTR_KEY], key = vlen ? (c = _child._component) ? c.__key : props ? props.key : null : null;
if (null != key) {
keyedLen++;
keyed[key] = _child;
} else if (hydrating || absorb || props || _child instanceof Text) children[childrenLen++] = _child;
}
if (vlen) for (var i = 0; i < vlen; i++) {
vchild = vchildren[i];
child = null;
var key = vchild.key;
if (null != key) {
if (keyedLen && key in keyed) {
child = keyed[key];
keyed[key] = void 0;
keyedLen--;
}
} else if (!child && min < childrenLen) for (j = min; j < childrenLen; j++) {
c = children[j];
if (c && isSameNodeType(c, vchild)) {
child = c;
children[j] = void 0;
if (j === childrenLen - 1) childrenLen--;
if (j === min) min++;
break;
}
}
child = idiff(child, vchild, context, mountAll);
if (child && child !== dom) if (i >= len) dom.appendChild(child); else if (child !== originalChildren[i]) {
if (child === originalChildren[i + 1]) removeNode(originalChildren[i]);
dom.insertBefore(child, originalChildren[i] || null);
}
}
if (keyedLen) for (var i in keyed) if (keyed[i]) recollectNodeTree(keyed[i]);
while (min <= childrenLen) {
child = children[childrenLen--];
if (child) recollectNodeTree(child);
}
}
function recollectNodeTree(node, unmountOnly) {
var component = node._component;
if (component) unmountComponent(component, !unmountOnly); else {
if (node[ATTR_KEY] && node[ATTR_KEY].ref) node[ATTR_KEY].ref(null);
if (!unmountOnly) collectNode(node);
var c;
while (c = node.lastChild) recollectNodeTree(c, unmountOnly);
}
}
function diffAttributes(dom, attrs, old) {
var name;
for (name in old) if (!(attrs && name in attrs) && null != old[name]) setAccessor(dom, name, old[name], old[name] = void 0, isSvgMode);
if (attrs) for (name in attrs) if (!('children' === name || 'innerHTML' === name || name in old && attrs[name] === ('value' === name || 'checked' === name ? dom[name] : old[name]))) setAccessor(dom, name, old[name], old[name] = attrs[name], isSvgMode);
}
function collectComponent(component) {
var name = component.constructor.name, list = components[name];
if (list) list.push(component); else components[name] = [ component ];
}
function createComponent(Ctor, props, context) {
var inst = new Ctor(props, context), list = components[Ctor.name];
Component.call(inst, props, context);
if (list) for (var i = list.length; i--; ) if (list[i].constructor === Ctor) {
inst.nextBase = list[i].nextBase;
list.splice(i, 1);
break;
}
return inst;
}
function setComponentProps(component, props, opts, context, mountAll) {
if (!component._disable) {
component._disable = !0;
if (component.__ref = props.ref) delete props.ref;
if (component.__key = props.key) delete props.key;
if (!component.base || mountAll) {
if (component.componentWillMount) component.componentWillMount();
} else if (component.componentWillReceiveProps) component.componentWillReceiveProps(props, context);
if (context && context !== component.context) {
if (!component.prevContext) component.prevContext = component.context;
component.context = context;
}
if (!component.prevProps) component.prevProps = component.props;
component.props = props;
component._disable = !1;
if (0 !== opts) if (1 === opts || options.syncComponentUpdates !== !1 || !component.base) renderComponent(component, 1, mountAll); else enqueueRender(component);
if (component.__ref) component.__ref(component);
}
}
function renderComponent(component, opts, mountAll, isChild) {
if (!component._disable) {
var skip, rendered, inst, cbase, props = component.props, state = component.state, context = component.context, previousProps = component.prevProps || props, previousState = component.prevState || state, previousContext = component.prevContext || context, isUpdate = component.base, nextBase = component.nextBase, initialBase = isUpdate || nextBase, initialChildComponent = component._component;
if (isUpdate) {
component.props = previousProps;
component.state = previousState;
component.context = previousContext;
if (2 !== opts && component.shouldComponentUpdate && component.shouldComponentUpdate(props, state, context) === !1) skip = !0; else if (component.componentWillUpdate) component.componentWillUpdate(props, state, context);
component.props = props;
component.state = state;
component.context = context;
}
component.prevProps = component.prevState = component.prevContext = component.nextBase = null;
component._dirty = !1;
if (!skip) {
if (component.render) rendered = component.render(props, state, context);
if (component.getChildContext) context = extend(clone(context), component.getChildContext());
while (isFunctionalComponent(rendered)) rendered = buildFunctionalComponent(rendered, context);
var toUnmount, base, childComponent = rendered && rendered.nodeName;
if (isFunction(childComponent)) {
var childProps = getNodeProps(rendered);
inst = initialChildComponent;
if (inst && inst.constructor === childComponent && childProps.key == inst.__key) setComponentProps(inst, childProps, 1, context); else {
toUnmount = inst;
inst = createComponent(childComponent, childProps, context);
inst.nextBase = inst.nextBase || nextBase;
inst._parentComponent = component;
component._component = inst;
setComponentProps(inst, childProps, 0, context);
renderComponent(inst, 1, mountAll, !0);
}
base = inst.base;
} else {
cbase = initialBase;
toUnmount = initialChildComponent;
if (toUnmount) cbase = component._component = null;
if (initialBase || 1 === opts) {
if (cbase) cbase._component = null;
base = diff(cbase, rendered, context, mountAll || !isUpdate, initialBase && initialBase.parentNode, !0);
}
}
if (initialBase && base !== initialBase && inst !== initialChildComponent) {
var baseParent = initialBase.parentNode;
if (baseParent && base !== baseParent) {
baseParent.replaceChild(base, initialBase);
if (!toUnmount) {
initialBase._component = null;
recollectNodeTree(initialBase);
}
}
}
if (toUnmount) unmountComponent(toUnmount, base !== initialBase);
component.base = base;
if (base && !isChild) {
var componentRef = component, t = component;
while (t = t._parentComponent) (componentRef = t).base = base;
base._component = componentRef;
base._componentConstructor = componentRef.constructor;
}
}
if (!isUpdate || mountAll) mounts.unshift(component); else if (!skip) {
if (component.componentDidUpdate) component.componentDidUpdate(previousProps, previousState, previousContext);
if (options.afterUpdate) options.afterUpdate(component);
}
var fn, cb = component._renderCallbacks;
if (cb) while (fn = cb.pop()) fn.call(component);
if (!diffLevel && !isChild) flushMounts();
}
}
function buildComponentFromVNode(dom, vnode, context, mountAll) {
var c = dom && dom._component, originalComponent = c, oldDom = dom, isDirectOwner = c && dom._componentConstructor === vnode.nodeName, isOwner = isDirectOwner, props = getNodeProps(vnode);
while (c && !isOwner && (c = c._parentComponent)) isOwner = c.constructor === vnode.nodeName;
if (c && isOwner && (!mountAll || c._component)) {
setComponentProps(c, props, 3, context, mountAll);
dom = c.base;
} else {
if (originalComponent && !isDirectOwner) {
unmountComponent(originalComponent, !0);
dom = oldDom = null;
}
c = createComponent(vnode.nodeName, props, context);
if (dom && !c.nextBase) {
c.nextBase = dom;
oldDom = null;
}
setComponentProps(c, props, 1, context, mountAll);
dom = c.base;
if (oldDom && dom !== oldDom) {
oldDom._component = null;
recollectNodeTree(oldDom);
}
}
return dom;
}
function unmountComponent(component, remove) {
if (options.beforeUnmount) options.beforeUnmount(component);
var base = component.base;
component._disable = !0;
if (component.componentWillUnmount) component.componentWillUnmount();
component.base = null;
var inner = component._component;
if (inner) unmountComponent(inner, remove); else if (base) {
if (base[ATTR_KEY] && base[ATTR_KEY].ref) base[ATTR_KEY].ref(null);
component.nextBase = base;
if (remove) {
removeNode(base);
collectComponent(component);
}
var c;
while (c = base.lastChild) recollectNodeTree(c, !remove);
}
if (component.__ref) component.__ref(null);
if (component.componentDidUnmount) component.componentDidUnmount();
}
function Component(props, context) {
this._dirty = !0;
this.context = context;
this.props = props;
if (!this.state) this.state = {};
}
function render(vnode, parent, merge) {
return diff(merge, vnode, {}, !1, parent);
}
var options = {};
var stack = [];
var EMPTY_CHILDREN = [];
var lcCache = {};
var toLowerCase = function(s) {
return lcCache[s] || (lcCache[s] = s.toLowerCase());
};
var resolved = 'undefined' != typeof Promise && Promise.resolve();
var defer = resolved ? function(f) {
resolved.then(f);
} : setTimeout;
var EMPTY = {};
var ATTR_KEY = 'undefined' != typeof Symbol ? Symbol.for('preactattr') : '__preactattr_';
var NON_DIMENSION_PROPS = {
boxFlex: 1,
boxFlexGroup: 1,
columnCount: 1,
fillOpacity: 1,
flex: 1,
flexGrow: 1,
flexPositive: 1,
flexShrink: 1,
flexNegative: 1,
fontWeight: 1,
lineClamp: 1,
lineHeight: 1,
opacity: 1,
order: 1,
orphans: 1,
strokeOpacity: 1,
widows: 1,
zIndex: 1,
zoom: 1
};
var NON_BUBBLING_EVENTS = {
blur: 1,
error: 1,
focus: 1,
load: 1,
resize: 1,
scroll: 1
};
var items = [];
var nodes = {};
var mounts = [];
var diffLevel = 0;
var isSvgMode = !1;
var hydrating = !1;
var components = {};
extend(Component.prototype, {
linkState: function(key, eventPath) {
var c = this._linkedStates || (this._linkedStates = {});
return c[key + eventPath] || (c[key + eventPath] = createLinkedState(this, key, eventPath));
},
setState: function(state, callback) {
var s = this.state;
if (!this.prevState) this.prevState = clone(s);
extend(s, isFunction(state) ? state(s, this.props) : state);
if (callback) (this._renderCallbacks = this._renderCallbacks || []).push(callback);
enqueueRender(this);
},
forceUpdate: function() {
renderComponent(this, 2);
},
render: function() {}
});
exports.h = h;
exports.cloneElement = cloneElement;
exports.Component = Component;
exports.render = render;
exports.rerender = rerender;
exports.options = options;
});
//# sourceMappingURL=preact.js.map
/***/ }),
/* 47 */
/***/ (function(module, exports) {
// shim for using process in browser
var process = module.exports = {};
// cached from whatever global is present so that test runners that stub it
// don't break things. But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals. It's inside a
// function because try/catches deoptimize in certain engines.
var cachedSetTimeout;
var cachedClearTimeout;
function defaultSetTimout() {
throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout () {
throw new Error('clearTimeout has not been defined');
}
(function () {
try {
if (typeof setTimeout === 'function') {
cachedSetTimeout = setTimeout;
} else {
cachedSetTimeout = defaultSetTimout;
}
} catch (e) {
cachedSetTimeout = defaultSetTimout;
}
try {
if (typeof clearTimeout === 'function') {
cachedClearTimeout = clearTimeout;
} else {
cachedClearTimeout = defaultClearTimeout;
}
} catch (e) {
cachedClearTimeout = defaultClearTimeout;
}
} ())
function runTimeout(fun) {
if (cachedSetTimeout === setTimeout) {
//normal enviroments in sane situations
return setTimeout(fun, 0);
}
// if setTimeout wasn't available but was latter defined
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
cachedSetTimeout = setTimeout;
return setTimeout(fun, 0);
}
try {
// when when somebody has screwed with setTimeout but no I.E. maddness
return cachedSetTimeout(fun, 0);
} catch(e){
try {
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
return cachedSetTimeout.call(null, fun, 0);
} catch(e){
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
return cachedSetTimeout.call(this, fun, 0);
}
}
}
function runClearTimeout(marker) {
if (cachedClearTimeout === clearTimeout) {
//normal enviroments in sane situations
return clearTimeout(marker);
}
// if clearTimeout wasn't available but was latter defined
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
cachedClearTimeout = clearTimeout;
return clearTimeout(marker);
}
try {
// when when somebody has screwed with setTimeout but no I.E. maddness
return cachedClearTimeout(marker);
} catch (e){
try {
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
return cachedClearTimeout.call(null, marker);
} catch (e){
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
// Some versions of I.E. have different rules for clearTimeout vs setTimeout
return cachedClearTimeout.call(this, marker);
}
}
}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;
function cleanUpNextTick() {
if (!draining || !currentQueue) {
return;
}
draining = false;
if (currentQueue.length) {
queue = currentQueue.concat(queue);
} else {
queueIndex = -1;
}
if (queue.length) {
drainQueue();
}
}
function drainQueue() {
if (draining) {
return;
}
var timeout = runTimeout(cleanUpNextTick);
draining = true;
var len = queue.length;
while(len) {
currentQueue = queue;
queue = [];
while (++queueIndex < len) {
if (currentQueue) {
currentQueue[queueIndex].run();
}
}
queueIndex = -1;
len = queue.length;
}
currentQueue = null;
draining = false;
runClearTimeout(timeout);
}
process.nextTick = function (fun) {
var args = new Array(arguments.length - 1);
if (arguments.length > 1) {
for (var i = 1; i < arguments.length; i++) {
args[i - 1] = arguments[i];
}
}
queue.push(new Item(fun, args));
if (queue.length === 1 && !draining) {
runTimeout(drainQueue);
}
};
// v8 likes predictible objects
function Item(fun, array) {
this.fun = fun;
this.array = array;
}
Item.prototype.run = function () {
this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};
function noop() {}
process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.prependListener = noop;
process.prependOnceListener = noop;
process.listeners = function (name) { return [] }
process.binding = function (name) {
throw new Error('process.binding is not supported');
};
process.cwd = function () { return '/' };
process.chdir = function (dir) {
throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };
/***/ }),
/* 48 */
/***/ (function(module, exports, __webpack_require__) {
var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (global, factory) {
if (true) {
!(__WEBPACK_AMD_DEFINE_ARRAY__ = [exports, module], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
} else if (typeof exports !== 'undefined' && typeof module !== 'undefined') {
factory(exports, module);
} else {
var mod = {
exports: {}
};
factory(mod.exports, mod);
global.PropTypes = mod.exports;
}
})(this, function (exports, module) {
'use strict';
var REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element') || 0xeac7;
var ReactElement = {};
ReactElement.isValidElement = function (object) {
return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
};
var ReactPropTypeLocationNames = {
prop: 'prop',
context: 'context',
childContext: 'child context'
};
var emptyFunction = {
thatReturns: function thatReturns(what) {
return function () {
return what;
};
}
};
var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
var FAUX_ITERATOR_SYMBOL = '@@iterator';
function getIteratorFn(maybeIterable) {
var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);
if (typeof iteratorFn === 'function') {
return iteratorFn;
}
}
var ANONYMOUS = '<>';
var ReactPropTypes = {
array: createPrimitiveTypeChecker('array'),
bool: createPrimitiveTypeChecker('boolean'),
func: createPrimitiveTypeChecker('function'),
number: createPrimitiveTypeChecker('number'),
object: createPrimitiveTypeChecker('object'),
string: createPrimitiveTypeChecker('string'),
symbol: createPrimitiveTypeChecker('symbol'),
any: createAnyTypeChecker(),
arrayOf: createArrayOfTypeChecker,
element: createElementTypeChecker(),
instanceOf: createInstanceTypeChecker,
node: createNodeChecker(),
objectOf: createObjectOfTypeChecker,
oneOf: createEnumTypeChecker,
oneOfType: createUnionTypeChecker,
shape: createShapeTypeChecker
};
function createChainableTypeChecker(validate) {
function checkType(isRequired, props, propName, componentName, location, propFullName) {
componentName = componentName || ANONYMOUS;
propFullName = propFullName || propName;
if (props[propName] == null) {
var locationName = ReactPropTypeLocationNames[location];
if (isRequired) {
return new Error('Required ' + locationName + ' `' + propFullName + '` was not specified in ' + ('`' + componentName + '`.'));
}
return null;
} else {
return validate(props, propName, componentName, location, propFullName);
}
}
var chainedCheckType = checkType.bind(null, false);
chainedCheckType.isRequired = checkType.bind(null, true);
return chainedCheckType;
}
function createPrimitiveTypeChecker(expectedType) {
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
var propType = getPropType(propValue);
if (propType !== expectedType) {
var locationName = ReactPropTypeLocationNames[location];
var preciseType = getPreciseType(propValue);
return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'));
}
return null;
}
return createChainableTypeChecker(validate);
}
function createAnyTypeChecker() {
return createChainableTypeChecker(emptyFunction.thatReturns(null));
}
function createArrayOfTypeChecker(typeChecker) {
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
if (!Array.isArray(propValue)) {
var locationName = ReactPropTypeLocationNames[location];
var propType = getPropType(propValue);
return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));
}
for (var i = 0; i < propValue.length; i++) {
var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']');
if (error instanceof Error) {
return error;
}
}
return null;
}
return createChainableTypeChecker(validate);
}
function createElementTypeChecker() {
function validate(props, propName, componentName, location, propFullName) {
if (!ReactElement.isValidElement(props[propName])) {
var locationName = ReactPropTypeLocationNames[location];
return new Error('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a single ReactElement.'));
}
return null;
}
return createChainableTypeChecker(validate);
}
function createInstanceTypeChecker(expectedClass) {
function validate(props, propName, componentName, location, propFullName) {
if (!(props[propName] instanceof expectedClass)) {
var locationName = ReactPropTypeLocationNames[location];
var expectedClassName = expectedClass.name || ANONYMOUS;
var actualClassName = getClassName(props[propName]);
return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));
}
return null;
}
return createChainableTypeChecker(validate);
}
function createEnumTypeChecker(expectedValues) {
if (!Array.isArray(expectedValues)) {
return createChainableTypeChecker(function () {
return new Error('Invalid argument supplied to oneOf, expected an instance of array.');
});
}
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
for (var i = 0; i < expectedValues.length; i++) {
if (propValue === expectedValues[i]) {
return null;
}
}
var locationName = ReactPropTypeLocationNames[location];
var valuesString = JSON.stringify(expectedValues);
return new Error('Invalid ' + locationName + ' `' + propFullName + '` of value `' + propValue + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));
}
return createChainableTypeChecker(validate);
}
function createObjectOfTypeChecker(typeChecker) {
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
var propType = getPropType(propValue);
if (propType !== 'object') {
var locationName = ReactPropTypeLocationNames[location];
return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));
}
for (var key in propValue) {
if (propValue.hasOwnProperty(key)) {
var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key);
if (error instanceof Error) {
return error;
}
}
}
return null;
}
return createChainableTypeChecker(validate);
}
function createUnionTypeChecker(arrayOfTypeCheckers) {
if (!Array.isArray(arrayOfTypeCheckers)) {
return createChainableTypeChecker(function () {
return new Error('Invalid argument supplied to oneOfType, expected an instance of array.');
});
}
function validate(props, propName, componentName, location, propFullName) {
for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
var checker = arrayOfTypeCheckers[i];
if (checker(props, propName, componentName, location, propFullName) == null) {
return null;
}
}
var locationName = ReactPropTypeLocationNames[location];
return new Error('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.'));
}
return createChainableTypeChecker(validate);
}
function createNodeChecker() {
function validate(props, propName, componentName, location, propFullName) {
if (!isNode(props[propName])) {
var locationName = ReactPropTypeLocationNames[location];
return new Error('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));
}
return null;
}
return createChainableTypeChecker(validate);
}
function createShapeTypeChecker(shapeTypes) {
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
var propType = getPropType(propValue);
if (propType !== 'object') {
var locationName = ReactPropTypeLocationNames[location];
return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
}
for (var key in shapeTypes) {
var checker = shapeTypes[key];
if (!checker) {
continue;
}
var error = checker(propValue, key, componentName, location, propFullName + '.' + key);
if (error) {
return error;
}
}
return null;
}
return createChainableTypeChecker(validate);
}
function isNode(propValue) {
switch (typeof propValue) {
case 'number':
case 'string':
case 'undefined':
return true;
case 'boolean':
return !propValue;
case 'object':
if (Array.isArray(propValue)) {
return propValue.every(isNode);
}
if (propValue === null || ReactElement.isValidElement(propValue)) {
return true;
}
var iteratorFn = getIteratorFn(propValue);
if (iteratorFn) {
var iterator = iteratorFn.call(propValue);
var step;
if (iteratorFn !== propValue.entries) {
while (!(step = iterator.next()).done) {
if (!isNode(step.value)) {
return false;
}
}
} else {
while (!(step = iterator.next()).done) {
var entry = step.value;
if (entry) {
if (!isNode(entry[1])) {
return false;
}
}
}
}
} else {
return false;
}
return true;
default:
return false;
}
}
function isSymbol(propType, propValue) {
if (propType === 'symbol') {
return true;
}
if (propValue['@@toStringTag'] === 'Symbol') {
return true;
}
if (typeof Symbol === 'function' && propValue instanceof Symbol) {
return true;
}
return false;
}
function getPropType(propValue) {
var propType = typeof propValue;
if (Array.isArray(propValue)) {
return 'array';
}
if (propValue instanceof RegExp) {
return 'object';
}
if (isSymbol(propType, propValue)) {
return 'symbol';
}
return propType;
}
function getPreciseType(propValue) {
var propType = getPropType(propValue);
if (propType === 'object') {
if (propValue instanceof Date) {
return 'date';
} else if (propValue instanceof RegExp) {
return 'regexp';
}
}
return propType;
}
function getClassName(propValue) {
if (!propValue.constructor || !propValue.constructor.name) {
return ANONYMOUS;
}
return propValue.constructor.name;
}
module.exports = ReactPropTypes;
});
//# sourceMappingURL=index.js.map
/***/ }),
/* 49 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__cssstandard__ = __webpack_require__(11);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return defaultBootstrapCss; });
var defaultBootstrapCss = {
root: "",
header: "panel-heading card-header",
body: "panel-body card-block",
footer: "panel-footer card-footer",
navigationButton: "",
navigation: { complete: "sv_complete_btn", prev: "sv_prev_btn", next: "sv_next_btn" },
progress: "progress center-block", progressBar: "progress-bar",
pageTitle: "", pageDescription: "small",
row: "",
question: { mainRoot: "sv_qstn", title: "", description: "small", comment: "form-control", required: "", titleRequired: "", indent: 20 },
panel: { title: "", description: "small", container: "sv_p_container" },
error: { root: "alert alert-danger", icon: "glyphicon glyphicon-exclamation-sign", item: "" },
boolean: { root: "sv_qbln form-inline", item: "checkbox" },
checkbox: { root: "sv_qcbx form-inline", item: "checkbox", other: "sv_q_checkbox_other" },
comment: "form-control",
dropdown: { root: "", control: "form-control", other: "" },
matrix: { root: "table", label: "sv_q_m_label" },
matrixdropdown: { root: "table" },
matrixdynamic: { root: "table", button: "button" },
paneldynamic: { root: "", button: "button" },
multipletext: { root: "table", itemTitle: "", itemValue: "sv_q_mt_item_value form-control" },
radiogroup: { root: "form-inline", item: "radio", label: "", other: "sv_q_radiogroup_other" },
rating: { root: "btn-group", item: "btn btn-default", selected: "active" },
text: "form-control",
expression: "form-control",
saveData: { root: "", saving: "alert alert-info", error: "alert alert-danger", success: "alert alert-success", saveAgainButton: "" },
window: {
root: "modal-content", body: "modal-body",
header: {
root: "modal-header panel-title", title: "pull-left", button: "glyphicon pull-right",
buttonExpanded: "glyphicon pull-right glyphicon-chevron-up", buttonCollapsed: "glyphicon pull-right glyphicon-chevron-down"
}
}
};
__WEBPACK_IMPORTED_MODULE_0__cssstandard__["b" /* surveyCss */]["bootstrap"] = defaultBootstrapCss;
/***/ }),
/* 50 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__cssstandard__ = __webpack_require__(11);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return defaultBootstrapMaterialCss; });
var defaultBootstrapMaterialCss = {
root: "",
header: "panel-heading",
body: "panel-body",
footer: "panel-footer",
navigationButton: "", navigation: { complete: "sv_complete_btn", prev: "sv_prev_btn", next: "sv_next_btn" },
progress: "progress center-block", progressBar: "progress-bar",
pageTitle: "", pageDescription: "small",
row: "",
question: { mainRoot: "sv_qstn form-group", title: "", description: "small", comment: "form-control", required: "", titleRequired: "", indent: 20 },
panel: { title: "", description: "small", container: "sv_p_container" },
error: { root: "alert alert-danger", icon: "glyphicon glyphicon-exclamation-sign", item: "" },
boolean: { root: "sv_qbln form-inline", item: "checkbox" },
checkbox: { root: "sv_qcbx form-inline", item: "checkbox", other: "sv_q_checkbox_other" },
comment: "form-control",
dropdown: { root: "", control: "form-control", other: "" },
matrix: { root: "table", row: "form-group", label: "sv_q_m_label radio-inline", itemValue: "form-control" },
matrixdropdown: { root: "table", itemValue: "form-group" },
matrixdynamic: { root: "table", button: "button" },
paneldynamic: { root: "", button: "button" },
multipletext: { root: "table", itemTitle: "", row: "form-group", itemValue: "sv_q_mt_item_value form-control" },
radiogroup: { root: "form-inline", item: "radio-inline", label: "radio-inline", other: "sv_q_radiogroup_other" },
rating: { root: "btn-group", item: "btn btn-default", selected: "active" },
text: "form-control",
expression: "form-control",
saveData: { root: "", saving: "alert alert-info", error: "alert alert-danger", success: "alert alert-success", saveAgainButton: "" },
window: {
root: "modal-content", body: "modal-body",
header: {
root: "modal-header panel-title", title: "pull-left", button: "glyphicon pull-right",
buttonExpanded: "glyphicon pull-right glyphicon-chevron-up", buttonCollapsed: "glyphicon pull-right glyphicon-chevron-down"
}
}
};
__WEBPACK_IMPORTED_MODULE_0__cssstandard__["b" /* surveyCss */]["bootstrapmaterial"] = defaultBootstrapMaterialCss;
/***/ }),
/* 51 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__localization_arabic__ = __webpack_require__(53);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__localization_czech__ = __webpack_require__(54);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__localization_danish__ = __webpack_require__(55);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__localization_dutch__ = __webpack_require__(56);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__localization_finnish__ = __webpack_require__(57);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__localization_french__ = __webpack_require__(58);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__localization_german__ = __webpack_require__(59);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__localization_greek__ = __webpack_require__(60);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__localization_hungarian__ = __webpack_require__(61);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__localization_icelandic__ = __webpack_require__(62);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__localization_italian__ = __webpack_require__(63);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__localization_latvian__ = __webpack_require__(64);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__localization_polish__ = __webpack_require__(66);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__localization_portuguese__ = __webpack_require__(67);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__localization_romanian__ = __webpack_require__(68);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__localization_russian__ = __webpack_require__(69);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__localization_spanish__ = __webpack_require__(71);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__localization_swedish__ = __webpack_require__(72);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__localization_turkish__ = __webpack_require__(73);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__localization_simplified_chinese__ = __webpack_require__(70);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__localization_persian__ = __webpack_require__(65);
/***/ }),
/* 52 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__main_scss__ = __webpack_require__(45);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__main_scss___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__main_scss__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(13);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_1__helpers__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__validator__ = __webpack_require__(29);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["e"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["f"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["g"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["h"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__itemvalue__ = __webpack_require__(10);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "k", function() { return __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__base__ = __webpack_require__(7);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "l", function() { return __WEBPACK_IMPORTED_MODULE_4__base__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "m", function() { return __WEBPACK_IMPORTED_MODULE_4__base__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "n", function() { return __WEBPACK_IMPORTED_MODULE_4__base__["d"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__localizablestring__ = __webpack_require__(22);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "o", function() { return __WEBPACK_IMPORTED_MODULE_5__localizablestring__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__choicesRestfull__ = __webpack_require__(21);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "p", function() { return __WEBPACK_IMPORTED_MODULE_6__choicesRestfull__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__functionsfactory__ = __webpack_require__(33);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "q", function() { return __WEBPACK_IMPORTED_MODULE_7__functionsfactory__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__conditions__ = __webpack_require__(12);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "r", function() { return __WEBPACK_IMPORTED_MODULE_8__conditions__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "s", function() { return __WEBPACK_IMPORTED_MODULE_8__conditions__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "t", function() { return __WEBPACK_IMPORTED_MODULE_8__conditions__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__conditionsParser__ = __webpack_require__(31);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "u", function() { return __WEBPACK_IMPORTED_MODULE_9__conditionsParser__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__conditionProcessValue__ = __webpack_require__(15);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "v", function() { return __WEBPACK_IMPORTED_MODULE_10__conditionProcessValue__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__error__ = __webpack_require__(9);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "w", function() { return __WEBPACK_IMPORTED_MODULE_11__error__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "x", function() { return __WEBPACK_IMPORTED_MODULE_11__error__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "y", function() { return __WEBPACK_IMPORTED_MODULE_11__error__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__jsonobject__ = __webpack_require__(3);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "z", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "A", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "B", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["e"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "C", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["f"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "D", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["g"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "E", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["h"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "F", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "G", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["i"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "H", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["j"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "I", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["k"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__question_matrixdropdownbase__ = __webpack_require__(24);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "J", function() { return __WEBPACK_IMPORTED_MODULE_13__question_matrixdropdownbase__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "K", function() { return __WEBPACK_IMPORTED_MODULE_13__question_matrixdropdownbase__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "L", function() { return __WEBPACK_IMPORTED_MODULE_13__question_matrixdropdownbase__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "M", function() { return __WEBPACK_IMPORTED_MODULE_13__question_matrixdropdownbase__["d"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__question_matrixdropdown__ = __webpack_require__(83);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "N", function() { return __WEBPACK_IMPORTED_MODULE_14__question_matrixdropdown__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "O", function() { return __WEBPACK_IMPORTED_MODULE_14__question_matrixdropdown__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__question_matrixdynamic__ = __webpack_require__(84);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "P", function() { return __WEBPACK_IMPORTED_MODULE_15__question_matrixdynamic__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Q", function() { return __WEBPACK_IMPORTED_MODULE_15__question_matrixdynamic__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__question_matrix__ = __webpack_require__(82);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "R", function() { return __WEBPACK_IMPORTED_MODULE_16__question_matrix__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "S", function() { return __WEBPACK_IMPORTED_MODULE_16__question_matrix__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__question_multipletext__ = __webpack_require__(85);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "T", function() { return __WEBPACK_IMPORTED_MODULE_17__question_multipletext__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "U", function() { return __WEBPACK_IMPORTED_MODULE_17__question_multipletext__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__panel__ = __webpack_require__(23);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "V", function() { return __WEBPACK_IMPORTED_MODULE_18__panel__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "W", function() { return __WEBPACK_IMPORTED_MODULE_18__panel__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "X", function() { return __WEBPACK_IMPORTED_MODULE_18__panel__["c"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__page__ = __webpack_require__(34);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Y", function() { return __WEBPACK_IMPORTED_MODULE_19__page__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__question__ = __webpack_require__(8);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Z", function() { return __WEBPACK_IMPORTED_MODULE_20__question__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__questionbase__ = __webpack_require__(25);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_0", function() { return __WEBPACK_IMPORTED_MODULE_21__questionbase__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__question_empty__ = __webpack_require__(78);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_1", function() { return __WEBPACK_IMPORTED_MODULE_22__question_empty__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__question_baseselect__ = __webpack_require__(16);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_2", function() { return __WEBPACK_IMPORTED_MODULE_23__question_baseselect__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_3", function() { return __WEBPACK_IMPORTED_MODULE_23__question_baseselect__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__question_checkbox__ = __webpack_require__(75);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_4", function() { return __WEBPACK_IMPORTED_MODULE_24__question_checkbox__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__question_comment__ = __webpack_require__(76);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_5", function() { return __WEBPACK_IMPORTED_MODULE_25__question_comment__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__question_dropdown__ = __webpack_require__(77);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_6", function() { return __WEBPACK_IMPORTED_MODULE_26__question_dropdown__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__questionfactory__ = __webpack_require__(5);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_7", function() { return __WEBPACK_IMPORTED_MODULE_27__questionfactory__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_8", function() { return __WEBPACK_IMPORTED_MODULE_27__questionfactory__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__question_file__ = __webpack_require__(80);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_9", function() { return __WEBPACK_IMPORTED_MODULE_28__question_file__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__question_html__ = __webpack_require__(81);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_10", function() { return __WEBPACK_IMPORTED_MODULE_29__question_html__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__question_radiogroup__ = __webpack_require__(87);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_11", function() { return __WEBPACK_IMPORTED_MODULE_30__question_radiogroup__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__question_rating__ = __webpack_require__(88);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_12", function() { return __WEBPACK_IMPORTED_MODULE_31__question_rating__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_32__question_expression__ = __webpack_require__(79);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_13", function() { return __WEBPACK_IMPORTED_MODULE_32__question_expression__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_33__question_text__ = __webpack_require__(89);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_14", function() { return __WEBPACK_IMPORTED_MODULE_33__question_text__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_34__question_boolean__ = __webpack_require__(74);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_15", function() { return __WEBPACK_IMPORTED_MODULE_34__question_boolean__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_35__question_paneldynamic__ = __webpack_require__(86);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_16", function() { return __WEBPACK_IMPORTED_MODULE_35__question_paneldynamic__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_17", function() { return __WEBPACK_IMPORTED_MODULE_35__question_paneldynamic__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_36__surveytimer__ = __webpack_require__(42);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_18", function() { return __WEBPACK_IMPORTED_MODULE_36__surveytimer__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_37__survey__ = __webpack_require__(18);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_19", function() { return __WEBPACK_IMPORTED_MODULE_37__survey__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_38__trigger__ = __webpack_require__(105);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_20", function() { return __WEBPACK_IMPORTED_MODULE_38__trigger__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_21", function() { return __WEBPACK_IMPORTED_MODULE_38__trigger__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_22", function() { return __WEBPACK_IMPORTED_MODULE_38__trigger__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_23", function() { return __WEBPACK_IMPORTED_MODULE_38__trigger__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_24", function() { return __WEBPACK_IMPORTED_MODULE_38__trigger__["e"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_39__surveyWindow__ = __webpack_require__(41);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_25", function() { return __WEBPACK_IMPORTED_MODULE_39__surveyWindow__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_40__textPreProcessor__ = __webpack_require__(17);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_26", function() { return __WEBPACK_IMPORTED_MODULE_40__textPreProcessor__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_41__dxSurveyService__ = __webpack_require__(32);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_27", function() { return __WEBPACK_IMPORTED_MODULE_41__dxSurveyService__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_42__surveyStrings__ = __webpack_require__(1);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_28", function() { return __WEBPACK_IMPORTED_MODULE_42__surveyStrings__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_29", function() { return __WEBPACK_IMPORTED_MODULE_42__surveyStrings__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_43__questionCustomWidgets__ = __webpack_require__(35);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_30", function() { return __WEBPACK_IMPORTED_MODULE_43__questionCustomWidgets__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_31", function() { return __WEBPACK_IMPORTED_MODULE_43__questionCustomWidgets__["a"]; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Version; });
// styles
var Version;
Version = "" + "0.96.2";
//Uncomment to include the "date" question type.
//export {default as QuestionDateModel} from "../../plugins/question_date";
/***/ }),
/* 53 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export arabicSurveyStrings */
var arabicSurveyStrings = {
pagePrevText: "السابق",
pageNextText: "التالي",
completeText: "انهاء- تم",
progressText: "{1} صفحة {0} من",
otherItemText: "نص آخر",
emptySurvey: "لا توجد صفحة مرئية أو سؤال في المسح",
completingSurvey: "شكرا لك لاستكمال الاستبيان!",
loadingSurvey: "...يتم تحميل الاستبيان",
optionsCaption: "...اختر",
requiredError: ".يرجى الإجابة على السؤال",
requiredInAllRowsError: "يرجى الإجابة على الأسئلة في جميع الصفوف",
numericError: "يجب أن تكون القيمة الرقمية.",
textMinLength: "الرجاء إدخال ما لا يقل عن {0} حرف",
textMaxLength: "الرجاء إدخال أقل من {0} حرف",
textMinMaxLength: "يرجى إدخال أكثر من {0} وأقل من {1} حرف",
minRowCountError: "يرجى ملء ما لا يقل عن {0} الصفوف",
minSelectError: "يرجى تحديد ما لا يقل عن {0} المتغيرات",
maxSelectError: "يرجى تحديد ما لا يزيد عن {0} المتغيرات",
numericMinMax: "و'{0}' يجب أن تكون مساوية أو أكثر من {1} ويساوي أو أقل من {2}ا",
numericMin: "و'{0}' يجب أن تكون مساوية أو أكثر من {1}ا",
numericMax: "و'{0}' يجب أن تكون مساوية أو أقل من {1}ا",
invalidEmail: "رجاء قم بإدخال بريد الكتروني صحيح",
urlRequestError: "طلب إرجاع خطأ '{0}'. {1}ا",
urlGetChoicesError: "عاد طلب بيانات فارغة أو 'المسار' ممتلكات غير صحيحة ",
exceedMaxSize: "وينبغي ألا يتجاوز حجم الملف {0}ا",
otherRequiredError: "الرجاء إدخال قيمة أخرى",
uploadingFile: "الملف الخاص بك تحميل. يرجى الانتظار عدة ثوان وحاول مرة أخرى",
addRow: "اضافة صف",
removeRow: "إزالة صف"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ar"] = arabicSurveyStrings;
/***/ }),
/* 54 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export czechSurveyStrings */
var czechSurveyStrings = {
pagePrevText: "Předchozí",
pageNextText: "Další",
completeText: "Hotovo",
otherItemText: "Jiná odpověď (napište)",
progressText: "Strana {0} z {1}",
emptySurvey: "Průzkumu neobsahuje žádné otázky.",
completingSurvey: "Děkujeme za vyplnění průzkumu!",
loadingSurvey: "Probíhá načítání průzkumu...",
optionsCaption: "Vyber...",
requiredError: "Odpovězte prosím na otázku.",
requiredInAllRowsError: "Odpovězte prosím na všechny otázky.",
numericError: "V tomto poli lze zadat pouze čísla.",
textMinLength: "Zadejte prosím alespoň {0} znaků.",
textMaxLength: "Zadejte prosím méně než {0} znaků.",
textMinMaxLength: "Zadejte prosím více než {0} a méně než {1} znaků.",
minRowCountError: "Vyplňte prosím alespoň {0} řádků.",
minSelectError: "Vyberte prosím alespoň {0} varianty.",
maxSelectError: "Nevybírejte prosím více než {0} variant.",
numericMinMax: "Odpověď '{0}' by mělo být větší nebo rovno {1} a menší nebo rovno {2}",
numericMin: "Odpověď '{0}' by mělo být větší nebo rovno {1}",
numericMax: "Odpověď '{0}' by mělo být menší nebo rovno {1}",
invalidEmail: "Zadejte prosím platnou e-mailovou adresu.",
urlRequestError: "Požadavek vrátil chybu '{0}'. {1}",
urlGetChoicesError: "Požadavek nevrátil data nebo cesta je neplatná",
exceedMaxSize: "Velikost souboru by neměla být větší než {0}.",
otherRequiredError: "Zadejte prosím jinou hodnotu.",
uploadingFile: "Váš soubor se nahrává. Zkuste to prosím za několik sekund.",
addRow: "Přidat řádek",
removeRow: "Odstranit"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["cz"] = czechSurveyStrings;
/***/ }),
/* 55 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export danishSurveyStrings */
var danishSurveyStrings = {
pagePrevText: "Tilbage",
pageNextText: "Videre",
completeText: "Færdig",
progressText: "Side {0} af {1}",
emptySurvey: "Der er ingen synlige spørgsmål.",
completingSurvey: "Mange tak for din besvarelse!",
loadingSurvey: "Spørgeskemaet hentes fra serveren...",
otherItemText: "Valgfrit svar...",
optionsCaption: "Vælg...",
requiredError: "Besvar venligst spørgsmålet.",
numericError: "Angiv et tal.",
textMinLength: "Angiv mindst {0} tegn.",
minSelectError: "Vælg venligst mindst {0} svarmulighed(er).",
maxSelectError: "Vælg venligst færre {0} svarmuligheder(er).",
numericMinMax: "'{0}' skal være lig med eller større end {1} og lig med eller mindre end {2}",
numericMin: "'{0}' skal være lig med eller større end {1}",
numericMax: "'{0}' skal være lig med eller mindre end {1}",
invalidEmail: "Angiv venligst en gyldig e-mail adresse.",
exceedMaxSize: "Filstørrelsen må ikke overstige {0}.",
otherRequiredError: "Angiv en værdi for dit valgfrie svar."
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["da"] = danishSurveyStrings;
/***/ }),
/* 56 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export dutchSurveyStrings */
//Created on behalf https://github.com/Frank13
var dutchSurveyStrings = {
pagePrevText: "Vorige",
pageNextText: "Volgende",
completeText: "Afsluiten",
otherItemText: "Andere",
progressText: "Pagina {0} van {1}",
emptySurvey: "Er is geen zichtbare pagina of vraag in deze vragenlijst",
completingSurvey: "Bedankt om deze vragenlijst in te vullen",
loadingSurvey: "De vragenlijst is aan het laden...",
optionsCaption: "Kies...",
requiredError: "Gelieve een antwoord in te vullen",
numericError: "Het antwoord moet een getal zijn",
textMinLength: "Gelieve minsten {0} karakters in te vullen.",
minSelectError: "Gelieve minimum {0} antwoorden te selecteren.",
maxSelectError: "Gelieve niet meer dan {0} antwoorden te selecteren.",
numericMinMax: "Uw antwoord '{0}' moet groter of gelijk zijn aan {1} en kleiner of gelijk aan {2}",
numericMin: "Uw antwoord '{0}' moet groter of gelijk zijn aan {1}",
numericMax: "Uw antwoord '{0}' moet groter of gelijk zijn aan {1}",
invalidEmail: "Gelieve een geldig e-mailadres in te vullen.",
exceedMaxSize: "De grootte van het bestand mag niet groter zijn dan {0}.",
otherRequiredError: "Gelieve het veld 'Andere' in te vullen"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["nl"] = dutchSurveyStrings;
/***/ }),
/* 57 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export finnishSurveyStrings */
var finnishSurveyStrings = {
pagePrevText: "Edellinen",
pageNextText: "Seuraava",
completeText: "Valmis",
otherItemText: "Muu (kuvaile)",
progressText: "Sivu {0}/{1}",
emptySurvey: "Tässä kyselyssä ei ole yhtäkään näkyvillä olevaa sivua tai kysymystä.",
completingSurvey: "Kiitos kyselyyn vastaamisesta!",
loadingSurvey: "Kyselyä ladataan palvelimelta...",
optionsCaption: "Valitse...",
requiredError: "Vastaa kysymykseen, kiitos.",
numericError: "Arvon tulee olla numeerinen.",
textMinLength: "Ole hyvä ja syötä vähintään {0} merkkiä.",
minSelectError: "Ole hyvä ja valitse vähintään {0} vaihtoehtoa.",
maxSelectError: "Ole hyvä ja valitse enintään {0} vaihtoehtoa.",
numericMinMax: "'{0}' täytyy olla enemmän tai yhtä suuri kuin {1} ja vähemmän tai yhtä suuri kuin {2}",
numericMin: "'{0}' täytyy olla enemmän tai yhtä suuri kuin {1}",
numericMax: "'{0}' täytyy olla vähemmän tai yhtä suuri kuin {1}",
invalidEmail: "Syötä validi sähköpostiosoite.",
otherRequiredError: "Ole hyvä ja syötä \"Muu (kuvaile)\""
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["fi"] = finnishSurveyStrings;
/***/ }),
/* 58 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export frenchSurveyStrings */
//Created on behalf https://github.com/Frank13
var frenchSurveyStrings = {
pagePrevText: "Pr\u00e9c\u00e9dent",
pageNextText: "Suivant",
completeText: "Terminer",
otherItemText: "Autre (pr\u00e9ciser)",
progressText: "Page {0} sur {1}",
emptySurvey: "Il n'y a ni page visible ni question visible dans ce questionnaire",
completingSurvey: "Merci d'avoir r\u00e9pondu au questionnaire!",
loadingSurvey: "Le questionnaire est en cours de chargement...",
optionsCaption: "Choisissez...",
requiredError: "La r\u00e9ponse \u00e0 cette question est obligatoire.",
requiredInAllRowsError: "Toutes les lignes sont obligatoires",
numericError: "La r\u00e9ponse doit \u00eatre un nombre.",
textMinLength: "Merci d'entrer au moins {0} symboles.",
minSelectError: "Merci de s\u00e9lectionner au moins {0}r\u00e9ponses.",
maxSelectError: "Merci de s\u00e9lectionner au plus {0}r\u00e9ponses.",
numericMinMax: "Votre r\u00e9ponse '{0}' doit \u00eatresup\u00e9rieure ou \u00e9gale \u00e0 {1} et inf\u00e9rieure ou\u00e9gale \u00e0 {2}",
numericMin: "Votre r\u00e9ponse '{0}' doit \u00eatresup\u00e9rieure ou \u00e9gale \u00e0 {1}",
numericMax: "Votre r\u00e9ponse '{0}' doit \u00eatreinf\u00e9rieure ou \u00e9gale \u00e0 {1}",
invalidEmail: "Merci d'entrer une adresse mail valide.",
exceedMaxSize: "La taille du fichier ne doit pas exc\u00e9der {0}.",
otherRequiredError: "Merci de pr\u00e9ciser le champ 'Autre'."
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["fr"] = frenchSurveyStrings;
/***/ }),
/* 59 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export germanSurveyStrings */
var germanSurveyStrings = {
pagePrevText: "Zurück",
pageNextText: "Weiter",
completeText: "Absenden",
progressText: "Seite {0} von {1}",
emptySurvey: "Es gibt keine sichtbare Frage.",
completingSurvey: "Vielen Dank für die Beantwortung des Fragebogens!",
loadingSurvey: "Der Fragebogen wird vom Server geladen...",
otherItemText: "Benutzerdefinierte Antwort...",
optionsCaption: "Wählen...",
requiredError: "Bitte beantworten Sie diese Frage.",
numericError: "Der Wert sollte eine Zahl sein.",
textMinLength: "Bitte geben Sie mindestens {0} Zeichen ein.",
minSelectError: "Bitte wählen Sie mindestens {0} Einträge.",
maxSelectError: "Bitte wählen Sie nicht mehr als {0} Einträge.",
numericMinMax: "'{0}' sollte gleich oder größer sein als {1} und gleich oder kleiner als {2}.",
numericMin: "'{0}' sollte gleich oder größer sein als {1}.",
numericMax: "'{0}' sollte gleich oder kleiner als {1} sein.",
invalidEmail: "Bitte geben Sie eine gültige E-Mail Adresse ein.",
exceedMaxSize: "Die Dateigröße darf {0} KB nicht überschreiten.",
otherRequiredError: "Bitte geben Sie Ihre benutzerdefinierte Antwort ein."
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["de"] = germanSurveyStrings;
/***/ }),
/* 60 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export greekSurveyStrings */
//Created by https://github.com/agelospanagiotakis
var greekSurveyStrings = {
pagePrevText: "Προηγούμενο",
pageNextText: "Επόμενο",
completeText: "Ολοκλήρωση",
otherItemText: "Άλλο (παρακαλώ διευκρινίστε)",
progressText: "Σελίδα {0} από {1}",
emptySurvey: "Δεν υπάρχει καμία ορατή σελίδα ή ορατή ερώτηση σε αυτό το ερωτηματολόγιο.",
completingSurvey: "Ευχαριστούμε για την συμπλήρωση αυτου του ερωτηματολογίου!",
loadingSurvey: "Το ερωτηματολόγιο φορτώνεται απο το διακομιστή...",
optionsCaption: "Επιλέξτε...",
requiredError: "Παρακαλώ απαντήστε στην ερώτηση.",
requiredInAllRowsError: "Παρακαλώ απαντήστε στις ερωτήσεις σε όλες τις γραμμές.",
numericError: "Η τιμή πρέπει να είναι αριθμιτική.",
textMinLength: "Παρακαλώ συμπληρώστε τουλάχιστον {0} σύμβολα.",
minRowCountError: "Παρακαλώ συμπληρώστε τουλάχιστον {0} γραμμές.",
minSelectError: "Παρακαλώ επιλέξτε τουλάχιστον {0} παραλλαγές.",
maxSelectError: "Παρακαλώ επιλέξτε όχι παραπάνω απο {0} παραλλαγές.",
numericMinMax: "Το '{0}' θα πρέπει να είναι ίσο ή μεγαλύτερο απο το {1} και ίσο ή μικρότερο απο το {2}",
numericMin: "Το '{0}' πρέπει να είναι μεγαλύτερο ή ισο με το {1}",
numericMax: "Το '{0}' πρέπει να είναι μικρότερο ή ίσο απο το {1}",
invalidEmail: "Παρακαλώ δώστε μια αποδεκτή διεύθυνση e-mail.",
urlRequestError: "Η αίτηση επέστρεψε σφάλμα '{0}'. {1}",
urlGetChoicesError: "Η αίτηση επέστρεψε κενά δεδομένα ή η ιδότητα 'μονοπάτι/path' είναι εσφαλέμένη",
exceedMaxSize: "Το μέγεθος δεν μπορεί να υπερβένει τα {0}.",
otherRequiredError: "Παρακαλώ συμπληρώστε την τιμή για το πεδίο 'άλλο'.",
uploadingFile: "Το αρχείο σας ανεβαίνει. Παρακαλώ περιμένετε καποια δευτερόλεπτα και δοκιμάστε ξανά.",
addRow: "Προσθήκη γραμμής",
removeRow: "Αφαίρεση"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["gr"] = greekSurveyStrings;
/***/ }),
/* 61 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export hungarianSurveyStrings */
var hungarianSurveyStrings = {
pagePrevText: "Vissza",
pageNextText: "Tovább",
completeText: "Kész",
otherItemText: "Egyéb (adja meg)",
progressText: "{0}./{1} oldal",
emptySurvey: "There is no visible page or question in the survey.",
completingSurvey: "Köszönjük, hogy kitöltötte felmérésünket!",
completingSurveyBefore: "Már kitöltötte a felmérést.",
loadingSurvey: "Felmérés betöltése...",
optionsCaption: "Válasszon...",
value: "érték",
requiredError: "Kérjük, válaszolja meg ezt a kérdést!",
requiredInAllRowsError: "Kérjük adjon választ minden sorban!",
numericError: "Az érték szám kell, hogy legyen!",
textMinLength: "Adjon meg legalább {0} karaktert!",
textMaxLength: "Legfeljebb {0} karaktert adjon meg!",
textMinMaxLength: "Adjon meg legalább {0}, de legfeljebb {1} karaktert!",
minRowCountError: "Töltsön ki minimum {0} sort!",
minSelectError: "Válasszon ki legalább {0} lehetőséget!",
maxSelectError: "Ne válasszon többet, mint {0} lehetőség!",
numericMinMax: "'{0}' legyen nagyobb, vagy egyenlő, mint {1} és kisebb, vagy egyenlő, mint {2}!",
numericMin: "'{0}' legyen legalább {1}!",
numericMax: "The '{0}' ne legyen nagyobb, mint {1}!",
invalidEmail: "Adjon meg egy valós email címet!",
urlRequestError: "A lekérdezés hibával tért vissza: '{0}'. {1}",
urlGetChoicesError: "A lekérdezés üres adattal tért vissza, vagy a 'path' paraméter helytelen.",
exceedMaxSize: "A méret nem lehet nagyobb, mint {0}.",
otherRequiredError: "Adja meg az egyéb értéket!",
uploadingFile: "Feltöltés folyamatban. Várjon pár másodpercet, majd próbálja újra.",
confirmDelete: "Törli ezt a rekordot?",
keyDuplicationError: "Az értéknek egyedinek kell lennie.",
addRow: "Sor hozzáadása",
removeRow: "Eltávolítás",
addPanel: "Új hozzáadása",
removePanel: "Eltávolítás",
choices_Item: "elem",
matrix_column: "Oszlop",
matrix_row: "Sor",
savingData: "Eredmény mentése a szerverre...",
savingDataError: "Egy hiba folytán nem tudtuk elmenteni az eredményt.",
savingDataSuccess: "Eredmény sikeresen mentve!",
saveAgainButton: "Próbálja újra"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["hu"] = hungarianSurveyStrings;
/***/ }),
/* 62 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export icelandicSurveyStrings */
var icelandicSurveyStrings = {
pagePrevText: "Tilbaka",
pageNextText: "Áfram",
completeText: "Lokið",
otherItemText: "Hinn (skýring)",
progressText: "Síða {0} of {1}",
emptySurvey: "Það er enginn síða eða spurningar í þessari könnun.",
completingSurvey: "Takk fyrir að fyllja út þessa könnun!",
loadingSurvey: "Könnunin er að hlaða...",
optionsCaption: "Veldu...",
requiredError: "Vinsamlegast svarið spurningunni.",
requiredInAllRowsError: "Vinsamlegast svarið spurningum í öllum röðum.",
numericError: "Þetta gildi verður að vera tala.",
textMinLength: "Það ætti að vera minnst {0} tákn.",
textMaxLength: "Það ætti að vera mest {0} tákn.",
textMinMaxLength: "Það ætti að vera fleiri en {0} og færri en {1} tákn.",
minRowCountError: "Vinsamlegast fyllið úr að minnsta kosti {0} raðir.",
minSelectError: "Vinsamlegast veljið að minnsta kosti {0} möguleika.",
maxSelectError: "Vinsamlegast veljið ekki fleiri en {0} möguleika.",
numericMinMax: "'{0}' ætti að vera meira en eða jafnt og {1} minna en eða jafnt og {2}",
numericMin: "{0}' ætti að vera meira en eða jafnt og {1}",
numericMax: "'{0}' ætti að vera minna en eða jafnt og {1}",
invalidEmail: "Vinsamlegast sláið inn gilt netfang.",
urlRequestError: "Beiðninn skilaði eftirfaranadi villu '{0}'. {1}",
urlGetChoicesError: "Beiðninng skilaði engum gögnum eða slóðinn var röng",
exceedMaxSize: "Skráinn skal ekki vera stærri en {0}.",
otherRequiredError: "Vinamlegast fyllið út hitt gildið.",
uploadingFile: "Skráinn þín var send. Vinsamlegast bíðið í nokkrar sekúndur og reynið aftur.",
addRow: "Bæta við röð",
removeRow: "Fjarlægja",
choices_firstItem: "fyrsti hlutur",
choices_secondItem: "annar hlutur",
choices_thirdItem: "þriðji hlutur",
matrix_column: "Dálkur",
matrix_row: "Röð"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["is"] = icelandicSurveyStrings;
/***/ }),
/* 63 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export italianSurveyStrings */
var italianSurveyStrings = {
pagePrevText: "Precedente",
pageNextText: "Successivo",
completeText: "Salva",
otherItemText: "Altro (descrivi)",
progressText: "Pagina {0} di {1}",
emptySurvey: "Non ci sono pagine o domande visibili nel questionario.",
completingSurvey: "Grazie per aver completato il questionario!",
loadingSurvey: "Caricamento del questionario in corso...",
optionsCaption: "Scegli...",
requiredError: "Campo obbligatorio",
requiredInAllRowsError: "Completare tutte le righe",
numericError: "Il valore deve essere numerico",
textMinLength: "Inserire almeno {0} caratteri",
textMaxLength: "Lunghezza massima consentita {0} caratteri",
textMinMaxLength: "Inserire una stringa con minimo {0} e massimo {1} caratteri",
minRowCountError: "Completare almeno {0} righe.",
minSelectError: "Selezionare almeno {0} varianti.",
maxSelectError: "Selezionare massimo {0} varianti.",
numericMinMax: "'{0}' deve essere uguale o superiore a {1} e uguale o inferiore a {2}",
numericMin: "'{0}' deve essere uguale o superiore a {1}",
numericMax: "'{0}' deve essere uguale o inferiore a {1}",
invalidEmail: "Inserire indirizzo mail valido",
urlRequestError: "La richiesta ha risposto con un errore '{0}'. {1}",
urlGetChoicesError: "La richiesta ha risposto null oppure il percorso non è corretto",
exceedMaxSize: "Il file non può eccedere {0}",
otherRequiredError: "Inserire il valore 'altro'",
uploadingFile: "File in caricamento. Attendi alcuni secondi e riprova",
addRow: "Aggiungi riga",
removeRow: "Rimuovi riga",
choices_Item: "Elemento",
matrix_column: "Colonna",
matrix_row: "Riga"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["it"] = italianSurveyStrings;
/***/ }),
/* 64 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export latvianSurveyStrings */
var latvianSurveyStrings = {
pagePrevText: "Atpakaļ",
pageNextText: "Tālāk",
completeText: "Pabeigt",
progressText: "Lappuse {0} no {1}",
emptySurvey: "Nav neviena jautājuma.",
completingSurvey: "Pateicamies Jums par anketas aizpildīšanu!",
loadingSurvey: "Ielāde no servera...",
otherItemText: "Cits (lūdzu, aprakstiet!)",
optionsCaption: "Izvēlēties...",
requiredError: "Lūdzu, atbildiet uz jautājumu!",
numericError: "Atbildei ir jābūt skaitlim.",
textMinLength: "Lūdzu, ievadiet vismaz {0} simbolus.",
minSelectError: "Lūdzu, izvēlieties vismaz {0} variantu.",
maxSelectError: "Lūdzu, izvēlieties ne vairak par {0} variantiem.",
numericMinMax: "'{0}' jābūt vienādam vai lielākam nekā {1}, un vienādam vai mazākam, nekā {2}",
numericMin: "'{0}' jābūt vienādam vai lielākam {1}",
numericMax: "'{0}' jābūt vienādam vai lielākam {1}",
invalidEmail: "Lūdzu, ievadiet patiesu e-pasta adresi!",
otherRequiredError: "Lūdzu, ievadiet datus laukā \"Cits\""
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["lv"] = latvianSurveyStrings;
/***/ }),
/* 65 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export persianSurveyStrings */
var persianSurveyStrings = {
pagePrevText: "قبلی",
pageNextText: "بعدی",
completeText: "تکمیل",
otherItemText: "دیگر(توضیح)",
progressText: "صفحه {0} از {1}",
emptySurvey: "صفحه ای یا گزینه ای برای این پرسشنامه موجود نیست.",
completingSurvey: "از شما بابت تکمیل این پرسشنامه متشکریم",
completingSurveyBefore: "به نظر می رسد هم هم اکنون پرسشنامه را تکمیل کرده اید.",
loadingSurvey: "درحال ایجاد پرسشنامه",
optionsCaption: "انتخاب کنید...",
value: "مقدار",
requiredError: "لطفا به سوال پاسخ دهید",
requiredInAllRowsError: "لطفا به تمام سطر های سوالات پاسخ دهید",
numericError: "مقدار باید عددی باشد",
textMinLength: "لطفا حداقل {0} حرف وارد کنید",
textMaxLength: "لطفا کمتر از {0} حرف وارد کنید.",
textMinMaxLength: "لطفا بیشتر از {0} حرف و کمتر از {1} حرف وارد کنید.",
minRowCountError: "لطفا حداقل {0} سطر وارد کنید.",
minSelectError: "حداقل {0} انتخاب کنید.",
maxSelectError: "لطفا بیشتر از {0} انتخاب کنید.",
numericMinMax: "'{0}' باید بین {1} و {2} باشد",
numericMin: "'{0}' بزرگتر مساوی {1} باشد",
numericMax: "'{0}' باید کوچکتر یا مساوی {1} باشد",
invalidEmail: "لطفا ایمیل صحیح درج کنید",
urlRequestError: "درخواست با خطا روبرو شد: '{0}'. {1}",
urlGetChoicesError: "درخواست مسیری خالی بازگشت داده یا مسیر درست تنظیم نشده",
exceedMaxSize: "بیشترین حجم مجاز فایل: {0}",
otherRequiredError: "مقدار 'دیگر' را وارد کنید",
uploadingFile: "فایل در حال آیلود می باشد. لطفا صبر کنید.",
confirmDelete: "آیا مایل به حذف این ردیف هستید؟",
keyDuplicationError: "این مقدار باید غیر تکراری باشد",
addRow: "سطر جدید",
removeRow: "حذف",
addPanel: "جدید",
removePanel: "حذف",
choices_Item: "آیتم",
matrix_column: "ستون",
matrix_row: "سطر",
savingData: "نتایج در حال ذخیره سازی در سرور می باشد",
savingDataError: "خطایی در ذخیره سازی نتایج رخ داده است",
savingDataSuccess: "نتایج با موفقیت ذخیره شد",
saveAgainButton: "مجدد تلاش کنید"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["fa"] = persianSurveyStrings;
/***/ }),
/* 66 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export polishSurveyStrings */
var polishSurveyStrings = {
pagePrevText: "Wstecz",
pageNextText: "Dalej",
completeText: "Gotowe",
otherItemText: "Inna odpowiedź (wpisz)",
progressText: "Strona {0} z {1}",
emptySurvey: "Nie ma widocznych pytań.",
completingSurvey: "Dziękujemy za wypełnienie ankiety!",
loadingSurvey: "Trwa wczytywanie ankiety...",
optionsCaption: "Wybierz...",
requiredError: "Proszę odpowiedzieć na to pytanie.",
requiredInAllRowsError: "Proszę odpowiedzieć na wszystkie pytania.",
numericError: "W tym polu można wpisać tylko liczby.",
textMinLength: "Proszę wpisać co najmniej {0} znaków.",
textMaxLength: "Proszę wpisać mniej niż {0} znaków.",
textMinMaxLength: "Proszę wpisać więcej niż {0} i mniej niż {1} znaków.",
minRowCountError: "Proszę uzupełnić przynajmniej {0} wierszy.",
minSelectError: "Proszę wybrać co najmniej {0} pozycji.",
maxSelectError: "Proszę wybrać nie więcej niż {0} pozycji.",
numericMinMax: "Odpowiedź '{0}' powinna być większa lub równa {1} oraz mniejsza lub równa {2}",
numericMin: "Odpowiedź '{0}' powinna być większa lub równa {1}",
numericMax: "Odpowiedź '{0}' powinna być mniejsza lub równa {1}",
invalidEmail: "Proszę podać prawidłowy adres email.",
urlRequestError: "Żądanie zwróciło błąd '{0}'. {1}",
urlGetChoicesError: "Żądanie nie zwróciło danych albo ścieżka jest nieprawidłowa",
exceedMaxSize: "Rozmiar przesłanego pliku nie może przekraczać {0}.",
otherRequiredError: "Proszę podać inną odpowiedź.",
uploadingFile: "Trwa przenoszenie Twojego pliku, proszę spróbować ponownie za kilka sekund.",
addRow: "Dodaj wiersz",
removeRow: "Usuń"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["pl"] = polishSurveyStrings;
/***/ }),
/* 67 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export portugueseSurveyStrings */
var portugueseSurveyStrings = {
pagePrevText: "Anterior",
pageNextText: "Próximo",
completeText: "Finalizar",
otherItemText: "Outros (descrever)",
progressText: "Pagina {0} de {1}",
emptySurvey: "Não há página visível ou pergunta na pesquisa.",
completingSurvey: "Obrigado por finalizar a pesquisa!",
completingSurveyBefore: "Nossos registros mostram que você já finalizou a pesquisa.",
loadingSurvey: "A pesquisa está carregando...",
optionsCaption: "Selecione...",
value: "valor",
requiredError: "Por favor, responda a pergunta.",
requiredInAllRowsError: "Por favor, responda as perguntas em todas as linhas.",
numericError: "O valor deve ser numérico.",
textMinLength: "Por favor, insira pelo menos {0} caracteres.",
textMaxLength: "Por favor, insira menos de {0} caracteres.",
textMinMaxLength: "Por favor, insira mais de {0} e menos de {1} caracteres.",
minRowCountError: "Preencha pelo menos {0} linhas.",
minSelectError: "Selecione pelo menos {0} opções.",
maxSelectError: "Por favor, selecione não mais do que {0} opções.",
numericMinMax: "O '{0}' deve ser igual ou superior a {1} e igual ou menor que {2}",
numericMin: "O '{0}' deve ser igual ou superior a {1}",
numericMax: "O '{0}' deve ser igual ou inferior a {1}",
invalidEmail: "Por favor, informe um e-mail válido.",
urlRequestError: "A requisição retornou o erro '{0}'. {1}",
urlGetChoicesError: "A requisição não retornou dados ou o 'caminho' da requisição não está correto",
exceedMaxSize: "O tamanho do arquivo não deve exceder {0}.",
otherRequiredError: "Por favor, informe o outro valor.",
uploadingFile: "Seu arquivo está sendo carregado. Por favor, aguarde alguns segundos e tente novamente.",
addRow: "Adicionar linha",
removeRow: "Remover linha",
addPanel: "Adicionar novo",
removePanel: "Remover",
choices_Item: "item",
matrix_column: "Coluna",
matrix_row: "Linha",
savingData: "Os resultados esto sendo salvos no servidor...",
savingDataError: "Ocorreu um erro e não foi possível salvar os resultados.",
savingDataSuccess: "Os resultados foram salvos com sucesso!",
saveAgainButton: "Tente novamente"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["pt"] = portugueseSurveyStrings;
/***/ }),
/* 68 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export romanianSurveyStrings */
var romanianSurveyStrings = {
pagePrevText: "Precedent",
pageNextText: "Următor",
completeText: "Finalizare",
otherItemText: "Altul(precizaţi)",
progressText: "Pagina {0} din {1}",
emptySurvey: "Nu sunt întrebări pentru acest chestionar",
completingSurvey: "Vă mulţumim pentru timpul acordat!",
loadingSurvey: "Chestionarul se încarcă...",
optionsCaption: "Alegeţi...",
requiredError: "Răspunsul la această întrebare este obligatoriu.",
requiredInAllRowsError: "Toate răspunsurile sunt obligatorii",
numericError: "Răspunsul trebuie să fie numeric.",
textMinLength: "Trebuie să introduci minim {0} caractere.",
minSelectError: "Trebuie să selectezi minim {0} opţiuni.",
maxSelectError: "Trebuie să selectezi maxim {0} opţiuni.",
numericMinMax: "Răspunsul '{0}' trebuie să fie mai mare sau egal ca {1} şî mai mic sau egal cu {2}",
numericMin: "Răspunsul '{0}' trebuie să fie mai mare sau egal ca {1}",
numericMax: "Răspunsul '{0}' trebuie să fie mai mic sau egal ca {1}",
invalidEmail: "Trebuie să introduceţi o adresa de email validă.",
exceedMaxSize: "Dimensiunea fişierului nu trebuie să depăşească {0}.",
otherRequiredError: "Trebuie să completezi câmpul 'Altul'."
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ro"] = romanianSurveyStrings;
/***/ }),
/* 69 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export russianSurveyStrings */
var russianSurveyStrings = {
pagePrevText: "Назад",
pageNextText: "Далее",
completeText: "Готово",
progressText: "Страница {0} из {1}",
emptySurvey: "Нет ни одного вопроса.",
completingSurvey: "Благодарим Вас за заполнение анкеты!",
loadingSurvey: "Загрузка с сервера...",
otherItemText: "Другое (пожалуйста, опишите)",
optionsCaption: "Выбрать...",
requiredError: "Пожалуйста, ответьте на вопрос.",
numericError: "Ответ должен быть числом.",
textMinLength: "Пожалуйста, введите хотя бы {0} символов.",
minSelectError: "Пожалуйста, выберите хотя бы {0} вариантов.",
maxSelectError: "Пожалуйста, выберите не более {0} вариантов.",
numericMinMax: "'{0}' должно быть равным или больше, чем {1}, и равным или меньше, чем {2}",
numericMin: "'{0}' должно быть равным или больше, чем {1}",
numericMax: "'{0}' должно быть равным или меньше, чем {1}",
invalidEmail: "Пожалуйста, введите действительный адрес электронной почты.",
otherRequiredError: "Пожалуйста, введите данные в поле \"Другое\""
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ru"] = russianSurveyStrings;
/***/ }),
/* 70 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export simplifiedChineseSurveyStrings */
var simplifiedChineseSurveyStrings = {
pagePrevText: "上一页",
pageNextText: "下一页",
completeText: "提交问卷",
otherItemText: "填写其他答案",
progressText: "第 {0} 页, 共 {1} 页",
emptySurvey: "问卷中没有问题或页面",
completingSurvey: "感谢您的参与!",
loadingSurvey: "问卷正在加载中...",
optionsCaption: "请选择...",
requiredError: "请填写此问题",
requiredInAllRowsError: "请填写所有行中问题",
numericError: "答案必须是个数字",
textMinLength: "答案长度至少 {0} 个字符",
textMaxLength: "答案长度不能超过 {0} 个字符",
textMinMaxLength: "答案长度必须在 {0} - {1} 个字符之间",
minRowCountError: "最少需要填写 {0} 行答案",
minSelectError: "最少需要选择 {0} 项答案",
maxSelectError: "最多只能选择 {0} 项答案",
numericMinMax: "答案 '{0}' 必须大于等于 {1} 且小于等于 {2}",
numericMin: "答案 '{0}' 必须大于等于 {1}",
numericMax: "答案 '{0}' 必须小于等于 {1}",
invalidEmail: "请输入有效的 Email 地址",
urlRequestError: "载入选项时发生错误 '{0}': {1}",
urlGetChoicesError: "未能载入有效的选项或请求参数路径有误",
exceedMaxSize: "文件大小不能超过 {0}",
otherRequiredError: "请完成其他问题",
uploadingFile: "文件上传中... 请耐心等待几秒后重试",
addRow: "添加答案",
removeRow: "删除答案",
choices_Item: "选项",
matrix_column: "列",
matrix_row: "行",
savingData: "正在将结果保存到服务器...",
savingDataError: "在保存结果过程中发生了错误,结果未能保存",
savingDataSuccess: "结果保存成功!",
saveAgainButton: "请重试"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["zh-cn"] = simplifiedChineseSurveyStrings;
/***/ }),
/* 71 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export spanishSurveyStrings */
var spanishSurveyStrings = {
pagePrevText: "Anterior",
pageNextText: "Siguiente",
completeText: "Completo",
otherItemText: "Otro (describa)",
progressText: "Página {0} de {1}",
emptySurvey: "No hay página visible o pregunta en la encuesta.",
completingSurvey: "Gracias por completar la encuesta!",
loadingSurvey: "La encuesta está cargando...",
optionsCaption: "Seleccione...",
requiredError: "Por favor conteste la pregunta.",
requiredInAllRowsError: "Por favor conteste las preguntas en cada hilera.",
numericError: "La estimación debe ser numérica.",
textMinLength: "Por favor entre por lo menos {0} símbolos.",
textMaxLength: "Por favor entre menos de {0} símbolos.",
textMinMaxLength: "Por favor entre más de {0} y menos de {1} símbolos.",
minRowCountError: "Por favor llene por lo menos {0} hileras.",
minSelectError: "Por favor seleccione por lo menos {0} variantes.",
maxSelectError: "Por favor seleccione no más de {0} variantes.",
numericMinMax: "El '{0}' debe de ser igual o más de {1} y igual o menos de {2}",
numericMin: "El '{0}' debe ser igual o más de {1}",
numericMax: "El '{0}' debe ser igual o menos de {1}",
invalidEmail: "Por favor agregue un correo electrónico válido.",
urlRequestError: "La solicitud regresó error '{0}'. {1}",
urlGetChoicesError: "La solicitud regresó vacío de data o la propiedad 'trayectoria' no es correcta",
exceedMaxSize: "El tamaño del archivo no debe de exceder {0}.",
otherRequiredError: "Por favor agregue la otra estimación.",
uploadingFile: "Su archivo se está subiendo. Por favor espere unos segundos e intente de nuevo.",
addRow: "Agregue una hilera",
removeRow: "Eliminar una hilera",
choices_firstItem: "primer artículo",
choices_secondItem: "segundo artículo",
choices_thirdItem: "tercera artículo",
matrix_column: "Columna",
matrix_row: "Hilera"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["es"] = spanishSurveyStrings;
/***/ }),
/* 72 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export swedishSurveyStrings */
//Create by Mattias Asplund
var swedishSurveyStrings = {
pagePrevText: "Föregående",
pageNextText: "Nästa",
completeText: "Färdig",
otherItemText: "Annat (beskriv)",
progressText: "Sida {0} av {1}",
emptySurvey: "Det finns ingen synlig sida eller fråga i enkäten.",
completingSurvey: "Tack för att du genomfört enkäten!!",
loadingSurvey: "Enkäten laddas...",
optionsCaption: "Välj...",
requiredError: "Var vänlig besvara frågan.",
requiredInAllRowsError: "Var vänlig besvara frågorna på alla rader.",
numericError: "Värdet ska vara numeriskt.",
textMinLength: "Var vänlig ange minst {0} tecken.",
minRowCountError: "Var vänlig fyll i minst {0} rader.",
minSelectError: "Var vänlig välj åtminstone {0} varianter.",
maxSelectError: "Var vänlig välj inte fler än {0} varianter.",
numericMinMax: "'{0}' ska vara lika med eller mer än {1} samt lika med eller mindre än {2}",
numericMin: "'{0}' ska vara lika med eller mer än {1}",
numericMax: "'{0}' ska vara lika med eller mindre än {1}",
invalidEmail: "Var vänlig ange en korrekt e-postadress.",
urlRequestError: "Förfrågan returnerade felet '{0}'. {1}",
urlGetChoicesError: "Antingen returnerade förfrågan ingen data eller så är egenskapen 'path' inte korrekt",
exceedMaxSize: "Filstorleken får ej överstiga {0}.",
otherRequiredError: "Var vänlig ange det andra värdet.",
uploadingFile: "Din fil laddas upp. Var vänlig vänta några sekunder och försök sedan igen.",
addRow: "Lägg till rad",
removeRow: "Ta bort"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["sv"] = swedishSurveyStrings;
/***/ }),
/* 73 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export turkishSurveyStrings */
var turkishSurveyStrings = {
pagePrevText: "Geri",
pageNextText: "İleri",
completeText: "Anketi Tamamla",
otherItemText: "Diğer (açıklayınız)",
progressText: "Sayfa {0} / {1}",
emptySurvey: "Ankette görüntülenecek sayfa ya da soru mevcut değil.",
completingSurvey: "Anketimizi tamamladığınız için teşekkür ederiz.",
loadingSurvey: "Anket sunucudan yükleniyor ...",
optionsCaption: "Seçiniz ...",
requiredError: "Lütfen soruya cevap veriniz",
numericError: "Girilen değer numerik olmalıdır",
textMinLength: "En az {0} sembol giriniz.",
minRowCountError: "Lütfen en az {0} satırı doldurun.",
minSelectError: "Lütfen en az {0} seçeneği seçiniz.",
maxSelectError: "Lütfen {0} adetten fazla seçmeyiniz.",
numericMinMax: "The '{0}' should be equal or more than {1} and equal or less than {2}",
numericMin: "'{0}' değeri {1} değerine eşit veya büyük olmalıdır",
numericMax: "'{0}' değeri {1} değerine eşit ya da küçük olmalıdır.",
invalidEmail: "Lütfen geçerli bir eposta adresi giriniz.",
urlRequestError: "Talebi şu hatayı döndü '{0}'. {1}",
urlGetChoicesError: "Talep herhangi bir veri dönmedi ya da 'path' özelliği hatalı.",
exceedMaxSize: "Dosya boyutu {0} değerini geçemez.",
otherRequiredError: "Lütfen diğer değerleri giriniz.",
uploadingFile: "Dosyanız yükleniyor. LÜtfen birkaç saniye bekleyin ve tekrar deneyin.",
addRow: "Satır Ekle",
removeRow: "Kaldır"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["tr"] = turkishSurveyStrings;
/***/ }),
/* 74 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__questionfactory__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question__ = __webpack_require__(8);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionBooleanModel; });
/**
* A Model for a boolean question.
*/
var QuestionBooleanModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionBooleanModel, _super);
function QuestionBooleanModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("label", _this, true);
return _this;
}
QuestionBooleanModel.prototype.getType = function () {
return "boolean";
};
Object.defineProperty(QuestionBooleanModel.prototype, "isIndeterminate", {
/**
* Returns true if the question check will be rendered in indeterminate mode. value is empty.
*/
get: function () { return this.isEmpty(); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "hasTitle", {
get: function () { return this.showTitle; },
enumerable: true,
configurable: true
});
QuestionBooleanModel.prototype.supportGoNextPageAutomatic = function () { return true; };
Object.defineProperty(QuestionBooleanModel.prototype, "checkedValue", {
/**
* Get/set question value in 3 modes: indeterminate (value is empty), true (check is set) and false (check is unset).
* @see valueTrue
* @see valueFalse
*/
get: function () {
if (this.isEmpty())
return null;
return this.value == this.getValueTrue();
},
set: function (val) {
if (this.isValueEmpty(val)) {
this.value = null;
}
else {
this.value = val == true ? this.getValueTrue() : this.getValueFalse();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "defaultValue", {
/**
* Set the default state of the check: "indeterminate" - default (value is empty/null), "true" - value equals valueTrue or true, "false" - value equals valueFalse or false.
*/
get: function () { return this.getPropertyValue("defaultValue", "indeterminate"); },
set: function (val) {
this.setPropertyValue("defaultValue", val);
this.updateValueWithDefaults();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "label", {
/**
* The checkbox label. If it is empty and showTitle is false then title is rendered
* @see showTitle
* @see title
*/
get: function () { return this.getLocalizableStringText("label"); },
set: function (val) { this.setLocalizableStringText("label", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "locLabel", {
get: function () { return this.getLocalizableString("label"); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "locDisplayLabel", {
get: function () {
if (this.locLabel.text)
return this.locLabel;
return this.showTitle ? this.locLabel : this.locTitle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "showTitle", {
/**
* Set this property to true to show the question title. It is hidden by default.
*/
get: function () { return this.getPropertyValue("showTitle"); },
set: function (val) { this.setPropertyValue("showTitle", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "valueTrue", {
/**
* Set this property, if you want to have a different value from true when check is set.
*/
get: function () { return this.getPropertyValue("valueTrue"); },
set: function (val) { this.setPropertyValue("valueTrue", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "valueFalse", {
/**
* Set this property, if you want to have a different value from false when check is unset.
*/
get: function () { return this.getPropertyValue("valueFalse"); },
set: function (val) { this.setPropertyValue("valueFalse", val); },
enumerable: true,
configurable: true
});
QuestionBooleanModel.prototype.getValueTrue = function () { return this.valueTrue ? this.valueTrue : true; };
QuestionBooleanModel.prototype.getValueFalse = function () { return this.valueFalse ? this.valueFalse : false; };
QuestionBooleanModel.prototype.setDefaultValue = function () {
if (this.defaultValue == "true")
this.checkedValue = true;
if (this.defaultValue == "false")
this.checkedValue = false;
if (this.defaultValue == "indeterminate")
this.value = null;
};
return QuestionBooleanModel;
}(__WEBPACK_IMPORTED_MODULE_3__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("boolean", [{ name: "defaultValue", default: "indeterminate", choices: ["indeterminate", "false", "true"] },
{ name: "label:text", serializationProperty: "locLabel" },
"showTitle:boolean", "valueTrue", "valueFalse"], function () { return new QuestionBooleanModel(""); }, "question");
__WEBPACK_IMPORTED_MODULE_1__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("boolean", function (name) { return new QuestionBooleanModel(name); });
/***/ }),
/* 75 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(16);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionCheckboxModel; });
/**
* A Model for a checkbox question
*/
var QuestionCheckboxModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionCheckboxModel, _super);
function QuestionCheckboxModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
return _this;
}
Object.defineProperty(QuestionCheckboxModel.prototype, "displayValue", {
get: function () {
if (this.isEmpty())
return "";
var items = this.visibleChoices;
var values = this.value;
var str = "";
for (var i = 0; i < values.length; i++) {
var valStr = this.getDisplayValue(items, values[i]);
if (valStr) {
if (str)
str += ", ";
str += valStr;
}
}
return str;
},
enumerable: true,
configurable: true
});
QuestionCheckboxModel.prototype.getHasOther = function (val) {
if (!val || !Array.isArray(val))
return false;
return val.indexOf(this.otherItem.value) >= 0;
};
QuestionCheckboxModel.prototype.valueFromData = function (val) {
if (!val)
return val;
if (!Array.isArray(val))
return [val];
return _super.prototype.valueFromData.call(this, val);
};
QuestionCheckboxModel.prototype.valueFromDataCore = function (val) {
for (var i = 0; i < val.length; i++) {
if (val[i] == this.otherItem.value)
return val;
if (this.hasUnknownValue(val[i])) {
this.comment = val[i];
var newVal = val.slice();
newVal[i] = this.otherItem.value;
return newVal;
}
}
return val;
};
QuestionCheckboxModel.prototype.valueToDataCore = function (val) {
if (!val || !val.length)
return val;
for (var i = 0; i < val.length; i++) {
if (val[i] == this.otherItem.value) {
if (this.getComment()) {
var newVal = val.slice();
newVal[i] = this.getComment();
return newVal;
}
}
}
return val;
};
QuestionCheckboxModel.prototype.getType = function () {
return "checkbox";
};
return QuestionCheckboxModel;
}(__WEBPACK_IMPORTED_MODULE_3__question_baseselect__["a" /* QuestionCheckboxBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */].metaData.addClass("checkbox", [], function () { return new QuestionCheckboxModel(""); }, "checkboxbase");
__WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("checkbox", function (name) { var q = new QuestionCheckboxModel(name); q.choices = __WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].DefaultChoices; return q; });
/***/ }),
/* 76 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__question__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(5);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionCommentModel; });
/**
* A Model for a comment question
*/
var QuestionCommentModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionCommentModel, _super);
function QuestionCommentModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("placeHolder", _this);
return _this;
}
Object.defineProperty(QuestionCommentModel.prototype, "placeHolder", {
/**
* Use this property to set the input place holder.
*/
get: function () { return this.getLocalizableStringText("placeHolder"); },
set: function (val) { this.setLocalizableStringText("placeHolder", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCommentModel.prototype, "locPlaceHolder", {
get: function () { return this.getLocalizableString("placeHolder"); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCommentModel.prototype, "rows", {
/**
* The html rows attribute.
*/
get: function () { return this.getPropertyValue("rows", 4); },
set: function (val) { this.setPropertyValue("rows", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCommentModel.prototype, "cols", {
/**
* The html cols attribute.
*/
get: function () { return this.getPropertyValue("cols", 50); },
set: function (val) { this.setPropertyValue("cols", val); },
enumerable: true,
configurable: true
});
QuestionCommentModel.prototype.getType = function () {
return "comment";
};
QuestionCommentModel.prototype.isEmpty = function () {
return _super.prototype.isEmpty.call(this) || this.value === "";
};
return QuestionCommentModel;
}(__WEBPACK_IMPORTED_MODULE_1__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("comment", [{ name: "cols:number", default: 50 }, { name: "rows:number", default: 4 },
{ name: "placeHolder", serializationProperty: "locPlaceHolder" }], function () { return new QuestionCommentModel(""); }, "question");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("comment", function (name) { return new QuestionCommentModel(name); });
/***/ }),
/* 77 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(16);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(1);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionDropdownModel; });
/**
* A Model for a dropdown question
*/
var QuestionDropdownModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionDropdownModel, _super);
function QuestionDropdownModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("optionsCaption", _this);
return _this;
}
Object.defineProperty(QuestionDropdownModel.prototype, "optionsCaption", {
/**
* Use this property to set the options caption different from the default value. The default value is taken from localization strings.
*/
get: function () { return this.getLocalizableStringText("optionsCaption", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("optionsCaption")); },
set: function (val) { this.setLocalizableStringText("optionsCaption", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionDropdownModel.prototype, "locOptionsCaption", {
get: function () { return this.getLocalizableString("optionsCaption"); },
enumerable: true,
configurable: true
});
QuestionDropdownModel.prototype.getType = function () {
return "dropdown";
};
QuestionDropdownModel.prototype.supportGoNextPageAutomatic = function () { return true; };
return QuestionDropdownModel;
}(__WEBPACK_IMPORTED_MODULE_3__question_baseselect__["b" /* QuestionSelectBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */].metaData.addClass("dropdown", [{ name: "optionsCaption", serializationProperty: "locOptionsCaption" }], function () { return new QuestionDropdownModel(""); }, "selectbase");
__WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("dropdown", function (name) { var q = new QuestionDropdownModel(name); q.choices = __WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].DefaultChoices; return q; });
/***/ }),
/* 78 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(8);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionEmptyModel; });
/**
* A Model for an question that renders empty "div" tag. It used as a base class for some custom widgets
*/
var QuestionEmptyModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionEmptyModel, _super);
function QuestionEmptyModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
return _this;
}
QuestionEmptyModel.prototype.getType = function () {
return "empty";
};
return QuestionEmptyModel;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */].metaData.addClass("empty", [], function () { return new QuestionEmptyModel(""); }, "question");
/***/ }),
/* 79 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__question__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__conditions__ = __webpack_require__(12);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionExpressionModel; });
/**
* A Model for expression question. It is a read-only question. It calculates value based on epxression property.
*/
var QuestionExpressionModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionExpressionModel, _super);
function QuestionExpressionModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("format", _this);
var self = _this;
_this.registerFunctionOnPropertyValueChanged("expression", function () {
if (self.expressionRunner) {
self.expressionRunner = new __WEBPACK_IMPORTED_MODULE_4__conditions__["g" /* ExpressionRunner */](self.expression);
}
});
return _this;
}
QuestionExpressionModel.prototype.getType = function () { return "expression"; };
Object.defineProperty(QuestionExpressionModel.prototype, "format", {
/**
* Use this property to display the value in your own format. Make sure you have "{0}" substring in your string, to display the actual value.
*/
get: function () { return this.getLocalizableStringText("format", ""); },
set: function (val) { this.setLocalizableStringText("format", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionExpressionModel.prototype, "locFormat", {
get: function () { return this.getLocalizableString("format"); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionExpressionModel.prototype, "expression", {
/**
* The Expression that used to calculate the question value. You may use standard operators like +, -, * and /, squares (). Here is the example of accessing the question value {questionname}.
*
Example: "({quantity} * {price}) * (100 - {discount}) / 100"
*/
get: function () { return this.getPropertyValue("expression", ""); },
set: function (val) { this.setPropertyValue("expression", val); },
enumerable: true,
configurable: true
});
QuestionExpressionModel.prototype.runCondition = function (values) {
_super.prototype.runCondition.call(this, values);
if (!this.expression || this.expressionIsRunning)
return;
this.expressionIsRunning = true;
if (!this.expressionRunner)
this.expressionRunner = new __WEBPACK_IMPORTED_MODULE_4__conditions__["g" /* ExpressionRunner */](this.expression);
this.value = this.expressionRunner.run(values);
this.expressionIsRunning = false;
};
Object.defineProperty(QuestionExpressionModel.prototype, "displayValue", {
get: function () {
var val = this.isValueEmpty(this.value) ? this.defaultValue : this.value;
if (this.isValueEmpty(val))
return "";
var str = this.getValueAsStr(val);
if (!this.format)
return str;
return this.format["format"](str);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionExpressionModel.prototype, "displayStyle", {
/**
* You may set this property to "decimal", "currency" or "percent". If you set it to "currency", you may use the currency property to display the value in currency different from USD.
* @see currency
*/
get: function () { return this.getPropertyValue("displayStyle", "none"); },
set: function (val) { this.setPropertyValue("displayStyle", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionExpressionModel.prototype, "currency", {
/**
* Use it to display the value in the currency differen from USD. The displayStype should be set to "currency".
* @see displayStyle
*/
get: function () { return this.getPropertyValue("currency", "USD"); },
set: function (val) {
if (getCurrecyCodes().indexOf(val) < 0)
return;
this.setPropertyValue("currency", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionExpressionModel.prototype, "useGrouping", {
get: function () { return this.getPropertyValue("useGrouping", true); },
set: function (val) { this.setPropertyValue("useGrouping", val); },
enumerable: true,
configurable: true
});
QuestionExpressionModel.prototype.getValueAsStr = function (val) {
if (this.displayStyle != "none" && !isNaN(parseFloat(val)) && isFinite(val)) {
var locale = this.getLocale();
if (!locale)
locale = "en";
var options = { style: this.displayStyle, currency: this.currency, useGrouping: this.useGrouping };
return val.toLocaleString(locale, options);
}
return val.toString();
};
return QuestionExpressionModel;
}(__WEBPACK_IMPORTED_MODULE_1__question__["a" /* Question */]));
function getCurrecyCodes() {
return ["AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN", "BAM", "BBD", "BDT", "BGN", "BHD", "BIF", "BMD", "BND", "BOB", "BOV", "BRL", "BSD", "BTN", "BWP", "BYN", "BZD", "CAD", "CDF", "CHE", "CHF", "CHW", "CLF", "CLP", "CNY",
"COP", "COU", "CRC", "CUC", "CUP", "CVE", "CZK", "DJF", "DKK", "DOP", "DZD", "EGP", "ERN", "ETB", "EUR", "FJD", "FKP", "GBP", "GEL", "GHS", "GIP", "GMD", "GNF", "GTQ", "GYD", "HKD", "HNL", "HRK", "HTG", "HUF", "IDR", "ILS", "INR", "IQD",
"IRR", "ISK", "JMD", "JOD", "JPY", "KES", "KGS", "KHR", "KMF", "KPW", "KWD", "KYD", "KZT", "LAK", "LBP", "LKR", "LRD", "LSL", "LYD", "MAD", "MDL", "MGA", "MKD", "MMK", "MNT", "MOP", "MRO", "MUR", "MVR", "MWK", "MXN", "MXV", "MYR", "MZN",
"NAD", "NGN", "NIO", "NOK", "NPR", "NZD", "OMR", "PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG", "QAR", "RON", "RSD", "RUB", "RWF", "SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SLL", "SOS", "SRD", "SSP", "STD", "SVC", "SYP", "SZL",
"THB", "TJS", "TMT", "TND", "TOP", "TRY", "TTD", "TWD", "TZS", "UAH", "UGX", "USD", "USN", "UYI", "UYU", "UZS", "VEF", "VND", "VUV", "WST", "XAF", "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "XCD", "XDR", "XOF", "XPD", "XPF", "XPT", "XSU",
"XTS", "XUA", "XXX", "YER", "ZAR", "ZAR", "ZMW", "ZWL"];
}
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("expression", ["expression:expression", { name: "format", serializationProperty: "locFormat" },
{ name: "displayStyle", default: "decimal", choices: ["none", "decimal", "currency", "percent"] },
{ name: "currency", choices: function () { return getCurrecyCodes(); }, default: "USD" }, { name: "useGrouping:boolean", default: true },
{ name: "commentText", visible: false }, { name: "enableIf", visible: false }, { name: "isRequired", visible: false },
{ name: "readOnly", visible: false }, { name: "requiredErrorText", visible: false }, { name: "validators", visible: false }], function () { return new QuestionExpressionModel(""); }, "question");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("expression", function (name) { return new QuestionExpressionModel(name); });
/***/ }),
/* 80 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__question__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__error__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__surveyStrings__ = __webpack_require__(1);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionFileModel; });
/**
* A Model for a file question
*/
var QuestionFileModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionFileModel, _super);
function QuestionFileModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.isUploading = false;
return _this;
}
QuestionFileModel.prototype.getType = function () {
return "file";
};
Object.defineProperty(QuestionFileModel.prototype, "showPreview", {
/**
* Set it to true, to show the preview for the image files.
*/
get: function () { return this.getPropertyValue("showPreview", false); },
set: function (val) { this.setPropertyValue("showPreview", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "imageHeight", {
/**
* The image height.
*/
get: function () { return this.getPropertyValue("imageHeight"); },
set: function (val) { this.setPropertyValue("imageHeight", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "imageWidth", {
/**
* The image width.
*/
get: function () { return this.getPropertyValue("imageWidth"); },
set: function (val) { this.setPropertyValue("imageWidth", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "storeDataAsText", {
/**
* Set it to true to serialize file content as text.
*/
get: function () { return this.getPropertyValue("storeDataAsText", false); },
set: function (val) { this.setPropertyValue("storeDataAsText", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "maxSize", {
/**
* Use this property to setup the maximum allowed file size.
*/
get: function () { return this.getPropertyValue("maxSize", 0); },
set: function (val) { this.setPropertyValue("maxSize", val); },
enumerable: true,
configurable: true
});
/**
* Load file programmatically.
* @param file
*/
QuestionFileModel.prototype.loadFile = function (file) {
var self = this;
if (this.survey && !this.survey.uploadFile(this.name, file, this.storeDataAsText, function (status) { self.isUploading = status == "uploading"; }))
return;
this.setFileValue(file);
};
QuestionFileModel.prototype.setFileValue = function (file) {
if (!FileReader)
return;
if (!this.showPreview && !this.storeDataAsText)
return;
if (this.checkFileForErrors(file))
return;
var fileReader = new FileReader();
var self = this;
fileReader.onload = function (e) {
if (self.showPreview) {
self.previewValue = self.isFileImage(file) ? fileReader.result : null;
self.fireCallback(self.previewValueLoadedCallback);
}
if (self.storeDataAsText) {
self.value = fileReader.result;
}
};
fileReader.readAsDataURL(file);
};
QuestionFileModel.prototype.onCheckForErrors = function (errors) {
_super.prototype.onCheckForErrors.call(this, errors);
if (this.isUploading) {
errors.push(new __WEBPACK_IMPORTED_MODULE_4__error__["c" /* CustomError */](__WEBPACK_IMPORTED_MODULE_5__surveyStrings__["a" /* surveyLocalization */].getString("uploadingFile")));
}
};
QuestionFileModel.prototype.checkFileForErrors = function (file) {
var errorLength = this.errors ? this.errors.length : 0;
this.errors = [];
if (this.maxSize > 0 && file.size > this.maxSize) {
this.errors.push(new __WEBPACK_IMPORTED_MODULE_4__error__["d" /* ExceedSizeError */](this.maxSize));
}
if (errorLength != this.errors.length || this.errors.length > 0) {
this.fireCallback(this.errorsChangedCallback);
}
return this.errors.length > 0;
};
QuestionFileModel.prototype.isFileImage = function (file) {
if (!file || !file.type)
return;
var str = file.type.toLowerCase();
return str.indexOf("image") == 0;
};
return QuestionFileModel;
}(__WEBPACK_IMPORTED_MODULE_1__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("file", ["showPreview:boolean", "imageHeight", "imageWidth", "storeDataAsText:boolean", "maxSize:number"], function () { return new QuestionFileModel(""); }, "question");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("file", function (name) { return new QuestionFileModel(name); });
/***/ }),
/* 81 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__questionbase__ = __webpack_require__(25);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(5);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionHtmlModel; });
/**
* A Model for html question. Unlike other questions it doesn't have value and title.
*/
var QuestionHtmlModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionHtmlModel, _super);
function QuestionHtmlModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("html", _this);
return _this;
}
QuestionHtmlModel.prototype.getType = function () {
return "html";
};
Object.defineProperty(QuestionHtmlModel.prototype, "html", {
get: function () { return this.getLocalizableStringText("html", ""); },
set: function (val) { this.setLocalizableStringText("html", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionHtmlModel.prototype, "locHtml", {
get: function () { return this.getLocalizableString("html"); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionHtmlModel.prototype, "processedHtml", {
get: function () { return this.survey ? this.survey.processHtml(this.html) : this.html; },
enumerable: true,
configurable: true
});
return QuestionHtmlModel;
}(__WEBPACK_IMPORTED_MODULE_1__questionbase__["a" /* QuestionBase */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("html", [{ name: "html:html", serializationProperty: "locHtml" }], function () { return new QuestionHtmlModel(""); }, "questionbase");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("html", function (name) { return new QuestionHtmlModel(name); });
/***/ }),
/* 82 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__itemvalue__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__questionfactory__ = __webpack_require__(5);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MatrixRowModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionMatrixModel; });
var MatrixRowModel = (function () {
function MatrixRowModel(item, fullName, data, value) {
this.fullName = fullName;
this.item = item;
this.data = data;
this.rowValue = value;
}
Object.defineProperty(MatrixRowModel.prototype, "name", {
get: function () { return this.item.value; },
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixRowModel.prototype, "text", {
get: function () { return this.item.text; },
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixRowModel.prototype, "locText", {
get: function () {
return this.item.locText;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixRowModel.prototype, "value", {
get: function () { return this.rowValue; },
set: function (newValue) {
this.rowValue = newValue;
if (this.data)
this.data.onMatrixRowChanged(this);
this.onValueChanged();
},
enumerable: true,
configurable: true
});
MatrixRowModel.prototype.onValueChanged = function () {
};
return MatrixRowModel;
}());
/**
* A Model for a simple matrix question.
*/
var QuestionMatrixModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMatrixModel, _super);
function QuestionMatrixModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.isRowChanging = false;
_this.columnsValue = _this.createItemValues("columns");
_this.rowsValue = _this.createItemValues("rows");
return _this;
}
QuestionMatrixModel.prototype.getType = function () {
return "matrix";
};
Object.defineProperty(QuestionMatrixModel.prototype, "isAllowTitleLeft", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "isAllRowRequired", {
/**
* Set this property to true, if you want a user to answer all rows.
*/
get: function () { return this.getPropertyValue("isAllRowRequired", false); },
set: function (val) { this.setPropertyValue("isAllRowRequired", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "hasRows", {
/**
* Returns true, if there is at least one row.
*/
get: function () {
return this.rowsValue.length > 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "columns", {
/**
* The list of columns. A column has a value and an optional text
*/
get: function () { return this.columnsValue; },
set: function (newValue) {
this.setPropertyValue("columns", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "rows", {
/**
* The list of rows. A row has a value and an optional text
*/
get: function () { return this.rowsValue; },
set: function (newValue) {
this.setPropertyValue("rows", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "visibleRows", {
/**
* Returns the list of rows as model objects.
*/
get: function () {
var result = new Array();
var val = this.value;
if (!val)
val = {};
for (var i = 0; i < this.rows.length; i++) {
if (!this.rows[i].value)
continue;
result.push(this.createMatrixRow(this.rows[i], this.name + '_' + this.rows[i].value.toString(), val[this.rows[i].value]));
}
if (result.length == 0) {
result.push(this.createMatrixRow(new __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */](null), this.name, val));
}
this.generatedVisibleRows = result;
return result;
},
enumerable: true,
configurable: true
});
QuestionMatrixModel.prototype.supportGoNextPageAutomatic = function () { return this.hasValuesInAllRows(); };
QuestionMatrixModel.prototype.onCheckForErrors = function (errors) {
_super.prototype.onCheckForErrors.call(this, errors);
if (this.hasErrorInRows()) {
errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["c" /* CustomError */](__WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("requiredInAllRowsError")));
}
};
QuestionMatrixModel.prototype.hasErrorInRows = function () {
if (!this.isAllRowRequired)
return false;
return !this.hasValuesInAllRows();
};
QuestionMatrixModel.prototype.hasValuesInAllRows = function () {
var rows = this.generatedVisibleRows;
if (!rows)
rows = this.visibleRows;
if (!rows)
return true;
for (var i = 0; i < rows.length; i++) {
var val = rows[i].value;
if (!val)
return false;
}
return true;
};
QuestionMatrixModel.prototype.createMatrixRow = function (item, fullName, value) {
return new MatrixRowModel(item, fullName, this, value);
};
QuestionMatrixModel.prototype.onValueChanged = function () {
if (this.isRowChanging || !(this.generatedVisibleRows) || this.generatedVisibleRows.length == 0)
return;
this.isRowChanging = true;
var val = this.value;
if (!val)
val = {};
if (this.rows.length == 0) {
this.generatedVisibleRows[0].value = val;
}
else {
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var row = this.generatedVisibleRows[i];
var rowVal = val[row.name] ? val[row.name] : null;
this.generatedVisibleRows[i].value = rowVal;
}
}
this.isRowChanging = false;
};
Object.defineProperty(QuestionMatrixModel.prototype, "displayValue", {
get: function () {
var values = this.value;
if (!values)
return values;
for (var key in values) {
values[key] = __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(this.columns, values[key]);
}
return values;
},
enumerable: true,
configurable: true
});
//IMatrixData
QuestionMatrixModel.prototype.onMatrixRowChanged = function (row) {
if (this.isRowChanging)
return;
this.isRowChanging = true;
if (!this.hasRows) {
this.setNewValue(row.value);
}
else {
var newValue = this.value;
if (!newValue) {
newValue = {};
}
newValue[row.name] = row.value;
this.setNewValue(newValue);
}
this.isRowChanging = false;
};
return QuestionMatrixModel;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* JsonObject */].metaData.addClass("matrix", [{ name: "columns:itemvalues", onGetValue: function (obj) { return __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getData(obj.columns); }, onSetValue: function (obj, value) { obj.columns = value; } },
{ name: "rows:itemvalues", onGetValue: function (obj) { return __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getData(obj.rows); }, onSetValue: function (obj, value) { obj.rows = value; } },
"isAllRowRequired:boolean"], function () { return new QuestionMatrixModel(""); }, "question");
__WEBPACK_IMPORTED_MODULE_6__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("matrix", function (name) { var q = new QuestionMatrixModel(name); q.rows = __WEBPACK_IMPORTED_MODULE_6__questionfactory__["a" /* QuestionFactory */].DefaultRows; q.columns = __WEBPACK_IMPORTED_MODULE_6__questionfactory__["a" /* QuestionFactory */].DefaultColums; return q; });
/***/ }),
/* 83 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__ = __webpack_require__(24);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__itemvalue__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(5);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MatrixDropdownRowModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionMatrixDropdownModel; });
var MatrixDropdownRowModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](MatrixDropdownRowModel, _super);
function MatrixDropdownRowModel(name, item, data, value) {
var _this = _super.call(this, data, value) || this;
_this.name = name;
_this.item = item;
_this.buildCells();
return _this;
}
Object.defineProperty(MatrixDropdownRowModel.prototype, "rowName", {
get: function () { return this.name; },
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownRowModel.prototype, "text", {
get: function () { return this.item.text; },
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownRowModel.prototype, "locText", {
get: function () { return this.item.locText; },
enumerable: true,
configurable: true
});
return MatrixDropdownRowModel;
}(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["c" /* MatrixDropdownRowModelBase */]));
/**
* A Model for a matrix dropdown question. You may use a dropdown, checkbox, radiogroup, text and comment questions as a cell editors.
*/
var QuestionMatrixDropdownModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMatrixDropdownModel, _super);
function QuestionMatrixDropdownModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.rowsValue = _this.createItemValues("rows");
var self = _this;
_this.registerFunctionOnPropertyValueChanged("rows", function () { self.generatedVisibleRows = null; });
return _this;
}
QuestionMatrixDropdownModel.prototype.getType = function () {
return "matrixdropdown";
};
Object.defineProperty(QuestionMatrixDropdownModel.prototype, "displayValue", {
get: function () {
var values = this.value;
if (!values)
return values;
var rows = this.visibleRows;
for (var i = 0; i < rows.length; i++) {
var rowValue = this.rows[i].value;
var val = values[rowValue];
if (!val)
continue;
values[rowValue] = this.getRowDisplayValue(rows[i], val);
}
return values;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModel.prototype, "rows", {
/**
* The list of rows. A row has a value and an optional text
*/
get: function () { return this.rowsValue; },
set: function (val) {
this.setPropertyValue("rows", val);
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModel.prototype.generateRows = function () {
var result = new Array();
if (!this.rows || this.rows.length === 0)
return result;
var val = this.value;
if (!val)
val = {};
for (var i = 0; i < this.rows.length; i++) {
if (!this.rows[i].value)
continue;
result.push(this.createMatrixRow(this.rows[i], val[this.rows[i].value]));
}
return result;
};
QuestionMatrixDropdownModel.prototype.createMatrixRow = function (item, value) {
var row = new MatrixDropdownRowModel(item.value, item, this, value);
this.onMatrixRowCreated(row);
return row;
};
return QuestionMatrixDropdownModel;
}(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["d" /* QuestionMatrixDropdownModelBase */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("matrixdropdown", [{ name: "rows:itemvalues", onGetValue: function (obj) { return __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getData(obj.rows); }, onSetValue: function (obj, value) { obj.rows = value; } }], function () { return new QuestionMatrixDropdownModel(""); }, "matrixdropdownbase");
__WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("matrixdropdown", function (name) { var q = new QuestionMatrixDropdownModel(name); q.choices = [1, 2, 3, 4, 5]; q.rows = __WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].DefaultColums; __WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["d" /* QuestionMatrixDropdownModelBase */].addDefaultColumns(q); return q; });
/***/ }),
/* 84 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__ = __webpack_require__(24);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MatrixDynamicRowModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionMatrixDynamicModel; });
var MatrixDynamicRowModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](MatrixDynamicRowModel, _super);
function MatrixDynamicRowModel(index, data, value) {
var _this = _super.call(this, data, value) || this;
_this.index = index;
_this.buildCells();
return _this;
}
Object.defineProperty(MatrixDynamicRowModel.prototype, "rowName", {
get: function () { return this.id; },
enumerable: true,
configurable: true
});
return MatrixDynamicRowModel;
}(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["c" /* MatrixDropdownRowModelBase */]));
/**
* A Model for a matrix dymanic question. You may use a dropdown, checkbox, radiogroup, text and comment questions as a cell editors.
* An end-user may dynamically add/remove rows, unlike in matrix dropdown question.
*/
var QuestionMatrixDynamicModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMatrixDynamicModel, _super);
function QuestionMatrixDynamicModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.rowCounter = 0;
_this.rowCountValue = 2;
_this.createLocalizableString("confirmDeleteText", _this);
_this.createLocalizableString("keyDuplicationError", _this);
_this.createLocalizableString("addRowText", _this);
_this.createLocalizableString("removeRowText", _this);
return _this;
}
QuestionMatrixDynamicModel.prototype.getType = function () {
return "matrixdynamic";
};
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "confirmDelete", {
/**
* Set it to true, to show a confirmation dialog on removing a row
* @see ConfirmDeleteText
*/
get: function () { return this.getPropertyValue("confirmDelete", false); },
set: function (val) { this.setPropertyValue("confirmDelete", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "keyName", {
/**
* Set it to a column name and the library shows duplication error, if there are same values in different rows in the column.
* @see keyDuplicationError
*/
get: function () { return this.getPropertyValue("keyName", ""); },
set: function (val) { this.setPropertyValue("keyName", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "rowCount", {
/**
* The number of rows in the matrix.
* @see minRowCount
* @see maxRowCount
*/
get: function () { return this.rowCountValue; },
set: function (val) {
if (val < 0 || val > QuestionMatrixDynamicModel.MaxRowCount)
return;
var prevValue = this.rowCountValue;
this.rowCountValue = val;
if (this.value && this.value.length > val) {
var qVal = this.value;
qVal.splice(val);
this.value = qVal;
}
if (this.isLoadingFromJson)
return;
if (this.generatedVisibleRows) {
this.generatedVisibleRows.splice(val);
for (var i = prevValue; i < val; i++) {
this.generatedVisibleRows.push(this.createMatrixRow(null));
}
}
this.fireCallback(this.rowCountChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "minRowCount", {
/**
* The minimum row count. A user could not delete a row if the rowCount equals to minRowCount
* @see rowCount
* @see maxRowCount
*/
get: function () { return this.getPropertyValue("minRowCount", 0); },
set: function (val) {
if (val < 0)
val = 0;
if (val == this.minRowCount || val > this.maxRowCount)
return;
this.setPropertyValue("minRowCount", val);
if (this.rowCount < val)
this.rowCount = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "maxRowCount", {
/**
* The maximum row count. A user could not add a row if the rowCount equals to maxRowCount
* @see rowCount
* @see minRowCount
*/
get: function () { return this.getPropertyValue("maxRowCount", QuestionMatrixDynamicModel.MaxRowCount); },
set: function (val) {
if (val <= 0)
return;
if (val > QuestionMatrixDynamicModel.MaxRowCount)
val = QuestionMatrixDynamicModel.MaxRowCount;
if (val == this.maxRowCount || val < this.minRowCount)
return;
this.setPropertyValue("maxRowCount", val);
if (this.rowCount > val)
this.rowCount = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "canAddRow", {
/**
* Returns true, if a new row can be added.
* @see maxRowCount
* @see canRemoveRow
* @see rowCount
*/
get: function () { return this.rowCount < this.maxRowCount; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "canRemoveRow", {
/**
* Returns true, if a row can be removed.
* @see minRowCount
* @see canAddRow
* @see rowCount
*/
get: function () { return this.rowCount > this.minRowCount; },
enumerable: true,
configurable: true
});
/**
* Creates and add a new row.
*/
QuestionMatrixDynamicModel.prototype.addRow = function () {
if (!this.canAddRow)
return;
var prevRowCount = this.rowCount;
this.rowCount = this.rowCount + 1;
if (this.data) {
this.runCellsCondition(this.data.getAllValues());
}
if (this.survey) {
if (prevRowCount + 1 == this.rowCount)
this.survey.matrixRowAdded(this);
}
};
/**
* Removes a row by it's index. If confirmDelete is true, show a confirmation dialog
* @param index a row index, from 0 to rowCount - 1
* @see removeRow
* @see confirmDelete
*/
QuestionMatrixDynamicModel.prototype.removeRowUI = function (value) {
if (!this.confirmDelete || confirm(this.confirmDeleteText)) {
this.removeRow(value);
}
};
/**
* Removes a row by it's index.
* @param index a row index, from 0 to rowCount - 1
*/
QuestionMatrixDynamicModel.prototype.removeRow = function (index) {
if (!this.canRemoveRow)
return;
if (index < 0 || index >= this.rowCount)
return;
if (this.survey) {
var row = this.generatedVisibleRows ? this.generatedVisibleRows[index] : null;
this.survey.matrixRowRemoved(this, index, row);
}
if (this.generatedVisibleRows && index < this.generatedVisibleRows.length) {
this.generatedVisibleRows.splice(index, 1);
}
if (this.value) {
var val = this.createNewValue(this.value);
val.splice(index, 1);
val = this.deleteRowValue(val, null);
this.value = val;
}
this.rowCountValue--;
this.fireCallback(this.rowCountChangedCallback);
};
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "confirmDeleteText", {
/**
* Use this property to change the default text showing in the confirmation delete dialog on removing a row.
*/
get: function () { return this.getLocalizableStringText("confirmDeleteText", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("confirmDelete")); },
set: function (val) { this.setLocalizableStringText("confirmDeleteText", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "locConfirmDeleteText", {
get: function () { return this.getLocalizableString("confirmDeleteText"); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "keyDuplicationError", {
/**
* The duplication value error text. Set it to show the text different from the default.
* @see keyName
*/
get: function () { return this.getLocalizableStringText("keyDuplicationError", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("keyDuplicationError")); },
set: function (val) { this.setLocalizableStringText("keyDuplicationError", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "locKeyDuplicationError", {
get: function () { return this.getLocalizableString("keyDuplicationError"); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "addRowText", {
/**
* Use this property to change the default value of add row button text.
*/
get: function () { return this.getLocalizableStringText("addRowText", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("addRow")); },
set: function (val) { this.setLocalizableStringText("addRowText", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "locAddRowText", {
get: function () { return this.getLocalizableString("addRowText"); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "removeRowText", {
/**
* Use this property to change the default value of remove row button text.
*/
get: function () { return this.getLocalizableStringText("removeRowText", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("removeRow")); },
set: function (val) { this.setLocalizableStringText("removeRowText", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "locRemoveRowText", {
get: function () { return this.getLocalizableString("removeRowText"); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "displayValue", {
get: function () {
var values = this.value;
if (!values)
return values;
var rows = this.visibleRows;
for (var i = 0; i < rows.length && i < values.length; i++) {
var val = values[i];
if (!val)
continue;
values[i] = this.getRowDisplayValue(rows[i], val);
}
return values;
},
enumerable: true,
configurable: true
});
QuestionMatrixDynamicModel.prototype.supportGoNextPageAutomatic = function () { return false; };
QuestionMatrixDynamicModel.prototype.onCheckForErrors = function (errors) {
_super.prototype.onCheckForErrors.call(this, errors);
if (this.hasErrorInRows()) {
errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["c" /* CustomError */](__WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("minRowCountError")["format"](this.minRowCount)));
}
};
QuestionMatrixDynamicModel.prototype.hasErrors = function (fireCallback) {
if (fireCallback === void 0) { fireCallback = true; }
var prevValue = _super.prototype.hasErrors.call(this, fireCallback);
return this.isValueDuplicated() || prevValue;
};
QuestionMatrixDynamicModel.prototype.hasErrorInRows = function () {
if (this.minRowCount <= 0 || !this.generatedVisibleRows)
return false;
var res = false;
var setRowCount = 0;
for (var rowIndex = 0; rowIndex < this.generatedVisibleRows.length; rowIndex++) {
var row = this.generatedVisibleRows[rowIndex];
if (!row.isEmpty)
setRowCount++;
}
return setRowCount < this.minRowCount;
};
QuestionMatrixDynamicModel.prototype.isValueDuplicated = function () {
if (!this.keyName || !this.generatedVisibleRows)
return false;
var column = this.getColumnName(this.keyName);
if (!column)
return false;
var keyValues = [];
var res = false;
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
res = this.isValueDuplicatedInRow(this.generatedVisibleRows[i], column, keyValues) || res;
}
return res;
};
QuestionMatrixDynamicModel.prototype.isValueDuplicatedInRow = function (row, column, keyValues) {
var question = row.getQuestionByColumn(column);
if (!question || question.isEmpty())
return false;
var value = question.value;
for (var i = 0; i < keyValues.length; i++) {
if (value == keyValues[i]) {
question.addError(new __WEBPACK_IMPORTED_MODULE_5__error__["c" /* CustomError */](this.keyDuplicationError));
return true;
}
}
keyValues.push(value);
return false;
};
QuestionMatrixDynamicModel.prototype.generateRows = function () {
var result = new Array();
if (this.rowCount === 0)
return result;
var val = this.createNewValue(this.value);
for (var i = 0; i < this.rowCount; i++) {
result.push(this.createMatrixRow(this.getRowValueByIndex(val, i)));
}
return result;
};
QuestionMatrixDynamicModel.prototype.createMatrixRow = function (value) {
var row = new MatrixDynamicRowModel(this.rowCounter++, this, value);
this.onMatrixRowCreated(row);
return row;
};
QuestionMatrixDynamicModel.prototype.onBeforeValueChanged = function (val) {
var newRowCount = val && Array.isArray(val) ? val.length : 0;
if (newRowCount <= this.rowCount)
return;
this.rowCountValue = newRowCount;
if (this.generatedVisibleRows) {
this.generatedVisibleRows = null;
this.generatedVisibleRows = this.visibleRows;
}
};
QuestionMatrixDynamicModel.prototype.createNewValue = function (curValue) {
var result = curValue;
if (!result)
result = [];
var r = [];
if (result.length > this.rowCount)
result.splice(this.rowCount - 1);
for (var i = result.length; i < this.rowCount; i++) {
result.push({});
}
return result;
};
QuestionMatrixDynamicModel.prototype.deleteRowValue = function (newValue, row) {
var isEmpty = true;
for (var i = 0; i < newValue.length; i++) {
if (Object.keys(newValue[i]).length > 0) {
isEmpty = false;
break;
}
}
return isEmpty ? null : newValue;
};
QuestionMatrixDynamicModel.prototype.getRowValueByIndex = function (questionValue, index) {
return index >= 0 && index < questionValue.length ? questionValue[index] : null;
};
QuestionMatrixDynamicModel.prototype.getRowValueCore = function (row, questionValue, create) {
if (create === void 0) { create = false; }
if (!this.generatedVisibleRows)
return {};
return this.getRowValueByIndex(questionValue, this.generatedVisibleRows.indexOf(row));
};
return QuestionMatrixDynamicModel;
}(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["d" /* QuestionMatrixDropdownModelBase */]));
QuestionMatrixDynamicModel.MaxRowCount = 100;
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("matrixdynamic", [{ name: "rowCount:number", default: 2 }, { name: "minRowCount:number", default: 0 }, { name: "maxRowCount:number", default: QuestionMatrixDynamicModel.MaxRowCount },
{ name: "keyName" }, { name: "keyDuplicationError", serializationProperty: "locKeyDuplicationError" },
{ name: "confirmDelete:boolean" }, { name: "confirmDeleteText", serializationProperty: "locConfirmDeleteText" },
{ name: "addRowText", serializationProperty: "locAddRowText" }, { name: "removeRowText", serializationProperty: "locRemoveRowText" }], function () { return new QuestionMatrixDynamicModel(""); }, "matrixdropdownbase");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("matrixdynamic", function (name) { var q = new QuestionMatrixDynamicModel(name); q.choices = [1, 2, 3, 4, 5]; __WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["d" /* QuestionMatrixDropdownModelBase */].addDefaultColumns(q); return q; });
/***/ }),
/* 85 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__validator__ = __webpack_require__(29);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__questionfactory__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__error__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MultipleTextItemModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionMultipleTextModel; });
var MultipleTextItemModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](MultipleTextItemModel, _super);
function MultipleTextItemModel(name, title) {
if (name === void 0) { name = null; }
if (title === void 0) { title = null; }
var _this = _super.call(this) || this;
_this.idValue = MultipleTextItemModel.getItemId();
_this.validators = new Array();
var self = _this;
_this.name = name;
var locTitleValue = _this.createLocalizableString("title", _this, true);
locTitleValue.onRenderedHtmlCallback = function (text) { return self.getFullTitle(text); };
_this.title = title;
_this.createLocalizableString("placeHolder", _this);
return _this;
}
MultipleTextItemModel.getItemId = function () {
return "sp_" + MultipleTextItemModel.itemCounter++;
};
MultipleTextItemModel.prototype.getType = function () {
return "multipletextitem";
};
Object.defineProperty(MultipleTextItemModel.prototype, "id", {
get: function () { return this.idValue; },
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "name", {
/**
* The item name.
*/
get: function () { return this.getPropertyValue("name"); },
set: function (val) {
this.setPropertyValue("name", val);
if (this.locTitle) {
this.locTitle.onChanged();
}
},
enumerable: true,
configurable: true
});
MultipleTextItemModel.prototype.setData = function (data) {
this.data = data;
};
Object.defineProperty(MultipleTextItemModel.prototype, "isRequired", {
/**
* Set this property to true, to make the item a required. If a user doesn't fill the item then a validation error will be generated.
*/
get: function () { return this.getPropertyValue("isRequired", false); },
set: function (val) { this.setPropertyValue("isRequired", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "inputType", {
/**
* Use this property to change the default input type.
*/
get: function () { return this.getPropertyValue("inputType", "text"); },
set: function (val) {
this.setPropertyValue("inputType", val.toLowerCase());
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "title", {
/**
* Item title. If it is empty, the item name is rendered as title. This property supports markdown.
* @see name
*/
get: function () { return this.getLocalizableStringText("title", this.name); },
set: function (val) { this.setLocalizableStringText("title", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "locTitle", {
get: function () { return this.getLocalizableString("title"); },
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "fullTitle", {
/**
* Returns the text or html for rendering the title.
*/
get: function () { return this.getFullTitle(this.locTitle.textOrHtml); },
enumerable: true,
configurable: true
});
MultipleTextItemModel.prototype.getFullTitle = function (str) {
if (!str)
str = this.name;
if (this.isRequired && this.data)
str = this.data.getIsRequiredText() + ' ' + str;
return str;
};
Object.defineProperty(MultipleTextItemModel.prototype, "placeHolder", {
/**
* The input place holder.
*/
get: function () { return this.getLocalizableStringText("placeHolder"); },
set: function (val) { this.setLocalizableStringText("placeHolder", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "locPlaceHolder", {
get: function () { return this.getLocalizableString("placeHolder"); },
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "value", {
/**
* The item value.
*/
get: function () {
return this.data ? this.data.getMultipleTextValue(this.name) : null;
},
set: function (value) {
if (this.data != null) {
this.data.setMultipleTextValue(this.name, value);
}
},
enumerable: true,
configurable: true
});
MultipleTextItemModel.prototype.onValueChanged = function (newValue) {
if (this.valueChangedCallback)
this.valueChangedCallback(newValue);
};
//IValidatorOwner
MultipleTextItemModel.prototype.getValidatorTitle = function () { return this.title; };
Object.defineProperty(MultipleTextItemModel.prototype, "validatedValue", {
get: function () { return this.value; },
set: function (val) { this.value = val; },
enumerable: true,
configurable: true
});
//ILocalizableOwner
MultipleTextItemModel.prototype.getLocale = function () { return this.data ? this.data.getLocale() : ""; };
MultipleTextItemModel.prototype.getMarkdownHtml = function (text) { return this.data ? this.data.getMarkdownHtml(text) : null; };
return MultipleTextItemModel;
}(__WEBPACK_IMPORTED_MODULE_1__base__["c" /* Base */]));
MultipleTextItemModel.itemCounter = 100;
/**
* A Model for a multiple text question.
*/
var QuestionMultipleTextModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMultipleTextModel, _super);
function QuestionMultipleTextModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.itemsValues = new Array();
_this.isMultipleItemValueChanging = false;
var self = _this;
_this.itemsValues = _this.createNewArray("items", function (item) { item.setData(self); });
_this.registerFunctionOnPropertyValueChanged("items", function () { self.fireCallback(self.colCountChangedCallback); });
_this.registerFunctionOnPropertyValueChanged("colCount", function () { self.fireCallback(self.colCountChangedCallback); });
return _this;
}
QuestionMultipleTextModel.prototype.getType = function () {
return "multipletext";
};
QuestionMultipleTextModel.prototype.endLoadingFromJson = function () {
_super.prototype.endLoadingFromJson.call(this);
this.fireCallback(this.colCountChangedCallback);
};
Object.defineProperty(QuestionMultipleTextModel.prototype, "items", {
/**
* The list of input items.
*/
get: function () { return this.itemsValues; },
set: function (val) { this.setPropertyValue("items", val); },
enumerable: true,
configurable: true
});
/**
* Add a new text item.
* @param name a item name
* @param title a item title (optional)
*/
QuestionMultipleTextModel.prototype.addItem = function (name, title) {
if (title === void 0) { title = null; }
var item = this.createTextItem(name, title);
this.items.push(item);
return item;
};
QuestionMultipleTextModel.prototype.onLocaleChanged = function () {
_super.prototype.onLocaleChanged.call(this);
for (var i = 0; i < this.items.length; i++) {
this.items[i].onLocaleChanged();
}
};
QuestionMultipleTextModel.prototype.supportGoNextPageAutomatic = function () {
for (var i = 0; i < this.items.length; i++) {
if (!this.items[i].value)
return false;
}
return true;
};
Object.defineProperty(QuestionMultipleTextModel.prototype, "colCount", {
/**
* The number of columns. Items are rendred in one line if the value is 0.
*/
get: function () { return this.getPropertyValue("colCount", 1); },
set: function (val) {
if (val < 1 || val > 4)
return;
this.setPropertyValue("colCount", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMultipleTextModel.prototype, "itemSize", {
/**
* The default text input size.
*/
get: function () { return this.getPropertyValue("itemSize", 25); },
set: function (val) { this.setPropertyValue("itemSize", val); },
enumerable: true,
configurable: true
});
/**
* Returns the list of rendered rows.
*/
QuestionMultipleTextModel.prototype.getRows = function () {
var colCount = this.colCount;
var items = this.items;
var rows = [];
var index = 0;
for (var i = 0; i < items.length; i++) {
if (index == 0) {
rows.push([]);
}
rows[rows.length - 1].push(items[i]);
index++;
if (index >= colCount) {
index = 0;
}
}
return rows;
};
QuestionMultipleTextModel.prototype.onValueChanged = function () {
_super.prototype.onValueChanged.call(this);
this.onItemValueChanged();
};
QuestionMultipleTextModel.prototype.createTextItem = function (name, title) {
return new MultipleTextItemModel(name, title);
};
QuestionMultipleTextModel.prototype.onItemValueChanged = function () {
if (this.isMultipleItemValueChanging)
return;
for (var i = 0; i < this.items.length; i++) {
var itemValue = null;
if (this.value && (this.items[i].name in this.value)) {
itemValue = this.value[this.items[i].name];
}
this.items[i].onValueChanged(itemValue);
}
};
QuestionMultipleTextModel.prototype.runValidators = function () {
var error = _super.prototype.runValidators.call(this);
if (error != null)
return error;
for (var i = 0; i < this.items.length; i++) {
error = new __WEBPACK_IMPORTED_MODULE_2__validator__["a" /* ValidatorRunner */]().run(this.items[i]);
if (error != null)
return error;
}
return null;
};
QuestionMultipleTextModel.prototype.onCheckForErrors = function (errors) {
_super.prototype.onCheckForErrors.call(this, errors);
for (var i = 0; i < this.items.length; i++) {
var item = this.items[i];
if (item.isRequired && !item.value) {
errors.push(new __WEBPACK_IMPORTED_MODULE_6__error__["a" /* AnswerRequiredError */]());
}
}
};
//IMultipleTextData
QuestionMultipleTextModel.prototype.getMultipleTextValue = function (name) {
if (!this.value)
return null;
return this.value[name];
};
QuestionMultipleTextModel.prototype.setMultipleTextValue = function (name, value) {
this.isMultipleItemValueChanging = true;
var newValue = this.value;
if (!newValue) {
newValue = {};
}
newValue[name] = value;
this.setNewValue(newValue);
this.isMultipleItemValueChanging = false;
};
QuestionMultipleTextModel.prototype.getIsRequiredText = function () {
return this.survey ? this.survey.requiredText : "";
};
return QuestionMultipleTextModel;
}(__WEBPACK_IMPORTED_MODULE_3__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* JsonObject */].metaData.addClass("multipletextitem", ["name", "isRequired:boolean", { name: "placeHolder", serializationProperty: "locPlaceHolder" },
{ name: "inputType", default: "text", choices: ["color", "date", "datetime", "datetime-local", "email", "month", "number", "password", "range", "tel", "text", "time", "url", "week"] },
{ name: "title", serializationProperty: "locTitle" }, { name: "validators:validators", baseClassName: "surveyvalidator", classNamePart: "validator" }], function () { return new MultipleTextItemModel(""); });
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* JsonObject */].metaData.addClass("multipletext", [{ name: "!items:textitems", className: "multipletextitem" },
{ name: "itemSize:number", default: 25 }, { name: "colCount:number", default: 1, choices: [1, 2, 3, 4] }], function () { return new QuestionMultipleTextModel(""); }, "question");
__WEBPACK_IMPORTED_MODULE_5__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("multipletext", function (name) { var q = new QuestionMultipleTextModel(name); q.addItem("text1"); q.addItem("text2"); return q; });
/***/ }),
/* 86 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__textPreProcessor__ = __webpack_require__(17);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__conditionProcessValue__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__question__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__panel__ = __webpack_require__(23);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__questionfactory__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__error__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionPanelDynamicItem; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionPanelDynamicModel; });
var QuestionPanelDynamicItem = (function () {
function QuestionPanelDynamicItem(data, panel) {
this.textPreProcessor = new __WEBPACK_IMPORTED_MODULE_3__textPreProcessor__["a" /* TextPreProcessor */]();
this.data = data;
this.panelValue = panel;
this.panel.setSurveyImpl(this);
this.panel.updateCustomWidgets();
var self = this;
this.textPreProcessor = new __WEBPACK_IMPORTED_MODULE_3__textPreProcessor__["a" /* TextPreProcessor */]();
this.textPreProcessor.onHasValue = function (name) { return self.hasProcessedTextValue(name); };
this.textPreProcessor.onProcess = function (name, returnDisplayValue) { return self.getProcessedTextValue(name, returnDisplayValue); };
}
Object.defineProperty(QuestionPanelDynamicItem.prototype, "panel", {
get: function () { return this.panelValue; },
enumerable: true,
configurable: true
});
QuestionPanelDynamicItem.prototype.runCondition = function (values) {
this.panel.runCondition(values);
};
QuestionPanelDynamicItem.prototype.getValue = function (name) {
var values = this.data.getPanelItemData(this);
return values[name];
};
QuestionPanelDynamicItem.prototype.setValue = function (name, newValue) {
this.data.setPanelItemData(this, name, newValue);
};
QuestionPanelDynamicItem.prototype.getComment = function (name) {
var result = this.getValue(name + __WEBPACK_IMPORTED_MODULE_1__base__["c" /* Base */].commentPrefix);
return result ? result : "";
};
QuestionPanelDynamicItem.prototype.setComment = function (name, newValue) {
this.setValue(name + __WEBPACK_IMPORTED_MODULE_1__base__["c" /* Base */].commentPrefix, newValue);
};
QuestionPanelDynamicItem.prototype.onSurveyValueChanged = function () {
var questions = this.panel.questions;
var values = this.data.getPanelItemData(this);
for (var i = 0; i < questions.length; i++) {
var q = questions[i];
q.onSurveyValueChanged(values[q.name]);
}
};
QuestionPanelDynamicItem.prototype.setVisibleIndex = function (index, showIndex) {
return __WEBPACK_IMPORTED_MODULE_1__base__["a" /* SurveyElement */].setVisibleIndex(this.panel.questions, index, showIndex);
};
QuestionPanelDynamicItem.prototype.getAllValues = function () { return this.data.getPanelItemData(this); };
QuestionPanelDynamicItem.prototype.geSurveyData = function () { return this; };
QuestionPanelDynamicItem.prototype.getSurvey = function () { return this.data ? this.data.getSurvey() : null; };
QuestionPanelDynamicItem.prototype.getTextProcessor = function () { return this; };
//ITextProcessor
QuestionPanelDynamicItem.prototype.hasProcessedTextValue = function (name) {
if (name == QuestionPanelDynamicItem.IndexVariableName)
return true;
var firstName = new __WEBPACK_IMPORTED_MODULE_4__conditionProcessValue__["a" /* ProcessValue */]().getFirstName(name);
return firstName == QuestionPanelDynamicItem.ItemVariableName;
};
QuestionPanelDynamicItem.prototype.getProcessedTextValue = function (name, returnDisplayValue) {
if (name == QuestionPanelDynamicItem.IndexVariableName)
return this.data.getItemIndex(this) + 1;
//name should start with the panel
name = name.replace(QuestionPanelDynamicItem.ItemVariableName + ".", "");
var firstName = new __WEBPACK_IMPORTED_MODULE_4__conditionProcessValue__["a" /* ProcessValue */]().getFirstName(name);
var question = this.panel.getQuestionByName(firstName);
if (!question)
return null;
var values = {};
values[firstName] = returnDisplayValue ? question.displayValue : question.value;
return new __WEBPACK_IMPORTED_MODULE_4__conditionProcessValue__["a" /* ProcessValue */]().getValue(name, values);
};
QuestionPanelDynamicItem.prototype.processText = function (text, returnDisplayValue) {
text = this.textPreProcessor.process(text, returnDisplayValue);
var survey = this.getSurvey();
return survey ? survey.processText(text, returnDisplayValue) : text;
};
QuestionPanelDynamicItem.prototype.processTextEx = function (text) {
text = this.processText(text, true);
var hasAllValuesOnLastRun = this.textPreProcessor.hasAllValuesOnLastRun;
var res = { hasAllValuesOnLastRun: true, text: text };
if (this.getSurvey()) {
res = this.getSurvey().processTextEx(text);
}
res.hasAllValuesOnLastRun = res.hasAllValuesOnLastRun && hasAllValuesOnLastRun;
return res;
};
QuestionPanelDynamicItem.prototype.onAnyValueChanged = function (name) {
this.panel.onAnyValueChanged(name);
this.panel.onAnyValueChanged(QuestionPanelDynamicItem.ItemVariableName);
};
return QuestionPanelDynamicItem;
}());
QuestionPanelDynamicItem.ItemVariableName = "panel";
QuestionPanelDynamicItem.IndexVariableName = "panelIndex";
/**
* A Model for a panel dymanic question. You setup the template panel, but adding elements (any question or a panel) and assign a text to it's title, and this panel will be used as a template on creating dynamic panels. The number of panels is defined by panelCount property.
* An end-user may dynamically add/remove panels, unless you forbidden this.
*/
var QuestionPanelDynamicModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionPanelDynamicModel, _super);
function QuestionPanelDynamicModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.itemsValue = new Array();
_this.loadingPanelCount = 0;
_this.currentIndexValue = -1;
_this.templateValue = _this.createNewPanelObject();
_this.template.renderWidth = "100%";
_this.template.selectedElementInDesign = _this;
var self = _this;
_this.oldTemplateRowsChangedCallback = _this.template.rowsChangedCallback;
_this.template.rowsChangedCallback = function () { self.templateOnRowsChanged(); if (self.oldTemplateRowsChangedCallback)
self.oldTemplateRowsChangedCallback(); };
_this.createLocalizableString("confirmDeleteText", _this);
_this.createLocalizableString("keyDuplicationError", _this);
_this.createLocalizableString("panelAddText", _this);
_this.createLocalizableString("panelRemoveText", _this);
_this.createLocalizableString("panelPrevText", _this);
_this.createLocalizableString("panelNextText", _this);
return _this;
}
QuestionPanelDynamicModel.prototype.setSurveyImpl = function (value) {
_super.prototype.setSurveyImpl.call(this, value);
this.template.setSurveyImpl(this.surveyImpl);
};
QuestionPanelDynamicModel.prototype.templateOnRowsChanged = function () {
if (this.isLoadingFromJson)
return;
this.rebuildPanels();
};
QuestionPanelDynamicModel.prototype.getType = function () {
return "paneldynamic";
};
QuestionPanelDynamicModel.prototype.removeElement = function (element) {
return this.template.removeElement(element);
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "template", {
/**
* The template Panel. This panel is used as a template on creatign dynamic panels
* @see templateElements
* @see templateTitle
* @see panelCount
*/
get: function () { return this.templateValue; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "templateElements", {
/**
* The template Panel elements, questions and panels.
* @see templateElements
* @see template
* @see panelCount
*/
get: function () { return this.template.elements; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "templateTitle", {
/**
* The template Panel title property.
* @see templateElements
* @see template
* @see panelCount
*/
get: function () { return this.template.title; },
set: function (newValue) { this.template.title = newValue; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locTemplateTitle", {
get: function () { return this.template.locTitle; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "templateDescription", {
/**
* The template Panel description property.
* @see templateElements
* @see template
* @see panelCount
* @see templateTitle
*/
get: function () { return this.template.description; },
set: function (newValue) { this.template.description = newValue; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locTemplateDescription", {
get: function () { return this.template.locDescription; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "items", {
get: function () { return this.itemsValue; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panels", {
/**
* The array of dynamic panels created based on panel template
* @see template
* @see panelCount
*/
get: function () {
var res = [];
for (var i = 0; i < this.items.length; i++) {
res.push(this.items[i].panel);
}
return res;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "currentIndex", {
/**
* The index of current active dynamical panel when the renderMode is not "list". If there is no dymamic panel (panelCount = 0) or renderMode equals "list" it returns -1, otherwise it returns a value from 0 to panelCount - 1.
* @see currentPanel
* @see panels
* @see panelCount
* @see renderMode
*/
get: function () {
if (this.isRenderModeList)
return -1;
if (this.currentIndexValue < 0 && this.panelCount > 0) {
this.currentIndexValue = 0;
}
if (this.currentIndexValue >= this.panelCount) {
this.currentIndexValue = this.panelCount - 1;
}
return this.currentIndexValue;
},
set: function (val) {
if (val >= this.panelCount)
val = this.panelCount - 1;
this.currentIndexValue = val;
this.fireCallback(this.currentIndexChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "currentPanel", {
/**
* The current active dynamical panel when the renderMode is not "list". If there is no dymamic panel (panelCount = 0) or renderMode equals "list" it returns null.
* @see currenIndex
* @see panels
* @see panelCount
* @see renderMode
*/
get: function () {
var index = this.currentIndex;
if (index < 0 || index >= this.panels.length)
return null;
return this.panels[index];
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "confirmDelete", {
/**
* Set it to true, to show a confirmation dialog on removing a panel
* @see ConfirmDeleteText
*/
get: function () { return this.getPropertyValue("confirmDelete", false); },
set: function (val) { this.setPropertyValue("confirmDelete", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "keyName", {
/**
* Set it to a question name used in the template panel and the library shows duplication error, if there are same values in different panels of this question.
* @see keyDuplicationError
*/
get: function () { return this.getPropertyValue("keyName", ""); },
set: function (val) { this.setPropertyValue("keyName", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "confirmDeleteText", {
/**
* Use this property to change the default text showing in the confirmation delete dialog on removing a panel.
*/
get: function () { return this.getLocalizableStringText("confirmDeleteText", __WEBPACK_IMPORTED_MODULE_2__surveyStrings__["a" /* surveyLocalization */].getString("confirmDelete")); },
set: function (val) { this.setLocalizableStringText("confirmDeleteText", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locConfirmDeleteText", {
get: function () { return this.getLocalizableString("confirmDeleteText"); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "keyDuplicationError", {
/**
* The duplication value error text. Set it to show the text different from the default.
* @see keyName
*/
get: function () { return this.getLocalizableStringText("keyDuplicationError", __WEBPACK_IMPORTED_MODULE_2__surveyStrings__["a" /* surveyLocalization */].getString("keyDuplicationError")); },
set: function (val) { this.setLocalizableStringText("keyDuplicationError", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locKeyDuplicationError", {
get: function () { return this.getLocalizableString("keyDuplicationError"); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelPrevText", {
/**
* Use this property to change the default previous button text. Previous button shows the previous panel, change the currentPanel, when the renderMode doesn't equal to "list".
* @see currentPanel
* @see currentIndex
* @see renderMode
*/
get: function () { return this.getLocalizableStringText("panelPrevText", __WEBPACK_IMPORTED_MODULE_2__surveyStrings__["a" /* surveyLocalization */].getString("pagePrevText")); },
set: function (val) { this.setLocalizableStringText("panelPrevText", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locPanelPrevText", {
get: function () { return this.getLocalizableString("panelPrevText"); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelNextText", {
/**
* Use this property to change the default next button text. Next button shows the next panel, change the currentPanel, when the renderMode doesn't equal to "list".
* @see currentPanel
* @see currentIndex
* @see renderMode
*/
get: function () { return this.getLocalizableStringText("panelNextText", __WEBPACK_IMPORTED_MODULE_2__surveyStrings__["a" /* surveyLocalization */].getString("pageNextText")); },
set: function (val) { this.setLocalizableStringText("panelNextText", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locPanelNextText", {
get: function () { return this.getLocalizableString("panelNextText"); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelAddText", {
/**
* Use this property to change the default value of add panel button text.
*/
get: function () { return this.getLocalizableStringText("panelAddText", __WEBPACK_IMPORTED_MODULE_2__surveyStrings__["a" /* surveyLocalization */].getString("addPanel")); },
set: function (value) { this.setLocalizableStringText("panelAddText", value); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locPanelAddText", {
get: function () { return this.getLocalizableString("panelAddText"); ; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelRemoveText", {
/**
* Use this property to change the default value of remove panel button text.
*/
get: function () { return this.getLocalizableStringText("panelRemoveText", __WEBPACK_IMPORTED_MODULE_2__surveyStrings__["a" /* surveyLocalization */].getString("removePanel")); },
set: function (val) { this.setLocalizableStringText("panelRemoveText", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locPanelRemoveText", {
get: function () { return this.getLocalizableString("panelRemoveText"); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isProgressTopShowing", {
/**
* Returns true when the renderMode equals to "progressTop" or "progressTopBottom"
*/
get: function () { return this.renderMode == "progressTop" || this.renderMode == "progressTopBottom"; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isProgressBottomShowing", {
/**
* Returns true when the renderMode equals to "progressBottom" or "progressTopBottom"
*/
get: function () { return this.renderMode == "progressBottom" || this.renderMode == "progressTopBottom"; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isPrevButtonShowing", {
/**
* Returns true when currentIndex is more than 0.
* @see currenIndex
* @see currenPanel
*/
get: function () { return this.currentIndex > 0; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isNextButtonShowing", {
/**
* Returns true when currentIndex is more than or equal 0 and less then panelCount - 1.
* @see currenIndex
* @see currenPanel
* @see panelCount
*/
get: function () { return this.currentIndex >= 0 && this.currentIndex < this.panelCount - 1; },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isRangeShowing", {
/**
* Returns true when showRangeInProgress equals to true, renderMode doesn't equal to "list" and panelCount is >= 2.
*/
get: function () { return this.showRangeInProgress && (this.currentIndex >= 0 && this.panelCount > 1); },
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.getElementsInDesign = function (includeHidden) {
if (includeHidden === void 0) { includeHidden = false; }
return includeHidden ? [this.template] : this.templateElements;
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelCount", {
/**
* Use this property to get/set the number of dynamic panels.
* @see template
* @see minPanelCount
* @see maxPanelCount
* @see addPanel
* @see removePanel
* @see removePanelUI
*/
get: function () { return this.isLoadingFromJson ? this.loadingPanelCount : this.items.length; },
set: function (val) {
if (val < 0)
return;
if (this.isLoadingFromJson) {
this.loadingPanelCount = val;
return;
}
if (val == this.items.length || this.isDesignMode)
return;
for (var i = this.panelCount; i < val; i++) {
this.items.push(this.createNewItem());
}
if (val < this.panelCount)
this.items.splice(val, this.panelCount - val);
this.setValueBasedOnPanelCount();
this.reRunCondition();
this.fireCallback(this.panelCountChangedCallback);
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.setValueBasedOnPanelCount = function () {
var value = this.value;
if (!value || !Array.isArray(value))
value = [];
if (value.length == this.panelCount)
return;
for (var i = value.length; i < this.panelCount; i++)
value.push({});
if (value.length > this.panelCount)
value.splice(this.panelCount, value.length - this.panelCount);
this.value = value;
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "minPanelCount", {
/**
* The minimum panel count. A user could not delete a panel if the panelCount equals to minPanelCount
* @see panelCount
* @see maxPanelCount
*/
get: function () { return this.getPropertyValue("minPanelCount", 0); },
set: function (val) {
if (val < 0)
val = 0;
if (val == this.minPanelCount || val > this.maxPanelCount)
return;
this.setPropertyValue("minPanelCount", val);
if (this.panelCount < val)
this.panelCount = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "maxPanelCount", {
/**
* The maximum panel count. A user could not add a panel if the panelCount equals to maxPanelCount
* @see panelCount
* @see minPanelCount
*/
get: function () { return this.getPropertyValue("maxPanelCount", QuestionPanelDynamicModel.MaxPanelCount); },
set: function (val) {
if (val <= 0)
return;
if (val > QuestionPanelDynamicModel.MaxPanelCount)
val = QuestionPanelDynamicModel.MaxPanelCount;
if (val == this.maxPanelCount || val < this.minPanelCount)
return;
this.setPropertyValue("maxPanelCount", val);
if (this.panelCount > val)
this.panelCount = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "showQuestionNumbers", {
/**
* Use this property to show/hide the numbers in titles in questions inside a dynamic panel.
* By default the value is "off". You may set it to "onPanel" and the first question inside a dynamic panel will start with 1 or "onSurvey" to include nested questions in dymamic panels into global survey question numbering.
*/
get: function () { return this.getPropertyValue("showQuestionNumbers", "off"); },
set: function (val) {
this.setPropertyValue("showQuestionNumbers", val);
if (!this.isLoadingFromJson && this.survey) {
this.survey.questionVisibilityChanged(this, this.visible);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "showRangeInProgress", {
/**
* Shows the range from 1 to panelCount when renderMode doesn't equal to "list". Set to false to hide this element.
* @see panelCount
* @see renderMode
*/
get: function () { return this.getPropertyValue("showRangeInProgress", true); },
set: function (val) {
this.setPropertyValue("showRangeInProgress", val);
this.fireCallback(this.currentIndexChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "renderMode", {
/**
* By default the property equals to "list" and all dynamic panels are rendered one by one on the page. You may change it to: "progressTop", "progressBottom" or "progressTopBottom" to render only one dynamic panel at once. The progress and navigation elements can be rendred on top, bottom or both.
*/
get: function () { return this.getPropertyValue("renderMode", "list"); },
set: function (val) {
this.setPropertyValue("renderMode", val);
this.fireCallback(this.renderModeChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isRenderModeList", {
/**
* Returns true when renderMode equals to "list".
* @renderMode
*/
get: function () { return this.renderMode == "list"; },
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.setVisibleIndex = function (value) {
var startIndex = this.showQuestionNumbers == "onSurvey" ? value : 0;
for (var i = 0; i < this.items.length; i++) {
var counter = this.items[i].setVisibleIndex(startIndex, this.showQuestionNumbers != "off");
if (this.showQuestionNumbers == "onSurvey") {
startIndex += counter;
}
}
_super.prototype.setVisibleIndex.call(this, this.showQuestionNumbers != "onSurvey" ? value : -1);
return this.showQuestionNumbers != "onSurvey" ? 1 : startIndex - value;
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "canAddPanel", {
/**
* Returns true when an end user may add a new panel. The question is not read only and panelCount less than maxPanelCount
* @see isReadOnly
* @see panelCount
* @see maxPanelCount
*/
get: function () { return !this.isReadOnly && (this.panelCount < this.maxPanelCount); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "canRemovePanel", {
/**
* Returns true when an end user may remove a panel. The question is not read only and panelCount is more than minPanelCount
* @see isReadOnly
* @see panelCount
* @see minPanelCount
*/
get: function () { return !this.isReadOnly && (this.panelCount > this.minPanelCount); },
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.rebuildPanels = function () {
var items = new Array();
if (this.isDesignMode) {
items.push(new QuestionPanelDynamicItem(this, this.template));
if (this.oldTemplateRowsChangedCallback) {
this.oldTemplateRowsChangedCallback();
}
}
else {
for (var i = 0; i < this.panelCount; i++) {
items.push(this.createNewItem());
}
}
this.itemsValue = items;
this.reRunCondition();
this.fireCallback(this.panelCountChangedCallback);
};
/**
* Add a new dynamic panel based on the template Panel.
* @see template
* @see panelCount
* @see panels
*/
QuestionPanelDynamicModel.prototype.addPanel = function () {
if (!this.canAddPanel)
return null;
this.panelCount++;
if (!this.isRenderModeList) {
this.currentIndex = this.panelCount - 1;
}
return this.items[this.panelCount - 1].panel;
};
/**
* Call removePanel function. If confirmDelete set to true, it shows the confirmation dialog first.
* @param value a panel or panel index
* @see removePanel
* @see confirmDelete
* @see confirmDeleteText
*/
QuestionPanelDynamicModel.prototype.removePanelUI = function (value) {
if (!this.confirmDelete || confirm(this.confirmDeleteText)) {
this.removePanel(value);
}
};
/**
* Removes a dynamic panel from the panels array. Do nothing is caRemovePanel returns false.
* @param value a panel or panel index
* @see panels
* @see canRemovePanel
* @see template
*/
QuestionPanelDynamicModel.prototype.removePanel = function (value) {
if (!this.canRemovePanel)
return;
var index = this.getPanelIndex(value);
if (index < 0 || index >= this.panelCount)
return;
this.items.splice(index, 1);
var value = this.value;
if (!value || !Array.isArray(value) || index >= value.length)
return;
value.splice(index, 1);
this.value = value;
this.fireCallback(this.panelCountChangedCallback);
};
QuestionPanelDynamicModel.prototype.getPanelIndex = function (val) {
if (!isNaN(parseFloat(val)) && isFinite(val))
return val;
for (var i = 0; i < this.items.length; i++) {
if (this.items[i] === val || this.items[i].panel === val)
return i;
}
return -1;
};
QuestionPanelDynamicModel.prototype.onSurveyLoad = function () {
if (this.loadingPanelCount > 0) {
this.panelCount = this.loadingPanelCount;
}
if (this.isDesignMode) {
this.rebuildPanels();
}
_super.prototype.onSurveyLoad.call(this);
};
QuestionPanelDynamicModel.prototype.runCondition = function (values) {
_super.prototype.runCondition.call(this, values);
this.runPanelsCondition(values);
};
QuestionPanelDynamicModel.prototype.reRunCondition = function () {
if (!this.data)
return;
this.runCondition(this.data.getAllValues());
};
QuestionPanelDynamicModel.prototype.runPanelsCondition = function (values) {
var newValues = {};
if (values && values instanceof Object) {
newValues = JSON.parse(JSON.stringify(values));
}
for (var i = 0; i < this.items.length; i++) {
newValues[QuestionPanelDynamicItem.ItemVariableName] = this.getPanelItemData(this.items[i]);
this.items[i].runCondition(newValues);
}
};
QuestionPanelDynamicModel.prototype.onAnyValueChanged = function (name) {
_super.prototype.onAnyValueChanged.call(this, name);
for (var i = 0; i < this.items.length; i++) {
this.items[i].onAnyValueChanged(name);
}
};
QuestionPanelDynamicModel.prototype.hasErrors = function (fireCallback) {
if (fireCallback === void 0) { fireCallback = true; }
var errosInPanels = this.hasErrorInPanels(fireCallback);
return _super.prototype.hasErrors.call(this, fireCallback) || errosInPanels;
};
QuestionPanelDynamicModel.prototype.getAllErrors = function () {
var result = _super.prototype.getAllErrors.call(this);
for (var i = 0; i < this.panels.length; i++) {
var questions = this.panels[i].questions;
for (var j = 0; j < questions.length; j++) {
var errors = questions[j].getAllErrors();
if (errors && errors.length > 0) {
result = result.concat(errors);
}
}
}
return result;
};
QuestionPanelDynamicModel.prototype.hasErrorInPanels = function (fireCallback) {
var res = false;
var panels = this.panels;
var keyValues = [];
for (var i = 0; i < panels.length; i++) {
var pnlError = panels[i].hasErrors(fireCallback);
pnlError = this.isValueDuplicated(panels[i], keyValues) || pnlError;
if (!this.isRenderModeList && pnlError && !res) {
this.currentIndex = i;
}
res = pnlError || res;
}
return res;
};
QuestionPanelDynamicModel.prototype.isValueDuplicated = function (panel, keyValues) {
if (!this.keyName)
return false;
var question = panel.getQuestionByName(this.keyName);
if (!question || question.isEmpty())
return false;
var value = question.value;
for (var i = 0; i < keyValues.length; i++) {
if (value == keyValues[i]) {
question.addError(new __WEBPACK_IMPORTED_MODULE_9__error__["c" /* CustomError */](this.keyDuplicationError));
return true;
}
}
keyValues.push(value);
return false;
};
QuestionPanelDynamicModel.prototype.createNewItem = function () {
return new QuestionPanelDynamicItem(this, this.createNewPanel());
};
QuestionPanelDynamicModel.prototype.createNewPanel = function () {
var panel = this.createNewPanelObject();
var jObj = new __WEBPACK_IMPORTED_MODULE_7__jsonobject__["a" /* JsonObject */]();
var json = jObj.toJsonObject(this.template);
jObj.toObject(json, panel);
panel.renderWidth = "100%";
return panel;
};
QuestionPanelDynamicModel.prototype.createNewPanelObject = function () {
return new __WEBPACK_IMPORTED_MODULE_6__panel__["a" /* PanelModel */]();
};
QuestionPanelDynamicModel.prototype.onValueChanged = function () {
if (this.isValueChangingInternally)
return;
var val = this.value;
var newPanelCount = val && Array.isArray(val) ? val.length : 0;
if (newPanelCount <= this.panelCount)
return;
this.panelCount = newPanelCount;
};
QuestionPanelDynamicModel.prototype.onSurveyValueChanged = function (newValue) {
_super.prototype.onSurveyValueChanged.call(this, newValue);
for (var i = 0; i < this.items.length; i++) {
this.items[i].onSurveyValueChanged();
}
};
QuestionPanelDynamicModel.prototype.onSetData = function () {
_super.prototype.onSetData.call(this);
if (this.isDesignMode) {
this.template.setSurveyImpl(this.surveyImpl);
if (!this.isLoadingFromJson) {
this.rebuildPanels();
}
}
};
//IQuestionPanelDynamicData
QuestionPanelDynamicModel.prototype.getItemIndex = function (item) {
return this.items.indexOf(item);
};
QuestionPanelDynamicModel.prototype.getPanelItemData = function (item) {
var index = this.items.indexOf(item);
if (index < 0)
return {};
var qValue = this.value;
if (!qValue || !Array.isArray(qValue) || qValue.length <= index)
return {};
return qValue[index];
};
QuestionPanelDynamicModel.prototype.setPanelItemData = function (item, name, val) {
var index = this.items.indexOf(item);
if (index < 0)
return;
var qValue = this.value;
if (!qValue) {
qValue = [];
for (var i = 0; i < this.items.length; i++) {
qValue.push({});
}
}
if (!Array.isArray(qValue) || qValue.length <= index)
return;
if (!qValue[index])
qValue[index] = {};
qValue[index][name] = val;
this.isValueChangingInternally = true;
this.value = qValue;
this.isValueChangingInternally = false;
};
QuestionPanelDynamicModel.prototype.getSurvey = function () { return this.survey; };
return QuestionPanelDynamicModel;
}(__WEBPACK_IMPORTED_MODULE_5__question__["a" /* Question */]));
QuestionPanelDynamicModel.MaxPanelCount = 100;
__WEBPACK_IMPORTED_MODULE_7__jsonobject__["a" /* JsonObject */].metaData.addClass("paneldynamic", [{ name: "templateElements", alternativeName: "questions", visible: false },
{ name: "templateTitle:text", serializationProperty: "locTemplateTitle" }, { name: "templateDescription:text", serializationProperty: "locTemplateDescription" },
{ name: "panelCount:number", default: 0, choices: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] },
{ name: "minPanelCount:number", default: 0 }, { name: "maxPanelCount:number", default: QuestionPanelDynamicModel.MaxPanelCount },
{ name: "keyName" }, { name: "keyDuplicationError", serializationProperty: "locKeyDuplicationError" },
{ name: "confirmDelete:boolean" }, { name: "confirmDeleteText", serializationProperty: "locConfirmDeleteText" },
{ name: "panelAddText", serializationProperty: "locPanelAddText" }, { name: "panelRemoveText", serializationProperty: "locPanelRemoveText" },
{ name: "panelPrevText", serializationProperty: "locPanelPrevText" }, { name: "panelNextText", serializationProperty: "locPanelNextText" },
{ name: "showQuestionNumbers", default: "off", choices: ["off", "onPanel", "onSurvey"] }, { name: "showRangeInProgress", default: true },
{ name: "renderMode", default: "list", choices: ["list", "progressTop", "progressBottom", "progressTopBottom"] }], function () { return new QuestionPanelDynamicModel(""); }, "question");
__WEBPACK_IMPORTED_MODULE_8__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("paneldynamic", function (name) { return new QuestionPanelDynamicModel(name); });
/***/ }),
/* 87 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(16);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionRadiogroupModel; });
/**
* A Model for a radiogroup question.
*/
var QuestionRadiogroupModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionRadiogroupModel, _super);
function QuestionRadiogroupModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
return _this;
}
QuestionRadiogroupModel.prototype.getType = function () {
return "radiogroup";
};
QuestionRadiogroupModel.prototype.supportGoNextPageAutomatic = function () { return true; };
return QuestionRadiogroupModel;
}(__WEBPACK_IMPORTED_MODULE_3__question_baseselect__["a" /* QuestionCheckboxBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */].metaData.addClass("radiogroup", [], function () { return new QuestionRadiogroupModel(""); }, "checkboxbase");
__WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("radiogroup", function (name) { var q = new QuestionRadiogroupModel(name); q.choices = __WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].DefaultChoices; return q; });
/***/ }),
/* 88 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__itemvalue__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(5);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionRatingModel; });
/**
* A Model for a rating question.
*/
var QuestionRatingModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionRatingModel, _super);
function QuestionRatingModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.rates = _this.createItemValues("rates");
var self = _this;
_this.registerFunctionOnPropertyValueChanged("rates", function () { self.fireCallback(self.rateValuesChangedCallback); });
_this.onPropertyChanged.add(function (sender, options) {
if (options.name == "rateMin" || options.name == "rateMax" || options.name == "rateStep") {
self.fireCallback(self.rateValuesChangedCallback);
}
});
var locMinRateDescriptionValue = _this.createLocalizableString("minRateDescription", _this, true);
var locMaxRateDescriptionValue = _this.createLocalizableString("maxRateDescription", _this, true);
locMinRateDescriptionValue.onGetTextCallback = function (text) { return text ? text + " " : text; };
locMaxRateDescriptionValue.onGetTextCallback = function (text) { return text ? " " + text : text; };
return _this;
}
QuestionRatingModel.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
this.fireCallback(this.rateValuesChangedCallback);
};
Object.defineProperty(QuestionRatingModel.prototype, "rateValues", {
/**
* The list of rate items. Every item has value and text. If text is empty, the value is rendered. The item text supports markdown. If it is empty the array is generated by using rateMin, rateMax and rateStep properties.
* @see rateMin
* @see rateMax
* @see rateStep
*/
get: function () { return this.rates; },
set: function (val) {
this.setPropertyValue("rates", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "rateMin", {
/**
* This property is used to generate rate values if rateValues array is empty. It is the first value in the rating. The default value is 1.
* @see rateValues
* @see rateMax
* @see rateStep
*/
get: function () { return this.getPropertyValue("rateMin", 1); },
set: function (val) {
if (val > this.rateMax - this.rateStep)
val = this.rateMax - this.rateStep;
this.setPropertyValue("rateMin", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "rateMax", {
/**
* This property is used to generate rate values if rateValues array is empty. It is the last value in the rating. The default value is 5.
* @see rateValues
* @see rateMin
* @see rateStep
*/
get: function () { return this.getPropertyValue("rateMax", 5); },
set: function (val) {
if (val < this.rateMin + this.rateStep)
val = this.rateMin + this.rateStep;
this.setPropertyValue("rateMax", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "rateStep", {
/**
* This property is used to generate rate values if rateValues array is empty. It is the step value. The number of rate values are (rateMax - rateMin) / rateStep. The default value is 1.
* @see rateValues
* @see rateMin
* @see rateMax
*/
get: function () { return this.getPropertyValue("rateStep", 1); },
set: function (val) {
if (val <= 0)
val = 1;
if (val > this.rateMax - this.rateMin)
val = this.rateMax - this.rateMin;
this.setPropertyValue("rateStep", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "visibleRateValues", {
get: function () {
if (this.rateValues.length > 0)
return this.rateValues;
var res = [];
var value = this.rateMin;
while (value <= this.rateMax && res.length < QuestionRatingModel.MaximumRateValueCount) {
res.push(new __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */](value));
value += this.rateStep;
}
return res;
},
enumerable: true,
configurable: true
});
QuestionRatingModel.prototype.getType = function () {
return "rating";
};
QuestionRatingModel.prototype.supportGoNextPageAutomatic = function () { return true; };
QuestionRatingModel.prototype.supportComment = function () { return true; };
QuestionRatingModel.prototype.supportOther = function () { return true; };
Object.defineProperty(QuestionRatingModel.prototype, "minRateDescription", {
/**
* The description of minimum (first) item.
*/
get: function () { return this.getLocalizableStringText("minRateDescription"); },
set: function (val) { this.setLocalizableStringText("minRateDescription", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "locMinRateDescription", {
get: function () { return this.getLocalizableString("minRateDescription"); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "maxRateDescription", {
/**
* The description of maximum (last) item.
*/
get: function () { return this.getLocalizableStringText("maxRateDescription"); },
set: function (val) { this.setLocalizableStringText("maxRateDescription", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "locMaxRateDescription", {
get: function () { return this.getLocalizableString("maxRateDescription"); },
enumerable: true,
configurable: true
});
;
return QuestionRatingModel;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
QuestionRatingModel.MaximumRateValueCount = 20;
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* JsonObject */].metaData.addClass("rating", ["hasComment:boolean", { name: "rateValues:itemvalues", onGetValue: function (obj) { return __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getData(obj.rateValues); }, onSetValue: function (obj, value) { obj.rateValues = value; } },
{ name: "rateMin:number", default: 1 }, { name: "rateMax:number", default: 5 }, { name: "rateStep:number", default: 1 },
{ name: "minRateDescription", alternativeName: "mininumRateDescription", serializationProperty: "locMinRateDescription" },
{ name: "maxRateDescription", alternativeName: "maximumRateDescription", serializationProperty: "locMaxRateDescription" }], function () { return new QuestionRatingModel(""); }, "question");
__WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("rating", function (name) { return new QuestionRatingModel(name); });
/***/ }),
/* 89 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__questionfactory__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question__ = __webpack_require__(8);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionTextModel; });
/**
* A Model for an input text question.
*/
var QuestionTextModel = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionTextModel, _super);
function QuestionTextModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("placeHolder", _this);
return _this;
}
QuestionTextModel.prototype.getType = function () {
return "text";
};
Object.defineProperty(QuestionTextModel.prototype, "inputType", {
/**
* Use this property to change the default input type.
*/
get: function () { return this.getPropertyValue("inputType", "text"); },
set: function (val) {
val = val.toLowerCase();
if (val == "datetime_local")
val = "datetime-local";
this.setPropertyValue("inputType", val.toLowerCase());
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionTextModel.prototype, "size", {
/**
* The text input size
*/
get: function () { return this.getPropertyValue("size", 25); },
set: function (val) { this.setPropertyValue("size", val); },
enumerable: true,
configurable: true
});
QuestionTextModel.prototype.isEmpty = function () { return _super.prototype.isEmpty.call(this) || this.value === ""; };
QuestionTextModel.prototype.supportGoNextPageAutomatic = function () { return true; };
Object.defineProperty(QuestionTextModel.prototype, "placeHolder", {
/**
* The input place holder.
*/
get: function () { return this.getLocalizableStringText("placeHolder"); },
set: function (val) { this.setLocalizableStringText("placeHolder", val); },
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionTextModel.prototype, "locPlaceHolder", {
get: function () { return this.getLocalizableString("placeHolder"); },
enumerable: true,
configurable: true
});
QuestionTextModel.prototype.setNewValue = function (newValue) {
newValue = this.correctValueType(newValue);
_super.prototype.setNewValue.call(this, newValue);
};
QuestionTextModel.prototype.correctValueType = function (newValue) {
if (!newValue)
return newValue;
if (this.inputType == "number" || this.inputType == "range") {
return this.isNumber(newValue) ? parseFloat(newValue) : "";
}
return newValue;
};
QuestionTextModel.prototype.isNumber = function (value) {
return !isNaN(parseFloat(value)) && isFinite(value);
};
return QuestionTextModel;
}(__WEBPACK_IMPORTED_MODULE_3__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("text", [{ name: "inputType", default: "text", choices: ["color", "date", "datetime", "datetime-local", "email", "month", "number", "password", "range", "tel", "text", "time", "url", "week"] },
{ name: "size:number", default: 25 }, { name: "placeHolder", serializationProperty: "locPlaceHolder" }], function () { return new QuestionTextModel(""); }, "question");
__WEBPACK_IMPORTED_MODULE_1__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("text", function (name) { return new QuestionTextModel(name); });
/***/ }),
/* 90 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionBoolean; });
var SurveyQuestionBoolean = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionBoolean, _super);
function SurveyQuestionBoolean(props) {
var _this = _super.call(this, props) || this;
_this.state = { value: _this.question.checkedValue };
_this.handleOnChange = _this.handleOnChange.bind(_this);
return _this;
}
SurveyQuestionBoolean.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.setState({ value: this.question.checkedValue });
};
Object.defineProperty(SurveyQuestionBoolean.prototype, "question", {
get: function () { return this.questionBase; },
enumerable: true,
configurable: true
});
SurveyQuestionBoolean.prototype.handleOnChange = function (event) {
this.question.checkedValue = event.target.checked;
this.setState({ value: this.question.checkedValue });
};
SurveyQuestionBoolean.prototype.componentDidMount = function () {
this.updateIndeterminate();
};
SurveyQuestionBoolean.prototype.componentDidUpdate = function () {
this.updateIndeterminate();
};
SurveyQuestionBoolean.prototype.updateIndeterminate = function () {
if (!this.question)
return;
var el = this.refs["check"];
if (el) {
el["indeterminate"] = this.question.isIndeterminate;
}
};
SurveyQuestionBoolean.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
var text = this.renderLocString(this.question.locDisplayLabel);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("form", { className: cssClasses.item },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("label", { className: cssClasses.item },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { ref: "check", type: "checkbox", value: this.question.checkedValue, id: this.question.inputId, disabled: this.isDisplayMode, checked: this.question.checkedValue, onChange: this.handleOnChange, "aria-label": this.question.locTitle.renderedHtml }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: "checkbox-material" },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: "check" })),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", null, text))));
};
return SurveyQuestionBoolean;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("boolean", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionBoolean, props);
});
/***/ }),
/* 91 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__ = __webpack_require__(14);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionCheckbox; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionCheckboxItem; });
var SurveyQuestionCheckbox = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionCheckbox, _super);
function SurveyQuestionCheckbox(props) {
var _this = _super.call(this, props) || this;
_this.state = { choicesChanged: 0 };
var self = _this;
_this.question.choicesChangedCallback = function () {
self.state.choicesChanged = self.state.choicesChanged + 1;
self.setState(self.state);
};
return _this;
}
Object.defineProperty(SurveyQuestionCheckbox.prototype, "question", {
get: function () { return this.questionBase; },
enumerable: true,
configurable: true
});
SurveyQuestionCheckbox.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("form", { className: cssClasses.root }, this.getItems(cssClasses)));
};
SurveyQuestionCheckbox.prototype.getItems = function (cssClasses) {
var items = [];
for (var i = 0; i < this.question.visibleChoices.length; i++) {
var item = this.question.visibleChoices[i];
var key = "item" + i;
items.push(this.renderItem(key, item, i == 0, cssClasses));
}
return items;
};
Object.defineProperty(SurveyQuestionCheckbox.prototype, "textStyle", {
get: function () { return null; },
enumerable: true,
configurable: true
});
SurveyQuestionCheckbox.prototype.renderItem = function (key, item, isFirst, cssClasses) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionCheckboxItem, { key: key, question: this.question, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode, item: item, textStyle: this.textStyle, isFirst: isFirst });
};
return SurveyQuestionCheckbox;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
var SurveyQuestionCheckboxItem = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionCheckboxItem, _super);
function SurveyQuestionCheckboxItem(props) {
var _this = _super.call(this, props) || this;
_this.item = props.item;
_this.question = props.question;
_this.textStyle = props.textStyle;
_this.isFirst = props.isFirst;
_this.handleOnChange = _this.handleOnChange.bind(_this);
return _this;
}
SurveyQuestionCheckboxItem.prototype.shouldComponentUpdate = function () {
return !this.question.customWidget || !!this.question.customWidgetData.isNeedRender || !!this.question.customWidget.widgetJson.render;
};
SurveyQuestionCheckboxItem.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.item = nextProps.item;
this.textStyle = nextProps.textStyle;
this.question = nextProps.question;
this.isFirst = nextProps.isFirst;
};
SurveyQuestionCheckboxItem.prototype.handleOnChange = function (event) {
var newValue = this.question.value;
if (!newValue) {
newValue = [];
}
var index = newValue.indexOf(this.item.value);
if (event.target.checked) {
if (index < 0) {
newValue.push(this.item.value);
}
}
else {
if (index > -1) {
newValue.splice(index, 1);
}
}
this.question.value = newValue;
this.setState({ value: this.question.value });
};
SurveyQuestionCheckboxItem.prototype.render = function () {
if (!this.item || !this.question)
return null;
var itemWidth = this.question.colCount > 0 ? (100 / this.question.colCount) + "%" : "";
var marginRight = this.question.colCount == 0 ? "5px" : "0px";
var divStyle = { marginRight: marginRight, display: 'inline-block' };
if (itemWidth) {
divStyle["width"] = itemWidth;
}
var isChecked = (this.question.value && this.question.value.indexOf(this.item.value) > -1) || false;
var otherItem = (this.item.value === this.question.otherItem.value && isChecked) ? this.renderOther() : null;
return this.renderCheckbox(isChecked, divStyle, otherItem);
};
Object.defineProperty(SurveyQuestionCheckboxItem.prototype, "inputStyle", {
get: function () { return { marginRight: "3px" }; },
enumerable: true,
configurable: true
});
SurveyQuestionCheckboxItem.prototype.renderCheckbox = function (isChecked, divStyle, otherItem) {
var id = this.isFirst ? this.question.inputId : null;
var text = this.renderLocString(this.item.locText);
var itemClass = this.cssClasses.item + (this.question.colCount === 0 ? " sv_q_checkbox_inline" : "");
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: itemClass, style: divStyle },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("label", { className: this.cssClasses.label },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { type: "checkbox", value: this.item.value, id: id, style: this.inputStyle, disabled: this.isDisplayMode, checked: isChecked, onChange: this.handleOnChange, "aria-label": this.question.locTitle.renderedHtml }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: "checkbox-material" },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: "check" })),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", null, text)),
otherItem));
};
SurveyQuestionCheckboxItem.prototype.renderOther = function () {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.cssClasses.other },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__["a" /* SurveyQuestionCommentItem */], { question: this.question, otherCss: this.cssClasses.other, cssClasses: this.cssClasses, isDisplayMode: this.isDisplayMode })));
};
return SurveyQuestionCheckboxItem;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["c" /* ReactSurveyElement */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("checkbox", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionCheckbox, props);
});
/***/ }),
/* 92 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__ = __webpack_require__(14);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__utils__ = __webpack_require__(106);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionDropdown; });
var SurveyQuestionDropdown = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionDropdown, _super);
function SurveyQuestionDropdown(props) {
var _this = _super.call(this, props) || this;
_this.state = { value: _this.getStateValue(), choicesChanged: 0 };
var self = _this;
_this.question.choicesChangedCallback = function () {
self.state.choicesChanged = self.state.choicesChanged + 1;
self.state.value = self.question.value;
self.setState(self.state);
};
_this.handleOnChange = _this.handleOnChange.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionDropdown.prototype, "question", {
get: function () { return this.questionBase; },
enumerable: true,
configurable: true
});
SurveyQuestionDropdown.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.setState({ value: this.getStateValue() });
};
SurveyQuestionDropdown.prototype.handleOnChange = function (event) {
this.question.value = event.target.value;
this.setState({ value: this.getStateValue() });
};
SurveyQuestionDropdown.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
var comment = this.question.value === this.question.otherItem.value ? this.renderOther(cssClasses) : null;
var select = this.renderSelect(cssClasses);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.root },
select,
comment));
};
SurveyQuestionDropdown.prototype.renderSelect = function (cssClasses) {
if (this.isDisplayMode) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { id: this.question.inputId, className: cssClasses.control }, this.question.displayValue));
}
var options = [];
for (var i = 0; i < this.question.visibleChoices.length; i++) {
var item = this.question.visibleChoices[i];
var key = "item" + i;
var option = __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("option", { key: key, value: item.value }, item.text);
options.push(option);
}
var onChange = null;
if (__WEBPACK_IMPORTED_MODULE_5__utils__["a" /* browser */].msie || (__WEBPACK_IMPORTED_MODULE_5__utils__["a" /* browser */].firefox && __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__utils__["b" /* compareVersions */])(__WEBPACK_IMPORTED_MODULE_5__utils__["a" /* browser */].version, '51') < 0) || (__WEBPACK_IMPORTED_MODULE_5__utils__["a" /* browser */].firefox && __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__utils__["c" /* isMobile */])())) {
onChange = this.handleOnChange;
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("select", { id: this.question.inputId, className: cssClasses.control, value: this.state.value, onChange: onChange, onInput: this.handleOnChange, "aria-label": this.question.locTitle.renderedHtml },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("option", { value: "" }, this.question.optionsCaption),
options));
};
SurveyQuestionDropdown.prototype.renderOther = function (cssClasses) {
var style = { marginTop: "3px" };
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { style: style },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__["a" /* SurveyQuestionCommentItem */], { question: this.question, otherCss: cssClasses.other, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode }));
};
SurveyQuestionDropdown.prototype.getStateValue = function () { return !this.question.isEmpty() ? this.question.value : ''; };
return SurveyQuestionDropdown;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("dropdown", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionDropdown, props);
});
/***/ }),
/* 93 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionEmpty; });
var SurveyQuestionEmpty = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionEmpty, _super);
function SurveyQuestionEmpty(props) {
var _this = _super.call(this, props) || this;
_this.state = { value: _this.question.value };
return _this;
}
Object.defineProperty(SurveyQuestionEmpty.prototype, "question", {
get: function () { return this.questionBase; },
enumerable: true,
configurable: true
});
SurveyQuestionEmpty.prototype.render = function () {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null);
};
return SurveyQuestionEmpty;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("empty", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionEmpty, props);
});
/***/ }),
/* 94 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionExpression; });
var SurveyQuestionExpression = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionExpression, _super);
function SurveyQuestionExpression(props) {
var _this = _super.call(this, props) || this;
_this.state = { value: _this.question.value };
return _this;
}
Object.defineProperty(SurveyQuestionExpression.prototype, "question", {
get: function () { return this.questionBase; },
enumerable: true,
configurable: true
});
SurveyQuestionExpression.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.setState({ value: this.question.value });
};
SurveyQuestionExpression.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { id: this.question.inputId, className: cssClasses.root }, this.question.displayValue));
};
return SurveyQuestionExpression;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("expression", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionExpression, props);
});
/***/ }),
/* 95 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionFile; });
var SurveyQuestionFile = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionFile, _super);
function SurveyQuestionFile(props) {
var _this = _super.call(this, props) || this;
_this.state = { fileLoaded: 0 };
_this.handleOnChange = _this.handleOnChange.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionFile.prototype, "question", {
get: function () { return this.questionBase; },
enumerable: true,
configurable: true
});
SurveyQuestionFile.prototype.handleOnChange = function (event) {
var src = event.target || event.srcElement;
if (!window["FileReader"])
return;
if (!src || !src.files || src.files.length < 1)
return;
this.question.loadFile(src.files[0]);
this.setState({ fileLoaded: this.state.fileLoaded + 1 });
};
SurveyQuestionFile.prototype.render = function () {
if (!this.question)
return null;
var img = this.renderImage();
var fileInput = null;
if (!this.isDisplayMode) {
fileInput = __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { id: this.question.inputId, type: "file", onChange: this.handleOnChange, "aria-label": this.question.locTitle.renderedHtml });
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
fileInput,
img));
};
SurveyQuestionFile.prototype.renderImage = function () {
if (!this.question.previewValue)
return null;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
" ",
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("img", { src: this.question.previewValue, height: this.question.imageHeight, width: this.question.imageWidth })));
};
return SurveyQuestionFile;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("file", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionFile, props);
});
/***/ }),
/* 96 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionHtml; });
var SurveyQuestionHtml = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionHtml, _super);
function SurveyQuestionHtml(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyQuestionHtml.prototype, "question", {
get: function () { return this.questionBase; },
enumerable: true,
configurable: true
});
SurveyQuestionHtml.prototype.render = function () {
if (!this.question || !this.question.html)
return null;
var htmlValue = { __html: this.question.processedHtml };
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { dangerouslySetInnerHTML: htmlValue }));
};
return SurveyQuestionHtml;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("html", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionHtml, props);
});
/***/ }),
/* 97 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionMatrix; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionMatrixRow; });
var SurveyQuestionMatrix = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionMatrix, _super);
function SurveyQuestionMatrix(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyQuestionMatrix.prototype, "question", {
get: function () { return this.questionBase; },
enumerable: true,
configurable: true
});
SurveyQuestionMatrix.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
var firstTH = this.question.hasRows ? __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", null) : null;
var headers = [];
for (var i = 0; i < this.question.columns.length; i++) {
var column = this.question.columns[i];
var key = "column" + i;
var columText = this.renderLocString(column.locText);
headers.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("th", { key: key }, columText));
}
var rows = [];
var visibleRows = this.question.visibleRows;
for (var i = 0; i < visibleRows.length; i++) {
var row = visibleRows[i];
var key = "row" + i;
rows.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMatrixRow, { key: key, question: this.question, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode, row: row, isFirst: i == 0 }));
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("table", { className: cssClasses.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("thead", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tr", null,
firstTH,
headers)),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tbody", null, rows)));
};
return SurveyQuestionMatrix;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
var SurveyQuestionMatrixRow = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionMatrixRow, _super);
function SurveyQuestionMatrixRow(props) {
var _this = _super.call(this, props) || this;
_this.question = props.question;
_this.row = props.row;
_this.isFirst = props.isFirst;
_this.handleOnChange = _this.handleOnChange.bind(_this);
return _this;
}
SurveyQuestionMatrixRow.prototype.handleOnChange = function (event) {
this.row.value = event.target.value;
this.setState({ value: this.row.value });
};
SurveyQuestionMatrixRow.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.question = nextProps.question;
this.row = nextProps.row;
this.isFirst = nextProps.isFirst;
};
SurveyQuestionMatrixRow.prototype.render = function () {
if (!this.row)
return null;
var firstTD = null;
if (this.question.hasRows) {
var rowText = this.renderLocString(this.row.locText);
firstTD = __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", null, rowText);
}
var tds = [];
for (var i = 0; i < this.question.columns.length; i++) {
var column = this.question.columns[i];
var key = "value" + i;
var isChecked = this.row.value == column.value;
var inputId = this.isFirst && i == 0 ? this.question.inputId : null;
var td = __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", { key: key },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("label", { className: this.cssClasses.label },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { id: inputId, type: "radio", className: this.cssClasses.itemValue, name: this.row.fullName, value: column.value, disabled: this.isDisplayMode, checked: isChecked, onChange: this.handleOnChange, "aria-label": this.question.locTitle.renderedHtml }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: "circle" }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: "check" }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { style: { 'display': 'none' } }, this.question.locTitle.renderedHtml)));
tds.push(td);
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tr", null,
firstTD,
tds));
};
return SurveyQuestionMatrixRow;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["c" /* ReactSurveyElement */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("matrix", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMatrix, props);
});
/***/ }),
/* 98 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionmatrixdropdown__ = __webpack_require__(39);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionMatrixDynamic; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionMatrixDynamicRow; });
var SurveyQuestionMatrixDynamic = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionMatrixDynamic, _super);
function SurveyQuestionMatrixDynamic(props) {
var _this = _super.call(this, props) || this;
_this.setProperties(props);
_this.state = _this.getState();
return _this;
}
Object.defineProperty(SurveyQuestionMatrixDynamic.prototype, "question", {
get: function () { return this.questionBase; },
enumerable: true,
configurable: true
});
SurveyQuestionMatrixDynamic.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.setProperties(nextProps);
};
SurveyQuestionMatrixDynamic.prototype.setProperties = function (nextProps) {
var _this = this;
this.setState({ rowCounter: 0 });
this.question.rowCountChangedCallback = function () {
_this.setState(_this.getState(_this.state));
};
this.handleOnRowAddClick = this.handleOnRowAddClick.bind(this);
};
SurveyQuestionMatrixDynamic.prototype.getState = function (prevState) {
if (prevState === void 0) { prevState = null; }
return { rowCounter: !prevState ? 0 : prevState.rowCounter + 1 };
};
SurveyQuestionMatrixDynamic.prototype.handleOnRowAddClick = function (event) {
this.question.addRow();
};
SurveyQuestionMatrixDynamic.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
var headers = [];
for (var i = 0; i < this.question.columns.length; i++) {
var column = this.question.columns[i];
var key = "column" + i;
var minWidth = this.question.getColumnWidth(column);
var columnStyle = minWidth ? { minWidth: minWidth } : {};
var columnTitle = this.renderLocString(column.locTitle);
headers.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("th", { key: key, style: columnStyle }, columnTitle));
}
var rows = [];
var visibleRows = this.question.visibleRows;
for (var i = 0; i < visibleRows.length; i++) {
var row = visibleRows[i];
rows.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMatrixDynamicRow, { key: row.id, row: row, question: this.question, index: i, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode, creator: this.creator }));
}
var divStyle = this.question.horizontalScroll ? { overflowX: 'scroll' } : {};
var btnDeleteTD = !this.isDisplayMode ? __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", null) : null;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { style: divStyle },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("table", { className: cssClasses.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("thead", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tr", null,
headers,
btnDeleteTD)),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tbody", null, rows))),
this.renderAddRowButton(cssClasses)));
};
SurveyQuestionMatrixDynamic.prototype.renderAddRowButton = function (cssClasses) {
if (this.isDisplayMode || !this.question.canAddRow)
return null;
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { className: cssClasses.button, type: "button", onClick: this.handleOnRowAddClick, value: this.question.addRowText });
};
return SurveyQuestionMatrixDynamic;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
var SurveyQuestionMatrixDynamicRow = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionMatrixDynamicRow, _super);
function SurveyQuestionMatrixDynamicRow(props) {
var _this = _super.call(this, props) || this;
_this.setProperties(props);
return _this;
}
SurveyQuestionMatrixDynamicRow.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.setProperties(nextProps);
};
SurveyQuestionMatrixDynamicRow.prototype.setProperties = function (nextProps) {
this.row = nextProps.row;
this.question = nextProps.question;
this.index = nextProps.index;
this.creator = nextProps.creator;
this.handleOnRowRemoveClick = this.handleOnRowRemoveClick.bind(this);
};
SurveyQuestionMatrixDynamicRow.prototype.handleOnRowRemoveClick = function (event) {
this.question.removeRowUI(this.index);
};
SurveyQuestionMatrixDynamicRow.prototype.render = function () {
if (!this.row)
return null;
var tds = [];
for (var i = 0; i < this.row.cells.length; i++) {
var cell = this.row.cells[i];
var cellElement = __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_4__reactquestionmatrixdropdown__["c" /* SurveyQuestionMatrixDropdownCell */], { key: "row" + i, cssClasses: this.cssClasses, cell: cell, creator: this.creator });
tds.push(cellElement);
}
if (!this.isDisplayMode && this.question.canRemoveRow) {
var removeButton = this.renderButton();
tds.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", { key: "row" + this.row.cells.length + 1 }, removeButton));
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tr", null, tds));
};
SurveyQuestionMatrixDynamicRow.prototype.renderButton = function () {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { className: this.cssClasses.button, type: "button", onClick: this.handleOnRowRemoveClick, value: this.question.removeRowText });
};
return SurveyQuestionMatrixDynamicRow;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["c" /* ReactSurveyElement */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("matrixdynamic", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMatrixDynamic, props);
});
/***/ }),
/* 99 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__helpers__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionMultipleText; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionMultipleTextItem; });
var SurveyQuestionMultipleText = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionMultipleText, _super);
function SurveyQuestionMultipleText(props) {
var _this = _super.call(this, props) || this;
_this.state = { colCountChanged: 0 };
var self = _this;
_this.question.colCountChangedCallback = function () {
self.state.colCountChanged = self.state.colCountChanged + 1;
self.setState(self.state);
};
return _this;
}
Object.defineProperty(SurveyQuestionMultipleText.prototype, "question", {
get: function () { return this.questionBase; },
enumerable: true,
configurable: true
});
SurveyQuestionMultipleText.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
var tableRows = this.question.getRows();
var rows = [];
for (var i = 0; i < tableRows.length; i++) {
rows.push(this.renderRow(i, tableRows[i], cssClasses));
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("table", { className: cssClasses.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tbody", null, rows)));
};
SurveyQuestionMultipleText.prototype.renderRow = function (rowIndex, items, cssClasses) {
var key = 'item' + rowIndex;
var tds = [];
for (var i = 0; i < items.length; i++) {
var item = items[i];
var itemTitle = this.renderLocString(item.locTitle);
tds.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", { key: 'label' + i },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.itemTitle }, itemTitle)));
tds.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", { key: 'value' + i }, this.renderItem(item, rowIndex === 0 && i === 0, cssClasses)));
}
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tr", { key: key, className: cssClasses.row }, tds);
};
SurveyQuestionMultipleText.prototype.renderItem = function (item, isFirst, cssClasses) {
var inputId = isFirst ? this.question.inputId : null;
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMultipleTextItem, { item: item, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode });
};
return SurveyQuestionMultipleText;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
var SurveyQuestionMultipleTextItem = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionMultipleTextItem, _super);
function SurveyQuestionMultipleTextItem(props) {
var _this = _super.call(this, props) || this;
_this.item = props.item;
_this.state = { value: _this.getValue(_this.item.value) };
_this.handleOnChange = _this.handleOnChange.bind(_this);
_this.handleOnBlur = _this.handleOnBlur.bind(_this);
return _this;
}
SurveyQuestionMultipleTextItem.prototype.handleOnChange = function (event) {
this.setState({ value: event.target.value });
};
SurveyQuestionMultipleTextItem.prototype.handleOnBlur = function (event) {
this.item.value = event.target.value;
this.setState({ value: this.item.value });
};
SurveyQuestionMultipleTextItem.prototype.componentWillReceiveProps = function (nextProps) {
this.item = nextProps.item;
};
SurveyQuestionMultipleTextItem.prototype.componentDidMount = function () {
if (this.item) {
var self = this;
this.item.valueChangedCallback = function (newValue) {
self.setState({ value: this.getValue(newValue) });
};
}
};
SurveyQuestionMultipleTextItem.prototype.componentWillUnmount = function () {
if (this.item) {
this.item.valueChangedCallback = null;
}
};
SurveyQuestionMultipleTextItem.prototype.render = function () {
if (!this.item)
return null;
if (this.isDisplayMode)
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { id: this.item.id, className: this.cssClasses.itemValue }, this.item.value));
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { id: this.item.id, className: this.cssClasses.itemValue, type: this.item.inputType, value: this.state.value, placeholder: this.item.placeHolder, onBlur: this.handleOnBlur, onChange: this.handleOnChange, "aria-label": this.item.locTitle.renderedHtml }));
};
Object.defineProperty(SurveyQuestionMultipleTextItem.prototype, "mainClassName", {
get: function () { return ""; },
enumerable: true,
configurable: true
});
SurveyQuestionMultipleTextItem.prototype.getValue = function (val) {
if (__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isValueEmpty(val))
return "";
return val;
};
return SurveyQuestionMultipleTextItem;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["c" /* ReactSurveyElement */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("multipletext", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMultipleText, props);
});
/***/ }),
/* 100 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactpage__ = __webpack_require__(27);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__defaultCss_cssstandard__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionPanelDynamic; });
/* unused harmony export SurveyQuestionPanelDynamicItem */
var SurveyQuestionPanelDynamic = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionPanelDynamic, _super);
function SurveyQuestionPanelDynamic(props) {
var _this = _super.call(this, props) || this;
_this.setProperties(props);
return _this;
}
Object.defineProperty(SurveyQuestionPanelDynamic.prototype, "question", {
get: function () { return this.questionBase; },
enumerable: true,
configurable: true
});
SurveyQuestionPanelDynamic.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.setProperties(nextProps);
};
SurveyQuestionPanelDynamic.prototype.setProperties = function (nextProps) {
var self = this;
this.setState({ panelCounter: 0 });
this.question.panelCountChangedCallback = function () { self.updateQuestionRendering(); };
this.question.currentIndexChangedCallback = function () { self.updateQuestionRendering(); };
this.question.renderModeChangedCallback = function () { self.updateQuestionRendering(); };
this.handleOnPanelAddClick = this.handleOnPanelAddClick.bind(this);
this.handleOnPanelPrevClick = this.handleOnPanelPrevClick.bind(this);
this.handleOnPanelNextClick = this.handleOnPanelNextClick.bind(this);
this.handleOnRangeChange = this.handleOnRangeChange.bind(this);
};
SurveyQuestionPanelDynamic.prototype.updateQuestionRendering = function () {
this.state.panelCounter = this.state.panelCounter + 1;
this.setState(this.state);
};
SurveyQuestionPanelDynamic.prototype.handleOnPanelAddClick = function (event) {
this.question.addPanel();
};
SurveyQuestionPanelDynamic.prototype.handleOnPanelPrevClick = function (event) {
this.question.currentIndex--;
};
SurveyQuestionPanelDynamic.prototype.handleOnPanelNextClick = function (event) {
this.question.currentIndex++;
};
SurveyQuestionPanelDynamic.prototype.handleOnRangeChange = function (event) {
this.question.currentIndex = event.target.value;
};
SurveyQuestionPanelDynamic.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
var panels = [];
if (this.question.isRenderModeList) {
for (var i = 0; i < this.question.panels.length; i++) {
var panel = this.question.panels[i];
panels.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionPanelDynamicItem, { key: i, panel: panel, question: this.question, index: i, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode, creator: this.creator }));
}
}
else {
if (this.question.currentPanel != null) {
var panel = this.question.currentPanel;
panels.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionPanelDynamicItem, { key: this.question.currentIndex, panel: panel, question: this.question, index: this.question.currentIndex, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode, creator: this.creator }));
}
}
var btnDeleteTD = !this.isDisplayMode ? __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", null) : null;
var btnAdd = this.question.isRenderModeList ? this.renderAddRowButton(cssClasses, { marginTop: "5px" }) : null;
var navTop = this.question.isProgressTopShowing ? this.renderNavigator(cssClasses) : null;
var navBottom = this.question.isProgressBottomShowing ? this.renderNavigator(cssClasses) : null;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
navTop,
panels,
navBottom,
btnAdd));
};
SurveyQuestionPanelDynamic.prototype.renderNavigator = function (cssClasses) {
var style = { float: "left", margin: "5px" };
var range = this.question.isRangeShowing ? this.renderRange(style) : null;
var btnPrev = this.question.isPrevButtonShowing ? this.renderButton(this.question.panelPrevText, cssClasses, style, this.handleOnPanelPrevClick) : null;
var btnNext = this.question.isNextButtonShowing ? this.renderButton(this.question.panelNextText, cssClasses, style, this.handleOnPanelNextClick) : null;
var btnAdd = this.renderAddRowButton(cssClasses, style);
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
range,
btnPrev,
btnNext,
btnAdd);
};
SurveyQuestionPanelDynamic.prototype.renderRange = function (style) {
var updatedStyle = { width: "25%" }; //TODO 25%.
for (var attr in style)
updatedStyle[attr] = style[attr];
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { style: updatedStyle, type: "range", onChange: this.handleOnRangeChange, min: 0, max: this.question.panelCount - 1, value: this.question.currentIndex });
;
};
SurveyQuestionPanelDynamic.prototype.renderAddRowButton = function (cssClasses, style) {
if (!this.question.canAddPanel)
return null;
return this.renderButton(this.question.panelAddText, cssClasses, style, this.handleOnPanelAddClick);
};
SurveyQuestionPanelDynamic.prototype.renderButton = function (text, cssClasses, style, onClick) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { className: cssClasses.button, style: style, type: "button", onClick: onClick, value: text });
};
return SurveyQuestionPanelDynamic;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
var SurveyQuestionPanelDynamicItem = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionPanelDynamicItem, _super);
function SurveyQuestionPanelDynamicItem(props) {
var _this = _super.call(this, props) || this;
_this.setProperties(props);
return _this;
}
SurveyQuestionPanelDynamicItem.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.setProperties(nextProps);
};
SurveyQuestionPanelDynamicItem.prototype.setProperties = function (nextProps) {
this.panel = nextProps.panel;
this.question = nextProps.question;
this.index = nextProps.index;
this.creator = nextProps.creator;
this.handleOnPanelRemoveClick = this.handleOnPanelRemoveClick.bind(this);
};
SurveyQuestionPanelDynamicItem.prototype.handleOnPanelRemoveClick = function (event) {
this.question.removePanelUI(this.index);
};
SurveyQuestionPanelDynamicItem.prototype.render = function () {
if (!this.panel)
return null;
this.question.survey;
var panel = __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactpage__["c" /* SurveyPanel */], { key: this.index, panel: this.panel, css: __WEBPACK_IMPORTED_MODULE_4__defaultCss_cssstandard__["b" /* surveyCss */].getCss(), survey: this.question.survey, creator: this.creator });
var hr = this.question.isRenderModeList && (this.index < this.question.panelCount - 1) ? __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("hr", null) : null;
var removeButton = this.renderButton();
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
panel,
removeButton,
hr));
};
SurveyQuestionPanelDynamicItem.prototype.renderButton = function () {
if (!this.question.canRemovePanel)
return null;
var style = { marginTop: "5px" };
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { className: this.cssClasses.button, style: style, type: "button", onClick: this.handleOnPanelRemoveClick, value: this.question.panelRemoveText });
};
return SurveyQuestionPanelDynamicItem;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["c" /* ReactSurveyElement */]));
__WEBPACK_IMPORTED_MODULE_5__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("paneldynamic", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionPanelDynamic, props);
});
/***/ }),
/* 101 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__ = __webpack_require__(14);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionRadiogroup; });
var SurveyQuestionRadiogroup = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionRadiogroup, _super);
function SurveyQuestionRadiogroup(props) {
var _this = _super.call(this, props) || this;
_this.state = { choicesChanged: 0 };
var self = _this;
_this.question.choicesChangedCallback = function () {
self.state.choicesChanged = self.state.choicesChanged + 1;
self.setState(self.state);
};
_this.handleOnChange = _this.handleOnChange.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionRadiogroup.prototype, "question", {
get: function () { return this.questionBase; },
enumerable: true,
configurable: true
});
SurveyQuestionRadiogroup.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.handleOnChange = this.handleOnChange.bind(this);
};
SurveyQuestionRadiogroup.prototype.handleOnChange = function (event) {
this.question.value = event.target.value;
this.setState({ value: this.question.value });
};
SurveyQuestionRadiogroup.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("form", { className: cssClasses.root }, this.getItems(cssClasses)));
};
SurveyQuestionRadiogroup.prototype.getItems = function (cssClasses) {
var items = [];
for (var i = 0; i < this.question.visibleChoices.length; i++) {
var item = this.question.visibleChoices[i];
var key = "item" + i;
items.push(this.renderItem(key, item, i == 0, cssClasses));
}
return items;
};
Object.defineProperty(SurveyQuestionRadiogroup.prototype, "textStyle", {
get: function () { return { marginLeft: "3px", display: "inline", position: 'static' }; },
enumerable: true,
configurable: true
});
SurveyQuestionRadiogroup.prototype.renderItem = function (key, item, isFirst, cssClasses) {
var itemWidth = this.question.colCount > 0 ? (100 / this.question.colCount) + "%" : "";
var marginRight = this.question.colCount == 0 ? "5px" : "0px";
var divStyle = { marginRight: marginRight, marginLeft: '0px', display: 'inline-block' };
if (itemWidth) {
divStyle["width"] = itemWidth;
}
var isChecked = this.question.value == item.value;
var otherItem = (isChecked && item.value === this.question.otherItem.value) ? this.renderOther(cssClasses) : null;
return this.renderRadio(key, item, isChecked, divStyle, otherItem, isFirst, cssClasses);
};
SurveyQuestionRadiogroup.prototype.renderRadio = function (key, item, isChecked, divStyle, otherItem, isFirst, cssClasses) {
var id = isFirst ? this.question.inputId : null;
var itemText = this.renderLocString(item.locText, this.textStyle);
var itemClass = cssClasses.item + (this.question.colCount === 0 ? " sv_q_radiogroup_inline" : "");
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { key: key, className: itemClass, style: divStyle },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("label", { className: cssClasses.label },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { id: id, type: "radio", name: this.question.name + "_" + this.questionBase.id, checked: isChecked, value: item.value, disabled: this.isDisplayMode, onChange: this.handleOnChange, "aria-label": this.question.locTitle.renderedHtml }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: "circle" }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: "check" }),
itemText),
otherItem));
};
SurveyQuestionRadiogroup.prototype.renderOther = function (cssClasses) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.other },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__["a" /* SurveyQuestionCommentItem */], { question: this.question, otherCss: cssClasses.other, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode })));
};
return SurveyQuestionRadiogroup;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("radiogroup", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionRadiogroup, props);
});
/***/ }),
/* 102 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__ = __webpack_require__(14);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionRating; });
var SurveyQuestionRating = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionRating, _super);
function SurveyQuestionRating(props) {
var _this = _super.call(this, props) || this;
_this.handleOnChange = _this.handleOnChange.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionRating.prototype, "question", {
get: function () { return this.questionBase; },
enumerable: true,
configurable: true
});
SurveyQuestionRating.prototype.handleOnChange = function (event) {
this.question.value = event.target.value;
this.setState({ value: this.question.value });
};
SurveyQuestionRating.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
var values = [];
var minText = this.question.minRateDescription ? this.renderLocString(this.question.locMinRateDescription) : null;
var maxText = this.question.maxRateDescription ? this.renderLocString(this.question.locMaxRateDescription) : null;
for (var i = 0; i < this.question.visibleRateValues.length; i++) {
var minTextValue = i == 0 ? minText : null;
var maxTextValue = i == this.question.visibleRateValues.length - 1 ? maxText : null;
values.push(this.renderItem("value" + i, this.question.visibleRateValues[i], minTextValue, maxTextValue, cssClasses));
}
var comment = this.question.hasOther ? this.renderOther(cssClasses) : null;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.root },
values,
comment));
};
SurveyQuestionRating.prototype.renderItem = function (key, item, minText, maxText, cssClasses) {
var isChecked = this.question.value == item.value;
var className = cssClasses.item;
if (isChecked)
className += " " + cssClasses.selected;
var itemText = this.renderLocString(item.locText);
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("label", { key: key, className: className },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { type: "radio", style: { display: "none" }, name: this.question.name, value: item.value, disabled: this.isDisplayMode, checked: this.question.value == item.value, onChange: this.handleOnChange, "aria-label": item.locText.text }),
minText,
itemText,
maxText);
};
SurveyQuestionRating.prototype.renderOther = function (cssClasses) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.other },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__["a" /* SurveyQuestionCommentItem */], { question: this.question, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode })));
};
return SurveyQuestionRating;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("rating", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionRating, props);
});
/***/ }),
/* 103 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helpers__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionelement__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionText; });
var SurveyQuestionText = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyQuestionText, _super);
function SurveyQuestionText(props) {
var _this = _super.call(this, props) || this;
_this.state = { value: _this.getValue(_this.question.value) };
_this.handleOnChange = _this.handleOnChange.bind(_this);
_this.handleOnBlur = _this.handleOnBlur.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionText.prototype, "question", {
get: function () { return this.questionBase; },
enumerable: true,
configurable: true
});
SurveyQuestionText.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.setState({ value: this.getValue(this.question.value) });
};
SurveyQuestionText.prototype.handleOnChange = function (event) {
this.setState({ value: this.getValue(event.target.value) });
};
SurveyQuestionText.prototype.handleOnBlur = function (event) {
this.question.value = event.target.value;
this.setState({ value: this.getValue(this.question.value) });
};
SurveyQuestionText.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
if (this.isDisplayMode)
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { id: this.question.inputId, className: cssClasses.root }, this.question.value));
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { id: this.question.inputId, className: cssClasses.root, type: this.question.inputType, value: this.state.value, size: this.question.size, placeholder: this.question.placeHolder, onBlur: this.handleOnBlur, onChange: this.handleOnChange, "aria-label": this.question.locTitle.renderedHtml }));
};
SurveyQuestionText.prototype.getValue = function (val) {
if (__WEBPACK_IMPORTED_MODULE_2__helpers__["a" /* Helpers */].isValueEmpty(val))
return "";
return val;
};
return SurveyQuestionText;
}(__WEBPACK_IMPORTED_MODULE_3__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("text", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionText, props);
});
/***/ }),
/* 104 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return StylesManager; });
var StylesManager = (function () {
function StylesManager() {
this.sheet = null;
this.sheet = this.findSheet();
if (!this.sheet) {
this.sheet = this.createSheet();
this.initializeStyles();
}
}
StylesManager.prototype.findSheet = function () {
for (var i = 0; i < document.styleSheets.length; i++) {
if (document.styleSheets[i].ownerNode['id'] === StylesManager.SurveyJSStylesSheetId) {
return document.styleSheets[i];
}
}
return null;
};
StylesManager.prototype.createSheet = function () {
var style = document.createElement('style');
style.id = StylesManager.SurveyJSStylesSheetId;
// Add a media (and/or media query) here if you'd like!
// style.setAttribute("media", "screen")
// style.setAttribute("media", "only screen and (max-width : 1024px)")
style.appendChild(document.createTextNode(''));
document.head.appendChild(style);
return style.sheet;
};
StylesManager.prototype.initializeStyles = function () {
var _this = this;
Object.keys(StylesManager.Styles).forEach(function (selector) {
return _this.sheet.insertRule(selector + '{ ' + StylesManager.Styles[selector] + ' }', 0);
});
};
return StylesManager;
}());
StylesManager.SurveyJSStylesSheetId = "surveyjs";
StylesManager.Styles = {
'.sv_qstn': 'display: inline-block; vertical-align: top;',
'.sv_p_container': 'display: inline-block; vertical-align: top;',
'.sv_qbln .checkbox-material': 'margin-right: 3px;',
'.sv_qcbx .checkbox-material': 'margin-right: 5px;',
'.sv_qcbx .checkbox label': 'justify-content: left;',
'.sv_qstn .radio label': 'justify-content: left;',
'.sv_qstn label.sv_q_m_label': 'position: absolute; margin: 0;',
'.sv_q_mt_item_value': 'float: left;',
'.sv_qstn .title-left': 'float: left; margin-right: 15px;',
'.sv_qstn .title-left h5': 'margin-top: 4px;',
'.sv_qstn .content-left': 'overflow: hidden',
'.sv_q_radiogroup_inline .sv_q_radiogroup_other': 'display: inline-block; height: 20px; margin-top: -5px;',
'.sv_q_checkbox_inline .sv_q_checkbox_other': 'display: inline-block; height: 20px; margin-top: -5px;'
};
/***/ }),
/* 105 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(3);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return Trigger; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyTrigger; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return SurveyTriggerVisible; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyTriggerComplete; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return SurveyTriggerSetValue; });
/**
* A base class for all triggers.
* A trigger calls a method when the expression change the result: from false to true or from true to false.
* Please note, it runs only one changing the expression result.
*/
var Trigger = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](Trigger, _super);
function Trigger() {
var _this = _super.call(this) || this;
_this.opValue = "equal";
return _this;
}
Object.defineProperty(Trigger, "operators", {
get: function () {
if (Trigger.operatorsValue != null)
return Trigger.operatorsValue;
Trigger.operatorsValue = {
empty: function (value, expectedValue) { return !value; },
notempty: function (value, expectedValue) { return !(!value); },
equal: function (value, expectedValue) { return value == expectedValue; },
notequal: function (value, expectedValue) { return value != expectedValue; },
contains: function (value, expectedValue) { return value && value["indexOf"] && value.indexOf(expectedValue) > -1; },
notcontains: function (value, expectedValue) { return !value || !value["indexOf"] || value.indexOf(expectedValue) == -1; },
greater: function (value, expectedValue) { return value > expectedValue; },
less: function (value, expectedValue) { return value < expectedValue; },
greaterorequal: function (value, expectedValue) { return value >= expectedValue; },
lessorequal: function (value, expectedValue) { return value <= expectedValue; }
};
return Trigger.operatorsValue;
},
enumerable: true,
configurable: true
});
Trigger.prototype.getType = function () { return "triggerbase"; };
Object.defineProperty(Trigger.prototype, "operator", {
get: function () { return this.opValue; },
set: function (value) {
if (!value)
return;
value = value.toLowerCase();
if (!Trigger.operators[value])
return;
this.opValue = value;
},
enumerable: true,
configurable: true
});
Trigger.prototype.check = function (value) {
if (Trigger.operators[this.operator](value, this.value)) {
this.onSuccess();
}
else {
this.onFailure();
}
};
Trigger.prototype.onSuccess = function () { };
Trigger.prototype.onFailure = function () { };
return Trigger;
}(__WEBPACK_IMPORTED_MODULE_1__base__["c" /* Base */]));
Trigger.operatorsValue = null;
/**
* It extends the Trigger base class and add properties required for SurveyJS classes.
*/
var SurveyTrigger = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyTrigger, _super);
function SurveyTrigger() {
var _this = _super.call(this) || this;
_this.owner = null;
return _this;
}
SurveyTrigger.prototype.setOwner = function (owner) {
this.owner = owner;
};
Object.defineProperty(SurveyTrigger.prototype, "isOnNextPage", {
get: function () { return false; },
enumerable: true,
configurable: true
});
return SurveyTrigger;
}(Trigger));
/**
* If expression returns true, it makes questions/pages visible.
* Ohterwise it makes them invisible.
*/
var SurveyTriggerVisible = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyTriggerVisible, _super);
function SurveyTriggerVisible() {
var _this = _super.call(this) || this;
_this.pages = [];
_this.questions = [];
return _this;
}
SurveyTriggerVisible.prototype.getType = function () { return "visibletrigger"; };
SurveyTriggerVisible.prototype.onSuccess = function () { this.onTrigger(this.onItemSuccess); };
SurveyTriggerVisible.prototype.onFailure = function () { this.onTrigger(this.onItemFailure); };
SurveyTriggerVisible.prototype.onTrigger = function (func) {
if (!this.owner)
return;
var objects = this.owner.getObjects(this.pages, this.questions);
for (var i = 0; i < objects.length; i++) {
func(objects[i]);
}
};
SurveyTriggerVisible.prototype.onItemSuccess = function (item) { item.visible = true; };
SurveyTriggerVisible.prototype.onItemFailure = function (item) { item.visible = false; };
return SurveyTriggerVisible;
}(SurveyTrigger));
/**
* If expression returns true, it completes the survey.
*/
var SurveyTriggerComplete = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyTriggerComplete, _super);
function SurveyTriggerComplete() {
return _super.call(this) || this;
}
SurveyTriggerComplete.prototype.getType = function () { return "completetrigger"; };
Object.defineProperty(SurveyTriggerComplete.prototype, "isOnNextPage", {
get: function () { return true; },
enumerable: true,
configurable: true
});
SurveyTriggerComplete.prototype.onSuccess = function () { if (this.owner)
this.owner.doComplete(); };
return SurveyTriggerComplete;
}(SurveyTrigger));
var SurveyTriggerSetValue = (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyTriggerSetValue, _super);
function SurveyTriggerSetValue() {
return _super.call(this) || this;
}
SurveyTriggerSetValue.prototype.getType = function () { return "setvaluetrigger"; };
SurveyTriggerSetValue.prototype.onSuccess = function () {
if (!this.setToName || !this.owner)
return;
this.owner.setTriggerValue(this.setToName, this.setValue, this.isVariable);
};
return SurveyTriggerSetValue;
}(SurveyTrigger));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("trigger", ["operator", "!value"]);
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("surveytrigger", ["!name"], null, "trigger");
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("visibletrigger", ["pages", "questions"], function () { return new SurveyTriggerVisible(); }, "surveytrigger");
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("completetrigger", [], function () { return new SurveyTriggerComplete(); }, "surveytrigger");
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("setvaluetrigger", ["!setToName", "setValue", "isVariable:boolean"], function () { return new SurveyTriggerSetValue(); }, "surveytrigger");
/***/ }),
/* 106 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return browser; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return compareVersions; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return isMobile; });
var webkitRegExp = /(webkit)[ \/]([\w.]+)/, ieRegExp = /(msie) (\d{1,2}\.\d)/, ie11RegExp = /(trident).*rv:(\d{1,2}\.\d)/, msEdge = /(edge)\/((\d+)?[\w\.]+)/, mozillaRegExp = /(mozilla)(?:.*? rv:([\w.]+))/;
var browserFromUA = function (ua) {
ua = ua.toLowerCase();
var result = {}, matches = ieRegExp.exec(ua) || ie11RegExp.exec(ua) || msEdge.exec(ua) || ua.indexOf("compatible") < 0 && mozillaRegExp.exec(ua) || webkitRegExp.exec(ua) || [], browserName = matches[1], browserVersion = matches[2];
if (browserName === "trident" || browserName === "edge") {
browserName = "msie";
}
else if (browserName === "mozilla") {
browserName = "firefox";
}
if (browserName) {
result[browserName] = true;
result.version = browserVersion;
}
return result;
};
var browser = browserFromUA(navigator.userAgent);
function compareVersions(a, b) {
var i, diff;
var regExStrip0 = /(\.0+)+$/;
var segmentsA = a.replace(regExStrip0, '').split('.');
var segmentsB = b.replace(regExStrip0, '').split('.');
var l = Math.min(segmentsA.length, segmentsB.length);
for (i = 0; i < l; i++) {
diff = parseInt(segmentsA[i], 10) - parseInt(segmentsB[i], 10);
if (diff) {
return diff;
}
}
return segmentsA.length - segmentsB.length;
}
function isMobile() {
return (typeof window.orientation !== 'undefined');
}
/***/ }),
/* 107 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_react_dom__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_react_dom___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react_dom__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__survey__ = __webpack_require__(18);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__react_reactSurvey__ = __webpack_require__(20);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__react_reactSurveyWindow__ = __webpack_require__(30);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_jquery__ = __webpack_require__(44);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_jquery__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__react__ = __webpack_require__(43);
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "__assign", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["a"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "__extends", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["b"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "__decorate", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["c"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "defaultStandardCss", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["d"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "defaultBootstrapCss", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["e"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "defaultBootstrapMaterialCss", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["f"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Survey", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["g"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ReactSurveyModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["h"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ReactWindowModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["i"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Model", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["j"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "WindowModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["k"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyNavigationBase", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["l"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTimerPanel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["m"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyNavigation", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["n"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyPage", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["o"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyRow", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["p"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestion", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["q"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionErrors", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["r"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyElementBase", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["s"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionElementBase", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["t"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionCommentItem", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["u"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionComment", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["v"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionCheckbox", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["w"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionCheckboxItem", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["x"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionDropdown", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["y"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMatrixDropdown", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["z"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMatrixDropdownRow", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["A"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMatrix", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["B"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMatrixRow", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["C"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionHtml", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["D"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionFile", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["E"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMultipleText", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["F"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMultipleTextItem", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["G"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionRadiogroup", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["H"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionText", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["I"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionBoolean", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["J"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionEmpty", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["K"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMatrixDynamic", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["L"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMatrixDynamicRow", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["M"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionPanelDynamic", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["N"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyProgress", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["O"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionRating", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["P"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionExpression", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["Q"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyWindow", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["R"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ReactQuestionFactory", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["S"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Version", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["T"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Helpers", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["U"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "AnswerCountValidator", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["V"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "EmailValidator", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["W"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "NumericValidator", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["X"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "RegexValidator", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["Y"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyValidator", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["Z"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "TextValidator", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_0"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ValidatorResult", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_1"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ValidatorRunner", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_2"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ItemValue", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_3"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Base", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_4"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Event", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_5"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyError", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_6"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "LocalizableString", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_7"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ChoicesRestfull", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_8"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "FunctionFactory", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_9"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Condition", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_10"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ConditionNode", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_11"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ConditionRunner", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_12"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ConditionsParser", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_13"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ProcessValue", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_14"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "CustomError", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_15"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ExceedSizeError", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_16"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "RequreNumericError", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_17"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonError", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_18"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonIncorrectTypeError", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_19"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMetadata", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_20"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMetadataClass", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_21"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMissingTypeError", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_22"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMissingTypeErrorBase", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_23"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonObject", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_24"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonObjectProperty", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_25"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonRequiredPropertyError", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_26"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonUnknownPropertyError", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_27"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownCell", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_28"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownColumn", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_29"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownRowModelBase", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_30"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdownModelBase", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_31"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownRowModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_32"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdownModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_33"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDynamicRowModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_34"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDynamicModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_35"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixRowModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_36"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_37"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MultipleTextItemModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_38"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMultipleTextModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_39"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "PanelModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_40"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "PanelModelBase", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_41"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRowModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_42"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "PageModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_43"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Question", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_44"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionBase", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_45"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionEmptyModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_46"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckboxBase", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_47"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionSelectBase", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_48"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckboxModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_49"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCommentModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_50"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionDropdownModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_51"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionFactory", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_52"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ElementFactory", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_53"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionFileModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_54"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionHtmlModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_55"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRadiogroupModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_56"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRatingModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_57"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionExpressionModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_58"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionTextModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_59"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionBooleanModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_60"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionPanelDynamicModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_61"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionPanelDynamicItem", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_62"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTimer", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_63"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_64"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTrigger", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_65"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerComplete", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_66"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerSetValue", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_67"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerVisible", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_68"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Trigger", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_69"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyWindowModel", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_70"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "TextPreProcessor", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_71"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "dxSurveyService", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_72"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "surveyLocalization", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_73"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "surveyStrings", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_74"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCustomWidget", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_75"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "CustomWidgetCollection", function() { return __WEBPACK_IMPORTED_MODULE_7__react__["_76"]; });
__WEBPACK_IMPORTED_MODULE_6_jquery___default.a["fn"].extend({
Survey: function (props) {
this.each(function () {
__WEBPACK_IMPORTED_MODULE_2_react_dom__["render"]((__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_4__react_reactSurvey__["a" /* Survey */], __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __assign */]({}, props))), this);
});
},
SurveyWindow: function (props) {
this.each(function () {
__WEBPACK_IMPORTED_MODULE_2_react_dom__["render"]((__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_5__react_reactSurveyWindow__["a" /* SurveyWindow */], __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __assign */]({}, props))), this);
});
}
});
__WEBPACK_IMPORTED_MODULE_3__survey__["a" /* SurveyModel */].platform = "jquery";
/***/ })
/******/ ]);
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBhNWU1ZDFhY2U3OThkNTNiM2NhZSIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9jaHVua3MvaGVscGVycy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc3VydmV5U3RyaW5ncy50cyIsIndlYnBhY2s6Ly8vLi9+L3ByZWFjdC1jb21wYXQvc3JjL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9qc29ub2JqZWN0LnRzIiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uZWxlbWVudC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uZmFjdG9yeS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmZhY3RvcnkudHN4Iiwid2VicGFjazovLy8uL3NyYy9iYXNlLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZXJyb3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2l0ZW12YWx1ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZGVmYXVsdENzcy9jc3NzdGFuZGFyZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29uZGl0aW9ucy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvaGVscGVycy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmNvbW1lbnQudHN4Iiwid2VicGFjazovLy8uL3NyYy9jb25kaXRpb25Qcm9jZXNzVmFsdWUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX2Jhc2VzZWxlY3QudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RleHRQcmVQcm9jZXNzb3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N1cnZleS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RzdXJ2ZXltb2RlbC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0U3VydmV5LnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvY2hvaWNlc1Jlc3RmdWxsLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YWJsZXN0cmluZy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGFuZWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25iYXNlLnRzIiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdFN1cnZleU5hdmlnYXRpb25CYXNlLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RwYWdlLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbi50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3ZhbGlkYXRvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RTdXJ2ZXlXaW5kb3cudHN4Iiwid2VicGFjazovLy8uL3NyYy9jb25kaXRpb25zUGFyc2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9keFN1cnZleVNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Z1bmN0aW9uc2ZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BhZ2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uQ3VzdG9tV2lkZ2V0cy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvY3VzdG9tLXdpZGdldC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0U3VydmV5TmF2aWdhdGlvbi50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0U3VydmV5UHJvZ3Jlc3MudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ubWF0cml4ZHJvcGRvd24udHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHRpbWVycGFuZWwudHN4Iiwid2VicGFjazovLy8uL3NyYy9zdXJ2ZXlXaW5kb3cudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N1cnZleXRpbWVyLnRzIiwid2VicGFjazovLy8uL3NyYy9lbnRyaWVzL3JlYWN0LnRzIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJyb290XCI6XCJqUXVlcnlcIixcImNvbW1vbmpzMlwiOlwianF1ZXJ5XCIsXCJjb21tb25qc1wiOlwianF1ZXJ5XCIsXCJhbWRcIjpcImpxdWVyeVwifSIsIndlYnBhY2s6Ly8vLi9zcmMvbWFpbi5zY3NzIiwid2VicGFjazovLy8uL34vcHJlYWN0L2Rpc3QvcHJlYWN0LmpzIiwid2VicGFjazovLy8uL34vcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL34vcHJvcHR5cGVzL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9kZWZhdWx0Q3NzL2Nzc2Jvb3RzdHJhcC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZGVmYXVsdENzcy9jc3Nib290c3RyYXBtYXRlcmlhbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9jaHVua3MvbG9jYWxpemF0aW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9lbnRyaWVzL2NodW5rcy9tb2RlbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2FyYWJpYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2N6ZWNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZGFuaXNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZHV0Y2gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9maW5uaXNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZnJlbmNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZ2VybWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZ3JlZWsudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9odW5nYXJpYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9pY2VsYW5kaWMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9pdGFsaWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vbGF0dmlhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3BlcnNpYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9wb2xpc2gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9wb3J0dWd1ZXNlLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vcm9tYW5pYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9ydXNzaWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vc2ltcGxpZmllZC1jaGluZXNlLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vc3BhbmlzaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3N3ZWRpc2gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi90dXJraXNoLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9ib29sZWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9jaGVja2JveC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fY29tbWVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fZHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX2VtcHR5LnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9leHByZXNzaW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9maWxlLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9odG1sLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9tYXRyaXgudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9tYXRyaXhkeW5hbWljLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9tdWx0aXBsZXRleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX3BhbmVsZHluYW1pYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fcmFkaW9ncm91cC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fcmF0aW5nLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl90ZXh0LnRzIiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uYm9vbGVhbi50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25jaGVja2JveC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25kcm9wZG93bi50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25lbXB0eS50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25leHByZXNzaW9uLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmZpbGUudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uaHRtbC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25tYXRyaXgudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ubWF0cml4ZHluYW1pYy50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25tdWx0aXBsZXRleHQudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ucGFuZWxkeW5hbWljLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbnJhZGlvZ3JvdXAudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ucmF0aW5nLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbnRleHQudHN4Iiwid2VicGFjazovLy8uL3NyYy9zdHlsZXNtYW5hZ2VyLnRzIiwid2VicGFjazovLy8uL3NyYy90cmlnZ2VyLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9qcXVlcnkudHN4Il0sIm5hbWVzIjpbInZlcnNpb24iLCJFTEVNRU5UUyIsInNwbGl0IiwiUkVBQ1RfRUxFTUVOVF9UWVBFIiwiU3ltYm9sIiwiZm9yIiwiQ09NUE9ORU5UX1dSQVBQRVJfS0VZIiwiQVVUT0JJTkRfQkxBQ0tMSVNUIiwiY29uc3RydWN0b3IiLCJyZW5kZXIiLCJzaG91bGRDb21wb25lbnRVcGRhdGUiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50V2lsbFVwZGF0ZSIsImNvbXBvbmVudERpZFVwZGF0ZSIsImNvbXBvbmVudFdpbGxNb3VudCIsImNvbXBvbmVudERpZE1vdW50IiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJjb21wb25lbnREaWRVbm1vdW50IiwiQ0FNRUxfUFJPUFMiLCJCWVBBU1NfSE9PSyIsIkRFViIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsIkVtcHR5Q29tcG9uZW50IiwiVk5vZGUiLCJwcm90b3R5cGUiLCIkJHR5cGVvZiIsInByZWFjdENvbXBhdFVwZ3JhZGVkIiwicHJlYWN0Q29tcGF0Tm9ybWFsaXplZCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0Iiwibm9kZU5hbWUiLCJzZXQiLCJ2IiwiY29uZmlndXJhYmxlIiwiYXR0cmlidXRlcyIsIm9sZEV2ZW50SG9vayIsImV2ZW50IiwiZSIsInBlcnNpc3QiLCJuYXRpdmVFdmVudCIsIm9sZFZub2RlSG9vayIsInZub2RlIiwidGFnIiwiYXR0cnMiLCJjaGlsZHJlbiIsImxlbmd0aCIsInVuZGVmaW5lZCIsIm5vcm1hbGl6ZVZOb2RlIiwiaGFuZGxlQ29tcG9uZW50Vk5vZGUiLCJkZWZhdWx0VmFsdWUiLCJ2YWx1ZSIsImhhbmRsZUVsZW1lbnRWTm9kZSIsImEiLCJkZWZhdWx0UHJvcHMiLCJleHRlbmQiLCJzaG91bGRTYW5pdGl6ZSIsImkiLCJ0ZXN0IiwiaGFzT3duUHJvcGVydHkiLCJyZXBsYWNlIiwidG9Mb3dlckNhc2UiLCJwYXJlbnQiLCJjYWxsYmFjayIsInByZXYiLCJfcHJlYWN0Q29tcGF0UmVuZGVyZWQiLCJwYXJlbnROb2RlIiwiY2hpbGROb2RlcyIsInJlbW92ZUNoaWxkIiwib3V0IiwiX2NvbXBvbmVudCIsImJhc2UiLCJDb250ZXh0UHJvdmlkZXIiLCJwcm9wcyIsImNvbnRleHQiLCJyZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciIsInBhcmVudENvbXBvbmVudCIsImNvbnRhaW5lciIsIndyYXAiLCJjIiwidW5tb3VudENvbXBvbmVudEF0Tm9kZSIsImV4aXN0aW5nIiwiQVJSIiwiQ2hpbGRyZW4iLCJtYXAiLCJmbiIsImN0eCIsInRvQXJyYXkiLCJiaW5kIiwiZm9yRWFjaCIsImNvdW50Iiwib25seSIsIkVycm9yIiwiQXJyYXkiLCJpc0FycmF5IiwiY29uY2F0IiwiY3VycmVudENvbXBvbmVudCIsImNyZWF0ZUZhY3RvcnkiLCJ0eXBlIiwiY3JlYXRlRWxlbWVudCIsIkRPTSIsInVwZ3JhZGVUb1ZOb2RlcyIsImFyciIsIm9mZnNldCIsIm9iaiIsImlzVmFsaWRFbGVtZW50IiwiaXNTdGF0ZWxlc3NDb21wb25lbnQiLCJ3cmFwU3RhdGVsZXNzQ29tcG9uZW50IiwiV3JhcHBlZENvbXBvbmVudCIsImNyZWF0ZUNsYXNzIiwiZGlzcGxheU5hbWUiLCJuYW1lIiwic3RhdGVsZXNzQ29tcG9uZW50SG9vayIsIkN0b3IiLCJXcmFwcGVkIiwicHJvcFR5cGVzIiwiYXJncyIsImFwcGx5Q2xhc3NOYW1lIiwicmVmIiwiY3JlYXRlU3RyaW5nUmVmUHJveHkiLCJhcHBseUV2ZW50Tm9ybWFsaXphdGlvbiIsImNsb25lRWxlbWVudCIsImVsZW1lbnQiLCJlbGVtZW50UHJvcHMiLCJub2RlIiwiY29tcG9uZW50IiwiX3JlZlByb3hpZXMiLCJyZWZzIiwicmVzb2x2ZWQiLCJvbmRvdWJsZWNsaWNrIiwib25kYmxjbGljayIsIm9uY2hhbmdlIiwibm9ybWFsaXplZCIsIm9uaW5wdXQiLCJtdWx0aWhvb2siLCJjbCIsImNsYXNzTmFtZSIsImNsYXNzIiwia2V5Iiwic2hhbGxvd0RpZmZlcnMiLCJiIiwiZmluZERPTU5vZGUiLCJGIiwiYmluZEFsbCIsIkNvbXBvbmVudCIsImNhbGwiLCJuZXdDb21wb25lbnRIb29rIiwibWl4aW5zIiwiYXBwbHlNaXhpbnMiLCJjb2xsYXRlTWl4aW5zIiwic3RhdGljcyIsImdldERlZmF1bHRQcm9wcyIsImtleWVkIiwibWl4aW4iLCJwdXNoIiwicHJvdG8iLCJfX2JvdW5kIiwiY2FsbE1ldGhvZCIsIm0iLCJhcHBseSIsImhvb2tzIiwic2tpcER1cGxpY2F0ZXMiLCJyZXQiLCJyIiwiYXJndW1lbnRzIiwicHJvcHNIb29rIiwiYmVmb3JlUmVuZGVyIiwiYWZ0ZXJSZW5kZXIiLCJjdG9yIiwicHJvcCIsImVyciIsImNvbnNvbGUiLCJlcnJvciIsIm1lc3NhZ2UiLCJvcHRzIiwic3RhdGUiLCJnZXRJbml0aWFsU3RhdGUiLCJpc1JlYWN0Q29tcG9uZW50IiwicmVwbGFjZVN0YXRlIiwic2V0U3RhdGUiLCJnZXRET01Ob2RlIiwiaXNNb3VudGVkIiwiUHVyZUNvbXBvbmVudCIsIlByb3BUeXBlcyIsInVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1EQUEyQyxjQUFjOztBQUV6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7O0FDaEVPLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxVQUFVLE1BQU07SUFDdEQsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDbEQsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUNELE1BQU0sQ0FBQyxNQUFNLENBQUM7QUFDbEIsQ0FBQyxDQUFDO0FBRUksbUJBQW9CLFNBQVMsRUFBRSxTQUFTO0lBQzFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQztRQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLGdCQUFnQixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsU0FBUyxDQUFDLFNBQVMsR0FBRyxTQUFTLEtBQUssSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3pILENBQUM7QUFBQSxDQUFDO0FBSUssSUFBSSxVQUFVLEdBQUcsVUFBVSxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJO0lBQzNELElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM3SCxFQUFFLENBQUMsQ0FBQyxPQUFPLE9BQU8sS0FBSyxRQUFRLElBQUksT0FBTyxPQUFPLENBQUMsUUFBUSxLQUFLLFVBQVUsQ0FBQztRQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQy9ILElBQUk7UUFBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENB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QUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUNsRCxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQzNDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztZQUNsQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDcEMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDN0QsQ0FBQztZQUNELEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ2xELENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNKLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLENBQUM7SUFDTCxDQUFDO0lBQ1MsK0JBQVUsR0FBcEIsVUFBcUIsS0FBVSxFQUFFLEdBQVEsRUFBRSxHQUFRLEVBQUUsUUFBNEI7UUFDN0UsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUMxQixFQUFFLENBQUMsQ0FBQyxRQUFRLElBQUksSUFBSSxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDaEQsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sQ0FBQztRQUNYLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxNQUFNLENBQUM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDaEQsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BDLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzFCLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLEVBQUUsRUFBQyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDbEIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3hDLENBQUM7WUFDRCxJQUFJLENBQUMsQ0FBQztnQkFDRixHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUMvQixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFDTyxpQ0FBWSxHQUFwQixVQUFxQixLQUFVLElBQWEsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzRSxpQ0FBWSxHQUFwQixVQUFxQixLQUFVLEVBQUUsUUFBNEI7UUFDekQsSUFBSSxNQUFNLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMzQyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbkQsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksUUFBUSxJQUFJLElBQUksSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN2RCxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsU0FBUyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNoRixNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdEYsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBQ08sMkNBQXNCLEdBQTlCLFVBQStCLE1BQVcsRUFBRSxLQUFVLEVBQUUsUUFBNEIsRUFBRSxTQUFpQjtRQUNuRyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDakIsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNULElBQUksa0JBQWtCLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5RSxFQUFFLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ2pELEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNoQyxLQUFLLEdBQUcsSUFBSSx5QkFBeUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQzt3QkFDeEUsS0FBSyxDQUFDO29CQUNWLENBQUM7Z0JBQ0wsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDekIsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUNiLEtBQUssR0FBRyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUM1RSxDQUFDO2dCQUFDLElBQUksQ0FBQyxDQUFDO29CQUNKLEtBQUssR0FBRyxJQUFJLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUM5RSxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ1IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUNPLGdDQUFXLEdBQW5CLFVBQW9CLEtBQWdCLEVBQUUsT0FBWTtRQUM5QyxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RCxLQUFLLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDOUQsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFDTyxpQ0FBWSxHQUFwQixVQUFxQixLQUFpQixFQUFFLEdBQVEsRUFBRSxHQUFRLEVBQUUsUUFBNEI7UUFDcEYsRUFBRSxFQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRSxFQUFFLEVBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzVCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3JELEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDSixFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUNsQixHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBQ08saUNBQVksR0FBcEIsVUFBcUIsVUFBcUMsRUFBRSxHQUFRO1FBQ2hFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUM3QixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6QyxJQUFJLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxHQUFHLENBQUM7Z0JBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNyRSxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ0wsaUJBQUM7QUFBRCxDQUFDOztBQTNKa0IsMkJBQWdCLEdBQUcsTUFBTSxDQUFDO0FBQzFCLCtCQUFvQixHQUFHLEtBQUssQ0FBQztBQUM3Qix3QkFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQzVldkI7QUFNL0I7SUFBdUMsb0ZBQXlCO0lBUzVELDJCQUFZLEtBQVU7UUFBdEIsWUFDSSxrQkFBTSxLQUFLLENBQUMsU0FFZjtRQURHLEtBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUM7O0lBQ3RELENBQUM7SUFYYSxpQ0FBZSxHQUE3QixVQUE4QixNQUF5QixFQUFFLEtBQWlCO1FBQWpCLG9DQUFpQjtRQUN0RSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNqQixJQUFJLFNBQVMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDaEQsTUFBTSxDQUFDLCtEQUFNLEtBQUssRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxHQUFJLENBQUM7UUFDdEUsQ0FBQztRQUNELE1BQU0sQ0FBQywrREFBTSxLQUFLLEVBQUUsS0FBSyxJQUFHLE1BQU0sQ0FBQyxZQUFZLENBQVEsQ0FBQztJQUM1RCxDQUFDO0lBTUQscURBQXlCLEdBQXpCLFVBQTBCLFNBQWM7UUFDcEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQztJQUMxRCxDQUFDO0lBQ1MsMkNBQWUsR0FBekIsVUFBMEIsTUFBeUIsRUFBRSxLQUFpQjtRQUFqQixvQ0FBaUI7UUFDbEUsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUNMLHdCQUFDO0FBQUQsQ0FBQyxDQW5Cc0MsZ0RBQWUsR0FtQnJEOztBQUVEO0lBQXdDLHFGQUFpQjtJQUVyRCw0QkFBWSxLQUFVO1FBQXRCLFlBQ0ksa0JBQU0sS0FBSyxDQUFDLFNBRWY7UUFERyxLQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7O0lBQ3ZDLENBQUM7SUFDRCxzREFBeUIsR0FBekIsVUFBMEIsU0FBYztRQUNwQyxpQkFBTSx5QkFBeUIsWUFBQyxTQUFTLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUM7SUFDM0MsQ0FBQztJQUNMLHlCQUFDO0FBQUQsQ0FBQyxDQVZ1QyxpQkFBaUIsR0FVeEQ7O0FBRUQ7SUFBK0MsNEZBQWlCO0lBRzVELG1DQUFZLEtBQVU7UUFBdEIsWUFDSSxrQkFBTSxLQUFLLENBQUMsU0FHZjtRQUZHLEtBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNuQyxLQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7O0lBQ2pDLENBQUM7SUFDRCw2REFBeUIsR0FBekIsVUFBMEIsU0FBYztRQUNwQyxpQkFBTSx5QkFBeUIsWUFBQyxTQUFTLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO0lBQ3JDLENBQUM7SUFDTSx5REFBcUIsR0FBNUI7UUFDSSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVk7ZUFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsWUFBWTtlQUNqRCxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUM5RCxDQUFDO0lBQ0wsZ0NBQUM7QUFBRCxDQUFDLENBbEI4QyxpQkFBaUIsR0FrQi9EOzs7Ozs7Ozs7Ozs7QUN0RGtEO0FBRW5ELDZDQUE2QztBQUM3QztJQUFBO1FBYVksZ0JBQVcsR0FBOEMsRUFBRSxDQUFDO0lBb0J4RSxDQUFDO0lBL0JHLHNCQUFrQixpQ0FBYzthQUFoQztZQUNJLE1BQU0sQ0FBQyxDQUFDLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsR0FBRyxHQUFHLEVBQUUsMEVBQWtCLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEdBQUcsRUFBRSwwRUFBa0IsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDeEssQ0FBQzs7O09BQUE7SUFDRCxzQkFBa0IsZ0NBQWE7YUFBL0I7WUFDSSxJQUFJLE9BQU8sR0FBRywwRUFBa0IsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ2xFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUUsT0FBTyxHQUFHLEdBQUcsRUFBRSxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDekQsQ0FBQzs7O09BQUE7SUFDRCxzQkFBa0IsOEJBQVc7YUFBN0I7WUFDSSxJQUFJLE9BQU8sR0FBRywwRUFBa0IsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQy9ELE1BQU0sQ0FBQyxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUUsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLENBQUM7OztPQUFBO0lBR00sMENBQWdCLEdBQXZCLFVBQXdCLFlBQW9CLEVBQUUsZUFBK0M7UUFDekYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsR0FBRyxlQUFlLENBQUM7SUFDckQsQ0FBQztJQUNNLCtCQUFLLEdBQVo7UUFDSSxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ00scUNBQVcsR0FBbEI7UUFDSSxJQUFJLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQ2pDLEdBQUcsRUFBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUM5QixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFDTSx3Q0FBYyxHQUFyQixVQUFzQixZQUFvQixFQUFFLElBQVk7UUFDcEQsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QyxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNqQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDTCxzQkFBQztBQUFELENBQUM7O0FBaENpQix3QkFBUSxHQUFvQixJQUFJLGVBQWUsRUFBRSxDQUFDO0FBa0NwRTtJQUFBO1FBRVksZ0JBQVcsR0FBMEMsRUFBRSxDQUFDO0lBb0JwRSxDQUFDO0lBbEJVLHdDQUFlLEdBQXRCLFVBQXVCLFdBQW1CLEVBQUUsY0FBMEM7UUFDbEYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxjQUFjLENBQUM7SUFDbkQsQ0FBQztJQUNNLDhCQUFLLEdBQVo7UUFDSSxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ00sb0NBQVcsR0FBbEI7UUFDSSxJQUFJLE1BQU0sR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BELEdBQUcsRUFBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUM5QixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFDTSxzQ0FBYSxHQUFwQixVQUFxQixXQUFtQixFQUFFLElBQVk7UUFDbEQsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1QyxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2RixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDTCxxQkFBQztBQUFELENBQUM7O0FBckJpQix1QkFBUSxHQUFtQixJQUFJLGNBQWMsRUFBRSxDQUFDOzs7Ozs7OztBQ3ZDbEU7QUFBQTtJQUFBO1FBRVksZ0JBQVcsR0FBNkMsRUFBRSxDQUFDO0lBaUJ2RSxDQUFDO0lBZlUsK0NBQWdCLEdBQXZCLFVBQXdCLFlBQW9CLEVBQUUsZUFBOEM7UUFDeEYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsR0FBRyxlQUFlLENBQUM7SUFDckQsQ0FBQztJQUNNLDBDQUFXLEdBQWxCO1FBQ0ksSUFBSSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUNqQyxHQUFHLEVBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBQ00sNkNBQWMsR0FBckIsVUFBc0IsWUFBb0IsRUFBRSxNQUFXO1FBQ25ELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0MsRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDakMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBQ0wsMkJBQUM7QUFBRCxDQUFDOztBQWxCaUIsNkJBQVEsR0FBeUIsSUFBSSxvQkFBb0IsRUFBRSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNKTDtBQUM1QjtBQUNQO0FBQ2tCO0FBdUZ4RDs7R0FFRztBQUNIO0lBb0JJO1FBUFEsaUJBQVksR0FBRyxFQUFFLENBQUM7UUFDbEIsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsMEJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLDJCQUFzQixHQUFZLEtBQUssQ0FBQztRQUMzQyxzQkFBaUIsR0FBb0QsSUFBSSxLQUFLLEVBQTRDLENBQUM7UUFHOUgsK0VBQTBCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQXBCRDs7O09BR0c7SUFDSSwyQkFBWSxHQUFuQixVQUFvQixLQUFVO1FBQzFCLE1BQU0sQ0FBQyx5REFBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ1MsOEJBQWUsR0FBekIsVUFBMEIsS0FBVTtRQUNoQyxNQUFNLENBQUMsS0FBSyxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFZRDs7T0FFRztJQUNJLHNCQUFPLEdBQWQsY0FBMkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDM0M7OztPQUdHO0lBQ0ksMEJBQVcsR0FBbEIsY0FBK0IsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFJdkQsc0JBQVcsbUNBQWlCO1FBSDVCOztXQUVHO2FBQ0gsY0FBaUMsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBQ3RFLG1DQUFvQixHQUFwQjtRQUNJLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7SUFDdkMsQ0FBQztJQUNELGlDQUFrQixHQUFsQjtRQUNJLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7SUFDeEMsQ0FBQztJQUNNLDhCQUFlLEdBQXRCO1FBQ0ksR0FBRyxFQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzdCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEMsRUFBRSxFQUFDLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQyxFQUFFLEVBQUMsR0FBRyxDQUFDO29CQUFDLDZEQUFTLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEQsQ0FBQztRQUNMLENBQUM7UUFDRCxHQUFHLEVBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztZQUNyQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUMsRUFBRSxFQUFDLElBQUksQ0FBQztnQkFBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDOUIsQ0FBQztJQUNKLENBQUM7SUFDRjs7O09BR0c7SUFDSSwrQkFBZ0IsR0FBdkIsVUFBd0IsSUFBWSxFQUFFLFlBQXdCO1FBQXhCLGtEQUF3QjtRQUMxRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLEVBQUUsRUFBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUM7WUFBQyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQzFFLE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDZixDQUFDO0lBQ1MsbUNBQW9CLEdBQTlCLFVBQStCLGNBQW1CLEVBQUUsSUFBWSxFQUFFLEdBQVE7UUFDdEUsRUFBRSxFQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQztZQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2pHLElBQUk7WUFBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3BDLENBQUM7SUFDRDs7OztPQUlHO0lBQ0ksK0JBQWdCLEdBQXZCLFVBQXdCLElBQVksRUFBRSxHQUFRO1FBQzFDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsRUFBRSxFQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxFQUFFLEVBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDaEQsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsU0FBUyxHQUFHLFNBQVMsQ0FBQyxZQUFZLEdBQUcsS0FBSyxFQUFFLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQzlHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNKLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN4RCxFQUFFLEVBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbkQsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBQ1MsbUNBQW9CLEdBQTlCLFVBQStCLElBQVksRUFBRSxRQUFhLEVBQUUsUUFBYTtRQUNyRSxFQUFFLEVBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFDO1FBQ3hGLEdBQUcsRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztZQUN6RCxFQUFFLEVBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUM7Z0JBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hGLENBQUM7SUFDTCxDQUFDO0lBQ0Q7Ozs7O09BS0c7SUFDSSxxREFBc0MsR0FBN0MsVUFBOEMsSUFBWSxFQUFFLElBQVMsRUFBRSxHQUFrQjtRQUFsQixnQ0FBa0I7UUFDckYsRUFBRSxFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDTCxHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7Z0JBQ3pELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekMsRUFBRSxFQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7b0JBQ2pCLE1BQU0sQ0FBQztnQkFDWCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFDRDs7Ozs7T0FLRztJQUNJLHVEQUF3QyxHQUEvQyxVQUFnRCxLQUFvQixFQUFFLElBQVMsRUFBRSxHQUFrQjtRQUFsQixnQ0FBa0I7UUFDL0YsR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7SUFDTCxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLHVEQUF3QyxHQUEvQyxVQUFnRCxJQUFZLEVBQUUsR0FBa0I7UUFBbEIsZ0NBQWtCO1FBQzVFLEdBQUcsRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztZQUN6RCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsRUFBRSxFQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLE1BQU0sQ0FBQztZQUNYLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSx5REFBMEMsR0FBakQsVUFBa0QsS0FBb0IsRUFBRSxHQUFrQjtRQUFsQixnQ0FBa0I7UUFDdEYsR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakUsQ0FBQztJQUNMLENBQUM7SUFDUyxzQ0FBdUIsR0FBakMsVUFBa0MsSUFBWSxFQUFFLEtBQXdCLEVBQUUsV0FBNEI7UUFBNUIsaURBQTRCO1FBQ2xHLElBQUksTUFBTSxHQUFHLElBQUksNkVBQWlCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDdkMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBQ1MsbUNBQW9CLEdBQTlCLFVBQStCLElBQVk7UUFDdkMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ1MsdUNBQXdCLEdBQWxDLFVBQW1DLElBQVksRUFBRSxVQUF1QjtRQUF2Qiw0Q0FBdUI7UUFDcEUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLEVBQUUsRUFBQyxDQUFDLE1BQU0sQ0FBQztZQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDdEIsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN0QixNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxVQUFVLENBQUM7SUFDbEMsQ0FBQztJQUNTLHVDQUF3QixHQUFsQyxVQUFtQyxJQUFZLEVBQUUsS0FBYTtRQUMxRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0MsRUFBRSxFQUFDLENBQUMsTUFBTSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ25CLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDM0IsRUFBRSxFQUFDLFFBQVEsS0FBSyxLQUFLLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDOUIsTUFBTSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNTLCtCQUFnQixHQUExQixVQUEyQixJQUFZO1FBQ25DLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxVQUFTLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFDLENBQUUsQ0FBQztRQUNqRixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDMUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBQ1MsNkJBQWMsR0FBeEIsVUFBeUIsSUFBWSxFQUFFLE1BQWtCLEVBQUUsUUFBb0I7UUFBeEMsc0NBQWtCO1FBQUUsMENBQW9CO1FBQzNFLElBQUksUUFBUSxHQUFHLElBQUksS0FBSyxFQUFPLENBQUM7UUFDaEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRyxLQUFLLEVBQUUsQ0FBQztRQUNqRSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsUUFBUSxDQUFDLElBQUksR0FBRyxVQUFVLEtBQUs7WUFDM0IsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4RCxFQUFFLEVBQUMsTUFBTSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNwRCxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ2xCLENBQUMsQ0FBQztRQUNGLFFBQVEsQ0FBQyxHQUFHLEdBQUc7WUFDWCxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEQsRUFBRSxFQUFDLFFBQVEsQ0FBQztnQkFBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNsQixDQUFDLENBQUM7UUFDRixRQUFRLENBQUMsTUFBTSxHQUFHLFVBQVUsS0FBYyxFQUFFLFdBQW9CO1lBQUUsZUFBZTtpQkFBZixVQUFlLEVBQWYscUJBQWUsRUFBZixJQUFlO2dCQUFmLDhCQUFlOztZQUM3RSxFQUFFLEVBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNyQixFQUFFLEVBQUMsQ0FBQyxXQUFXLENBQUM7Z0JBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztZQUNqQyxJQUFJLE1BQU0sR0FBRyxXQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBQyxJQUFJLFlBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxXQUFXLFNBQU0sS0FBSyxFQUFDLENBQUM7WUFDbEYsRUFBRSxFQUFDLENBQUMsS0FBSyxDQUFDO2dCQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDdEIsRUFBRSxFQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7b0JBQ3JDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZCLENBQUM7WUFDTCxDQUFDO1lBQ0QsRUFBRSxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ1IsR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDO29CQUNwQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsQ0FBQztZQUNMLENBQUM7WUFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNwRCxNQUFNLENBQUMsTUFBTSxDQUFDOztRQUNqQixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFDUyx1QkFBUSxHQUFsQixVQUFtQixHQUFVLEVBQUUsSUFBVyxFQUFFLFlBQXFCLEVBQUUsTUFBVztRQUMxRSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNmLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUNqQixHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7WUFDbkMsRUFBRSxFQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuQixJQUFJLEdBQUcsSUFBSSw2REFBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pDLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDSixLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLENBQUM7WUFDRCxFQUFFLEVBQUMsTUFBTSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixDQUFDO0lBQ0wsQ0FBQztJQUNTLCtCQUFnQixHQUExQixVQUEyQixDQUFNLEVBQUUsQ0FBTTtRQUNyQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN6QixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksTUFBTSxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ25FLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsUUFBUSxDQUFDO1lBQ25DLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ3ZDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsUUFBUSxDQUFDO1lBQzVCLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUM3QyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUN6RCxDQUFDO1FBQ0QsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDVixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2xFLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFDTCxXQUFDO0FBQUQsQ0FBQzs7QUFsUGlCLGtCQUFhLEdBQVcsVUFBVSxDQUFDO0FBbVByRDtJQUFBO0lBSUEsQ0FBQztJQUhVLDZCQUFPLEdBQWQ7UUFDSSxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNMLGtCQUFDO0FBQUQsQ0FBQzs7QUFFRDtJQUFtQyxnRkFBSTtJQTBDbkMsdUJBQW1CLElBQVk7UUFBL0IsWUFDSSxpQkFBTyxTQUNWO1FBRmtCLFVBQUksR0FBSixJQUFJLENBQVE7UUFyQ3ZCLGtDQUE0QixHQUFrQixLQUFJLENBQUM7O0lBdUMzRCxDQUFDO0lBdENhLGdDQUFrQixHQUFoQyxVQUFpQyxTQUFpQjtRQUM5QyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDN0IsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1QyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzVDLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEdBQUcsQ0FBQztRQUM3QyxFQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQUUsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFDYSxvQ0FBc0IsR0FBcEMsVUFBcUMsUUFBYTtRQUM5QyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDMUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdkMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxPQUFPLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxVQUFVLENBQUM7Z0JBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRyxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ2EsMEJBQVksR0FBMUIsVUFBMkIsU0FBaUI7UUFDeEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzdCLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNMLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDaEIsQ0FBQztRQUNELE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUNhLDZCQUFlLEdBQTdCLFVBQThCLFNBQTJCLEVBQUUsS0FBYSxFQUFFLFNBQWtCO1FBQ3hGLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN2QixHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLEVBQUUsRUFBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDekMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDSixLQUFLLElBQUksQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QyxDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDO0lBQzlCLENBQUM7SUFJTSxxQ0FBYSxHQUFwQixVQUFxQixLQUFrQjtRQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixFQUFFLEVBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMzRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNsRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUNELHNCQUFjLHFDQUFVO2FBQXhCLGNBQTZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFDM0Qsc0JBQVcsK0JBQUk7YUFBZixjQUFpQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBSS9ELHNCQUFXLGlDQUFNO1FBSGpCOztXQUVHO2FBQ0gsY0FBK0IsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUN6RCxzQkFBVyw0Q0FBaUI7YUFBNUI7WUFDSSxFQUFFLEVBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztZQUNyRCxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FBQ3ZDLENBQUM7OztPQUFBO0lBQ00sMkNBQW1CLEdBQTFCLFVBQTJCLGFBQThCO1FBQTlCLHFEQUE4QjtRQUFxQixNQUFNLENBQUMsRUFBRSxDQUFDO0lBQUMsQ0FBQztJQUMxRixzQkFBVyxrREFBdUI7YUFBbEMsY0FBc0QsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUM7YUFDakcsVUFBbUMsR0FBa0IsSUFBSSxJQUFJLENBQUMsNEJBQTRCLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQzs7O09BREY7SUFFMUYsMkNBQW1CLEdBQTFCLGNBQStCLENBQUM7SUFFekIsb0NBQVksR0FBbkIsY0FBdUIsQ0FBQztJQUN4QiwwQ0FBa0IsR0FBbEI7UUFDSSxpQkFBTSxrQkFBa0IsV0FBRSxDQUFDO1FBQzNCLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hCLENBQUM7SUFDTCxDQUFDO0lBQ0Qsc0JBQWMsd0NBQWE7YUFBM0IsY0FBaUQsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBQ3hFLHdDQUFnQixHQUExQixVQUEyQixJQUFZO1FBQ25DLEVBQUUsRUFBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQzdDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNTLGlDQUFTLEdBQW5CLGNBQXdCLENBQUM7SUFDN0Isb0JBQUM7QUFBRCxDQUFDLENBakZrQyxJQUFJLEdBaUZ0Qzs7QUFFRDtJQUFBO0lBdUJBLENBQUM7SUFyQkcsc0JBQVcsMEJBQU87YUFBbEIsY0FBZ0MsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBQ3ZGLG9CQUFJLEdBQVgsVUFBWSxNQUFXLEVBQUUsT0FBZ0I7UUFDckMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDbkMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDO1lBQzlDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXhELENBQUM7SUFDTCxDQUFDO0lBQ00sbUJBQUcsR0FBVixVQUFXLElBQU87UUFDZCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBSyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBQ00sc0JBQU0sR0FBYixVQUFjLElBQU87UUFDakIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDbkMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVDLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwQyxDQUFDO0lBQ0wsQ0FBQztJQUNMLFlBQUM7QUFBRCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hjdUM7QUFDSTtBQUNZO0FBQ0w7QUFDUDtBQUNrQztBQUMxQjtBQUVQO0FBRTdDOztHQUVHO0FBQ0g7SUFBOEIsMkVBQVk7SUFhdEMsa0JBQW1CLElBQVk7UUFBL0IsWUFDSSxrQkFBTSxJQUFJLENBQUMsU0FRZDtRQVRrQixVQUFJLEdBQUosSUFBSSxDQUFRO1FBUnZCLGlCQUFXLEdBQXVCLEVBQUUsQ0FBQztRQUNyQyxxQkFBZSxHQUEyQixLQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBdU81RSxrQ0FBNEIsR0FBWSxLQUFLLENBQUM7UUE4SDlDLDRCQUFzQixHQUFHLEtBQUssQ0FBQztRQTVWbkMsSUFBSSxJQUFJLEdBQUcsS0FBSSxDQUFDO1FBQ2hCLElBQUksYUFBYSxHQUFHLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsS0FBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RFLGFBQWEsQ0FBQyxzQkFBc0IsR0FBRyxVQUFTLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRixJQUFJLG1CQUFtQixHQUFHLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLEVBQUUsS0FBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xGLG1CQUFtQixDQUFDLGlCQUFpQixHQUFHLFVBQVMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlGLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLEVBQUUsS0FBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hELEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsRUFBRSxLQUFJLENBQUMsQ0FBQzs7SUFDNUQsQ0FBQztJQUlELHNCQUFXLHNDQUFnQjtRQUgzQjs7V0FFRzthQUNILGNBQXlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUNoRCwwQkFBTyxHQUFkLGNBQTJCLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQy9DLHNCQUFXLDhCQUFRO2FBQW5CLGNBQWlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUMvQyxzQkFBVyxvQ0FBYzthQUF6QixjQUF1QyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUN2RSxzQkFBVyxtQ0FBYTthQUF4QjtZQUNJLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztZQUNyQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDZCxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRTtZQUNyRCxDQUFDO1lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNyQixRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUI7WUFDaEQsQ0FBQztZQUVELEVBQUUsQ0FBQyxDQUFDLFFBQVEsS0FBSyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7Z0JBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUVwRSxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ3BCLENBQUM7OztPQUFBO0lBQ0Qsc0JBQVcsbUNBQWE7YUFBeEIsY0FBc0MsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUN2RyxzQkFBVyw4QkFBUTthQUFuQixjQUFpQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFDL0Msc0JBQVcsNkJBQU87YUFBbEIsY0FBK0IsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFLdEQsc0JBQVcsMkJBQUs7UUFKaEI7OztVQUdFO2FBQ0Y7WUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0QsQ0FBQzthQUNELFVBQWlCLEdBQVc7WUFDeEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2pELENBQUM7OztPQUpBO0lBS0Qsc0JBQUksOEJBQVE7YUFBWixjQUFvQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFLaEYsc0JBQVcsaUNBQVc7UUFKdEI7OztXQUdHO2FBQ0gsY0FBbUMsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDekYsVUFBdUIsR0FBWSxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FERjtJQUV6RixzQkFBSSxvQ0FBYzthQUFsQixjQUEwQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFJNUYsc0JBQVcsdUNBQWlCO1FBSDVCOztXQUVHO2FBQ0gsY0FBeUMsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNyRyxVQUE2QixHQUFXLElBQUksSUFBSSxDQUFDLHdCQUF3QixDQUFDLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREQ7SUFFckcsc0JBQUksMENBQW9CO2FBQXhCLGNBQWdELE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBSXhHLHNCQUFXLGlDQUFXO1FBSHRCOztXQUVHO2FBQ0gsY0FBbUMsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLEVBQUUsMEVBQWtCLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hJLFVBQXVCLEdBQVcsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxFQUFDLENBQUM7OztPQUQrQztJQUV4SSxzQkFBSSxvQ0FBYzthQUFsQixjQUEwQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFDNUYsc0JBQVksa0NBQVk7YUFBeEI7WUFDSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUNuQyxNQUFNLENBQUMsR0FBRyxHQUFFLEdBQUcsR0FBRSxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQy9CLENBQUM7OztPQUFBO0lBQ0Q7O09BRUc7SUFDSSwrQkFBWSxHQUFuQixjQUE0QyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFJekUsc0JBQVcsb0NBQWM7UUFIekI7O1dBRUc7YUFDSCxjQUE4QixNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBS2hGLHNCQUFXLCtCQUFTO1FBSnBCOzs7V0FHRzthQUNIO1lBQ0ksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLHdCQUF3QixFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN4RCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7b0JBQ3pCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztvQkFDaEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksMkVBQWdCLEVBQUUsQ0FBQztvQkFDL0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsR0FBRyxVQUFVLElBQVksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN2SCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLFVBQVUsSUFBWSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNHLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7WUFDakYsQ0FBQztZQUNELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDcEMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDO2dCQUFDLFdBQVcsSUFBSSxHQUFHLENBQUM7WUFDcEMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNqQixFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQUMsRUFBRSxJQUFJLElBQUksQ0FBQztZQUNuQixNQUFNLENBQUMsRUFBRSxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ2xELENBQUM7OztPQUFBO0lBQ00sd0JBQUssR0FBWixVQUFhLE9BQXdCO1FBQXhCLHlDQUF3QjtRQUNqQyw0REFBYSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQyxJQUFJLEVBQUUsR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUN2RixFQUFFLENBQUMsQ0FBQyw0REFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDMUMsQ0FBQztJQUNMLENBQUM7SUFDUyxtQ0FBZ0IsR0FBMUIsVUFBMkIsR0FBUSxFQUFFLFNBQWM7UUFDL0MsaUJBQU0sZ0JBQWdCLFlBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZDLEVBQUUsRUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNqQixFQUFFLEVBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNsRCxDQUFDO1lBQ0QsRUFBRSxFQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDbEMsR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7WUFDeEQsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBQ1MseUNBQXNCLEdBQWhDO1FBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUNTLDhDQUEyQixHQUFyQztRQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBQ1MseUNBQXNCLEdBQWhDLFVBQWlDLElBQVk7UUFDekMsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxJQUFJLElBQUksU0FBUyxDQUFDO0lBQ2hFLENBQUM7SUFDUyx3Q0FBcUIsR0FBL0IsVUFBZ0MsSUFBWTtRQUN4QyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDakMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ2hELEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNoRCxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFDTSxpQ0FBYyxHQUFyQixjQUFtQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMzQywrQkFBWSxHQUFuQixjQUFpQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUloRCxzQkFBVyxnQ0FBVTtRQUhyQjs7V0FFRzthQUNILGNBQW1DLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN2RixVQUFzQixHQUFZO1lBQzlCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUNuQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDakQsQ0FBQzs7O09BTHNGO0lBTXZGLHNCQUFXLGdDQUFVO2FBQXJCLGNBQW1DLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN2RixVQUFzQixHQUFZO1lBQzlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUNuQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3pDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDL0MsQ0FBQzs7O09BTHNGO0lBTXZGLHNCQUFXLDhCQUFRO2FBQW5CLGNBQWlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuRixVQUFvQixHQUFZO1lBQzVCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksR0FBRyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUN6RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDM0MsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzNCLENBQUM7OztPQU5rRjtJQU96RSxrQ0FBZSxHQUF6QixjQUE4QixDQUFDO0lBTS9CLHNCQUFXLGdDQUFVO1FBTHJCOzs7O1dBSUc7YUFDSCxjQUEwQixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBQzs7O09BQUE7SUFPdEcsc0JBQVcsOEJBQVE7UUFObkI7O1dBRUc7UUFDSDs7V0FFRzthQUNILGNBQWlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuRixVQUFvQixHQUFZO1lBQzVCLEVBQUUsRUFBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM3QixDQUFDOzs7T0FMa0Y7SUFXbkYsc0JBQVcsOEJBQVE7UUFMbkI7Ozs7V0FJRzthQUNILGNBQWdDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMvRSxVQUFvQixHQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURHO0lBR3hFLCtCQUFZLEdBQW5CLFVBQW9CLE1BQXNCO1FBQ3RDLGlCQUFNLFlBQVksWUFBQyxNQUFNLENBQUMsQ0FBQztRQUMzQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDM0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUM7WUFBQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxvRUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqRyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDdEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELG9DQUFpQixHQUFqQjtRQUNJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFDRCxvQ0FBaUIsR0FBakIsVUFBa0IsSUFBWTtRQUMxQixFQUFFLEVBQUMsQ0FBQyxJQUFJLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDakIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDcEMsRUFBRSxFQUFDLENBQUMsVUFBVSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ3ZCLEVBQUUsRUFBQyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDTCxDQUFDO0lBQ0Qsc0JBQWMsd0JBQUU7YUFBaEI7WUFDSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztnQkFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztZQUNuQixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDckIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztnQkFDaEQsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUM7Z0JBQ3JDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7b0JBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUNoRCxDQUFDO1lBQ0QsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdEUsQ0FBQzs7O09BQUE7SUFDTSwrQkFBWSxHQUFuQjtRQUNJLGlCQUFNLFlBQVksV0FBRSxDQUFDO1FBQ3JCLEVBQUUsRUFBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNuQyxDQUFDO0lBQ0wsQ0FBQztJQUNTLDRCQUFTLEdBQW5CO1FBQ0ksaUJBQU0sU0FBUyxXQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxFQUFFLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDbkMsQ0FBQztJQUNMLENBQUM7SUFPRCxzQkFBVywyQkFBSztRQUxoQjs7OztXQUlHO2FBQ0g7WUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUNuRCxDQUFDO2FBQ0QsVUFBaUIsUUFBYTtZQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDOUMsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQztZQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUM7UUFDOUMsQ0FBQzs7O09BUEE7SUFRRCxzQkFBVyxrQ0FBWTthQUF2QjtZQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3RCLENBQUM7OztPQUFBO0lBSUQsc0JBQVcsa0NBQVk7UUFIdkI7O1dBRUc7YUFDSCxjQUFpQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoRixVQUF3QixHQUFRO1lBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDbkMsQ0FBQzs7O09BSitFO0lBS3RFLDBDQUF1QixHQUFqQztRQUNJLEVBQUUsRUFBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUNsRyxFQUFFLEVBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ2pELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ1Msa0NBQWUsR0FBekI7UUFDSSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDbkMsQ0FBQztJQUtELHNCQUFXLDZCQUFPO1FBSGxCOztXQUVHO2FBQ0gsY0FBK0IsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDMUQsVUFBbUIsUUFBZ0I7WUFDL0IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUNuRCxDQUFDOzs7T0FMeUQ7SUFNaEQsNkJBQVUsR0FBcEIsY0FBaUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUMzRyw2QkFBVSxHQUFwQixVQUFxQixRQUFnQjtRQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFDRDs7T0FFRztJQUNJLDBCQUFPLEdBQWQsY0FBNEIsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUluRSxzQkFBVyxnQ0FBVTtRQUhyQjs7V0FFRzthQUNILGNBQWtELE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQzthQUNoRixVQUFzQixHQUEyQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FEaEI7SUFNaEYsc0JBQVcsNEJBQU07UUFKakI7OztXQUdHO2FBQ0gsY0FBMEMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2FBQ3BFLFVBQWtCLEdBQXVCLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDOzs7T0FERjtJQUVwRTs7O09BR0c7SUFDSSw0QkFBUyxHQUFoQixVQUFpQixZQUE0QjtRQUE1QixrREFBNEI7UUFDekMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFJRCxzQkFBVyx1Q0FBaUI7UUFINUI7O1dBRUc7YUFDSCxjQUF5QyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUtyRSxzQkFBVyxrQ0FBWTtRQUp2Qjs7O1dBR0c7YUFDSCxjQUFvQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUNwSDs7O09BR0c7SUFDSSwyQkFBUSxHQUFmLFVBQWdCLEtBQWtCO1FBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUNPLGlDQUFjLEdBQXRCLFVBQXVCLFlBQXFCO1FBQ3hDLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM3QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDakMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDUiwyQ0FBMkM7Z0JBQzNDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QixDQUFDO1FBQ0wsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUN4QyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLENBQUM7UUFDTCxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsWUFBWSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0wsQ0FBQztJQUNPLHVDQUFvQixHQUE1QjtRQUNJLEVBQUUsRUFBQyxJQUFJLENBQUMscUJBQXFCLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDbkUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3hFLENBQUM7SUFDUyxtQ0FBZ0IsR0FBMUIsVUFBMkIsTUFBMEI7UUFDakQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksbUVBQW1CLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUN0RSxDQUFDO0lBQ0wsQ0FBQztJQUNTLG1DQUFnQixHQUExQjtRQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0lBQ1MsZ0NBQWEsR0FBdkI7UUFDSSxNQUFNLENBQUMsSUFBSSxtRUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFUyw4QkFBVyxHQUFyQixVQUFzQixRQUFhO1FBQy9CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUNTLG9DQUFpQixHQUEzQixVQUE0QixRQUFhO1FBQ3JDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQztZQUMvQixRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7SUFDTCxDQUFDO0lBQ08sK0JBQVksR0FBcEI7UUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDbEYsQ0FBQztJQUNPLCtCQUFZLEdBQXBCLFVBQXFCLFFBQWE7UUFDOUIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUM7UUFDbEMsQ0FBQztJQUNMLENBQUM7SUFDUyxnQ0FBYSxHQUF2QixVQUF3QixHQUFRLElBQVMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUMsOEJBQVcsR0FBckIsVUFBc0IsR0FBUSxJQUFTLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFDLGlDQUFjLEdBQXhCLGNBQTZCLENBQUM7SUFDcEIsZ0NBQWEsR0FBdkIsVUFBd0IsUUFBZ0I7UUFDcEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUFDLElBQUk7WUFBQyxJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsV0FBVztJQUNYLHVDQUFvQixHQUFwQixVQUFxQixRQUFhO1FBQzlCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztJQUN4QyxDQUFDO0lBQ0QsaUJBQWlCO0lBQ2pCLG9DQUFpQixHQUFqQixjQUE4QixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM1QyxzQkFBSSxvQ0FBYzthQUFsQixjQUE0QixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDaEQsVUFBbUIsR0FBUSxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQzs7O09BREY7SUFFcEQsZUFBQztBQUFELENBQUMsQ0FuWjZCLG1FQUFZLEdBbVp6Qzs7QUFDRCwrREFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLFVBQVUsRUFBRTtJQUMvRixFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsRUFBRTtJQUNyRSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0I7SUFDNUcsb0JBQW9CLEVBQUUsRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUU7SUFDdkcsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQ3RhNUY7QUFDaEI7QUFFbkM7SUFBeUMsc0ZBQVc7SUFDaEQsNkJBQW1CLGVBQThCO1FBQTlCLHdEQUE4QjtRQUFqRCxZQUNJLGlCQUFPLFNBQ1Y7UUFGa0IscUJBQWUsR0FBZixlQUFlLENBQWU7O0lBRWpELENBQUM7SUFDTSxxQ0FBTyxHQUFkO1FBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsR0FBRywwRUFBa0IsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDdkcsQ0FBQztJQUNMLDBCQUFDO0FBQUQsQ0FBQyxDQVB3QywwREFBVyxHQU9uRDs7QUFDRDtJQUF3QyxxRkFBVztJQUMvQztlQUNJLGlCQUFPO0lBQ1gsQ0FBQztJQUNNLG9DQUFPLEdBQWQ7UUFDSSxNQUFNLENBQUMsMEVBQWtCLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFDTCx5QkFBQztBQUFELENBQUMsQ0FQdUMsMERBQVcsR0FPbEQ7O0FBQ0Q7SUFBcUMsa0ZBQVc7SUFFNUMseUJBQVksT0FBZTtRQUEzQixZQUNJLGlCQUFPLFNBRVY7UUFERyxLQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQzs7SUFDM0IsQ0FBQztJQUNNLGlDQUFPLEdBQWQ7UUFDSSxNQUFNLENBQUMsMEVBQWtCLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFDTyxxQ0FBVyxHQUFuQjtRQUNJLElBQUksS0FBSyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN2QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM1RCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUNMLHNCQUFDO0FBQUQsQ0FBQyxDQWpCb0MsMERBQVcsR0FpQi9DOztBQUVEO0lBQWlDLDhFQUFXO0lBRXhDLHFCQUFZLElBQVk7UUFBeEIsWUFDSSxpQkFBTyxTQUVWO1FBREcsS0FBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7O0lBQ3JCLENBQUM7SUFDTSw2QkFBTyxHQUFkO1FBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUNMLGtCQUFDO0FBQUQsQ0FBQyxDQVRnQywwREFBVyxHQVMzQzs7Ozs7Ozs7Ozs7O0FDL0N3RTtBQUNqQztBQUV4Qzs7OztHQUlHO0FBQ0g7SUF3REksbUJBQVksS0FBVSxFQUFFLElBQW1CO1FBQW5CLGtDQUFtQjtRQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksNkVBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixHQUFHLFVBQVMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xJLEVBQUUsRUFBQyxJQUFJLENBQUM7WUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQTVEYSxxQkFBVyxHQUF6QixVQUEwQixRQUEyQjtRQUNqRCxJQUFJLEtBQUssR0FBcUIsRUFBRSxDQUFDO1FBQ2pDLFNBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUNhLG9CQUFVLEdBQXhCLFVBQXlCLEtBQXVCLEVBQUUsUUFBMkI7UUFDekUsS0FBSyxDQUFDLElBQUksR0FBRyxVQUFTLEtBQUs7WUFDdkIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwRCxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUMxQixNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ2xCLENBQUMsQ0FBQztRQUNGLEtBQUssQ0FBQyxNQUFNLEdBQUcsVUFBVSxLQUFjLEVBQUUsV0FBb0I7WUFBRSxlQUFxQjtpQkFBckIsVUFBcUIsRUFBckIscUJBQXFCLEVBQXJCLElBQXFCO2dCQUFyQiw4QkFBcUI7O1lBQ2hGLElBQUksTUFBTSxHQUFHLFdBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFDLElBQUksWUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsU0FBTSxLQUFLLEVBQUMsQ0FBQztZQUM5RSxFQUFFLEVBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUN0QixHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7Z0JBQ3BDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBQ2pDLENBQUM7WUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDOztRQUNsQixDQUFDLENBQUM7SUFDTixDQUFDO0lBQ2EsaUJBQU8sR0FBckIsVUFBc0IsS0FBdUIsRUFBRSxNQUFrQjtRQUM3RCxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNqQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNyQyxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLENBQUM7SUFDTCxDQUFDO0lBQ2EsaUJBQU8sR0FBckIsVUFBc0IsS0FBdUI7UUFDekMsSUFBSSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFDYSx3QkFBYyxHQUE1QixVQUE2QixLQUF1QixFQUFFLEdBQVE7UUFDMUQsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7WUFDckMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ2EsOEJBQW9CLEdBQWxDLFVBQW1DLEtBQXVCLEVBQUUsR0FBUTtRQUNoRSxJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUNhLG9DQUEwQixHQUF4QyxVQUF5QyxLQUF1QjtRQUM1RCxHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7WUFDcEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQyxDQUFDO0lBQ0wsQ0FBQztJQVdNLDJCQUFPLEdBQWQsY0FBMkIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDaEQsc0JBQVcsOEJBQU87YUFBbEIsY0FBMEMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUNyRSxzQkFBVywrQkFBUTthQUFuQixjQUE0QyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQ3hFLFVBQW9CLEtBQXdCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzs7O09BREw7SUFFeEUsc0JBQVcsNEJBQUs7YUFBaEIsY0FBMEIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2FBQ2xELFVBQWlCLFFBQWE7WUFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7WUFDMUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUM1QixJQUFJLEdBQUcsR0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVDLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2IsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNyQyxDQUFDO1FBQ0wsQ0FBQzs7O09BVmlEO0lBV2xELHNCQUFXLDhCQUFPO2FBQWxCLGNBQWdDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFDOUUsc0JBQVcsMkJBQUk7YUFBZixjQUE0QixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQ3ZELFVBQWdCLE9BQWU7WUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO1FBQ2hDLENBQUM7OztPQUhzRDtJQUloRCwyQkFBTyxHQUFkO1FBQ0ksSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNsRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3RDLEVBQUUsRUFBQyxDQUFDLGdCQUFnQixJQUFJLENBQUMsUUFBUSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDckQsSUFBSSxNQUFNLEdBQUcsRUFBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBQyxDQUFDO1FBQ2pDLEVBQUUsRUFBQyxRQUFRLENBQUM7WUFBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQ3ZDLEVBQUUsRUFBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDbEIsR0FBRyxFQUFDLElBQUksR0FBRyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQztnQkFDOUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLENBQUM7UUFDTCxDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBQ00sMkJBQU8sR0FBZCxVQUFlLEtBQVU7UUFDckIsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQztZQUNyQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0IsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQzlDLFNBQVMsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDO1lBQ3hDLENBQUM7WUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN2QixDQUFDO0lBQ0wsQ0FBQztJQUNELHNCQUFZLG1DQUFZO2FBQXhCLGNBQTZCLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUNqRyxrQ0FBYyxHQUF2QixVQUF3QixHQUFRLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssV0FBVyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBQztJQUN6RyxrQ0FBYyxHQUF0QixVQUF1QixHQUFRLEVBQUUsU0FBd0I7UUFDckQsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsQixFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDO2dCQUFDLFFBQVEsQ0FBQztZQUM5QyxFQUFFLENBQUMsQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFBQyxRQUFRLENBQUM7WUFDdkQsRUFBRSxFQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ25DLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDSixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUNPLHVDQUFtQixHQUEzQjtRQUNJLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztRQUNsQixHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ25CLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksU0FBUyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLFdBQVcsQ0FBQztnQkFBQyxRQUFRLENBQUM7WUFDbEgsRUFBRSxFQUFDLE1BQU0sSUFBSSxJQUFJLENBQUM7Z0JBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFDTCxnQkFBQztBQUFELENBQUM7O0FBbElpQixtQkFBUyxHQUFHLEdBQUcsQ0FBQztBQW9EZix1QkFBYSxHQUFHLENBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBZ0YvSCwrREFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsVUFBVSxHQUFRLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7O0FDN0lqSSxJQUFJLFNBQVMsR0FBRztJQUNuQixXQUFXLEVBQUUsRUFBRTtJQUNmLE1BQU0sRUFBRTtRQUNKLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxrQkFBa0IsQ0FBQztRQUN6RSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUFDLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQztRQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ2YsQ0FBQztDQUNKLENBQUM7QUFFSyxJQUFJLGtCQUFrQixHQUFHO0lBQzVCLElBQUksRUFBRSxTQUFTO0lBQ2YsTUFBTSxFQUFFLEVBQUU7SUFDVixJQUFJLEVBQUUsU0FBUztJQUNmLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFDO0lBQ3pHLFFBQVEsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLEVBQUU7SUFDeEMsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsRUFBRTtJQUM1QyxHQUFHLEVBQUUsUUFBUTtJQUNiLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtJQUN0SixLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO0lBQzVFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO0lBRWpELE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFDO0lBQzFELFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxnQ0FBZ0MsRUFBRTtJQUNyRyxPQUFPLEVBQUUsRUFBRTtJQUNYLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO0lBQ3hELE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRTtJQUN0RCxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFO0lBQ3ZDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtJQUM1QyxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7SUFDdEMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFO0lBQ25GLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLGtDQUFrQyxFQUFFO0lBQzlHLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7SUFDN0UsSUFBSSxFQUFFLEVBQUU7SUFDUixVQUFVLEVBQUUsRUFBRTtJQUNkLFFBQVEsRUFBRSxFQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBQztJQUM3RSxNQUFNLEVBQUU7UUFDSixJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxtQkFBbUI7UUFDNUMsTUFBTSxFQUFFO1lBQ0osSUFBSSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxFQUFFO1NBQzFGO0tBQ0o7Q0FDSixDQUFDO0FBRUYsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLGtCQUFrQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNDUztBQUNEO0FBQ0U7QUFFckQ7SUFDSSxpQkFBbUIsY0FBbUI7UUFBbkIsbUJBQWMsR0FBZCxjQUFjLENBQUs7SUFDdEMsQ0FBQztJQUNNLDBCQUFRLEdBQWYsVUFBZ0IsWUFBMEI7UUFDdEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbkQsRUFBRSxFQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUNsQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNqRCxFQUFFLEVBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNkLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEMsRUFBRSxFQUFDLElBQUksQ0FBQyxFQUFDO2dCQUNMLEVBQUUsRUFBQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDN0MsR0FBRyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUMxQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDZixDQUFDO0lBQ0Qsc0JBQVcsOEJBQVM7YUFBcEIsY0FBeUIsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFDcEUsMEJBQVEsR0FBZjtRQUNJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDOUIsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ3RGLE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDZixDQUFDO0lBQ08sOEJBQVksR0FBcEIsVUFBcUIsR0FBVztRQUM1QixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNyQixFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUYsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFDTyw4QkFBWSxHQUFwQixVQUFxQixHQUFRO1FBQ3pCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUMvRSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ08sZ0NBQWMsR0FBdEIsVUFBdUIsS0FBYTtRQUNoQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUNPLDJCQUFTLEdBQWpCLFVBQWtCLEtBQWE7UUFDM0IsRUFBRSxFQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ3BJLElBQUksR0FBRyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUNPLGdDQUFjLEdBQXRCLFVBQXVCLEdBQVE7UUFDM0IsSUFBSSxHQUFHLEdBQUcsRUFBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUMsQ0FBQztRQUN4QyxFQUFFLEVBQUMsR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztZQUMxQyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNqQixHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ2YsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25DLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDZixDQUFDO1FBQ0QsRUFBRSxFQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLEdBQUcsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDZixDQUFDO1FBQ0QsRUFBRSxFQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLE1BQU0sQ0FBQztZQUN4QyxHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ2YsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDZixDQUFDO0lBQ0wsY0FBQztBQUFELENBQUM7O0FBQ0Q7SUFBcUMsa0ZBQU87SUFFeEMseUJBQW1CLGNBQW1CO1FBQXRDLFlBQ0ksa0JBQU0sY0FBYyxDQUFDLFNBQ3hCO1FBRmtCLG9CQUFjLEdBQWQsY0FBYyxDQUFLO1FBRC9CLGdCQUFVLEdBQW1CLElBQUksS0FBSyxFQUFXLENBQUM7O0lBR3pELENBQUM7SUFDTSxrQ0FBUSxHQUFmLFVBQWdCLFlBQTBCO1FBQ3RDLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUNyQixHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDO1lBQzlDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBQ0QsTUFBTSxDQUFDLDBFQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFDTSxrQ0FBUSxHQUFmO1FBQ0ksSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHO1FBQ25DLEdBQUcsRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7WUFDOUMsRUFBRSxFQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsR0FBRyxJQUFJLElBQUksQ0FBQztZQUN0QixHQUFHLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFDTCxzQkFBQztBQUFELENBQUMsQ0FwQm9DLE9BQU8sR0FvQjNDOztBQUNEO0lBQXVDLG9GQUFPO0lBSTFDO2VBQ0ksa0JBQU0sSUFBSSxDQUFDO0lBQ2YsQ0FBQztJQUNNLG9DQUFRLEdBQWYsVUFBZ0IsWUFBMEI7UUFDdEMsRUFBRSxFQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQzFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFDLEVBQUUsRUFBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxDQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEIsQ0FBQztRQUNELEVBQUUsRUFBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxDQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEIsQ0FBQztRQUNELEVBQUUsRUFBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxDQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEIsQ0FBQztRQUNELEVBQUUsRUFBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdEIsRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDbkIsTUFBTSxDQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEIsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNNLG9DQUFRLEdBQWY7UUFDSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2hELEdBQUcsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7UUFDakMsRUFBRSxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBQyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM1QyxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUNMLHdCQUFDO0FBQUQsQ0FBQyxDQWhDc0MsT0FBTyxHQWdDN0M7O0FBQ0Q7SUFBQTtRQXlFWSxZQUFPLEdBQVcsT0FBTyxDQUFDO1FBQzFCLGNBQVMsR0FBWSxJQUFJLENBQUM7UUFDMUIsZUFBVSxHQUFZLElBQUksQ0FBQztJQXlDdkMsQ0FBQztJQWxIRyxzQkFBVyxzQkFBUzthQUFwQjtZQUNJLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDO1lBQ3RFLFNBQVMsQ0FBQyxjQUFjLEdBQUc7Z0JBQ3ZCLEtBQUssRUFBRSxVQUFVLElBQUksRUFBRSxLQUFLO29CQUN4QixFQUFFLEVBQUMsSUFBSSxJQUFJLElBQUksQ0FBQzt3QkFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO29CQUM3QixNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQUMsQ0FBQztnQkFDbkIsUUFBUSxFQUFFLFVBQVUsSUFBSSxFQUFFLEtBQUs7b0JBQzNCLEVBQUUsRUFBQyxJQUFJLElBQUksSUFBSSxDQUFDO3dCQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7b0JBQzlCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEIsQ0FBQztnQkFDRCxLQUFLLEVBQUUsVUFBVSxJQUFJLEVBQUUsS0FBSztvQkFDeEIsRUFBRSxFQUFDLElBQUksSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUM7d0JBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztvQkFDaEYsRUFBRSxFQUFDLElBQUksSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQzt3QkFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO29CQUM5QyxNQUFNLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQztnQkFDekIsQ0FBQztnQkFDRCxRQUFRLEVBQUUsVUFBVSxJQUFJLEVBQUUsS0FBSztvQkFDM0IsRUFBRSxFQUFDLElBQUksSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUM7d0JBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDL0UsRUFBRSxFQUFDLElBQUksSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQzt3QkFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUMvQyxNQUFNLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQztnQkFDekIsQ0FBQztnQkFDRCxRQUFRLEVBQUUsVUFBVSxJQUFJLEVBQUUsS0FBSztvQkFDM0IsRUFBRSxFQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzt3QkFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUN2QyxHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7d0JBQ25DLEVBQUUsRUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDOzRCQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ3JDLENBQUM7b0JBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDakIsQ0FBQztnQkFDRCxXQUFXLEVBQUUsVUFBVSxJQUFJLEVBQUUsS0FBSztvQkFDOUIsRUFBRSxFQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzt3QkFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO29CQUN0QyxHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7d0JBQ25DLEVBQUUsRUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDOzRCQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7b0JBQ3RDLENBQUM7b0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDaEIsQ0FBQztnQkFDRCxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsS0FBSztvQkFDMUIsRUFBRSxFQUFDLElBQUksSUFBSSxJQUFJLENBQUM7d0JBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztvQkFDOUIsRUFBRSxFQUFDLEtBQUssSUFBSSxJQUFJLENBQUM7d0JBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDOUIsTUFBTSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7Z0JBQ3hCLENBQUM7Z0JBQ0QsSUFBSSxFQUFFLFVBQVUsSUFBSSxFQUFFLEtBQUs7b0JBQ3ZCLEVBQUUsRUFBQyxLQUFLLElBQUksSUFBSSxDQUFDO3dCQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7b0JBQy9CLEVBQUUsRUFBQyxJQUFJLElBQUksSUFBSSxDQUFDO3dCQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQzdCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO2dCQUN4QixDQUFDO2dCQUNELGNBQWMsRUFBRSxVQUFVLElBQUksRUFBRSxLQUFLO29CQUNqQyxFQUFFLEVBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDO3dCQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7b0JBQy9DLEVBQUUsRUFBQyxLQUFLLElBQUksSUFBSSxDQUFDO3dCQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQzlCLE1BQU0sQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDO2dCQUN6QixDQUFDO2dCQUNELFdBQVcsRUFBRSxVQUFVLElBQUksRUFBRSxLQUFLO29CQUM5QixFQUFFLEVBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDO3dCQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7b0JBQy9DLEVBQUUsRUFBQyxJQUFJLElBQUksSUFBSSxDQUFDO3dCQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQzdCLE1BQU0sQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDO2dCQUN6QixDQUFDO2FBQ0osQ0FBQztZQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDO1FBQ3BDLENBQUM7OztPQUFBO0lBQ2EscUJBQVcsR0FBekIsVUFBMEIsTUFBYztRQUNwQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ2EscUJBQVcsR0FBekIsVUFBMEIsTUFBYyxFQUFFLElBQXdDO1FBQzlFLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3ZDLENBQUM7SUFDYSwyQkFBaUIsR0FBL0IsVUFBZ0MsTUFBYztRQUMxQyxFQUFFLEVBQUMsQ0FBQyxNQUFNLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDO0lBQ3BELENBQUM7SUFDYSw0QkFBa0IsR0FBaEMsVUFBaUMsRUFBVTtRQUN2QyxNQUFNLENBQUMsRUFBRSxJQUFJLE9BQU8sSUFBSSxFQUFFLElBQUksVUFBVSxDQUFDO0lBQzdDLENBQUM7SUFJRCxzQkFBVywyQkFBSTthQUFmLGNBQTZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzthQUNyRCxVQUFnQixHQUFZLElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDOzs7T0FERjtJQUVyRCxzQkFBVyw0QkFBSzthQUFoQixjQUE4QixNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7YUFDdkQsVUFBaUIsR0FBWSxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQzs7O09BREY7SUFFdkQsc0JBQVcsK0JBQVE7YUFBbkIsY0FBZ0MsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQ3RELFVBQW9CLEtBQWE7WUFDN0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQ25CLEtBQUssR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDNUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUN6QixDQUFDOzs7T0FOcUQ7SUFPL0MsMkJBQU8sR0FBZCxVQUFlLElBQWdCLEVBQUUsS0FBaUIsRUFBRSxZQUFpQztRQUF0RSxrQ0FBZ0I7UUFBRSxvQ0FBaUI7UUFBRSxrREFBaUM7UUFDakYsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUM1QixFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUNNLG1DQUFlLEdBQXRCLFVBQXVCLElBQVMsRUFBRSxLQUFVLEVBQUUsWUFBMEI7UUFDcEUsSUFBSSxTQUFTLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzFELEVBQUUsRUFBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksU0FBUyxLQUFLLEtBQUssQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUMzRSxJQUFJLFVBQVUsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDN0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ00sNEJBQVEsR0FBZjtRQUNJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzdDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNoRCxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUM1RCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBQ08scUNBQWlCLEdBQXpCO1FBQ0ksSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN2QixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksT0FBTyxDQUFDO1lBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUM5QixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksVUFBVSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNsQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksU0FBUyxDQUFDO1lBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUNoQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDO1lBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUM3QixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksZ0JBQWdCLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3hDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxhQUFhLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBQ0wsZ0JBQUM7QUFBRCxDQUFDOztBQW5IVSx3QkFBYyxHQUF3QixJQUFJLENBQUM7QUFvSHREO0lBR0k7UUFGUSxvQkFBZSxHQUFXLEtBQUssQ0FBQztRQUNqQyxhQUFRLEdBQWUsRUFBRSxDQUFDO0lBQ1YsQ0FBQztJQUN4QixzQkFBVyxxQ0FBVTthQUFyQixjQUFrQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7YUFDaEUsVUFBc0IsS0FBYTtZQUMvQixFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDbkIsS0FBSyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QixFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksR0FBRyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUM7Z0JBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNqRCxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksR0FBRyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUM7Z0JBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNoRCxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQzVDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLENBQUM7OztPQVIrRDtJQVNoRSxzQkFBVyxrQ0FBTzthQUFsQixjQUF1QixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFDbkQsNkJBQUssR0FBWjtRQUNJLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFDTSxnQ0FBUSxHQUFmO1FBQ0ksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDNUIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLEVBQUUsRUFBQyxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLFFBQVEsR0FBRyxHQUFHLEdBQUcsUUFBUSxHQUFHLEdBQUcsQ0FBQztZQUNwQyxDQUFDO1lBQ0QsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDWCxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUM7b0JBQUMsR0FBRyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztnQkFDNUMsR0FBRyxJQUFJLFFBQVEsQ0FBQztZQUNwQixDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDZixDQUFDO0lBQ0wsb0JBQUM7QUFBRCxDQUFDOztBQUNEO0lBSUksMEJBQW1CLFVBQWtCO1FBQ2pDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSw0RUFBWSxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUNELHNCQUFXLHdDQUFVO2FBQXJCLGNBQWtDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQzthQUNoRSxVQUFzQixLQUFhO1lBQy9CLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUNyQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksMkVBQWdCLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7OztPQUwrRDtJQU16RCw4QkFBRyxHQUFWLFVBQVcsTUFBc0I7UUFDN0IsRUFBRSxFQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUNMLHVCQUFDO0FBQUQsQ0FBQzs7QUFDRDtJQUlJLHlCQUFtQixVQUFrQjtRQUNqQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLDRFQUFZLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBQ0Qsc0JBQVcsdUNBQVU7YUFBckIsY0FBa0MsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO2FBQ2hFLFVBQXNCLEtBQWE7WUFDL0IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBQzdCLElBQUksMkVBQWdCLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEUsQ0FBQzs7O09BTCtEO0lBTXpELDZCQUFHLEdBQVYsVUFBVyxNQUFzQjtRQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDTyxpQ0FBTyxHQUFmLFVBQWdCLElBQW1CO1FBQy9CLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDO1FBQzNDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xELEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQztnQkFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ3RDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3pDLENBQUM7UUFDRCxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQ3ZCLENBQUM7SUFDTywwQ0FBZ0IsR0FBeEIsVUFBeUIsS0FBVTtRQUMvQixFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRCxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFDTyxzQ0FBWSxHQUFwQixVQUFxQixTQUFvQjtRQUNyQyxNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFDTCxzQkFBQztBQUFELENBQUM7Ozs7Ozs7OztBQ3pVRDtBQUFBO0lBQUE7SUFZQSxDQUFDO0lBWEc7OztPQUdHO0lBQ1csb0JBQVksR0FBMUIsVUFBMkIsS0FBVTtRQUNqQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUM1RCxFQUFFLEVBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssWUFBWSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakUsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBQ0QsTUFBTSxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLEtBQUssQ0FBQztJQUNwRCxDQUFDO0lBQ0wsY0FBQztBQUFELENBQUM7O0FBQ0QsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHO1FBQ3pCLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FBQztRQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsVUFBVSxLQUFLLEVBQUUsTUFBTTtZQUNuRCxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksV0FBVztrQkFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQztrQkFDWixLQUFLLENBQ047UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQztBQUNOLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzQjhCO0FBQ3lFO0FBRzVDO0FBRTVEO0lBQTJDLHdGQUF5QjtJQUNoRSwrQkFBWSxLQUFVO1FBQXRCLFlBQ0ksa0JBQU0sS0FBSyxDQUFDLFNBSWY7UUFIRyxLQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO1FBQzdDLEtBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLENBQUM7UUFDckQsS0FBSSxDQUFDLFlBQVksR0FBRyxLQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsQ0FBQzs7SUFDckQsQ0FBQztJQUNELHNCQUFjLDJDQUFRO2FBQXRCLGNBQWlELE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBb0MsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBQ3BHLHlEQUF5QixHQUF6QixVQUEwQixTQUFjO1FBQ3BDLGlCQUFNLHlCQUF5QixZQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsOENBQWMsR0FBZCxVQUFlLEtBQUs7UUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUNELDRDQUFZLEdBQVosVUFBYSxLQUFLO1FBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxzQ0FBTSxHQUFOO1FBQ0ksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNoQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUMxQyxNQUFNLENBQUMsQ0FDSCxtRUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLE1BQU0sRUFBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLGdCQUFjLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksR0FBRyxDQUMvVSxDQUFDO0lBQ04sQ0FBQztJQUNPLDZDQUFhLEdBQXJCLGNBQStCLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvRiw0QkFBQztBQUFELENBQUMsQ0EzQjBDLHdGQUF5QixHQTJCbkU7O0FBRUQ7SUFBK0MsNEZBQWtCO0lBSTdELG1DQUFZLEtBQVU7UUFBdEIsWUFDSSxrQkFBTSxLQUFLLENBQUMsU0FPZjtRQU5HLEtBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixLQUFJLENBQUMsT0FBTyxHQUFHLEtBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ3JDLEtBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixLQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxLQUFJLENBQUMsY0FBYyxHQUFHLEtBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxDQUFDO1FBQ3JELEtBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLENBQUM7O0lBQ3JELENBQUM7SUFDRCxrREFBYyxHQUFkLFVBQWUsS0FBSztRQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELGdEQUFZLEdBQVosVUFBYSxLQUFLO1FBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN6QyxDQUFDO0lBQ0QsNkRBQXlCLEdBQXpCLFVBQTBCLFNBQWM7UUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO0lBQ3ZDLENBQUM7SUFDRCwwQ0FBTSxHQUFOO1FBQ0ksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNoQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ25CLE1BQU0sQ0FBQyxDQUFDLDhEQUFLLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFPLENBQUMsQ0FBQztRQUMzRSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDeEUsTUFBTSxDQUFDLENBQUMsZ0VBQU8sSUFBSSxFQUFDLE1BQU0sRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksZ0JBQWMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUM1TCxDQUFDO0lBQ0wsZ0NBQUM7QUFBRCxDQUFDLENBOUI4QyxpRkFBa0IsR0E4QmhFOztBQUVELG1GQUFvQixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsVUFBQyxLQUFLO0lBQzVELE1BQU0sQ0FBQyxvREFBbUIsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM3RCxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7QUNuRUg7QUFBQTtJQUVJO1FBRE8sV0FBTSxHQUFtQixJQUFJLENBQUM7SUFDckIsQ0FBQztJQUNWLG1DQUFZLEdBQW5CLFVBQW9CLElBQVk7UUFDNUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNiLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ25DLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7Z0JBQUMsS0FBSyxDQUFDO1lBQ2xDLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDZCxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFDTSwrQkFBUSxHQUFmLFVBQWdCLElBQVksRUFBRSxNQUE2QjtRQUE3QixzQ0FBNkI7UUFDdkQsRUFBRSxFQUFDLENBQUMsTUFBTSxDQUFDO1lBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDakMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDMUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDeEIsQ0FBQztJQUNNLCtCQUFRLEdBQWYsVUFBZ0IsSUFBWSxFQUFFLE1BQTZCO1FBQTdCLHNDQUE2QjtRQUN2RCxFQUFFLEVBQUMsQ0FBQyxNQUFNLENBQUM7WUFBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNqQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBQ08sbUNBQVksR0FBcEIsVUFBcUIsSUFBWSxFQUFFLE1BQVc7UUFDMUMsSUFBSSxHQUFHLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMzQyxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUM7UUFDdEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQzFCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQztRQUNuQixPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzdCLElBQUksT0FBTyxHQUFHLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUM7WUFDekMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNYLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO29CQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0QyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztvQkFBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2dCQUN6QixFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2dCQUNuQyxRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztnQkFDNUIsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDSixFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztnQkFDekMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNkLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFDYixPQUFPLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztvQkFDL0MsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDbkIsS0FBSyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztnQkFDRCxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUN6RCxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDOUIsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQztvQkFBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2dCQUN0RCxRQUFRLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLENBQUM7WUFDRCxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLENBQUM7UUFDRCxHQUFHLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztRQUNyQixHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUNPLGtDQUFXLEdBQW5CLFVBQW9CLEdBQVE7UUFDeEIsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkIsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUNMLG1CQUFDO0FBQUQsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQy9EdUM7QUFDSjtBQUVFO0FBQ2E7QUFDZjtBQUNjO0FBR2xEOztHQUVHO0FBQ0g7SUFBd0MscUZBQVE7SUFjNUMsNEJBQVksSUFBWTtRQUF4QixZQUNJLGtCQUFNLElBQUksQ0FBQyxTQVVkO1FBeEJPLHlCQUFtQixHQUFxQixJQUFJLENBQUM7UUFFN0Msb0JBQWMsR0FBYyxJQUFJLDZEQUFTLENBQUMsT0FBTyxFQUFFLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBRWxHLG9CQUFjLEdBQXFCLElBQUksQ0FBQztRQUN4QywrQkFBeUIsR0FBUSxJQUFJLENBQUM7UUEwQ3RDLHNCQUFnQixHQUFZLEtBQUssQ0FBQztRQWhDdEMsSUFBSSxJQUFJLEdBQUcsS0FBSSxDQUFDO1FBQ2hCLEtBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RELEtBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFDLEtBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLEtBQUksQ0FBQztRQUMvQixLQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLEtBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0RCxLQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsS0FBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELEtBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxHQUFHLEtBQUksQ0FBQztRQUVwQyxLQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixHQUFHLFVBQVUsS0FBdUIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEVBQUMsQ0FBQyxDQUFDOztJQUNsSCxDQUFDO0lBSUQsc0JBQVcseUNBQVM7UUFIcEI7O1dBRUc7YUFDSDtZQUNJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRywwRUFBa0IsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDM0csTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDL0IsQ0FBQzs7O09BQUE7SUFJRCxzQkFBVywrQ0FBZTtRQUgxQjs7V0FFRzthQUNIO1lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlHLENBQUM7OztPQUFBO0lBQ1Msd0NBQVcsR0FBckIsVUFBc0IsR0FBUTtRQUMxQixNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxzQkFBSSw4Q0FBYzthQUFsQixjQUE2QixNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUM3RCwyQ0FBYyxHQUF4QixjQUE4QyxNQUFNLENBQUMsSUFBSSx5RUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25FLHVDQUFVLEdBQXBCO1FBQ0ksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFBQyxNQUFNLENBQUMsaUJBQU0sVUFBVSxXQUFFLENBQUM7UUFDOUQsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDN0IsQ0FBQztJQUVTLHVDQUFVLEdBQXBCLFVBQXFCLFFBQWdCO1FBQ2pDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQy9CLGlCQUFNLFVBQVUsWUFBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsQ0FBQztZQUNGLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDMUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztnQkFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7Z0JBQzdCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO29CQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM3QyxDQUFDO2dCQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7WUFDbEMsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBQ1Msd0NBQVcsR0FBckIsVUFBc0IsUUFBYTtRQUMvQixJQUFJLENBQUMseUJBQXlCLEdBQUcsUUFBUSxDQUFDO1FBQzFDLGlCQUFNLFdBQVcsWUFBQyxRQUFRLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQ1MsMENBQWEsR0FBdkIsVUFBd0IsR0FBUTtRQUM1QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUFDLE1BQU0sQ0FBQyxpQkFBTSxhQUFhLFlBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQztJQUNTLHdDQUFXLEdBQXJCLFVBQXNCLEdBQVE7UUFDMUIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFBQyxNQUFNLENBQUMsaUJBQU0sV0FBVyxZQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDUyw4Q0FBaUIsR0FBM0IsVUFBNEIsR0FBUTtRQUNoQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQzNDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztZQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDNUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7UUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFDUyw0Q0FBZSxHQUF6QixVQUEwQixHQUFRO1FBQzlCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25ELEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDZixDQUFDO0lBQ1MsNENBQWUsR0FBekIsVUFBMEIsR0FBUTtRQUM5QixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDdkIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUMvQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQztnQkFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzVDLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFLRCxzQkFBVyx1Q0FBTztRQUpsQjs7O1dBR0c7YUFDSCxjQUFtQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7YUFDL0QsVUFBbUIsUUFBb0I7WUFDbkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNuQyxDQUFDOzs7T0FKOEQ7SUFTL0Qsc0JBQVcsb0RBQW9CO1FBSi9COzs7V0FHRzthQUNILGNBQTZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzFHLFVBQWdDLEdBQVksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FESztJQUVoRyw0Q0FBZSxHQUF6QjtRQUNJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFJRCxzQkFBVyw0Q0FBWTtRQUh2Qjs7V0FFRzthQUNILGNBQW9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMzRixVQUF3QixHQUFXO1lBQy9CLEdBQUcsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDeEIsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDbkMsQ0FBQzs7O09BTjBGO0lBVTNGLHNCQUFXLHlDQUFTO1FBSHBCOztXQUVHO2FBQ0gsY0FBaUMsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDckYsVUFBcUIsR0FBVztZQUM1QixJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ25DLENBQUM7OztPQUpvRjtJQUtyRixzQkFBSSw0Q0FBWTthQUFoQixjQUF3QyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFJeEYsc0JBQVcsOENBQWM7UUFIekI7O1dBRUc7YUFDSCxjQUFzQyxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9GLFVBQTBCLEdBQVcsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBRSxDQUFDOzs7T0FERjtJQUUvRixzQkFBSSxpREFBaUI7YUFBckIsY0FBNkMsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFPbEcsc0JBQVcsOENBQWM7UUFMekI7Ozs7V0FJRzthQUNIO1lBQ0ksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQzdFLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUMvRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztvQkFDaEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2xELENBQUM7WUFDTCxDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUNwQyxDQUFDOzs7T0FBQTtJQUlELHNCQUFXLDRDQUFZO1FBSHZCOztXQUVHO2FBQ0g7WUFDSSxFQUFFLEVBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakUsQ0FBQzs7O09BQUE7SUFDUyw0Q0FBZSxHQUF6QixVQUEwQixLQUFrQixFQUFFLEdBQVE7UUFDbEQsRUFBRSxFQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQzdFLElBQUksR0FBRyxHQUFHLDZEQUFTLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUMxQyxDQUFDO0lBQ0Qsc0JBQVksNkNBQWE7YUFBekIsY0FBZ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFDM0csMkNBQWMsR0FBckIsY0FBbUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDMUMseUNBQVksR0FBbkIsY0FBaUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckMsNkNBQWdCLEdBQTFCLFVBQTJCLE1BQTBCO1FBQ2pELGlCQUFNLGdCQUFnQixZQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9CLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ2xELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDL0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ1IsSUFBSSxHQUFHLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksMkRBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDTSw0Q0FBZSxHQUF0QjtRQUNJLGlCQUFNLGVBQWUsV0FBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFDUyxvREFBdUIsR0FBakMsY0FBc0MsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVJLHlDQUFZLEdBQVo7UUFDSSxpQkFBTSxZQUFZLFdBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUNELDhDQUFpQixHQUFqQixVQUFrQixJQUFZO1FBQzFCLGlCQUFNLGlCQUFpQixZQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ08sNENBQWUsR0FBdkI7UUFDSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNwQixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3BGLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7SUFDTCxDQUFDO0lBQ08saURBQW9CLEdBQTVCLFVBQTZCLEtBQXVCO1FBQ2hELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFDRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3hGLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsVUFBVSxHQUFHLElBQUksS0FBSyxFQUFhLENBQUM7WUFDcEMsNkRBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQztRQUNqQyxFQUFFLEVBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNaLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNsRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUNYLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNoQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFDTyw0REFBK0IsR0FBdkMsVUFBd0MsR0FBUTtRQUM1QyxFQUFFLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDdkMsRUFBRSxFQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNiLEdBQUcsRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztnQkFDbEMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUNmLENBQUM7UUFDRCxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUNoRSxDQUFDO0lBQ08sNERBQStCLEdBQXZDLFVBQXdDLEdBQVE7UUFDNUMsRUFBRSxFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3ZDLEVBQUUsRUFBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDYixHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEUsRUFBRSxFQUFDLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDeEQsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pDLENBQUM7WUFDTCxDQUFDO1lBQ0QsTUFBTSxDQUFDLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBQyxDQUFDO1FBQ3hCLENBQUM7UUFDRCxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQy9FLE1BQU0sQ0FBQyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsQ0FBQztJQUMxQixDQUFDO0lBQ08sb0RBQXVCLEdBQS9CO1FBQ0ksRUFBRSxFQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUNsQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNPLCtDQUFrQixHQUExQixVQUEyQixLQUF1QjtRQUM5QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVDLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEQsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RELEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFDTyxzQ0FBUyxHQUFqQixVQUFrQixLQUF1QixFQUFFLElBQVk7UUFDbkQsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM1QixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUN0QyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDckMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUNPLDJDQUFjLEdBQXRCLFVBQXVCLEtBQXVCO1FBQzFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDcEIsQ0FBQztRQUNELE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUNELDhDQUFpQixHQUFqQjtRQUNJLGlCQUFNLGlCQUFpQixXQUFFLENBQUM7UUFDMUIsRUFBRSxFQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLENBQUM7SUFDTCxDQUFDO0lBQ0wseUJBQUM7QUFBRCxDQUFDLENBNVJ1QywyREFBUSxHQTRSL0M7O0FBQ0Q7O0dBRUc7QUFDSDtJQUEwQyx1RkFBa0I7SUFHeEQsOEJBQW1CLElBQVk7UUFBL0IsWUFDSSxrQkFBTSxJQUFJLENBQUMsU0FDZDtRQUZrQixVQUFJLEdBQUosSUFBSSxDQUFRO1FBRnZCLG1CQUFhLEdBQVcsQ0FBQyxDQUFDOztJQUlsQyxDQUFDO0lBSUQsc0JBQVcsMENBQVE7UUFIbkI7O1dBRUc7YUFDSCxjQUFnQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7YUFDNUQsVUFBb0IsS0FBYTtZQUM3QixFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQ25DLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDcEQsQ0FBQzs7O09BTDJEO0lBTWhFLDJCQUFDO0FBQUQsQ0FBQyxDQWZ5QyxrQkFBa0IsR0FlM0Q7O0FBQ0QsK0RBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLG9CQUFvQixFQUFFLGtCQUFrQjtJQUNoRixFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxHQUFRLElBQUksTUFBTSxDQUFDLDZEQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsVUFBVSxHQUFRLEVBQUUsS0FBVSxJQUFJLEdBQUcsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFDO0lBQy9LLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFO0lBQ3JGLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsVUFBVSxHQUFRLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLFVBQVUsR0FBUSxFQUFFLEtBQVUsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUN6TixFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsbUJBQW1CLEVBQUM7SUFDbEksRUFBRSxJQUFJLEVBQUUsOEJBQThCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBRS9FLCtEQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDOzs7Ozs7Ozs7QUNuVXRJO0FBQUE7SUFBQTtJQUdBLENBQUM7SUFBRCwyQkFBQztBQUFELENBQUM7O0FBRUQ7SUFJSTtRQUhRLCtCQUEwQixHQUFhLEtBQUssQ0FBQztJQUdyQyxDQUFDO0lBQ1Ysa0NBQU8sR0FBZCxVQUFlLElBQVksRUFBRSxrQkFBbUM7UUFBbkMsK0RBQW1DO1FBQzVELElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7UUFDdkMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDakMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDekMsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQUMsUUFBUSxDQUFDO1lBQ3pDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQztnQkFDeEMsUUFBUSxDQUFDO1lBQ2IsQ0FBQztZQUNELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLENBQUM7WUFDckQsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO1lBQzdDLENBQUM7WUFDRCxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNELHNCQUFXLG1EQUFxQjthQUFoQyxjQUFxQyxNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFDdEUsbUNBQVEsR0FBaEIsVUFBaUIsSUFBWTtRQUN6QixJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDZixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3pCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ1osR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM5QixFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2IsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQztnQkFBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNaLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2IsSUFBSSxJQUFJLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO29CQUN0QyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztvQkFDbkIsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7b0JBQ2IsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckIsQ0FBQztnQkFDRCxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDZixDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUNPLGtDQUFPLEdBQWYsVUFBZ0IsSUFBWTtRQUN4QixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUNsQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFDTyx5Q0FBYyxHQUF0QixVQUF1QixJQUFZO1FBQy9CLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUN4QixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNuQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakIsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUMxRCxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ0wsdUJBQUM7QUFBRCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaEV1QztBQUNnSTtBQUV2STtBQUNtQjtBQUNDO0FBQ0g7QUFFQztBQUVmO0FBRVU7QUFDSjtBQUUxQzs7R0FFRztBQUNIO0lBQWlDLDhFQUFJO0lBb1VqQyxxQkFBWSxPQUFtQjtRQUFuQix3Q0FBbUI7UUFBL0IsWUFDSSxpQkFBTyxTQWdDVjtRQXhWTyxzQkFBZ0IsR0FBYyxJQUFJLENBQUM7UUFDbkMsZ0JBQVUsR0FBbUIsRUFBRSxDQUFDO1FBQ2hDLG1CQUFhLEdBQW1CLEVBQUUsQ0FBQztRQUVuQyxpQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUV6QixpQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3Qix1QkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkMsZUFBUyxHQUFZLEtBQUssQ0FBQztRQUMzQix5QkFBbUIsR0FBbUIsRUFBRSxDQUFDO1FBRXpDLHlCQUFtQixHQUFXLEVBQUUsQ0FBQztRQUNqQyw2QkFBdUIsR0FBVyxFQUFFLENBQUM7UUFFckMsb0JBQWMsR0FBWSxLQUFLLENBQUM7UUFDeEM7Ozs7Ozs7Ozs7O1dBV0c7UUFDSSxnQkFBVSxHQUEyRCxJQUFJLG9EQUFLLEVBQW1ELENBQUM7UUFDekk7Ozs7V0FJRztRQUNJLG1CQUFhLEdBQTZDLElBQUksb0RBQUssRUFBcUMsQ0FBQztRQUNoSDs7Ozs7Ozs7OztXQVVHO1FBQ0ksMEJBQW9CLEdBQTJELElBQUksb0RBQUssRUFBbUQsQ0FBQztRQUNuSjs7Ozs7OztXQU9HO1FBQ0ksb0JBQWMsR0FBMkQsSUFBSSxvREFBSyxFQUFtRCxDQUFDO1FBQzdJOzs7Ozs7OztXQVFHO1FBQ0ksc0JBQWdCLEdBQTJELElBQUksb0RBQUssRUFBbUQsQ0FBQztRQUMvSTs7Ozs7OztXQU9HO1FBQ0ksMEJBQW9CLEdBQTJELElBQUksb0RBQUssRUFBbUQsQ0FBQztRQUNuSjs7Ozs7OztXQU9HO1FBQ0ksMkJBQXFCLEdBQTJELElBQUksb0RBQUssRUFBbUQsQ0FBQztRQUNwSjs7Ozs7Ozs7OztXQVVHO1FBQ0kscUJBQWUsR0FBMkQsSUFBSSxvREFBSyxFQUFtRCxDQUFDO1FBQzlJOzs7Ozs7V0FNRztRQUNJLHVCQUFpQixHQUEyRCxJQUFJLG9EQUFLLEVBQW1ELENBQUM7UUFDaEo7Ozs7Ozs7OztXQVNHO1FBQ0ksa0JBQVksR0FBMkQsSUFBSSxvREFBSyxFQUFtRCxDQUFDO1FBQzNJOzs7Ozs7V0FNRztRQUNJLG9CQUFjLEdBQTJELElBQUksb0RBQUssRUFBbUQsQ0FBQztRQUM3STs7Ozs7V0FLRztRQUNJLGlCQUFXLEdBQTJELElBQUksb0RBQUssRUFBbUQsQ0FBQztRQUMxSTs7Ozs7OztXQU9HO1FBQ0ksd0JBQWtCLEdBQTJELElBQUksb0RBQUssRUFBbUQsQ0FBQztRQVNqSjs7Ozs7OztXQU9HO1FBQ0ksbUJBQWEsR0FBMkQsSUFBSSxvREFBSyxFQUFtRCxDQUFDO1FBQzVJOzs7OztXQUtHO1FBQ0ksb0JBQWMsR0FBMkQsSUFBSSxvREFBSyxFQUFtRCxDQUFDO1FBQzdJOzs7OztXQUtHO1FBQ0ksa0JBQVksR0FBMkQsSUFBSSxvREFBSyxFQUFtRCxDQUFDO1FBQzNJOzs7Ozs7OztXQVFHO1FBQ0ksaUJBQVcsR0FBMkQsSUFBSSxvREFBSyxFQUFtRCxDQUFDO1FBQzFJOzs7Ozs7OztXQVFHO1FBQ0ksa0JBQVksR0FBMkQsSUFBSSxvREFBSyxFQUFtRCxDQUFDO1FBQzNJOzs7Ozs7V0FNRztRQUNJLGdDQUEwQixHQUEyRCxJQUFJLG9EQUFLLEVBQW1ELENBQUM7UUFDeko7Ozs7V0FJRztRQUNJLHlCQUFtQixHQUEyRCxJQUFJLG9EQUFLLEVBQW1ELENBQUM7UUFDbEo7Ozs7O1dBS0c7UUFDSSx1QkFBaUIsR0FBMkQsSUFBSSxvREFBSyxFQUFtRCxDQUFDO1FBQ2hKOzs7OztXQUtHO1FBQ0ksMkJBQXFCLEdBQTJELElBQUksb0RBQUssRUFBbUQsQ0FBQztRQUNwSjs7Ozs7V0FLRztRQUNJLHdCQUFrQixHQUEyRCxJQUFJLG9EQUFLLEVBQW1ELENBQUM7UUFDako7Ozs7OztXQU1HO1FBQ0ksc0JBQWdCLEdBQTJELElBQUksb0RBQUssRUFBbUQsQ0FBQztRQUMvSTs7Ozs7Ozs7V0FRRztRQUNJLHdCQUFrQixHQUEyRCxJQUFJLG9EQUFLLEVBQW1ELENBQUM7UUFDako7Ozs7Ozs7Ozs7OztXQVlHO1FBQ0kseUJBQW1CLEdBQTJELElBQUksb0RBQUssRUFBbUQsQ0FBQztRQUNsSjs7Ozs7Ozs7Ozs7V0FXRztRQUNJLDZCQUF1QixHQUEyRCxJQUFJLG9EQUFLLEVBQW1ELENBQUM7UUFDdEo7Ozs7Ozs7Ozs7V0FVRztRQUNJLDhCQUF3QixHQUEyRCxJQUFJLG9EQUFLLEVBQW1ELENBQUM7UUFDdko7Ozs7Ozs7Ozs7V0FVRztRQUNJLDBCQUFvQixHQUEyRCxJQUFJLG9EQUFLLEVBQW1ELENBQUM7UUFDbko7Ozs7O1dBS0c7UUFDSSxhQUFPLEdBQTZDLElBQUksb0RBQUssRUFBcUMsQ0FBQztRQUMxRzs7O1dBR0c7UUFDSSwwQkFBb0IsR0FBMkQsSUFBSSxvREFBSyxFQUFtRCxDQUFDO1FBQ25KOzs7V0FHRztRQUNJLGdCQUFVLEdBQXFCLElBQUksQ0FBQztRQTQ4Q25DLGVBQVMsR0FBRyxJQUFJLENBQUM7UUF4OENyQixJQUFJLElBQUksR0FBRyxLQUFJLENBQUM7UUFDaEIsSUFBSSxhQUFhLEdBQUcsS0FBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sRUFBRSxLQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdEUsYUFBYSxDQUFDLHNCQUFzQixHQUFHLFVBQVMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLEVBQUUsS0FBSSxDQUFDLENBQUM7UUFDcEQsS0FBSSxDQUFDLHVCQUF1QixDQUFDLHFCQUFxQixFQUFFLEtBQUksQ0FBQyxDQUFDO1FBQzFELEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLEVBQUUsS0FBSSxDQUFDLENBQUM7UUFDbEQsS0FBSSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsRUFBRSxLQUFJLENBQUMsQ0FBQztRQUMvQyxLQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxFQUFFLEtBQUksQ0FBQyxDQUFDO1FBQy9DLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLEVBQUUsS0FBSSxDQUFDLENBQUM7UUFDL0MsS0FBSSxDQUFDLHVCQUF1QixDQUFDLHVCQUF1QixFQUFFLEtBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVsRSxLQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSwyRUFBZ0IsRUFBRSxDQUFDO1FBQy9DLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEdBQUcsVUFBVSxJQUFZLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLFVBQVUsSUFBWSxFQUFFLGtCQUEyQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEosS0FBSSxDQUFDLFVBQVUsR0FBRyxLQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxVQUFTLEtBQUssSUFBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUYsS0FBSSxDQUFDLGFBQWEsR0FBRyxLQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxVQUFTLEtBQUssSUFBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0YsS0FBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDakMsS0FBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNWLEVBQUUsQ0FBQyxDQUFDLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxPQUFPLFlBQVksTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDM0QsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBaUIsQ0FBQyxDQUFDO1lBQzVDLENBQUM7WUFDRCxFQUFFLEVBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixLQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDckMsQ0FBQztZQUNELEtBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUIsRUFBRSxDQUFDLENBQUMsS0FBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hCLEtBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFJLENBQUMsUUFBUSxFQUFFLEtBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3RCxDQUFDO1FBQ0wsQ0FBQztRQUNELEtBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzs7SUFDdEIsQ0FBQztJQWxXRCxzQkFBVyxxQ0FBWTthQUF2QixjQUFvQyxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBS2xFLHNCQUFXLHNDQUFhO1FBSnhCOzs7V0FHRzthQUNILGNBQXFDLE1BQU0sQ0FBRSxtREFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7YUFDbEUsVUFBeUIsR0FBVyxJQUFHLG1EQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7OztPQURBO0lBOFYzRCw2QkFBTyxHQUFkLGNBQTJCLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBTTdDLHNCQUFXLDhCQUFLO1FBTGhCOzs7O1dBSUc7YUFDSCxjQUF1QyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBS2hFLHNCQUFXLGlDQUFRO1FBSm5COzs7V0FHRzthQUNILGNBQThDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQzthQUMxRSxVQUFvQixHQUF5QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FEaEI7SUFNMUUsc0JBQVcsaUNBQVE7UUFKbkI7OztXQUdHO2FBQ0gsY0FBZ0MsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9FLFVBQW9CLEdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREc7SUFPL0Usc0JBQVcscUNBQVk7UUFMdkI7Ozs7V0FJRzthQUNILGNBQW9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN2RixVQUF3QixHQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURHO0lBS3ZGLHNCQUFXLGlDQUFRO1FBSG5COztXQUVHO2FBQ0gsY0FBZ0MsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9FLFVBQW9CLEdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREc7SUFLL0Usc0JBQVcsbUNBQVU7UUFIckI7O1dBRUc7YUFDSCxjQUFrQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbkYsVUFBc0IsR0FBVyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FERztJQU9uRixzQkFBVyw2Q0FBb0I7UUFML0I7Ozs7V0FJRzthQUNILGNBQTZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzNHLFVBQWdDLEdBQVksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FETTtJQU0zRyxzQkFBVyw2Q0FBb0I7UUFKL0I7OztXQUdHO2FBQ0gsY0FBNkMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDM0csVUFBZ0MsR0FBWSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURNO0lBSzNHLHNCQUFXLG9EQUEyQjtRQUh0Qzs7V0FFRzthQUNILGNBQW9ELE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsNkJBQTZCLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hILFVBQXVDLEdBQVksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FESztJQU94SCxzQkFBVyw4Q0FBcUI7UUFMaEM7Ozs7V0FJRzthQUNILGNBQThDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzVHLFVBQWlDLEdBQVksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FESztJQU01RyxzQkFBVyx1Q0FBYztRQUp6Qjs7O1dBR0c7YUFDSCxjQUF1QyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM5RixVQUEwQixHQUFZLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREs7SUFNOUYsc0JBQVcsa0NBQVM7UUFKcEI7OztXQUdHO2FBQ0gsY0FBa0MsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3BGLFVBQXFCLEdBQVksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREs7SUFNcEYsc0JBQVcsdUNBQWM7UUFKekI7OztXQUdHO2FBQ0gsY0FBdUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDOUYsVUFBMEIsR0FBWSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURLO0lBTzlGLHNCQUFXLDBDQUFpQjtRQUw1Qjs7OztXQUlHO2FBQ0gsY0FBMEMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDcEcsVUFBNkIsR0FBWSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURLO0lBTXBHLHNCQUFXLHFDQUFZO1FBSnZCOzs7V0FHRzthQUNILGNBQW9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN4RixVQUF3QixHQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURJO0lBT3hGLHNCQUFXLDJDQUFrQjtRQUw3Qjs7OztXQUlHO2FBQ0gsY0FBMEMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbkcsVUFBOEIsR0FBVyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURHO0lBQ0gsQ0FBQztJQUtqRyxzQkFBVyw2Q0FBb0I7UUFKL0I7OztXQUdHO2FBQ0gsY0FBNkMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDMUcsVUFBZ0MsR0FBWSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURLO0lBTTFHLHNCQUFXLDRDQUFtQjtRQUo5Qjs7O1dBR0c7YUFDSCxjQUE0QyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN6RyxVQUErQixHQUFZLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BRE07SUFTekcsc0JBQVcsNkNBQW9CO1FBUC9COzs7Ozs7V0FNRzthQUNILGNBQXlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hHLFVBQWdDLEdBQVE7WUFDcEMsRUFBRSxFQUFDLEdBQUcsS0FBSyxJQUFJLENBQUM7Z0JBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQztZQUNwQyxFQUFFLEVBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQztnQkFBQyxHQUFHLEdBQUcsTUFBTSxDQUFDO1lBQy9CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN2RCxDQUFDOzs7T0FMdUc7SUFVeEcsc0JBQVcsK0JBQU07UUFIakI7O1dBRUc7YUFDSCxjQUE4QixNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7YUFDeEQsVUFBa0IsS0FBYTtZQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLDBFQUFrQixDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDekMsR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNwQyxDQUFDO1FBQ0wsQ0FBQzs7O09BUnVEO0lBU3hELG1CQUFtQjtJQUNuQiwrQkFBUyxHQUFULGNBQWMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzVCLHFDQUFlLEdBQXRCLFVBQXVCLElBQVk7UUFDL0IsSUFBSSxPQUFPLEdBQUcsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUM7UUFDdEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFDRCxrQ0FBWSxHQUFaLFVBQWEsR0FBVyxJQUFJLE1BQU0sQ0FBQywwRUFBa0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBSXZFLHNCQUFXLHdDQUFlO1FBSDFCOztXQUVHO2FBQ0gsY0FBdUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUlqRixzQkFBVyw4QkFBSztRQUhoQjs7V0FFRzthQUNILGNBQTZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzdFLFVBQWlCLEtBQWEsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREw7SUFFN0Usc0JBQUksaUNBQVE7YUFBWixjQUFvQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFNaEYsc0JBQVcsc0NBQWE7UUFMeEI7Ozs7V0FJRzthQUNILGNBQXFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBQzthQUM1RixVQUF5QixLQUFhLElBQUksSUFBSSxDQUFDLHdCQUF3QixDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFDOzs7T0FETDtJQUU1RixzQkFBSSx5Q0FBZ0I7YUFBcEIsY0FBNEMsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBTWhHLHNCQUFXLDRDQUFtQjtRQUw5Qjs7OztXQUlHO2FBQ0gsY0FBMkMsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUM7YUFDeEcsVUFBK0IsS0FBYSxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFDOzs7T0FETDtJQUV4RyxzQkFBSSwrQ0FBc0I7YUFBMUIsY0FBa0QsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUM7OztPQUFBO0lBTTNHLHNCQUFXLG9DQUFXO1FBTHRCOzs7O1dBSUc7YUFDSCxjQUFtQyxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUM7YUFDeEYsVUFBdUIsS0FBYSxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBQzs7O09BREw7SUFFeEYsc0JBQUksdUNBQWM7YUFBbEIsY0FBMEMsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFDOzs7T0FBQTtJQUszRixzQkFBVyxxQ0FBWTtRQUp2Qjs7O1dBR0c7YUFDSCxjQUFvQyxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzFILFVBQXdCLFFBQWdCLElBQUksSUFBSSxDQUFDLHdCQUF3QixDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQUR3QjtJQUUxSCxzQkFBSSx3Q0FBZTthQUFuQixjQUEyQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUM7OztPQUFBO0lBS3pGLHNCQUFXLHFDQUFZO1FBSnZCOzs7V0FHRzthQUNILGNBQW9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDMUgsVUFBd0IsUUFBZ0IsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BRHdCO0lBRTFILHNCQUFJLHdDQUFlO2FBQW5CLGNBQTJDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBQzs7O09BQUE7SUFLekYsc0JBQVcscUNBQVk7UUFKdkI7OztXQUdHO2FBQ0gsY0FBb0MsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMxSCxVQUF3QixRQUFnQixJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLEVBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FEdUI7SUFFMUgsc0JBQUksd0NBQWU7YUFBbkIsY0FBMkMsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBRSxFQUFDOzs7T0FBQTtJQUsxRixzQkFBVyw4Q0FBcUI7UUFKaEM7OztXQUdHO2FBQ0gsY0FBNkMsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLEVBQUM7YUFDNUcsVUFBaUMsS0FBYSxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFDOzs7T0FETDtJQUU1Rzs7OztPQUlHO0lBQ0ksOENBQXdCLEdBQS9CLGNBQTRDLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUM5RixzQkFBSSxpREFBd0I7YUFBNUIsY0FBb0QsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFLaEgsc0JBQVcsd0NBQWU7UUFIMUI7O1dBRUc7YUFDSCxjQUF3QyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNqRyxVQUEyQixLQUFjO1lBQ3JDLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsZUFBZSxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUMzQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDaEMsQ0FBQzs7O09BTGdHO0lBU2pHLHNCQUFXLDRDQUFtQjtRQUg5Qjs7V0FFRzthQUNILGNBQTJDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3ZHLFVBQStCLEtBQWE7WUFDeEMsS0FBSyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QixLQUFLLEdBQUcsQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLEdBQUcsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUNoRCxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLG1CQUFtQixDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUMvQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDaEMsQ0FBQzs7O09BUHNHO0lBQUEsQ0FBQztJQU92RyxDQUFDO0lBSUYsc0JBQVcsd0NBQWU7UUFIMUI7O1dBRUc7YUFDSCxjQUF1QyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoRyxVQUEyQixRQUFnQjtZQUN6QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDbkUsQ0FBQzs7O09BSCtGO0lBT2hHLHNCQUFXLHVDQUFjO1FBSHpCOztXQUVHO2FBQ0gsY0FBOEIsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUt4RixzQkFBVyw4Q0FBcUI7UUFKaEM7OztXQUdHO2FBQ0gsY0FBNkMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDNUcsVUFBaUMsS0FBYTtZQUMxQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDeEUsQ0FBQzs7O09BSDJHO0lBQUEsQ0FBQztJQUc1RyxDQUFDO0lBSUYsc0JBQVcsOENBQXFCO1FBSGhDOztXQUVHO2FBQ0gsY0FBNkMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDNUcsVUFBaUMsS0FBYTtZQUMxQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDeEUsQ0FBQzs7O09BSDJHO0lBQUEsQ0FBQztJQUc1RyxDQUFDO0lBSUYsc0JBQVcsNkJBQUk7UUFIZjs7V0FFRzthQUNILGNBQTRCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMzRSxVQUFnQixLQUFhO1lBQ3pCLEtBQUssR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDNUIsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQy9CLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxNQUFNLElBQUksS0FBSyxJQUFJLFNBQVMsQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDbEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7WUFDcEMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZDLEdBQUcsRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztnQkFDeEMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDckMsQ0FBQztRQUNMLENBQUM7OztPQVYwRTtJQWdCM0Usc0JBQVcsNkJBQUk7UUFMZjs7OztXQUlHO2FBQ0g7WUFDSSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDaEIsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7WUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ2xCLENBQUM7YUFFRCxVQUFnQixJQUFTO1lBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ1AsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUN2RCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQzFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDL0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQztvQkFDMUQsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQztZQUNELElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixDQUFDOzs7T0FmQTtJQUNELGtDQUFZLEdBQVosY0FBdUIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBZWhDLHNDQUFnQixHQUExQixVQUEyQixVQUFlLEVBQUUsR0FBVyxFQUFFLEtBQVU7UUFDL0QsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBS0Qsc0JBQVcsaUNBQVE7UUFKbkI7OztXQUdHO2FBQ0g7WUFDSSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDaEIsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzlCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3RDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QyxDQUFDO1lBQ0wsQ0FBQztZQUNELE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDbEIsQ0FBQzs7O09BQUE7SUFPRCxzQkFBVyxxQ0FBWTtRQU52Qjs7Ozs7V0FLRzthQUNIO1lBQ0ksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUN6QyxJQUFJLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBYSxDQUFDO1lBQ3BDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDekMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0IsQ0FBQztZQUNMLENBQUM7WUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ2xCLENBQUM7OztPQUFBO0lBSUQsc0JBQVcsZ0NBQU87UUFIbEI7O1dBRUc7YUFDSCxjQUFnQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFJaEUsc0JBQUksa0NBQVM7UUFIYjs7V0FFRzthQUNILGNBQTBCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFNbEQsc0JBQVcsa0NBQVM7UUFMcEI7Ozs7V0FJRzthQUNIO1lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzdCLENBQUM7OztPQUFBO0lBTUQsc0JBQVcseUNBQWdCO1FBTDNCOzs7O1dBSUc7YUFDSDtZQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUNwQyxDQUFDOzs7T0FBQTtJQUlELHNCQUFXLG9DQUFXO1FBSHRCOztXQUVHO2FBQ0g7WUFDSSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQy9CLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzVDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUM1QixDQUFDO1lBQ0wsQ0FBQztZQUNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQyxDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUNqQyxDQUFDO2FBQ0QsVUFBdUIsS0FBZ0I7WUFDbkMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUMvQixFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUN2RCxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUMzQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7WUFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztZQUM5QixFQUFFLEVBQUMsS0FBSyxDQUFDO2dCQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDN0MsQ0FBQzs7O09BVEE7SUFhRCxzQkFBVyxzQ0FBYTtRQUh4Qjs7V0FFRzthQUNIO1lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN2RCxDQUFDO2FBQ0QsVUFBeUIsS0FBYTtZQUNsQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQy9CLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUMzRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsQ0FBQzs7O09BTEE7SUFNRDs7T0FFRztJQUNJLHdDQUFrQixHQUF6QjtRQUNJLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDNUIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNQLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM5QixDQUFDO0lBQ0wsQ0FBQztJQUNELDZDQUF1QixHQUF2QjtRQUNJLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDNUIsRUFBRSxFQUFDLENBQUMsSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixFQUFFLEVBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM5QixDQUFDO0lBQ0wsQ0FBQztJQUlELHNCQUFXLDhCQUFLO1FBSGhCOztXQUVHO2FBQ0g7WUFDSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDckMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQ3pDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztnQkFBQyxNQUFNLENBQUMsaUJBQWlCLENBQUM7WUFDckQsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFNBQVMsR0FBRyxPQUFPO1FBQ25ELENBQUM7OztPQUFBO0lBQ0Qsc0JBQVcsdUNBQWM7YUFBekIsY0FBcUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBQ3ZFLHNCQUFJLDJDQUFrQjthQUF0QixjQUFtQyxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFDL0QsdUNBQWlCLEdBQTNCLFVBQTRCLEtBQWEsRUFBRSxJQUFZO1FBQ25ELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsRUFBRSxFQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNQLEVBQUUsRUFBQyxLQUFLLElBQUksUUFBUSxDQUFDO2dCQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzdELEVBQUUsRUFBQyxLQUFLLElBQUksT0FBTyxDQUFDO2dCQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDakUsRUFBRSxFQUFDLEtBQUssSUFBSSxTQUFTLENBQUM7Z0JBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQztJQUN4QyxDQUFDO0lBQ0Q7Ozs7Ozs7T0FPRztJQUNJLDJCQUFLLEdBQVosVUFBYSxTQUF5QixFQUFFLGFBQTZCO1FBQXhELDRDQUF5QjtRQUFFLG9EQUE2QjtRQUNqRSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ1osSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDakIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsRUFBRSxDQUFDLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxDQUFDO0lBQ0wsQ0FBQztJQUNTLGlDQUFXLEdBQXJCLFVBQXNCLEdBQVEsRUFBRSxJQUFTO1FBQ3JDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQzFCLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbEIsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ0osSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUN0QixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFDUyx5Q0FBbUIsR0FBN0IsVUFBOEIsSUFBZTtRQUN6QyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUNsQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBQ1Msd0NBQWtCLEdBQTVCLFVBQTZCLFFBQW1CLEVBQUUsUUFBbUI7UUFDakUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBQ0Q7O09BRUc7SUFDSSxpQ0FBVyxHQUFsQjtRQUNJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN2QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFJRCxzQkFBVyxtREFBMEI7UUFIckM7O1dBRUc7YUFDSDtZQUNJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNwQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQzVCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQywyQkFBMkIsSUFBSSxNQUFNO2dCQUM3QyxDQUFDLElBQUksQ0FBQywyQkFBMkIsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDbkYsQ0FBQzs7O09BQUE7SUFLRCxzQkFBVyxtQ0FBVTtRQUpyQjs7O1dBR0c7YUFDSCxjQUFtQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUtoRSxzQkFBVyxzQ0FBYTtRQUp4Qjs7O1dBR0c7YUFDSCxjQUFzQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUt0RSxzQkFBVyxxQ0FBWTtRQUp2Qjs7O1dBR0c7YUFDSCxjQUFxQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBQzNGOzs7T0FHRztJQUNJLG1DQUFhLEdBQXBCLFVBQXFCLEtBQWM7UUFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBUUQsc0JBQVcsa0NBQVM7UUFQcEI7Ozs7OztXQU1HO2FBQ0g7WUFDSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNuQyxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7OztPQUFBO0lBQ0Q7Ozs7O09BS0c7SUFDSSwrQkFBUyxHQUFoQjtRQUNJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUM3QixRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsMkNBQTJDLENBQUM7SUFDcEYsQ0FBQztJQUNEOzs7OztPQUtHO0lBQ0ksa0NBQVksR0FBbkI7UUFDSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDN0IsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUM3QyxDQUFDO0lBQ0Q7Ozs7O09BS0c7SUFDSSw4QkFBUSxHQUFmO1FBQ0ksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDbEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2pFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUM1QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQixDQUFDO0lBS0Qsc0JBQVcsK0NBQXNCO1FBSmpDOzs7V0FHRzthQUNIO1lBQ0ksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUM7Z0JBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xELENBQUM7OztPQUFBO0lBQ0Q7OztPQUdHO0lBQ0ksOEJBQVEsR0FBZjtRQUNJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ25DLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDL0IsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDRDs7Ozs7T0FLRztJQUNJLHNDQUFnQixHQUF2QjtRQUNJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNqRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDNUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUlELHNCQUFXLG9DQUFXO1FBSHRCOztXQUVHO2FBQ0g7WUFDSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQztnQkFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVELENBQUM7OztPQUFBO0lBQ0Qsc0JBQVcseUNBQWdCO2FBQTNCO1lBQ0ksRUFBRSxFQUFDLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDMUQsRUFBRSxFQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDMUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELENBQUM7OztPQUFBO0lBSUQsc0JBQVcsbUNBQVU7UUFIckI7O1dBRUc7YUFDSDtZQUNJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDMUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUMvQixNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDakUsQ0FBQzs7O09BQUE7SUFDRDs7Ozs7OztPQU9HO0lBQ0ksZ0NBQVUsR0FBakI7UUFDSSxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLGlCQUFpQixHQUFHO1lBQ3BCLGNBQWMsRUFBRSxVQUFTLElBQVksSUFBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUM7WUFDaEYsbUJBQW1CLEVBQUUsVUFBUyxJQUFZLElBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFDO1lBQ3BGLHFCQUFxQixFQUFFLFVBQVMsSUFBWSxJQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBQztZQUN4RixtQkFBbUIsRUFBRSxVQUFTLElBQVksSUFBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUM7U0FDaEYsQ0FBQztRQUNGLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlDLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QixDQUFDO0lBQ0wsQ0FBQztJQUtELHNCQUFXLDZDQUFvQjtRQUovQjs7O1dBR0c7YUFDSCxjQUE2QyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFDbkcsNkNBQXVCLEdBQS9CLFVBQWdDLEdBQVk7UUFDeEMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUM3QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7SUFDekMsQ0FBQztJQUNTLG1EQUE2QixHQUF2QyxjQUE0QyxDQUFDO0lBQ25DLHdDQUFrQixHQUE1QjtRQUNJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNsRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsSUFBSSxPQUFPLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUcsY0FBYyxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN6SCxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3pELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztnQkFBQyxRQUFRLENBQUM7WUFDaEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN2RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ08sOENBQXdCLEdBQWhDLFVBQWlDLE9BQVk7UUFDekMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUN4QyxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQzFCLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN0QixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNqQixHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM1QyxFQUFFLENBQUMsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDakMsU0FBUyxHQUFHLElBQUksQ0FBQztvQkFDakIsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksMkRBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEUsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdkMsSUFBSTtnQkFBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0IsQ0FBQztJQUNMLENBQUM7SUFDUyxnQ0FBVSxHQUFwQjtRQUNJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUNELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDL0IsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDUyxrQ0FBWSxHQUF0QjtRQUNJLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQzVCLENBQUM7SUFLRCxzQkFBVywrQ0FBc0I7UUFKakM7OztXQUdHO2FBQ0g7WUFDSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFDRCxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDcEUsQ0FBQzs7O09BQUE7SUFLRCxzQkFBVyxxREFBNEI7UUFKdkM7OztXQUdHO2FBQ0g7WUFDSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUN0RCxDQUFDO1lBQ0QsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsT0FBTyxDQUFDO1FBQzFFLENBQUM7OztPQUFBO0lBSUQsc0JBQVcsNkNBQW9CO1FBSC9COztXQUVHO2FBQ0g7WUFDSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzlDLENBQUM7WUFDRCxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBQ2pFLENBQUM7OztPQUFBO0lBSUQsc0JBQVcscUNBQVk7UUFIdkI7O1dBRUc7YUFDSDtZQUNJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDeEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUMvQixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakQsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3RSxDQUFDOzs7T0FBQTtJQUNTLHVDQUFpQixHQUEzQixVQUE0QixXQUFXO1FBQ25DLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBQ0QsOENBQXdCLEdBQXhCLFVBQXlCLFFBQW1CLEVBQUUsVUFBZTtRQUN6RCxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUNELHFDQUFlLEdBQWYsVUFBZ0IsV0FBVztRQUN2QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQzNDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUNELHlDQUFtQixHQUFuQixVQUFvQixRQUFtQixFQUFFLFdBQVc7UUFDaEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFDRCxzQ0FBZ0IsR0FBaEIsVUFBaUIsS0FBZSxFQUFFLFdBQVc7UUFDekMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFDRCxvQ0FBYyxHQUFkLFVBQWUsUUFBbUI7UUFDOUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQ0Qsc0NBQWdCLEdBQWhCLFVBQWlCLFFBQW1CLEVBQUUsUUFBZ0IsRUFBRSxHQUFRO1FBQzVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFDRCx1Q0FBaUIsR0FBakIsVUFBa0IsUUFBbUIsRUFBRSxPQUFZO1FBQy9DLE9BQU8sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQzVCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDRCwyQ0FBcUIsR0FBckIsVUFBc0IsUUFBbUIsRUFBRSxPQUFZO1FBQ25ELE9BQU8sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQzVCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRCw0Q0FBc0IsR0FBdEIsVUFBdUIsUUFBbUIsRUFBRSxPQUFZO1FBQ3BELE9BQU8sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQzVCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDRCx3Q0FBa0IsR0FBbEIsVUFBbUIsUUFBbUIsRUFBRSxPQUFZO1FBQ2hELE9BQU8sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQzVCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksMkRBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2pFLENBQUM7SUFDRDs7Ozs7O09BTUc7SUFDSSxnQ0FBVSxHQUFqQixVQUFrQixJQUFZLEVBQUUsSUFBVSxFQUFFLGVBQXdCLEVBQUUsaUJBQXdDO1FBQzFHLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDekUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFDUyx5Q0FBbUIsR0FBN0I7UUFDSSxNQUFNLENBQUMsSUFBSSx5RUFBZSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUNTLG9DQUFjLEdBQXhCLFVBQXlCLElBQVksRUFBRSxJQUFVLEVBQUUsaUJBQTBDO1FBQ3pGLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztZQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxVQUFVLE9BQWdCLEVBQUUsUUFBYTtZQUNsRyxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztnQkFBQyxpQkFBaUIsQ0FBQyxPQUFPLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1lBQ3hFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ1YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDbEMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUNELDZCQUFPLEdBQVAsVUFBUSxLQUFhO1FBQ2pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRDs7OztPQUlHO0lBQ0ksNkJBQU8sR0FBZCxVQUFlLElBQWU7UUFDMUIsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLGdDQUFVLEdBQWpCLFVBQWtCLElBQW1CO1FBQW5CLGtDQUFtQjtRQUNqQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksZ0NBQVUsR0FBakIsVUFBa0IsSUFBZTtRQUM3QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNwRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSx1Q0FBaUIsR0FBeEIsVUFBeUIsSUFBWSxFQUFFLGVBQWdDO1FBQWhDLHlEQUFnQztRQUNuRSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkMsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDO1lBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNoRCxJQUFJLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3JDLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQztnQkFBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQy9ELEVBQUUsRUFBQyxZQUFZLElBQUksSUFBSSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSx5Q0FBbUIsR0FBMUIsVUFBMkIsS0FBZSxFQUFFLGVBQWdDO1FBQWhDLHlEQUFnQztRQUN4RSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzFCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFDLFFBQVEsQ0FBQztZQUN4QixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ2pFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFDRDs7O09BR0c7SUFDSSxzQ0FBZ0IsR0FBdkIsVUFBd0IsT0FBaUI7UUFDckMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2pELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsRUFBRSxFQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNsRCxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksdUNBQWlCLEdBQXhCLFVBQXlCLFFBQW1CO1FBQ3hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNEOzs7T0FHRztJQUNJLG1DQUFhLEdBQXBCLFVBQXFCLElBQVk7UUFDN0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2pELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQztnQkFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ0Q7OztPQUdHO0lBQ0kscUNBQWUsR0FBdEIsVUFBdUIsS0FBZTtRQUNsQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzFCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFDLFFBQVEsQ0FBQztZQUN4QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFDRDs7O09BR0c7SUFDSSxxQ0FBZSxHQUF0QixVQUF1QixXQUE0QixFQUFFLG1CQUFvQztRQUFsRSxpREFBNEI7UUFBRSxpRUFBb0M7UUFDckYsSUFBSSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQWEsQ0FBQztRQUNwQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUNEOztPQUVHO0lBQ0ksa0NBQVksR0FBbkIsVUFBb0IsV0FBNEIsRUFBRSxtQkFBb0M7UUFBbEUsaURBQTRCO1FBQUUsaUVBQW9DO1FBQ2xGLElBQUksTUFBTSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDakMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFDUyxtQ0FBYSxHQUF2QixVQUF3QixJQUFZLElBQUksTUFBTSxDQUFDLElBQUksd0RBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0Qsa0RBQTRCLEdBQXRDLFVBQXVDLElBQVksRUFBRSxRQUFhO1FBQy9ELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN0QyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDcEIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDaEQsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUM7Z0JBQUMsUUFBUSxDQUFDO1lBQ3hDLFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDOUYsQ0FBQztRQUNELEVBQUUsRUFBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDWCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDMUYsQ0FBQztRQUNELElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBQ08sK0RBQXlDLEdBQWpELFVBQWtELElBQVk7UUFDMUQsR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQztRQUN6QyxDQUFDO0lBQ0wsQ0FBQztJQUNPLHNEQUFnQyxHQUF4QztRQUNJLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUUsQ0FBQztJQUNMLENBQUM7SUFDUywwQ0FBb0IsR0FBOUIsVUFBK0IsUUFBbUIsRUFBRSxRQUFhO1FBQzdELFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ08seUNBQW1CLEdBQTNCO1FBQ0ksSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0MsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDeEMsSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNMLENBQUM7SUFDTyw2Q0FBdUIsR0FBL0I7UUFDSSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUM1QixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDekIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzdDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFBQyxRQUFRLENBQUM7WUFDbEQsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBQ08sbUNBQWEsR0FBckIsVUFBc0IsSUFBWSxFQUFFLFFBQWEsRUFBRSxZQUFxQjtRQUNwRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDcEQsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxPQUFPLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUIsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBQ08sc0NBQWdCLEdBQXhCO1FBQ0ksR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2pDLENBQUM7SUFDTCxDQUFDO0lBQ08sbUNBQWEsR0FBckI7UUFDSSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3ZCLEdBQUcsRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztZQUNwQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzQyxDQUFDO0lBQ0wsQ0FBQztJQUNEOzs7Ozs7O09BT0c7SUFDSSxnQ0FBVSxHQUFqQixVQUFrQixNQUFxQixFQUFFLFFBQXVCLEVBQUUsa0JBQW1DO1FBQW5GLHNDQUFxQjtRQUFFLDBDQUF1QjtRQUFFLCtEQUFtQztRQUNqRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDN0IsRUFBRSxDQUFDLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFRCxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUMvQixDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDcEIsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNYLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQzdCLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDakQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLEVBQUUsRUFBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLE9BQWdCLEVBQUUsUUFBYTtZQUM5RixFQUFFLEVBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztnQkFDM0IsRUFBRSxFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQ1QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDMUMsQ0FBQztnQkFBQyxJQUFJLENBQUMsQ0FBQztvQkFDSixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDO1lBQ0wsQ0FBQztZQUNELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ0Q7Ozs7O09BS0c7SUFDSSwrQkFBUyxHQUFoQixVQUFpQixRQUFnQixFQUFFLElBQVk7UUFDM0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsT0FBZ0IsRUFBRSxJQUFTLEVBQUUsUUFBZSxFQUFFLFFBQWE7WUFDdEgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDMUcsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBQ0Q7Ozs7O09BS0c7SUFDSSwyQ0FBcUIsR0FBNUIsVUFBNkIsUUFBdUIsRUFBRSxRQUF1QjtRQUFoRCwwQ0FBdUI7UUFBRSwwQ0FBdUI7UUFDekUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNYLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQzdCLENBQUM7UUFDRCxFQUFFLEVBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNWLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDbEMsRUFBRSxFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDVixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxPQUFnQixFQUFFLElBQVksRUFBRSxXQUFtQixFQUFFLFFBQWE7Z0JBQzdKLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUNWLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxXQUFXLElBQUksV0FBVyxDQUFDO29CQUNwRCxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNKLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsT0FBZ0IsRUFBRSxNQUFjLEVBQUUsUUFBYTtnQkFDMUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQ1YsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMzQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0wsQ0FBQztJQUNPLCtDQUF5QixHQUFqQyxVQUFrQyxJQUFTO1FBQ3ZDLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFDUyxnREFBMEIsR0FBcEM7SUFDQSxDQUFDO0lBQ1MsNkNBQXVCLEdBQWpDO0lBQ0EsQ0FBQztJQUNPLHlDQUFtQixHQUEzQixVQUE0QixRQUFtQixFQUFFLGtCQUEyQjtRQUN4RSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDbEIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUM5QixFQUFFLENBQUMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDTCxDQUFDO0lBQ08sMENBQW9CLEdBQTVCO1FBQ0ksSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNwRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN2QyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQ2pDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN2QyxJQUFJLENBQUMsNEJBQTRCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNuRSxDQUFDO1FBQ0wsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3JHLENBQUM7SUFDTCxDQUFDO0lBQ08sOENBQXdCLEdBQWhDLFVBQWlDLFNBQWtCO1FBQy9DLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDcEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNqRyxDQUFDO0lBQ0wsQ0FBQztJQUNPLGtEQUE0QixHQUFwQyxVQUFxQyxTQUFzQixFQUFFLFNBQWtCO1FBQzNFLDREQUFhLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUNPLG1DQUFhLEdBQXJCLFVBQXNCLE9BQVk7UUFDOUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxhQUFhLEdBQUcsSUFBSSwrREFBVSxFQUFFLENBQUM7UUFDckMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdEMsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDM0MsQ0FBQztJQUNMLENBQUM7SUFDRCx3Q0FBa0IsR0FBbEI7UUFDSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDakMsaUJBQU0sa0JBQWtCLFdBQUUsQ0FBQztRQUMzQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNqQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFDUyxzQ0FBZ0IsR0FBMUIsY0FBK0IsQ0FBQztJQUN0QixnQ0FBVSxHQUFwQixjQUF5QixDQUFDO0lBQ2xCLCtDQUF5QixHQUFqQztRQUNJLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUM7UUFDOUIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxVQUFVLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9JLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsR0FBRyxVQUFVLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUN6RixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hELENBQUM7SUFDTCxDQUFDO0lBQ08sc0RBQWdDLEdBQXhDLFVBQXlDLFFBQW1CO1FBQ3hELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDO0lBQ3ZFLENBQUM7SUFDTywyQ0FBcUIsR0FBN0IsVUFBOEIsSUFBWTtRQUN0QyxJQUFJLFNBQVMsR0FBRyxJQUFJLDRFQUFZLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEQsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ08sMkNBQXFCLEdBQTdCLFVBQThCLElBQVksRUFBRSxrQkFBMkI7UUFDbkUsSUFBSSxTQUFTLEdBQUcsSUFBSSw0RUFBWSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUM1RCxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDdEIsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDcEIsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkQsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUMzQixJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyRCxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxRixNQUFNLENBQUMsSUFBSSw0RUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDakIsTUFBTSxDQUFDLElBQUksNEVBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFDTyx1Q0FBaUIsR0FBekI7UUFDSSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDaEQsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDckMsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3hDLENBQUM7SUFDTCxDQUFDO0lBQ08sa0RBQTRCLEdBQXBDO1FBQ0ksSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2hELEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQUMsUUFBUSxDQUFDO1lBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7SUFDTCxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLGlDQUFXLEdBQWxCLFVBQW1CLElBQVk7UUFDM0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFDRDs7Ozs7T0FLRztJQUNJLGlDQUFXLEdBQWxCLFVBQW1CLElBQVksRUFBRSxRQUFhO1FBQzFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDMUQsSUFBSSxDQUFDLHlDQUF5QyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFDRCxjQUFjO0lBQ0osb0NBQWMsR0FBeEIsVUFBeUIsS0FBVTtRQUMvQixFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksS0FBSyxZQUFZLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbkMsMkNBQTJDO1lBQzNDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBQ0Q7Ozs7O09BS0c7SUFDSSw4QkFBUSxHQUFmLFVBQWdCLElBQVk7UUFDeEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQzNDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUNEOzs7Ozs7Ozs7T0FTRztJQUNJLDhCQUFRLEdBQWYsVUFBZ0IsSUFBWSxFQUFFLFFBQWE7UUFDdkMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDOUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNKLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDaEUsRUFBRSxFQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDZixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQzNELENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ08sa0NBQVksR0FBcEIsVUFBcUIsSUFBWSxFQUFFLFFBQWE7UUFDNUMsRUFBRSxDQUFDLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDcEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUM7WUFBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQztRQUN6RSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQ1MsbUNBQWEsR0FBdkIsVUFBd0IsSUFBZTtRQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNwRSxJQUFJLE9BQU8sR0FBRyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNPLHFDQUFlLEdBQXZCLFVBQXdCLFFBQW9CLEVBQUUsUUFBZ0I7UUFDMUQsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2QsR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUc7WUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzNFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLE9BQU0sSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFBRSxLQUFLLEVBQUcsQ0FBQztRQUN2QyxNQUFNLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBQ1MsNENBQXNCLEdBQWhDLFVBQWlDLElBQVk7UUFDekMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQzNELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxFQUFFLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ3RGLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQy9DLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUM1QyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1FBQ2xFLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0MsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BCLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDSixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUM1QixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFDRDs7OztPQUlHO0lBQ0ksZ0NBQVUsR0FBakIsVUFBa0IsSUFBWTtRQUMxQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbEQsRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQztZQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBQ0Q7Ozs7O09BS0c7SUFDSSxnQ0FBVSxHQUFqQixVQUFrQixJQUFZLEVBQUUsUUFBZ0I7UUFDNUMsSUFBSSxXQUFXLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDNUMsRUFBRSxDQUFDLENBQUMsUUFBUSxLQUFLLEVBQUUsSUFBSSxRQUFRLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN2QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLEVBQUUsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ1YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3JHLENBQUM7SUFDTCxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksZ0NBQVUsR0FBakIsVUFBa0IsSUFBWTtRQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsK0NBQXlCLEdBQXpCLFVBQTBCLFFBQW1CLEVBQUUsUUFBaUI7UUFDNUQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QyxFQUFFLEVBQUMsUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsb0JBQW9CLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0wsQ0FBQztJQUNELDJDQUFxQixHQUFyQixVQUFzQixJQUFXLEVBQUUsUUFBaUI7UUFDaEQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFDRCw0Q0FBc0IsR0FBdEIsVUFBdUIsS0FBYSxFQUFFLFFBQWlCO1FBQ25ELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBQ0QsbUNBQWEsR0FBYixVQUFjLFFBQW1CLEVBQUUsS0FBYSxFQUFFLFdBQWdCLEVBQUUsU0FBYztRQUM5RSxFQUFFLEVBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUN6SixDQUFDO0lBQ0QscUNBQWUsR0FBZixVQUFnQixRQUFtQjtRQUMvQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFDRCxnQ0FBVSxHQUFWLFVBQVcsS0FBZSxFQUFFLEtBQWEsRUFBRSxXQUFnQixFQUFFLFNBQWM7UUFDdkUsRUFBRSxFQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzRixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUM3SSxDQUFDO0lBQ0Qsa0NBQVksR0FBWixVQUFhLEtBQWU7UUFDeEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUNELHNDQUFnQixHQUFoQixVQUFpQixJQUFZO1FBQ3pCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ2pELElBQUksT0FBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDdEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSwyREFBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDakUsQ0FBQztJQUNELGlDQUFXLEdBQVgsVUFBWSxJQUFZO1FBQ3BCLElBQUksT0FBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCxpQ0FBVyxHQUFYLFVBQVksSUFBWSxFQUFFLGtCQUEyQjtRQUNqRCxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBQ0QsbUNBQWEsR0FBYixVQUFjLElBQVk7UUFDdEIsSUFBSSxHQUFHLEdBQUcsRUFBQyxJQUFJLEVBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRyxxQkFBcUIsRUFBRSxJQUFJLEVBQUMsQ0FBQztRQUNyRixHQUFHLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDO1FBQ3hFLE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDZixDQUFDO0lBUUQsc0JBQVcsdUNBQWM7UUFQekI7Ozs7OztXQU1HO2FBQ0gsY0FBc0MsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDL0YsVUFBMEIsR0FBVztZQUNqQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakQsQ0FBQzs7O09BSDhGO0lBSS9GLHNCQUFXLGlEQUF3QjthQUFuQyxjQUF3QyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBQ3JHLHNCQUFXLG9EQUEyQjthQUF0QyxjQUEyQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBTzNHLHNCQUFXLDJDQUFrQjtRQU43Qjs7Ozs7V0FLRzthQUNILGNBQTJDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3ZHLFVBQThCLEdBQVksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FETTtJQUV2RyxzQkFBVyxzQ0FBYTthQUF4QjtZQUNJLElBQUksT0FBTyxHQUFHLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDeEIsQ0FBQzs7O09BQUE7SUFDTyxzQ0FBZ0IsR0FBeEI7UUFDSSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzVCLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDcEIsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEQsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEQsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEQsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDNUQsRUFBRSxFQUFDLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxNQUFNLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbkcsRUFBRSxFQUFDLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxRQUFRLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNyRyxFQUFFLEVBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDbEMsRUFBRSxFQUFDLFlBQVksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDaEYsQ0FBQztZQUNELEVBQUUsRUFBQyxZQUFZLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDOUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDeEcsQ0FBQztZQUNELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3JFLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDdkUsTUFBTSxDQUFDLFFBQVEsR0FBRyxHQUFHLEdBQUcsVUFBVSxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxNQUFNLENBQUMsRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUNPLDBDQUFvQixHQUE1QixVQUE2QixJQUFlLEVBQUUsU0FBaUIsRUFBRSxTQUFpQjtRQUM5RSxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDN0wsQ0FBQztJQUNPLDRDQUFzQixHQUE5QixVQUErQixXQUFtQixFQUFFLFdBQW1CO1FBQ25FLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDNUwsQ0FBQztJQUNPLG9DQUFjLEdBQXRCLFVBQXVCLEdBQVc7UUFDOUIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDL0IsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixFQUFFLEVBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDVCxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFDRCxFQUFFLEVBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ2hDLEVBQUUsRUFBQyxHQUFHLENBQUM7WUFBQyxHQUFHLElBQUksR0FBRyxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksZ0NBQVUsR0FBakI7UUFDSSxFQUFFLEVBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ3BELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLGNBQVksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixrRUFBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRDs7OztPQUlHO0lBQ0ksK0JBQVMsR0FBaEI7UUFDSSxFQUFFLEVBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLGtFQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQU1ELHNCQUFXLGtDQUFTO1FBTHBCOzs7O1dBSUc7YUFDSCxjQUF5QixNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBTXhFLHNCQUFXLHdDQUFlO1FBTDFCOzs7O1dBSUc7YUFDSCxjQUF1QyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM1RixVQUEyQixHQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREU7SUFRNUYsc0JBQVcsNENBQW1CO1FBTjlCOzs7OztXQUtHO2FBQ0gsY0FBMkMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDcEcsVUFBK0IsR0FBVyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURFO0lBRTVGLDRDQUFzQixHQUE5QixVQUErQixJQUFlO1FBQzFDLEVBQUUsRUFBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ3RGLENBQUM7SUFDUyw2QkFBTyxHQUFqQjtRQUNJLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDNUIsRUFBRSxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDTixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLEVBQUUsRUFBQyxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7UUFDRCxFQUFFLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNOLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRCxFQUFFLEVBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlDLEVBQUUsRUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztvQkFDakIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQzVCLENBQUM7Z0JBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ0osSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNwQixDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBQ08sa0NBQVksR0FBcEIsVUFBcUIsR0FBVyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlFLG9CQUFvQjtJQUNwQixrQ0FBWSxHQUFaLGNBQThCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzVDLCtCQUFTLEdBQVQsY0FBdUIsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckMsc0NBQWdCLEdBQWhCLGNBQXFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ25ELHFCQUFxQjtJQUNyQixnQ0FBVSxHQUFWLFVBQVcsS0FBZSxFQUFFLFNBQW1CO1FBQzNDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNoRSxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUNELHFDQUFlLEdBQWYsVUFBZ0IsSUFBWSxFQUFFLEtBQVUsRUFBRSxVQUFtQjtRQUN6RCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUNsQixFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ2IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNMLENBQUM7SUFDTCxrQkFBQztBQUFELENBQUMsQ0F2MkRnQyxtREFBSTs7QUFDbEIseUJBQWEsR0FBRyxJQUFJLHFFQUFhLEVBQUUsQ0FBQztBQUNyQyxvQkFBUSxHQUFXLFNBQVMsQ0FBQztBQXUyRC9DLCtEQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGNBQVEsTUFBTSxDQUFDLDBFQUFrQixDQUFDLFVBQVUsRUFBRSxFQUFDLENBQUMsRUFBRTtJQUNqSCxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxFQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUscUNBQXFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQztJQUN0SCxFQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBQyxFQUFFLEVBQUMsSUFBSSxFQUFFLDBCQUEwQixFQUFFLHFCQUFxQixFQUFFLHdCQUF3QixFQUFDO0lBQzVKLEVBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLGdCQUFnQixFQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtJQUN6SCxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFVBQVUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLFVBQVUsR0FBRyxFQUFFLEtBQUssRUFBRSxhQUFhLElBQUksSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7SUFDblIsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFO0lBQ3ZGLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsRUFBRSxFQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEVBQUUsWUFBWSxFQUFFLDhCQUE4QjtJQUN4SyxFQUFFLElBQUksRUFBRSwrQkFBK0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7SUFDekosRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLDJCQUEyQixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7SUFDdkcseUJBQXlCLEVBQUUsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFO0lBQzNHLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRTtJQUNyRixFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRTtJQUM3RSxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUU7SUFDOUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxFQUFFO0lBQy9ELEVBQUUsSUFBSSxFQUFFLDhCQUE4QixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSw2QkFBNkI7SUFDdEYsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsQ0FBQyxFQUFFO0lBQzlGLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBQztJQUNqRSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUM7SUFDakUsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLGlCQUFpQixFQUFDO0lBQ2pFLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsRUFBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUUscUJBQXFCLEVBQUUsMEJBQTBCLEVBQUM7SUFDaEosRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLDRCQUE0QixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUM7SUFDaEcsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7OztBQ2g1RGpJO0FBQ1k7QUFFbEQ7SUFBc0MsbUZBQVc7SUFFN0MsMEJBQVksT0FBbUI7UUFBbkIsd0NBQW1CO2VBQzNCLGtCQUFNLE9BQU8sQ0FBQztJQUNsQixDQUFDO0lBQ00saUNBQU0sR0FBYjtRQUNJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMxQixDQUFDO0lBQ0wsQ0FBQztJQUNNLG1DQUFRLEdBQWYsVUFBZ0IsR0FBUSxFQUFFLElBQVM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNNLDhDQUFtQixHQUExQixVQUEyQixFQUFFO1FBQ3pCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQ1Msa0RBQXVCLEdBQWpDO1FBQ0ksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFDUyxxREFBMEIsR0FBcEM7UUFDSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUNTLDRDQUFpQixHQUEzQixVQUE0QixLQUFhLEVBQUUsSUFBWTtRQUNuRCxpQkFBTSxpQkFBaUIsWUFBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFDTCx1QkFBQztBQUFELENBQUMsQ0ExQnFDLDREQUFXLEdBMEJoRDs7QUFFRDtJQUFzQyxtRkFBaUI7SUFFbkQsMEJBQVksT0FBbUIsRUFBRSxLQUE4QjtRQUFuRCx3Q0FBbUI7UUFBRSxvQ0FBOEI7ZUFDM0Qsa0JBQU0sT0FBTyxFQUFFLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBQ0Qsc0ZBQXNGO0lBQzVFLHVDQUFZLEdBQXRCLFVBQXVCLE9BQVk7UUFDL0IsTUFBTSxDQUFDLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDO0lBQ3hDLENBQUM7SUFDTCx1QkFBQztBQUFELENBQUMsQ0FUcUMsd0VBQWlCLEdBU3REOztBQUVELDREQUFXLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM0NBO0FBQ3FCO0FBQ2I7QUFDa0I7QUFHRztBQUNSO0FBQ0M7QUFDRjtBQUNNO0FBRXpEO0lBQTRCLHlFQUF5QjtJQUtqRCxnQkFBWSxLQUFVO1FBQXRCLFlBQ0ksa0JBQU0sS0FBSyxDQUFDLFNBSWY7UUFOTywwQkFBb0IsR0FBWSxLQUFLLENBQUM7UUFHMUMsS0FBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLENBQUM7UUFDL0QsS0FBSSxDQUFDLEtBQUssR0FBRyxLQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0IsS0FBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQzs7SUFDN0IsQ0FBQztJQVRELHNCQUFrQixpQkFBTzthQUF6QixjQUFzQyxNQUFNLENBQUMsMEVBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2FBQ3JFLFVBQTBCLEtBQWEsSUFBSSwwRUFBUyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDOzs7T0FETjtJQVVyRSwwQ0FBeUIsR0FBekIsVUFBMEIsU0FBYztRQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNELG1DQUFrQixHQUFsQjtRQUNJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztZQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDMUMsQ0FBQztJQUNMLENBQUM7SUFDRCxrQ0FBaUIsR0FBakI7UUFDSSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzRCxFQUFFLEVBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDN0IsQ0FBQztJQUNMLENBQUM7SUFDRCxxQ0FBb0IsR0FBcEI7UUFDSSxFQUFFLEVBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDTCxDQUFDO0lBQ0QsdUJBQU0sR0FBTjtRQUNJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLFdBQVcsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDcEUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksaUJBQWlCLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDaEYsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNoRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFDRCxzQkFBVyx1QkFBRzthQUFkLGNBQXdCLE1BQU0sQ0FBQywwRUFBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNwRCxVQUFlLEtBQVU7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQyxDQUFDOzs7T0FIbUQ7SUFJcEQsb0NBQW1CLEdBQW5CLFVBQW9CLEtBQUs7UUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBQ1MsZ0NBQWUsR0FBekI7UUFDSSxFQUFFLEVBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUMvQyxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDMUIsRUFBRSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUM1QixJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDMUIsRUFBRSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQzFELGNBQWMsR0FBRyxDQUFDLGdFQUFPLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsbUJBQW1CLEdBQUksQ0FBQyxDQUFDO1lBQ2xKLENBQUM7WUFDRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3hELGNBQWMsR0FBRyw4REFBSyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSTtnQkFBRSw4REFBSyxTQUFTLEVBQUUsR0FBRztvQkFBRSxtRUFBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFRO29CQUFDLGNBQWMsQ0FBTyxDQUFNLENBQUM7UUFDNUosQ0FBQztRQUNELElBQUksU0FBUyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUMvRCxNQUFNLENBQUMsQ0FBQztZQUFLLDhEQUFLLHVCQUF1QixFQUFFLFNBQVMsR0FBSTtZQUFDLGNBQWMsQ0FBTyxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUNTLHNDQUFxQixHQUEvQjtRQUNJLElBQUksU0FBUyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUNyRSxNQUFNLENBQUMsQ0FBQyw4REFBSyx1QkFBdUIsRUFBRSxTQUFTLEdBQUksQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFDUyw4QkFBYSxHQUF2QjtRQUNJLElBQUksU0FBUyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM3RCxNQUFNLENBQUMsQ0FBQyw4REFBSyx1QkFBdUIsRUFBRSxTQUFTLEdBQUksQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFDUyw2QkFBWSxHQUF0QjtRQUNJLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDbkYsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQztRQUNyRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ3ZFLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMxRixJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDakcsSUFBSSxPQUFPLEdBQUcsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLElBQUksQ0FBQztRQUN2RyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDZixXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0MsQ0FBQztRQUNELE1BQU0sQ0FBQyxDQUNILDhEQUFLLEdBQUcsRUFBQyxNQUFNLEVBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSTtZQUNuQyxLQUFLO1lBQ04sOERBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJO2dCQUNwQyxXQUFXO2dCQUNYLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7Z0JBQzVCLFdBQVc7Z0JBQ1gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztnQkFDL0IsY0FBYyxDQUNiO1lBQ0wsT0FBTyxDQUNOLENBQ1QsQ0FBQztJQUNOLENBQUM7SUFDUyw0QkFBVyxHQUFyQjtRQUNJLElBQUksS0FBSyxHQUFHLGdGQUFpQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyw4REFBSyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNO1lBQUUsaUVBQUssS0FBSyxDQUFNLENBQU0sQ0FBQztJQUNuRSxDQUFDO0lBQ1MsaUNBQWdCLEdBQTFCLFVBQTJCLFFBQWdCO1FBQ3ZDLEVBQUUsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsSUFBSSxRQUFRLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3ZELE1BQU0sQ0FBQyxxREFBQywwRUFBZ0IsSUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRztJQUNsRSxDQUFDO0lBQ1MsMkJBQVUsR0FBcEI7UUFDSSxNQUFNLENBQUMscURBQUMsOERBQVUsSUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksR0FBSSxDQUFDO0lBQzVHLENBQUM7SUFDUywrQkFBYyxHQUF4QixVQUF5QixLQUFjO1FBQ25DLE1BQU0sQ0FBQyxxREFBQyw0RUFBYyxJQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUssQ0FBQztJQUNqRixDQUFDO0lBQ1MsaUNBQWdCLEdBQTFCO1FBQ0ksTUFBTSxDQUFDLHFEQUFDLGdGQUFnQixJQUFDLE1BQU0sRUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDckUsQ0FBQztJQUNTLGtDQUFpQixHQUEzQjtRQUNJLE1BQU0sQ0FBQyxDQUFDLG1FQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFRLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRVMsNkJBQVksR0FBdEIsVUFBdUIsUUFBYTtRQUNoQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ1gsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNqQyxDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ0osRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQ2hCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSwyRUFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3RELENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLDJFQUFnQixFQUFFLENBQUM7UUFDekMsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7O2dCQUVQLEVBQUUsRUFBQyxHQUFHLElBQUksT0FBTyxJQUFJLEdBQUcsSUFBSSxVQUFVLENBQUM7c0NBQVU7Z0JBQ2pELEVBQUUsRUFBQyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDZCxPQUFLLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxPQUFLLEdBQUcsQ0FBQyxDQUFDOztnQkFFakQsQ0FBQztnQkFDRCxFQUFFLEVBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksT0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksT0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDcEUsSUFBSSxVQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM3QixJQUFJLElBQUksR0FBRyxVQUFTLE1BQU0sRUFBRSxPQUFPLElBQUksVUFBUSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDcEUsT0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMvQixDQUFDO2dCQUFDLElBQUksQ0FBQyxDQUFDO29CQUNKLE9BQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDckMsQ0FBQztZQUNMLENBQUM7O1lBYkQsR0FBRyxFQUFDLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQzs7YUFhdkI7UUFDTCxDQUFDO1FBRUQsb0JBQW9CO1FBQ3BCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBRXBDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNPLHlCQUFRLEdBQWhCLGNBQXFCLE1BQU0sQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLGdDQUFlLEdBQXpCLFVBQTBCLFFBQWE7UUFDbkMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxHQUFHO1lBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBQyxNQUFNLElBQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBQyxNQUFNLElBQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxVQUFDLE1BQU0sRUFBRSxPQUFPO1lBQ2pELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7WUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLEVBQUUsQ0FBQyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsb0JBQW9CLENBQUM7Z0JBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFVBQUMsTUFBTSxFQUFFLE9BQU87WUFDN0MsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztnQkFDekMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztnQkFDekMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxVQUFDLE1BQU0sRUFBRSxPQUFPO1lBQzNDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7Z0JBQ3pDLEtBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDNUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNDLENBQUM7WUFDRCxFQUFFLENBQUMsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQztnQkFBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQy9FLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGdCQUFnQjtJQUNULHNDQUFxQixHQUE1QixVQUE2QixRQUFzQjtRQUMvQyxNQUFNLENBQUMsbUZBQW9CLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDeEUsUUFBUSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsSUFBSTtTQUN4RSxDQUFDLENBQUM7SUFDUCxDQUFDO0lBQ00sNEJBQVcsR0FBbEIsVUFBbUIsR0FBVyxFQUFFLFNBQWlCLEVBQUUsVUFBZTtRQUM5RCxNQUFNLENBQUMsOERBQUssR0FBRyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUcsU0FBUyxDQUFPLENBQUM7SUFDOUUsQ0FBQztJQUNNLHNDQUFxQixHQUE1QixjQUF5QyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7SUFDN0Usc0NBQXFCLEdBQTVCLGNBQXlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQztJQUN4RixhQUFDO0FBQUQsQ0FBQyxDQS9MMkIsZ0RBQWUsR0ErTDFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQzNNd0Q7QUFDbkI7QUFDc0I7QUFDVDtBQUNmO0FBQ3BDOzs7R0FHRztBQUNIO0lBQXFDLGtGQUFJO0lBaUJyQztRQUFBLFlBQ0ksaUJBQU8sU0FDVjtRQVJPLGlCQUFXLEdBQVcsRUFBRSxDQUFDO1FBQ3ZCLGtCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQzFCLG1CQUFhLEdBQVcsRUFBRSxDQUFDO1FBRTlCLFdBQUssR0FBZ0IsSUFBSSxDQUFDOztJQUlqQyxDQUFDO0lBakJjLG9DQUFvQixHQUFuQyxVQUFvQyxHQUFvQjtRQUNwRCxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQ3ZCLElBQUksR0FBRyxHQUFHLGVBQWUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsRUFBRSxFQUFDLENBQUMsR0FBRyxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUN0QixFQUFFLEVBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUN2QixHQUFHLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQVVNLDZCQUFHLEdBQVYsVUFBVyxhQUFvQztRQUFwQyxvREFBb0M7UUFDM0MsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbEMsRUFBRSxFQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sQ0FBQztRQUNYLENBQUM7UUFDRCxFQUFFLEVBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQzVDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNoQyxFQUFFLEVBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDekMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFDUyxnREFBc0IsR0FBaEM7UUFDSSxNQUFNLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDTyx1Q0FBYSxHQUFyQixVQUFzQixhQUE2QjtRQUMvQyxFQUFFLEVBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUNmLElBQUksSUFBSSxHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELElBQUksS0FBSyxHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25ELEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUM1QixDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ0osSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDcEMsQ0FBQztRQUNMLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNKLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUM3QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbkMsQ0FBQztJQUNMLENBQUM7SUFDUyxxQ0FBVyxHQUFyQjtRQUNJLElBQUksR0FBRyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFDL0IsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztRQUMxRSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsR0FBRyxDQUFDLE1BQU0sR0FBRztZQUNULEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzFDLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDSixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ25ELENBQUM7UUFDTCxDQUFDLENBQUM7UUFDRixHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZixDQUFDO0lBQ00saUNBQU8sR0FBZCxjQUEyQixNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUNuRCxzQkFBVyxvQ0FBTzthQUFsQjtZQUNJLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDekUsQ0FBQzs7O09BQUE7SUFDTSxrREFBd0IsR0FBL0I7UUFDSSxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUM1QyxJQUFJLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQzlCLEdBQUcsRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztZQUN6QyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFDTywrQ0FBcUIsR0FBN0IsVUFBOEIsWUFBb0IsSUFBWSxNQUFNLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDckYsNkNBQW1CLEdBQTNCO1FBQ0ksSUFBSSxVQUFVLEdBQUcsK0RBQVUsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN2RSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7WUFDekMsRUFBRSxFQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDO2dCQUFDLFFBQVEsQ0FBQztZQUMzRSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUNNLGlDQUFPLEdBQWQsVUFBZSxJQUFTO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDbEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNyQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3BELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDcEQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDakQsR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDO1lBQ3pDLEVBQUUsRUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RSxDQUFDO0lBQ0wsQ0FBQztJQUNNLGlDQUFPLEdBQWQ7UUFDSSxFQUFFLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDN0IsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsRUFBRSxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNuQyxFQUFFLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3RDLEVBQUUsRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDckQsRUFBRSxFQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNyRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNqRCxHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7WUFDekMsRUFBRSxFQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUNELHNCQUFXLGdDQUFHO2FBQWQsY0FBMkIsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JFLFVBQWUsR0FBVyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FERztJQUFBLENBQUM7SUFDSixDQUFDO0lBQ25FLHNCQUFXLGlDQUFJO2FBQWYsY0FBNEIsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3ZFLFVBQWdCLEdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREc7SUFFdkUsc0JBQVcsc0NBQVM7YUFBcEIsY0FBaUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2pGLFVBQXFCLEdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREc7SUFBQSxDQUFDO0lBQ0osQ0FBQztJQUMvRSxzQkFBVyxzQ0FBUzthQUFwQixjQUFpQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDakYsVUFBcUIsR0FBVyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FERztJQUFBLENBQUM7SUFDSixDQUFDO0lBQy9FLHNCQUFXLDBDQUFhO2FBQXhCO1lBQ0ksRUFBRSxFQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQ25DLElBQUksSUFBSSxHQUFHLCtEQUFVLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzdFLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQztnQkFBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQzdCLEVBQUUsRUFBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFlBQVksQ0FBQztnQkFBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQ2pELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3JCLENBQUM7OztPQUFBO0lBQ00sK0JBQUssR0FBWjtRQUNJLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNqRCxHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7WUFDekMsRUFBRSxFQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3JELENBQUM7SUFDTCxDQUFDO0lBQ1MsZ0NBQU0sR0FBaEIsVUFBaUIsTUFBVztRQUN4QixJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDZixNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO29CQUFDLFFBQVEsQ0FBQztnQkFDekIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDckMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDckMsSUFBSSxJQUFJLEdBQUcsSUFBSSw2REFBUyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDMUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQixDQUFDO1FBQ0wsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLDJEQUFXLENBQUMsMEVBQWtCLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztRQUNyRixDQUFDO1FBQ0QsZUFBZSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBQ08sNkNBQW1CLEdBQTNCLFVBQTRCLElBQWUsRUFBRSxTQUFjO1FBQ3ZELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzVDLEdBQUcsRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztZQUN6QyxJQUFJLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNFLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUMxQixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFDTyw0Q0FBa0IsR0FBMUIsVUFBMkIsWUFBb0I7UUFDM0MsRUFBRSxFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDekcsRUFBRSxFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakQsTUFBTSxDQUFDLFlBQVksQ0FBQztJQUN4QixDQUFDO0lBQ08saUNBQU8sR0FBZixVQUFnQixNQUFjLEVBQUUsUUFBZ0I7UUFDNUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLDJEQUFXLENBQUMsMEVBQWtCLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDMUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFDTyw0Q0FBa0IsR0FBMUIsVUFBMkIsTUFBVztRQUNsQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDM0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN2QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDOUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQzdCLENBQUM7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFDTyxtQ0FBUyxHQUFqQjtRQUNJLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNKLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN4RCxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFDTyxrQ0FBUSxHQUFoQixVQUFpQixJQUFTO1FBQ3RCLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDdEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkUsRUFBRSxFQUFDLENBQUMsQ0FBQyxJQUFJLFlBQVksTUFBTSxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQzFDLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ25DLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDTyxrQ0FBUSxHQUFoQixVQUFpQixJQUFTO1FBQ3RCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7UUFDdEQsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDTyxzQ0FBWSxHQUFwQixVQUFxQixJQUFTLEVBQUUsUUFBZ0I7UUFDNUMsRUFBRSxFQUFDLENBQUMsSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN0QixFQUFFLEVBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDO1lBQ3pDLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsRUFBRSxFQUFDLENBQUMsSUFBSSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDMUIsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNELHNCQUFZLG9DQUFPO2FBQW5CLGNBQXdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFDaEksc0JBQUM7QUFBRCxDQUFDLENBMU5vQyxtREFBSTs7QUFDdEIsMkJBQVcsR0FBRyxFQUFFLENBQUM7QUEwTnBDLCtEQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsRUFBRSxjQUFjLE1BQU0sQ0FBQyxJQUFJLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7O0FDaE92STtBQUFBOzs7R0FHRztBQUNIO0lBTUksMkJBQW9CLEtBQXdCLEVBQVMsV0FBNEI7UUFBNUIsaURBQTRCO1FBQTdELFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQVMsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBSnpFLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBRWpCLHNCQUFpQixHQUE0QixJQUFJLENBQUM7UUFFckQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxzQkFBVyxxQ0FBTTthQUFqQixjQUFxQixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBQ3ZFLHNCQUFXLG1DQUFJO2FBQWY7WUFDSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ3hCLEVBQUUsRUFBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7Z0JBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3RCxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ2YsQ0FBQzthQXlCRCxVQUFnQixLQUFhO1lBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQyxDQUFDOzs7T0EzQkE7SUFDRCxzQkFBVyx1Q0FBUTthQUFuQjtZQUNJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDdEIsRUFBRSxFQUFDLENBQUMsR0FBRyxDQUFDO2dCQUFDLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7WUFDL0MsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQixFQUFFLEVBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7WUFDRCxFQUFFLEVBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNsQixNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ2YsQ0FBQzs7O09BQUE7SUFDRCxzQkFBVyxzQ0FBTzthQUFsQjtZQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDL0IsQ0FBQzs7O09BQUE7SUFDRCxzQkFBVyxtQ0FBSTthQUFmO1lBQ0ksRUFBRSxFQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDL0IsQ0FBQzs7O09BQUE7SUFDRCxzQkFBVyx5Q0FBVTthQUFyQjtZQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzFELENBQUM7OztPQUFBO0lBQ0Qsc0JBQVcsMkNBQVk7YUFBdkI7WUFDSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNoRixDQUFDOzs7T0FBQTtJQUlNLHlDQUFhLEdBQXBCLFVBQXFCLEdBQVc7UUFDNUIsRUFBRSxFQUFDLENBQUMsR0FBRyxDQUFDO1lBQUMsR0FBRyxHQUFHLGlCQUFpQixDQUFDLGFBQWEsQ0FBQztRQUMvQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ00seUNBQWEsR0FBcEIsVUFBcUIsR0FBVyxFQUFFLEtBQWE7UUFDM0MsRUFBRSxFQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQzVDLEVBQUUsRUFBQyxDQUFDLEdBQUcsQ0FBQztZQUFDLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7UUFDL0MsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLEVBQUUsRUFBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDUixFQUFFLEVBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osRUFBRSxDQUFDLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDNUIsRUFBRSxFQUFDLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxhQUFhLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN4RyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDbEMsQ0FBQztnQkFBQyxJQUFJLENBQUMsQ0FBQztvQkFDSixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFDekIsRUFBRSxFQUFDLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO3dCQUN4QyxJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzVDLENBQUM7Z0JBQ0wsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFDTSxtQ0FBTyxHQUFkO1FBQ0ksSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsRUFBRSxFQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNqQyxFQUFFLEVBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLGFBQWEsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9GLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFDTSxtQ0FBTyxHQUFkLFVBQWUsS0FBVTtRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixFQUFFLEVBQUMsQ0FBQyxLQUFLLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDbEIsRUFBRSxDQUFDLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixHQUFHLEVBQUMsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDeEMsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUNNLHFDQUFTLEdBQWhCLGNBQW9CLENBQUM7SUFDWCxzQ0FBVSxHQUFwQixjQUF3QixDQUFDO0lBQ2pCLHdDQUFZLEdBQXBCO1FBQ0ksRUFBRSxFQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2xELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDckIsRUFBRSxFQUFDLENBQUMsSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUN2QixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3RCLEVBQUUsRUFBQyxDQUFDLEdBQUcsQ0FBQztZQUFDLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7UUFDL0MsRUFBRSxFQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFDTyx3Q0FBWSxHQUFwQjtRQUNJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdEIsRUFBRSxFQUFDLENBQUMsR0FBRyxDQUFDO1lBQUMsR0FBRyxHQUFHLGlCQUFpQixDQUFDLGFBQWEsQ0FBQztRQUMvQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRU8sdURBQTJCLEdBQW5DLFVBQW9DLFlBQW9CO1FBQ3BELElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLEdBQUcsRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztZQUNuQyxFQUFFLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLGFBQWEsQ0FBQztnQkFBQyxRQUFRLENBQUM7WUFDeEQsRUFBRSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDO2dCQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RSxDQUFDO0lBQ0wsQ0FBQztJQUNMLHdCQUFDO0FBQUQsQ0FBQzs7QUEvR2tCLCtCQUFhLEdBQVcsU0FBUyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNUYjtBQUU0RjtBQUV2RjtBQUNLO0FBRUM7QUFFbkQ7SUFHSSwwQkFBbUIsS0FBcUI7UUFBckIsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFHakMsYUFBUSxHQUFvQixFQUFFLENBQUM7UUFGbEMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO0lBQ2xFLENBQUM7SUFHRCxzQkFBVyx1Q0FBUztRQURwQiwwQ0FBMEM7YUFDMUMsY0FBMEMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQzs7O09BQUE7SUFDaEUsc0JBQVcscUNBQU87YUFBbEIsY0FBZ0MsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO2FBQzNELFVBQW1CLEdBQVk7WUFDM0IsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7OztPQUwwRDtJQU1wRCx3Q0FBYSxHQUFwQjtRQUNJLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBQ00scUNBQVUsR0FBakIsVUFBa0IsQ0FBVztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUNTLDJDQUFnQixHQUExQjtRQUNJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztZQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ3pFLENBQUM7SUFDTyxtQ0FBUSxHQUFoQjtRQUNJLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN0QyxFQUFFLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQzFCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6QixDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7Z0JBQ3JFLENBQUMsQ0FBQyxXQUFXLEdBQUcsT0FBTyxHQUFHLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDL0MsT0FBTyxFQUFFLENBQUM7WUFDZCxDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ0osSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQ3RDLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUNPLDBDQUFlLEdBQXZCO1FBQ0ksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1osR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzFDLENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUNPLHNDQUFXLEdBQW5CLGNBQWlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RSx1QkFBQztBQUFELENBQUM7O0FBRUQ7O0dBRUc7QUFDSDtJQUFvQyxpRkFBYTtJQWE3Qyx3QkFBbUIsSUFBaUI7UUFBakIsZ0NBQWlCO1FBQXBDLFlBQ0ksa0JBQU0sSUFBSSxDQUFDLFNBU2Q7UUFWa0IsVUFBSSxHQUFKLElBQUksQ0FBYTtRQVA1QixlQUFTLEdBQTRCLElBQUksQ0FBQztRQUMxQyxxQkFBZSxHQUFvQixJQUFJLENBQUM7UUFFeEMsc0JBQWdCLEdBQVksS0FBSyxDQUFDO1FBQ2xDLG9CQUFjLEdBQXdCLElBQUksS0FBSyxFQUFnQixDQUFDO1FBS3BFLEtBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsVUFBUyxJQUFJLElBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFDLEVBQUUsVUFBUyxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDLENBQUUsQ0FBQztRQUMzSyxLQUFJLENBQUMsc0NBQXNDLENBQUMsVUFBVSxFQUFFLGNBQVksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7UUFDMUgsS0FBSSxDQUFDLEVBQUUsR0FBRyxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEMsSUFBSSxJQUFJLEdBQUcsS0FBSSxDQUFDO1FBQ2hCLElBQUksYUFBYSxHQUFHLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsS0FBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RFLGFBQWEsQ0FBQyxzQkFBc0IsR0FBRyxVQUFTLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlGLElBQUksbUJBQW1CLEdBQUcsS0FBSSxDQUFDLHVCQUF1QixDQUFDLGFBQWEsRUFBRSxLQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEYsbUJBQW1CLENBQUMsaUJBQWlCLEdBQUcsVUFBUyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O0lBQ2xHLENBQUM7SUFyQmMseUJBQVUsR0FBekI7UUFDSSxNQUFNLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBb0JNLHNDQUFhLEdBQXBCLFVBQXFCLEtBQWtCO1FBQ25DLGlCQUFNLGFBQWEsWUFBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixFQUFFLEVBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztZQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3BFLEdBQUcsRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsQ0FBQztJQUNMLENBQUM7SUFDRCwyQ0FBa0IsR0FBbEI7UUFDSSxpQkFBTSxrQkFBa0IsV0FBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBS0Qsc0JBQVcsaUNBQUs7UUFKaEI7OztXQUdHO2FBQ0gsY0FBNkIsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDN0UsVUFBaUIsR0FBVyxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FERDtJQUU3RSxzQkFBSSxvQ0FBUTthQUFaLGNBQW9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUtoRixzQkFBVyx1Q0FBVztRQUp0Qjs7O1dBR0c7YUFDSCxjQUFtQyxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN6RixVQUF1QixHQUFZLElBQUksSUFBSSxDQUFDLHdCQUF3QixDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURGO0lBRXpGLHNCQUFJLDBDQUFjO2FBQWxCLGNBQTBDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUM1RixzQkFBVywwQ0FBYzthQUF6QixjQUF1QyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUV2RSxrQ0FBUyxHQUFULGNBQXNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUE0QixJQUFJLENBQUMsTUFBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEcsd0NBQWUsR0FBZixVQUFnQixJQUFZLElBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQTRCLElBQUksQ0FBQyxNQUFPLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFJM0gsc0JBQVcsa0NBQU07UUFIakI7O1dBRUc7YUFDSCxjQUFzQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDckYsVUFBa0IsR0FBbUIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREs7SUFNckYsc0JBQVcscUNBQVM7UUFKcEI7OztXQUdHO2FBQ0gsY0FBaUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2pGLFVBQXFCLEdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREc7SUFFakYsc0JBQVcsc0NBQVU7YUFBckI7WUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNwQixDQUFDOzs7T0FBQTtJQUNELHNCQUFZLCtCQUFHO2FBQWYsY0FBeUIsTUFBTSxDQUFDLDBFQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUlyRCxzQkFBVyw4QkFBRTtRQUhiOztXQUVHO2FBQ0gsY0FBMEIsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDL0QsVUFBYyxHQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQUREO0lBSy9ELHNCQUFXLG1DQUFPO1FBSGxCOztXQUVHO2FBQ0gsY0FBZ0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBTS9DLHNCQUFXLHFDQUFTO1FBTHBCOzs7O1dBSUc7YUFDSDtZQUNJLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO2dCQUN6QixHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDO29CQUM1QyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMxQixFQUFFLEVBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7d0JBQ1osSUFBSSxFQUFFLEdBQWdCLEVBQUcsQ0FBQyxTQUFTLENBQUM7d0JBQ3BDLEdBQUcsRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQzs0QkFDakMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3BDLENBQUM7b0JBQ0wsQ0FBQztvQkFBQyxJQUFJLENBQUMsQ0FBQzt3QkFDSixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBZSxFQUFFLENBQUMsQ0FBQztvQkFDL0MsQ0FBQztnQkFDTCxDQUFDO2dCQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFDakMsQ0FBQztZQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQy9CLENBQUM7OztPQUFBO0lBQ00sMENBQWlCLEdBQXhCLFVBQXlCLElBQVk7UUFDakMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMvQixHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7WUFDeEMsRUFBRSxFQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNPLDhDQUFxQixHQUE3QjtRQUNJLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDOUIsRUFBRSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUlELHNCQUFXLG9DQUFRO1FBSG5COztXQUVHO2FBQ0gsY0FBeUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUM5RCw0Q0FBbUIsR0FBMUIsVUFBMkIsYUFBOEI7UUFBOUIscURBQThCO1FBQXFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQUMsQ0FBQztJQUNyRzs7OztPQUlHO0lBQ0ksd0NBQWUsR0FBdEIsVUFBdUIsT0FBaUI7UUFDcEMsR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztZQUM1QyxJQUFJLEVBQUUsR0FBUSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLEVBQUUsRUFBQyxFQUFFLElBQUksT0FBTyxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDOUIsRUFBRSxFQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNaLEVBQUUsRUFBa0IsRUFBRyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ2xFLENBQUM7UUFDTCxDQUFDO1FBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLGtDQUFTLEdBQWhCLFVBQWlCLFlBQTRCLEVBQUUsa0JBQW1DO1FBQWpFLGtEQUE0QjtRQUFFLCtEQUFtQztRQUM5RSxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxrQkFBa0IsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hELEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0MsSUFBSSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsRUFBRSxFQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7Z0JBQUMsUUFBUSxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxFQUFFLENBQUMsQ0FBQyxrQkFBa0IsSUFBSSxrQkFBa0IsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUNuRCxrQkFBa0IsR0FBRyxRQUFRLENBQUM7Z0JBQ2xDLENBQUM7Z0JBQ0QsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNsQixDQUFDO1FBQ0wsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLGtCQUFrQixDQUFDO1lBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSwyQ0FBa0IsR0FBekIsVUFBMEIsSUFBc0IsRUFBRSxXQUE0QixFQUFFLG1CQUFvQztRQUFsRSxpREFBNEI7UUFBRSxpRUFBb0M7UUFDaEgsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNEOzs7T0FHRztJQUNJLDBDQUFpQixHQUF4QixVQUF5QixJQUFtQixFQUFFLFdBQTRCLEVBQUUsbUJBQW9DO1FBQWxFLGlEQUE0QjtRQUFFLGlFQUFvQztRQUM1RyxJQUFJLENBQUMsaUJBQWlCLENBQStCLElBQUssRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEcsQ0FBQztJQUNPLDBDQUFpQixHQUF6QixVQUEwQixJQUFxQixFQUFFLFdBQW9CLEVBQUUsbUJBQTRCLEVBQUUsT0FBZ0I7UUFDakgsRUFBRSxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUN6QyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFDTyw4Q0FBcUIsR0FBN0IsVUFBOEIsSUFBcUIsRUFBRSxRQUF5QixFQUFFLFdBQW9CLEVBQUUsbUJBQTRCLEVBQUUsT0FBZ0I7UUFDaEosR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdkMsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLEVBQUUsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUM7Z0JBQUMsUUFBUSxDQUFDO1lBQ3pDLEVBQUUsRUFBQyxPQUFPLElBQUksRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xCLENBQUM7WUFDRCxFQUFFLEVBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ0MsRUFBRyxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBZSxFQUFHLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN2SCxDQUFDO1lBQ0QsSUFBSSxDQUFDLENBQUM7Z0JBQ0YsRUFBRSxFQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztvQkFDckIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBdUIsRUFBRyxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDckksQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUNELHNCQUFJLGdDQUFJO2FBQVI7WUFDSSxFQUFFLEVBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdEMsQ0FBQztZQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzFCLENBQUM7OztPQUFBO0lBSUQsc0JBQVcsb0NBQVE7UUFIbkI7O1dBRUc7YUFDSCxjQUF3QixNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFDakYsNENBQW1CLEdBQTFCO1FBQ0ksR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0MsQ0FBQztJQUNMLENBQUM7SUFLRCxzQkFBVyxpREFBcUI7UUFKaEM7OztXQUdHO2FBQ0gsY0FBNkMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEgsVUFBaUMsS0FBYTtZQUMxQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDeEUsQ0FBQzs7O09BSCtHO0lBQUEsQ0FBQztJQUdoSCxDQUFDO0lBQ0YsaURBQXdCLEdBQXhCO1FBQ0ksRUFBRSxFQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxTQUFTLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDO1FBQzlFLEVBQUUsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUM5RCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztJQUNuRSxDQUFDO0lBQ0Qsc0JBQWMsZ0NBQUk7YUFBbEI7WUFDSSxJQUFJLEdBQUcsR0FBbUIsSUFBSSxDQUFDO1lBQy9CLE9BQU0sR0FBRyxDQUFDLE1BQU07Z0JBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUNmLENBQUM7OztPQUFBO0lBQ1Msa0NBQVMsR0FBbkIsY0FBMEMsTUFBTSxDQUFDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlFLHFDQUFZLEdBQVo7UUFDSSxHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEMsQ0FBQztRQUNELEVBQUUsRUFBQyxJQUFJLENBQUMsbUJBQW1CLENBQUM7WUFBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM1RCxDQUFDO0lBQ1Msc0NBQWEsR0FBdkI7UUFDSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixFQUFFLEVBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDdkYsQ0FBQztJQUNELHNCQUFZLHdDQUFZO2FBQXhCLGNBQTZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFDdEUscUNBQVksR0FBcEIsVUFBcUIsT0FBaUIsRUFBRSxLQUFhO1FBQ2pELE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLEVBQUUsRUFBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNqQixJQUFJLENBQUMsR0FBZSxPQUFPLENBQUM7WUFDNUIsRUFBRSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNiLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0RCxDQUFDO1FBQ0wsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osRUFBRSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNiLElBQUksQ0FBQyxHQUFpQixPQUFPLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6RCxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNKLE9BQVEsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsRUFBRSxjQUFjLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEosT0FBUSxDQUFDLHNDQUFzQyxDQUFDLGtCQUFrQixFQUFFLGNBQWMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5SixDQUFDO0lBQ08sd0NBQWUsR0FBdkIsVUFBd0IsT0FBaUI7UUFDckMsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDVixPQUFRLENBQUMsMENBQTBDLENBQUMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZILEVBQUUsRUFBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLEVBQUUsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFlLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNKLEVBQUUsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELENBQUM7SUFDTCxDQUFDO0lBQ08sbURBQTBCLEdBQWxDLFVBQW1DLE9BQVk7UUFDM0MsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDakIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxFQUFFLEVBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDTCxDQUFDO0lBQ08seURBQWdDLEdBQXhDLFVBQXlDLE9BQVk7UUFDakQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFDTyw2Q0FBb0IsR0FBNUIsVUFBNkIsT0FBWTtRQUNyQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDN0MsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDcEIsS0FBSyxDQUFDO1lBQ1YsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBQ08sa0NBQVMsR0FBakI7UUFDSSxJQUFJLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBb0IsQ0FBQztRQUMzQyxJQUFJLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzdCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUM3QyxJQUFJLEdBQUcsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLEVBQUUsRUFBQyxRQUFRLENBQUM7Z0JBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNyQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUlELHNCQUFXLDBDQUFjO1FBSHpCOztXQUVHO2FBQ0g7WUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0QsQ0FBQzs7O09BQUE7SUFDUyx5Q0FBZ0IsR0FBMUIsVUFBMkIsR0FBVztRQUNsQyxFQUFFLEVBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUMzRSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUN4RixDQUFDO0lBS0Qsc0JBQVcsbUNBQU87UUFKbEI7OztXQUdHO2FBQ0gsY0FBZ0MsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2hGLFVBQW1CLEtBQWM7WUFDN0IsRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQ25DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbkQsRUFBRSxFQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2dCQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hELENBQUM7OztPQU4rRTtJQU90RSx5Q0FBZ0IsR0FBMUI7UUFDSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBSUQsc0JBQVcscUNBQVM7UUFIcEI7O1dBRUc7YUFDSCxjQUFtQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFDckgseUNBQWdCLEdBQWhCLFVBQWlCLGlCQUE0QjtRQUN6QyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2hDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM3QyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLGlCQUFpQixDQUFDO2dCQUFDLFFBQVEsQ0FBQztZQUNyRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQy9DLENBQUM7UUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFDRDs7OztPQUlHO0lBQ0ksbUNBQVUsR0FBakIsVUFBa0IsT0FBaUIsRUFBRSxLQUFrQjtRQUFsQixpQ0FBaUIsQ0FBQztRQUNuRCxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQzVCLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDTCxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLG9DQUFXLEdBQWxCLFVBQW1CLFFBQXNCLEVBQUUsS0FBa0I7UUFBbEIsaUNBQWlCLENBQUM7UUFDekQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSxpQ0FBUSxHQUFmLFVBQWdCLEtBQWlCLEVBQUUsS0FBa0I7UUFBbEIsaUNBQWlCLENBQUM7UUFDakQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSx1Q0FBYyxHQUFyQixVQUFzQixZQUFvQixFQUFFLElBQW1CO1FBQW5CLGtDQUFtQjtRQUMzRCxJQUFJLFFBQVEsR0FBRyx5RUFBZSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0IsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksb0NBQVcsR0FBbEIsVUFBbUIsSUFBbUI7UUFBbkIsa0NBQW1CO1FBQ2xDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFDUyx1Q0FBYyxHQUF4QixVQUF5QixJQUFZO1FBQ2pDLE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLHNDQUFhLEdBQXBCLFVBQXFCLE9BQWlCO1FBQ2xDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1osR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztnQkFDNUMsRUFBRSxFQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDNUQsQ0FBQztZQUNELE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFDRDs7Ozs7T0FLRztJQUNJLHVDQUFjLEdBQXJCLFVBQXNCLFFBQXNCO1FBQ3hDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNELHFDQUFZLEdBQVosVUFBYSxNQUFzQjtRQUMvQixHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDNUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLG9FQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDakQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ0Qsd0NBQWUsR0FBZjtRQUNJLEdBQUcsRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUU7UUFDdEMsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELDBDQUFpQixHQUFqQixVQUFrQixJQUFZO1FBQzFCLEdBQUcsRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDcEMsRUFBRSxFQUFDLENBQUMsVUFBVSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ3ZCLEVBQUUsRUFBQyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlCLENBQUM7SUFDTCxDQUFDO0lBQ0wscUJBQUM7QUFBRCxDQUFDLENBcmJtQyw0REFBYTs7QUFDOUIsMkJBQVksR0FBRyxHQUFHLENBQUM7QUFzYnRDOzs7R0FHRztBQUNIO0lBQWdDLDZFQUFjO0lBQzFDLG9CQUFtQixJQUFpQjtRQUFqQixnQ0FBaUI7UUFBcEMsWUFDSSxrQkFBTSxJQUFJLENBQUMsU0FDZDtRQUZrQixVQUFJLEdBQUosSUFBSSxDQUFhOztJQUVwQyxDQUFDO0lBQ00sNEJBQU8sR0FBZCxjQUEyQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUM1QyxzQkFBVywrQkFBTzthQUFsQixjQUFnQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFJOUMsc0JBQVcsNkJBQUs7UUFIaEI7O1dBRUc7YUFDSCxjQUE2QixNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNyRSxVQUFpQixHQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQUREO0lBS3JFLHNCQUFXLG1DQUFXO1FBSHRCOztXQUVHO2FBQ0gsY0FBbUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3BGLFVBQXVCLEdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREU7SUFFcEYsc0JBQUksbUNBQVc7YUFBZixjQUE0QixNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMxRSxVQUFnQixHQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQUREO0lBSzFFLHNCQUFXLHdDQUFnQjtRQUgzQjs7V0FFRzthQUNILGNBQXlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2xHLFVBQTRCLEtBQWMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FEQztJQUtsRyxzQkFBVyxtQ0FBVztRQUh0Qjs7V0FFRzthQUNILGNBQW1DLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNwRixVQUF1QixHQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURFO0lBRTFFLHFDQUFnQixHQUExQjtRQUNJLGlCQUFNLGdCQUFnQixXQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzRCxDQUFDO0lBQ0osQ0FBQztJQUNOLGlCQUFDO0FBQUQsQ0FBQyxDQW5DK0IsY0FBYyxHQW1DN0M7O0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sRUFBRyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDakosRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLHFCQUFxQjtJQUNqRSxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFO0lBQ3BHLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxVQUFVLEVBQUU7SUFDekQsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLGNBQWMsTUFBTSxDQUFDLElBQUksY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUV0SCwrREFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUUsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxFQUFFLEVBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFFLGNBQWMsTUFBTSxDQUFDLElBQUksVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyaUJqSjtBQUNoQztBQUNTO0FBQytDO0FBQ3hDO0FBQ0M7QUFDZjtBQUNhO0FBQzRCO0FBTzdCO0FBQ0E7QUFvQmxEO0lBQTBDLHVGQUFJO0lBSzFDLDhCQUFZLElBQVksRUFBRSxLQUFvQjtRQUFwQixvQ0FBb0I7UUFBOUMsWUFDSSxpQkFBTyxTQVVWO1FBYk0sY0FBUSxHQUF1QixJQUFJLENBQUM7UUFDcEMsZ0JBQVUsR0FBMkIsSUFBSSxLQUFLLEVBQW1CLENBQUM7UUFHckUsS0FBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsS0FBSSxDQUFDLFlBQVksR0FBRyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckQsSUFBSSxJQUFJLEdBQUcsS0FBSSxDQUFDO1FBQ2hCLElBQUksYUFBYSxHQUFHLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsS0FBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RFLGFBQWEsQ0FBQyxzQkFBc0IsR0FBRyxVQUFTLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRixLQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsS0FBSSxDQUFDLENBQUM7UUFDckQsS0FBSSxDQUFDLHVCQUF1QixDQUFDLGFBQWEsRUFBRSxLQUFJLENBQUMsQ0FBQztRQUNsRCxLQUFJLENBQUMsWUFBWSxHQUFHLElBQUksMEVBQWUsRUFBRSxDQUFDO1FBQzFDLEVBQUUsRUFBQyxLQUFLLENBQUM7WUFBQyxLQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzs7SUFDakMsQ0FBQztJQUNNLHNDQUFPLEdBQWQsY0FBbUIsTUFBTSxDQUFDLHNCQUFzQixFQUFDLENBQUM7SUFDbEQsc0JBQVcsc0NBQUk7YUFBZixjQUFvQixNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMzRCxVQUFnQixHQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURUO0lBRzNELHNCQUFXLDhDQUFZO2FBQXZCLGNBQW9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMzRixVQUF3QixHQUFXO1lBQy9CLEdBQUcsR0FBRyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLENBQUM7OztPQUowRjtJQUszRixzQkFBVywyQ0FBUzthQUFwQixjQUFpQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDckYsVUFBcUIsR0FBVztZQUM1QixHQUFHLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM1QyxDQUFDOzs7T0FKb0Y7SUFLckYsc0JBQVcsMENBQVE7YUFBbkIsY0FBZ0MsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3RGLFVBQW9CLEdBQVc7WUFDM0IsR0FBRyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDM0MsQ0FBQzs7O09BSnFGO0lBS3RGLHNCQUFXLHVDQUFLO2FBQWhCLGNBQTZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDeEYsVUFBaUIsR0FBVyxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FEVTtJQUV4RixzQkFBVywwQ0FBUTthQUFuQixjQUF3QixNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFDcEUsc0JBQVcsMkNBQVM7YUFBcEIsY0FBaUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBQy9FLDJDQUFZLEdBQW5CLFVBQW9CLEdBQVc7UUFDM0IsRUFBRSxFQUFDLENBQUMsR0FBRyxDQUFDO1lBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDekIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDbEIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUN0RSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUM7Z0JBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQztZQUNwQyxHQUFHLEdBQUcsV0FBVyxHQUFHLEdBQUcsQ0FBQztRQUM1QixDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFDRCxzQkFBVyxnREFBYzthQUF6QixjQUFzQyxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9GLFVBQTBCLEdBQVcsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBQzs7O09BREE7SUFFL0Ysc0JBQVcsbURBQWlCO2FBQTVCLGNBQW9ELE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBQ3pHLHNCQUFXLDZDQUFXO2FBQXRCLGNBQW1DLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3pGLFVBQXVCLEdBQVcsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREQ7SUFFekYsc0JBQVcsZ0RBQWM7YUFBekIsY0FBaUQsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBRW5HLHNCQUFXLHlDQUFPO2FBQWxCLGNBQW1DLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQzthQUM5RCxVQUFtQixRQUFvQixJQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FEM0I7SUFFOUQsc0JBQVcsMENBQVE7YUFBbkIsY0FBZ0MsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDL0UsVUFBb0IsR0FBVztZQUMzQixFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzQyxDQUFDOzs7T0FKOEU7SUFLL0Usc0JBQVcsNENBQVU7YUFBckIsY0FBbUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3ZGLFVBQXNCLEdBQVksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BRE07SUFFdkYsc0JBQVcsMENBQVE7YUFBbkIsY0FBaUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ25GLFVBQW9CLEdBQVksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BRE07SUFFbkYsc0JBQVcsMENBQVE7YUFBbkIsY0FBZ0MsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9FLFVBQW9CLEdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREc7SUFFL0Usc0JBQVcsMkNBQVM7YUFBcEIsY0FBaUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2pGLFVBQXFCLEdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREc7SUFHakYsc0JBQVcscURBQW1CO2FBQTlCLGNBQXdDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9HLFVBQStCLEdBQVE7WUFDbkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELENBQUM7OztPQUg4RztJQUt4Ryx3Q0FBUyxHQUFoQixjQUE4QixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0UsOENBQWUsR0FBdEIsVUFBdUIsSUFBWSxJQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEcsbURBQW9CLEdBQTlCLFVBQStCLElBQVksRUFBRSxRQUFhLEVBQUUsUUFBYTtRQUNyRSxpQkFBTSxvQkFBb0IsWUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELEVBQUUsRUFBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0wsQ0FBQztJQUNMLDJCQUFDO0FBQUQsQ0FBQyxDQXJGeUMsbURBQUksR0FxRjdDOztBQUVEO0lBRUksNEJBQW1CLE1BQTRCLEVBQVMsR0FBK0IsRUFBUyxJQUF5QjtRQUF6SCxpQkFZQztRQVprQixXQUFNLEdBQU4sTUFBTSxDQUFzQjtRQUFTLFFBQUcsR0FBSCxHQUFHLENBQTRCO1FBQVMsU0FBSSxHQUFKLElBQUksQ0FBcUI7UUFDckgsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEdBQUcsY0FBYSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hILCtFQUEwQixDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQVE7WUFDdkUsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNqQyxFQUFFLEVBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLFNBQVMsSUFBSSxLQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN2RyxLQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM1RCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFHO1FBQy9CLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFDRCxzQkFBVyx3Q0FBUTthQUFuQixjQUFrQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBQzlELHNCQUFXLHFDQUFLO2FBQWhCLGNBQTBCLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDdkQsVUFBaUIsS0FBVTtZQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDaEMsQ0FBQzs7O09BSHNEO0lBSWhELHlDQUFZLEdBQW5CLFVBQW9CLE1BQXNCO1FBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDTCx5QkFBQztBQUFELENBQUM7O0FBRUQ7SUFXSSxvQ0FBWSxJQUF5QixFQUFFLEtBQVU7UUFQekMsY0FBUyxHQUFtQixFQUFFLENBQUM7UUFDL0IsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFFaEMscUJBQWdCLEdBQUcsSUFBSSwyRUFBZ0IsRUFBRSxDQUFDO1FBRTNDLFVBQUssR0FBOEIsRUFBRSxDQUFDO1FBR3pDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLDJFQUFnQixFQUFFLENBQUM7UUFDL0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEdBQUcsVUFBVSxJQUFZLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLFVBQVUsSUFBWSxFQUFFLGtCQUEyQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEosR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNoRCxFQUFFLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztZQUNyRCxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsMEJBQTBCLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEQsQ0FBQztJQXRCYyxnQ0FBSyxHQUFwQixjQUFpQyxNQUFNLENBQUMsT0FBTyxHQUFHLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQXVCM0Ysc0JBQVcsMENBQUU7YUFBYixjQUEwQixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBQ2hELHNCQUFXLCtDQUFPO2FBQWxCLGNBQXVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUNyQyxzQkFBVyw2Q0FBSzthQUFoQixjQUEwQixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7YUFFbEQsVUFBaUIsS0FBVTtZQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUNwQixFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDaEIsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3JDLENBQUM7WUFDTCxDQUFDO1lBQ0QsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDMUYsQ0FBQztZQUNELElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLENBQUM7OztPQWRpRDtJQUNsRCxpREFBWSxHQUFaLGNBQXVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQWNwQyxzREFBaUIsR0FBeEIsVUFBeUIsSUFBYTtRQUNsQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNMLENBQUM7SUFDTSw2Q0FBUSxHQUFmLFVBQWdCLElBQVk7UUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNNLDZDQUFRLEdBQWYsVUFBZ0IsSUFBWSxFQUFFLFFBQWE7UUFDdkMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUNoQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEtBQUssRUFBRSxDQUFDO1lBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQyxFQUFFLENBQUMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUNwQyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBQ00sK0NBQVUsR0FBakIsVUFBa0IsSUFBWTtRQUMxQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxtREFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBQ00sK0NBQVUsR0FBakIsVUFBa0IsSUFBWSxFQUFFLFFBQWdCO1FBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLG1EQUFJLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFDRCxzQkFBVywrQ0FBTzthQUFsQjtZQUNJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDckIsRUFBRSxDQUFDLENBQUMseURBQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUMzQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUM7b0JBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNsRSxDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNoQixDQUFDOzs7T0FBQTtJQUNNLHdEQUFtQixHQUExQixVQUEyQixNQUE0QjtRQUNuRCxHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDO1lBQ3pDLEVBQUUsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUM7Z0JBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ3JFLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFDTSw4Q0FBUyxHQUFoQixjQUE2QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFDO0lBQ3JFLG9EQUFlLEdBQXRCLFVBQXVCLElBQVksSUFBSyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdGLG9EQUFlLEdBQXRCO1FBQ0ksR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM3QyxDQUFDO0lBQ0wsQ0FBQztJQUNNLGlEQUFZLEdBQW5CLFVBQW9CLE1BQXNCO1FBQ3RDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzNCLEdBQUcsRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsQ0FBQztJQUNMLENBQUM7SUFDUywrQ0FBVSxHQUFwQjtRQUNJLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ2hDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNMLENBQUM7SUFDUywrQ0FBVSxHQUFwQixVQUFxQixNQUE0QjtRQUM3QyxNQUFNLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQ0QsaURBQVksR0FBWixjQUE4QixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM1Qyw4Q0FBUyxHQUFULGNBQXVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN6RSxpQkFBaUI7SUFDVCwwREFBcUIsR0FBN0IsVUFBOEIsSUFBWTtRQUN0QyxJQUFJLFNBQVMsR0FBRyxJQUFJLDRFQUFZLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEQsTUFBTSxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUNPLDBEQUFxQixHQUE3QixVQUE4QixJQUFZLEVBQUUsa0JBQTJCO1FBQ25FLGdDQUFnQztRQUNoQyxJQUFJLE1BQU0sR0FBRyxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLElBQUksNEVBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNELHFEQUFnQixHQUFoQixjQUFxQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNuRCxnREFBVyxHQUFYLFVBQVksSUFBWSxFQUFFLGtCQUEyQjtRQUNqRCxJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUMvRCxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ0Qsa0RBQWEsR0FBYixVQUFjLElBQVk7UUFDdEIsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUkscUJBQXFCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDO1FBQ3hFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0MsR0FBRyxDQUFDLHFCQUFxQixHQUFHLEdBQUcsQ0FBQyxxQkFBcUIsSUFBSSxxQkFBcUIsQ0FBQztRQUMvRSxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUNMLGlDQUFDO0FBQUQsQ0FBQzs7QUFoSWtCLG9DQUFTLEdBQVcsQ0FBQyxDQUFDO0FBa0l6Qzs7R0FFRztBQUNIO0lBQXFELGtHQUFRO0lBYXpELHlDQUFtQixJQUFZO1FBQS9CLFlBQ0ksa0JBQU0sSUFBSSxDQUFDLFNBTWQ7UUFQa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUx2QixtQkFBYSxHQUFHLEtBQUssQ0FBQztRQUNwQiwwQkFBb0IsR0FBc0MsSUFBSSxDQUFDO1FBTXJFLElBQUksSUFBSSxHQUFHLEtBQUksQ0FBQztRQUNoQixLQUFJLENBQUMsWUFBWSxHQUFHLEtBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLFVBQVMsSUFBSSxJQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUMsQ0FBRSxDQUFDO1FBQzVGLEtBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFJLENBQUMsQ0FBQztRQUNyRCxLQUFJLENBQUMsc0NBQXNDLENBQUMsU0FBUyxFQUFFLGNBQVksSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7SUFDNUosQ0FBQztJQW5CYyxpREFBaUIsR0FBaEMsVUFBaUMsTUFBdUM7UUFDcEUsSUFBSSxRQUFRLEdBQUcsMEVBQWUsQ0FBQyxhQUFhLENBQUM7UUFDN0MsR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUc7WUFDcEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBZ0JNLGlEQUFPLEdBQWQ7UUFDSSxNQUFNLENBQUMsb0JBQW9CLENBQUM7SUFDaEMsQ0FBQztJQUNELHNCQUFXLDZEQUFnQjthQUEzQjtZQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDakIsQ0FBQzs7O09BQUE7SUFJRCxzQkFBVyxvREFBTztRQUhsQjs7V0FFRzthQUNILGNBQW9ELE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQzthQUMvRSxVQUFtQixLQUFrQztZQUNqRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUM7OztPQUg4RTtJQUlyRSw0REFBa0IsR0FBNUIsVUFBNkIsR0FBZ0M7UUFDekQsRUFBRSxFQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUN4QixJQUFJLE9BQU8sR0FBRyxFQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDLENBQUM7UUFDM0gsR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztZQUMzQyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsT0FBTyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUN6QyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLE9BQU8sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNyQyxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNMLENBQUM7SUFJRCxzQkFBVyxxREFBUTtRQUhuQjs7V0FFRzthQUNILGNBQWdDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN2RixVQUFvQixHQUFXO1lBQzNCLEdBQUcsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDeEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNoRCxDQUFDOzs7T0FOc0Y7SUFVdkYsc0JBQVcsMkRBQWM7UUFIekI7O1dBRUc7YUFDSCxjQUFzQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMxRixVQUEwQixLQUFhO1lBQ25DLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDbkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDaEQsQ0FBQzs7O09BTHlGO0lBUzFGLHNCQUFXLDJEQUFjO1FBSHpCOztXQUVHO2FBQ0gsY0FBc0MsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDM0YsVUFBMEIsR0FBVyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURHO0lBSzNGLHNCQUFXLDZEQUFnQjtRQUgzQjs7V0FFRzthQUNILGNBQXlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ25HLFVBQTRCLEdBQVksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FETTtJQUc1Rix5REFBZSxHQUF0QixjQUFtQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLG1FQUF5QixHQUF6QixVQUEwQixNQUE0QjtRQUNsRCxFQUFFLEVBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDdEMsR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDO1lBQ3hELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QyxHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDO2dCQUN4QyxFQUFFLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDO29CQUFDLFFBQVEsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDL0QsS0FBSyxDQUFDO1lBQ1YsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBQ00sc0RBQVksR0FBbkIsVUFBb0IsTUFBc0I7UUFDdEMsaUJBQU0sWUFBWSxZQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ1MsMkRBQWlCLEdBQTNCLFVBQTRCLE1BQXNCO1FBQzlDLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUN0QyxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDbkIsRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLE1BQU0sWUFBWSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDckMsR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNMLENBQUM7SUFDTSx5REFBZSxHQUF0QjtRQUNJLGlCQUFNLGVBQWUsV0FBRSxDQUFDO1FBQ3hCLEdBQUcsRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUM1QixFQUFFLEVBQUMsQ0FBQyxJQUFJLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDakIsR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM5QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksdURBQWEsR0FBcEIsVUFBcUIsVUFBa0I7UUFDbkMsR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMxQyxFQUFFLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFDRDs7O09BR0c7SUFDSSx3REFBYyxHQUFyQixVQUFzQixNQUE0QjtRQUM5QyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDbkUsQ0FBQztJQUlELHNCQUFXLG9EQUFPO1FBSGxCOztXQUVHO2FBQ0gsY0FBbUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO2FBQzlELFVBQW1CLEdBQWU7WUFDOUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQyxDQUFDOzs7T0FINkQ7SUFPOUQsc0JBQVcsMkRBQWM7UUFIekI7O1dBRUc7YUFDSCxjQUE4QixNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixFQUFHLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hJLFVBQTBCLEdBQVcsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FEd0M7SUFFeEksc0JBQVcsOERBQWlCO2FBQTVCLGNBQWlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBQy9FLG1EQUFTLEdBQWhCLFVBQWlCLElBQVksRUFBRSxLQUFvQjtRQUFwQixvQ0FBb0I7UUFDL0MsSUFBSSxNQUFNLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBSUQsc0JBQVcsd0RBQVc7UUFIdEI7O1dBRUc7YUFDSDtZQUNJLEVBQUUsRUFBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQ2xDLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2hELEVBQUUsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDWCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRCxDQUFDO1lBQ0wsQ0FBQztZQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDckMsQ0FBQzs7O09BQUE7SUFDTSxzREFBWSxHQUFuQjtRQUNJLGlCQUFNLFlBQVksV0FBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7SUFDckMsQ0FBQztJQUNEOzs7T0FHRztJQUNJLHFEQUFXLEdBQWxCLFVBQW1CLFFBQWdCO1FBQy9CLEVBQUUsRUFBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUM3QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQy9CLEVBQUUsRUFBQyxRQUFRLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDM0MsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFDRDs7OztPQUlHO0lBQ0kscURBQVcsR0FBbEIsVUFBbUIsUUFBZ0IsRUFBRSxRQUFhO1FBQzlDLEVBQUUsRUFBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUM3QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQy9CLEVBQUUsRUFBQyxRQUFRLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ1Msc0RBQVksR0FBdEIsY0FBOEQsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEUsd0RBQWMsR0FBeEIsVUFBeUIsUUFBYSxJQUFTLE1BQU0sQ0FBQyxDQUFDLFFBQVEsR0FBRyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN4RSx5REFBZSxHQUF6QixVQUEwQixHQUErQixFQUFFLGFBQWtCLEVBQUUsTUFBdUI7UUFBdkIsdUNBQXVCO1FBQ2xHLElBQUksTUFBTSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDNUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNwQixNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ1osYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDeEMsQ0FBQztRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUNTLDREQUFrQixHQUE1QixVQUE2QixHQUErQixFQUFFLFFBQWE7UUFDdkUsR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztZQUMzQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLEVBQUUsRUFBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7WUFDL0QsQ0FBQztRQUNMLENBQUM7UUFDRCxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFDUyw4REFBb0IsR0FBOUIsVUFBK0IsR0FBUTtJQUN2QyxDQUFDO0lBQ1Msd0RBQWMsR0FBeEI7UUFDSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQy9CLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsRUFBRSxFQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUNqRixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN4RCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUNELG9FQUEwQixHQUExQjtRQUNJLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUNyQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ25DLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN2QixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNuQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQy9DLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUFDLFFBQVEsQ0FBQztZQUNyQixHQUFHLENBQUMsQ0FBQyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQztnQkFDekQsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFDeEMsRUFBRSxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQzlGLENBQUM7UUFDTCxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ00sbURBQVMsR0FBaEIsVUFBaUIsWUFBNEI7UUFBNUIsa0RBQTRCO1FBQ3pDLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxRCxNQUFNLENBQUMsaUJBQU0sU0FBUyxZQUFDLFlBQVksQ0FBQyxJQUFJLGNBQWMsQ0FBQztJQUMzRCxDQUFDO0lBQ00sc0RBQVksR0FBbkI7UUFDSSxJQUFJLE1BQU0sR0FBRyxpQkFBTSxZQUFZLFdBQUUsQ0FBQztRQUNsQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDckMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbkMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLEdBQUcsRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7Z0JBQ3hDLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNsRCxFQUFFLEVBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDN0IsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ25DLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUNPLDJEQUFpQixHQUF6QixVQUEwQixZQUFxQjtRQUMzQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDN0MsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3hELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDL0MsRUFBRSxFQUFDLENBQUMsS0FBSyxDQUFDO2dCQUFDLFFBQVEsQ0FBQztZQUNwQixHQUFHLENBQUMsQ0FBQyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUM7Z0JBQ2hFLEVBQUUsRUFBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFBQyxRQUFRLENBQUM7Z0JBQzlCLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQ3hDLEdBQUcsR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsQ0FBQztZQUNsRixDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDZixDQUFDO0lBQ1MsZ0VBQXNCLEdBQWhDO1FBQ0ksSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sR0FBRyxpQkFBTSxzQkFBc0IsV0FBRSxDQUFDO0lBQ3hFLENBQUM7SUFDUyxxRUFBMkIsR0FBckM7UUFDSSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0MsTUFBTSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsT0FBTyxHQUFHLGlCQUFNLDJCQUEyQixXQUFFLENBQUM7SUFDN0UsQ0FBQztJQUNTLDhEQUFvQixHQUE5QixVQUErQixPQUFnQjtRQUMzQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDNUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDeEQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUMvQyxHQUFHLENBQUMsQ0FBQyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUM7Z0JBQ2hFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO29CQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDO2dCQUM5QyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztvQkFBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVE7WUFDdkYsQ0FBQztRQUNMLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFDRCxxQkFBcUI7SUFDZCx3REFBYyxHQUFyQixVQUFzQixHQUErQixFQUFFLE1BQTRCO1FBQy9FLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDUyw0REFBa0IsR0FBNUIsVUFBNkIsR0FBK0IsRUFBRSxNQUE0QjtRQUN0RixJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDOUUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUQsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFDUywwREFBZ0IsR0FBMUIsVUFBMkIsTUFBNEI7UUFDbkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN2RixDQUFDO0lBQ1MsaUVBQXVCLEdBQWpDLFVBQWtDLE1BQTRCO1FBQzFELE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUMvRSxDQUFDO0lBQ1MsK0RBQXFCLEdBQS9CLFVBQWdDLFFBQWtCLEVBQUUsTUFBNEIsRUFBRSxHQUErQjtRQUM3RyxFQUFFLEVBQUMsQ0FBQyxRQUFRLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDckIsUUFBUSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQzVCLFFBQVEsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUN4QyxRQUFRLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDcEMsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2xDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUN4QyxRQUFRLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDdEMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbEIsRUFBRSxDQUFDLENBQUMsUUFBUSxZQUFZLGdGQUFrQixDQUFDLENBQUMsQ0FBQztnQkFDcEIsUUFBUyxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztZQUNoRSxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzQixFQUFFLEVBQUMsQ0FBQyxJQUFJLFVBQVUsSUFBSSxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNmLFFBQVMsQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDMUcsSUFBSSxDQUFDLHVCQUF1QixDQUFxQixRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFDRCxFQUFFLEVBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDTSxRQUFTLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4RixJQUFJLENBQUMsdUJBQXVCLENBQXFCLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUNELEVBQUUsRUFBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNPLFFBQVMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUN2QyxRQUFTLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDbkUsQ0FBQztRQUNELEVBQUUsRUFBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNPLFFBQVMsQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsRUFBRSxFQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ08sUUFBUyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUM7WUFDcEQsUUFBUyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEQsQ0FBQztJQUNMLENBQUM7SUFDUyxpRUFBdUIsR0FBakMsVUFBa0MsUUFBNEIsRUFBRSxNQUE0QixFQUFFLEdBQStCO1FBQ3pILFFBQVEsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztRQUM1QyxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqRCxRQUFRLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkQsRUFBRSxFQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDTCxDQUFDO0lBQ1MsNERBQWtCLEdBQTVCLFVBQTZCLFlBQW9CLEVBQUUsSUFBWTtRQUMzRCxNQUFNLENBQVcsMEVBQWUsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBQ1Msd0RBQWMsR0FBeEIsVUFBeUIsUUFBYSxFQUFFLEdBQStCO1FBQ25FLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxRQUFRLENBQUM7SUFDL0QsQ0FBQztJQUNELDJEQUFpQixHQUFqQixVQUFrQixJQUFZO1FBQzFCLEVBQUUsRUFBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDbEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUM1QixHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLENBQUM7SUFDTCxDQUFDO0lBQ1MsNERBQWtCLEdBQTVCLFVBQTZCLEdBQStCLEVBQUUsVUFBa0IsRUFBRSxRQUFhO1FBQzNGLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDeEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksV0FBVyxHQUFHLFVBQVMsT0FBTztZQUM5QixHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7Z0JBQ3ZDLEVBQUUsRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUNqQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQ2pDLENBQUM7WUFDTCxDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNoQixDQUFDO1FBQ0QsSUFBSSxPQUFPLEdBQUcsRUFBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUMsQ0FBQztRQUNoSSxJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0Qsc0RBQVksR0FBWixVQUFhLEdBQStCLEVBQUUsVUFBa0IsRUFBRSxRQUFhO1FBQzNFLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDeEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksT0FBTyxHQUFHLEVBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBQyxDQUFDO1FBQ2xHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBQ0Qsc0RBQVksR0FBWixVQUFhLEdBQStCLEVBQUUsVUFBa0IsRUFBRSxXQUFnQjtRQUM5RSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxFQUFFLEVBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUN0RCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekQsRUFBRSxFQUFDLENBQUMsUUFBUSxDQUFDO1lBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUM1QixHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUM7WUFBQyxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ2QsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3RELEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQzFCLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN0QyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQyxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsRUFBRSxFQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDckQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixFQUFFLEVBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNaLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7SUFDTCxDQUFDO0lBQ08sNERBQWtCLEdBQTFCLFVBQTJCLEdBQUc7UUFDMUIsRUFBRSxFQUFDLENBQUMsR0FBRyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ2hCLEVBQUUsRUFBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7Z0JBQ2xDLEVBQUUsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNwRCxDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNoQixDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsbURBQVMsR0FBVCxjQUF1QixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDaEQsc0NBQUM7QUFBRCxDQUFDLENBcGFvRCwyREFBUSxHQW9hNUQ7O0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLHNCQUFzQixFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxVQUFVLEVBQUU7SUFDMUcsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsVUFBVSxFQUFFLFVBQVUsR0FBUSxJQUFJLE1BQU0sQ0FBQyw2REFBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLFVBQVUsR0FBUSxFQUFFLEtBQVUsSUFBSSxHQUFHLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQztJQUMvSyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxtQkFBbUIsRUFBQyxFQUFHLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxFQUFFO0lBQzFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsRUFBQztJQUN0TCxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRTtJQUNyRixFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLFVBQVUsR0FBUSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsVUFBVSxHQUFRLEVBQUUsS0FBVSxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ2pQLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLENBQUMsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBRTtJQUN0RyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRTtJQUN2TCxxQkFBcUIsRUFBRSxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQzNILGNBQWMsTUFBTSxDQUFDLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUUxRCwrREFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSwrQkFBK0IsRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUM7SUFDdkgsMEJBQTBCO0lBQzFCLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxVQUFVLEdBQVEsSUFBSSxNQUFNLENBQUMsNkRBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxVQUFVLEdBQVEsRUFBRSxLQUFVLElBQUksR0FBRyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUM7SUFDL0ssRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsbUJBQW1CLEVBQUU7SUFDdEUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsRUFBRTtJQUN4SCxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLGdCQUFnQixDQUFDLEVBQ3ZGLGNBQWMsTUFBTSxDQUFDLElBQUksK0JBQStCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUNodEJtRDtBQUU1RjtBQUNLO0FBRU07QUFDWTtBQUUvRDs7O0dBR0c7QUFDSDtJQUFrQywrRUFBYTtJQWlCM0Msc0JBQW1CLElBQVk7UUFBL0IsWUFDSSxrQkFBTSxJQUFJLENBQUMsU0FHZDtRQUprQixVQUFJLEdBQUosSUFBSSxDQUFRO1FBWnZCLHFCQUFlLEdBQW9CLElBQUksQ0FBQztRQUN4Qyw2QkFBdUIsR0FBWSxLQUFLLENBQUM7UUFFakQsc0JBQWdCLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDMUM7OztXQUdHO1FBQ0ksbUJBQWEsR0FBOEMsSUFBSSxvREFBSyxFQUFzQyxDQUFDO1FBTTlHLEtBQUksQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZDLEtBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzs7SUFDdEIsQ0FBQztJQW5CYywwQkFBYSxHQUE1QjtRQUNJLE1BQU0sQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFrQk0sOEJBQU8sR0FBZCxjQUEyQixNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUluRCxzQkFBVyxnQ0FBTTtRQUhqQjs7V0FFRzthQUNILGNBQThCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM3RSxVQUFrQixHQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURLO0lBSzdFLHNCQUFXLGlDQUFPO1FBSGxCOztXQUVHO2FBQ0gsY0FBZ0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBSy9DLHNCQUFXLGlDQUFPO1FBSmxCOzs7V0FHRzthQUNILGNBQWdDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoRixVQUFtQixHQUFZO1lBQzNCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUNoQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25ELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNkLElBQUksQ0FBQyxNQUFNLENBQUMseUJBQXlCLENBQVksSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6RSxDQUFDO1FBQ0wsQ0FBQzs7O09BUitFO0lBYWhGLHNCQUFXLG1DQUFTO1FBSnBCOzs7V0FHRzthQUNILGNBQWlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNqRixVQUFxQixHQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURHO0lBS2pGLHNCQUFXLG1DQUFTO1FBSHBCOztXQUVHO2FBQ0gsY0FBa0MsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBSTdFLHNCQUFXLHNDQUFZO1FBSHZCOztXQUVHO2FBQ0gsY0FBcUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQU90RixzQkFBVyxvQ0FBVTtRQU5yQjs7Ozs7V0FLRzthQUNILGNBQTBCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUl4QyxzQkFBVyxzQ0FBWTtRQUh2Qjs7V0FFRzthQUNILGNBQW9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUN2Rjs7O09BR0c7SUFDSSxnQ0FBUyxHQUFoQixVQUFpQixZQUE0QjtRQUE1QixrREFBNEI7UUFBYSxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQUMsQ0FBQztJQUl6RSxzQkFBVywyQ0FBaUI7UUFINUI7O1dBRUc7YUFDSCxjQUF5QyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFJcEQsc0JBQVcsa0NBQVE7UUFIbkI7O1dBRUc7YUFDSCxjQUFpQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFJaEQsc0JBQVcsd0NBQWM7UUFIekI7O1dBRUc7YUFDSCxjQUF1QyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFJdEQsc0JBQVcsa0NBQVE7UUFIbkI7O1dBRUc7YUFDSCxjQUFpQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFJaEQsc0JBQVcsb0NBQVU7UUFIckI7O1dBRUc7YUFDSCxjQUFtQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFJbEQsc0JBQVcsNEJBQUU7UUFIYjs7V0FFRzthQUNILGNBQTBCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9ELFVBQWMsR0FBVyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FERDtJQUUvRDs7T0FFRztJQUNJLG1DQUFZLEdBQW5CLGNBQTRDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBSXhELHNCQUFXLHNDQUFZO1FBSHZCOztXQUVHO2FBQ0g7WUFDSSxFQUFFLEVBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM5QixDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNsQyxDQUFDOzs7T0FBQTtJQUNNLHlDQUFrQixHQUF6QjtRQUNJLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxzRkFBc0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFJRCxzQkFBVywwQ0FBZ0I7UUFIM0I7O1dBRUc7YUFDSCxjQUF5QyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNsRyxVQUE0QixHQUFZO1lBQ3BDLEVBQUUsRUFBQyxJQUFJLENBQUMsZ0JBQWdCLElBQUksR0FBRyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUN4QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbkQsQ0FBQzs7O09BSmlHO0lBU2xHLHNCQUFXLG9DQUFVO1FBSnJCOzs7V0FHRzthQUNIO1lBQ0ksSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUN6QixJQUFJLE9BQU8sR0FBRyxFQUFFLEtBQUssRUFBRyxFQUFFLEVBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzFDLEVBQUUsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDYixJQUFJLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNuQixDQUFDOzs7T0FBQTtJQUNTLGlDQUFVLEdBQXBCLFVBQXFCLE9BQVksSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzFELHVDQUFnQixHQUExQixVQUEyQixHQUFRLEVBQUUsU0FBYztRQUMvQyxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdkMsRUFBRSxDQUFDLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ3BELEVBQUUsQ0FBQyxDQUFDLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLFlBQVksTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN6RCxHQUFHLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztRQUN0QixDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixHQUFHLEVBQUMsSUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDcEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFDTyxxQ0FBYyxHQUF0QixVQUF1QixJQUFTLEVBQUUsTUFBVztRQUN6QyxFQUFFLEVBQUMsQ0FBQyxNQUFNLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDbkIsRUFBRSxDQUFDLENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sWUFBWSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDMUIsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osR0FBRyxFQUFDLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUIsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBQ0Qsc0JBQVksNkJBQUc7YUFBZixjQUF5QixNQUFNLENBQUMsMEVBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBSXJELHNCQUFXLCtCQUFLO1FBSGhCOztXQUVHO2FBQ0gsY0FBOEIsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzFFLFVBQWlCLEdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREk7SUFLMUUsc0JBQVcscUNBQVc7UUFIdEI7O1dBRUc7YUFDSCxjQUFtQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDckYsVUFBdUIsR0FBVyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FERztJQUtyRixzQkFBVyxnQ0FBTTtRQUhqQjs7V0FFRzthQUNILGNBQThCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMxRSxVQUFrQixHQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURFO0lBSzFFLHNCQUFXLHFDQUFXO1FBSHRCOztXQUVHO2FBQ0gsY0FBbUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3BGLFVBQXVCLEdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREU7SUFFcEY7OztPQUdHO0lBQ0ksNEJBQUssR0FBWixVQUFhLE9BQXdCO1FBQXhCLHlDQUF3QjtJQUFJLENBQUM7SUFDaEMsbUNBQVksR0FBdEIsVUFBdUIsUUFBb0I7UUFDdkMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQUMsUUFBUSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUNTLGlDQUFVLEdBQXBCLGNBQXlCLENBQUM7SUFDMUI7Ozs7Ozs7T0FPRztJQUNJLG1DQUFZLEdBQW5CLFVBQW9CLE1BQXNCO1FBQ3RDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUM1QixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7WUFBQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksb0VBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNqRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFDRCxXQUFXO0lBQ0osMkNBQW9CLEdBQTNCLFVBQTRCLFFBQWE7SUFDekMsQ0FBQztJQUNNLG1DQUFZLEdBQW5CO1FBQ0ksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ00sc0NBQWUsR0FBdEIsVUFBdUIsR0FBVztRQUM5QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLEdBQUcsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUNNLG9DQUFhLEdBQXBCLFVBQXFCLE9BQWlCLElBQWEsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDM0QsaURBQTBCLEdBQWpDLGNBQXNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzlDLHdDQUFpQixHQUF4QixjQUE0QixDQUFDO0lBQzdCLHNCQUFXLHNDQUFZO2FBQXZCO1lBQ0ksTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNkLENBQUM7OztPQUFBO0lBQ00sc0NBQWUsR0FBdEI7UUFDSSxpQkFBTSxlQUFlLFdBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUNELHdDQUFpQixHQUFqQixjQUFxQixDQUFDO0lBQ3RCLHdDQUFpQixHQUFqQixVQUFrQixJQUFZLElBQUUsQ0FBQztJQUNqQyxtQkFBbUI7SUFDbkI7OztPQUdHO0lBQ0ksZ0NBQVMsR0FBaEIsY0FBNkIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQTRCLElBQUksQ0FBQyxNQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRyxzQ0FBZSxHQUF0QixVQUF1QixJQUFZLElBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQTRCLElBQUksQ0FBQyxNQUFPLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEksbUJBQUM7QUFBRCxDQUFDLENBNU9pQyw0REFBYTs7QUFDNUIsNEJBQWUsR0FBRyxHQUFHLENBQUM7QUE0T3pDLCtEQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLHFCQUFxQjtJQUNwSCxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUMzUHpHO0FBRy9CO0lBQTBDLHVGQUF5QjtJQUcvRCw4QkFBWSxLQUFVO1FBQXRCLFlBQ0ksa0JBQU0sS0FBSyxDQUFDLFNBSWY7UUFLTyx5QkFBbUIsR0FBUSxJQUFJLENBQUM7UUFScEMsS0FBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzNCLEtBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUNyQixLQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDOztJQUMvQixDQUFDO0lBQ0Qsd0RBQXlCLEdBQXpCLFVBQTBCLFNBQWM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQy9CLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQztJQUM3QixDQUFDO0lBRUQsZ0RBQWlCLEdBQWpCO1FBQ0ksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDZCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7WUFDaEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHO2dCQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLENBQUM7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNuRSxDQUFDO0lBQ0wsQ0FBQztJQUNELG1EQUFvQixHQUFwQjtRQUNJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQ3BDLENBQUM7SUFDTCxDQUFDO0lBQ0wsMkJBQUM7QUFBRCxDQUFDLENBOUJ5QyxnREFBZSxHQThCeEQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pDOEI7QUFDZTtBQU1XO0FBRXpEO0lBQWdDLDZFQUF5QjtJQUtyRCxvQkFBWSxLQUFVO1FBQXRCLFlBQ0ksa0JBQU0sS0FBSyxDQUFDLFNBS2Y7UUFKRyxLQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDdkIsS0FBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzNCLEtBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM3QixLQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7O0lBQ3pCLENBQUM7SUFDRCw4Q0FBeUIsR0FBekIsVUFBMEIsU0FBYztRQUNwQyxJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQztRQUNqQyxJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUM7SUFDN0IsQ0FBQztJQUNELHNDQUFpQixHQUFqQjtRQUNJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0IsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7WUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQ0QsMkJBQU0sR0FBTjtRQUNJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNsRixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0MsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbEMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFDRCxNQUFNLENBQUMsQ0FDSCw4REFBSyxHQUFHLEVBQUMsTUFBTTtZQUNWLEtBQUs7WUFDTCxXQUFXO1lBQ1gsSUFBSSxDQUNILENBQ1QsQ0FBQztJQUNOLENBQUM7SUFDUyw4QkFBUyxHQUFuQixVQUFvQixHQUFxQixFQUFFLEtBQWE7UUFDcEQsSUFBSSxPQUFPLEdBQUcsS0FBSyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxxREFBQyxTQUFTLElBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFJLENBQUM7SUFDNUcsQ0FBQztJQUNTLGdDQUFXLEdBQXJCO1FBQ0ksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNqRSxJQUFJLElBQUksR0FBRyxnRkFBaUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqRSxNQUFNLENBQUMsQ0FBQyw2REFBSSxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUcsSUFBSSxDQUFNLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQ1Msc0NBQWlCLEdBQTNCO1FBQ0ksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN2RSxJQUFJLElBQUksR0FBRyxnRkFBaUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN2RSxNQUFNLENBQUMsQ0FBQyw4REFBSyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUcsSUFBSSxDQUFPLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBQ0wsaUJBQUM7QUFBRCxDQUFDLENBckQrQixnREFBZSxHQXFEOUM7O0FBRUQ7SUFBaUMsOEVBQXlCO0lBS3RELHFCQUFZLEtBQVU7UUFBdEIsWUFDSSxrQkFBTSxLQUFLLENBQUMsU0FNZjtRQUxHLEtBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN6QixLQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDM0IsS0FBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzdCLEtBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUNyQixLQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDOztJQUNyQyxDQUFDO0lBQ0QsK0NBQXlCLEdBQXpCLFVBQTBCLFNBQWM7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7UUFDakMsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDO0lBQzdCLENBQUM7SUFDRCx1Q0FBaUIsR0FBakI7UUFDSSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsRUFBRTtZQUN4RyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFDRCwwQ0FBb0IsR0FBcEI7UUFDSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMvSCxDQUFDO0lBQ0wsQ0FBQztJQUNELDRCQUFNLEdBQU47UUFDSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDbkYsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDdkMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzNDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsSUFBSSxLQUFLLEdBQUcsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ3hGLElBQUksU0FBUyxHQUFHLEVBQUcsQ0FBQztRQUNwQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUN4RSxNQUFNLENBQUMsQ0FDSCw4REFBSyxHQUFHLEVBQUMsTUFBTSxFQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVM7WUFDaEUsS0FBSztZQUNMLFdBQVc7WUFDWiw4REFBSyxLQUFLLEVBQUUsS0FBSyxJQUNaLElBQUksQ0FDSCxDQUNKLENBQ1QsQ0FBQztJQUNOLENBQUM7SUFDUywrQkFBUyxHQUFuQixVQUFvQixHQUFxQixFQUFFLEtBQWE7UUFDcEQsSUFBSSxPQUFPLEdBQUcsS0FBSyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxxREFBQyxTQUFTLElBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFJLENBQUM7SUFDNUcsQ0FBQztJQUNTLGlDQUFXLEdBQXJCO1FBQ0ksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDbkMsSUFBSSxJQUFJLEdBQUcsZ0ZBQWlCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEUsTUFBTSxDQUFDLENBQUMsNkRBQUksU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBRyxJQUFJLENBQU0sQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDUyx1Q0FBaUIsR0FBM0I7UUFDSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN6QyxJQUFJLElBQUksR0FBRyxnRkFBaUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN4RSxNQUFNLENBQUMsQ0FBQyw4REFBSyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFHLElBQUksQ0FBTyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNMLGtCQUFDO0FBQUQsQ0FBQyxDQXRFZ0MsZ0RBQWUsR0FzRS9DOztBQUVEO0lBQStCLDRFQUF5QjtJQUtwRCxtQkFBWSxLQUFVO1FBQXRCLFlBQ0ksa0JBQU0sS0FBSyxDQUFDLFNBRWY7UUFERyxLQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDOztJQUM5QixDQUFDO0lBQ0QsNkNBQXlCLEdBQXpCLFVBQTBCLFNBQWM7UUFDcEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBQ08saUNBQWEsR0FBckIsVUFBc0IsS0FBVTtRQUM1QixJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDckIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDWCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7WUFDaEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsR0FBRyxjQUFjLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM3QixJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7SUFDekIsQ0FBQztJQUNELDBCQUFNLEdBQU47UUFDSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDakYsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNuQixTQUFTLEdBQUcsRUFBRSxDQUFDO1lBQ2YsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFpQixDQUFDO2dCQUNwRCxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNsRCxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFJLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN6RCxNQUFNLENBQUMsQ0FDSCw4REFBSyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssSUFDckMsU0FBUyxDQUNSLENBQ1QsQ0FBQztJQUNOLENBQUM7SUFDUyxrQ0FBYyxHQUF4QixVQUF5QixRQUFzQjtRQUMzQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNuQixNQUFNLENBQUMscURBQUMsV0FBVyxJQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUksQ0FBQztRQUMzSCxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixNQUFNLENBQUMscURBQUMsc0VBQWMsSUFBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFJLENBQUM7UUFDNUcsQ0FBQztJQUNMLENBQUM7SUFDTCxnQkFBQztBQUFELENBQUMsQ0E5QzhCLGdEQUFlLEdBOEM3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RMOEI7QUFFTTtBQUM0QjtBQUNZO0FBQzFCO0FBU25EO0lBQW9DLGlGQUF5QjtJQUl6RCx3QkFBWSxLQUFVO1FBQXRCLFlBQ0ksa0JBQU0sS0FBSyxDQUFDLFNBSWY7UUFIRyxLQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqQyxLQUFJLENBQUMsS0FBSyxHQUFHLEtBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QixLQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7O0lBQ2pDLENBQUM7SUFDRCxrREFBeUIsR0FBekIsVUFBMEIsU0FBYztRQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7UUFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ08sb0NBQVcsR0FBbkIsVUFBb0IsUUFBUTtRQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsWUFBWSwyREFBUSxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDbkUsQ0FBQztJQUNPLGlDQUFRLEdBQWhCO1FBQ0ksSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDdkQsTUFBTSxDQUFDO1lBQ0gsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUMxRSxpQkFBaUIsRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVO1NBQ25FLENBQUM7SUFDTixDQUFDO0lBQ0QsMENBQWlCLEdBQWpCO1FBQ0ksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDcEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxFQUFHO2dCQUM5RixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLHNDQUFzQyxDQUFDLGNBQWMsRUFBRTtnQkFDakUsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztnQkFDOUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUIsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hCLElBQUksQ0FBQyxZQUFZLENBQUMsc0NBQXNDLENBQUMsWUFBWSxFQUFFO2dCQUMvRCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztnQkFDckQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUIsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDM0IsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO2dCQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUcsQ0FBQztJQUNMLENBQUM7SUFDRCw2Q0FBb0IsR0FBcEI7UUFDSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztZQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLDBDQUEwQyxDQUFDLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUseUJBQXlCLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoSixDQUFDO0lBQ0wsQ0FBQztJQUNELCtCQUFNLEdBQU47UUFDSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNyRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUM1QyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztRQUM5QyxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDM0MsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDN0UsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JELElBQUksUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ3RGLElBQUksV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxRQUFRLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQzVGLElBQUksU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxNQUFNLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ3hGLElBQUksY0FBYyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsS0FBSyxNQUFNLENBQUMsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3JHLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxLQUFLLE1BQU0sQ0FBQyxHQUFHLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDekcsSUFBSSxlQUFlLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxJQUFJLE1BQU0sQ0FBQyxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDcEcsSUFBSSxjQUFjLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQyxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDbEcsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLElBQUksUUFBUSxDQUFDLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4RyxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNsRyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsSUFBSSxLQUFLLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQztRQUM5RSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLElBQUksUUFBUSxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDcEYsSUFBSSxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7UUFDOUcsSUFBSSxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7UUFDekgsSUFBSSxTQUFTLEdBQUcsRUFBRyxDQUFDO1FBQ3BCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO1lBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO1FBQ3RGLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQztZQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDeEQsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDO1lBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxHQUFHLFlBQVksQ0FBQztRQUUzRCxNQUFNLENBQUMsQ0FDSCw4REFBSyxHQUFHLEVBQUMsTUFBTSxFQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUztZQUN0Riw4REFBSyxTQUFTLEVBQUUsY0FBYztnQkFDekIsUUFBUTtnQkFDUixjQUFjO2dCQUNkLFNBQVM7Z0JBQ1QsZUFBZSxDQUNkO1lBRU4sOERBQUssU0FBUyxFQUFFLGdCQUFnQjtnQkFDM0IsU0FBUztnQkFDVCxjQUFjO2dCQUNkLE9BQU87Z0JBQ1AsWUFBWTtnQkFDWixXQUFXO2dCQUNYLGlCQUFpQixDQUNoQixDQUNKLENBQ1QsQ0FBQztJQUNOLENBQUM7SUFDUyx1Q0FBYyxHQUF4QjtRQUNJLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO1FBQ2xELEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELE1BQU0sQ0FBQyxxREFBQywwRUFBa0IsSUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksR0FBdUI7SUFDeEcsQ0FBQztJQUNTLG9DQUFXLEdBQXJCLFVBQXNCLFVBQWU7UUFDakMsSUFBSSxTQUFTLEdBQUcsZ0ZBQWlCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUUsTUFBTSxDQUFDLDZEQUFJLFNBQVMsRUFBRSxVQUFVLENBQUMsS0FBSyxJQUFHLFNBQVMsQ0FBTSxDQUFDO0lBQzdELENBQUM7SUFDUywwQ0FBaUIsR0FBM0IsVUFBNEIsVUFBZTtRQUN2QyxFQUFFLEVBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDbEQsSUFBSSxlQUFlLEdBQUcsZ0ZBQWlCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEYsTUFBTSxDQUFDLDhEQUFLLFNBQVMsRUFBRSxVQUFVLENBQUMsV0FBVyxJQUFHLGVBQWUsQ0FBTyxDQUFDO0lBQzNFLENBQUM7SUFDUyxzQ0FBYSxHQUF2QixVQUF3QixVQUFlO1FBQ25DLElBQUksV0FBVyxHQUFHLGdGQUFpQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sQ0FBQyxDQUFDO1lBQ0osa0VBQU0sV0FBVyxDQUFPO1lBQ3hCLHFEQUFDLHdGQUF5QixJQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxVQUFVLEdBQUksQ0FDN0UsQ0FBQyxDQUFDO0lBQ1osQ0FBQztJQUNTLHFDQUFZLEdBQXRCLFVBQXVCLFVBQWU7UUFDbEMsTUFBTSxDQUFDLHFEQUFDLG9CQUFvQixJQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUk7SUFDM0csQ0FBQztJQUNMLHFCQUFDO0FBQUQsQ0FBQyxDQTVIbUMsZ0RBQWUsR0E0SGxEOztBQUVEO0lBQTBDLHVGQUFrQjtJQUd4RCw4QkFBWSxLQUFVO1FBQXRCLFlBQ0ksa0JBQU0sS0FBSyxDQUFDLFNBSWY7UUFIRyxLQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqQyxLQUFJLENBQUMsS0FBSyxHQUFHLEtBQUksQ0FBQyxRQUFRLEVBQUU7UUFDNUIsS0FBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDOztJQUNqQyxDQUFDO0lBQ0Qsd0RBQXlCLEdBQXpCLFVBQTBCLFNBQWM7UUFDcEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDckMsQ0FBQztJQUNPLDBDQUFXLEdBQW5CLFVBQW9CLFFBQVE7UUFBNUIsaUJBT0M7UUFORyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsWUFBWSwyREFBUSxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDL0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsR0FBRztnQkFDbEMsS0FBSSxDQUFDLFFBQVEsQ0FBQyxLQUFJLENBQUMsUUFBUSxDQUFDLEtBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzdDLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUNPLHVDQUFRLEdBQWhCLFVBQWlCLFNBQWdCO1FBQWhCLDRDQUFnQjtRQUM3QixNQUFNLENBQUMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUN0RSxDQUFDO0lBQ0QscUNBQU0sR0FBTjtRQUNJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNwRSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNuRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsRCxJQUFJLEdBQUcsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBQ0QsTUFBTSxDQUFDLENBQUMsOERBQUssSUFBSSxFQUFDLE9BQU8sRUFBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFHLE1BQU0sQ0FBTyxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUNMLDJCQUFDO0FBQUQsQ0FBQyxDQW5DeUMsaUZBQWtCLEdBbUMzRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvS3dDO0FBQ2U7QUFDTDtBQUNYO0FBRXhDO0lBQ0kseUJBQW1CLEtBQVUsRUFBUyxLQUF5QjtRQUF6QixvQ0FBeUI7UUFBNUMsVUFBSyxHQUFMLEtBQUssQ0FBSztRQUFTLFVBQUssR0FBTCxLQUFLLENBQW9CO0lBQy9ELENBQUM7SUFDTCxzQkFBQztBQUFELENBQUM7O0FBQ0Q7O0dBRUc7QUFDSDtJQUFxQyxrRkFBSTtJQUVyQztRQUFBLFlBQ0ksaUJBQU8sU0FDVjtRQUhNLFVBQUksR0FBVyxFQUFFLENBQUM7O0lBR3pCLENBQUM7SUFDUyxzQ0FBWSxHQUF0QixVQUF1QixJQUFZO1FBQy9CLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNoQyxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDUyw2Q0FBbUIsR0FBN0IsVUFBOEIsSUFBWTtRQUN0QyxNQUFNLENBQUMsRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUNNLGtDQUFRLEdBQWYsVUFBZ0IsS0FBVSxFQUFFLElBQW1CO1FBQW5CLGtDQUFtQjtRQUMzQyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFDTCxzQkFBQztBQUFELENBQUMsQ0Fmb0MsbURBQUksR0FleEM7O0FBTUQ7SUFBQTtJQWFBLENBQUM7SUFaVSw2QkFBRyxHQUFWLFVBQVcsS0FBc0I7UUFDN0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQy9DLElBQUksZUFBZSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztZQUNwRyxFQUFFLENBQUMsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDMUIsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztvQkFBQyxNQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztnQkFDeEQsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQ3hCLEtBQUssQ0FBQyxjQUFjLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQztnQkFDakQsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ0wsc0JBQUM7QUFBRCxDQUFDOztBQUNEOztHQUVHO0FBQ0g7SUFBc0MsbUZBQWU7SUFDakQsMEJBQW1CLFFBQXVCLEVBQVMsUUFBdUI7UUFBdkQsMENBQXVCO1FBQVMsMENBQXVCO1FBQTFFLFlBQ0ksaUJBQU8sU0FDVjtRQUZrQixjQUFRLEdBQVIsUUFBUSxDQUFlO1FBQVMsY0FBUSxHQUFSLFFBQVEsQ0FBZTs7SUFFMUUsQ0FBQztJQUNNLGtDQUFPLEdBQWQsY0FBMkIsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztJQUNoRCxtQ0FBUSxHQUFmLFVBQWdCLEtBQVUsRUFBRSxJQUFtQjtRQUFuQixrQ0FBbUI7UUFDM0MsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksa0VBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFDRCxJQUFJLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSwyREFBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4RCxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSwyREFBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4RCxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxNQUFNLENBQUMsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDO0lBQ3ZELENBQUM7SUFDUyw4Q0FBbUIsR0FBN0IsVUFBOEIsSUFBWTtRQUN0QyxJQUFJLEtBQUssR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbkQsTUFBTSxDQUFDLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEcsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN6QixNQUFNLENBQUMsMEVBQWtCLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEYsQ0FBQztZQUNELE1BQU0sQ0FBQywwRUFBa0IsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0RixDQUFDO0lBQ0wsQ0FBQztJQUNPLG1DQUFRLEdBQWhCLFVBQWlCLEtBQUs7UUFDbEIsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBQ0wsdUJBQUM7QUFBRCxDQUFDLENBbENxQyxlQUFlLEdBa0NwRDs7QUFDRDs7R0FFRztBQUNIO0lBQW1DLGdGQUFlO0lBQzlDLHVCQUFtQixTQUFxQixFQUFTLFNBQXFCO1FBQW5ELHlDQUFxQjtRQUFTLHlDQUFxQjtRQUF0RSxZQUNJLGlCQUFPLFNBQ1Y7UUFGa0IsZUFBUyxHQUFULFNBQVMsQ0FBWTtRQUFTLGVBQVMsR0FBVCxTQUFTLENBQVk7O0lBRXRFLENBQUM7SUFDTSwrQkFBTyxHQUFkLGNBQTJCLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQzdDLGdDQUFRLEdBQWYsVUFBZ0IsS0FBVSxFQUFFLElBQW1CO1FBQW5CLGtDQUFtQjtRQUMzQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSwyREFBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSwyREFBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFDUywyQ0FBbUIsR0FBN0IsVUFBOEIsSUFBWTtRQUN0QyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztZQUN6QyxNQUFNLENBQUMsMEVBQWtCLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsMEVBQWtCLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RyxNQUFNLENBQUMsMEVBQWtCLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBQ0wsb0JBQUM7QUFBRCxDQUFDLENBcEJrQyxlQUFlLEdBb0JqRDs7QUFFRDtJQUEwQyx1RkFBZTtJQUNyRCw4QkFBbUIsUUFBdUIsRUFBUyxRQUF1QjtRQUF2RCwwQ0FBdUI7UUFBUywwQ0FBdUI7UUFBMUUsWUFDSSxpQkFBTyxTQUNWO1FBRmtCLGNBQVEsR0FBUixRQUFRLENBQWU7UUFBUyxjQUFRLEdBQVIsUUFBUSxDQUFlOztJQUUxRSxDQUFDO0lBQ00sc0NBQU8sR0FBZCxjQUEyQixNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO0lBQ3BELHVDQUFRLEdBQWYsVUFBZ0IsS0FBVSxFQUFFLElBQW1CO1FBQW5CLGtDQUFtQjtRQUMzQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUM3RCxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ3pCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSwyREFBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsMEVBQWtCLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xKLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN6QyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksMkRBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsSixDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ1Msa0RBQW1CLEdBQTdCLFVBQThCLElBQVk7UUFDdEMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ0wsMkJBQUM7QUFBRCxDQUFDLENBbkJ5QyxlQUFlLEdBbUJ4RDs7QUFDRDs7R0FFRztBQUNIO0lBQW9DLGlGQUFlO0lBQy9DLHdCQUFtQixLQUFvQjtRQUFwQixvQ0FBb0I7UUFBdkMsWUFDSSxpQkFBTyxTQUNWO1FBRmtCLFdBQUssR0FBTCxLQUFLLENBQWU7O0lBRXZDLENBQUM7SUFDTSxnQ0FBTyxHQUFkLGNBQTJCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFDOUMsaUNBQVEsR0FBZixVQUFnQixLQUFVLEVBQUUsSUFBbUI7UUFBbkIsa0NBQW1CO1FBQzNDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDdkMsSUFBSSxFQUFFLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLEVBQUUsRUFBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7Z0JBQ3BDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDNUMsRUFBRSxFQUFDLEdBQUcsQ0FBQztvQkFBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1lBQ3ZCLENBQUM7UUFDTCxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUFBLENBQUM7SUFDM0MsQ0FBQztJQUNPLGlDQUFRLEdBQWhCLFVBQWlCLEVBQVUsRUFBRSxLQUFVLEVBQUUsSUFBWTtRQUNqRCxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNoQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksMkRBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBQ0wscUJBQUM7QUFBRCxDQUFDLENBcEJtQyxlQUFlLEdBb0JsRDs7QUFDRDs7R0FFRztBQUNIO0lBQW9DLGlGQUFlO0lBRS9DO1FBQUEsWUFDSSxpQkFBTyxTQUNWO1FBSE8sUUFBRSxHQUFHLHdIQUF3SCxDQUFDOztJQUd0SSxDQUFDO0lBQ00sZ0NBQU8sR0FBZCxjQUEyQixNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQzlDLGlDQUFRLEdBQWYsVUFBZ0IsS0FBVSxFQUFFLElBQW1CO1FBQW5CLGtDQUFtQjtRQUMzQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDeEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSwyREFBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFDUyw0Q0FBbUIsR0FBN0IsVUFBOEIsSUFBWTtRQUN0QyxNQUFNLENBQUMsMEVBQWtCLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFDTCxxQkFBQztBQUFELENBQUMsQ0FkbUMsZUFBZSxHQWNsRDs7QUFFRCwrREFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzFELCtEQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLEVBQUUsY0FBYyxNQUFNLENBQUMsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFDNUosK0RBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDLEVBQUUsY0FBYyxNQUFNLENBQUMsSUFBSSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3hKLCtEQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLEVBQUUsY0FBYyxNQUFNLENBQUMsSUFBSSxvQkFBb0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFDcEssK0RBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsY0FBYyxNQUFNLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0FBQzNILCtEQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsY0FBYyxNQUFNLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FDbExyRjtBQUNNO0FBQ2lDO0FBRWI7QUFFekQ7SUFBa0MsK0VBQU07SUFFcEMsc0JBQVksS0FBVTtRQUF0QixZQUNJLGtCQUFNLEtBQUssQ0FBQyxTQUVmO1FBREcsS0FBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLENBQUM7O0lBQzdELENBQUM7SUFDRCxnREFBeUIsR0FBekIsVUFBMEIsU0FBYztRQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFDRCx1Q0FBZ0IsR0FBaEIsVUFBaUIsS0FBSztRQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO0lBQ3JELENBQUM7SUFDRCw2QkFBTSxHQUFOO1FBQ0ksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDeEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2pDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDN0QsSUFBSSxLQUFLLEdBQXlCLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUM5RSxNQUFNLENBQUMsOERBQUssU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSztZQUNwRCxNQUFNO1lBQ04sSUFBSSxDQUNILENBQUM7SUFFWCxDQUFDO0lBQ1MsbUNBQVksR0FBdEI7UUFDSSxJQUFJLE1BQU0sR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQ2xELElBQUksVUFBVSxHQUFHLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzFDLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQztRQUM3SCxjQUFjLEdBQUcsdUJBQXVCLEdBQUcsY0FBYyxDQUFDO1FBQzFELElBQUksS0FBSyxHQUFHLGdGQUFpQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyw4REFBSyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUk7WUFDOUMsK0RBQU0sT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsTUFBTTtnQkFDL0MsK0RBQU0sU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsSUFBRyxLQUFLLENBQVE7Z0JBQ2hGLCtEQUFNLFNBQVMsRUFBRSxjQUFjLGlCQUFjLE1BQU0sR0FBUSxDQUN4RCxDQUNMLENBQUM7SUFDWCxDQUFDO0lBQ1MsaUNBQVUsR0FBcEI7UUFDSSxNQUFNLENBQUMsOERBQUssU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksSUFDOUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUNsQixDQUFDO0lBQ25CLENBQUM7SUFDUyxtQ0FBWSxHQUF0QixVQUF1QixRQUFhO1FBQ2hDLEVBQUUsRUFBQyxDQUFDLFFBQVEsQ0FBQztZQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDNUIsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ2xDLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNKLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksMkVBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFDRCxJQUFJLENBQUMsQ0FBQztnQkFDRixFQUFFLEVBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQ2hCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSwyRUFBZ0IsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3RCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFDRCxFQUFFLEVBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSwyRUFBZ0IsRUFBRSxDQUFDO1FBQ3pDLENBQUM7UUFFRCxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3BDLEVBQUUsRUFBQyxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUM7WUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUU3QixpQkFBTSxZQUFZLFlBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3RGLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixHQUFHO1lBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQixHQUFHO1lBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1lBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFjO1lBQy9DLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBQ0wsbUJBQUM7QUFBRCxDQUFDLENBOUVpQyw0REFBTSxHQThFdkM7Ozs7Ozs7Ozs7O0FDcEZrRztBQUVuRztJQUFBO0lBMFNBLENBQUM7SUFuU1UsZ0NBQUssR0FBWixVQUFhLElBQVksRUFBRSxJQUFtQjtRQUMxQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFDTSwwQ0FBZSxHQUF0QixVQUF1QixJQUFZO1FBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksa0VBQWEsRUFBRSxDQUFDLENBQUM7UUFDOUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFDTyx3Q0FBYSxHQUFyQixVQUFzQixJQUFZLEVBQUUsSUFBbUI7UUFDbkQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDWixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ00sbUNBQVEsR0FBZixVQUFnQixJQUFtQixJQUFZLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLG9DQUFTLEdBQWpCO1FBQ0ksSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3pDLENBQUM7SUFDTyx5Q0FBYyxHQUF0QjtRQUNJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMvQixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDckIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDYixJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDakMsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNPLHdDQUFhLEdBQXJCO1FBQ0ksSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ25DLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzdCLEVBQUUsRUFBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUM1QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUN4QyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDeEIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzdCLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDTCxFQUFFLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxHQUFHLElBQUksOERBQVMsRUFBRSxDQUFDO2dCQUN4QixDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDZCxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ2hCLENBQUM7WUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxJQUFJLENBQUMsR0FBRyxJQUFJLDhEQUFTLEVBQUUsQ0FBQztRQUN4QixDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLEVBQUUsQ0FBQyxDQUFDLENBQUMsOERBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDekMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUN6QixDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNwQixDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFDTyxzQ0FBVyxHQUFuQjtRQUNJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM1QixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDdEIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ25DLEVBQUUsRUFBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ1IsSUFBSSxHQUFHLEdBQUcsSUFBSSxvRUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLEdBQUcsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO1lBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksNERBQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQ08seUNBQWMsR0FBdEI7UUFDSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUM7WUFBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNWLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDaEMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNOLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNaLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFZLEdBQUcsQ0FBQztZQUM3QixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNiLENBQUM7UUFDRCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxDQUFDO0lBQ08sZ0RBQXFCLEdBQTdCLFVBQThCLFFBQWtDLEVBQUUsS0FBc0M7UUFBMUUsMENBQWtDO1FBQUUsb0NBQXNDO1FBQ3BHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNaLEVBQUUsRUFBQyxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3ZDLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELEVBQUUsRUFBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxDQUFDLEVBQUUsRUFBRyxDQUFDO1lBQ1gsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDM0IsRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNuQixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMxQyxFQUFFLEVBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ1gsRUFBRSxFQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDbkIsQ0FBQyxHQUFHLFFBQVEsQ0FBQztZQUNqQixDQUFDO1lBQ0QsRUFBRSxFQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDOUIsUUFBUSxHQUFHLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO2dCQUMxRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsRUFBRSxFQUFHLENBQUM7Z0JBQ1gsUUFBUSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLGVBQWUsR0FBRyxRQUFRLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7Z0JBQzFFLEVBQUUsRUFBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7b0JBQ1gsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLEdBQUcsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO2dCQUNELEVBQUUsRUFBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO29CQUNqQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3pCLENBQUM7WUFDTCxDQUFDO1lBQ0QsRUFBRSxFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ1YsSUFBSSxJQUFJLEdBQUcsSUFBSSxzRUFBaUIsRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztnQkFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkQsQ0FBQztZQUNELE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDYixDQUFDO1FBQ0QsSUFBSSxJQUFJLEdBQUcsSUFBSSxzRUFBaUIsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxhQUFhLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixFQUFFLEVBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ1IsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNmLENBQUM7UUFDRCxFQUFFLEVBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQztZQUNwQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxFQUFFLEVBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNWLEVBQUUsRUFBQyxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVHLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQztnQkFDckIsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDcEMsRUFBRSxFQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ1osS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDeEIsQ0FBQztZQUNMLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDSixRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3pELE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDcEIsQ0FBQztRQUNMLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0Qsc0JBQVksZ0NBQUU7YUFBZCxjQUEyQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFDdEQsK0JBQUksR0FBWjtRQUNJLE9BQU8sSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUNyRSxDQUFDO0lBQ08sa0NBQU8sR0FBZixVQUFnQixDQUFTO1FBQ3JCLE1BQU0sQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDO0lBQzNELENBQUM7SUFDTyxtQ0FBUSxHQUFoQixVQUFpQixDQUFTO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHO0lBQy9CLENBQUM7SUFDTyxrQ0FBTyxHQUFmLFVBQWdCLENBQVMsSUFBYSxNQUFNLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEQseUNBQWMsR0FBdEIsVUFBdUIsQ0FBUztRQUM1QixNQUFNLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDO0lBQ3hHLENBQUM7SUFDTyx3Q0FBYSxHQUFyQixVQUFzQixDQUFTLElBQWEsTUFBTSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBQztJQUNyRCx5Q0FBYyxHQUF0QixVQUF1QixDQUFTLElBQWEsTUFBTSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBQztJQUN0RCxxQ0FBVSxHQUFsQixVQUFtQixDQUFTO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUNPLHFDQUFVLEdBQWxCO1FBQ0ksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN4QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3BCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDO1FBQy9CLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN6QixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvQyxPQUFPLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNCLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUFDLEtBQUssQ0FBQztZQUMvQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pCLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztvQkFBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3pCLEtBQUssQ0FBQztZQUNWLENBQUM7WUFDRCxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2IsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFBQyxLQUFLLENBQUM7Z0JBQ3pGLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUFDLEtBQUssQ0FBQztZQUNqRSxDQUFDO1lBQ0QsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2QsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNsQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUNuRCxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ04sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFDLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUN6QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQzlDLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM3QixDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDZixDQUFDO0lBQ08seUNBQWMsR0FBdEI7UUFDSSxFQUFFLEVBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDN0MsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM1RCxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDVixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakMsRUFBRSxFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6QixDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNWLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUNPLGdEQUFxQixHQUE3QixVQUE4QixFQUFVLElBQWMsTUFBTSxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDOUUsOENBQW1CLEdBQTNCO1FBQ0ksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osRUFBRSxFQUFDLElBQUksQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0RSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNWLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ08sdUNBQVksR0FBcEI7UUFDSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3BCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDckIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0QixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDO1lBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQztRQUM5QixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDO1lBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUMzQixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUM7WUFBQyxFQUFFLEdBQUcsZ0JBQWdCLENBQUM7UUFDcEQsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDO1lBQUMsRUFBRSxHQUFHLGFBQWEsQ0FBQztRQUNqRCxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUM7WUFBQyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQzFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQztZQUFDLEVBQUUsR0FBRyxVQUFVLENBQUM7UUFDOUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLFNBQVMsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDO1lBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQztRQUNuRCxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksWUFBWSxDQUFDO1lBQUMsRUFBRSxHQUFHLGFBQWEsQ0FBQztRQUMzQyxFQUFFLEVBQUMsOERBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ08seUNBQWMsR0FBdEI7UUFDSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDNUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDeEIsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDO1lBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQztRQUMzQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUM7WUFBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQzFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQztZQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDNUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFDTyx5Q0FBYyxHQUF0QjtRQUNJLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBQ08sNENBQWlCLEdBQXpCO1FBQ0ksRUFBRSxFQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksa0VBQWEsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN0RSxDQUFDO0lBQ0wsQ0FBQztJQUNPLHdDQUFhLEdBQXJCO1FBQ0ksSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEUsRUFBRSxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDTixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNMLENBQUM7SUFDTyx1Q0FBWSxHQUFwQixVQUFxQixDQUFZO1FBQzdCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQ08sd0NBQWEsR0FBckIsVUFBc0IsR0FBVztRQUM3QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7UUFDL0IsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQ2xDLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7Z0JBQzNCLElBQUksT0FBTyxHQUFHLElBQUksa0VBQWEsRUFBRSxDQUFDO2dCQUNsQyxPQUFPLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQztnQkFDNUIsT0FBTyxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDakMsSUFBSSxPQUFPLEdBQUcsSUFBSSxrRUFBYSxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7WUFDeEIsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBQ0wsdUJBQUM7QUFBRCxDQUFDOzs7Ozs7Ozs7QUM1U0Q7QUFBQTs7R0FFRztBQUNIO0lBRUkseUVBQXlFO0lBQ3pFO0lBQ0EsQ0FBQztJQUNNLG9DQUFVLEdBQWpCLFVBQWtCLFFBQWdCLEVBQUUsTUFBaUU7UUFDakcsSUFBSSxHQUFHLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUMvQixHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsVUFBVSxHQUFHLHNCQUFzQixHQUFHLFFBQVEsQ0FBQyxDQUFDO1FBQ2hGLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztRQUMxRSxHQUFHLENBQUMsTUFBTSxHQUFHO1lBQ1QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFDO1FBQ0YsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUNNLHFEQUEyQixHQUFsQyxVQUFtQyxRQUFnQixFQUFFLFFBQWdCLEVBQUUsTUFBbUY7UUFDdEosSUFBSSxHQUFHLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUMvQixHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsVUFBVSxHQUFHLG9DQUFvQyxHQUFHLFFBQVEsR0FBRyxZQUFZLEdBQUcsUUFBUSxDQUFDLENBQUM7UUFDeEgsR0FBRyxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO1FBQzFFLEdBQUcsQ0FBQyxNQUFNLEdBQUc7WUFDVCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QyxJQUFJLFVBQVUsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDL0MsSUFBSSxXQUFXLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3JELE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUM7UUFDRixHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZixDQUFDO0lBQ00sb0NBQVUsR0FBakIsVUFBa0IsTUFBYyxFQUFFLE1BQVksRUFBRSxZQUFzRCxFQUFFLFFBQXVCLEVBQUUsa0JBQW1DO1FBQTVELDBDQUF1QjtRQUFFLCtEQUFtQztRQUNoSyxJQUFJLEdBQUcsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQy9CLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUM7UUFDeEQsR0FBRyxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3hFLElBQUksSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3BFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDMUMsRUFBRSxDQUFDLENBQUMsa0JBQWtCLENBQUM7WUFBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDMUQsSUFBSSxhQUFhLEdBQVcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsT0FBTyxHQUFHO1lBQ3ZCLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUMxQixZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQztRQUNGLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUNNLGtDQUFRLEdBQWYsVUFBZ0IsTUFBYyxFQUFFLElBQVUsRUFBRSxVQUFxRDtRQUM3RixJQUFJLEdBQUcsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQy9CLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sR0FBRztZQUN2QixFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDeEIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDO1FBQ0YsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLFVBQVUsR0FBRyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEUsSUFBSSxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUM5QixRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5QixRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNsQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFDTSxtQ0FBUyxHQUFoQixVQUFpQixRQUFnQixFQUFFLElBQVksRUFBRSxXQUF1RjtRQUNwSSxJQUFJLEdBQUcsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQy9CLElBQUksSUFBSSxHQUFHLFdBQVcsR0FBRyxRQUFRLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNwRCxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsVUFBVSxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNuRSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLG1DQUFtQyxDQUFDLENBQUM7UUFDMUUsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLEdBQUcsQ0FBQyxNQUFNLEdBQUc7WUFDVCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDbEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNWLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO29CQUNwQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbEIsQ0FBQztZQUNMLENBQUM7WUFDRCxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDO1FBQ0YsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUNNLHFDQUFXLEdBQWxCLFVBQW1CLFFBQWdCLEVBQUUsUUFBZ0IsRUFBRSxhQUF3RTtRQUMzSCxJQUFJLEdBQUcsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQy9CLElBQUksSUFBSSxHQUFHLFdBQVcsR0FBRyxRQUFRLEdBQUcsWUFBWSxHQUFHLFFBQVEsQ0FBQztRQUM1RCxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsVUFBVSxHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNyRSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLG1DQUFtQyxDQUFDLENBQUM7UUFDMUUsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLEdBQUcsQ0FBQyxNQUFNLEdBQUc7WUFDVCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDbEIsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEMsQ0FBQztZQUNELGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQztRQUNGLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNmLENBQUM7SUFDTCxzQkFBQztBQUFELENBQUM7O0FBekZpQiwwQkFBVSxHQUFXLGtEQUFrRCxDQUFDOzs7Ozs7OztBQ0YxRjtBQUFBO0lBQUE7UUFFWSxpQkFBWSxHQUFvQyxFQUFFLENBQUM7SUFvQi9ELENBQUM7SUFsQlUsa0NBQVEsR0FBZixVQUFnQixJQUFZLEVBQUUsSUFBMEI7UUFDcEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDbkMsQ0FBQztJQUNNLCtCQUFLLEdBQVo7UUFDSSxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ00sZ0NBQU0sR0FBYjtRQUNJLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixHQUFHLEVBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDL0IsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBQ00sNkJBQUcsR0FBVixVQUFXLElBQVksRUFBRSxNQUFhO1FBQ2xDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsRUFBRSxFQUFDLENBQUMsSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFDTCxzQkFBQztBQUFELENBQUM7O0FBckJpQix3QkFBUSxHQUFvQixJQUFJLGVBQWUsRUFBRSxDQUFDO0FBdUJwRSxhQUFhLE1BQWE7SUFDdEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ1osR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDO1FBQ3JDLEdBQUcsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELE1BQU0sQ0FBQyxHQUFHLENBQUM7QUFDZixDQUFDO0FBQ0QsZUFBZSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRTlDLG9CQUFvQixNQUFhO0lBQzdCLEVBQUUsRUFBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDaEMsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLEVBQUUsRUFBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFBQyxNQUFNLENBQUM7SUFDL0IsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLE1BQU0sQ0FBQyxDQUFDO1FBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNwRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDWixHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUM7UUFDbEMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLEVBQUUsRUFBQyxJQUFJLElBQUksSUFBSSxDQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QixHQUFHLElBQUksSUFBSSxDQUFTLElBQUksQ0FBQyxDQUFDO1FBQzlCLENBQUM7SUFDTCxDQUFDO0lBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQztBQUNmLENBQUM7QUFDRCxlQUFlLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFFNUQsYUFBYSxNQUFhO0lBQ3RCLEVBQUUsRUFBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQyxJQUFJLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQy9DLElBQUksT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMseUJBQXlCO0lBQzNELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBQ0QsZUFBZSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7OztBQzNETjtBQUUwRDtBQUk3QjtBQUNyRTs7R0FFRztBQUNIO0lBQStCLDRFQUFjO0lBQ3pDLG1CQUFtQixJQUFpQjtRQUFqQixnQ0FBaUI7UUFBcEMsWUFDSSxrQkFBTSxJQUFJLENBQUMsU0FDZDtRQUZrQixVQUFJLEdBQUosSUFBSSxDQUFhOztJQUVwQyxDQUFDO0lBQ00sMkJBQU8sR0FBZCxjQUEyQixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQU0zQyxzQkFBVyxtQ0FBWTtRQUx2Qjs7OztXQUlHO2FBQ0gsY0FBbUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEYsVUFBd0IsR0FBWSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FEQztJQUV0RixzQkFBVywwQkFBRzthQUFkLGNBQW1CLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzdELFVBQWUsR0FBVztZQUN0QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLENBQUM7OztPQUw0RDtJQVU3RCxzQkFBVyxrREFBMkI7UUFKdEM7OztXQUdHO2FBQ0gsY0FBbUQsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDNUgsVUFBdUMsR0FBVztZQUM5QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDNUUsQ0FBQzs7O09BSDJIO0lBSWxILG9DQUFnQixHQUExQixVQUEyQixHQUFXO1FBQ2xDLEdBQUcsR0FBRyxpQkFBTSxnQkFBZ0IsWUFBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxFQUFFLEVBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2QsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFDRDs7T0FFRztJQUNJLHNDQUFrQixHQUF6QjtRQUNJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM3QyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7Z0JBQUMsUUFBUSxDQUFDO1lBQ3RELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUIsS0FBSyxDQUFDO1FBQ1YsQ0FBQztJQUNMLENBQUM7SUFDRDs7T0FFRztJQUNJLDJDQUF1QixHQUE5QjtRQUNJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM3QyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDO2dCQUFDLFFBQVEsQ0FBQztZQUNyRixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QixLQUFLLENBQUM7UUFDVixDQUFDO0lBQ0wsQ0FBQztJQUNEOztPQUVHO0lBQ0ksK0JBQVcsR0FBbEI7UUFDSSw0REFBYSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBSUQsc0JBQVcsZ0NBQVM7UUFIcEI7O1dBRUc7YUFDSCxjQUFpQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEYsVUFBcUIsR0FBVyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FERTtJQU9oRixzQkFBVyxzQ0FBZTtRQUwxQjs7OztXQUlHO2FBQ0gsY0FBdUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDNUYsVUFBMkIsR0FBVyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURFO0lBRWxGLGdDQUFZLEdBQXRCLFVBQXVCLEtBQWE7SUFDcEMsQ0FBQztJQUNTLG9DQUFnQixHQUExQjtRQUNJLGlCQUFNLGdCQUFnQixXQUFFLENBQUM7UUFDekIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRCxDQUFDO0lBQ0wsQ0FBQztJQUNMLGdCQUFDO0FBQUQsQ0FBQyxDQWhGOEIsOERBQWMsR0FnRjVDOztBQUVELCtEQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSw2QkFBNkIsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUU7SUFDbkksRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBQyxDQUFDLEVBQUUsY0FBYyxNQUFNLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7QUM3RjVEO0FBRTlDO0lBRUksOEJBQW1CLElBQVksRUFBUyxVQUFlO1FBQXBDLFNBQUksR0FBSixJQUFJLENBQVE7UUFBUyxlQUFVLEdBQVYsVUFBVSxDQUFLO1FBQ25ELElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUMvRSxDQUFDO0lBQ00sMENBQVcsR0FBbEIsVUFBbUIsUUFBbUIsRUFBRSxFQUFPO1FBQzNDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO1lBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFDTSwwQ0FBVyxHQUFsQixVQUFtQixRQUFtQixFQUFFLEVBQU87UUFDM0MsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7WUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUNNLG9DQUFLLEdBQVosVUFBYSxRQUFtQjtRQUM1QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUYsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBQ00saURBQWtCLEdBQXpCLFVBQTBCLFdBQW1CO1FBQ3pDLEVBQUUsRUFBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7WUFDOUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwRCxDQUFDO0lBQ0wsQ0FBQztJQUNPLDhDQUFlLEdBQXZCO1FBQ0ksRUFBRSxFQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLElBQUksSUFBSSxDQUFDO1FBQ25GLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNELHNCQUFXLGlEQUFlO2FBQTFCLGNBQXlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBQ3RGLDJCQUFDO0FBQUQsQ0FBQzs7QUFFRDtJQUFBO1FBRVksa0JBQWEsR0FBZ0MsRUFBRSxDQUFDO1FBQ2hELHVCQUFrQixHQUFHLEVBQUUsQ0FBQztRQUV6Qix3QkFBbUIsR0FBNEQsSUFBSSxvREFBSyxFQUFvRCxDQUFDO0lBZ0R4SixDQUFDO0lBOUNHLHNCQUFXLDJDQUFPO2FBQWxCLGNBQW9ELE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFDekUsZ0RBQWUsR0FBdEIsVUFBdUIsVUFBZSxFQUFFLFdBQWdDO1FBQWhDLHNEQUFnQztRQUNwRSxJQUFJLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQzNCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNSLElBQUksR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCxJQUFJLFlBQVksR0FBRyxJQUFJLG9CQUFvQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQzVDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLCtDQUFjLEdBQXJCLFVBQXNCLFVBQWtCO1FBQ3BDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxVQUFVLENBQUM7SUFDbEMsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSwrQ0FBYyxHQUFyQixVQUFzQixVQUFrQixFQUFFLFdBQW1CO1FBQ3pELEVBQUUsRUFBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUN2QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEQsRUFBRSxFQUFDLENBQUMsTUFBTSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ25CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDbEQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFDTSxzQ0FBSyxHQUFaLGNBQWlCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwQyxzREFBcUIsR0FBNUIsVUFBNkIsSUFBWTtRQUNyQyxHQUFHLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDO1lBQzNDLEVBQUUsRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUM7Z0JBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNNLGdEQUFlLEdBQXRCLFVBQXVCLFFBQW1CO1FBQ3RDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztZQUNsRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ0wsNkJBQUM7QUFBRCxDQUFDOztBQXBEaUIsK0JBQVEsR0FBMkIsSUFBSSxzQkFBc0IsRUFBRSxDQUFDOzs7Ozs7Ozs7Ozs7OztBQzlCbkQ7QUFDa0M7QUFFakU7SUFBd0MscUZBQXlCO0lBQzdELDRCQUFZLEtBQVU7UUFBdEIsWUFDSSxrQkFBTSxLQUFLLENBQUMsU0FDZjtRQUNELDBCQUFvQixHQUFHLFVBQUMsTUFBTSxJQUFLLGFBQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEdBQUcsSUFBSSxFQUEzQyxDQUEyQyxDQUFDOztJQUQvRSxDQUFDO0lBRU8seUNBQVksR0FBcEI7UUFDSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDakMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3QixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDUCxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzVELENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUNELDhDQUFpQixHQUFqQjtRQUNJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbkUsQ0FBQztJQUNMLENBQUM7SUFDRCwrQ0FBa0IsR0FBbEI7UUFDSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNwQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEIsQ0FBQztJQUNMLENBQUM7SUFDRCxpREFBb0IsR0FBcEI7UUFDSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDakMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3QixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUFDLENBQUM7UUFDcEYsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsbUNBQU0sR0FBTjtRQUNJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUFDLENBQUM7UUFDekQsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQUMsQ0FBQztRQUVoRCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztRQUVsRCxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFNLENBQUMsOERBQUssR0FBRyxFQUFDLFFBQVEsSUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBTyxDQUFDO1FBQzNGLENBQUM7UUFFRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbEIsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQzVCLElBQUksU0FBUyxHQUFHLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEQsTUFBTSxDQUFDLDhEQUFLLEdBQUcsRUFBQyxRQUFRLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxHQUFRLENBQUM7WUFDeEUsQ0FBQztRQUNMLENBQUM7UUFDRCxNQUFNLENBQUMsOERBQUssR0FBRyxFQUFDLFFBQVEsSUFBRSxNQUFNLENBQU8sQ0FBQztJQUM1QyxDQUFDO0lBQ0wseUJBQUM7QUFBRCxDQUFDLENBckR1Qyx3RkFBeUIsR0FxRGhFOzs7Ozs7Ozs7Ozs7Ozs7QUN4RDhCO0FBRWtDO0FBRWpFO0lBQXNDLG1GQUFvQjtJQUN0RCwwQkFBWSxLQUFVO1FBQXRCLFlBQ0ksa0JBQU0sS0FBSyxDQUFDLFNBSWY7UUFIRyxLQUFJLENBQUMsZUFBZSxHQUFHLEtBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxDQUFDO1FBQ3ZELEtBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLENBQUM7UUFDdkQsS0FBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLENBQUM7O0lBQ25FLENBQUM7SUFDRCwwQ0FBZSxHQUFmLFVBQWdCLEtBQUs7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ0QsMENBQWUsR0FBZixVQUFnQixLQUFLO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNELDhDQUFtQixHQUFuQixVQUFvQixLQUFLO1FBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsaUNBQU0sR0FBTjtRQUNJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3pFLElBQUksVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQy9LLElBQUksVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztRQUM5SSxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDbkwsTUFBTSxDQUFDLENBQ0gsOERBQUssU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTTtZQUMxQixVQUFVO1lBQ1YsVUFBVTtZQUNWLGNBQWMsQ0FDVCxDQUNiLENBQUM7SUFDTixDQUFDO0lBQ1MsdUNBQVksR0FBdEIsVUFBdUIsS0FBVSxFQUFFLElBQVksRUFBRSxZQUFvQjtRQUNqRSxJQUFJLEtBQUssR0FBRyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNuQyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixHQUFHLENBQUMsWUFBWSxHQUFHLEdBQUcsR0FBRyxZQUFZLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDckYsTUFBTSxDQUFDLGdFQUFPLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUMsUUFBUSxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksR0FBSSxDQUFDO0lBQ3BHLENBQUM7SUFDTCx1QkFBQztBQUFELENBQUMsQ0FsQ3FDLHdGQUFvQixHQWtDekQ7Ozs7Ozs7Ozs7Ozs7OztBQ3RDOEI7QUFFa0M7QUFFakU7SUFBb0MsaUZBQW9CO0lBRXBELHdCQUFZLEtBQVU7UUFBdEIsWUFDSSxrQkFBTSxLQUFLLENBQUMsU0FFZjtRQURHLEtBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQzs7SUFDN0IsQ0FBQztJQUNELGtEQUF5QixHQUF6QixVQUEwQixTQUFjO1FBQ3BDLGlCQUFNLHlCQUF5QixZQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztJQUNqQyxDQUFDO0lBQ0Qsc0JBQWMsb0NBQVE7YUFBdEIsY0FBbUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUN0RSxzQkFBYyx3Q0FBWTthQUExQixjQUF1QyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUN6RSwrQkFBTSxHQUFOO1FBQ0ksSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ2hGLElBQUksYUFBYSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDOUcsTUFBTSxDQUFDLENBQUMsOERBQUssU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLO1lBQ25ELDhEQUFLLEtBQUssRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksRUFBQyxhQUFhLG1CQUFlLEdBQUcsbUJBQWUsS0FBSztnQkFDaEgsbUVBQU8sSUFBSSxDQUFDLFlBQVksQ0FBUSxDQUMxQixDQUNKLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBQ0wscUJBQUM7QUFBRCxDQUFDLENBckJtQyx3RkFBb0IsR0FxQnZEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3pCOEI7QUFDc0Q7QUFFaEI7QUFHVDtBQUNUO0FBRW5EO0lBQWtELCtGQUF5QjtJQUN2RSxzQ0FBWSxLQUFVO2VBQ2xCLGtCQUFNLEtBQUssQ0FBQztJQUNoQixDQUFDO0lBQ0Qsc0JBQWMsa0RBQVE7YUFBdEIsY0FBd0QsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUEyQyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFDbEgsNkNBQU0sR0FBTjtRQUNJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDaEMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDMUMsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDcEQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsSUFBSSxHQUFHLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQztZQUN2QixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwRCxJQUFJLFdBQVcsR0FBRyxRQUFRLEdBQUcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ3pELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hELE9BQU8sQ0FBQyxJQUFJLENBQUMsNkRBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsV0FBVyxJQUFHLFdBQVcsQ0FBTSxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUNELElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQzVDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFDLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLHFEQUFDLCtCQUErQixJQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFJLENBQUMsQ0FBQztRQUN2SixDQUFDO1FBQ0QsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUMsR0FBRyxFQUFFLENBQUM7UUFDNUUsTUFBTSxDQUFDLENBQ0gsOERBQU0sS0FBSyxFQUFFLFFBQVE7WUFDakIsZ0VBQU8sU0FBUyxFQUFFLFVBQVUsQ0FBQyxJQUFJO2dCQUM3QjtvQkFDSTt3QkFDSSxnRUFBUzt3QkFDUixPQUFPLENBQ1AsQ0FDRDtnQkFDUixvRUFDSyxJQUFJLENBQ0QsQ0FDSixDQUNOLENBQ1QsQ0FBQztJQUNOLENBQUM7SUFDTCxtQ0FBQztBQUFELENBQUMsQ0F4Q2lELHdGQUF5QixHQXdDMUU7O0FBRUQ7SUFBcUQsa0dBQWtCO0lBR25FLHlDQUFZLEtBQVU7UUFBdEIsWUFDSSxrQkFBTSxLQUFLLENBQUMsU0FFZjtRQURHLEtBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7O0lBQzlCLENBQUM7SUFDRCxtRUFBeUIsR0FBekIsVUFBMEIsU0FBYztRQUNwQyxpQkFBTSx5QkFBeUIsWUFBQyxTQUFTLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDTyx1REFBYSxHQUFyQixVQUFzQixTQUFjO1FBQ2hDLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDckMsQ0FBQztJQUNELGdEQUFNLEdBQU47UUFDSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQzNCLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNiLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDN0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxXQUFXLEdBQUcscURBQUMsZ0NBQWdDLElBQUMsR0FBRyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBSTtZQUN0SSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckQsTUFBTSxDQUFDLENBQUM7WUFBSSxpRUFBSyxPQUFPLENBQU07WUFBQyxHQUFHLENBQU0sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDTCxzQ0FBQztBQUFELENBQUMsQ0ExQm9ELGlGQUFrQixHQTBCdEU7O0FBRUQ7SUFBc0QsbUdBQWtCO0lBR3BFLDBDQUFZLEtBQVU7UUFBdEIsWUFDSSxrQkFBTSxLQUFLLENBQUMsU0FPZjtRQU5HLEtBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsRUFBRSxFQUFDLEtBQUksQ0FBQyxJQUFJLElBQUksS0FBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxHQUFHLEtBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQzNCLEtBQUksQ0FBQyxLQUFLLEdBQUcsRUFBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBQyxDQUFDO1FBQ2hFLENBQUM7O0lBRUwsQ0FBQztJQUNELG9FQUF5QixHQUF6QixVQUEwQixTQUFjO1FBQ3BDLGlCQUFNLHlCQUF5QixZQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNPLHdEQUFhLEdBQXJCLFVBQXNCLFNBQWM7UUFDaEMsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQztJQUNyQyxDQUFDO0lBQ0QsNERBQWlCLEdBQWpCO1FBQ0ksSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQy9DLElBQUksT0FBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25JLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRixDQUFDO1FBQ0QsRUFBRSxFQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztZQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQ0FBc0MsQ0FBQyxZQUFZLEVBQUU7Z0JBQ3BFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUIsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsc0NBQXNDLENBQUMsU0FBUyxFQUFFO2dCQUNqRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQztJQUNELCtEQUFvQixHQUFwQjtRQUNJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLDBDQUEwQyxDQUFDLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RHLENBQUM7SUFDTCxDQUFDO0lBQ0QsaURBQU0sR0FBTjtRQUNJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDNUIsSUFBSSxNQUFNLEdBQUcscURBQUMsNEVBQW9CLElBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFJO1FBQ3ZILElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNyQyxNQUFNLENBQUMsQ0FBQyw2REFBSSxHQUFHLEVBQUMsTUFBTSxFQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVM7WUFBRyxNQUFNO1lBQUUsWUFBWSxDQUFNLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBQ0QscURBQVUsR0FBVjtRQUNJLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDNUMsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO1FBQ25ELEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFDRCxNQUFNLENBQUMscURBQUMsMEVBQWtCLElBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUF1QjtJQUN6RyxDQUFDO0lBQ0wsdUNBQUM7QUFBRCxDQUFDLENBekRxRCxpRkFBa0IsR0F5RHZFOztBQUVELG1GQUFvQixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxVQUFDLEtBQUs7SUFDbkUsTUFBTSxDQUFDLG9EQUFtQixDQUFDLDRCQUE0QixFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3BFLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDNUk0QjtBQUcvQjtJQUFzQyxtRkFBeUI7SUFHM0QsMEJBQVksS0FBVTtRQUF0QixZQUNJLGtCQUFNLEtBQUssQ0FBQyxTQUlmO1FBSEcsS0FBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzNCLEtBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUNyQixLQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDOztJQUNsQyxDQUFDO0lBQ0Qsb0RBQXlCLEdBQXpCLFVBQTBCLFNBQWM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQy9CLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQztJQUM3QixDQUFDO0lBQ0QsNENBQWlCLEdBQWpCO1FBQ0ksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDZCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7WUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQ0FBc0MsQ0FBQyxXQUFXLEVBQUU7Z0JBQzVELElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QixDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDckIsQ0FBQztJQUNMLENBQUM7SUFDRCwrQ0FBb0IsR0FBcEI7UUFDSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsd0NBQXdDLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3BGLENBQUM7SUFDTCxDQUFDO0lBQ0QsaUNBQU0sR0FBTjtRQUNJLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDeEIsTUFBTSxDQUFDLGtFQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFPLENBQUM7SUFDbEQsQ0FBQztJQUNMLHVCQUFDO0FBQUQsQ0FBQyxDQS9CcUMsZ0RBQWUsR0ErQnBEOzs7Ozs7Ozs7Ozs7OztBQ2xDMkI7QUFDUztBQUdyQzs7R0FFRztBQUNIO0lBQXVDLG9GQUFJO0lBV3ZDLDJCQUFZLE9BQVksRUFBRSxZQUFnQztRQUFoQyxrREFBZ0M7UUFBMUQsWUFDSSxpQkFBTyxTQVVWO1FBcEJPLHFCQUFlLEdBQVksS0FBSyxDQUFDO1FBV3JDLEVBQUUsRUFBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ2QsS0FBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7UUFDcEMsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osS0FBSSxDQUFDLFdBQVcsR0FBRyxLQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFDRCxLQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbkMsRUFBRSxDQUFDLENBQUMsV0FBVyxLQUFLLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNsQyxLQUFJLENBQUMsYUFBYSxHQUFtQixRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7O0lBQ0wsQ0FBQztJQUNNLG1DQUFPLEdBQWQsY0FBNEIsTUFBTSxDQUFDLFFBQVEsRUFBQyxDQUFDO0lBSzdDLHNCQUFXLHFDQUFNO1FBSmpCOzs7V0FHRzthQUNILGNBQW1DLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFNN0Qsc0JBQVcsd0NBQVM7UUFMcEI7Ozs7V0FJRzthQUNILGNBQWtDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQzthQUMvRCxVQUFxQixHQUFZO1lBQzdCLEVBQUUsRUFBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEdBQUcsQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDakMsSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUM7WUFDMUIsRUFBRSxFQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztnQkFBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNsRSxDQUFDOzs7T0FMOEQ7SUFNL0Q7Ozs7T0FJRztJQUNJLGdDQUFJLEdBQVgsY0FBZ0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3hDOzs7O09BSUc7SUFDSSxnQ0FBSSxHQUFYLGNBQWdCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztJQU16QyxzQkFBVyx5Q0FBVTtRQUxyQjs7OztXQUlHO2FBQ0gsY0FBbUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO2FBQ2pFLFVBQXNCLEdBQVk7WUFDOUIsRUFBRSxFQUFDLEdBQUcsQ0FBQztnQkFBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdEIsSUFBSTtnQkFBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekIsQ0FBQzs7O09BSmdFO0lBUWpFLHNCQUFXLG9DQUFLO1FBSGhCOztXQUVHO2FBQ0gsY0FBNkIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUN4RCxVQUFpQixLQUFhLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzs7O09BRE47SUFFeEQsc0JBQUksdUNBQVE7YUFBWixjQUFvQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUNsRTs7T0FFRztJQUNJLGtDQUFNLEdBQWI7UUFDSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFDRDs7T0FFRztJQUNJLG9DQUFRLEdBQWY7UUFDSSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFDUyx3Q0FBWSxHQUF0QixVQUF1QixPQUFZO1FBQy9CLE1BQU0sQ0FBQyxJQUFJLDREQUFXLENBQUMsT0FBTyxDQUFDO0lBQ25DLENBQUM7SUFDUywwQ0FBYyxHQUF4QixVQUF5QixLQUFjO1FBQ25DLEVBQUUsRUFBQyxJQUFJLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUN6QyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixFQUFFLEVBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1lBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUNMLHdCQUFDO0FBQUQsQ0FBQyxDQXhGc0MsbURBQUk7O0FBQ3pCLG1DQUFpQixHQUFHLGdCQUFnQixDQUFDOzs7Ozs7Ozs7OztBQ1IxQjtBQUV0QixJQUFJLG9CQUFvQixHQUFHO0lBQzlCLFdBQVcsRUFBRSxVQUFTLElBQWU7UUFDakMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxhQUFhLEVBQUUsVUFBUyxPQUFlO1FBQ25DLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNKO0FBRUQ7SUFBQTtRQVFZLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLFlBQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNkLFlBQU8sR0FBMEIsSUFBSSxvREFBSyxFQUFrQixDQUFDO0lBeUJ4RSxDQUFDO0lBakNHLHNCQUFrQix1QkFBUTthQUExQjtZQUNJLEVBQUUsRUFBQyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixXQUFXLENBQUMsYUFBYSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7WUFDbEQsQ0FBQztZQUNELE1BQU0sQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDO1FBQ3JDLENBQUM7OztPQUFBO0lBSU0sMkJBQUssR0FBWixVQUFhLElBQXFCO1FBQXJCLGtDQUFxQjtRQUM5QixFQUFFLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFDRCxFQUFFLEVBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztZQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxjQUFZLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQztRQUNsRixDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRyxDQUFDO0lBQzVCLENBQUM7SUFDTSwwQkFBSSxHQUFYLFVBQVksSUFBb0I7UUFBcEIsa0NBQW9CO1FBQzVCLEVBQUUsRUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ04sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLEVBQUcsQ0FBQztRQUN4QixFQUFFLEVBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsb0JBQW9CLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDTCxDQUFDO0lBQ00sNkJBQU8sR0FBZDtRQUNJLEVBQUUsRUFBQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNMLGtCQUFDO0FBQUQsQ0FBQzs7QUFsQ2tCLHlCQUFhLEdBQWdCLElBQUksQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1pyRDtBQUFBLFFBQVE7QUFDdUI7QUFFL0IsZUFBZTtBQUNnQjtBQUUvQixVQUFVO0FBQ3dCO0FBRWxDLGVBQWU7QUFDOEM7QUFDN0QsZ0JBQWdCO0FBQytDO0FBQy9ELDJCQUEyQjtBQUNvRDtBQUUvRSxRQUFRO0FBQ29DO0FBQ2lDO0FBQ3dCO0FBQzdCO0FBQ2Q7QUFDTTtBQUNQO0FBQ21CO0FBQ2U7QUFDSTtBQUNHO0FBQzVCO0FBQzZDO0FBQ3hCO0FBQzdCO0FBQ0E7QUFDZ0Q7QUFDcEM7QUFDWjtBQUNNO0FBQ0o7QUFDZ0Q7QUFDbEM7QUFDbEI7QUFDTTtBQUNRO0FBQ2xCO0FBQ1c7QUFFbkUsZ0RBQWdEO0FBQ2hELG1GQUFtRjs7Ozs7OztBQy9DbkYsZ0Q7Ozs7OztBQ0FBLHlDOzs7Ozs7QUNBQTtBQUNBLHVKQUE0TTtBQUM1TSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxTQUFTO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0ZBQStGLEtBQUssd0JBQXdCO0FBQzVIO0FBQ0E7QUFDQSw2RUFBNkU7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBLDJDQUEyQyxxQkFBcUI7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQsa0JBQWtCLG9CQUFvQixnRkFBZ0Y7QUFDdEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpS0FBaUs7QUFDaks7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLG1FQUFtRTtBQUNoRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNULDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLGtJQUFrSSxpQ0FBaUMsaUpBQWlKO0FBQ3BUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsS0FBSztBQUMzRDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkZBQTZGO0FBQzdGLGdDQUFnQyxTQUFTO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsaUNBQWlDLFVBQVU7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxvREFBb0QsaUJBQWlCO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxLQUFLO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOElBQThJO0FBQzlJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOElBQThJO0FBQzlJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxSkFBcUo7QUFDcko7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0U7QUFDbEU7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGtDOzs7Ozs7QUNyZUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQzs7QUFFckM7QUFDQTtBQUNBOztBQUVBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsVUFBVTs7Ozs7OztBQ3ZMdEM7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixzQkFBc0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCLDJCQUEyQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLHFCQUFxQixnQ0FBZ0M7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRCxpQzs7Ozs7Ozs7O0FDN1Z3QztBQUVqQyxJQUFJLG1CQUFtQixHQUFHO0lBQzdCLElBQUksRUFBRSxFQUFFO0lBQ1IsTUFBTSxFQUFFLDJCQUEyQjtJQUNuQyxJQUFJLEVBQUUsdUJBQXVCO0lBQzdCLE1BQU0sRUFBRSwwQkFBMEI7SUFDbEMsZ0JBQWdCLEVBQUUsRUFBRTtJQUNwQixVQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFO0lBQ3JGLFFBQVEsRUFBRSx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsY0FBYztJQUM5RCxTQUFTLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxPQUFPO0lBQ3ZDLEdBQUcsRUFBRSxFQUFFO0lBQ1AsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtJQUN4SSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFDO0lBQ3JFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsc0NBQXNDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTtJQUU3RixPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBQztJQUN6RCxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUscUJBQXFCLEVBQUU7SUFDekYsT0FBTyxFQUFFLGNBQWM7SUFDdkIsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7SUFDMUQsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFO0lBQ2hELGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7SUFDakMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO0lBQ2xELFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtJQUM1QyxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLGlDQUFpQyxFQUFFO0lBQzVGLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRTtJQUM3RixNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO0lBQzFFLElBQUksRUFBRSxjQUFjO0lBQ3BCLFVBQVUsRUFBRSxjQUFjO0lBQzFCLFFBQVEsRUFBRSxFQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBQztJQUNsSSxNQUFNLEVBQUU7UUFDSixJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxZQUFZO1FBQ3pDLE1BQU0sRUFBRTtZQUNKLElBQUksRUFBRSwwQkFBMEIsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxzQkFBc0I7WUFDcEYsY0FBYyxFQUFFLDJDQUEyQyxFQUFFLGVBQWUsRUFBRSw2Q0FBNkM7U0FDOUg7S0FDSjtDQUNKLENBQUM7QUFDRiwrREFBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLG1CQUFtQixDQUFDOzs7Ozs7Ozs7O0FDdENMO0FBRWpDLElBQUksMkJBQTJCLEdBQUc7SUFDckMsSUFBSSxFQUFFLEVBQUU7SUFDUixNQUFNLEVBQUUsZUFBZTtJQUN2QixJQUFJLEVBQUUsWUFBWTtJQUNsQixNQUFNLEVBQUUsY0FBYztJQUN0QixnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRTtJQUMzRyxRQUFRLEVBQUUsdUJBQXVCLEVBQUUsV0FBVyxFQUFFLGNBQWM7SUFDOUQsU0FBUyxFQUFFLEVBQUUsRUFBRSxlQUFlLEVBQUUsT0FBTztJQUN2QyxHQUFHLEVBQUUsRUFBRTtJQUNQLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtJQUNuSixLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFDO0lBQ3JFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsc0NBQXNDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTtJQUU3RixPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBQztJQUN6RCxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUscUJBQXFCLEVBQUU7SUFDekYsT0FBTyxFQUFFLGNBQWM7SUFDdkIsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7SUFDMUQsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSwyQkFBMkIsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFO0lBQzNHLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRTtJQUMxRCxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7SUFDbEQsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO0lBQzVDLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxpQ0FBaUMsRUFBRTtJQUMvRyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUU7SUFDaEgsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtJQUMxRSxJQUFJLEVBQUUsY0FBYztJQUNwQixVQUFVLEVBQUUsY0FBYztJQUMxQixRQUFRLEVBQUUsRUFBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUM7SUFDbEksTUFBTSxFQUFFO1FBQ0osSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsWUFBWTtRQUN6QyxNQUFNLEVBQUU7WUFDSixJQUFJLEVBQUUsMEJBQTBCLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsc0JBQXNCO1lBQ3BGLGNBQWMsRUFBRSwyQ0FBMkMsRUFBRSxlQUFlLEVBQUUsNkNBQTZDO1NBQzlIO0tBQ0o7Q0FDSixDQUFDO0FBQ0YsK0RBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLDJCQUEyQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JDMUI7QUFDRDtBQUNDO0FBQ0Q7QUFDRTtBQUNEO0FBQ0E7QUFDRDtBQUNJO0FBQ0E7QUFDRjtBQUNBO0FBQ0Q7QUFDSTtBQUNGO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDVztBQUNYOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcEJwQztBQUFBLFNBQVM7QUFDZ0I7QUFFbEIsSUFBSSxPQUFlLENBQUM7QUFDM0IsT0FBTyxHQUFHLEtBQUcsUUFBcUIsQ0FBQztBQUVHO0FBSWI7QUFDaUI7QUFDbUI7QUFDZ0I7QUFDdkI7QUFDQztBQUNvQjtBQUNuQjtBQUNDO0FBQ29CO0FBS25EO0FBSWlCO0FBQ3VEO0FBQ0g7QUFDckI7QUFDbUI7QUFDcEI7QUFDcEM7QUFDRztBQUNRO0FBQ1E7QUFDMkI7QUFDckI7QUFDRjtBQUNFO0FBQ1E7QUFDaEI7QUFDQTtBQUNZO0FBQ1I7QUFDUTtBQUNaO0FBQ007QUFDb0M7QUFDbEQ7QUFDTDtBQUlsQjtBQUM4QjtBQUNHO0FBRUY7QUFDZ0I7QUFDbUI7QUFFekYsZ0RBQWdEO0FBQ2hELDJFQUEyRTs7Ozs7Ozs7OztBQ2pFdkI7QUFFN0MsSUFBSSxtQkFBbUIsR0FBRztJQUM3QixZQUFZLEVBQUUsUUFBUTtJQUN0QixZQUFZLEVBQUUsUUFBUTtJQUN0QixZQUFZLEVBQUUsV0FBVztJQUN6QixZQUFZLEVBQUUsaUJBQWlCO0lBQy9CLGFBQWEsRUFBRSxRQUFRO0lBQ3ZCLFdBQVcsRUFBRSxxQ0FBcUM7SUFDbEQsZ0JBQWdCLEVBQUUsNkJBQTZCO0lBQy9DLGFBQWEsRUFBRSx3QkFBd0I7SUFDdkMsY0FBYyxFQUFFLFNBQVM7SUFDekIsYUFBYSxFQUFFLDBCQUEwQjtJQUN6QyxzQkFBc0IsRUFBRSx5Q0FBeUM7SUFDakUsWUFBWSxFQUFFLDZCQUE2QjtJQUMzQyxhQUFhLEVBQUUsbUNBQW1DO0lBQ2xELGFBQWEsRUFBRSw2QkFBNkI7SUFDNUMsZ0JBQWdCLEVBQUUsd0NBQXdDO0lBQzFELGdCQUFnQixFQUFFLGtDQUFrQztJQUNwRCxjQUFjLEVBQUUsdUNBQXVDO0lBQ3ZELGNBQWMsRUFBRSx3Q0FBd0M7SUFDeEQsYUFBYSxFQUFFLGdFQUFnRTtJQUMvRSxVQUFVLEVBQUUsMkNBQTJDO0lBQ3ZELFVBQVUsRUFBRSwwQ0FBMEM7SUFDdEQsWUFBWSxFQUFFLG1DQUFtQztJQUNqRCxlQUFlLEVBQUUsMkJBQTJCO0lBQzVDLGtCQUFrQixFQUFFLHFEQUFxRDtJQUN6RSxhQUFhLEVBQUUsa0NBQWtDO0lBQ2pELGtCQUFrQixFQUFFLHdCQUF3QjtJQUM1QyxhQUFhLEVBQUUsNkRBQTZEO0lBQzVFLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLFNBQVMsRUFBRSxVQUFVO0NBQ3hCLENBQUM7QUFFRiwwRUFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7QUNsQ0g7QUFFN0MsSUFBSSxrQkFBa0IsR0FBRztJQUM1QixZQUFZLEVBQUUsV0FBVztJQUN6QixZQUFZLEVBQUUsT0FBTztJQUNyQixZQUFZLEVBQUUsUUFBUTtJQUN0QixhQUFhLEVBQUUsd0JBQXdCO0lBQ3ZDLFlBQVksRUFBRSxrQkFBa0I7SUFDaEMsV0FBVyxFQUFFLG1DQUFtQztJQUNoRCxnQkFBZ0IsRUFBRSxnQ0FBZ0M7SUFDbEQsYUFBYSxFQUFFLDhCQUE4QjtJQUM3QyxjQUFjLEVBQUUsVUFBVTtJQUMxQixhQUFhLEVBQUUsNkJBQTZCO0lBQzVDLHNCQUFzQixFQUFFLHFDQUFxQztJQUM3RCxZQUFZLEVBQUUscUNBQXFDO0lBQ25ELGFBQWEsRUFBRSxtQ0FBbUM7SUFDbEQsYUFBYSxFQUFFLG9DQUFvQztJQUNuRCxnQkFBZ0IsRUFBRSxtREFBbUQ7SUFDckUsZ0JBQWdCLEVBQUUsbUNBQW1DO0lBQ3JELGNBQWMsRUFBRSxzQ0FBc0M7SUFDdEQsY0FBYyxFQUFFLDBDQUEwQztJQUMxRCxhQUFhLEVBQUUsdUVBQXVFO0lBQ3RGLFVBQVUsRUFBRSxnREFBZ0Q7SUFDNUQsVUFBVSxFQUFFLGdEQUFnRDtJQUM1RCxZQUFZLEVBQUUsMkNBQTJDO0lBQ3pELGVBQWUsRUFBRSxtQ0FBbUM7SUFDcEQsa0JBQWtCLEVBQUUsZ0RBQWdEO0lBQ3BFLGFBQWEsRUFBRSwrQ0FBK0M7SUFDOUQsa0JBQWtCLEVBQUUsK0JBQStCO0lBQ25ELGFBQWEsRUFBRSw0REFBNEQ7SUFDM0UsTUFBTSxFQUFFLGNBQWM7SUFDdEIsU0FBUyxFQUFFLFdBQVc7Q0FDekIsQ0FBQztBQUVGLDBFQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxrQkFBa0IsQ0FBQzs7Ozs7Ozs7OztBQ2xDRjtBQUU3QyxJQUFJLG1CQUFtQixHQUFHO0lBQzdCLFlBQVksRUFBRSxTQUFTO0lBQ3ZCLFlBQVksRUFBRSxRQUFRO0lBQ3RCLFlBQVksRUFBRSxRQUFRO0lBQ3RCLFlBQVksRUFBRSxpQkFBaUI7SUFDL0IsV0FBVyxFQUFFLGlDQUFpQztJQUM5QyxnQkFBZ0IsRUFBRSwrQkFBK0I7SUFDakQsYUFBYSxFQUFFLHNDQUFzQztJQUNyRCxhQUFhLEVBQUUsa0JBQWtCO0lBQ2pDLGNBQWMsRUFBRSxTQUFTO0lBQ3pCLGFBQWEsRUFBRSw4QkFBOEI7SUFDN0MsWUFBWSxFQUFFLGVBQWU7SUFDN0IsYUFBYSxFQUFFLHdCQUF3QjtJQUN2QyxjQUFjLEVBQUUsNkNBQTZDO0lBQzdELGNBQWMsRUFBRSw2Q0FBNkM7SUFDN0QsYUFBYSxFQUFFLDhFQUE4RTtJQUM3RixVQUFVLEVBQUUsOENBQThDO0lBQzFELFVBQVUsRUFBRSw4Q0FBOEM7SUFDMUQsWUFBWSxFQUFFLDBDQUEwQztJQUN4RCxhQUFhLEVBQUUsc0NBQXNDO0lBQ3JELGtCQUFrQixFQUFFLHVDQUF1QztDQUM5RCxDQUFDO0FBRUYsMEVBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLG1CQUFtQixDQUFDOzs7Ozs7Ozs7QUN6QnZEO0FBQUEsOENBQThDO0FBQ007QUFFN0MsSUFBSSxrQkFBa0IsR0FBRztJQUM1QixZQUFZLEVBQUUsUUFBUTtJQUN0QixZQUFZLEVBQUUsVUFBVTtJQUN4QixZQUFZLEVBQUUsV0FBVztJQUN6QixhQUFhLEVBQUUsUUFBUTtJQUN2QixZQUFZLEVBQUUsb0JBQW9CO0lBQ2xDLFdBQVcsRUFBRSwwREFBMEQ7SUFDdkUsZ0JBQWdCLEVBQUUsMENBQTBDO0lBQzVELGFBQWEsRUFBRSxvQ0FBb0M7SUFDbkQsY0FBYyxFQUFFLFNBQVM7SUFDekIsYUFBYSxFQUFFLG1DQUFtQztJQUNsRCxZQUFZLEVBQUUsa0NBQWtDO0lBQ2hELGFBQWEsRUFBRSw2Q0FBNkM7SUFDNUQsY0FBYyxFQUFFLCtDQUErQztJQUMvRCxjQUFjLEVBQUUscURBQXFEO0lBQ3JFLGFBQWEsRUFBRSxtRkFBbUY7SUFDbEcsVUFBVSxFQUFFLHNEQUFzRDtJQUNsRSxVQUFVLEVBQUUsc0RBQXNEO0lBQ2xFLFlBQVksRUFBRSw4Q0FBOEM7SUFDNUQsYUFBYSxFQUFFLDBEQUEwRDtJQUN6RSxrQkFBa0IsRUFBRSx3Q0FBd0M7Q0FDL0QsQ0FBQztBQUVGLDBFQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxrQkFBa0IsQ0FBQzs7Ozs7Ozs7OztBQzFCRjtBQUU3QyxJQUFJLG9CQUFvQixHQUFHO0lBQzlCLFlBQVksRUFBRSxXQUFXO0lBQ3pCLFlBQVksRUFBRSxVQUFVO0lBQ3hCLFlBQVksRUFBRSxRQUFRO0lBQ3RCLGFBQWEsRUFBRSxlQUFlO0lBQzlCLFlBQVksRUFBRSxjQUFjO0lBQzVCLFdBQVcsRUFBRSx1RUFBdUU7SUFDcEYsZ0JBQWdCLEVBQUUsZ0NBQWdDO0lBQ2xELGFBQWEsRUFBRSxrQ0FBa0M7SUFDakQsY0FBYyxFQUFFLFlBQVk7SUFDNUIsYUFBYSxFQUFFLDZCQUE2QjtJQUM1QyxZQUFZLEVBQUUsOEJBQThCO0lBQzVDLGFBQWEsRUFBRSwwQ0FBMEM7SUFDekQsY0FBYyxFQUFFLGdEQUFnRDtJQUNoRSxjQUFjLEVBQUUsK0NBQStDO0lBQy9ELGFBQWEsRUFBRSx1RkFBdUY7SUFDdEcsVUFBVSxFQUFFLG1EQUFtRDtJQUMvRCxVQUFVLEVBQUUsb0RBQW9EO0lBQ2hFLFlBQVksRUFBRSxnQ0FBZ0M7SUFDOUMsa0JBQWtCLEVBQUUscUNBQXFDO0NBQzVELENBQUM7QUFFRiwwRUFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsb0JBQW9CLENBQUM7Ozs7Ozs7OztBQ3hCeEQ7QUFBQSw4Q0FBOEM7QUFDTTtBQUU3QyxJQUFJLG1CQUFtQixHQUFHO0lBQzdCLFlBQVksRUFBRSxxQkFBcUI7SUFDbkMsWUFBWSxFQUFFLFNBQVM7SUFDdkIsWUFBWSxFQUFFLFVBQVU7SUFDeEIsYUFBYSxFQUFFLHVCQUF1QjtJQUN0QyxZQUFZLEVBQUUsa0JBQWtCO0lBQ2hDLFdBQVcsRUFBRSxvRUFBb0U7SUFDakYsZ0JBQWdCLEVBQUUsOENBQThDO0lBQ2hFLGFBQWEsRUFBRSxnREFBZ0Q7SUFDL0QsY0FBYyxFQUFFLGVBQWU7SUFDL0IsYUFBYSxFQUFFLHdEQUF3RDtJQUN2RSxzQkFBc0IsRUFBRSxxQ0FBcUM7SUFDN0QsWUFBWSxFQUFFLDJDQUEyQztJQUN6RCxhQUFhLEVBQUUsdUNBQXVDO0lBQ3RELGNBQWMsRUFBRSx1REFBdUQ7SUFDdkUsY0FBYyxFQUFFLHNEQUFzRDtJQUN0RSxhQUFhLEVBQUUsNEhBQTRIO0lBQzNJLFVBQVUsRUFBRSxpRkFBaUY7SUFDN0YsVUFBVSxFQUFFLGlGQUFpRjtJQUM3RixZQUFZLEVBQUUseUNBQXlDO0lBQ3ZELGFBQWEsRUFBRSxvREFBb0Q7SUFDbkUsa0JBQWtCLEVBQUUsMENBQTBDO0NBQ2pFLENBQUM7QUFDRiwwRUFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7QUMxQkg7QUFFN0MsSUFBSSxtQkFBbUIsR0FBRztJQUM3QixZQUFZLEVBQUUsUUFBUTtJQUN0QixZQUFZLEVBQUUsUUFBUTtJQUN0QixZQUFZLEVBQUUsVUFBVTtJQUN4QixZQUFZLEVBQUUsbUJBQW1CO0lBQ2pDLFdBQVcsRUFBRSxnQ0FBZ0M7SUFDN0MsZ0JBQWdCLEVBQUUsbURBQW1EO0lBQ3JFLGFBQWEsRUFBRSwyQ0FBMkM7SUFDMUQsYUFBYSxFQUFFLCtCQUErQjtJQUM5QyxjQUFjLEVBQUUsV0FBVztJQUMzQixhQUFhLEVBQUUsb0NBQW9DO0lBQ25ELFlBQVksRUFBRSxpQ0FBaUM7SUFDL0MsYUFBYSxFQUFFLDZDQUE2QztJQUM1RCxjQUFjLEVBQUUsMkNBQTJDO0lBQzNELGNBQWMsRUFBRSwrQ0FBK0M7SUFDL0QsYUFBYSxFQUFFLCtFQUErRTtJQUM5RixVQUFVLEVBQUUsK0NBQStDO0lBQzNELFVBQVUsRUFBRSxnREFBZ0Q7SUFDNUQsWUFBWSxFQUFFLGtEQUFrRDtJQUNoRSxhQUFhLEVBQUUsaURBQWlEO0lBQ2hFLGtCQUFrQixFQUFFLHNEQUFzRDtDQUM3RSxDQUFDO0FBRUYsMEVBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLG1CQUFtQixDQUFDOzs7Ozs7Ozs7QUN6QnZEO0FBQUEsa0RBQWtEO0FBQ0U7QUFFN0MsSUFBSSxrQkFBa0IsR0FBRztJQUM1QixZQUFZLEVBQUUsYUFBYTtJQUMzQixZQUFZLEVBQUUsU0FBUztJQUN2QixZQUFZLEVBQUUsWUFBWTtJQUMxQixhQUFhLEVBQUUsOEJBQThCO0lBQzdDLFlBQVksRUFBRSxvQkFBb0I7SUFDbEMsV0FBVyxFQUFFLDJFQUEyRTtJQUN4RixnQkFBZ0IsRUFBRSw0REFBNEQ7SUFDOUUsYUFBYSxFQUFFLG1EQUFtRDtJQUNsRSxjQUFjLEVBQUUsYUFBYTtJQUM3QixhQUFhLEVBQUUsa0NBQWtDO0lBQ2pELHNCQUFzQixFQUFFLHdEQUF3RDtJQUNoRixZQUFZLEVBQUUsb0NBQW9DO0lBQ2xELGFBQWEsRUFBRSwrQ0FBK0M7SUFDOUQsZ0JBQWdCLEVBQUUsK0NBQStDO0lBQ2pFLGNBQWMsRUFBRSwrQ0FBK0M7SUFDL0QsY0FBYyxFQUFFLG9EQUFvRDtJQUNwRSxhQUFhLEVBQUUsd0ZBQXdGO0lBQ3ZHLFVBQVUsRUFBRSxxREFBcUQ7SUFDakUsVUFBVSxFQUFFLHFEQUFxRDtJQUNqRSxZQUFZLEVBQUUsK0NBQStDO0lBQzdELGVBQWUsRUFBRSxzQ0FBc0M7SUFDdkQsa0JBQWtCLEVBQUUsK0VBQStFO0lBQ25HLGFBQWEsRUFBRSw0Q0FBNEM7SUFDM0Qsa0JBQWtCLEVBQUUsb0RBQW9EO0lBQ3hFLGFBQWEsRUFBRSxzRkFBc0Y7SUFDckcsTUFBTSxFQUFFLGtCQUFrQjtJQUMxQixTQUFTLEVBQUUsVUFBVTtDQUN4QixDQUFDO0FBQ0YsMEVBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLGtCQUFrQixDQUFDOzs7Ozs7Ozs7O0FDaENGO0FBRTdDLElBQUksc0JBQXNCLEdBQUc7SUFDaEMsWUFBWSxFQUFFLFFBQVE7SUFDdEIsWUFBWSxFQUFFLFFBQVE7SUFDdEIsWUFBWSxFQUFFLE1BQU07SUFDcEIsYUFBYSxFQUFFLGtCQUFrQjtJQUNqQyxZQUFZLEVBQUUsZ0JBQWdCO0lBQzlCLFdBQVcsRUFBRSxxREFBcUQ7SUFDbEUsZ0JBQWdCLEVBQUUsMkNBQTJDO0lBQzdELHNCQUFzQixFQUFFLDZCQUE2QjtJQUNyRCxhQUFhLEVBQUUsdUJBQXVCO0lBQ3RDLGNBQWMsRUFBRSxjQUFjO0lBQzlCLEtBQUssRUFBRSxPQUFPO0lBQ2QsYUFBYSxFQUFFLHVDQUF1QztJQUN0RCxzQkFBc0IsRUFBRSxxQ0FBcUM7SUFDN0QsWUFBWSxFQUFFLGtDQUFrQztJQUNoRCxhQUFhLEVBQUUsbUNBQW1DO0lBQ2xELGFBQWEsRUFBRSxxQ0FBcUM7SUFDcEQsZ0JBQWdCLEVBQUUsc0RBQXNEO0lBQ3hFLGdCQUFnQixFQUFFLDhCQUE4QjtJQUNoRCxjQUFjLEVBQUUsd0NBQXdDO0lBQ3hELGNBQWMsRUFBRSwwQ0FBMEM7SUFDMUQsYUFBYSxFQUFFLGlGQUFpRjtJQUNoRyxVQUFVLEVBQUUsNEJBQTRCO0lBQ3hDLFVBQVUsRUFBRSx3Q0FBd0M7SUFDcEQsWUFBWSxFQUFFLGtDQUFrQztJQUNoRCxlQUFlLEVBQUUsOENBQThDO0lBQy9ELGtCQUFrQixFQUFFLDJFQUEyRTtJQUMvRixhQUFhLEVBQUUsc0NBQXNDO0lBQ3JELGtCQUFrQixFQUFFLDRCQUE0QjtJQUNoRCxhQUFhLEVBQUUsb0VBQW9FO0lBQ25GLGFBQWEsRUFBRSx1QkFBdUI7SUFDdEMsbUJBQW1CLEVBQUUsb0NBQW9DO0lBQ3pELE1BQU0sRUFBRSxnQkFBZ0I7SUFDeEIsU0FBUyxFQUFFLGFBQWE7SUFDeEIsUUFBUSxFQUFFLGVBQWU7SUFDekIsV0FBVyxFQUFFLGFBQWE7SUFDMUIsWUFBWSxFQUFFLE1BQU07SUFDcEIsYUFBYSxFQUFFLFFBQVE7SUFDdkIsVUFBVSxFQUFFLEtBQUs7SUFDakIsVUFBVSxFQUFFLGlDQUFpQztJQUM3QyxlQUFlLEVBQUUscURBQXFEO0lBQ3RFLGlCQUFpQixFQUFFLDRCQUE0QjtJQUMvQyxlQUFlLEVBQUUsZUFBZTtDQUNuQyxDQUFDO0FBRUYsMEVBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLHNCQUFzQixDQUFDOzs7Ozs7Ozs7O0FDL0NOO0FBRTdDLElBQUksc0JBQXNCLEdBQUc7SUFDaEMsWUFBWSxFQUFFLFNBQVM7SUFDdkIsWUFBWSxFQUFFLE9BQU87SUFDckIsWUFBWSxFQUFFLE9BQU87SUFDckIsYUFBYSxFQUFFLGdCQUFnQjtJQUMvQixZQUFZLEVBQUUsaUJBQWlCO0lBQy9CLFdBQVcsRUFBRSxxREFBcUQ7SUFDbEUsZ0JBQWdCLEVBQUUsdUNBQXVDO0lBQ3pELGFBQWEsRUFBRSx5QkFBeUI7SUFDeEMsY0FBYyxFQUFFLFVBQVU7SUFDMUIsYUFBYSxFQUFFLG1DQUFtQztJQUNsRCxzQkFBc0IsRUFBRSwrQ0FBK0M7SUFDdkUsWUFBWSxFQUFFLGtDQUFrQztJQUNoRCxhQUFhLEVBQUUsbUNBQW1DO0lBQ2xELGFBQWEsRUFBRSxpQ0FBaUM7SUFDaEQsZ0JBQWdCLEVBQUUsc0RBQXNEO0lBQ3hFLGdCQUFnQixFQUFFLG9EQUFvRDtJQUN0RSxjQUFjLEVBQUUscURBQXFEO0lBQ3JFLGNBQWMsRUFBRSxtREFBbUQ7SUFDbkUsYUFBYSxFQUFFLHdFQUF3RTtJQUN2RixVQUFVLEVBQUUsNkNBQTZDO0lBQ3pELFVBQVUsRUFBRSw4Q0FBOEM7SUFDMUQsWUFBWSxFQUFFLHNDQUFzQztJQUNwRCxlQUFlLEVBQUUsaURBQWlEO0lBQ2xFLGtCQUFrQixFQUFFLHFEQUFxRDtJQUN6RSxhQUFhLEVBQUUsdUNBQXVDO0lBQ3RELGtCQUFrQixFQUFFLG9DQUFvQztJQUN4RCxhQUFhLEVBQUUsOEVBQThFO0lBQzdGLE1BQU0sRUFBRSxjQUFjO0lBQ3RCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLGlCQUFpQixFQUFFLGVBQWU7SUFDbEMsa0JBQWtCLEVBQUUsY0FBYztJQUNsQyxpQkFBaUIsRUFBRSxlQUFlO0lBQ2xDLGFBQWEsRUFBRSxRQUFRO0lBQ3ZCLFVBQVUsRUFBRSxLQUFLO0NBQ3BCLENBQUM7QUFFRiwwRUFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7QUN2Q047QUFFN0MsSUFBSSxvQkFBb0IsR0FBRztJQUM5QixZQUFZLEVBQUUsWUFBWTtJQUMxQixZQUFZLEVBQUUsWUFBWTtJQUMxQixZQUFZLEVBQUUsT0FBTztJQUNyQixhQUFhLEVBQUUsa0JBQWtCO0lBQ2pDLFlBQVksRUFBRSxtQkFBbUI7SUFDakMsV0FBVyxFQUFFLHlEQUF5RDtJQUN0RSxnQkFBZ0IsRUFBRSw2Q0FBNkM7SUFDL0QsYUFBYSxFQUFFLDBDQUEwQztJQUN6RCxjQUFjLEVBQUUsV0FBVztJQUMzQixhQUFhLEVBQUUsb0JBQW9CO0lBQ25DLHNCQUFzQixFQUFFLDJCQUEyQjtJQUNuRCxZQUFZLEVBQUUsZ0NBQWdDO0lBQzlDLGFBQWEsRUFBRSwrQkFBK0I7SUFDOUMsYUFBYSxFQUFFLDRDQUE0QztJQUMzRCxnQkFBZ0IsRUFBRSw2REFBNkQ7SUFDL0UsZ0JBQWdCLEVBQUUsOEJBQThCO0lBQ2hELGNBQWMsRUFBRSxrQ0FBa0M7SUFDbEQsY0FBYyxFQUFFLG1DQUFtQztJQUNuRCxhQUFhLEVBQUUsdUVBQXVFO0lBQ3RGLFVBQVUsRUFBRSw0Q0FBNEM7SUFDeEQsVUFBVSxFQUFFLDRDQUE0QztJQUN4RCxZQUFZLEVBQUUsZ0NBQWdDO0lBQzlDLGVBQWUsRUFBRSxtREFBbUQ7SUFDcEUsa0JBQWtCLEVBQUUsaUVBQWlFO0lBQ3JGLGFBQWEsRUFBRSw4QkFBOEI7SUFDN0Msa0JBQWtCLEVBQUUsNEJBQTRCO0lBQ2hELGFBQWEsRUFBRSx1REFBdUQ7SUFDdEUsTUFBTSxFQUFFLGVBQWU7SUFDdkIsU0FBUyxFQUFFLGNBQWM7SUFDekIsWUFBWSxFQUFFLFVBQVU7SUFDeEIsYUFBYSxFQUFFLFNBQVM7SUFDeEIsVUFBVSxFQUFFLE1BQU07Q0FDckIsQ0FBQztBQUVGLDBFQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxvQkFBb0IsQ0FBQzs7Ozs7Ozs7OztBQ3JDSjtBQUU3QyxJQUFJLG9CQUFvQixHQUFHO0lBQzlCLFlBQVksRUFBRSxTQUFTO0lBQ3ZCLFlBQVksRUFBRSxPQUFPO0lBQ3JCLFlBQVksRUFBRSxTQUFTO0lBQ3ZCLFlBQVksRUFBRSxvQkFBb0I7SUFDbEMsV0FBVyxFQUFFLHdCQUF3QjtJQUNyQyxnQkFBZ0IsRUFBRSw0Q0FBNEM7SUFDOUQsYUFBYSxFQUFFLHNCQUFzQjtJQUNyQyxhQUFhLEVBQUUsMkJBQTJCO0lBQzFDLGNBQWMsRUFBRSxlQUFlO0lBQy9CLGFBQWEsRUFBRSxnQ0FBZ0M7SUFDL0MsWUFBWSxFQUFFLDZCQUE2QjtJQUMzQyxhQUFhLEVBQUUsc0NBQXNDO0lBQ3JELGNBQWMsRUFBRSx5Q0FBeUM7SUFDekQsY0FBYyxFQUFFLGtEQUFrRDtJQUNsRSxhQUFhLEVBQUUsK0VBQStFO0lBQzlGLFVBQVUsRUFBRSx1Q0FBdUM7SUFDbkQsVUFBVSxFQUFFLHVDQUF1QztJQUNuRCxZQUFZLEVBQUUseUNBQXlDO0lBQ3ZELGtCQUFrQixFQUFFLHNDQUFzQztDQUM3RCxDQUFDO0FBRUYsMEVBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLG9CQUFvQixDQUFDOzs7Ozs7Ozs7O0FDeEJKO0FBRTdDLElBQUksb0JBQW9CLEdBQUc7SUFDOUIsWUFBWSxFQUFFLE1BQU07SUFDcEIsWUFBWSxFQUFFLE1BQU07SUFDcEIsWUFBWSxFQUFFLE9BQU87SUFDckIsYUFBYSxFQUFFLGFBQWE7SUFDNUIsWUFBWSxFQUFFLGlCQUFpQjtJQUMvQixXQUFXLEVBQUUsbURBQW1EO0lBQ2hFLGdCQUFnQixFQUFFLHdDQUF3QztJQUMxRCxzQkFBc0IsRUFBRSx1REFBdUQ7SUFDL0UsYUFBYSxFQUFFLHNCQUFzQjtJQUNyQyxjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLEtBQUssRUFBRSxPQUFPO0lBQ2QsYUFBYSxFQUFFLHdCQUF3QjtJQUN2QyxzQkFBc0IsRUFBRSx1Q0FBdUM7SUFDL0QsWUFBWSxFQUFFLHNCQUFzQjtJQUNwQyxhQUFhLEVBQUUsK0JBQStCO0lBQzlDLGFBQWEsRUFBRSxrQ0FBa0M7SUFDakQsZ0JBQWdCLEVBQUUscURBQXFEO0lBQ3ZFLGdCQUFnQixFQUFFLCtCQUErQjtJQUNqRCxjQUFjLEVBQUUsd0JBQXdCO0lBQ3hDLGNBQWMsRUFBRSxpQ0FBaUM7SUFDakQsYUFBYSxFQUFFLCtCQUErQjtJQUM5QyxVQUFVLEVBQUUsNkJBQTZCO0lBQ3pDLFVBQVUsRUFBRSxxQ0FBcUM7SUFDakQsWUFBWSxFQUFFLDBCQUEwQjtJQUN4QyxlQUFlLEVBQUUscUNBQXFDO0lBQ3RELGtCQUFrQixFQUFFLHdEQUF3RDtJQUM1RSxhQUFhLEVBQUUsNEJBQTRCO0lBQzNDLGtCQUFrQixFQUFFLDJCQUEyQjtJQUMvQyxhQUFhLEVBQUUsMkNBQTJDO0lBQzFELGFBQWEsRUFBRSxpQ0FBaUM7SUFDaEQsbUJBQW1CLEVBQUUsZ0NBQWdDO0lBQ3JELE1BQU0sRUFBRSxVQUFVO0lBQ2xCLFNBQVMsRUFBRSxLQUFLO0lBQ2hCLFFBQVEsRUFBRSxNQUFNO0lBQ2hCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFlBQVksRUFBRSxNQUFNO0lBQ3BCLGFBQWEsRUFBRSxNQUFNO0lBQ3JCLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFVBQVUsRUFBRSx5Q0FBeUM7SUFDckQsZUFBZSxFQUFFLHVDQUF1QztJQUN4RCxpQkFBaUIsRUFBRSwwQkFBMEI7SUFDN0MsZUFBZSxFQUFFLGdCQUFnQjtDQUNwQyxDQUFDO0FBQ0YsMEVBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLG9CQUFvQixDQUFDOzs7Ozs7Ozs7O0FDOUNKO0FBRTdDLElBQUksbUJBQW1CLEdBQUc7SUFDN0IsWUFBWSxFQUFFLFFBQVE7SUFDdEIsWUFBWSxFQUFFLE9BQU87SUFDckIsWUFBWSxFQUFFLFFBQVE7SUFDdEIsYUFBYSxFQUFFLHdCQUF3QjtJQUN2QyxZQUFZLEVBQUUsa0JBQWtCO0lBQ2hDLFdBQVcsRUFBRSwwQkFBMEI7SUFDdkMsZ0JBQWdCLEVBQUUsb0NBQW9DO0lBQ3RELGFBQWEsRUFBRSw2QkFBNkI7SUFDNUMsY0FBYyxFQUFFLFlBQVk7SUFDNUIsYUFBYSxFQUFFLG9DQUFvQztJQUNuRCxzQkFBc0IsRUFBRSwyQ0FBMkM7SUFDbkUsWUFBWSxFQUFFLHVDQUF1QztJQUNyRCxhQUFhLEVBQUUsdUNBQXVDO0lBQ3RELGFBQWEsRUFBRSxxQ0FBcUM7SUFDcEQsZ0JBQWdCLEVBQUUsc0RBQXNEO0lBQ3hFLGdCQUFnQixFQUFFLDRDQUE0QztJQUM5RCxjQUFjLEVBQUUsd0NBQXdDO0lBQ3hELGNBQWMsRUFBRSwyQ0FBMkM7SUFDM0QsYUFBYSxFQUFFLCtFQUErRTtJQUM5RixVQUFVLEVBQUUsbURBQW1EO0lBQy9ELFVBQVUsRUFBRSxvREFBb0Q7SUFDaEUsWUFBWSxFQUFFLHNDQUFzQztJQUNwRCxlQUFlLEVBQUUsa0NBQWtDO0lBQ25ELGtCQUFrQixFQUFFLDZEQUE2RDtJQUNqRixhQUFhLEVBQUUscURBQXFEO0lBQ3BFLGtCQUFrQixFQUFFLDhCQUE4QjtJQUNsRCxhQUFhLEVBQUUsNkVBQTZFO0lBQzVGLE1BQU0sRUFBRSxjQUFjO0lBQ3RCLFNBQVMsRUFBRSxNQUFNO0NBQ3BCLENBQUM7QUFFRiwwRUFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7QUNoQzdCO0FBRW5CLElBQUksdUJBQXVCLEdBQUc7SUFDcEMsWUFBWSxFQUFFLFVBQVU7SUFDeEIsWUFBWSxFQUFFLFNBQVM7SUFDdkIsWUFBWSxFQUFFLFdBQVc7SUFDekIsYUFBYSxFQUFFLG9CQUFvQjtJQUNuQyxZQUFZLEVBQUUsbUJBQW1CO0lBQ2pDLFdBQVcsRUFBRSxnREFBZ0Q7SUFDN0QsZ0JBQWdCLEVBQUUsb0NBQW9DO0lBQ3RELHNCQUFzQixFQUFFLDREQUE0RDtJQUNwRixhQUFhLEVBQUUsK0JBQStCO0lBQzlDLGNBQWMsRUFBRSxjQUFjO0lBQzlCLEtBQUssRUFBRSxPQUFPO0lBQ2QsYUFBYSxFQUFFLGlDQUFpQztJQUNoRCxzQkFBc0IsRUFBRSxzREFBc0Q7SUFDOUUsWUFBWSxFQUFFLDRCQUE0QjtJQUMxQyxhQUFhLEVBQUUsOENBQThDO0lBQzdELGFBQWEsRUFBRSw0Q0FBNEM7SUFDM0QsZ0JBQWdCLEVBQUUsMERBQTBEO0lBQzVFLGdCQUFnQixFQUFFLGlDQUFpQztJQUNuRCxjQUFjLEVBQUUsa0NBQWtDO0lBQ2xELGNBQWMsRUFBRSxrREFBa0Q7SUFDbEUsYUFBYSxFQUFFLG1FQUFtRTtJQUNsRixVQUFVLEVBQUUsMENBQTBDO0lBQ3RELFVBQVUsRUFBRSwwQ0FBMEM7SUFDdEQsWUFBWSxFQUFFLHNDQUFzQztJQUNwRCxlQUFlLEVBQUUseUNBQXlDO0lBQzFELGtCQUFrQixFQUFFLCtFQUErRTtJQUNuRyxhQUFhLEVBQUUsNENBQTRDO0lBQzNELGtCQUFrQixFQUFFLG1DQUFtQztJQUN2RCxhQUFhLEVBQUUseUZBQXlGO0lBQ3hHLE1BQU0sRUFBRSxpQkFBaUI7SUFDekIsU0FBUyxFQUFFLGVBQWU7SUFDMUIsUUFBUSxFQUFFLGdCQUFnQjtJQUMxQixXQUFXLEVBQUUsU0FBUztJQUN0QixZQUFZLEVBQUUsTUFBTTtJQUNwQixhQUFhLEVBQUUsUUFBUTtJQUN2QixVQUFVLEVBQUUsT0FBTztJQUNuQixVQUFVLEVBQUUsZ0RBQWdEO0lBQzVELGVBQWUsRUFBRSwwREFBMEQ7SUFDM0UsaUJBQWlCLEVBQUUseUNBQXlDO0lBQzVELGVBQWUsRUFBRSxpQkFBaUI7Q0FDbEMsQ0FBQztBQUVGLDBFQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyx1QkFBdUIsQ0FBQzs7Ozs7Ozs7OztBQy9DUDtBQUU3QyxJQUFJLHFCQUFxQixHQUFHO0lBQy9CLFlBQVksRUFBRSxXQUFXO0lBQ3pCLFlBQVksRUFBRSxTQUFTO0lBQ3ZCLFlBQVksRUFBRSxZQUFZO0lBQzFCLGFBQWEsRUFBRSxrQkFBa0I7SUFDakMsWUFBWSxFQUFFLG9CQUFvQjtJQUNsQyxXQUFXLEVBQUUsMkNBQTJDO0lBQ3hELGdCQUFnQixFQUFFLG9DQUFvQztJQUN0RCxhQUFhLEVBQUUsNEJBQTRCO0lBQzNDLGNBQWMsRUFBRSxZQUFZO0lBQzVCLGFBQWEsRUFBRSxrREFBa0Q7SUFDakUsc0JBQXNCLEVBQUUscUNBQXFDO0lBQzdELFlBQVksRUFBRSxtQ0FBbUM7SUFDakQsYUFBYSxFQUFFLDJDQUEyQztJQUMxRCxjQUFjLEVBQUUseUNBQXlDO0lBQ3pELGNBQWMsRUFBRSx5Q0FBeUM7SUFDekQsYUFBYSxFQUFFLG9GQUFvRjtJQUNuRyxVQUFVLEVBQUUseURBQXlEO0lBQ3JFLFVBQVUsRUFBRSx3REFBd0Q7SUFDcEUsWUFBWSxFQUFFLGtEQUFrRDtJQUNoRSxhQUFhLEVBQUUsc0RBQXNEO0lBQ3JFLGtCQUFrQixFQUFFLHVDQUF1QztDQUM5RCxDQUFDO0FBQ0YsMEVBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLHFCQUFxQixDQUFDOzs7Ozs7Ozs7O0FDekJMO0FBRTdDLElBQUksb0JBQW9CLEdBQUc7SUFDOUIsWUFBWSxFQUFFLE9BQU87SUFDckIsWUFBWSxFQUFFLE9BQU87SUFDckIsWUFBWSxFQUFFLFFBQVE7SUFDdEIsWUFBWSxFQUFFLHFCQUFxQjtJQUNuQyxXQUFXLEVBQUUsd0JBQXdCO0lBQ3JDLGdCQUFnQixFQUFFLHNDQUFzQztJQUN4RCxhQUFhLEVBQUUsdUJBQXVCO0lBQ3RDLGFBQWEsRUFBRSw4QkFBOEI7SUFDN0MsY0FBYyxFQUFFLFlBQVk7SUFDNUIsYUFBYSxFQUFFLGlDQUFpQztJQUNoRCxZQUFZLEVBQUUsMkJBQTJCO0lBQ3pDLGFBQWEsRUFBRSwyQ0FBMkM7SUFDMUQsY0FBYyxFQUFFLDZDQUE2QztJQUM3RCxjQUFjLEVBQUUsOENBQThDO0lBQzlELGFBQWEsRUFBRSw0RUFBNEU7SUFDM0YsVUFBVSxFQUFFLDhDQUE4QztJQUMxRCxVQUFVLEVBQUUsOENBQThDO0lBQzFELFlBQVksRUFBRSw2REFBNkQ7SUFDM0Usa0JBQWtCLEVBQUUsOENBQThDO0NBQ3JFLENBQUM7QUFFRiwwRUFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7QUN4Qko7QUFFN0MsSUFBSSw4QkFBOEIsR0FBRztJQUN4QyxZQUFZLEVBQUUsS0FBSztJQUNuQixZQUFZLEVBQUUsS0FBSztJQUNuQixZQUFZLEVBQUUsTUFBTTtJQUNwQixhQUFhLEVBQUUsUUFBUTtJQUN2QixZQUFZLEVBQUUsa0JBQWtCO0lBQ2hDLFdBQVcsRUFBRSxZQUFZO0lBQ3pCLGdCQUFnQixFQUFFLFNBQVM7SUFDM0IsYUFBYSxFQUFFLFlBQVk7SUFDM0IsY0FBYyxFQUFFLFFBQVE7SUFDeEIsYUFBYSxFQUFFLFFBQVE7SUFDdkIsc0JBQXNCLEVBQUUsV0FBVztJQUNuQyxZQUFZLEVBQUUsVUFBVTtJQUN4QixhQUFhLEVBQUUsZ0JBQWdCO0lBQy9CLGFBQWEsRUFBRSxrQkFBa0I7SUFDakMsZ0JBQWdCLEVBQUUseUJBQXlCO0lBQzNDLGdCQUFnQixFQUFFLGdCQUFnQjtJQUNsQyxjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsYUFBYSxFQUFFLCtCQUErQjtJQUM5QyxVQUFVLEVBQUUscUJBQXFCO0lBQ2pDLFVBQVUsRUFBRSxxQkFBcUI7SUFDakMsWUFBWSxFQUFFLGlCQUFpQjtJQUMvQixlQUFlLEVBQUUsc0JBQXNCO0lBQ3ZDLGtCQUFrQixFQUFFLG9CQUFvQjtJQUN4QyxhQUFhLEVBQUUsY0FBYztJQUM3QixrQkFBa0IsRUFBRSxTQUFTO0lBQzdCLGFBQWEsRUFBRSxxQkFBcUI7SUFDcEMsTUFBTSxFQUFFLE1BQU07SUFDZCxTQUFTLEVBQUUsTUFBTTtJQUNqQixZQUFZLEVBQUUsSUFBSTtJQUNsQixhQUFhLEVBQUUsR0FBRztJQUNsQixVQUFVLEVBQUUsR0FBRztJQUNmLFVBQVUsRUFBRSxnQkFBZ0I7SUFDNUIsZUFBZSxFQUFFLHNCQUFzQjtJQUN2QyxpQkFBaUIsRUFBRSxTQUFTO0lBQzVCLGVBQWUsRUFBRSxLQUFLO0NBQ3pCLENBQUM7QUFFRiwwRUFBa0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsOEJBQThCLENBQUM7Ozs7Ozs7Ozs7QUN6Q2pCO0FBRTdDLElBQUksb0JBQW9CLEdBQUc7SUFDOUIsWUFBWSxFQUFFLFVBQVU7SUFDeEIsWUFBWSxFQUFFLFdBQVc7SUFDekIsWUFBWSxFQUFFLFVBQVU7SUFDeEIsYUFBYSxFQUFFLGlCQUFpQjtJQUNoQyxZQUFZLEVBQUUsbUJBQW1CO0lBQ2pDLFdBQVcsRUFBRSxrREFBa0Q7SUFDL0QsZ0JBQWdCLEVBQUUsb0NBQW9DO0lBQ3RELGFBQWEsRUFBRSw4QkFBOEI7SUFDN0MsY0FBYyxFQUFFLGVBQWU7SUFDL0IsYUFBYSxFQUFFLGlDQUFpQztJQUNoRCxzQkFBc0IsRUFBRSxrREFBa0Q7SUFDMUUsWUFBWSxFQUFFLGtDQUFrQztJQUNoRCxhQUFhLEVBQUUsNENBQTRDO0lBQzNELGFBQWEsRUFBRSx3Q0FBd0M7SUFDdkQsZ0JBQWdCLEVBQUUscURBQXFEO0lBQ3ZFLGdCQUFnQixFQUFFLDJDQUEyQztJQUM3RCxjQUFjLEVBQUUsa0RBQWtEO0lBQ2xFLGNBQWMsRUFBRSwrQ0FBK0M7SUFDL0QsYUFBYSxFQUFFLGdFQUFnRTtJQUMvRSxVQUFVLEVBQUUsc0NBQXNDO0lBQ2xELFVBQVUsRUFBRSx3Q0FBd0M7SUFDcEQsWUFBWSxFQUFFLGlEQUFpRDtJQUMvRCxlQUFlLEVBQUUsdUNBQXVDO0lBQ3hELGtCQUFrQixFQUFFLGdGQUFnRjtJQUNwRyxhQUFhLEVBQUUsK0NBQStDO0lBQzlELGtCQUFrQixFQUFFLHVDQUF1QztJQUMzRCxhQUFhLEVBQUUsaUZBQWlGO0lBQ2hHLE1BQU0sRUFBRSxvQkFBb0I7SUFDNUIsU0FBUyxFQUFFLHFCQUFxQjtJQUNoQyxpQkFBaUIsRUFBRSxpQkFBaUI7SUFDcEMsa0JBQWtCLEVBQUUsa0JBQWtCO0lBQ3RDLGlCQUFpQixFQUFFLGtCQUFrQjtJQUNyQyxhQUFhLEVBQUUsU0FBUztJQUN4QixVQUFVLEVBQUUsUUFBUTtDQUN2QixDQUFDO0FBRUYsMEVBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLG9CQUFvQixDQUFDOzs7Ozs7Ozs7QUN2Q3hEO0FBQUEsMkJBQTJCO0FBQ3lCO0FBRTdDLElBQUksb0JBQW9CLEdBQUc7SUFDOUIsWUFBWSxFQUFFLFlBQVk7SUFDMUIsWUFBWSxFQUFFLE9BQU87SUFDckIsWUFBWSxFQUFFLFFBQVE7SUFDdEIsYUFBYSxFQUFFLGlCQUFpQjtJQUNoQyxZQUFZLEVBQUUsaUJBQWlCO0lBQy9CLFdBQVcsRUFBRSxvREFBb0Q7SUFDakUsZ0JBQWdCLEVBQUUscUNBQXFDO0lBQ3ZELGFBQWEsRUFBRSxtQkFBbUI7SUFDbEMsY0FBYyxFQUFFLFNBQVM7SUFDekIsYUFBYSxFQUFFLDRCQUE0QjtJQUMzQyxzQkFBc0IsRUFBRSw0Q0FBNEM7SUFDcEUsWUFBWSxFQUFFLDRCQUE0QjtJQUMxQyxhQUFhLEVBQUUsbUNBQW1DO0lBQ2xELGdCQUFnQixFQUFFLG9DQUFvQztJQUN0RCxjQUFjLEVBQUUsMkNBQTJDO0lBQzNELGNBQWMsRUFBRSw2Q0FBNkM7SUFDN0QsYUFBYSxFQUFFLDRFQUE0RTtJQUMzRixVQUFVLEVBQUUsMENBQTBDO0lBQ3RELFVBQVUsRUFBRSw2Q0FBNkM7SUFDekQsWUFBWSxFQUFFLDBDQUEwQztJQUN4RCxlQUFlLEVBQUUsd0NBQXdDO0lBQ3pELGtCQUFrQixFQUFFLHNGQUFzRjtJQUMxRyxhQUFhLEVBQUUsb0NBQW9DO0lBQ25ELGtCQUFrQixFQUFFLG1DQUFtQztJQUN2RCxhQUFhLEVBQUUsNEVBQTRFO0lBQzNGLE1BQU0sRUFBRSxlQUFlO0lBQ3ZCLFNBQVMsRUFBRSxTQUFTO0NBQ3ZCLENBQUM7QUFFRiwwRUFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7QUNqQ0o7QUFFN0MsSUFBSSxvQkFBb0IsR0FBRztJQUMxQixZQUFZLEVBQUUsTUFBTTtJQUNwQixZQUFZLEVBQUUsT0FBTztJQUNyQixZQUFZLEVBQUUsZ0JBQWdCO0lBQzlCLGFBQWEsRUFBRSxxQkFBcUI7SUFDcEMsWUFBWSxFQUFFLGlCQUFpQjtJQUMvQixXQUFXLEVBQUUsdURBQXVEO0lBQ3BFLGdCQUFnQixFQUFFLGlEQUFpRDtJQUNuRSxhQUFhLEVBQUUsZ0NBQWdDO0lBQy9DLGNBQWMsRUFBRSxhQUFhO0lBQzdCLGFBQWEsRUFBRSw2QkFBNkI7SUFDNUMsWUFBWSxFQUFFLGlDQUFpQztJQUMvQyxhQUFhLEVBQUUsMkJBQTJCO0lBQzFDLGdCQUFnQixFQUFFLG1DQUFtQztJQUNyRCxjQUFjLEVBQUUsb0NBQW9DO0lBQ3BELGNBQWMsRUFBRSxzQ0FBc0M7SUFDdEQsYUFBYSxFQUFFLHVFQUF1RTtJQUN0RixVQUFVLEVBQUUscURBQXFEO0lBQ2pFLFVBQVUsRUFBRSx1REFBdUQ7SUFDbkUsWUFBWSxFQUFFLDJDQUEyQztJQUN6RCxlQUFlLEVBQUUsbUNBQW1DO0lBQ3BELGtCQUFrQixFQUFFLCtEQUErRDtJQUNuRixhQUFhLEVBQUUsb0NBQW9DO0lBQ25ELGtCQUFrQixFQUFFLGlDQUFpQztJQUNyRCxhQUFhLEVBQUUsdUVBQXVFO0lBQ3RGLE1BQU0sRUFBRSxZQUFZO0lBQ3BCLFNBQVMsRUFBRSxRQUFRO0NBQzFCLENBQUM7QUFFRiwwRUFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FDOUJOO0FBQ1Y7QUFDSjtBQUdwQzs7R0FFRztBQUNIO0lBQTBDLHVGQUFRO0lBRTlDLDhCQUFtQixJQUFZO1FBQS9CLFlBQ0ksa0JBQU0sSUFBSSxDQUFDLFNBRWQ7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUUzQixLQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxFQUFFLEtBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzs7SUFDdEQsQ0FBQztJQUNNLHNDQUFPLEdBQWQ7UUFDSSxNQUFNLENBQUMsU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFJRCxzQkFBVyxpREFBZTtRQUgxQjs7V0FFRzthQUNILGNBQXdDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUNoRSxzQkFBVywwQ0FBUTthQUFuQixjQUFpQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBQ3pELHlEQUEwQixHQUExQixjQUErQixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQU03QyxzQkFBVyw4Q0FBWTtRQUx2Qjs7OztXQUlHO2FBQ0g7WUFDSSxFQUFFLEVBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDL0IsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzdDLENBQUM7YUFDRCxVQUF3QixHQUFRO1lBQzVCLEVBQUUsRUFBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDdEIsQ0FBQztZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNKLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzFFLENBQUM7UUFDTCxDQUFDOzs7T0FQQTtJQVdELHNCQUFXLDhDQUFZO1FBSHZCOztXQUVHO2FBQ0gsY0FBaUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2pHLFVBQXdCLEdBQVE7WUFDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNuQyxDQUFDOzs7T0FKZ0c7SUFVakcsc0JBQVcsdUNBQUs7UUFMaEI7Ozs7V0FJRzthQUNILGNBQTZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzdFLFVBQWlCLEdBQVksSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREY7SUFFN0Usc0JBQUksMENBQVE7YUFBWixjQUFvQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFDaEYsc0JBQUksaURBQWU7YUFBbkI7WUFDSSxFQUFFLEVBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzFELENBQUM7OztPQUFBO0lBSUQsc0JBQVcsMkNBQVM7UUFIcEI7O1dBRUc7YUFDSCxjQUFrQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM5RSxVQUFxQixHQUFZLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQUREO0lBSzlFLHNCQUFXLDJDQUFTO1FBSHBCOztXQUVHO2FBQ0gsY0FBOEIsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFDO2FBQ3pFLFVBQXFCLEdBQVEsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUM7OztPQUREO0lBS3pFLHNCQUFXLDRDQUFVO1FBSHJCOztXQUVHO2FBQ0gsY0FBK0IsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFDO2FBQzNFLFVBQXNCLEdBQVEsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUM7OztPQUREO0lBRW5FLDJDQUFZLEdBQXBCLGNBQThCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN0RSw0Q0FBYSxHQUFyQixjQUErQixNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDeEUsOENBQWUsR0FBekI7UUFDSSxFQUFFLEVBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUM7WUFBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6RCxFQUFFLEVBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxPQUFPLENBQUM7WUFBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMzRCxFQUFFLEVBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxlQUFlLENBQUM7WUFBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUMvRCxDQUFDO0lBQ0wsMkJBQUM7QUFBRCxDQUFDLENBekV5QywyREFBUSxHQXlFakQ7O0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxDQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEVBQUU7SUFDcEksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLFVBQVUsRUFBRTtJQUN6RCxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsWUFBWSxDQUFDLEVBQUUsY0FBYyxNQUFNLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUV2SCx5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsVUFBQyxJQUFJLElBQU8sTUFBTSxDQUFDLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUN4Rm5FO0FBQ1U7QUFDUztBQUUzRDs7R0FFRztBQUNIO0lBQTJDLHdGQUFvQjtJQUMzRCwrQkFBbUIsSUFBWTtRQUEvQixZQUNJLGtCQUFNLElBQUksQ0FBQyxTQUNkO1FBRmtCLFVBQUksR0FBSixJQUFJLENBQVE7O0lBRS9CLENBQUM7SUFDRCxzQkFBVywrQ0FBWTthQUF2QjtZQUNJLEVBQUUsRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM3QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ2hDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDeEIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2IsR0FBRyxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEQsRUFBRSxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQ1IsRUFBRSxFQUFDLEdBQUcsQ0FBQzt3QkFBQyxHQUFHLElBQUksSUFBSSxDQUFDO29CQUNwQixHQUFHLElBQUksTUFBTSxDQUFDO2dCQUNsQixDQUFDO1lBQ0wsQ0FBQztZQUNELE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDZixDQUFDOzs7T0FBQTtJQUVTLDJDQUFXLEdBQXJCLFVBQXNCLEdBQVE7UUFDMUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUM5QyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBQ1MsNkNBQWEsR0FBdkIsVUFBd0IsR0FBUTtRQUM1QixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDckIsRUFBRSxFQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxpQkFBTSxhQUFhLFlBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNTLGlEQUFpQixHQUEzQixVQUE0QixHQUFRO1FBQ2hDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2xDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztnQkFBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1lBQy9DLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN6QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7Z0JBQ2pDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDbEIsQ0FBQztRQUNMLENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUNTLCtDQUFlLEdBQXpCLFVBQTBCLEdBQVE7UUFDOUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUNwQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNsQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNqQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNwQixJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ3pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQzlCLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ2xCLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDZixDQUFDO0lBQ00sdUNBQU8sR0FBZDtRQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUNMLDRCQUFDO0FBQUQsQ0FBQyxDQXhEMEMsa0ZBQW9CLEdBd0Q5RDs7QUFDRCwrREFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxjQUFjLE1BQU0sQ0FBQyxJQUFJLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ3BILHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxVQUFDLElBQUksSUFBTyxJQUFJLENBQUMsR0FBRyxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyx5RUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUNqRWhJO0FBQ0k7QUFDVTtBQUdsRDs7R0FFRztBQUNIO0lBQTBDLHVGQUFRO0lBQzlDLDhCQUFtQixJQUFZO1FBQS9CLFlBQ0ksa0JBQU0sSUFBSSxDQUFDLFNBRWQ7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUUzQixLQUFJLENBQUMsdUJBQXVCLENBQUMsYUFBYSxFQUFFLEtBQUksQ0FBQyxDQUFDOztJQUN0RCxDQUFDO0lBSUQsc0JBQVcsNkNBQVc7UUFIdEI7O1dBRUc7YUFDSCxjQUFtQyxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUUsQ0FBQzthQUMxRixVQUF1QixHQUFXLElBQUksSUFBSSxDQUFDLHdCQUF3QixDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURBO0lBRTFGLHNCQUFJLGdEQUFjO2FBQWxCLGNBQXlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUkzRixzQkFBVyxzQ0FBSTtRQUhmOztXQUVHO2FBQ0gsY0FBNEIsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3RFLFVBQWdCLEdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREU7SUFLdEUsc0JBQVcsc0NBQUk7UUFIZjs7V0FFRzthQUNILGNBQTRCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN2RSxVQUFnQixHQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURHO0lBRWhFLHNDQUFPLEdBQWQ7UUFDSSxNQUFNLENBQUMsU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxzQ0FBTyxHQUFQO1FBQ0ksTUFBTSxDQUFDLGlCQUFNLE9BQU8sV0FBRSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFDTCwyQkFBQztBQUFELENBQUMsQ0EzQnlDLDJEQUFRLEdBMkJqRDs7QUFDRCwrREFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRTtJQUM5RyxFQUFDLElBQUksRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQUMsQ0FBQyxFQUFFLGNBQWMsTUFBTSxDQUFDLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDdkkseUVBQWUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFVBQUMsSUFBSSxJQUFPLE1BQU0sQ0FBQyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQ3RDbkU7QUFDVTtBQUNPO0FBQ047QUFHbkQ7O0dBRUc7QUFDSDtJQUEyQyx3RkFBa0I7SUFDekQsK0JBQW1CLElBQVk7UUFBL0IsWUFDSSxrQkFBTSxJQUFJLENBQUMsU0FFZDtRQUhrQixVQUFJLEdBQUosSUFBSSxDQUFRO1FBRTNCLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFJLENBQUMsQ0FBQzs7SUFDekQsQ0FBQztJQUlELHNCQUFXLGlEQUFjO1FBSHpCOztXQUVHO2FBQ0gsY0FBOEIsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsRUFBRSwwRUFBa0IsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN2SSxVQUEwQixHQUFXLElBQUksSUFBSSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BRHVDO0lBRXZJLHNCQUFJLG9EQUFpQjthQUFyQixjQUE2QyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQUMzRix1Q0FBTyxHQUFkO1FBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBQ0QsMERBQTBCLEdBQTFCLGNBQStCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2pELDRCQUFDO0FBQUQsQ0FBQyxDQWYwQyxnRkFBa0IsR0FlNUQ7O0FBQ0QsK0RBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLG1CQUFtQixFQUFDLENBQUMsRUFDNUcsY0FBYyxNQUFNLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUN6RSx5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsVUFBQyxJQUFJLElBQU8sSUFBSSxDQUFDLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcseUVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUMzQjVIO0FBQ0o7QUFFcEM7O0dBRUc7QUFDSDtJQUF3QyxxRkFBUTtJQUM1Qyw0QkFBbUIsSUFBWTtRQUEvQixZQUNJLGtCQUFNLElBQUksQ0FBQyxTQUNkO1FBRmtCLFVBQUksR0FBSixJQUFJLENBQVE7O0lBRS9CLENBQUM7SUFDTSxvQ0FBTyxHQUFkO1FBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBQ0wseUJBQUM7QUFBRCxDQUFDLENBUHVDLDJEQUFRLEdBTy9DOztBQUVELCtEQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLGNBQWMsTUFBTSxDQUFDLElBQUksa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQ2R0RTtBQUNJO0FBQ1U7QUFFSjtBQUU5Qzs7R0FFRztBQUNIO0lBQTZDLDBGQUFRO0lBR2pELGlDQUFtQixJQUFZO1FBQS9CLFlBQ0ksa0JBQU0sSUFBSSxDQUFDLFNBVWQ7UUFYa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUUzQixLQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxFQUFFLEtBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksSUFBSSxHQUFHLEtBQUksQ0FBQztRQUNoQixLQUFJLENBQUMsc0NBQXNDLENBQUMsWUFBWSxFQUNwRDtZQUNJLEVBQUUsRUFBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO2dCQUN2QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxxRUFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEUsQ0FBQztRQUNMLENBQUMsQ0FDSixDQUFDOztJQUNOLENBQUM7SUFDTSx5Q0FBTyxHQUFkLGNBQTRCLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBRSxDQUFDO0lBSW5ELHNCQUFXLDJDQUFNO1FBSGpCOztXQUVHO2FBQ0gsY0FBOEIsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ25GLFVBQWtCLEdBQVcsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREc7SUFFbkYsc0JBQUksOENBQVM7YUFBYixjQUFxQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFLbEYsc0JBQVcsK0NBQVU7UUFKckI7OztXQUdHO2FBQ0gsY0FBa0MsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ25GLFVBQXNCLEdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O09BREc7SUFFNUUsOENBQVksR0FBbkIsVUFBb0IsTUFBc0I7UUFDdEMsaUJBQU0sWUFBWSxZQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ3hELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7WUFBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxxRUFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFDckMsQ0FBQztJQUNELHNCQUFXLGlEQUFZO2FBQXZCO1lBQ0ksSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3pFLEVBQUUsRUFBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDckMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQyxFQUFFLEVBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7WUFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsQ0FBQzs7O09BQUE7SUFLRCxzQkFBVyxpREFBWTtRQUp2Qjs7O1dBR0c7YUFDSCxjQUFvQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDM0YsVUFBd0IsR0FBVyxJQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBQzs7O09BRFM7SUFNM0Ysc0JBQVcsNkNBQVE7UUFKbkI7OztXQUdHO2FBQ0gsY0FBZ0MsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2xGLFVBQW9CLEdBQVc7WUFDM0IsRUFBRSxFQUFDLGVBQWUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQzlDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDM0MsQ0FBQzs7O09BSmlGO0lBS2xGLHNCQUFXLGdEQUFXO2FBQXRCLGNBQW9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN4RixVQUF1QixHQUFZLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQURLO0lBRTlFLCtDQUFhLEdBQXZCLFVBQXdCLEdBQVE7UUFDNUIsRUFBRSxFQUFDLElBQUksQ0FBQyxZQUFZLElBQUksTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzlCLEVBQUUsRUFBQyxDQUFDLE1BQU0sQ0FBQztnQkFBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQzFCLElBQUksT0FBTyxHQUFHLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUMsQ0FBQztZQUNqRyxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUNMLDhCQUFDO0FBQUQsQ0FBQyxDQXJFNEMsMkRBQVEsR0FxRXBEOztBQUVEO0lBQ0ksTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSztRQUNuTixLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLO1FBQzNNLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUs7UUFDM00sS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSztRQUMzTSxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLO1FBQzNNLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLHVCQUF1QixFQUFFLEVBQUMsSUFBSSxFQUFDLFFBQVEsRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUM7SUFDcEgsRUFBQyxJ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QUNMLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUNELDJDQUFNLEdBQU47UUFDSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUM5QyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ3ZGLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQzlELElBQUksUUFBUSxHQUFHLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLENBQUM7UUFDckUsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNaLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDbEMsQ0FBQztRQUNELElBQUksU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7UUFDcEcsSUFBSSxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLEdB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aEIsQ0FBQztJQUNMLENBQUM7SUFDRCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0FBQy9DLENBQUM7QUFFRDtJQUNJLE1BQU0sQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLFdBQVcsS0FBSyxXQUFXLENBQUM7QUFDdEQsQ0FBQztBQU1BOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsRDhCO0FBQ087QUFDQTtBQUNNO0FBQ1k7QUFDNUI7QUFFNUIsOENBQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDaEIsTUFBTSxFQUFFLFVBQVMsS0FBSztRQUNsQixJQUFJLENBQUMsSUFBSSxDQUNMO1lBQ0ksaURBQWUsQ0FBQyxDQUNaLHFEQUFDLGtFQUFNLDhEQUFLLEtBQUssRUFBRyxDQUN2QixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2IsQ0FBQyxDQUNKLENBQUM7SUFDTixDQUFDO0lBRUQsWUFBWSxFQUFFLFVBQVMsS0FBSztRQUN4QixJQUFJLENBQUMsSUFBSSxDQUNMO1lBQ0ksaURBQWUsQ0FBQyxDQUNaLHFEQUFDLDhFQUFZLDhEQUFLLEtBQUssRUFBRyxDQUM3QixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2IsQ0FBQyxDQUNKLENBQUM7SUFDTixDQUFDO0NBQ0osQ0FBQyxDQUFDO0FBRUgsNERBQVcsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0FBRVIiLCJmaWxlIjoiLi9wYWNrYWdlcy9zdXJ2ZXktanF1ZXJ5L3N1cnZleS5qcXVlcnkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJqcXVlcnlcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJTdXJ2ZXlcIiwgW1wianF1ZXJ5XCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlN1cnZleVwiXSA9IGZhY3RvcnkocmVxdWlyZShcImpxdWVyeVwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiU3VydmV5XCJdID0gZmFjdG9yeShyb290W1wialF1ZXJ5XCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfNDRfXykge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxMDcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGE1ZTVkMWFjZTc5OGQ1M2IzY2FlIiwiZXhwb3J0IHZhciBfX2Fzc2lnbiA9IE9iamVjdFtcImFzc2lnblwiXSB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdGFyZ2V0W3BdID0gc1twXTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHModGhpc0NsYXNzLCBiYXNlQ2xhc3MpIHtcbiAgICBmb3IgKHZhciBwIGluIGJhc2VDbGFzcykgaWYgKGJhc2VDbGFzcy5oYXNPd25Qcm9wZXJ0eShwKSkgdGhpc0NsYXNzW3BdID0gYmFzZUNsYXNzW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gdGhpc0NsYXNzOyB9XG4gICAgdGhpc0NsYXNzLnByb3RvdHlwZSA9IGJhc2VDbGFzcyA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYmFzZUNsYXNzKSA6IChfXy5wcm90b3R5cGUgPSBiYXNlQ2xhc3MucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xuXG5kZWNsYXJlIHZhciBSZWZsZWN0O1xuXG5leHBvcnQgdmFyIF9fZGVjb3JhdGUgPSBmdW5jdGlvbiAoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9lbnRyaWVzL2NodW5rcy9oZWxwZXJzLnRzIiwiZXhwb3J0IHZhciBzdXJ2ZXlMb2NhbGl6YXRpb24gPSB7XG4gICAgY3VycmVudExvY2FsZTogXCJcIixcbiAgICBkZWZhdWx0TG9jYWxlOiBcImVuXCIsXG4gICAgbG9jYWxlczoge30sXG4gICAgc3VwcG9ydGVkTG9jYWxlczogW10sXG4gICAgZ2V0U3RyaW5nOiBmdW5jdGlvbiAoc3RyTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHZhciBsb2MgPSB0aGlzLmN1cnJlbnRMb2NhbGUgPyB0aGlzLmxvY2FsZXNbdGhpcy5jdXJyZW50TG9jYWxlXSA6IHRoaXMubG9jYWxlc1t0aGlzLmRlZmF1bHRMb2NhbGVdO1xuICAgICAgICBpZiAoIWxvYyB8fCAhbG9jW3N0ck5hbWVdKSBsb2MgPSB0aGlzLmxvY2FsZXNbdGhpcy5kZWZhdWx0TG9jYWxlXTtcbiAgICAgICAgcmV0dXJuIGxvY1tzdHJOYW1lXTtcbiAgICB9LFxuICAgIGdldExvY2FsZXM6IGZ1bmN0aW9uICgpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgdmFyIHJlcyA9IFtdO1xuICAgICAgICByZXMucHVzaChcIlwiKTtcbiAgICAgICAgaWYodGhpcy5zdXBwb3J0ZWRMb2NhbGVzICYmIHRoaXMuc3VwcG9ydGVkTG9jYWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdXBwb3J0ZWRMb2NhbGVzLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKHRoaXMuc3VwcG9ydGVkTG9jYWxlc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5sb2NhbGVzKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXMuc29ydCgpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbn07XG5leHBvcnQgdmFyIHN1cnZleVN0cmluZ3MgPSB7XG4gICAgcGFnZVByZXZUZXh0OiBcIlByZXZpb3VzXCIsXG4gICAgcGFnZU5leHRUZXh0OiBcIk5leHRcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwiQ29tcGxldGVcIixcbiAgICBvdGhlckl0ZW1UZXh0OiBcIk90aGVyIChkZXNjcmliZSlcIixcbiAgICBwcm9ncmVzc1RleHQ6IFwiUGFnZSB7MH0gb2YgezF9XCIsXG4gICAgZW1wdHlTdXJ2ZXk6IFwiVGhlcmUgaXMgbm8gdmlzaWJsZSBwYWdlIG9yIHF1ZXN0aW9uIGluIHRoZSBzdXJ2ZXkuXCIsXG4gICAgY29tcGxldGluZ1N1cnZleTogXCJUaGFuayB5b3UgZm9yIGNvbXBsZXRpbmcgdGhlIHN1cnZleSFcIixcbiAgICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOiBcIk91ciByZWNvcmRzIHNob3cgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IGNvbXBsZXRlZCB0aGlzIHN1cnZleS5cIixcbiAgICBsb2FkaW5nU3VydmV5OiBcIlN1cnZleSBpcyBsb2FkaW5nLi4uXCIsXG4gICAgb3B0aW9uc0NhcHRpb246IFwiQ2hvb3NlLi4uXCIsXG4gICAgdmFsdWU6IFwidmFsdWVcIixcbiAgICByZXF1aXJlZEVycm9yOiBcIlBsZWFzZSBhbnN3ZXIgdGhlIHF1ZXN0aW9uLlwiLFxuICAgIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiUGxlYXNlIGFuc3dlciBxdWVzdGlvbnMgaW4gYWxsIHJvd3MuXCIsXG4gICAgbnVtZXJpY0Vycm9yOiBcIlRoZSB2YWx1ZSBzaG91bGQgYmUgbnVtZXJpYy5cIixcbiAgICB0ZXh0TWluTGVuZ3RoOiBcIlBsZWFzZSBlbnRlciBhdCBsZWFzdCB7MH0gY2hhcmFjdGVycy5cIixcbiAgICB0ZXh0TWF4TGVuZ3RoOiBcIlBsZWFzZSBlbnRlciBsZXNzIHRoYW4gezB9IGNoYXJhY3RlcnMuXCIsXG4gICAgdGV4dE1pbk1heExlbmd0aDogXCJQbGVhc2UgZW50ZXIgbW9yZSB0aGFuIHswfSBhbmQgbGVzcyB0aGFuIHsxfSBjaGFyYWN0ZXJzLlwiLFxuICAgIG1pblJvd0NvdW50RXJyb3I6IFwiUGxlYXNlIGZpbGwgaW4gYXQgbGVhc3QgezB9IHJvd3MuXCIsXG4gICAgbWluU2VsZWN0RXJyb3I6IFwiUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCB7MH0gdmFyaWFudHMuXCIsXG4gICAgbWF4U2VsZWN0RXJyb3I6IFwiUGxlYXNlIHNlbGVjdCBubyBtb3JlIHRoYW4gezB9IHZhcmlhbnRzLlwiLFxuICAgIG51bWVyaWNNaW5NYXg6IFwiVGhlICd7MH0nIHNob3VsZCBiZSBlcXVhbCBvciBtb3JlIHRoYW4gezF9IGFuZCBlcXVhbCBvciBsZXNzIHRoYW4gezJ9XCIsXG4gICAgbnVtZXJpY01pbjogXCJUaGUgJ3swfScgc2hvdWxkIGJlIGVxdWFsIG9yIG1vcmUgdGhhbiB7MX1cIixcbiAgICBudW1lcmljTWF4OiBcIlRoZSAnezB9JyBzaG91bGQgYmUgZXF1YWwgb3IgbGVzcyB0aGFuIHsxfVwiLFxuICAgIGludmFsaWRFbWFpbDogXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlLW1haWwgYWRkcmVzcy5cIixcbiAgICB1cmxSZXF1ZXN0RXJyb3I6IFwiVGhlIHJlcXVlc3QgcmV0dXJuZWQgZXJyb3IgJ3swfScuIHsxfVwiLFxuICAgIHVybEdldENob2ljZXNFcnJvcjogXCJUaGUgcmVxdWVzdCByZXR1cm5lZCBlbXB0eSBkYXRhIG9yIHRoZSAncGF0aCcgcHJvcGVydHkgaXMgaW5jb3JyZWN0XCIsXG4gICAgZXhjZWVkTWF4U2l6ZTogXCJUaGUgZmlsZSBzaXplIHNob3VsZCBub3QgZXhjZWVkIHswfS5cIixcbiAgICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiUGxlYXNlIGVudGVyIHRoZSBvdGhlciB2YWx1ZS5cIixcbiAgICB1cGxvYWRpbmdGaWxlOiBcIllvdXIgZmlsZSBpcyB1cGxvYWRpbmcuIFBsZWFzZSB3YWl0IHNldmVyYWwgc2Vjb25kcyBhbmQgdHJ5IGFnYWluLlwiLFxuICAgIGNvbmZpcm1EZWxldGU6IFwiRG8geW91IHdhbnQgdG8gZGVsZXRlIHRoZSByZWNvcmQ/XCIsXG4gICAga2V5RHVwbGljYXRpb25FcnJvcjogXCJUaGlzIHZhbHVlIHNob3VsZCBiZSB1bmlxdWUuXCIsXG4gICAgYWRkUm93OiBcIkFkZCByb3dcIixcbiAgICByZW1vdmVSb3c6IFwiUmVtb3ZlXCIsXG4gICAgYWRkUGFuZWw6IFwiQWRkIG5ld1wiLFxuICAgIHJlbW92ZVBhbmVsOiBcIlJlbW92ZVwiLFxuICAgIGNob2ljZXNfSXRlbTogXCJpdGVtXCIsXG4gICAgbWF0cml4X2NvbHVtbjogXCJDb2x1bW5cIixcbiAgICBtYXRyaXhfcm93OiBcIlJvd1wiLFxuICAgIHNhdmluZ0RhdGE6IFwiVGhlIHJlc3VsdHMgYXJlIHNhdmluZyBvbiB0aGUgc2VydmVyLi4uXCIsXG4gICAgc2F2aW5nRGF0YUVycm9yOiBcIkFuIGVycm9yIG9jY3VycmVkIGFuZCB3ZSBjb3VsZCBub3Qgc2F2ZSB0aGUgcmVzdWx0cy5cIixcbiAgICBzYXZpbmdEYXRhU3VjY2VzczogXCJUaGUgcmVzdWx0cyB3ZXJlIHNhdmVkIHN1Y2Nlc3NmdWxseSFcIixcbiAgICBzYXZlQWdhaW5CdXR0b246IFwiVHJ5IGFnYWluXCIsXG4gICAgdGltZXJNaW46IFwibWluXCIsXG4gICAgdGltZXJTZWM6IFwic2VjXCIsXG4gICAgdGltZXJTcGVudEFsbDogXCJZb3UgaGF2ZSBzcGVudCB7MH0gb24gdGhpcyBwYWdlIGFuZCB7MX0gaW4gdG90YWwuXCIsXG4gICAgdGltZXJTcGVudFBhZ2U6IFwiWW91IGhhdmUgc3BlbnQgezB9IG9uIHRoaXMgcGFnZS5cIixcbiAgICB0aW1lclNwZW50U3VydmV5OiBcIllvdSBoYXZlIHNwZW50IHswfSBpbiB0b3RhbC5cIixcbiAgICB0aW1lckxpbWl0QWxsOiBcIllvdSBoYXZlIHNwZW50IHswfSBvZiB7MX0gb24gdGhpcyBwYWdlIGFuZCB7Mn0gb2YgezN9IGluIHRvdGFsLlwiLFxuICAgIHRpbWVyTGltaXRQYWdlOiBcIllvdSBoYXZlIHNwZW50IHswfSBvZiB7MX0gb24gdGhpcyBwYWdlLlwiLFxuICAgIHRpbWVyTGltaXRTdXJ2ZXk6IFwiWW91IGhhdmUgc3BlbnQgezB9IG9mIHsxfSBpbiB0b3RhbC5cIlxufTtcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZW5cIl0gPSBzdXJ2ZXlTdHJpbmdzO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zdXJ2ZXlTdHJpbmdzLnRzIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wdHlwZXMnO1xuaW1wb3J0IHsgcmVuZGVyIGFzIHByZWFjdFJlbmRlciwgY2xvbmVFbGVtZW50IGFzIHByZWFjdENsb25lRWxlbWVudCwgaCwgQ29tcG9uZW50IGFzIFByZWFjdENvbXBvbmVudCwgb3B0aW9ucyB9IGZyb20gJ3ByZWFjdCc7XG5cbmNvbnN0IHZlcnNpb24gPSAnMTUuMS4wJzsgLy8gdHJpY2sgbGlicmFyaWVzIHRvIHRoaW5rIHdlIGFyZSByZWFjdFxuXG5jb25zdCBFTEVNRU5UUyA9ICdhIGFiYnIgYWRkcmVzcyBhcmVhIGFydGljbGUgYXNpZGUgYXVkaW8gYiBiYXNlIGJkaSBiZG8gYmlnIGJsb2NrcXVvdGUgYm9keSBiciBidXR0b24gY2FudmFzIGNhcHRpb24gY2l0ZSBjb2RlIGNvbCBjb2xncm91cCBkYXRhIGRhdGFsaXN0IGRkIGRlbCBkZXRhaWxzIGRmbiBkaWFsb2cgZGl2IGRsIGR0IGVtIGVtYmVkIGZpZWxkc2V0IGZpZ2NhcHRpb24gZmlndXJlIGZvb3RlciBmb3JtIGgxIGgyIGgzIGg0IGg1IGg2IGhlYWQgaGVhZGVyIGhncm91cCBociBodG1sIGkgaWZyYW1lIGltZyBpbnB1dCBpbnMga2JkIGtleWdlbiBsYWJlbCBsZWdlbmQgbGkgbGluayBtYWluIG1hcCBtYXJrIG1lbnUgbWVudWl0ZW0gbWV0YSBtZXRlciBuYXYgbm9zY3JpcHQgb2JqZWN0IG9sIG9wdGdyb3VwIG9wdGlvbiBvdXRwdXQgcCBwYXJhbSBwaWN0dXJlIHByZSBwcm9ncmVzcyBxIHJwIHJ0IHJ1YnkgcyBzYW1wIHNjcmlwdCBzZWN0aW9uIHNlbGVjdCBzbWFsbCBzb3VyY2Ugc3BhbiBzdHJvbmcgc3R5bGUgc3ViIHN1bW1hcnkgc3VwIHRhYmxlIHRib2R5IHRkIHRleHRhcmVhIHRmb290IHRoIHRoZWFkIHRpbWUgdGl0bGUgdHIgdHJhY2sgdSB1bCB2YXIgdmlkZW8gd2JyIGNpcmNsZSBjbGlwUGF0aCBkZWZzIGVsbGlwc2UgZyBpbWFnZSBsaW5lIGxpbmVhckdyYWRpZW50IG1hc2sgcGF0aCBwYXR0ZXJuIHBvbHlnb24gcG9seWxpbmUgcmFkaWFsR3JhZGllbnQgcmVjdCBzdG9wIHN2ZyB0ZXh0IHRzcGFuJy5zcGxpdCgnICcpO1xuXG5jb25zdCBSRUFDVF9FTEVNRU5UX1RZUEUgPSAodHlwZW9mIFN5bWJvbCE9PSd1bmRlZmluZWQnICYmIFN5bWJvbC5mb3IgJiYgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpKSB8fCAweGVhYzc7XG5cbmNvbnN0IENPTVBPTkVOVF9XUkFQUEVSX0tFWSA9IHR5cGVvZiBTeW1ib2whPT0ndW5kZWZpbmVkJyA/IFN5bWJvbC5mb3IoJ19fcHJlYWN0Q29tcGF0V3JhcHBlcicpIDogJ19fcHJlYWN0Q29tcGF0V3JhcHBlcic7XG5cbi8vIGRvbid0IGF1dG9iaW5kIHRoZXNlIG1ldGhvZHMgc2luY2UgdGhleSBhbHJlYWR5IGhhdmUgZ3VhcmFudGVlZCBjb250ZXh0LlxuY29uc3QgQVVUT0JJTkRfQkxBQ0tMSVNUID0ge1xuXHRjb25zdHJ1Y3RvcjogMSxcblx0cmVuZGVyOiAxLFxuXHRzaG91bGRDb21wb25lbnRVcGRhdGU6IDEsXG5cdGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6IDEsXG5cdGNvbXBvbmVudFdpbGxVcGRhdGU6IDEsXG5cdGNvbXBvbmVudERpZFVwZGF0ZTogMSxcblx0Y29tcG9uZW50V2lsbE1vdW50OiAxLFxuXHRjb21wb25lbnREaWRNb3VudDogMSxcblx0Y29tcG9uZW50V2lsbFVubW91bnQ6IDEsXG5cdGNvbXBvbmVudERpZFVubW91bnQ6IDFcbn07XG5cblxuY29uc3QgQ0FNRUxfUFJPUFMgPSAvXig/OmFjY2VudHxhbGlnbm1lbnR8YXJhYmljfGJhc2VsaW5lfGNhcHxjbGlwfGNvbG9yfGZpbGx8Zmxvb2R8Zm9udHxnbHlwaHxob3JpenxtYXJrZXJ8b3ZlcmxpbmV8cGFpbnR8c3RvcHxzdHJpa2V0aHJvdWdofHN0cm9rZXx0ZXh0fHVuZGVybGluZXx1bmljb2RlfHVuaXRzfHZ8dmVydHx3b3JkfHdyaXRpbmd8eClbQS1aXS87XG5cblxuY29uc3QgQllQQVNTX0hPT0sgPSB7fTtcblxuLypnbG9iYWwgcHJvY2VzcyovXG5jb25zdCBERVYgPSB0eXBlb2YgcHJvY2Vzcz09PSd1bmRlZmluZWQnIHx8ICFwcm9jZXNzLmVudiB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViE9PSdwcm9kdWN0aW9uJztcblxuLy8gYSBjb21wb25lbnQgdGhhdCByZW5kZXJzIG5vdGhpbmcuIFVzZWQgdG8gcmVwbGFjZSBjb21wb25lbnRzIGZvciB1bm1vdW50Q29tcG9uZW50QXROb2RlLlxuZnVuY3Rpb24gRW1wdHlDb21wb25lbnQoKSB7IHJldHVybiBudWxsOyB9XG5cblxuXG4vLyBtYWtlIHJlYWN0IHRoaW5rIHdlJ3JlIHJlYWN0LlxubGV0IFZOb2RlID0gaCgnYScsIG51bGwpLmNvbnN0cnVjdG9yO1xuVk5vZGUucHJvdG90eXBlLiQkdHlwZW9mID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xuVk5vZGUucHJvdG90eXBlLnByZWFjdENvbXBhdFVwZ3JhZGVkID0gZmFsc2U7XG5WTm9kZS5wcm90b3R5cGUucHJlYWN0Q29tcGF0Tm9ybWFsaXplZCA9IGZhbHNlO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVk5vZGUucHJvdG90eXBlLCAndHlwZScsIHtcblx0Z2V0KCkgeyByZXR1cm4gdGhpcy5ub2RlTmFtZTsgfSxcblx0c2V0KHYpIHsgdGhpcy5ub2RlTmFtZSA9IHY7IH0sXG5cdGNvbmZpZ3VyYWJsZTp0cnVlXG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZOb2RlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuXHRnZXQoKSB7IHJldHVybiB0aGlzLmF0dHJpYnV0ZXM7IH0sXG5cdHNldCh2KSB7IHRoaXMuYXR0cmlidXRlcyA9IHY7IH0sXG5cdGNvbmZpZ3VyYWJsZTp0cnVlXG59KTtcblxuXG5cbmxldCBvbGRFdmVudEhvb2sgPSBvcHRpb25zLmV2ZW50O1xub3B0aW9ucy5ldmVudCA9IGUgPT4ge1xuXHRpZiAob2xkRXZlbnRIb29rKSBlID0gb2xkRXZlbnRIb29rKGUpO1xuXHRlLnBlcnNpc3QgPSBPYmplY3Q7XG5cdGUubmF0aXZlRXZlbnQgPSBlO1xuXHRyZXR1cm4gZTtcbn07XG5cblxubGV0IG9sZFZub2RlSG9vayA9IG9wdGlvbnMudm5vZGU7XG5vcHRpb25zLnZub2RlID0gdm5vZGUgPT4ge1xuXHRpZiAoIXZub2RlLnByZWFjdENvbXBhdFVwZ3JhZGVkKSB7XG5cdFx0dm5vZGUucHJlYWN0Q29tcGF0VXBncmFkZWQgPSB0cnVlO1xuXG5cdFx0bGV0IHRhZyA9IHZub2RlLm5vZGVOYW1lLFxuXHRcdFx0YXR0cnMgPSB2bm9kZS5hdHRyaWJ1dGVzO1xuXG5cdFx0aWYgKCFhdHRycykgYXR0cnMgPSB2bm9kZS5hdHRyaWJ1dGVzID0ge307XG5cblx0XHRpZiAodHlwZW9mIHRhZz09PSdmdW5jdGlvbicpIHtcblx0XHRcdGlmICh0YWdbQ09NUE9ORU5UX1dSQVBQRVJfS0VZXT09PXRydWUgfHwgKHRhZy5wcm90b3R5cGUgJiYgJ2lzUmVhY3RDb21wb25lbnQnIGluIHRhZy5wcm90b3R5cGUpKSB7XG5cdFx0XHRcdGlmICh2bm9kZS5jaGlsZHJlbiAmJiAhdm5vZGUuY2hpbGRyZW4ubGVuZ3RoKSB2bm9kZS5jaGlsZHJlbiA9IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKHZub2RlLmNoaWxkcmVuKSBhdHRycy5jaGlsZHJlbiA9IHZub2RlLmNoaWxkcmVuO1xuXG5cdFx0XHRcdGlmICghdm5vZGUucHJlYWN0Q29tcGF0Tm9ybWFsaXplZCkge1xuXHRcdFx0XHRcdG5vcm1hbGl6ZVZOb2RlKHZub2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRoYW5kbGVDb21wb25lbnRWTm9kZSh2bm9kZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0aWYgKHZub2RlLmNoaWxkcmVuICYmICF2bm9kZS5jaGlsZHJlbi5sZW5ndGgpIHZub2RlLmNoaWxkcmVuID0gdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHZub2RlLmNoaWxkcmVuKSBhdHRycy5jaGlsZHJlbiA9IHZub2RlLmNoaWxkcmVuO1xuXG5cdFx0XHRpZiAoYXR0cnMuZGVmYXVsdFZhbHVlKSB7XG5cdFx0XHRcdGlmICghYXR0cnMudmFsdWUgJiYgYXR0cnMudmFsdWUhPT0wKSB7XG5cdFx0XHRcdFx0YXR0cnMudmFsdWUgPSBhdHRycy5kZWZhdWx0VmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGVsZXRlIGF0dHJzLmRlZmF1bHRWYWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0aGFuZGxlRWxlbWVudFZOb2RlKHZub2RlLCBhdHRycyk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKG9sZFZub2RlSG9vaykgb2xkVm5vZGVIb29rKHZub2RlKTtcbn07XG5cbmZ1bmN0aW9uIGhhbmRsZUNvbXBvbmVudFZOb2RlKHZub2RlKSB7XG5cdGxldCB0YWcgPSB2bm9kZS5ub2RlTmFtZSxcblx0XHRhID0gdm5vZGUuYXR0cmlidXRlcztcblxuXHR2bm9kZS5hdHRyaWJ1dGVzID0ge307XG5cdGlmICh0YWcuZGVmYXVsdFByb3BzKSBleHRlbmQodm5vZGUuYXR0cmlidXRlcywgdGFnLmRlZmF1bHRQcm9wcyk7XG5cdGlmIChhKSBleHRlbmQodm5vZGUuYXR0cmlidXRlcywgYSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUVsZW1lbnRWTm9kZSh2bm9kZSwgYSkge1xuXHRsZXQgc2hvdWxkU2FuaXRpemUsIGF0dHJzLCBpO1xuXHRpZiAoYSkge1xuXHRcdGZvciAoaSBpbiBhKSBpZiAoKHNob3VsZFNhbml0aXplID0gQ0FNRUxfUFJPUFMudGVzdChpKSkpIGJyZWFrO1xuXHRcdGlmIChzaG91bGRTYW5pdGl6ZSkge1xuXHRcdFx0YXR0cnMgPSB2bm9kZS5hdHRyaWJ1dGVzID0ge307XG5cdFx0XHRmb3IgKGkgaW4gYSkge1xuXHRcdFx0XHRpZiAoYS5oYXNPd25Qcm9wZXJ0eShpKSkge1xuXHRcdFx0XHRcdGF0dHJzWyBDQU1FTF9QUk9QUy50ZXN0KGkpID8gaS5yZXBsYWNlKC8oW0EtWjAtOV0pLywgJy0kMScpLnRvTG93ZXJDYXNlKCkgOiBpIF0gPSBhW2ldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cblxuXG4vLyBwcm94eSByZW5kZXIoKSBzaW5jZSBSZWFjdCByZXR1cm5zIGEgQ29tcG9uZW50IHJlZmVyZW5jZS5cbmZ1bmN0aW9uIHJlbmRlcih2bm9kZSwgcGFyZW50LCBjYWxsYmFjaykge1xuXHRsZXQgcHJldiA9IHBhcmVudCAmJiBwYXJlbnQuX3ByZWFjdENvbXBhdFJlbmRlcmVkO1xuXG5cdC8vIGlnbm9yZSBpbXBvc3NpYmxlIHByZXZpb3VzIHJlbmRlcnNcblx0aWYgKHByZXYgJiYgcHJldi5wYXJlbnROb2RlIT09cGFyZW50KSBwcmV2ID0gbnVsbDtcblxuXHQvLyBkZWZhdWx0IHRvIGZpcnN0IEVsZW1lbnQgY2hpbGRcblx0aWYgKCFwcmV2KSBwcmV2ID0gcGFyZW50LmNoaWxkcmVuWzBdO1xuXG5cdC8vIHJlbW92ZSB1bmFmZmVjdGVkIHNpYmxpbmdzXG5cdGZvciAobGV0IGk9cGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBpLS07ICkge1xuXHRcdGlmIChwYXJlbnQuY2hpbGROb2Rlc1tpXSE9PXByZXYpIHtcblx0XHRcdHBhcmVudC5yZW1vdmVDaGlsZChwYXJlbnQuY2hpbGROb2Rlc1tpXSk7XG5cdFx0fVxuXHR9XG5cblx0bGV0IG91dCA9IHByZWFjdFJlbmRlcih2bm9kZSwgcGFyZW50LCBwcmV2KTtcblx0aWYgKHBhcmVudCkgcGFyZW50Ll9wcmVhY3RDb21wYXRSZW5kZXJlZCA9IG91dDtcblx0aWYgKHR5cGVvZiBjYWxsYmFjaz09PSdmdW5jdGlvbicpIGNhbGxiYWNrKCk7XG5cdHJldHVybiBvdXQgJiYgb3V0Ll9jb21wb25lbnQgfHwgb3V0LmJhc2U7XG59XG5cblxuY2xhc3MgQ29udGV4dFByb3ZpZGVyIHtcblx0Z2V0Q2hpbGRDb250ZXh0KCkge1xuXHRcdHJldHVybiB0aGlzLnByb3BzLmNvbnRleHQ7XG5cdH1cblx0cmVuZGVyKHByb3BzKSB7XG5cdFx0cmV0dXJuIHByb3BzLmNoaWxkcmVuWzBdO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgdm5vZGUsIGNvbnRhaW5lciwgY2FsbGJhY2spIHtcblx0bGV0IHdyYXAgPSBoKENvbnRleHRQcm92aWRlciwgeyBjb250ZXh0OiBwYXJlbnRDb21wb25lbnQuY29udGV4dCB9LCB2bm9kZSk7XG5cdGxldCBjID0gcmVuZGVyKHdyYXAsIGNvbnRhaW5lcik7XG5cdGlmIChjYWxsYmFjaykgY2FsbGJhY2soYyk7XG5cdHJldHVybiBjO1xufVxuXG5cbmZ1bmN0aW9uIHVubW91bnRDb21wb25lbnRBdE5vZGUoY29udGFpbmVyKSB7XG5cdGxldCBleGlzdGluZyA9IGNvbnRhaW5lci5fcHJlYWN0Q29tcGF0UmVuZGVyZWQ7XG5cdGlmIChleGlzdGluZyAmJiBleGlzdGluZy5wYXJlbnROb2RlPT09Y29udGFpbmVyKSB7XG5cdFx0cHJlYWN0UmVuZGVyKGgoRW1wdHlDb21wb25lbnQpLCBjb250YWluZXIsIGV4aXN0aW5nKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cblxuXG5jb25zdCBBUlIgPSBbXTtcblxuLy8gVGhpcyBBUEkgaXMgY29tcGxldGVseSB1bm5lY2Vzc2FyeSBmb3IgUHJlYWN0LCBzbyBpdCdzIGJhc2ljYWxseSBwYXNzdGhyb3VnaC5cbmxldCBDaGlsZHJlbiA9IHtcblx0bWFwKGNoaWxkcmVuLCBmbiwgY3R4KSB7XG5cdFx0aWYgKGNoaWxkcmVuID09IG51bGwpIHJldHVybiBudWxsO1xuXHRcdGNoaWxkcmVuID0gQ2hpbGRyZW4udG9BcnJheShjaGlsZHJlbik7XG5cdFx0aWYgKGN0eCAmJiBjdHghPT1jaGlsZHJlbikgZm4gPSBmbi5iaW5kKGN0eCk7XG5cdFx0cmV0dXJuIGNoaWxkcmVuLm1hcChmbik7XG5cdH0sXG5cdGZvckVhY2goY2hpbGRyZW4sIGZuLCBjdHgpIHtcblx0XHRpZiAoY2hpbGRyZW4gPT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cdFx0Y2hpbGRyZW4gPSBDaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKTtcblx0XHRpZiAoY3R4ICYmIGN0eCE9PWNoaWxkcmVuKSBmbiA9IGZuLmJpbmQoY3R4KTtcblx0XHRjaGlsZHJlbi5mb3JFYWNoKGZuKTtcblx0fSxcblx0Y291bnQoY2hpbGRyZW4pIHtcblx0XHRyZXR1cm4gY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoIHx8IDA7XG5cdH0sXG5cdG9ubHkoY2hpbGRyZW4pIHtcblx0XHRjaGlsZHJlbiA9IENoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pO1xuXHRcdGlmIChjaGlsZHJlbi5sZW5ndGghPT0xKSB0aHJvdyBuZXcgRXJyb3IoJ0NoaWxkcmVuLm9ubHkoKSBleHBlY3RzIG9ubHkgb25lIGNoaWxkLicpO1xuXHRcdHJldHVybiBjaGlsZHJlblswXTtcblx0fSxcblx0dG9BcnJheShjaGlsZHJlbikge1xuXHRcdHJldHVybiBBcnJheS5pc0FycmF5ICYmIEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4gOiBBUlIuY29uY2F0KGNoaWxkcmVuKTtcblx0fVxufTtcblxuXG4vKiogVHJhY2sgY3VycmVudCByZW5kZXIoKSBjb21wb25lbnQgZm9yIHJlZiBhc3NpZ25tZW50ICovXG5sZXQgY3VycmVudENvbXBvbmVudDtcblxuXG5mdW5jdGlvbiBjcmVhdGVGYWN0b3J5KHR5cGUpIHtcblx0cmV0dXJuIGNyZWF0ZUVsZW1lbnQuYmluZChudWxsLCB0eXBlKTtcbn1cblxuXG5sZXQgRE9NID0ge307XG5mb3IgKGxldCBpPUVMRU1FTlRTLmxlbmd0aDsgaS0tOyApIHtcblx0RE9NW0VMRU1FTlRTW2ldXSA9IGNyZWF0ZUZhY3RvcnkoRUxFTUVOVFNbaV0pO1xufVxuXG5mdW5jdGlvbiB1cGdyYWRlVG9WTm9kZXMoYXJyLCBvZmZzZXQpIHtcblx0Zm9yIChsZXQgaT1vZmZzZXQgfHwgMDsgaTxhcnIubGVuZ3RoOyBpKyspIHtcblx0XHRsZXQgb2JqID0gYXJyW2ldO1xuXHRcdGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcblx0XHRcdHVwZ3JhZGVUb1ZOb2RlcyhvYmopO1xuXHRcdH1cblx0XHRlbHNlIGlmIChvYmogJiYgdHlwZW9mIG9iaj09PSdvYmplY3QnICYmICFpc1ZhbGlkRWxlbWVudChvYmopICYmICgob2JqLnByb3BzICYmIG9iai50eXBlKSB8fCAob2JqLmF0dHJpYnV0ZXMgJiYgb2JqLm5vZGVOYW1lKSB8fCBvYmouY2hpbGRyZW4pKSB7XG5cdFx0XHRhcnJbaV0gPSBjcmVhdGVFbGVtZW50KG9iai50eXBlIHx8IG9iai5ub2RlTmFtZSwgb2JqLnByb3BzIHx8IG9iai5hdHRyaWJ1dGVzLCBvYmouY2hpbGRyZW4pO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBpc1N0YXRlbGVzc0NvbXBvbmVudChjKSB7XG5cdHJldHVybiB0eXBlb2YgYz09PSdmdW5jdGlvbicgJiYgIShjLnByb3RvdHlwZSAmJiBjLnByb3RvdHlwZS5yZW5kZXIpO1xufVxuXG5cbi8vIHdyYXBzIHN0YXRlbGVzcyBmdW5jdGlvbmFsIGNvbXBvbmVudHMgaW4gYSBQcm9wVHlwZXMgdmFsaWRhdG9yXG5mdW5jdGlvbiB3cmFwU3RhdGVsZXNzQ29tcG9uZW50KFdyYXBwZWRDb21wb25lbnQpIHtcblx0cmV0dXJuIGNyZWF0ZUNsYXNzKHtcblx0XHRkaXNwbGF5TmFtZTogV3JhcHBlZENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBXcmFwcGVkQ29tcG9uZW50Lm5hbWUsXG5cdFx0cmVuZGVyKCkge1xuXHRcdFx0cmV0dXJuIFdyYXBwZWRDb21wb25lbnQodGhpcy5wcm9wcywgdGhpcy5jb250ZXh0KTtcblx0XHR9XG5cdH0pO1xufVxuXG5cbmZ1bmN0aW9uIHN0YXRlbGVzc0NvbXBvbmVudEhvb2soQ3Rvcikge1xuXHRsZXQgV3JhcHBlZCA9IEN0b3JbQ09NUE9ORU5UX1dSQVBQRVJfS0VZXTtcblx0aWYgKFdyYXBwZWQpIHJldHVybiBXcmFwcGVkPT09dHJ1ZSA/IEN0b3IgOiBXcmFwcGVkO1xuXG5cdFdyYXBwZWQgPSB3cmFwU3RhdGVsZXNzQ29tcG9uZW50KEN0b3IpO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcmFwcGVkLCBDT01QT05FTlRfV1JBUFBFUl9LRVksIHsgY29uZmlndXJhYmxlOnRydWUsIHZhbHVlOnRydWUgfSk7XG5cdFdyYXBwZWQuZGlzcGxheU5hbWUgPSBDdG9yLmRpc3BsYXlOYW1lO1xuXHRXcmFwcGVkLnByb3BUeXBlcyA9IEN0b3IucHJvcFR5cGVzO1xuXHRXcmFwcGVkLmRlZmF1bHRQcm9wcyA9IEN0b3IuZGVmYXVsdFByb3BzO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDdG9yLCBDT01QT05FTlRfV1JBUFBFUl9LRVksIHsgY29uZmlndXJhYmxlOnRydWUsIHZhbHVlOldyYXBwZWQgfSk7XG5cblx0cmV0dXJuIFdyYXBwZWQ7XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCguLi5hcmdzKSB7XG5cdHVwZ3JhZGVUb1ZOb2RlcyhhcmdzLCAyKTtcblx0cmV0dXJuIG5vcm1hbGl6ZVZOb2RlKGgoLi4uYXJncykpO1xufVxuXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZOb2RlKHZub2RlKSB7XG5cdHZub2RlLnByZWFjdENvbXBhdE5vcm1hbGl6ZWQgPSB0cnVlO1xuXG5cdGFwcGx5Q2xhc3NOYW1lKHZub2RlKTtcblxuXHRpZiAoaXNTdGF0ZWxlc3NDb21wb25lbnQodm5vZGUubm9kZU5hbWUpKSB7XG5cdFx0dm5vZGUubm9kZU5hbWUgPSBzdGF0ZWxlc3NDb21wb25lbnRIb29rKHZub2RlLm5vZGVOYW1lKTtcblx0fVxuXG5cdGxldCByZWYgPSB2bm9kZS5hdHRyaWJ1dGVzLnJlZixcblx0XHR0eXBlID0gcmVmICYmIHR5cGVvZiByZWY7XG5cdGlmIChjdXJyZW50Q29tcG9uZW50ICYmICh0eXBlPT09J3N0cmluZycgfHwgdHlwZT09PSdudW1iZXInKSkge1xuXHRcdHZub2RlLmF0dHJpYnV0ZXMucmVmID0gY3JlYXRlU3RyaW5nUmVmUHJveHkocmVmLCBjdXJyZW50Q29tcG9uZW50KTtcblx0fVxuXG5cdGFwcGx5RXZlbnROb3JtYWxpemF0aW9uKHZub2RlKTtcblxuXHRyZXR1cm4gdm5vZGU7XG59XG5cblxuZnVuY3Rpb24gY2xvbmVFbGVtZW50KGVsZW1lbnQsIHByb3BzLCAuLi5jaGlsZHJlbikge1xuXHRpZiAoIWlzVmFsaWRFbGVtZW50KGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudDtcblx0bGV0IGVsZW1lbnRQcm9wcyA9IGVsZW1lbnQuYXR0cmlidXRlcyB8fCBlbGVtZW50LnByb3BzO1xuXHRsZXQgbm9kZSA9IGgoXG5cdFx0ZWxlbWVudC5ub2RlTmFtZSB8fCBlbGVtZW50LnR5cGUsXG5cdFx0ZWxlbWVudFByb3BzLFxuXHRcdGVsZW1lbnQuY2hpbGRyZW4gfHwgZWxlbWVudFByb3BzICYmIGVsZW1lbnRQcm9wcy5jaGlsZHJlblxuXHQpO1xuXHRyZXR1cm4gbm9ybWFsaXplVk5vZGUocHJlYWN0Q2xvbmVFbGVtZW50KG5vZGUsIHByb3BzLCAuLi5jaGlsZHJlbikpO1xufVxuXG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KGVsZW1lbnQpIHtcblx0cmV0dXJuIGVsZW1lbnQgJiYgKChlbGVtZW50IGluc3RhbmNlb2YgVk5vZGUpIHx8IGVsZW1lbnQuJCR0eXBlb2Y9PT1SRUFDVF9FTEVNRU5UX1RZUEUpO1xufVxuXG5cbmZ1bmN0aW9uIGNyZWF0ZVN0cmluZ1JlZlByb3h5KG5hbWUsIGNvbXBvbmVudCkge1xuXHRyZXR1cm4gY29tcG9uZW50Ll9yZWZQcm94aWVzW25hbWVdIHx8IChjb21wb25lbnQuX3JlZlByb3hpZXNbbmFtZV0gPSByZXNvbHZlZCA9PiB7XG5cdFx0aWYgKGNvbXBvbmVudCAmJiBjb21wb25lbnQucmVmcykge1xuXHRcdFx0Y29tcG9uZW50LnJlZnNbbmFtZV0gPSByZXNvbHZlZDtcblx0XHRcdGlmIChyZXNvbHZlZD09PW51bGwpIHtcblx0XHRcdFx0ZGVsZXRlIGNvbXBvbmVudC5fcmVmUHJveGllc1tuYW1lXTtcblx0XHRcdFx0Y29tcG9uZW50ID0gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5cbmZ1bmN0aW9uIGFwcGx5RXZlbnROb3JtYWxpemF0aW9uKHsgbm9kZU5hbWUsIGF0dHJpYnV0ZXMgfSkge1xuXHRpZiAoIWF0dHJpYnV0ZXMgfHwgdHlwZW9mIG5vZGVOYW1lIT09J3N0cmluZycpIHJldHVybjtcblx0bGV0IHByb3BzID0ge307XG5cdGZvciAobGV0IGkgaW4gYXR0cmlidXRlcykge1xuXHRcdHByb3BzW2kudG9Mb3dlckNhc2UoKV0gPSBpO1xuXHR9XG5cdGlmIChwcm9wcy5vbmRvdWJsZWNsaWNrKSB7XG5cdFx0YXR0cmlidXRlcy5vbmRibGNsaWNrID0gYXR0cmlidXRlc1twcm9wcy5vbmRvdWJsZWNsaWNrXTtcblx0XHRkZWxldGUgYXR0cmlidXRlc1twcm9wcy5vbmRvdWJsZWNsaWNrXTtcblx0fVxuXHQvLyBmb3IgKnRleHR1YWwgaW5wdXRzKiAoaW5jbCB0ZXh0YXJlYSksIG5vcm1hbGl6ZSBgb25DaGFuZ2VgIC0+IGBvbklucHV0YDpcblx0aWYgKHByb3BzLm9uY2hhbmdlICYmIChub2RlTmFtZT09PSd0ZXh0YXJlYScgfHwgKG5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0naW5wdXQnICYmICEvXmZpbHxjaGV8cmFkL2kudGVzdChhdHRyaWJ1dGVzLnR5cGUpKSkpIHtcblx0XHRsZXQgbm9ybWFsaXplZCA9IHByb3BzLm9uaW5wdXQgfHwgJ29uaW5wdXQnO1xuXHRcdGlmICghYXR0cmlidXRlc1tub3JtYWxpemVkXSkge1xuXHRcdFx0YXR0cmlidXRlc1tub3JtYWxpemVkXSA9IG11bHRpaG9vayhbYXR0cmlidXRlc1tub3JtYWxpemVkXSwgYXR0cmlidXRlc1twcm9wcy5vbmNoYW5nZV1dKTtcblx0XHRcdGRlbGV0ZSBhdHRyaWJ1dGVzW3Byb3BzLm9uY2hhbmdlXTtcblx0XHR9XG5cdH1cbn1cblxuXG5mdW5jdGlvbiBhcHBseUNsYXNzTmFtZSh7IGF0dHJpYnV0ZXMgfSkge1xuXHRpZiAoIWF0dHJpYnV0ZXMpIHJldHVybjtcblx0bGV0IGNsID0gYXR0cmlidXRlcy5jbGFzc05hbWUgfHwgYXR0cmlidXRlcy5jbGFzcztcblx0aWYgKGNsKSBhdHRyaWJ1dGVzLmNsYXNzTmFtZSA9IGNsO1xufVxuXG5cbmZ1bmN0aW9uIGV4dGVuZChiYXNlLCBwcm9wcykge1xuXHRmb3IgKGxldCBrZXkgaW4gcHJvcHMpIHtcblx0XHRpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0YmFzZVtrZXldID0gcHJvcHNba2V5XTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGJhc2U7XG59XG5cblxuZnVuY3Rpb24gc2hhbGxvd0RpZmZlcnMoYSwgYikge1xuXHRmb3IgKGxldCBpIGluIGEpIGlmICghKGkgaW4gYikpIHJldHVybiB0cnVlO1xuXHRmb3IgKGxldCBpIGluIGIpIGlmIChhW2ldIT09YltpXSkgcmV0dXJuIHRydWU7XG5cdHJldHVybiBmYWxzZTtcbn1cblxuXG5mdW5jdGlvbiBmaW5kRE9NTm9kZShjb21wb25lbnQpIHtcblx0cmV0dXJuIGNvbXBvbmVudCAmJiBjb21wb25lbnQuYmFzZSB8fCBjb21wb25lbnQ7XG59XG5cblxuZnVuY3Rpb24gRigpe31cblxuZnVuY3Rpb24gY3JlYXRlQ2xhc3Mob2JqKSB7XG5cdGZ1bmN0aW9uIGNsKHByb3BzLCBjb250ZXh0KSB7XG5cdFx0YmluZEFsbCh0aGlzKTtcblx0XHRDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCwgQllQQVNTX0hPT0spO1xuXHRcdG5ld0NvbXBvbmVudEhvb2suY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCk7XG5cdH1cblxuXHRvYmogPSBleHRlbmQoeyBjb25zdHJ1Y3RvcjogY2wgfSwgb2JqKTtcblxuXHQvLyBXZSBuZWVkIHRvIGFwcGx5IG1peGlucyBoZXJlIHNvIHRoYXQgZ2V0RGVmYXVsdFByb3BzIGlzIGNvcnJlY3RseSBtaXhlZFxuXHRpZiAob2JqLm1peGlucykge1xuXHRcdGFwcGx5TWl4aW5zKG9iaiwgY29sbGF0ZU1peGlucyhvYmoubWl4aW5zKSk7XG5cdH1cblx0aWYgKG9iai5zdGF0aWNzKSB7XG5cdFx0ZXh0ZW5kKGNsLCBvYmouc3RhdGljcyk7XG5cdH1cblx0aWYgKG9iai5wcm9wVHlwZXMpIHtcblx0XHRjbC5wcm9wVHlwZXMgPSBvYmoucHJvcFR5cGVzO1xuXHR9XG5cdGlmIChvYmouZGVmYXVsdFByb3BzKSB7XG5cdFx0Y2wuZGVmYXVsdFByb3BzID0gb2JqLmRlZmF1bHRQcm9wcztcblx0fVxuXHRpZiAob2JqLmdldERlZmF1bHRQcm9wcykge1xuXHRcdGNsLmRlZmF1bHRQcm9wcyA9IG9iai5nZXREZWZhdWx0UHJvcHMoKTtcblx0fVxuXG5cdEYucHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcblx0Y2wucHJvdG90eXBlID0gZXh0ZW5kKG5ldyBGKCksIG9iaik7XG5cblx0Y2wuZGlzcGxheU5hbWUgPSBvYmouZGlzcGxheU5hbWUgfHwgJ0NvbXBvbmVudCc7XG5cblx0cmV0dXJuIGNsO1xufVxuXG5cbi8vIEZsYXR0ZW4gYW4gQXJyYXkgb2YgbWl4aW5zIHRvIGEgbWFwIG9mIG1ldGhvZCBuYW1lIHRvIG1peGluIGltcGxlbWVudGF0aW9uc1xuZnVuY3Rpb24gY29sbGF0ZU1peGlucyhtaXhpbnMpIHtcblx0bGV0IGtleWVkID0ge307XG5cdGZvciAobGV0IGk9MDsgaTxtaXhpbnMubGVuZ3RoOyBpKyspIHtcblx0XHRsZXQgbWl4aW4gPSBtaXhpbnNbaV07XG5cdFx0Zm9yIChsZXQga2V5IGluIG1peGluKSB7XG5cdFx0XHRpZiAobWl4aW4uaGFzT3duUHJvcGVydHkoa2V5KSAmJiB0eXBlb2YgbWl4aW5ba2V5XT09PSdmdW5jdGlvbicpIHtcblx0XHRcdFx0KGtleWVkW2tleV0gfHwgKGtleWVkW2tleV09W10pKS5wdXNoKG1peGluW2tleV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4ga2V5ZWQ7XG59XG5cblxuLy8gYXBwbHkgYSBtYXBwaW5nIG9mIEFycmF5cyBvZiBtaXhpbiBtZXRob2RzIHRvIGEgY29tcG9uZW50IHByb3RvdHlwZVxuZnVuY3Rpb24gYXBwbHlNaXhpbnMocHJvdG8sIG1peGlucykge1xuXHRmb3IgKGxldCBrZXkgaW4gbWl4aW5zKSBpZiAobWl4aW5zLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRwcm90b1trZXldID0gbXVsdGlob29rKFxuXHRcdFx0bWl4aW5zW2tleV0uY29uY2F0KHByb3RvW2tleV0gfHwgQVJSKSxcblx0XHRcdGtleT09PSdnZXREZWZhdWx0UHJvcHMnIHx8IGtleT09PSdnZXRJbml0aWFsU3RhdGUnIHx8IGtleT09PSdnZXRDaGlsZENvbnRleHQnXG5cdFx0KTtcblx0fVxufVxuXG5cbmZ1bmN0aW9uIGJpbmRBbGwoY3R4KSB7XG5cdGZvciAobGV0IGkgaW4gY3R4KSB7XG5cdFx0bGV0IHYgPSBjdHhbaV07XG5cdFx0aWYgKHR5cGVvZiB2PT09J2Z1bmN0aW9uJyAmJiAhdi5fX2JvdW5kICYmICFBVVRPQklORF9CTEFDS0xJU1QuaGFzT3duUHJvcGVydHkoaSkpIHtcblx0XHRcdChjdHhbaV0gPSB2LmJpbmQoY3R4KSkuX19ib3VuZCA9IHRydWU7XG5cdFx0fVxuXHR9XG59XG5cblxuZnVuY3Rpb24gY2FsbE1ldGhvZChjdHgsIG0sIGFyZ3MpIHtcblx0aWYgKHR5cGVvZiBtPT09J3N0cmluZycpIHtcblx0XHRtID0gY3R4LmNvbnN0cnVjdG9yLnByb3RvdHlwZVttXTtcblx0fVxuXHRpZiAodHlwZW9mIG09PT0nZnVuY3Rpb24nKSB7XG5cdFx0cmV0dXJuIG0uYXBwbHkoY3R4LCBhcmdzKTtcblx0fVxufVxuXG5mdW5jdGlvbiBtdWx0aWhvb2soaG9va3MsIHNraXBEdXBsaWNhdGVzKSB7XG5cdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRsZXQgcmV0O1xuXHRcdGZvciAobGV0IGk9MDsgaTxob29rcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0bGV0IHIgPSBjYWxsTWV0aG9kKHRoaXMsIGhvb2tzW2ldLCBhcmd1bWVudHMpO1xuXG5cdFx0XHRpZiAoc2tpcER1cGxpY2F0ZXMgJiYgciE9bnVsbCkge1xuXHRcdFx0XHRpZiAoIXJldCkgcmV0ID0ge307XG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiByKSBpZiAoci5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHRcdFx0cmV0W2tleV0gPSByW2tleV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKHR5cGVvZiByIT09J3VuZGVmaW5lZCcpIHJldCA9IHI7XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG59XG5cblxuZnVuY3Rpb24gbmV3Q29tcG9uZW50SG9vayhwcm9wcywgY29udGV4dCkge1xuXHRwcm9wc0hvb2suY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCk7XG5cdHRoaXMuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IG11bHRpaG9vayhbcHJvcHNIb29rLCB0aGlzLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgfHwgJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnXSk7XG5cdHRoaXMucmVuZGVyID0gbXVsdGlob29rKFtwcm9wc0hvb2ssIGJlZm9yZVJlbmRlciwgdGhpcy5yZW5kZXIgfHwgJ3JlbmRlcicsIGFmdGVyUmVuZGVyXSk7XG59XG5cblxuZnVuY3Rpb24gcHJvcHNIb29rKHByb3BzLCBjb250ZXh0KSB7XG5cdGlmICghcHJvcHMpIHJldHVybjtcblxuXHQvLyBSZWFjdCBhbm5veWluZ2x5IHNwZWNpYWwtY2FzZXMgc2luZ2xlIGNoaWxkcmVuLCBhbmQgc29tZSByZWFjdCBjb21wb25lbnRzIGFyZSByaWRpY3Vsb3VzbHkgc3RyaWN0IGFib3V0IHRoaXMuXG5cdGxldCBjID0gcHJvcHMuY2hpbGRyZW47XG5cdGlmIChjICYmIEFycmF5LmlzQXJyYXkoYykgJiYgYy5sZW5ndGg9PT0xKSB7XG5cdFx0cHJvcHMuY2hpbGRyZW4gPSBjWzBdO1xuXG5cdFx0Ly8gYnV0IGl0cyB0b3RhbGx5IHN0aWxsIGdvaW5nIHRvIGJlIGFuIEFycmF5LlxuXHRcdGlmIChwcm9wcy5jaGlsZHJlbiAmJiB0eXBlb2YgcHJvcHMuY2hpbGRyZW49PT0nb2JqZWN0Jykge1xuXHRcdFx0cHJvcHMuY2hpbGRyZW4ubGVuZ3RoID0gMTtcblx0XHRcdHByb3BzLmNoaWxkcmVuWzBdID0gcHJvcHMuY2hpbGRyZW47XG5cdFx0fVxuXHR9XG5cblx0Ly8gYWRkIHByb3B0eXBlIGNoZWNraW5nXG5cdGlmIChERVYpIHtcblx0XHRsZXQgY3RvciA9IHR5cGVvZiB0aGlzPT09J2Z1bmN0aW9uJyA/IHRoaXMgOiB0aGlzLmNvbnN0cnVjdG9yLFxuXHRcdFx0cHJvcFR5cGVzID0gdGhpcy5wcm9wVHlwZXMgfHwgY3Rvci5wcm9wVHlwZXM7XG5cdFx0aWYgKHByb3BUeXBlcykge1xuXHRcdFx0Zm9yIChsZXQgcHJvcCBpbiBwcm9wVHlwZXMpIHtcblx0XHRcdFx0aWYgKHByb3BUeXBlcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiB0eXBlb2YgcHJvcFR5cGVzW3Byb3BdPT09J2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdGNvbnN0IGRpc3BsYXlOYW1lID0gdGhpcy5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWU7XG5cdFx0XHRcdFx0bGV0IGVyciA9IHByb3BUeXBlc1twcm9wXShwcm9wcywgcHJvcCwgZGlzcGxheU5hbWUsICdwcm9wJyk7XG5cdFx0XHRcdFx0aWYgKGVycikgY29uc29sZS5lcnJvcihuZXcgRXJyb3IoZXJyLm1lc3NhZ2UgfHwgZXJyKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuXG5mdW5jdGlvbiBiZWZvcmVSZW5kZXIocHJvcHMpIHtcblx0Y3VycmVudENvbXBvbmVudCA9IHRoaXM7XG59XG5cbmZ1bmN0aW9uIGFmdGVyUmVuZGVyKCkge1xuXHRpZiAoY3VycmVudENvbXBvbmVudD09PXRoaXMpIHtcblx0XHRjdXJyZW50Q29tcG9uZW50ID0gbnVsbDtcblx0fVxufVxuXG5cblxuZnVuY3Rpb24gQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCBvcHRzKSB7XG5cdFByZWFjdENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KTtcblx0dGhpcy5zdGF0ZSA9IHRoaXMuZ2V0SW5pdGlhbFN0YXRlID8gdGhpcy5nZXRJbml0aWFsU3RhdGUoKSA6IHt9O1xuXHR0aGlzLnJlZnMgPSB7fTtcblx0dGhpcy5fcmVmUHJveGllcyA9IHt9O1xuXHRpZiAob3B0cyE9PUJZUEFTU19IT09LKSB7XG5cdFx0bmV3Q29tcG9uZW50SG9vay5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KTtcblx0fVxufVxuZXh0ZW5kKENvbXBvbmVudC5wcm90b3R5cGUgPSBuZXcgUHJlYWN0Q29tcG9uZW50KCksIHtcblx0Y29uc3RydWN0b3I6IENvbXBvbmVudCxcblxuXHRpc1JlYWN0Q29tcG9uZW50OiB7fSxcblxuXHRyZXBsYWNlU3RhdGUoc3RhdGUsIGNhbGxiYWNrKSB7XG5cdFx0dGhpcy5zZXRTdGF0ZShzdGF0ZSwgY2FsbGJhY2spO1xuXHRcdGZvciAobGV0IGkgaW4gdGhpcy5zdGF0ZSkge1xuXHRcdFx0aWYgKCEoaSBpbiBzdGF0ZSkpIHtcblx0XHRcdFx0ZGVsZXRlIHRoaXMuc3RhdGVbaV07XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdGdldERPTU5vZGUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZTtcblx0fSxcblxuXHRpc01vdW50ZWQoKSB7XG5cdFx0cmV0dXJuICEhdGhpcy5iYXNlO1xuXHR9XG59KTtcblxuXG5cbmZ1bmN0aW9uIFB1cmVDb21wb25lbnQocHJvcHMsIGNvbnRleHQpIHtcblx0Q29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpO1xufVxuRi5wcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuUHVyZUNvbXBvbmVudC5wcm90b3R5cGUgPSBuZXcgRigpO1xuUHVyZUNvbXBvbmVudC5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24ocHJvcHMsIHN0YXRlKSB7XG5cdHJldHVybiBzaGFsbG93RGlmZmVycyh0aGlzLnByb3BzLCBwcm9wcykgfHwgc2hhbGxvd0RpZmZlcnModGhpcy5zdGF0ZSwgc3RhdGUpO1xufTtcblxuXG5cbmV4cG9ydCB7XG5cdHZlcnNpb24sXG5cdERPTSxcblx0UHJvcFR5cGVzLFxuXHRDaGlsZHJlbixcblx0cmVuZGVyLFxuXHRjcmVhdGVDbGFzcyxcblx0Y3JlYXRlRmFjdG9yeSxcblx0Y3JlYXRlRWxlbWVudCxcblx0Y2xvbmVFbGVtZW50LFxuXHRpc1ZhbGlkRWxlbWVudCxcblx0ZmluZERPTU5vZGUsXG5cdHVubW91bnRDb21wb25lbnRBdE5vZGUsXG5cdENvbXBvbmVudCxcblx0UHVyZUNvbXBvbmVudCxcblx0cmVuZGVyU3VidHJlZUludG9Db250YWluZXIgYXMgdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXJcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHtcblx0dmVyc2lvbixcblx0RE9NLFxuXHRQcm9wVHlwZXMsXG5cdENoaWxkcmVuLFxuXHRyZW5kZXIsXG5cdGNyZWF0ZUNsYXNzLFxuXHRjcmVhdGVGYWN0b3J5LFxuXHRjcmVhdGVFbGVtZW50LFxuXHRjbG9uZUVsZW1lbnQsXG5cdGlzVmFsaWRFbGVtZW50LFxuXHRmaW5kRE9NTm9kZSxcblx0dW5tb3VudENvbXBvbmVudEF0Tm9kZSxcblx0Q29tcG9uZW50LFxuXHRQdXJlQ29tcG9uZW50LFxuXHR1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjogcmVuZGVyU3VidHJlZUludG9Db250YWluZXJcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3ByZWFjdC1jb21wYXQvc3JjL2luZGV4LmpzIiwiaW1wb3J0IHtIZWxwZXJzLCBIYXNoVGFibGV9IGZyb20gXCIuL2hlbHBlcnNcIlxuXG5leHBvcnQgY2xhc3MgSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICBwcml2YXRlIHN0YXRpYyBtZXJnYWJsZVZhbHVlcyA9IFtcInR5cGVWYWx1ZVwiLCBcImNob2ljZXNWYWx1ZVwiLCBcInJlYWRPbmx5VmFsdWVcIiwgXCJ2aXNpYmxlVmFsdWVcIiwgXCJpc0xvY2FsaXphYmxlVmFsdWVcIiwgXCJjbGFzc05hbWVcIiwgXG4gICAgICAgIFwiYWx0ZXJuYXRpdmVOYW1lXCIsIFwiY2xhc3NOYW1lUGFydFwiLCBcImJhc2VDbGFzc05hbWVcIiwgXCJkZWZhdWx0VmFsdWVcIiwgXCJzZXJpYWxpemF0aW9uUHJvcGVydHlcIiwgXCJvbkdldFZhbHVlXCIsIFwib25TZXRWYWx1ZVwiXTtcbiAgICBwcml2YXRlIHR5cGVWYWx1ZTogc3RyaW5nID0gbnVsbDtcbiAgICBwcml2YXRlIGNob2ljZXNWYWx1ZTogQXJyYXk8YW55PiA9IG51bGw7XG4gICAgcHJpdmF0ZSBpc1JlcXVpcmVkVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIHJlYWRPbmx5VmFsdWUgPSBudWxsO1xuICAgIHByaXZhdGUgdmlzaWJsZVZhbHVlID0gbnVsbDtcbiAgICBwcml2YXRlIGlzTG9jYWxpemFibGVWYWx1ZSA9IG51bGw7XG4gICAgcHJpdmF0ZSBjaG9pY2VzZnVuYzogKCkgPT4gQXJyYXk8YW55PiA9IG51bGw7XG4gICAgcHVibGljIGNsYXNzTmFtZTogc3RyaW5nID0gbnVsbDtcbiAgICBwdWJsaWMgYWx0ZXJuYXRpdmVOYW1lOiBzdHJpbmcgPSBudWxsO1xuICAgIHB1YmxpYyBjbGFzc05hbWVQYXJ0OiBzdHJpbmcgPSBudWxsO1xuICAgIHB1YmxpYyBiYXNlQ2xhc3NOYW1lOiBzdHJpbmcgPSBudWxsO1xuICAgIHB1YmxpYyBkZWZhdWx0VmFsdWU6IGFueSA9IG51bGw7XG4gICAgcHVibGljIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogc3RyaW5nID0gbnVsbDtcbiAgICBwdWJsaWMgb25HZXRWYWx1ZTogKG9iajogYW55KSA9PiBhbnkgPSBudWxsO1xuICAgIHB1YmxpYyBvblNldFZhbHVlOiAob2JqOiBhbnksIHZhbHVlOiBhbnksIGpzb25Db252OiBKc29uT2JqZWN0KSA9PiBhbnkgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgaXNSZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuaXNSZXF1aXJlZFZhbHVlID0gaXNSZXF1aXJlZDtcbiAgICB9XG4gICAgcHVibGljIGdldCB0eXBlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnR5cGVWYWx1ZSA/IHRoaXMudHlwZVZhbHVlIDogXCJzdHJpbmdcIjsgfVxuICAgIHB1YmxpYyBzZXQgdHlwZSh2YWx1ZTogc3RyaW5nKSB7IHRoaXMudHlwZVZhbHVlID0gdmFsdWU7IH1cbiAgICBwdWJsaWMgZ2V0IGlzUmVxdWlyZWQoKSB7IHJldHVybiB0aGlzLmlzUmVxdWlyZWRWYWx1ZTsgfVxuICAgIHB1YmxpYyBnZXQgaGFzVG9Vc2VHZXRWYWx1ZSgpIHsgcmV0dXJuIHRoaXMub25HZXRWYWx1ZSB8fCB0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eTsgfVxuICAgIHB1YmxpYyBpc0RlZmF1bHRWYWx1ZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFZhbHVlKSkgPyAodGhpcy5kZWZhdWx0VmFsdWUgPT0gdmFsdWUpIDogISh2YWx1ZSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRWYWx1ZShvYmo6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh0aGlzLm9uR2V0VmFsdWUpIHJldHVybiB0aGlzLm9uR2V0VmFsdWUob2JqKTtcbiAgICAgICAgaWYodGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHkpIHJldHVybiBvYmpbdGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHldLmdldEpzb24oKTtcbiAgICAgICAgcmV0dXJuIG9ialt0aGlzLm5hbWVdO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0UHJvcGVydHlWYWx1ZShvYmo6IGFueSk6IGFueSB7XG4gICAgICAgIGlmKHRoaXMuaXNMb2NhbGl6YWJsZSkgcmV0dXJuIG9ialt0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV0udGV4dDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUob2JqKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBoYXNUb1VzZVNldFZhbHVlKCkgeyByZXR1cm4gdGhpcy5vblNldFZhbHVlIHx8IHRoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5OyB9XG4gICAgcHVibGljIHNldFZhbHVlKG9iajogYW55LCB2YWx1ZTogYW55LCBqc29uQ29udjogSnNvbk9iamVjdCkge1xuICAgICAgICBpZiAodGhpcy5vblNldFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLm9uU2V0VmFsdWUob2JqLCB2YWx1ZSwganNvbkNvbnYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYodGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHkpXG4gICAgICAgICAgICAgICAgb2JqW3RoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5XS5zZXRKc29uKHZhbHVlKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnR5cGUgPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy50eXBlID09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9ialt0aGlzLm5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGdldE9ialR5cGUob2JqVHlwZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy5jbGFzc05hbWVQYXJ0KSByZXR1cm4gb2JqVHlwZTtcbiAgICAgICAgcmV0dXJuIG9ialR5cGUucmVwbGFjZSh0aGlzLmNsYXNzTmFtZVBhcnQsIFwiXCIpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0Q2xhc3NOYW1lKGNsYXNzTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmNsYXNzTmFtZVBhcnQgJiYgY2xhc3NOYW1lLmluZGV4T2YodGhpcy5jbGFzc05hbWVQYXJ0KSA8IDApID8gY2xhc3NOYW1lICsgdGhpcy5jbGFzc05hbWVQYXJ0IDogY2xhc3NOYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGNob2ljZXMoKTogQXJyYXk8YW55PiB7XG4gICAgICAgIGlmICh0aGlzLmNob2ljZXNWYWx1ZSAhPSBudWxsKSByZXR1cm4gdGhpcy5jaG9pY2VzVmFsdWU7XG4gICAgICAgIGlmICh0aGlzLmNob2ljZXNmdW5jICE9IG51bGwpIHJldHVybiB0aGlzLmNob2ljZXNmdW5jKCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0Q2hvaWNlcyh2YWx1ZTogQXJyYXk8YW55PiwgdmFsdWVGdW5jOiAoKSA9PiBBcnJheTxhbnk+KSB7XG4gICAgICAgIHRoaXMuY2hvaWNlc1ZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuY2hvaWNlc2Z1bmMgPSB2YWx1ZUZ1bmM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgcmVhZE9ubHkoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnJlYWRPbmx5VmFsdWUgIT0gbnVsbCA/IHRoaXMucmVhZE9ubHlWYWx1ZSA6ICBmYWxzZTsgfVxuICAgIHB1YmxpYyBzZXQgcmVhZE9ubHkodmFsOiBib29sZWFuKSB7IHRoaXMucmVhZE9ubHlWYWx1ZSA9IHZhbDsgfVxuICAgIHB1YmxpYyBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMudmlzaWJsZVZhbHVlICE9IG51bGwgPyB0aGlzLnZpc2libGVWYWx1ZSA6IHRydWU7IH1cbiAgICBwdWJsaWMgc2V0IHZpc2libGUodmFsOiBib29sZWFuKSB7IHRoaXMudmlzaWJsZVZhbHVlID0gdmFsOyB9XG4gICAgcHVibGljIGdldCBpc0xvY2FsaXphYmxlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5pc0xvY2FsaXphYmxlVmFsdWUgIT0gbnVsbCA/IHRoaXMuaXNMb2NhbGl6YWJsZVZhbHVlIDogZmFsc2U7IH1cbiAgICBwdWJsaWMgc2V0IGlzTG9jYWxpemFibGUodmFsOiBib29sZWFuKSB7IHRoaXMuaXNMb2NhbGl6YWJsZVZhbHVlID0gdmFsOyB9XG4gICAgcHVibGljIG1lcmdlV2l0aChwcm9wOiBKc29uT2JqZWN0UHJvcGVydHkpIHtcbiAgICAgICAgdmFyIHZhbHVlc05hbWVzID0gSnNvbk9iamVjdFByb3BlcnR5Lm1lcmdhYmxlVmFsdWVzO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdmFsdWVzTmFtZXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICB0aGlzLm1lcmdlVmFsdWUocHJvcCwgdmFsdWVzTmFtZXNbaV0pO1xuICAgICAgICB9XG4gICAgIH1cbiAgICAgcHJpdmF0ZSBtZXJnZVZhbHVlKHByb3A6IEpzb25PYmplY3RQcm9wZXJ0eSwgdmFsdWVOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgIGlmKHRoaXNbdmFsdWVOYW1lXSA9PSBudWxsICYmIHByb3BbdmFsdWVOYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgdGhpc1t2YWx1ZU5hbWVdID0gcHJvcFt2YWx1ZU5hbWVdO1xuICAgICAgICAgfVxuICAgICB9XG59XG5leHBvcnQgY2xhc3MgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ge1xuICAgIHByaXZhdGUgc3RhdGljIHByb3BlcnRpZXMgPSB7fTtcbiAgICBwcml2YXRlIHN0YXRpYyBwYXJlbnRDbGFzc2VzID0ge307XG4gICAgcHVibGljIHN0YXRpYyBhZGRQcm9wZXJ0eShjbGFzc05hbWU6IHN0cmluZywgcHJvcGVydHk6IGFueSkge1xuICAgICAgICB2YXIgcHJvcHMgPSBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5wcm9wZXJ0aWVzO1xuICAgICAgICBpZighcHJvcHNbY2xhc3NOYW1lXSkge1xuICAgICAgICAgICAgcHJvcHNbY2xhc3NOYW1lXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHByb3BzW2NsYXNzTmFtZV0ucHVzaChwcm9wZXJ0eSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlUHJvcGVydHkoY2xhc3NOYW1lOiBzdHJpbmcsIHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnByb3BlcnRpZXM7XG4gICAgICAgIGlmKCFwcm9wc1tjbGFzc05hbWVdKSByZXR1cm47XG4gICAgICAgIHZhciBwcm9wZXJ0aWVzID0gIHByb3BzW2NsYXNzTmFtZV07XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgaWYocHJvcGVydGllc1tpXS5uYW1lID09IHByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgIHByb3BzW2NsYXNzTmFtZV0uc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYWRkQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcsIHBhcmVudENsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnBhcmVudENsYXNzZXNbY2xhc3NOYW1lXSA9IHBhcmVudENsYXNzTmFtZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRQcm9wZXJ0aWVzKGNsYXNzTmFtZTogc3RyaW5nKSA6IEFycmF5PGFueT4ge1xuICAgICAgICB2YXIgcmVzID0gW107XG4gICAgICAgIHZhciBwcm9wcyA9IEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnByb3BlcnRpZXM7XG4gICAgICAgIHdoaWxlKGNsYXNzTmFtZSkge1xuICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSAgcHJvcHNbY2xhc3NOYW1lXTtcbiAgICAgICAgICAgIGlmKHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2gocHJvcGVydGllc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xhc3NOYW1lID0gQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucGFyZW50Q2xhc3Nlc1tjbGFzc05hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlUHJvcGVydGllcyhvYmo6IGFueSkge1xuICAgICAgICBpZighb2JqIHx8ICFvYmouZ2V0VHlwZSkgcmV0dXJuO1xuICAgICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcmVhdGVQcm9wZXJ0aWVzQ29yZShvYmosIG9iai5nZXRUeXBlKCkpO1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzQ29yZShvYmo6IGFueSwgY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdmFyIHByb3BzID0gQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucHJvcGVydGllcztcbiAgICAgICAgaWYocHJvcHNbY2xhc3NOYW1lXSkge1xuICAgICAgICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uY3JlYXRlUHJvcGVydGllc0luT2JqKG9iaiwgcHJvcHNbY2xhc3NOYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcmVudENsYXNzID0gQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucGFyZW50Q2xhc3Nlc1tjbGFzc05hbWVdO1xuICAgICAgICBpZihwYXJlbnRDbGFzcykge1xuICAgICAgICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uY3JlYXRlUHJvcGVydGllc0NvcmUob2JqLCBwYXJlbnRDbGFzcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlUHJvcGVydGllc0luT2JqKG9iajogYW55LCBwcm9wZXJ0aWVzOiBhbnlbXSkge1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnR5SW5PYmoob2JqLCBwcm9wZXJ0aWVzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eUluT2JqKG9iajogYW55LCBwcm9wOiBhbnkpIHtcbiAgICAgICAgaWYob2JqW3Byb3AubmFtZV0gfHwgb2JqLmhhc093blByb3BlcnR5KHByb3AubmFtZSkpIHJldHVybjtcbiAgICAgICAgdmFyIGRlc2MgPSB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gb2JqLmdldFByb3BlcnR5VmFsdWUocHJvcC5uYW1lLCBwcm9wLmRlZmF1bHRWYWx1ZSk7IH0sIFxuICAgICAgICAgICAgc2V0IDogZnVuY3Rpb24odjogYW55KSB7IG9iai5zZXRQcm9wZXJ0eVZhbHVlKHByb3AubmFtZSwgdik7IH1cbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcC5uYW1lLCBkZXNjKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBKc29uTWV0YWRhdGFDbGFzcyB7XG4gICAgc3RhdGljIHJlcXVpcmVkU3ltYm9sID0gJyEnO1xuICAgIHN0YXRpYyB0eXBlU3ltYm9sID0gJzonO1xuICAgIHByb3BlcnRpZXM6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4gPSBudWxsO1xuICAgIHJlcXVpcmVkUHJvcGVydGllczogQXJyYXk8c3RyaW5nPiA9IG51bGw7XG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHJvcGVydGllczogQXJyYXk8YW55PiwgcHVibGljIGNyZWF0b3I6ICgpID0+IGFueSA9IG51bGwsIHB1YmxpYyBwYXJlbnROYW1lOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgICAgIGlmKHBhcmVudE5hbWUpIHtcbiAgICAgICAgICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmFkZENsYXNzKG5hbWUsIHBhcmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IG5ldyBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+KCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHByb3AgPSB0aGlzLmNyZWF0ZVByb3BlcnR5KHByb3BlcnRpZXNbaV0pO1xuICAgICAgICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BlcnRpZXMucHVzaChwcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgZmluZChuYW1lOiBzdHJpbmcpOiBKc29uT2JqZWN0UHJvcGVydHkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvcGVydGllc1tpXS5uYW1lID09IG5hbWUpIHJldHVybiB0aGlzLnByb3BlcnRpZXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHB1YmxpYyBjcmVhdGVQcm9wZXJ0eShwcm9wSW5mbzogYW55KTogSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IHR5cGVvZiBwcm9wSW5mbyA9PT0gXCJzdHJpbmdcIiA/IHByb3BJbmZvIDogcHJvcEluZm8ubmFtZTtcbiAgICAgICAgaWYgKCFwcm9wZXJ0eU5hbWUpIHJldHVybjtcbiAgICAgICAgdmFyIHByb3BlcnR5VHlwZSA9IG51bGw7XG4gICAgICAgIHZhciB0eXBlSW5kZXggPSBwcm9wZXJ0eU5hbWUuaW5kZXhPZihKc29uTWV0YWRhdGFDbGFzcy50eXBlU3ltYm9sKTtcbiAgICAgICAgaWYgKHR5cGVJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eVR5cGUgPSBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKHR5cGVJbmRleCArIDEpO1xuICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCB0eXBlSW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpc1JlcXVpcmVkID0gdGhpcy5nZXRJc1Byb3BlcnR5TmFtZVJlcXVpcmVkKHByb3BlcnR5TmFtZSk7XG4gICAgICAgIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0UHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7XG4gICAgICAgIHZhciBwcm9wID0gbmV3IEpzb25PYmplY3RQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGlzUmVxdWlyZWQpO1xuICAgICAgICBpZiAocHJvcGVydHlUeXBlKSB7XG4gICAgICAgICAgICBwcm9wLnR5cGUgPSBwcm9wZXJ0eVR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wSW5mbyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKHByb3BJbmZvLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBwcm9wLnR5cGUgPSBwcm9wSW5mby50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShwcm9wSW5mby5kZWZhdWx0KSkge1xuICAgICAgICAgICAgICAgIHByb3AuZGVmYXVsdFZhbHVlID0gcHJvcEluZm8uZGVmYXVsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHByb3BJbmZvLnZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcHJvcC52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvcEluZm8uaXNSZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFrZVByb3BlcnR5UmVxdWlyZWQocHJvcC5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wSW5mby5jaG9pY2VzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNob2ljZXNGdW5jID0gdHlwZW9mIHByb3BJbmZvLmNob2ljZXMgPT09IFwiZnVuY3Rpb25cIiA/IHByb3BJbmZvLmNob2ljZXMgOiBudWxsO1xuICAgICAgICAgICAgICAgIHZhciBjaG9pY2VzVmFsdWUgPSB0eXBlb2YgcHJvcEluZm8uY2hvaWNlcyAhPT0gXCJmdW5jdGlvblwiID8gcHJvcEluZm8uY2hvaWNlcyA6IG51bGw7XG4gICAgICAgICAgICAgICAgcHJvcC5zZXRDaG9pY2VzKGNob2ljZXNWYWx1ZSwgY2hvaWNlc0Z1bmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3BJbmZvLm9uR2V0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBwcm9wLm9uR2V0VmFsdWUgPSBwcm9wSW5mby5vbkdldFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3BJbmZvLm9uU2V0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBwcm9wLm9uU2V0VmFsdWUgPSBwcm9wSW5mby5vblNldFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYocHJvcEluZm8uc2VyaWFsaXphdGlvblByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgcHJvcC5zZXJpYWxpemF0aW9uUHJvcGVydHkgPSBwcm9wSW5mby5zZXJpYWxpemF0aW9uUHJvcGVydHk7XG4gICAgICAgICAgICAgICAgdmFyIHM6IHN0cmluZztcbiAgICAgICAgICAgICAgICBpZihwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSAmJiBwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eS5pbmRleE9mKFwibG9jXCIpID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcC5pc0xvY2FsaXphYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihwcm9wSW5mby5pc0xvY2FsaXphYmxlKSB7XG4gICAgICAgICAgICAgICAgcHJvcC5pc0xvY2FsaXphYmxlID0gcHJvcEluZm8uaXNMb2NhbGl6YWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wSW5mby5jbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICBwcm9wLmNsYXNzTmFtZSA9IHByb3BJbmZvLmNsYXNzTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wSW5mby5iYXNlQ2xhc3NOYW1lKSB7XG4gICAgICAgICAgICAgICAgcHJvcC5iYXNlQ2xhc3NOYW1lID0gcHJvcEluZm8uYmFzZUNsYXNzTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wSW5mby5jbGFzc05hbWVQYXJ0KSB7XG4gICAgICAgICAgICAgICAgcHJvcC5jbGFzc05hbWVQYXJ0ID0gcHJvcEluZm8uY2xhc3NOYW1lUGFydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHByb3BJbmZvLmFsdGVybmF0aXZlTmFtZSkge1xuICAgICAgICAgICAgICAgIHByb3AuYWx0ZXJuYXRpdmVOYW1lID0gcHJvcEluZm8uYWx0ZXJuYXRpdmVOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wO1xuICAgIH1cbiAgICBwcml2YXRlIGdldElzUHJvcGVydHlOYW1lUmVxdWlyZWQocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZS5sZW5ndGggPiAwICYmIHByb3BlcnR5TmFtZVswXSA9PSBKc29uTWV0YWRhdGFDbGFzcy5yZXF1aXJlZFN5bWJvbDtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXRoaXMuZ2V0SXNQcm9wZXJ0eU5hbWVSZXF1aXJlZChwcm9wZXJ0eU5hbWUpKSByZXR1cm4gcHJvcGVydHlOYW1lO1xuICAgICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUuc2xpY2UoMSk7XG4gICAgICAgIHRoaXMubWFrZVByb3BlcnR5UmVxdWlyZWQocHJvcGVydHlOYW1lKTtcbiAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBtYWtlUHJvcGVydHlSZXF1aXJlZChwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMucmVxdWlyZWRQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVpcmVkUHJvcGVydGllcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXF1aXJlZFByb3BlcnRpZXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBKc29uTWV0YWRhdGEge1xuICAgIHByaXZhdGUgY2xhc3NlczogSGFzaFRhYmxlPEpzb25NZXRhZGF0YUNsYXNzPiA9IHt9O1xuICAgIHByaXZhdGUgY2hpbGRyZW5DbGFzc2VzOiBIYXNoVGFibGU8QXJyYXk8SnNvbk1ldGFkYXRhQ2xhc3M+PiA9IHt9O1xuICAgIHByaXZhdGUgY2xhc3NQcm9wZXJ0aWVzOiBIYXNoVGFibGU8QXJyYXk8SnNvbk9iamVjdFByb3BlcnR5Pj4gPSB7fTtcbiAgICBwcml2YXRlIGNsYXNzUmVxdWlyZWRQcm9wZXJ0aWVzOiBIYXNoVGFibGU8QXJyYXk8c3RyaW5nPj4gPSB7fTtcbiAgICBwdWJsaWMgYWRkQ2xhc3MobmFtZTogc3RyaW5nLCBwcm9wZXJ0aWVzOiBBcnJheTxhbnk+LCBjcmVhdG9yOiAoKSA9PiBhbnkgPSBudWxsLCBwYXJlbnROYW1lOiBzdHJpbmcgPSBudWxsKTogSnNvbk1ldGFkYXRhQ2xhc3Mge1xuICAgICAgICB2YXIgbWV0YURhdGFDbGFzcyA9IG5ldyBKc29uTWV0YWRhdGFDbGFzcyhuYW1lLCBwcm9wZXJ0aWVzLCBjcmVhdG9yLCBwYXJlbnROYW1lKTtcbiAgICAgICAgdGhpcy5jbGFzc2VzW25hbWVdID0gbWV0YURhdGFDbGFzcztcbiAgICAgICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5DbGFzc2VzW3BhcmVudE5hbWVdO1xuICAgICAgICAgICAgaWYgKCFjaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5DbGFzc2VzW3BhcmVudE5hbWVdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuQ2xhc3Nlc1twYXJlbnROYW1lXS5wdXNoKG1ldGFEYXRhQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXRhRGF0YUNsYXNzO1xuICAgIH1cbiAgICBwdWJsaWMgb3ZlcnJpZGVDbGFzc0NyZWF0b3JlKG5hbWU6IHN0cmluZywgY3JlYXRvcjogKCkgPT4gYW55KSB7XG4gICAgICAgIHZhciBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MobmFtZSk7XG4gICAgICAgIGlmIChtZXRhRGF0YUNsYXNzKSB7XG4gICAgICAgICAgICBtZXRhRGF0YUNsYXNzLmNyZWF0b3IgPSBjcmVhdG9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBnZXRQcm9wZXJ0aWVzKGNsYXNzTmFtZTogc3RyaW5nKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5jbGFzc1Byb3BlcnRpZXNbY2xhc3NOYW1lXTtcbiAgICAgICAgaWYgKCFwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4oKTtcbiAgICAgICAgICAgIHRoaXMuZmlsbFByb3BlcnRpZXMoY2xhc3NOYW1lLCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NQcm9wZXJ0aWVzW2NsYXNzTmFtZV0gPSBwcm9wZXJ0aWVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIH1cbiAgICBwdWJsaWMgZmluZFByb3BlcnR5KGNsYXNzTmFtZTogc3RyaW5nLCBwcm9wZXJ0eU5hbWU6IHN0cmluZykgOiBKc29uT2JqZWN0UHJvcGVydHkge1xuICAgICAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydGllcyhjbGFzc05hbWUpO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIGlmKHByb3BlcnRpZXNbaV0ubmFtZSA9PSBwcm9wZXJ0eU5hbWUpIHJldHVybiBwcm9wZXJ0aWVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBwdWJsaWMgY3JlYXRlQ2xhc3MobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgdmFyIG1ldGFEYXRhQ2xhc3MgPSB0aGlzLmZpbmRDbGFzcyhuYW1lKTtcbiAgICAgICAgaWYgKCFtZXRhRGF0YUNsYXNzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYobWV0YURhdGFDbGFzcy5jcmVhdG9yKSByZXR1cm4gbWV0YURhdGFDbGFzcy5jcmVhdG9yKCk7XG4gICAgICAgIHZhciBwYXJlbnROYW1lID0gbWV0YURhdGFDbGFzcy5wYXJlbnROYW1lO1xuICAgICAgICB3aGlsZShwYXJlbnROYW1lKSB7XG4gICAgICAgICAgICBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MocGFyZW50TmFtZSk7XG4gICAgICAgICAgICBpZiAoIW1ldGFEYXRhQ2xhc3MpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcGFyZW50TmFtZSA9IG1ldGFEYXRhQ2xhc3MucGFyZW50TmFtZTtcbiAgICAgICAgICAgIGlmKG1ldGFEYXRhQ2xhc3MuY3JlYXRvcikgcmV0dXJuIHRoaXMuY3JlYXRlQ3VzdG9tVHlwZShuYW1lLCBtZXRhRGF0YUNsYXNzLmNyZWF0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBwcml2YXRlIGNyZWF0ZUN1c3RvbVR5cGUobmFtZTogc3RyaW5nLCBjcmVhdG9yOiBhbnkpOiBhbnkge1xuICAgICAgICB2YXIgcmVzID0gY3JlYXRvcigpO1xuICAgICAgICByZXMuY3VzdG9tVHlwZU5hbWUgPSBuYW1lO1xuICAgICAgICByZXMuY3VzdG9tVGVtcGxhdGVOYW1lID0gcmVzLmdldFRlbXBsYXRlID8gcmVzLmdldFRlbXBsYXRlKCkgOiByZXMuZ2V0VHlwZSgpO1xuICAgICAgICByZXMuZ2V0VHlwZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gcmVzLmN1c3RvbVR5cGVOYW1lOyB9O1xuICAgICAgICByZXMuZ2V0VGVtcGxhdGUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHJlcy5jdXN0b21UZW1wbGF0ZU5hbWU7IH07XG4gICAgICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnRpZXMocmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgcHVibGljIGdldENoaWxkcmVuQ2xhc3NlcyhuYW1lOiBzdHJpbmcsIGNhbkJlQ3JlYXRlZDogYm9vbGVhbiA9IGZhbHNlKTogQXJyYXk8SnNvbk1ldGFkYXRhQ2xhc3M+IHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICB0aGlzLmZpbGxDaGlsZHJlbkNsYXNzZXMobmFtZSwgY2FuQmVDcmVhdGVkLCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKG5hbWU6IHN0cmluZyk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuY2xhc3NSZXF1aXJlZFByb3BlcnRpZXNbbmFtZV07XG4gICAgICAgIGlmICghcHJvcGVydGllcykge1xuICAgICAgICAgICAgcHJvcGVydGllcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgICAgICAgICB0aGlzLmZpbGxSZXF1aXJlZFByb3BlcnRpZXMobmFtZSwgcHJvcGVydGllcyk7XG4gICAgICAgICAgICB0aGlzLmNsYXNzUmVxdWlyZWRQcm9wZXJ0aWVzW25hbWVdID0gcHJvcGVydGllcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICB9XG4gICAgcHVibGljIGFkZFByb3BlcnRpZXMoY2xhc3NOYW1lOiBzdHJpbmcsIHByb3BlcnRpZXNJbmZvczogQXJyYXk8YW55Pikge1xuICAgICAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzSW5mb3MubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEN1c3RvbVByb3BlcnR5Q29yZShtZXRhRGF0YUNsYXNzLCBwcm9wZXJ0aWVzSW5mb3NbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhZGRQcm9wZXJ0eShjbGFzc05hbWU6IHN0cmluZywgcHJvcGVydHlJbmZvOiBhbnkpIHtcbiAgICAgICAgdGhpcy5hZGRDdXN0b21Qcm9wZXJ0eUNvcmUodGhpcy5maW5kQ2xhc3MoY2xhc3NOYW1lKSwgcHJvcGVydHlJbmZvKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhZGRDdXN0b21Qcm9wZXJ0eUNvcmUobWV0YURhdGFDbGFzczogSnNvbk1ldGFkYXRhQ2xhc3MsIHByb3BlcnR5SW5mbzogYW55KSB7XG4gICAgICAgIGlmICghbWV0YURhdGFDbGFzcykgcmV0dXJuO1xuICAgICAgICB2YXIgcHJvcGVydHkgPSBtZXRhRGF0YUNsYXNzLmNyZWF0ZVByb3BlcnR5KHByb3BlcnR5SW5mbyk7XG4gICAgICAgIGlmIChwcm9wZXJ0eSkge1xuICAgICAgICAgICAgdGhpcy5hZGRQcm9wZXJ0eVRvQ2xhc3MobWV0YURhdGFDbGFzcywgcHJvcGVydHkpO1xuICAgICAgICAgICAgdGhpcy5lbXB0eUNsYXNzUHJvcGVydGllc0hhc2gobWV0YURhdGFDbGFzcyk7XG4gICAgICAgICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5hZGRQcm9wZXJ0eShtZXRhRGF0YUNsYXNzLm5hbWUsIHByb3BlcnR5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgcmVtb3ZlUHJvcGVydHkoY2xhc3NOYW1lOiBzdHJpbmcsIHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHZhciBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICAgICAgaWYgKCFtZXRhRGF0YUNsYXNzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBwcm9wZXJ0eSA9IG1ldGFEYXRhQ2xhc3MuZmluZChwcm9wZXJ0eU5hbWUpO1xuICAgICAgICBpZiAocHJvcGVydHkpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlUHJvcGVydHlGcm9tQ2xhc3MobWV0YURhdGFDbGFzcywgcHJvcGVydHkpO1xuICAgICAgICAgICAgdGhpcy5lbXB0eUNsYXNzUHJvcGVydGllc0hhc2gobWV0YURhdGFDbGFzcyk7XG4gICAgICAgICAgICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucmVtb3ZlUHJvcGVydHkoY2xhc3NOYW1lLCBwcm9wZXJ0eU5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgYWRkUHJvcGVydHlUb0NsYXNzKG1ldGFEYXRhQ2xhc3M6IEpzb25NZXRhZGF0YUNsYXNzLCBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5KSB7XG4gICAgICAgIGlmIChtZXRhRGF0YUNsYXNzLmZpbmQocHJvcGVydHkubmFtZSkgIT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBtZXRhRGF0YUNsYXNzLnByb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7XG4gICAgfVxuICAgIHByaXZhdGUgcmVtb3ZlUHJvcGVydHlGcm9tQ2xhc3MobWV0YURhdGFDbGFzczogSnNvbk1ldGFkYXRhQ2xhc3MsIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHkpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gbWV0YURhdGFDbGFzcy5wcm9wZXJ0aWVzLmluZGV4T2YocHJvcGVydHkpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XG4gICAgICAgIG1ldGFEYXRhQ2xhc3MucHJvcGVydGllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBpZiAobWV0YURhdGFDbGFzcy5yZXF1aXJlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGluZGV4ID0gbWV0YURhdGFDbGFzcy5yZXF1aXJlZFByb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eS5uYW1lKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgbWV0YURhdGFDbGFzcy5yZXF1aXJlZFByb3BlcnRpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGVtcHR5Q2xhc3NQcm9wZXJ0aWVzSGFzaChtZXRhRGF0YUNsYXNzOiBKc29uTWV0YWRhdGFDbGFzcykge1xuICAgICAgICB0aGlzLmNsYXNzUHJvcGVydGllc1ttZXRhRGF0YUNsYXNzLm5hbWVdID0gbnVsbDtcbiAgICAgICAgdmFyIGNoaWxkQ2xhc3NlcyA9IHRoaXMuZ2V0Q2hpbGRyZW5DbGFzc2VzKG1ldGFEYXRhQ2xhc3MubmFtZSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmNsYXNzUHJvcGVydGllc1tjaGlsZENsYXNzZXNbaV0ubmFtZV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgZmlsbENoaWxkcmVuQ2xhc3NlcyhuYW1lOiBzdHJpbmcsIGNhbkJlQ3JlYXRlZDogYm9vbGVhbiwgcmVzdWx0OiBBcnJheTxKc29uTWV0YWRhdGFDbGFzcz4pIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbkNsYXNzZXNbbmFtZV07XG4gICAgICAgIGlmICghY2hpbGRyZW4pIHJldHVybjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFjYW5CZUNyZWF0ZWQgfHwgY2hpbGRyZW5baV0uY3JlYXRvcikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlsbENoaWxkcmVuQ2xhc3NlcyhjaGlsZHJlbltpXS5uYW1lLCBjYW5CZUNyZWF0ZWQsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGZpbmRDbGFzcyhuYW1lOiBzdHJpbmcpOiBKc29uTWV0YWRhdGFDbGFzcyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsYXNzZXNbbmFtZV07XG4gICAgfVxuICAgIHByaXZhdGUgZmlsbFByb3BlcnRpZXMobmFtZTogc3RyaW5nLCBsaXN0OiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+KSB7XG4gICAgICAgIHZhciBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MobmFtZSk7XG4gICAgICAgIGlmICghbWV0YURhdGFDbGFzcykgcmV0dXJuO1xuICAgICAgICBpZiAobWV0YURhdGFDbGFzcy5wYXJlbnROYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGxQcm9wZXJ0aWVzKG1ldGFEYXRhQ2xhc3MucGFyZW50TmFtZSwgbGlzdCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhRGF0YUNsYXNzLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuYWRkUHJvcGVydHlDb3JlKG1ldGFEYXRhQ2xhc3MucHJvcGVydGllc1tpXSwgbGlzdCwgbGlzdC5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgYWRkUHJvcGVydHlDb3JlKHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHksIGxpc3Q6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4sIGVuZEluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW5kSW5kZXg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGxpc3RbaV0ubmFtZSA9PSBwcm9wZXJ0eS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgIGxpc3QucHVzaChwcm9wZXJ0eSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByb3BlcnR5Lm1lcmdlV2l0aChsaXN0W2luZGV4XSk7XG4gICAgICAgICAgICBsaXN0W2luZGV4XSA9IHByb3BlcnR5O1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgZmlsbFJlcXVpcmVkUHJvcGVydGllcyhuYW1lOiBzdHJpbmcsIGxpc3Q6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgdmFyIG1ldGFEYXRhQ2xhc3MgPSB0aGlzLmZpbmRDbGFzcyhuYW1lKTtcbiAgICAgICAgaWYgKCFtZXRhRGF0YUNsYXNzKSByZXR1cm47XG4gICAgICAgIGlmIChtZXRhRGF0YUNsYXNzLnJlcXVpcmVkUHJvcGVydGllcykge1xuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkobGlzdCwgbWV0YURhdGFDbGFzcy5yZXF1aXJlZFByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhRGF0YUNsYXNzLnBhcmVudE5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsbFJlcXVpcmVkUHJvcGVydGllcyhtZXRhRGF0YUNsYXNzLnBhcmVudE5hbWUsIGxpc3QpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEpzb25FcnJvciB7XG4gICAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmcgPSBcIlwiO1xuICAgIHB1YmxpYyBhdDogTnVtYmVyID0gLTE7XG4gICAgY29uc3RydWN0b3IocHVibGljIHR5cGU6IHN0cmluZywgcHVibGljIG1lc3NhZ2U6IHN0cmluZykge1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0RnVsbERlc2NyaXB0aW9uKCkgOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlICsgKHRoaXMuZGVzY3JpcHRpb24gPyBcIlxcblwiICsgdGhpcy5kZXNjcmlwdGlvbiA6IFwiXCIpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBKc29uVW5rbm93blByb3BlcnR5RXJyb3IgZXh0ZW5kcyBKc29uRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKFwidW5rbm93bnByb3BlcnR5XCIsIFwiVGhlIHByb3BlcnR5ICdcIiArIHByb3BlcnR5TmFtZSArIFwiJyBpbiBjbGFzcyAnXCIgKyBjbGFzc05hbWUgKyBcIicgaXMgdW5rbm93bi5cIik7XG4gICAgICAgIHZhciBwcm9wZXJ0aWVzID0gSnNvbk9iamVjdC5tZXRhRGF0YS5nZXRQcm9wZXJ0aWVzKGNsYXNzTmFtZSk7XG4gICAgICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gXCJUaGUgbGlzdCBvZiBhdmFpbGFibGUgcHJvcGVydGllcyBhcmU6IFwiO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB0aGlzLmRlc2NyaXB0aW9uICs9IFwiLCBcIjtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uICs9IHByb3BlcnRpZXNbaV0ubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gKz0gJy4nO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEpzb25NaXNzaW5nVHlwZUVycm9yQmFzZSBleHRlbmRzIEpzb25FcnJvciB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGJhc2VDbGFzc05hbWU6IHN0cmluZywgcHVibGljIHR5cGU6IHN0cmluZywgcHVibGljIG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcih0eXBlLCBtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IFwiVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgYXZhaWxhYmxlOiBcIjtcbiAgICAgICAgdmFyIHR5cGVzID0gSnNvbk9iamVjdC5tZXRhRGF0YS5nZXRDaGlsZHJlbkNsYXNzZXMoYmFzZUNsYXNzTmFtZSwgdHJ1ZSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID4gMCkgdGhpcy5kZXNjcmlwdGlvbiArPSBcIiwgXCI7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uICs9IFwiJ1wiICsgdHlwZXNbaV0ubmFtZSArIFwiJ1wiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gKz0gXCIuXCI7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEpzb25NaXNzaW5nVHlwZUVycm9yIGV4dGVuZHMgSnNvbk1pc3NpbmdUeXBlRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHB1YmxpYyBiYXNlQ2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoYmFzZUNsYXNzTmFtZSwgXCJtaXNzaW5ndHlwZXByb3BlcnR5XCIsIFwiVGhlIHByb3BlcnR5IHR5cGUgaXMgbWlzc2luZyBpbiB0aGUgb2JqZWN0LiBQbGVhc2UgdGFrZSBhIGxvb2sgYXQgcHJvcGVydHk6ICdcIiArIHByb3BlcnR5TmFtZSArIFwiJy5cIik7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEpzb25JbmNvcnJlY3RUeXBlRXJyb3IgZXh0ZW5kcyBKc29uTWlzc2luZ1R5cGVFcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIGJhc2VDbGFzc05hbWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihiYXNlQ2xhc3NOYW1lLCBcImluY29ycmVjdHR5cGVwcm9wZXJ0eVwiLCBcIlRoZSBwcm9wZXJ0eSB0eXBlIGlzIGluY29ycmVjdCBpbiB0aGUgb2JqZWN0LiBQbGVhc2UgdGFrZSBhIGxvb2sgYXQgcHJvcGVydHk6ICdcIiArIHByb3BlcnR5TmFtZSArIFwiJy5cIik7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEpzb25SZXF1aXJlZFByb3BlcnR5RXJyb3IgZXh0ZW5kcyBKc29uRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKFwicmVxdWlyZWRwcm9wZXJ0eVwiLCBcIlRoZSBwcm9wZXJ0eSAnXCIgKyBwcm9wZXJ0eU5hbWUgKyBcIicgaXMgcmVxdWlyZWQgaW4gY2xhc3MgJ1wiICsgY2xhc3NOYW1lICsgXCInLlwiKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBKc29uT2JqZWN0IHtcbiAgICBwcml2YXRlIHN0YXRpYyB0eXBlUHJvcGVydHlOYW1lID0gXCJ0eXBlXCI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcG9zaXRpb25Qcm9wZXJ0eU5hbWUgPSBcInBvc1wiO1xuICAgIHByaXZhdGUgc3RhdGljIG1ldGFEYXRhVmFsdWUgPSBuZXcgSnNvbk1ldGFkYXRhKCk7XG4gICAgcHVibGljIHN0YXRpYyBnZXQgbWV0YURhdGEoKSB7IHJldHVybiBKc29uT2JqZWN0Lm1ldGFEYXRhVmFsdWU7IH1cbiAgICBwdWJsaWMgZXJyb3JzID0gbmV3IEFycmF5PEpzb25FcnJvcj4oKTtcbiAgICBwdWJsaWMgdG9Kc29uT2JqZWN0KG9iajogYW55KTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9Kc29uT2JqZWN0Q29yZShvYmosIG51bGwpO1xuICAgIH1cbiAgICBwdWJsaWMgdG9PYmplY3QoanNvbk9iajogYW55LCBvYmo6IGFueSkge1xuICAgICAgICBpZiAoIWpzb25PYmopIHJldHVybjtcbiAgICAgICAgdmFyIHByb3BlcnRpZXMgPSBudWxsO1xuICAgICAgICBpZiAob2JqLmdldFR5cGUpIHtcbiAgICAgICAgICAgIHByb3BlcnRpZXMgPSBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldFByb3BlcnRpZXMob2JqLmdldFR5cGUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwcm9wZXJ0aWVzKSByZXR1cm47XG4gICAgICAgIGlmKG9iai5zdGFydExvYWRpbmdGcm9tSnNvbikge1xuICAgICAgICAgICAgb2JqLnN0YXJ0TG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIga2V5IGluIGpzb25PYmopIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT0gSnNvbk9iamVjdC50eXBlUHJvcGVydHlOYW1lKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChrZXkgPT0gSnNvbk9iamVjdC5wb3NpdGlvblByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgIG9ialtrZXldID0ganNvbk9ialtrZXldO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gdGhpcy5maW5kUHJvcGVydHkocHJvcGVydGllcywga2V5KTtcbiAgICAgICAgICAgIGlmICghcHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZE5ld0Vycm9yKG5ldyBKc29uVW5rbm93blByb3BlcnR5RXJyb3Ioa2V5LnRvU3RyaW5nKCksIG9iai5nZXRUeXBlKCkpLCBqc29uT2JqKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudmFsdWVUb09iaihqc29uT2JqW2tleV0sIG9iaiwga2V5LCBwcm9wZXJ0eSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYob2JqLmVuZExvYWRpbmdGcm9tSnNvbikge1xuICAgICAgICAgICAgb2JqLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb3RlY3RlZCB0b0pzb25PYmplY3RDb3JlKG9iajogYW55LCBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5KTogYW55IHtcbiAgICAgICAgaWYgKCFvYmouZ2V0VHlwZSkgcmV0dXJuIG9iajtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCAmJiAoIXByb3BlcnR5LmNsYXNzTmFtZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdFtKc29uT2JqZWN0LnR5cGVQcm9wZXJ0eU5hbWVdID0gcHJvcGVydHkuZ2V0T2JqVHlwZShvYmouZ2V0VHlwZSgpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvcGVydGllcyA9IEpzb25PYmplY3QubWV0YURhdGEuZ2V0UHJvcGVydGllcyhvYmouZ2V0VHlwZSgpKTtcbiAgICAgICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVUb0pzb24ob2JqLCByZXN1bHQsIHByb3BlcnRpZXNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHByb3RlY3RlZCB2YWx1ZVRvSnNvbihvYmo6IGFueSwgcmVzdWx0OiBhbnksIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gcHJvcGVydHkuZ2V0VmFsdWUob2JqKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgaWYgKHByb3BlcnR5LmlzRGVmYXVsdFZhbHVlKHZhbHVlKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5pc1ZhbHVlQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICB2YXIgYXJyVmFsdWUgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBhcnJWYWx1ZS5wdXNoKHRoaXMudG9Kc29uT2JqZWN0Q29yZSh2YWx1ZVtpXSwgcHJvcGVydHkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gYXJyVmFsdWUubGVuZ3RoID4gMCA/IGFyclZhbHVlIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy50b0pzb25PYmplY3RDb3JlKHZhbHVlLCBwcm9wZXJ0eSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwcm9wZXJ0eS5pc0RlZmF1bHRWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdFtwcm9wZXJ0eS5uYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb3RlY3RlZCB2YWx1ZVRvT2JqKHZhbHVlOiBhbnksIG9iajogYW55LCBrZXk6IGFueSwgcHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCAmJiBwcm9wZXJ0eS5oYXNUb1VzZVNldFZhbHVlKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eS5zZXRWYWx1ZShvYmosIHZhbHVlLCB0aGlzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1ZhbHVlQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlVG9BcnJheSh2YWx1ZSwgb2JqLCBwcm9wZXJ0eS5uYW1lLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5ld09iaiA9IHRoaXMuY3JlYXRlTmV3T2JqKHZhbHVlLCBwcm9wZXJ0eSk7XG4gICAgICAgIGlmIChuZXdPYmoubmV3T2JqKSB7XG4gICAgICAgICAgICB0aGlzLnRvT2JqZWN0KHZhbHVlLCBuZXdPYmoubmV3T2JqKTtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3T2JqLm5ld09iajtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5ld09iai5lcnJvcikge1xuICAgICAgICAgICAgaWYocHJvcGVydHkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHByb3BlcnR5LnNldFZhbHVlKG9iaiwgdmFsdWUsIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb2JqW3Byb3BlcnR5Lm5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBpc1ZhbHVlQXJyYXkodmFsdWU6IGFueSk6IGJvb2xlYW4geyByZXR1cm4gdmFsdWUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSk7IH1cbiAgICBwcml2YXRlIGNyZWF0ZU5ld09iaih2YWx1ZTogYW55LCBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5KTogYW55IHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHsgbmV3T2JqOiBudWxsLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICB2YXIgY2xhc3NOYW1lID0gdmFsdWVbSnNvbk9iamVjdC50eXBlUHJvcGVydHlOYW1lXTtcbiAgICAgICAgaWYgKCFjbGFzc05hbWUgJiYgcHJvcGVydHkgIT0gbnVsbCAmJiBwcm9wZXJ0eS5jbGFzc05hbWUpIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZSA9IHByb3BlcnR5LmNsYXNzTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBjbGFzc05hbWUgPSBwcm9wZXJ0eS5nZXRDbGFzc05hbWUoY2xhc3NOYW1lKTtcbiAgICAgICAgcmVzdWx0Lm5ld09iaiA9IChjbGFzc05hbWUpID8gSnNvbk9iamVjdC5tZXRhRGF0YS5jcmVhdGVDbGFzcyhjbGFzc05hbWUpIDogbnVsbDtcbiAgICAgICAgcmVzdWx0LmVycm9yID0gdGhpcy5jaGVja05ld09iamVjdE9uRXJyb3JzKHJlc3VsdC5uZXdPYmosIHZhbHVlLCBwcm9wZXJ0eSwgY2xhc3NOYW1lKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBjaGVja05ld09iamVjdE9uRXJyb3JzKG5ld09iajogYW55LCB2YWx1ZTogYW55LCBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5LCBjbGFzc05hbWU6IHN0cmluZyk6IEpzb25FcnJvciB7XG4gICAgICAgIHZhciBlcnJvciA9IG51bGw7XG4gICAgICAgIGlmIChuZXdPYmopIHtcbiAgICAgICAgICAgIHZhciByZXF1aXJlZFByb3BlcnRpZXMgPSBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldFJlcXVpcmVkUHJvcGVydGllcyhjbGFzc05hbWUpO1xuICAgICAgICAgICAgaWYgKHJlcXVpcmVkUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVxdWlyZWRQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWVbcmVxdWlyZWRQcm9wZXJ0aWVzW2ldXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgSnNvblJlcXVpcmVkUHJvcGVydHlFcnJvcihyZXF1aXJlZFByb3BlcnRpZXNbaV0sIGNsYXNzTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5iYXNlQ2xhc3NOYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgSnNvbk1pc3NpbmdUeXBlRXJyb3IocHJvcGVydHkubmFtZSwgcHJvcGVydHkuYmFzZUNsYXNzTmFtZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgSnNvbkluY29ycmVjdFR5cGVFcnJvcihwcm9wZXJ0eS5uYW1lLCBwcm9wZXJ0eS5iYXNlQ2xhc3NOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE5ld0Vycm9yKGVycm9yLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cbiAgICBwcml2YXRlIGFkZE5ld0Vycm9yKGVycm9yOiBKc29uRXJyb3IsIGpzb25PYmo6IGFueSkge1xuICAgICAgICBpZiAoanNvbk9iaiAmJiBqc29uT2JqW0pzb25PYmplY3QucG9zaXRpb25Qcm9wZXJ0eU5hbWVdKSB7XG4gICAgICAgICAgICBlcnJvci5hdCA9IGpzb25PYmpbSnNvbk9iamVjdC5wb3NpdGlvblByb3BlcnR5TmFtZV0uc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lcnJvcnMucHVzaChlcnJvcik7XG4gICAgfVxuICAgIHByaXZhdGUgdmFsdWVUb0FycmF5KHZhbHVlOiBBcnJheTxhbnk+LCBvYmo6IGFueSwga2V5OiBhbnksIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHkpIHtcbiAgICAgICAgaWYob2JqW2tleV0gJiYgdmFsdWUubGVuZ3RoID4gMCkgb2JqW2tleV0uc3BsaWNlKDAsIG9ialtrZXldLmxlbmd0aCk7XG4gICAgICAgIGlmKCFvYmpba2V5XSkgb2JqW2tleV0gPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy5jcmVhdGVOZXdPYmoodmFsdWVbaV0sIHByb3BlcnR5KTtcbiAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5uZXdPYmopIHtcbiAgICAgICAgICAgICAgICBvYmpba2V5XS5wdXNoKG5ld1ZhbHVlLm5ld09iaik7XG4gICAgICAgICAgICAgICAgdGhpcy50b09iamVjdCh2YWx1ZVtpXSwgbmV3VmFsdWUubmV3T2JqKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXdWYWx1ZS5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBvYmpba2V5XS5wdXNoKHZhbHVlW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBmaW5kUHJvcGVydHkocHJvcGVydGllczogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5Piwga2V5OiBhbnkpOiBKc29uT2JqZWN0UHJvcGVydHkge1xuICAgICAgICBpZiAoIXByb3BlcnRpZXMpIHJldHVybiBudWxsO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBwcm9wID0gcHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgIGlmIChwcm9wLm5hbWUgPT0ga2V5IHx8IHByb3AuYWx0ZXJuYXRpdmVOYW1lID09IGtleSkgcmV0dXJuIHByb3A7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2pzb25vYmplY3QudHMiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0l0ZW1WYWx1ZX0gZnJvbSBcIi4uL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHtMb2NhbGl6YWJsZVN0cmluZ30gZnJvbSBcIi4uL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQge1F1ZXN0aW9uQmFzZX0gZnJvbSAnLi4vcXVlc3Rpb25iYXNlJztcbmltcG9ydCB7SVN1cnZleUNyZWF0b3J9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25cIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleUVsZW1lbnRCYXNlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PGFueSwgYW55PiB7XG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJMb2NTdHJpbmcobG9jU3RyOiBMb2NhbGl6YWJsZVN0cmluZywgc3R5bGU6IGFueSA9IG51bGwpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIGlmIChsb2NTdHIuaGFzSHRtbCkge1xuICAgICAgICAgICAgbGV0IGh0bWxWYWx1ZSA9IHsgX19odG1sOiBsb2NTdHIucmVuZGVyZWRIdG1sIH07XG4gICAgICAgICAgICByZXR1cm4gPHNwYW4gc3R5bGU9e3N0eWxlfSBkYW5nZXJvdXNseVNldElubmVySFRNTD17aHRtbFZhbHVlfSAvPjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gPHNwYW4gc3R5bGU9e3N0eWxlfT57bG9jU3RyLnJlbmRlcmVkSHRtbH08L3NwYW4+O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgaXNEaXNwbGF5TW9kZTogYm9vbGVhbjtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5pc0Rpc3BsYXlNb2RlID0gcHJvcHMuaXNEaXNwbGF5TW9kZSB8fCBmYWxzZTtcbiAgICB9XG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xuICAgICAgICB0aGlzLmlzRGlzcGxheU1vZGUgPSBuZXh0UHJvcHMuaXNEaXNwbGF5TW9kZSB8fCBmYWxzZTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHJlbmRlckxvY1N0cmluZyhsb2NTdHI6IExvY2FsaXphYmxlU3RyaW5nLCBzdHlsZTogYW55ID0gbnVsbCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIFN1cnZleUVsZW1lbnRCYXNlLnJlbmRlckxvY1N0cmluZyhsb2NTdHIsIHN0eWxlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWFjdFN1cnZleUVsZW1lbnQgZXh0ZW5kcyBTdXJ2ZXlFbGVtZW50QmFzZSB7XG4gICAgcHJvdGVjdGVkIGNzc0NsYXNzZXM6IGFueTtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5jc3NDbGFzc2VzID0gcHJvcHMuY3NzQ2xhc3NlcztcbiAgICB9XG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlci5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyk7XG4gICAgICAgIHRoaXMuY3NzQ2xhc3NlcyA9IG5leHRQcm9wcy5jc3NDbGFzc2VzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2UgZXh0ZW5kcyBTdXJ2ZXlFbGVtZW50QmFzZSB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uQmFzZTogUXVlc3Rpb25CYXNlO1xuICAgIHByb3RlY3RlZCBjcmVhdG9yOiBJU3VydmV5Q3JlYXRvcjtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbkJhc2UgPSBwcm9wcy5xdWVzdGlvbjtcbiAgICAgICAgdGhpcy5jcmVhdG9yID0gcHJvcHMuY3JlYXRvcjtcbiAgICB9XG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlci5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyk7XG4gICAgICAgIHRoaXMucXVlc3Rpb25CYXNlID0gbmV4dFByb3BzLnF1ZXN0aW9uO1xuICAgICAgICB0aGlzLmNyZWF0b3IgPSBuZXh0UHJvcHMuY3JlYXRvcjtcbiAgICB9XG4gICAgcHVibGljIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnF1ZXN0aW9uQmFzZS5jdXN0b21XaWRnZXRcbiAgICAgICAgICAgIHx8ICEhdGhpcy5xdWVzdGlvbkJhc2UuY3VzdG9tV2lkZ2V0RGF0YS5pc05lZWRSZW5kZXJcbiAgICAgICAgICAgIHx8ICEhdGhpcy5xdWVzdGlvbkJhc2UuY3VzdG9tV2lkZ2V0LndpZGdldEpzb24ucmVuZGVyO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uZWxlbWVudC50c3giLCJpbXBvcnQge0hhc2hUYWJsZX0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHtRdWVzdGlvbkJhc2V9IGZyb20gJy4vcXVlc3Rpb25iYXNlJztcbmltcG9ydCB7SUVsZW1lbnR9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7c3VydmV5TG9jYWxpemF0aW9ufSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbi8vVE9ETyByZXBsYWNlIGNvbXBsZXRlbHkgd2l0aCBFbGVtZW50RmFjdG9yeVxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRmFjdG9yeSB7XG4gICAgcHVibGljIHN0YXRpYyBJbnN0YW5jZTogUXVlc3Rpb25GYWN0b3J5ID0gbmV3IFF1ZXN0aW9uRmFjdG9yeSgpO1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IERlZmF1bHRDaG9pY2VzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFtzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hvaWNlc19JdGVtXCIpICsgXCIxXCIsIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9pY2VzX0l0ZW1cIikgKyBcIjJcIiwgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNob2ljZXNfSXRlbVwiKSArIFwiM1wiXTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXQgRGVmYXVsdENvbHVtcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHZhciBjb2xOYW1lID0gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1hdHJpeF9jb2x1bW5cIikgKyBcIiBcIjtcbiAgICAgICAgcmV0dXJuIFtjb2xOYW1lICsgXCIxXCIsIGNvbE5hbWUgKyBcIjJcIiwgY29sTmFtZSArIFwiM1wiXTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXQgRGVmYXVsdFJvd3MoKTogc3RyaW5nW10ge1xuICAgICAgICB2YXIgcm93TmFtZSA9IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtYXRyaXhfcm93XCIpICsgXCIgXCI7XG4gICAgICAgIHJldHVybiBbcm93TmFtZSArIFwiMVwiLCByb3dOYW1lICsgXCIyXCJdO1xuICAgIH1cbiAgICBwcml2YXRlIGNyZWF0b3JIYXNoOiBIYXNoVGFibGU8KG5hbWU6IHN0cmluZykgPT4gUXVlc3Rpb25CYXNlPiA9IHt9O1xuXG4gICAgcHVibGljIHJlZ2lzdGVyUXVlc3Rpb24ocXVlc3Rpb25UeXBlOiBzdHJpbmcsIHF1ZXN0aW9uQ3JlYXRvcjogKG5hbWU6IHN0cmluZykgPT4gUXVlc3Rpb25CYXNlKSB7XG4gICAgICAgIHRoaXMuY3JlYXRvckhhc2hbcXVlc3Rpb25UeXBlXSA9IHF1ZXN0aW9uQ3JlYXRvcjtcbiAgICB9XG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmNyZWF0b3JIYXNoID0ge307XG4gICAgfVxuICAgIHB1YmxpYyBnZXRBbGxUeXBlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgICAgIGZvcih2YXIga2V5IGluIHRoaXMuY3JlYXRvckhhc2gpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5zb3J0KCk7XG4gICAgfVxuICAgIHB1YmxpYyBjcmVhdGVRdWVzdGlvbihxdWVzdGlvblR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUXVlc3Rpb25CYXNlIHtcbiAgICAgICAgdmFyIGNyZWF0b3IgPSB0aGlzLmNyZWF0b3JIYXNoW3F1ZXN0aW9uVHlwZV07XG4gICAgICAgIGlmIChjcmVhdG9yID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gY3JlYXRvcihuYW1lKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50RmFjdG9yeSB7XG4gICAgcHVibGljIHN0YXRpYyBJbnN0YW5jZTogRWxlbWVudEZhY3RvcnkgPSBuZXcgRWxlbWVudEZhY3RvcnkoKTtcbiAgICBwcml2YXRlIGNyZWF0b3JIYXNoOiBIYXNoVGFibGU8KG5hbWU6IHN0cmluZykgPT4gSUVsZW1lbnQ+ID0ge307XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJFbGVtZW50KGVsZW1lbnRUeXBlOiBzdHJpbmcsIGVsZW1lbnRDcmVhdG9yOiAobmFtZTogc3RyaW5nKSA9PiBJRWxlbWVudCkge1xuICAgICAgICB0aGlzLmNyZWF0b3JIYXNoW2VsZW1lbnRUeXBlXSA9IGVsZW1lbnRDcmVhdG9yO1xuICAgIH1cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuY3JlYXRvckhhc2ggPSB7fTtcbiAgICB9XG4gICAgcHVibGljIGdldEFsbFR5cGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICB2YXIgcmVzdWx0ID0gUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLmdldEFsbFR5cGVzKCk7XG4gICAgICAgIGZvcih2YXIga2V5IGluIHRoaXMuY3JlYXRvckhhc2gpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5zb3J0KCk7XG4gICAgfVxuICAgIHB1YmxpYyBjcmVhdGVFbGVtZW50KGVsZW1lbnRUeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IElFbGVtZW50IHtcbiAgICAgICAgdmFyIGNyZWF0b3IgPSB0aGlzLmNyZWF0b3JIYXNoW2VsZW1lbnRUeXBlXTtcbiAgICAgICAgaWYgKGNyZWF0b3IgPT0gbnVsbCkgcmV0dXJuIFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5jcmVhdGVRdWVzdGlvbihlbGVtZW50VHlwZSwgbmFtZSk7XG4gICAgICAgIHJldHVybiBjcmVhdG9yKG5hbWUpO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbmZhY3RvcnkudHMiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0hhc2hUYWJsZX0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFJlYWN0UXVlc3Rpb25GYWN0b3J5IHtcbiAgICBwdWJsaWMgc3RhdGljIEluc3RhbmNlOiBSZWFjdFF1ZXN0aW9uRmFjdG9yeSA9IG5ldyBSZWFjdFF1ZXN0aW9uRmFjdG9yeSgpO1xuICAgIHByaXZhdGUgY3JlYXRvckhhc2g6IEhhc2hUYWJsZTwobmFtZTogc3RyaW5nKSA9PiBKU1guRWxlbWVudD4gPSB7fTtcblxuICAgIHB1YmxpYyByZWdpc3RlclF1ZXN0aW9uKHF1ZXN0aW9uVHlwZTogc3RyaW5nLCBxdWVzdGlvbkNyZWF0b3I6IChuYW1lOiBzdHJpbmcpID0+IEpTWC5FbGVtZW50KSB7XG4gICAgICAgIHRoaXMuY3JlYXRvckhhc2hbcXVlc3Rpb25UeXBlXSA9IHF1ZXN0aW9uQ3JlYXRvcjtcbiAgICB9XG4gICAgcHVibGljIGdldEFsbFR5cGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICAgICAgZm9yKHZhciBrZXkgaW4gdGhpcy5jcmVhdG9ySGFzaCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LnNvcnQoKTtcbiAgICB9XG4gICAgcHVibGljIGNyZWF0ZVF1ZXN0aW9uKHF1ZXN0aW9uVHlwZTogc3RyaW5nLCBwYXJhbXM6IGFueSk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgdmFyIGNyZWF0b3IgPSB0aGlzLmNyZWF0b3JIYXNoW3F1ZXN0aW9uVHlwZV07XG4gICAgICAgIGlmIChjcmVhdG9yID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gY3JlYXRvcihwYXJhbXMpO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uZmFjdG9yeS50c3giLCJpbXBvcnQge0lMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZ30gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7SGFzaFRhYmxlLCBIZWxwZXJzfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQge0l0ZW1WYWx1ZX0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQge0N1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9ufSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cnZleURhdGEge1xuICAgIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueTtcbiAgICBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpO1xuICAgIGdldENvbW1lbnQobmFtZTogc3RyaW5nKTogc3RyaW5nO1xuICAgIHNldENvbW1lbnQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKTtcbiAgICBnZXRBbGxWYWx1ZXMoKTogYW55O1xufVxuZXhwb3J0IGludGVyZmFjZSBJVGV4dFByb2Nlc3NvciB7XG4gICAgcHJvY2Vzc1RleHQodGV4dDogc3RyaW5nLCByZXR1cm5EaXNwbGF5VmFsdWU6IGJvb2xlYW4pOiBzdHJpbmc7XG4gICAgcHJvY2Vzc1RleHRFeCh0ZXh0OiBzdHJpbmcpOiBhbnk7XG59XG5leHBvcnQgaW50ZXJmYWNlIElTdXJ2ZXkgZXh0ZW5kcyBJVGV4dFByb2Nlc3NvciB7XG4gICAgY3VycmVudFBhZ2U6IElQYWdlO1xuICAgIHBhZ2VWaXNpYmlsaXR5Q2hhbmdlZChwYWdlOiBJUGFnZSwgbmV3VmFsdWU6IGJvb2xlYW4pO1xuICAgIHBhbmVsVmlzaWJpbGl0eUNoYW5nZWQocGFuZWw6IElQYW5lbCwgbmV3VmFsdWU6IGJvb2xlYW4pO1xuICAgIHF1ZXN0aW9uVmlzaWJpbGl0eUNoYW5nZWQocXVlc3Rpb246IElRdWVzdGlvbiwgbmV3VmFsdWU6IGJvb2xlYW4pO1xuICAgIHF1ZXN0aW9uQWRkZWQocXVlc3Rpb246IElRdWVzdGlvbiwgaW5kZXg6IG51bWJlciwgcGFyZW50UGFuZWw6IGFueSwgcm9vdFBhbmVsOiBhbnkpO1xuICAgIHBhbmVsQWRkZWQocGFuZWw6IElFbGVtZW50LCBpbmRleDogbnVtYmVyLCBwYXJlbnRQYW5lbDogYW55LCByb290UGFuZWw6IGFueSk7XG4gICAgcXVlc3Rpb25SZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24pO1xuICAgIHBhbmVsUmVtb3ZlZChwYW5lbDogSUVsZW1lbnQpO1xuICAgIHZhbGlkYXRlUXVlc3Rpb24obmFtZTogc3RyaW5nKTogU3VydmV5RXJyb3I7XG4gICAgcHJvY2Vzc0h0bWwoaHRtbDogc3RyaW5nKTogc3RyaW5nO1xuICAgIGlzRGlzcGxheU1vZGU6IGJvb2xlYW47XG4gICAgaXNEZXNpZ25Nb2RlOiBib29sZWFuO1xuICAgIGlzTG9hZGluZ0Zyb21Kc29uOiBib29sZWFuO1xuICAgIHJlcXVpcmVkVGV4dDogc3RyaW5nO1xuICAgIHF1ZXN0aW9uU3RhcnRJbmRleDogc3RyaW5nO1xuICAgIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogc3RyaW5nO1xuICAgIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbjogc3RyaW5nO1xuICAgIGdldFF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSgpOiBzdHJpbmc7XG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IGJvb2xlYW47XG4gICAgdXBsb2FkRmlsZShuYW1lOiBzdHJpbmcsIGZpbGU6IEZpbGUsIHN0b3JlRGF0YUFzVGV4dDogYm9vbGVhbiwgdXBsb2FkaW5nQ2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZykgPT4gYW55KTogYm9vbGVhbjtcbiAgICB1cGRhdGVRdWVzdGlvbkNzc0NsYXNzZXMocXVlc3Rpb246IElRdWVzdGlvbiwgY3NzQ2xhc3NlczogYW55KTtcbiAgICBhZnRlclJlbmRlclF1ZXN0aW9uKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGh0bWxFbGVtZW50KTtcbiAgICBhZnRlclJlbmRlclBhbmVsKHBhbmVsOiBJRWxlbWVudCwgaHRtbEVsZW1lbnQpO1xuICAgIGFmdGVyUmVuZGVyUGFnZShodG1sRWxlbWVudCk7XG4gICAgbWF0cml4Um93QWRkZWQocXVlc3Rpb246IElRdWVzdGlvbik7XG4gICAgbWF0cml4Um93UmVtb3ZlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCByb3dJbmRleDogbnVtYmVyLCByb3c6IGFueSk7XG4gICAgbWF0cml4Q2VsbENyZWF0ZWQocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KTtcbiAgICBtYXRyaXhBZnRlckNlbGxSZW5kZXIocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KTtcbiAgICBtYXRyaXhDZWxsVmFsdWVDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSk7XG4gICAgbWF0cml4Q2VsbFZhbGlkYXRlKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSk6IFN1cnZleUVycm9yO1xufVxuZXhwb3J0IGludGVyZmFjZSBJU3VydmV5SW1wbCB7XG4gICAgZ2VTdXJ2ZXlEYXRhKCk6IElTdXJ2ZXlEYXRhO1xuICAgIGdldFN1cnZleSgpOiBJU3VydmV5O1xuICAgIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3I7XG59XG5leHBvcnQgaW50ZXJmYWNlIElDb25kaXRpb25SdW5uZXIge1xuICAgIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+KTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cnZleUVsZW1lbnQge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCk7XG4gICAgb25TdXJ2ZXlMb2FkKCk7XG59XG5leHBvcnQgaW50ZXJmYWNlIElFbGVtZW50ICBleHRlbmRzIElDb25kaXRpb25SdW5uZXIsIElTdXJ2ZXlFbGVtZW50e1xuICAgIHZpc2libGU6IGJvb2xlYW47XG4gICAgaXNWaXNpYmxlOiBib29sZWFuO1xuICAgIHBhcmVudDogSVBhbmVsO1xuICAgIHJlbmRlcldpZHRoOiBzdHJpbmc7XG4gICAgd2lkdGg6IHN0cmluZztcbiAgICByaWdodEluZGVudDogbnVtYmVyO1xuICAgIHN0YXJ0V2l0aE5ld0xpbmU6IGJvb2xlYW47XG4gICAgaXNQYW5lbDogYm9vbGVhbjtcbiAgICByZW1vdmVFbGVtZW50KGVsOiBJRWxlbWVudCk6IGJvb2xlYW47XG4gICAgb25Mb2NhbGVDaGFuZ2VkKCk7XG4gICAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKTtcbiAgICB1cGRhdGVDdXN0b21XaWRnZXRzKCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVF1ZXN0aW9uIGV4dGVuZHMgSUVsZW1lbnQge1xuICAgIGhhc1RpdGxlOiBib29sZWFuO1xuICAgIHNldFZpc2libGVJbmRleCh2YWx1ZTogbnVtYmVyKTogbnVtYmVyO1xuICAgIG9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBhbnkpO1xuICAgIG9uUmVhZE9ubHlDaGFuZ2VkKCk7XG4gICAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKTogYm9vbGVhbjtcbiAgICBjbGVhclVudXNlZFZhbHVlcygpO1xuICAgIGRpc3BsYXlWYWx1ZTogYW55O1xufVxuZXhwb3J0IGludGVyZmFjZSBJUGFuZWwgZXh0ZW5kcyBJU3VydmV5RWxlbWVudCB7XG4gICAgZ2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk6IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVBhZ2UgZXh0ZW5kcyBJU3VydmV5RWxlbWVudCwgSUNvbmRpdGlvblJ1bm5lciB7XG59XG4vKipcbiAqIFRoZSBiYXNlIGNsYXNzIGZvciBTdXJ2ZXlKUyBvYmplY3RzLlxuICovXG5leHBvcnQgY2xhc3MgQmFzZSB7XG4gICAgcHVibGljIHN0YXRpYyBjb21tZW50UHJlZml4OiBzdHJpbmcgPSBcIi1Db21tZW50XCI7XG4gICAgLyoqXG4gICAgICogQSBzdGF0aWMgbWV0aG9kcyB0aGF0IHJldHVybnMgdHJ1ZSBpZiBhIHZhbHVlIHVuZGVyZmluZWQsIG51bGwsIGVtcHR5IHN0cmluZyBvciBlbXB0eSBhcnJheS5cbiAgICAgKiBAcGFyYW0gdmFsdWUgXG4gICAgICovXG4gICAgcHVibGljIGlzVmFsdWVFbXB0eSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZSk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBJc1Byb3BlcnR5RW1wdHkodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdmFsdWUgIT09IFwiXCIgJiYgdGhpcy5pc1ZhbHVlRW1wdHkodmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJvcGVydHlIYXNoID0ge307XG4gICAgcHJpdmF0ZSBsb2NhbGl6YWJsZVN0cmluZ3MgPSB7fTtcbiAgICBwcml2YXRlIGFycmF5c0luZm8gPSB7fTtcbiAgICBwcml2YXRlIG9uUHJvcENoYW5nZUZ1bmN0aW9ucyA9IFtdO1xuICAgIHByb3RlY3RlZCBpc0xvYWRpbmdGcm9tSnNvblZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIG9uUHJvcGVydHlDaGFuZ2VkOiBFdmVudDwoc2VuZGVyOiBCYXNlLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoc2VuZGVyOiBCYXNlLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAgIHNldFByb3BlcnR5VmFsdWVDb3JlSGFuZGxlcjogKHByb3BlcnRpZXNIYXNoOiBhbnksIG5hbWU6IHN0cmluZywgdmFsOiBhbnkpID0+IHZvaWQ7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcmVhdGVQcm9wZXJ0aWVzKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYXMgYSBzdHJpbmcgYXMgaXQgcmVwcmVzZW50cyBpbiB0aGUganNvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcgeyByZXR1cm4gXCJiYXNlXCI7IH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IHRlbXBsYXRlIG5hbWUgd2l0aG91dCBwcmVmaXguIFR5cGljYWxseSBpdCBlcXVhbHMgdG8gZ2V0VHlwZSgpIFxuICAgICAqIEBzZWUgZ2V0VHlwZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUZW1wbGF0ZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRUeXBlKCk7IH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyBsb2FkaW5nIGZyb20gSnNvbiBhdCB0aGUgY3VycmVudCBtb21lbnQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0xvYWRpbmdGcm9tSnNvbigpIHsgcmV0dXJuIHRoaXMuaXNMb2FkaW5nRnJvbUpzb25WYWx1ZTsgfVxuICAgIHN0YXJ0TG9hZGluZ0Zyb21Kc29uKCkge1xuICAgICAgICB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uVmFsdWUgPSB0cnVlO1xuICAgIH1cbiAgICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nRnJvbUpzb25WYWx1ZSA9IGZhbHNlO1xuICAgIH1cbiAgICBwdWJsaWMgb25Mb2NhbGVDaGFuZ2VkKCkge1xuICAgICAgICBmb3IobGV0IGtleSBpbiB0aGlzLmFycmF5c0luZm8pIHtcbiAgICAgICAgICAgIGxldCBpdGVtID0gdGhpcy5hcnJheXNJbmZvW2tleV07XG4gICAgICAgICAgICBpZihpdGVtICYmIGl0ZW0uaXNJdGVtVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyciA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShrZXkpO1xuICAgICAgICAgICAgICAgIGlmKGFycikgSXRlbVZhbHVlLk5vdGlmeUFycmF5T25Mb2NhbGVDaGFuZ2VkKGFycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yKGxldCBrZXkgaW4gdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3MpIHtcbiAgICAgICAgICAgIGxldCBpdGVtID0gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhrZXkpO1xuICAgICAgICAgICAgaWYoaXRlbSkgaXRlbS5vbkNoYW5nZWQoKTtcbiAgICAgICAgfVxuICAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgYnkgbmFtZVxuICAgICAqIEBwYXJhbSBuYW1lIHByb3BlcnR5IG5hbWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UHJvcGVydHlWYWx1ZShuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogYW55ID0gbnVsbCk6IGFueSB7IFxuICAgICAgICB2YXIgcmVzID0gdGhpcy5wcm9wZXJ0eUhhc2hbbmFtZV07XG4gICAgICAgIGlmKHRoaXMuSXNQcm9wZXJ0eUVtcHR5KHJlcykgJiYgZGVmYXVsdFZhbHVlICE9IG51bGwpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIHJldHVybiByZXM7IFxuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0UHJvcGVydHlWYWx1ZUNvcmUocHJvcGVydGllc0hhc2g6IGFueSwgbmFtZTogc3RyaW5nLCB2YWw6IGFueSkge1xuICAgICAgICBpZih0aGlzLnNldFByb3BlcnR5VmFsdWVDb3JlSGFuZGxlcikgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXIocHJvcGVydGllc0hhc2gsIG5hbWUsIHZhbCk7XG4gICAgICAgIGVsc2UgcHJvcGVydGllc0hhc2hbbmFtZV0gPSB2YWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHNldCBwcm9wZXJ0eSB2YWx1ZVxuICAgICAqIEBwYXJhbSBuYW1lIHByb3BlcnR5IG5hbWVcbiAgICAgKiBAcGFyYW0gdmFsIG5ldyBwcm9wZXJ0eSB2YWx1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRQcm9wZXJ0eVZhbHVlKG5hbWU6IHN0cmluZywgdmFsOiBhbnkpIHsgXG4gICAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMucHJvcGVydHlIYXNoW25hbWVdO1xuICAgICAgICBpZihvbGRWYWx1ZSAmJiBBcnJheS5pc0FycmF5KG9sZFZhbHVlKSkge1xuICAgICAgICAgICAgaWYodGhpcy5pc1R3b1ZhbHVlRXF1YWxzKG9sZFZhbHVlLCB2YWwpKSByZXR1cm47XG4gICAgICAgICAgICB2YXIgYXJyYXlJbmZvID0gdGhpcy5hcnJheXNJbmZvW25hbWVdO1xuICAgICAgICAgICAgdGhpcy5zZXRBcnJheShvbGRWYWx1ZSwgdmFsLCBhcnJheUluZm8gPyBhcnJheUluZm8uaXNJdGVtVmFsdWVzIDogZmFsc2UsIGFycmF5SW5mbyA/IGFycmF5SW5mby5vblB1c2ggOiBudWxsKTtcbiAgICAgICAgICAgIHRoaXMucHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgb2xkVmFsdWUsIG9sZFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZUNvcmUodGhpcy5wcm9wZXJ0eUhhc2gsIG5hbWUsIHZhbCk7XG4gICAgICAgICAgICBpZighdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKG9sZFZhbHVlLCB2YWwpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBvbGRWYWx1ZSwgdmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nLCBvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KSB7XG4gICAgICAgIGlmKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICAgICAgdGhpcy5vblByb3BlcnR5Q2hhbmdlZC5maXJlKHRoaXMsIHtuYW1lOiBuYW1lLCBvbGRWYWx1ZTogb2xkVmFsdWUsIG5ld1ZhbHVlOiBuZXdWYWx1ZX0pO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICBpZih0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9uc1tpXS5uYW1lID09IG5hbWUpIHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zW2ldLmZ1bmMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gYSBwcm9wZXJ0eSB2YWx1ZSBjaGFuZ2VkLlxuICAgICAqIEBwYXJhbSBuYW1lIHRoZSBwcm9wZXJ0eSBuYW1lXG4gICAgICogQHBhcmFtIGZ1bmMgdGhlIGZ1bmN0aW9uIHdpdGggbm8gcGFyYW1ldGVycyB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIHByb3BlcnR5IGNoYW5nZWQuXG4gICAgICogQHBhcmFtIGtleSBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuIElmIHRoZXJlIGlzIGFscmVhZHkgYSByZWdpc3RlcmVkIGZ1bmN0aW9uIGZvciB0aGlzIHByb3BlcnR5IHdpdGh0IHRoZSBzYW1lIGtleSwgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nLCBmdW5jOiBhbnksIGtleTogc3RyaW5nID0gbnVsbCkge1xuICAgICAgICBpZihrZXkpIHtcbiAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9ucy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zW2ldO1xuICAgICAgICAgICAgICAgIGlmKGl0ZW0ubmFtZSA9PSBuYW1lICYmIGl0ZW0ua2V5ID09IGtleSkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmZ1bmMgPSBmdW5jO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zLnB1c2goe25hbWU6IG5hbWUsIGZ1bmM6IGZ1bmMsIGtleToga2V5fSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBhIHByb3BlcnR5IHZhbHVlIGNoYW5nZWQgZnJvbSB0aGUgbmFtZXMgbGlzdC5cbiAgICAgKiBAcGFyYW0gbmFtZXMgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyBuYW1lc1xuICAgICAqIEBwYXJhbSBmdW5jIHRoZSBmdW5jdGlvbiB3aXRoIG5vIHBhcmFtZXRlcnMgdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBwcm9wZXJ0eSBjaGFuZ2VkLlxuICAgICAqIEBwYXJhbSBrZXkgYW4gb3B0aW9uYWwgcGFyYW1ldGVyLiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgcmVnaXN0ZXJlZCBmdW5jdGlvbiBmb3IgdGhpcyBwcm9wZXJ0eSB3aXRodCB0aGUgc2FtZSBrZXksIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQobmFtZXM6IEFycmF5PHN0cmluZz4sIGZ1bmM6IGFueSwga2V5OiBzdHJpbmcgPSBudWxsKSB7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZXNbaV0sIGZ1bmMsIGtleSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlciBub3RpZmljYXRpb24gb24gcHJvcGVydHkgdmFsdWUgY2hhbmdlZFxuICAgICAqIEBwYXJhbSBuYW1lIHRoZSBwcm9wZXJ0eSBuYW1lXG4gICAgICogQHBhcmFtIGtleSB0aGUga2V5IHdpdGggd2hpY2ggeW91IGhhdmUgcmVnaXN0ZXJlZCB0aGUgbm90aWZpY2F0aW9uIGZvciB0aGlzIHByb3BlcnR5LiBJdCBjYW4gYmUgbnVsbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdW5SZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nID0gbnVsbCkge1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zW2ldO1xuICAgICAgICAgICAgaWYoaXRlbS5uYW1lID09IG5hbWUgJiYgaXRlbS5rZXkgPT0ga2V5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBVbnJlZ2lzdGVyIG5vdGlmaWNhdGlvbiBvbiBwcm9wZXJ0eSB2YWx1ZSBjaGFuZ2VkIGZvciBhbGwgcHJvcGVydGllcyBpbiB0aGUgbmFtZXMgbGlzdC5cbiAgICAgKiBAcGFyYW0gbmFtZXMgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyBuYW1lc1xuICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleSB3aXRoIHdoaWNoIHlvdSBoYXZlIHJlZ2lzdGVyZWQgdGhlIG5vdGlmaWNhdGlvbiBmb3IgdGhpcyBwcm9wZXJ0eS4gSXQgY2FuIGJlIG51bGwuXG4gICAgICovXG4gICAgcHVibGljIHVuUmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChuYW1lczogQXJyYXk8c3RyaW5nPiwga2V5OiBzdHJpbmcgPSBudWxsKSB7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIHRoaXMudW5SZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lc1tpXSwga2V5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgY3JlYXRlTG9jYWxpemFibGVTdHJpbmcobmFtZTogc3RyaW5nLCBvd25lcjogSUxvY2FsaXphYmxlT3duZXIsIHVzZU1hcmtEb3duOiBib29sZWFuID0gZmFsc2UpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgICAgIHZhciBsb2NTdHIgPSBuZXcgTG9jYWxpemFibGVTdHJpbmcob3duZXIsIHVzZU1hcmtEb3duKTtcbiAgICAgICAgdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3NbbmFtZV0gPSBsb2NTdHI7XG4gICAgICAgIHJldHVybiBsb2NTdHI7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRMb2NhbGl6YWJsZVN0cmluZyhuYW1lOiBzdHJpbmcpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsaXphYmxlU3RyaW5nc1tuYW1lXTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldExvY2FsaXphYmxlU3RyaW5nVGV4dChuYW1lOiBzdHJpbmcsIGRlZmF1bHRTdHI6IHN0cmluZyA9IFwiXCIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgbG9jU3RyID0gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhuYW1lKTtcbiAgICAgICAgaWYoIWxvY1N0cikgcmV0dXJuIFwiXCI7XG4gICAgICAgIHZhciByZXMgPSBsb2NTdHIudGV4dDtcbiAgICAgICAgcmV0dXJuIHJlcyA/IHJlcyA6IGRlZmF1bHRTdHI7XG4gICAgfVxuICAgIHByb3RlY3RlZCBzZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHZhciBsb2NTdHIgPSB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKG5hbWUpO1xuICAgICAgICBpZighbG9jU3RyKSByZXR1cm47XG4gICAgICAgIHZhciBvbGRWYWx1ZSA9IGxvY1N0ci50ZXh0O1xuICAgICAgICBpZihvbGRWYWx1ZSA9PT0gdmFsdWUpIHJldHVybjtcbiAgICAgICAgbG9jU3RyLnRleHQgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBvbGRWYWx1ZSwgdmFsdWUpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgY3JlYXRlSXRlbVZhbHVlcyhuYW1lOiBzdHJpbmcpOiBBcnJheTxhbnk+IHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5jcmVhdGVOZXdBcnJheShuYW1lLCBmdW5jdGlvbihpdGVtKSB7IGl0ZW0ubG9jT3duZXIgPSBzZWxmO30gKTtcbiAgICAgICAgdGhpcy5hcnJheXNJbmZvW25hbWVdLmlzSXRlbVZhbHVlcyA9IHRydWU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHByb3RlY3RlZCBjcmVhdGVOZXdBcnJheShuYW1lOiBzdHJpbmcsIG9uUHVzaDogYW55ID0gbnVsbCwgb25SZW1vdmU6IGFueSA9IG51bGwpOiBBcnJheTxhbnk+IHtcbiAgICAgICAgdmFyIG5ld0FycmF5ID0gbmV3IEFycmF5PGFueT4oKTtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlQ29yZSh0aGlzLnByb3BlcnR5SGFzaCwgbmFtZSwgbmV3QXJyYXkpO1xuICAgICAgICB0aGlzLmFycmF5c0luZm9bbmFtZV0gPSB7IG9uUHVzaDogb25QdXNoLCBpc0l0ZW1WYWx1ZXMgOiBmYWxzZSB9O1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIG5ld0FycmF5LnB1c2ggPSBmdW5jdGlvbiAodmFsdWUpOiBudW1iZXIgeyBcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUucHVzaC5jYWxsKG5ld0FycmF5LCB2YWx1ZSk7XG4gICAgICAgICAgICBpZihvblB1c2gpIG9uUHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICBzZWxmLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG5ld0FycmF5LCBuZXdBcnJheSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgICBuZXdBcnJheS5wb3AgPSBmdW5jdGlvbiAoKTogbnVtYmVyIHsgXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gQXJyYXkucHJvdG90eXBlLnBvcC5jYWxsKG5ld0FycmF5KTtcbiAgICAgICAgICAgIGlmKG9uUmVtb3ZlKSBvblJlbW92ZShyZXN1bHQpO1xuICAgICAgICAgICAgc2VsZi5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBuZXdBcnJheSwgbmV3QXJyYXkpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfTtcbiAgICAgICAgbmV3QXJyYXkuc3BsaWNlID0gZnVuY3Rpb24gKHN0YXJ0PzogbnVtYmVyLCBkZWxldGVDb3VudD86IG51bWJlciwgLi4uaXRlbXM6IGFueVtdKTogYW55W10ge1xuICAgICAgICAgICAgaWYoIXN0YXJ0KSBzdGFydCA9IDA7XG4gICAgICAgICAgICBpZighZGVsZXRlQ291bnQpIGRlbGV0ZUNvdW50ID0gMDtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwobmV3QXJyYXksIHN0YXJ0LCBkZWxldGVDb3VudCwgLi4uIGl0ZW1zKTtcbiAgICAgICAgICAgIGlmKCFpdGVtcykgaXRlbXMgPSBbXTtcbiAgICAgICAgICAgIGlmKG9uUmVtb3ZlICYmIHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uUmVtb3ZlKHJlc3VsdFtpXSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihvblB1c2gpIHtcbiAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uUHVzaChpdGVtc1tpXSwgc3RhcnQgKyBpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxmLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG5ld0FycmF5LCBuZXdBcnJheSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBuZXdBcnJheTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldEFycmF5KHNyYzogYW55W10sIGRlc3Q6IGFueVtdLCBpc0l0ZW1WYWx1ZXM6IGJvb2xlYW4sIG9uUHVzaDogYW55KSB7XG4gICAgICAgIHNyYy5sZW5ndGggPSAwO1xuICAgICAgICBpZighZGVzdCkgcmV0dXJuO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgZGVzdC5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIGlmKGlzSXRlbVZhbHVlcykge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtID0gZGVzdFtpXTtcbiAgICAgICAgICAgICAgICBpdGVtID0gbmV3IEl0ZW1WYWx1ZShudWxsKTtcbiAgICAgICAgICAgICAgICBpdGVtLnNldERhdGEoZGVzdFtpXSk7XG4gICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guY2FsbChzcmMsIGl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5jYWxsKHNyYywgZGVzdFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihvblB1c2gpIG9uUHVzaChzcmNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb3RlY3RlZCBpc1R3b1ZhbHVlRXF1YWxzKHg6IGFueSwgeTogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh4ID09PSB5KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCEoeCBpbnN0YW5jZW9mIE9iamVjdCkgfHwgISh5IGluc3RhbmNlb2YgT2JqZWN0KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBwIGluIHgpIHtcbiAgICAgICAgICAgIGlmICgheC5oYXNPd25Qcm9wZXJ0eShwKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIXkuaGFzT3duUHJvcGVydHkocCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmICh4W3BdID09PSB5W3BdKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHhbcF0pICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNUd29WYWx1ZUVxdWFscyh4W3BdLCB5W3BdKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAocCBpbiB5KSB7XG4gICAgICAgICAgICBpZiAoeS5oYXNPd25Qcm9wZXJ0eShwKSAmJiAheC5oYXNPd25Qcm9wZXJ0eShwKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlFcnJvciB7XG4gICAgcHVibGljIGdldFRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBpcyBhYnN0cmFjdCcpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleUVsZW1lbnQgZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgSVN1cnZleUVsZW1lbnQge1xuICAgIHByaXZhdGUgc3VydmV5SW1wbFZhbHVlOiBJU3VydmV5SW1wbDtcbiAgICBwcml2YXRlIHN1cnZleURhdGFWYWx1ZTogSVN1cnZleURhdGE7XG4gICAgcHJpdmF0ZSBzdXJ2ZXlWYWx1ZTogSVN1cnZleTtcbiAgICBwcml2YXRlIHRleHRQcm9jZXNzb3JWYWx1ZTogSVRleHRQcm9jZXNzb3I7XG4gICAgcHJpdmF0ZSBzZWxlY3RlZEVsZW1lbnRJbkRlc2lnblZhbHVlOiBTdXJ2ZXlFbGVtZW50ID0gdGhpcztcbiAgICBwdWJsaWMgc3RhdGljIFNjcm9sbEVsZW1lbnRUb1RvcChlbGVtZW50SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWVsZW1lbnRJZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpO1xuICAgICAgICBpZiAoIWVsIHx8ICFlbC5zY3JvbGxJbnRvVmlldykgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZWxlbVRvcCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgICAgaWYgKGVsZW1Ub3AgPCAwKSAgZWwuc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAgICAgcmV0dXJuIGVsZW1Ub3AgPCAwO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIEdldEZpcnN0Tm9uVGV4dEVsZW1lbnQoZWxlbWVudHM6IGFueSkge1xuICAgICAgICBpZiAoIWVsZW1lbnRzIHx8ICFlbGVtZW50cy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLm5vZGVOYW1lICE9IFwiI3RleHRcIiAmJiBlbGVtZW50c1tpXS5ub2RlTmFtZSAhPSBcIiNjb21tZW50XCIpIHJldHVybiBlbGVtZW50c1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBGb2N1c0VsZW1lbnQoZWxlbWVudElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFlbGVtZW50SWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTtcbiAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICBlbC5mb2N1cygpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHNldFZpc2libGVJbmRleChxdWVzdGlvbnM6IEFycmF5PElRdWVzdGlvbj4sIGluZGV4OiBudW1iZXIsIHNob3dJbmRleDogYm9vbGVhbik6IG51bWJlciB7XG4gICAgICAgIHZhciBzdGFydEluZGV4ID0gaW5kZXg7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICB2YXIgcSA9IHF1ZXN0aW9uc1tpXTtcbiAgICAgICAgICAgIGlmKCFzaG93SW5kZXggfHwgIXEudmlzaWJsZSB8fCAhcS5oYXNUaXRsZSkge1xuICAgICAgICAgICAgICAgIHEuc2V0VmlzaWJsZUluZGV4KC0xKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5kZXggKz0gcS5zZXRWaXNpYmxlSW5kZXgoaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmRleCAtIHN0YXJ0SW5kZXg7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgcHVibGljIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKSB7XG4gICAgICAgIHRoaXMuc3VydmV5SW1wbFZhbHVlID0gdmFsdWU7XG4gICAgICAgIGlmKCF0aGlzLnN1cnZleUltcGxWYWx1ZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnN1cnZleURhdGFWYWx1ZSA9IHRoaXMuc3VydmV5SW1wbFZhbHVlLmdlU3VydmV5RGF0YSgpO1xuICAgICAgICB0aGlzLnN1cnZleVZhbHVlID0gdGhpcy5zdXJ2ZXlJbXBsVmFsdWUuZ2V0U3VydmV5KCk7XG4gICAgICAgIHRoaXMudGV4dFByb2Nlc3NvclZhbHVlID0gdGhpcy5zdXJ2ZXlJbXBsVmFsdWUuZ2V0VGV4dFByb2Nlc3NvcigpO1xuICAgICAgICB0aGlzLm9uU2V0RGF0YSgpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0IHN1cnZleUltcGwoKSB7IHJldHVybiB0aGlzLnN1cnZleUltcGxWYWx1ZTsgfVxuICAgIHB1YmxpYyBnZXQgZGF0YSgpOiBJU3VydmV5RGF0YSB7IHJldHVybiB0aGlzLnN1cnZleURhdGFWYWx1ZTsgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN1cnZleSBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGdldCBzdXJ2ZXkoKTogSVN1cnZleSB7IHJldHVybiB0aGlzLnN1cnZleVZhbHVlOyB9XG4gICAgcHVibGljIGdldCBpc0xvYWRpbmdGcm9tSnNvbigpIHsgXG4gICAgICAgIGlmKHRoaXMuc3VydmV5KSByZXR1cm4gdGhpcy5zdXJ2ZXkuaXNMb2FkaW5nRnJvbUpzb247XG4gICAgICAgIHJldHVybiB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uVmFsdWU7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRFbGVtZW50c0luRGVzaWduKGluY2x1ZGVIaWRkZW46IGJvb2xlYW4gPSBmYWxzZSk6IEFycmF5PElFbGVtZW50PiB7IHJldHVybiBbXTsgfVxuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWRFbGVtZW50SW5EZXNpZ24oKTogU3VydmV5RWxlbWVudCB7IHJldHVybiB0aGlzLnNlbGVjdGVkRWxlbWVudEluRGVzaWduVmFsdWU7IH1cbiAgICBwdWJsaWMgc2V0IHNlbGVjdGVkRWxlbWVudEluRGVzaWduKHZhbDogU3VydmV5RWxlbWVudCkgeyB0aGlzLnNlbGVjdGVkRWxlbWVudEluRGVzaWduVmFsdWUgPSB2YWw7IH1cbiAgICBwdWJsaWMgdXBkYXRlQ3VzdG9tV2lkZ2V0cygpIHsgfVxuXG4gICAgcHVibGljIG9uU3VydmV5TG9hZCgpIHt9ICAgICAgICBcbiAgICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgICAgIHN1cGVyLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgICAgICBpZighdGhpcy5zdXJ2ZXkpIHtcbiAgICAgICAgICAgIHRoaXMub25TdXJ2ZXlMb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldCB0ZXh0UHJvY2Vzc29yKCkgOiBJVGV4dFByb2Nlc3NvciB7IHJldHVybiB0aGlzLnRleHRQcm9jZXNzb3JWYWx1ZTsgfVxuICAgIHByb3RlY3RlZCBnZXRQcm9jZXNzZWRIdG1sKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmKCFodG1sIHx8ICF0aGlzLnRleHRQcm9jZXNzb3IpIHJldHVybiBodG1sO1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0UHJvY2Vzc29yLnByb2Nlc3NUZXh0KGh0bWwsIHRydWUpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgb25TZXREYXRhKCkgeyB9ICAgIFxufVxuXG5leHBvcnQgY2xhc3MgRXZlbnQ8VCBleHRlbmRzIEZ1bmN0aW9uLCBPcHRpb25zPiAge1xuICAgIHByaXZhdGUgY2FsbGJhY2tzOiBBcnJheTxUPjtcbiAgICBwdWJsaWMgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmNhbGxiYWNrcyA9PSBudWxsIHx8IHRoaXMuY2FsbGJhY2tzLmxlbmd0aCA9PSAwOyB9XG4gICAgcHVibGljIGZpcmUoc2VuZGVyOiBhbnksIG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2tzID09IG51bGwpIHJldHVybjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNhbGxiYWNrcy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIHZhciBjYWxsUmVzdWx0ID0gdGhpcy5jYWxsYmFja3NbaV0oc2VuZGVyLCBvcHRpb25zKTtcblxuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhZGQoZnVuYzogVCkge1xuICAgICAgICBpZiAodGhpcy5jYWxsYmFja3MgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja3MgPSBuZXcgQXJyYXk8VD4oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKGZ1bmMpO1xuICAgIH1cbiAgICBwdWJsaWMgcmVtb3ZlKGZ1bmM6IFQpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2tzID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5jYWxsYmFja3MuaW5kZXhPZihmdW5jLCAwKTtcbiAgICAgICAgaWYgKGluZGV4ICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvYmFzZS50cyIsImltcG9ydCB7SGFzaFRhYmxlfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQge0pzb25PYmplY3R9IGZyb20gJy4vanNvbm9iamVjdCc7XG5pbXBvcnQge1F1ZXN0aW9uQmFzZX0gZnJvbSAnLi9xdWVzdGlvbmJhc2UnO1xuaW1wb3J0IHtCYXNlLCBTdXJ2ZXlFcnJvciwgU3VydmV5RWxlbWVudH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7QW5zd2VyUmVxdWlyZWRFcnJvcn0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7U3VydmV5VmFsaWRhdG9yLCBJVmFsaWRhdG9yT3duZXIsIFZhbGlkYXRvclJ1bm5lcn0gZnJvbSBcIi4vdmFsaWRhdG9yXCI7XG5pbXBvcnQge1RleHRQcmVQcm9jZXNzb3J9IGZyb20gXCIuL3RleHRQcmVQcm9jZXNzb3JcIjtcbmltcG9ydCB7SUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHtDb25kaXRpb25SdW5uZXJ9IGZyb20gJy4vY29uZGl0aW9ucyc7XG5cbi8qKlxuICogRXh0ZW5kcyBxdWVzdGlvbiBiYXNlIGNsYXNzIHdpdGggdGl0bGUsIHZhbHVlLCBlcnJvcnMgYW5kIG90aGVyIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uIGV4dGVuZHMgUXVlc3Rpb25CYXNlIGltcGxlbWVudHMgSVZhbGlkYXRvck93bmVyIHtcbiAgICBwcml2YXRlIHF1ZXN0aW9uVmFsdWU6IGFueTtcbiAgICBwcml2YXRlIHF1ZXN0aW9uQ29tbWVudDogc3RyaW5nO1xuICAgIHByaXZhdGUgdGV4dFByZVByb2Nlc3NvcjogVGV4dFByZVByb2Nlc3NvcjtcbiAgICBwcml2YXRlIGNvbmRpdGlvbkVuYWJlbFJ1bm5lcjogQ29uZGl0aW9uUnVubmVyO1xuICAgIHByaXZhdGUgZXJyb3JzVmFsdWU6IEFycmF5PFN1cnZleUVycm9yPiA9IFtdO1xuICAgIHByaXZhdGUgdmFsaWRhdG9yc1ZhbHVlOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+ID0gdGhpcy5jcmVhdGVOZXdBcnJheShcInZhbGlkYXRvcnNcIik7XG4gICAgdmFsdWVDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gICAgY29tbWVudENoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgICBlcnJvcnNDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gICAgdGl0bGVDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gICAgdmFsaWRhdGVWYWx1ZUNhbGxiYWNrOiAoKSA9PiBTdXJ2ZXlFcnJvcjtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIobmFtZSk7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIGxvY1RpdGxlVmFsdWUgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwidGl0bGVcIiwgdGhpcywgdHJ1ZSk7XG4gICAgICAgIGxvY1RpdGxlVmFsdWUub25SZW5kZXJlZEh0bWxDYWxsYmFjayA9IGZ1bmN0aW9uKHRleHQpIHsgcmV0dXJuIHNlbGYuZnVsbFRpdGxlOyB9O1xuICAgICAgICB2YXIgbG9jRGVzY3JpcHRpb25WYWx1ZSA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJkZXNjcmlwdGlvblwiLCB0aGlzLCB0cnVlKTtcbiAgICAgICAgbG9jRGVzY3JpcHRpb25WYWx1ZS5vbkdldFRleHRDYWxsYmFjayA9IGZ1bmN0aW9uKGh0bWwpIHsgcmV0dXJuIHNlbGYuZ2V0UHJvY2Vzc2VkSHRtbChodG1sKTsgfVxuICAgICAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29tbWVudFRleHRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJyZXF1aXJlZEVycm9yVGV4dFwiLCB0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBxdWVzdGlvbiBtYXkgaGF2ZSBhIHRpdGxlIGxvY2F0ZWQgb24gdGhlIGxlZnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzQWxsb3dUaXRsZUxlZnQoKTogYm9vbGVhbiB7IHJldHVybiB0cnVlOyB9XG4gICAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHsgcmV0dXJuIFwicXVlc3Rpb25cIjsgfVxuICAgIHB1YmxpYyBnZXQgaGFzVGl0bGUoKTogYm9vbGVhbiB7IHJldHVybiB0cnVlOyB9XG4gICAgcHVibGljIGdldCBoYXNEZXNjcmlwdGlvbigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb24gIT0gXCJcIjsgfVxuICAgIHB1YmxpYyBnZXQgdGl0bGVMb2NhdGlvbigpIDogc3RyaW5nIHtcbiAgICAgICAgdmFyIGxvY2F0aW9uID0gXCJ0b3BcIjtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBsb2NhdGlvbiA9IHRoaXMucGFyZW50LmdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgICAgICAgIGxvY2F0aW9uID0gdGhpcy5zdXJ2ZXkucXVlc3Rpb25UaXRsZUxvY2F0aW9uICAgICAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9jYXRpb24gPT09IFwibGVmdFwiICYmICF0aGlzLmlzQWxsb3dUaXRsZUxlZnQpIGxvY2F0aW9uID0gXCJ0b3BcIjtcblxuICAgICAgICByZXR1cm4gbG9jYXRpb247IFxuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGVycm9yTG9jYXRpb24oKSA6IHN0cmluZyB7IHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LnF1ZXN0aW9uRXJyb3JMb2NhdGlvbiA6IFwidG9wXCI7IH1cbiAgICBwdWJsaWMgZ2V0IGhhc0lucHV0KCk6IGJvb2xlYW4geyByZXR1cm4gdHJ1ZTsgfVxuICAgIHB1YmxpYyBnZXQgaW5wdXRJZCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5pZCArIFwiaVwiOyB9XG4gICAgLyoqIFxuICAgICAqIFF1ZXN0aW9uIHRpdGxlLiBVc2Ugc3VydmV5IHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIHRpdGxlIHF1ZXN0aW9uIGlzIHJlbmRlcmVkLiBJZiBpdCBpcyBlbXB0eSwgdGhlbiBxdWVzdGlvbiBuYW1lIHByb3BlcnR5IGlzIHVzZWQuXG4gICAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblRpdGxlVGVtcGxhdGVcbiAgICAqL1xuICAgIHB1YmxpYyBnZXQgdGl0bGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGl0bGVcIiwgdGhpcy5uYW1lKTtcbiAgICB9XG4gICAgcHVibGljIHNldCB0aXRsZSh2YWw6IHN0cmluZykge1xuICAgICAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRpdGxlXCIsIHZhbCk7XG4gICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMudGl0bGVDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH1cbiAgICBnZXQgbG9jVGl0bGUoKTogTG9jYWxpemFibGVTdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInRpdGxlXCIpOyB9XG4gICAgLyoqXG4gICAgICogUXVlc3Rpb24gZGVzY3JpcHRpb24uIEl0IHJlbmRlcnMgdW5kZXIgcXVlc3Rpb24gdGl0bGUgYnkgdXNpbmcgc21hbGxlciBmb250LiBVbmxpa2UgdGhlIHRpdGxlLCBkZXNjcmlwdGlvbiBjYW4gYmUgZW1wdHkuXG4gICAgICogQHNlZSB0aXRsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiZGVzY3JpcHRpb25cIik7IH1cbiAgICBwdWJsaWMgc2V0IGRlc2NyaXB0aW9uKHZhbDogIHN0cmluZykgeyB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImRlc2NyaXB0aW9uXCIsIHZhbCk7IH1cbiAgICBnZXQgbG9jRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImRlc2NyaXB0aW9uXCIpOyB9XG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZXh0IHRoYXQgd2lsbCBiZSBzaG93biBvbiByZXF1aXJlZCBlcnJvci4gVXNlIHRoaXMgcHJvcGVydHksIGlmIHlvdSBkbyBub3Qgd2FudCB0byBzaG93IHRoZSBkZWZhdWx0IHRleHQuXG4gICAgICovXG4gICAgcHVibGljIGdldCByZXF1aXJlZEVycm9yVGV4dCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJyZXF1aXJlZEVycm9yVGV4dFwiKTsgfVxuICAgIHB1YmxpYyBzZXQgcmVxdWlyZWRFcnJvclRleHQodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJyZXF1aXJlZEVycm9yVGV4dFwiLCB2YWwpOyB9XG4gICAgZ2V0IGxvY1JlcXVpcmVkRXJyb3JUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJyZXF1aXJlZEVycm9yVGV4dFwiKTsgfVxuICAgIC8qKiBcbiAgICAgKiBVc2UgaXQgdG8gZ2V0IG9yIHNldCB0aGUgY29tbWVudCB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbW1lbnRUZXh0KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbW1lbnRUZXh0XCIsIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlckl0ZW1UZXh0XCIpKTsgfVxuICAgIHB1YmxpYyBzZXQgY29tbWVudFRleHQodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21tZW50VGV4dFwiLCB2YWwpIH1cbiAgICBnZXQgbG9jQ29tbWVudFRleHQoKTogTG9jYWxpemFibGVTdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImNvbW1lbnRUZXh0XCIpOyB9XG4gICAgcHJpdmF0ZSBnZXQgbG9jVGl0bGVIdG1sKCk6IHN0cmluZyB7XG4gICAgICAgIHZhciByZXMgPSB0aGlzLmxvY1RpdGxlLnRleHRPckh0bWw7XG4gICAgICAgIHJldHVybiByZXM/IHJlczogdGhpcy5uYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiBxdWVzdGlvbiBlcnJvcnMgc3VydmV5LiBGb3Igc29tZSBxdWVzdGlvbnMgbGlrZSBtYXRyaXggYW5kIHBhbmVsIGR5bmFtaWMgaXQgaW5jbHVkZXMgdGhlIGVycm9ycyBvZiBuZXN0ZWQgcXVlc3Rpb25zLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRBbGxFcnJvcnMoKTogQXJyYXk8U3VydmV5RXJyb3I+IHsgcmV0dXJuIHRoaXMuZXJyb3JzLnNsaWNlKCk7IH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSByZW5kcmVkIHF1ZXN0aW9uIHRpdGxlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcHJvY2Vzc2VkVGl0bGUoKSB7IHJldHVybiB0aGlzLmdldFByb2Nlc3NlZEh0bWwodGhpcy5sb2NUaXRsZUh0bWwpOyB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdGl0bGUgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgcXVlc3Rpb24gdGVtcGxhdGUuXG4gICAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblRpdGxlVGVtcGxhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZ1bGxUaXRsZSgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuZ2V0UXVlc3Rpb25UaXRsZVRlbXBsYXRlKCkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy50ZXh0UHJlUHJvY2Vzc29yKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHRoaXMudGV4dFByZVByb2Nlc3NvciA9IG5ldyBUZXh0UHJlUHJvY2Vzc29yKCk7XG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yLm9uSGFzVmFsdWUgPSBmdW5jdGlvbiAobmFtZTogc3RyaW5nKSB7IHJldHVybiBzZWxmLmNhblByb2Nlc3NlZFRleHRWYWx1ZXMobmFtZS50b0xvd2VyQ2FzZSgpKTsgfTtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3Iub25Qcm9jZXNzID0gZnVuY3Rpb24gKG5hbWU6IHN0cmluZykgeyByZXR1cm4gc2VsZi5nZXRQcm9jZXNzZWRUZXh0VmFsdWUobmFtZSk7IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50ZXh0UHJlUHJvY2Vzc29yLnByb2Nlc3ModGhpcy5zdXJ2ZXkuZ2V0UXVlc3Rpb25UaXRsZVRlbXBsYXRlKCkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXF1aXJlVGV4dCA9IHRoaXMucmVxdWlyZWRUZXh0O1xuICAgICAgICBpZiAocmVxdWlyZVRleHQpIHJlcXVpcmVUZXh0ICs9IFwiIFwiO1xuICAgICAgICB2YXIgbm8gPSB0aGlzLm5vO1xuICAgICAgICBpZiAobm8pIG5vICs9IFwiLiBcIjtcbiAgICAgICAgcmV0dXJuIG5vICsgcmVxdWlyZVRleHQgKyB0aGlzLnByb2Nlc3NlZFRpdGxlO1xuICAgIH1cbiAgICBwdWJsaWMgZm9jdXMob25FcnJvcjogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIFN1cnZleUVsZW1lbnQuU2Nyb2xsRWxlbWVudFRvVG9wKHRoaXMuaWQpO1xuICAgICAgICB2YXIgaWQgPSAhb25FcnJvciA/IHRoaXMuZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpIDogdGhpcy5nZXRGaXJzdEVycm9ySW5wdXRFbGVtZW50SWQoKTtcbiAgICAgICAgaWYgKFN1cnZleUVsZW1lbnQuRm9jdXNFbGVtZW50KGlkKSkge1xuICAgICAgICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5mb2N1c0NhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgdXBkYXRlQ3NzQ2xhc3NlcyhyZXM6IGFueSwgc3VydmV5Q3NzOiBhbnkpIHsgXG4gICAgICAgIHN1cGVyLnVwZGF0ZUNzc0NsYXNzZXMocmVzLCBzdXJ2ZXlDc3MpO1xuICAgICAgICBpZih0aGlzLmlzUmVxdWlyZWQpIHtcbiAgICAgICAgICAgIGlmKHN1cnZleUNzcy5xdWVzdGlvbi5yZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgIHJlcy5yb290ICs9IFwiIFwiICsgc3VydmV5Q3NzLnF1ZXN0aW9uLnJlcXVpcmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoc3VydmV5Q3NzLnF1ZXN0aW9uLnRpdGxlUmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICByZXMudGl0bGUgKz0gXCIgXCIgKyBzdXJ2ZXlDc3MucXVlc3Rpb24udGl0bGVSZXF1aXJlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnB1dElkO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0Rmlyc3RFcnJvcklucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEZpcnN0SW5wdXRFbGVtZW50SWQoKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGNhblByb2Nlc3NlZFRleHRWYWx1ZXMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBuYW1lID09IFwibm9cIiB8fCBuYW1lID09IFwidGl0bGVcIiB8fCBuYW1lID09IFwicmVxdWlyZVwiO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIGlmIChuYW1lID09IFwibm9cIikgcmV0dXJuIHRoaXMubm87XG4gICAgICAgIGlmIChuYW1lID09IFwidGl0bGVcIikgcmV0dXJuIHRoaXMucHJvY2Vzc2VkVGl0bGU7XG4gICAgICAgIGlmIChuYW1lID09IFwicmVxdWlyZVwiKSByZXR1cm4gdGhpcy5yZXF1aXJlZFRleHQ7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBwdWJsaWMgc3VwcG9ydENvbW1lbnQoKTogYm9vbGVhbiB7IHJldHVybiBmYWxzZTsgfVxuICAgIHB1YmxpYyBzdXBwb3J0T3RoZXIoKTogYm9vbGVhbiB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKiBcbiAgICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCB0byBtYWtlIHRoZSBxdWVzdGlvbiBhIHJlcXVpcmVkLiBJZiBhIHVzZXIgZG9lc24ndCBhbnN3ZXIgdGhlIHF1ZXN0aW9uIHRoZW4gYSB2YWxpZGF0aW9uIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNSZXF1aXJlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzUmVxdWlyZWRcIiwgZmFsc2UpOyB9XG4gICAgcHVibGljIHNldCBpc1JlcXVpcmVkKHZhbDogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkID09IHZhbCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1JlcXVpcmVkXCIsIHZhbCk7XG4gICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMudGl0bGVDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhhc0NvbW1lbnQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJoYXNDb21tZW50XCIsIGZhbHNlKTsgfVxuICAgIHB1YmxpYyBzZXQgaGFzQ29tbWVudCh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLnN1cHBvcnRDb21tZW50KCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGFzQ29tbWVudFwiLCB2YWwpO1xuICAgICAgICBpZiAodGhpcy5oYXNDb21tZW50KSB0aGlzLmhhc090aGVyID0gZmFsc2U7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaGFzT3RoZXIoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJoYXNPdGhlclwiLCBmYWxzZSk7IH1cbiAgICBwdWJsaWMgc2V0IGhhc090aGVyKHZhbDogYm9vbGVhbikge1xuICAgICAgICBpZiAoIXRoaXMuc3VwcG9ydE90aGVyKCkgfHwgdGhpcy5oYXNPdGhlciA9PSB2YWwpIHJldHVybjtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGFzT3RoZXJcIiwgdmFsKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzT3RoZXIpIHRoaXMuaGFzQ29tbWVudCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmhhc090aGVyQ2hhbmdlZCgpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgaGFzT3RoZXJDaGFuZ2VkKCkgeyB9XG4gICAgLyoqXG4gICAgICogUmV0dW5zIHRydWUgaWYgcmVhZE9ubHkgcHJvcGVydHkgaXMgdHJ1ZSBvciBzdXJ2ZXkgaXMgaW4gZGlzcGxheSBtb2RlLlxuICAgICAqIEBzZWUgU3VydmV5TW9kZWwubW9kZWxcbiAgICAgKiBAc2VlIHJlYWRPbmx5XG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1JlYWRPbmx5KCkgeyByZXR1cm4gdGhpcy5yZWFkT25seSB8fCAodGhpcy5zdXJ2ZXkgIT0gbnVsbCAmJiB0aGlzLnN1cnZleS5pc0Rpc3BsYXlNb2RlKTt9XG4gICAgLyoqXG4gICAgICogU2V0IGl0IHRvIHRydWUgdG8gbWFrZSBhIHF1ZXN0aW9uIHJlYWRvbmx5LlxuICAgICAqL1xuICAgIC8qKlxuICAgICAqIFNldCBpdCB0byB0cnVlIHRvIG1ha2UgdGhlIHF1ZXN0aW9uIHJlYWRvbmx5LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVhZE9ubHkoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZWFkT25seVwiLCBmYWxzZSk7IH1cbiAgICBwdWJsaWMgc2V0IHJlYWRPbmx5KHZhbDogYm9vbGVhbikge1xuICAgICAgICBpZih0aGlzLnJlYWRPbmx5ID09IHZhbCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZWFkT25seVwiLCB2YWwpO1xuICAgICAgICB0aGlzLm9uUmVhZE9ubHlDaGFuZ2VkKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIElmIGl0IHJldHVybnMgZmFsc2UgdGhlIFF1ZXN0aW9uIGJlY29tZXMgcmVhZCBvbmx5IGFuZCBhbiBlbmQtdXNlciB3aWxsIG5vdCBhYmxlIHRvIGFuc3dlciBvbiB0aGUgcXVzdGlvbi4gVGhlIGxpYnJhcnkgcnVucyB0aGUgZXhwcmVzc2lvbiBvbiBzdXJ2ZXkgc3RhcnQgYW5kIG9uIGNoYW5naW5nIGEgcXVlc3Rpb24gdmFsdWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBlbXB0eSB0aGVuIHJlYWRPbmx5IHByb3BlcnR5IGlzIHVzZWQuXG4gICAgICogQHNlZSByZWFkT25seVxuICAgICAqIEBzZWUgaXNSZWFkT25seVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZW5hYmxlSWYoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImVuYWJsZUlmXCIsIFwiXCIpOyB9XG4gICAgcHVibGljIHNldCBlbmFibGVJZih2YWw6IHN0cmluZykgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJlbmFibGVJZlwiLCB2YWwpOyB9XG4gICAgXG4gICAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMpO1xuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlSWYpIHJldHVybjtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmRpdGlvbkVuYWJlbFJ1bm5lcikgdGhpcy5jb25kaXRpb25FbmFiZWxSdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuZW5hYmxlSWYpO1xuICAgICAgICB0aGlzLmNvbmRpdGlvbkVuYWJlbFJ1bm5lci5leHByZXNzaW9uID0gdGhpcy5lbmFibGVJZjtcbiAgICAgICAgdGhpcy5yZWFkT25seSA9ICF0aGlzLmNvbmRpdGlvbkVuYWJlbFJ1bm5lci5ydW4odmFsdWVzKTtcbiAgICB9XG4gICAgXG4gICAgb25SZWFkT25seUNoYW5nZWQoKSB7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzUmVhZE9ubHlcIiwgdGhpcy5pc1JlYWRPbmx5KTtcbiAgICB9XG4gICAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmKCFuYW1lKSByZXR1cm47XG4gICAgICAgIHZhciB0aXRsZVZhbHVlID0gdGhpcy5sb2NUaXRsZS50ZXh0O1xuICAgICAgICBpZighdGl0bGVWYWx1ZSkgcmV0dXJuO1xuICAgICAgICBpZih0aXRsZVZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5kZXhPZigneycgKyBuYW1lLnRvTG93ZXJDYXNlKCkpID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMudGl0bGVDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXQgbm8oKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMudmlzaWJsZUluZGV4IDwgMCkgcmV0dXJuIFwiXCI7XG4gICAgICAgIHZhciBzdGFydEluZGV4ID0gMTtcbiAgICAgICAgdmFyIGlzTnVtZXJpYyA9IHRydWU7XG4gICAgICAgIHZhciBzdHIgPSBcIlwiO1xuICAgICAgICBpZiAodGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkucXVlc3Rpb25TdGFydEluZGV4KSB7XG4gICAgICAgICAgICBzdHIgPSB0aGlzLnN1cnZleS5xdWVzdGlvblN0YXJ0SW5kZXg7XG4gICAgICAgICAgICBpZiAocGFyc2VJbnQoc3RyKSkgc3RhcnRJbmRleCA9IHBhcnNlSW50KHN0cik7XG4gICAgICAgICAgICBlbHNlIGlmIChzdHIubGVuZ3RoID09IDEpIGlzTnVtZXJpYyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc051bWVyaWMpIHJldHVybiAodGhpcy52aXNpYmxlSW5kZXggKyBzdGFydEluZGV4KS50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShzdHIuY2hhckNvZGVBdCgwKSArIHRoaXMudmlzaWJsZUluZGV4KTtcbiAgICB9XG4gICAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICAgICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgICAgIGlmKHRoaXMuZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlV2l0aERlZmF1bHRzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIG9uU2V0RGF0YSgpIHtcbiAgICAgICAgc3VwZXIub25TZXREYXRhKCk7XG4gICAgICAgIHRoaXMub25TdXJ2ZXlWYWx1ZUNoYW5nZWQodGhpcy52YWx1ZSk7XG4gICAgICAgIGlmKHRoaXMuZGVmYXVsdFZhbHVlKSB7ICAgICAgICBcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGlzdmFsdWVDaGFuZ2VkQ2FsbGJhY2tGaXJpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBHZXQvU2V0IHRoZSBxdWVzdGlvbiB2YWx1ZS5cbiAgICAgKiBAc2VlIFN1cnZleU1vZGUuc2V0VmFsdWVcbiAgICAgKiBAc2VlIFN1cnZleU1vZGUuZ2V0VmFsdWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlRnJvbURhdGEodGhpcy5nZXRWYWx1ZUNvcmUoKSk7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgdmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMuaXN2YWx1ZUNoYW5nZWRDYWxsYmFja0ZpcmluZykgcmV0dXJuO1xuICAgICAgICB0aGlzLmlzdmFsdWVDaGFuZ2VkQ2FsbGJhY2tGaXJpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnZhbHVlQ2hhbmdlZENhbGxiYWNrKTtcbiAgICAgICAgdGhpcy5pc3ZhbHVlQ2hhbmdlZENhbGxiYWNrRmlyaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZGlzcGxheVZhbHVlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgdG8gdGhlIHF1ZXN0aW9uLiBJdCB3aWxsIGJlIGFzc2lnbiB0byB0aGUgcXVlc3Rpb24gb24gbG9hZGluZyB0aGUgc3VydmV5IGZyb20gSlNPTiBvciBhZGRpbmcgYSBxdWVzdGlvbiB0byB0aGUgc3VydmV5IG9yIG9uIHNldHRpbmcgdGhpcyBwcm9wZXJ0eSBvZiB0aGUgdmFsdWUgaXMgZW1wdHkuXG4gICAgICovXG4gICAgcHVibGljIGdldCBkZWZhdWx0VmFsdWUoKTogYW55IHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZVwiKTsgfVxuICAgIHB1YmxpYyBzZXQgZGVmYXVsdFZhbHVlKHZhbDogYW55KSB7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZVwiLCB2YWwpO1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlV2l0aERlZmF1bHRzKCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCB1cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpIHtcbiAgICAgICAgaWYodGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fCAoIXRoaXMuaXNEZXNpZ25Nb2RlICYmIHRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFZhbHVlKSkpIHJldHVybjtcbiAgICAgICAgaWYoIXRoaXMuaXNEZXNpZ25Nb2RlICYmICF0aGlzLmlzRW1wdHkoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNldERlZmF1bHRWYWx1ZSgpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0RGVmYXVsdFZhbHVlKCkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIFRoZSBxdWVzdGlvbiBjb21tZW50IHZhbHVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29tbWVudCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRDb21tZW50KCk7IH1cbiAgICBwdWJsaWMgc2V0IGNvbW1lbnQobmV3VmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5jb21tZW50ID09IG5ld1ZhbHVlKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2V0Q29tbWVudChuZXdWYWx1ZSk7XG4gICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY29tbWVudENoYW5nZWRDYWxsYmFjayk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRDb21tZW50KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmRhdGEgIT0gbnVsbCA/IHRoaXMuZGF0YS5nZXRDb21tZW50KHRoaXMubmFtZSkgOiB0aGlzLnF1ZXN0aW9uQ29tbWVudDsgfVxuICAgIHByb3RlY3RlZCBzZXRDb21tZW50KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zZXROZXdDb21tZW50KG5ld1ZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBxdWVzdGlvbiB2YWx1ZSBpcyBlbXB0eVxuICAgICAqL1xuICAgIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy52YWx1ZSk7IH1cbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBxdWVzdGlvbiB2YWxpZGF0b3JzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsaWRhdG9ycygpOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+IHsgcmV0dXJuIHRoaXMudmFsaWRhdG9yc1ZhbHVlOyB9XG4gICAgcHVibGljIHNldCB2YWxpZGF0b3JzKHZhbDogQXJyYXk8U3VydmV5VmFsaWRhdG9yPikgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2YWxpZGF0b3JzXCIsIHZhbCk7IH1cbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBlcnJvcnMuIEl0IGlzIGNyZWF0ZWQgYnkgY2FsbGlnIGhhc0Vycm9ycyBmdW5jdGlvbnNcbiAgICAgKiBAc2VlIGhhc0Vycm9yc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXJyb3JzKCk6IEFycmF5PFN1cnZleUVycm9yPiB7IHJldHVybiB0aGlzLmVycm9yc1ZhbHVlOyB9XG4gICAgcHVibGljIHNldCBlcnJvcnModmFsOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHsgdGhpcy5lcnJvcnNWYWx1ZSA9IHZhbDsgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aHJlcmUgaXMgYSB2YWxpZGF0aW9uIGVycm9yKHMpIGluIHRoZSBxdWVzdGlvbi4gXG4gICAgICogQHBhcmFtIGZpcmVDYWxsYmFjayBzZXQgaXQgdG8gdHJ1ZSB0byBzaG93IGFuIGVycm9yIGluIFVJLlxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNFcnJvcnMoZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSk6IGJvb2xlYW4ge1xuICAgICAgICB0aGlzLmNoZWNrRm9yRXJyb3JzKGZpcmVDYWxsYmFjayk7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9ycy5sZW5ndGggPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWxpZGF0aW9uIGVycm9ycyBjb3VudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRFcnJvckNvdW50KCk6IG51bWJlciB7IHJldHVybiB0aGlzLmVycm9ycy5sZW5ndGg7IH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjaGFyL3N0cmluZyBmb3IgYSByZXF1aXJlZCBxdWVzdGlvbi5cbiAgICAgKiBAc2VlIFN1cnZleU1vZGVsLnJlcXVpcmVkVGV4dFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVxdWlyZWRUZXh0KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnN1cnZleSAhPSBudWxsICYmIHRoaXMuaXNSZXF1aXJlZCA/IHRoaXMuc3VydmV5LnJlcXVpcmVkVGV4dCA6IFwiXCI7IH1cbiAgICAvKipcbiAgICAgKiBBZGQgZXJyb3IgaW50byB0aGUgcXVlc3Rpb24gZXJyb3IgbGlzdC5cbiAgICAgKiBAcGFyYW0gZXJyb3IgXG4gICAgICovXG4gICAgcHVibGljIGFkZEVycm9yKGVycm9yOiBTdXJ2ZXlFcnJvcikge1xuICAgICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5lcnJvcnNDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH1cbiAgICBwcml2YXRlIGNoZWNrRm9yRXJyb3JzKGZpcmVDYWxsYmFjazogYm9vbGVhbikge1xuICAgICAgICB2YXIgZXJyb3JMZW5ndGggPSB0aGlzLmVycm9ycyA/IHRoaXMuZXJyb3JzLmxlbmd0aCA6IDA7XG4gICAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgICAgIHRoaXMub25DaGVja0ZvckVycm9ycyh0aGlzLmVycm9ycyk7XG4gICAgICAgIGlmICh0aGlzLmVycm9ycy5sZW5ndGggPT0gMCAmJiAhdGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHZhciBlcnJvciA9IHRoaXMucnVuVmFsaWRhdG9ycygpO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy92YWxpZGF0b3JzIG1heSBjaGFuZ2UgdGhlIHF1ZXN0aW9uIHZhbHVlLlxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcnMucHVzaChlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3VydmV5ICYmIHRoaXMuZXJyb3JzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3IgPSB0aGlzLmZpcmVTdXJ2ZXlWYWxpZGF0aW9uKCk7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlyZUNhbGxiYWNrICYmIChlcnJvckxlbmd0aCAhPSB0aGlzLmVycm9ycy5sZW5ndGggfHwgZXJyb3JMZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5lcnJvcnNDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgZmlyZVN1cnZleVZhbGlkYXRpb24oKTogU3VydmV5RXJyb3Ige1xuICAgICAgICBpZih0aGlzLnZhbGlkYXRlVmFsdWVDYWxsYmFjaykgcmV0dXJuIHRoaXMudmFsaWRhdGVWYWx1ZUNhbGxiYWNrKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LnZhbGlkYXRlUXVlc3Rpb24odGhpcy5uYW1lKSA6IG51bGw7XG4gICAgfVxuICAgIHByb3RlY3RlZCBvbkNoZWNrRm9yRXJyb3JzKGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1JlcXVpcmVkRXJyb3IoKSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvcnMucHVzaChuZXcgQW5zd2VyUmVxdWlyZWRFcnJvcih0aGlzLnJlcXVpcmVkRXJyb3JUZXh0KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIGhhc1JlcXVpcmVkRXJyb3IoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzUmVxdWlyZWQgJiYgdGhpcy5pc0VtcHR5KCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBydW5WYWxpZGF0b3JzKCk6IFN1cnZleUVycm9yIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSdW5uZXIoKS5ydW4odGhpcyk7XG4gICAgfVxuICAgIHByaXZhdGUgaXNWYWx1ZUNoYW5nZWRJblN1cnZleSA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBzZXROZXdWYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuc2V0TmV3VmFsdWVJbkRhdGEobmV3VmFsdWUpO1xuICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkKCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBzZXROZXdWYWx1ZUluRGF0YShuZXdWYWx1ZTogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbHVlQ2hhbmdlZEluU3VydmV5KSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHRoaXMudmFsdWVUb0RhdGEobmV3VmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZUNvcmUobmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0VmFsdWVDb3JlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhICE9IG51bGwgPyB0aGlzLmRhdGEuZ2V0VmFsdWUodGhpcy5uYW1lKSA6IHRoaXMucXVlc3Rpb25WYWx1ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzZXRWYWx1ZUNvcmUobmV3VmFsdWU6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5kYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5zZXRWYWx1ZSh0aGlzLm5hbWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25WYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb3RlY3RlZCB2YWx1ZUZyb21EYXRhKHZhbDogYW55KTogYW55IHsgcmV0dXJuIHZhbDsgfVxuICAgIHByb3RlY3RlZCB2YWx1ZVRvRGF0YSh2YWw6IGFueSk6IGFueSB7IHJldHVybiB2YWw7IH1cbiAgICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQoKSB7IH1cbiAgICBwcm90ZWN0ZWQgc2V0TmV3Q29tbWVudChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5kYXRhLnNldENvbW1lbnQodGhpcy5uYW1lLCBuZXdWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB0aGlzLnF1ZXN0aW9uQ29tbWVudCA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgICAvL0lRdWVzdGlvblxuICAgIG9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5pc1ZhbHVlQ2hhbmdlZEluU3VydmV5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWVGcm9tRGF0YShuZXdWYWx1ZSk7XG4gICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY29tbWVudENoYW5nZWRDYWxsYmFjayk7XG4gICAgICAgIHRoaXMuaXNWYWx1ZUNoYW5nZWRJblN1cnZleSA9IGZhbHNlO1xuICAgIH1cbiAgICAvL0lWYWxpZGF0b3JPd25lclxuICAgIGdldFZhbGlkYXRvclRpdGxlKCk6IHN0cmluZyB7IHJldHVybiBudWxsOyB9XG4gICAgZ2V0IHZhbGlkYXRlZFZhbHVlKCk6IGFueSB7IHJldHVybiB0aGlzLnZhbHVlOyB9XG4gICAgc2V0IHZhbGlkYXRlZFZhbHVlKHZhbDogYW55KSB7IHRoaXMudmFsdWUgPSB2YWw7IH1cbn1cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJxdWVzdGlvblwiLCBbeyBuYW1lOiBcInRpdGxlOnRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RpdGxlXCIgfSxcbiAgICB7IG5hbWU6IFwiZGVzY3JpcHRpb246dGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jRGVzY3JpcHRpb25cIiB9LCBcbiAgICB7IG5hbWU6IFwiY29tbWVudFRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbW1lbnRUZXh0XCIgfSwgXCJlbmFibGVJZjpjb25kaXRpb25cIiwgXCJkZWZhdWx0VmFsdWU6dmFsdWVcIixcbiAgICBcImlzUmVxdWlyZWQ6Ym9vbGVhblwiLCB7IG5hbWU6IFwicmVxdWlyZWRFcnJvclRleHQ6dGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUmVxdWlyZWRFcnJvclRleHRcIiB9LFxuICAgIFwicmVhZE9ubHk6Ym9vbGVhblwiLCB7IG5hbWU6IFwidmFsaWRhdG9yczp2YWxpZGF0b3JzXCIsIGJhc2VDbGFzc05hbWU6IFwic3VydmV5dmFsaWRhdG9yXCIsIGNsYXNzTmFtZVBhcnQ6IFwidmFsaWRhdG9yXCJ9XSwgbnVsbCwgXCJxdWVzdGlvbmJhc2VcIik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb24udHMiLCJpbXBvcnQge3N1cnZleUxvY2FsaXphdGlvbn0gZnJvbSAnLi9zdXJ2ZXlTdHJpbmdzJztcbmltcG9ydCB7U3VydmV5RXJyb3J9IGZyb20gXCIuL2Jhc2VcIjtcblxuZXhwb3J0IGNsYXNzIEFuc3dlclJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGN1c3RvbUVycm9yVGV4dDogc3RyaW5nID0gbnVsbCkgIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgcHVibGljIGdldFRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tRXJyb3JUZXh0ID8gdGhpcy5jdXN0b21FcnJvclRleHQgOiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVxdWlyZWRFcnJvclwiKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgUmVxdXJlTnVtZXJpY0Vycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VGV4dCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm51bWVyaWNFcnJvclwiKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgRXhjZWVkU2l6ZUVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICAgIHByaXZhdGUgbWF4U2l6ZTogbnVtYmVyO1xuICAgIGNvbnN0cnVjdG9yKG1heFNpemU6IG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm1heFNpemUgPSBtYXhTaXplO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VGV4dCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImV4Y2VlZE1heFNpemVcIilbXCJmb3JtYXRcIl0odGhpcy5nZXRUZXh0U2l6ZSgpKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRUZXh0U2l6ZSgpIHtcbiAgICAgICAgdmFyIHNpemVzID0gWydCeXRlcycsICdLQicsICdNQicsICdHQicsICdUQiddO1xuICAgICAgICB2YXIgZml4ZWQgPSBbMCwgMCwgMiwgMywgM107XG4gICAgICAgIGlmICh0aGlzLm1heFNpemUgPT0gMCkgcmV0dXJuICcwIEJ5dGUnO1xuICAgICAgICB2YXIgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2codGhpcy5tYXhTaXplKSAvIE1hdGgubG9nKDEwMjQpKTtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5tYXhTaXplIC8gTWF0aC5wb3coMTAyNCwgaSk7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b0ZpeGVkKGZpeGVkW2ldKSArICcgJyArIHNpemVzW2ldO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEN1c3RvbUVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICAgIHByaXZhdGUgdGV4dDogc3RyaW5nO1xuICAgIGNvbnN0cnVjdG9yKHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VGV4dCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0O1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9lcnJvci50cyIsImltcG9ydCB7SUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5cbi8qKlxuICogQXJyYXkgb2YgSXRlbVZhbHVlIGlzIHVzZWQgaW4gY2hlY2tveCwgZHJvcGRvd24gYW5kIHJhZGlvZ3JvdXAgY2hvaWNlcywgbWF0cml4IGNvbHVtbnMgYW5kIHJvd3MuXG4gKiBJdCBoYXMgdHdvIG1haW4gcHJvcGVydGllczogdmFsdWUgYW5kIHRleHQuIElmIHRleHQgaXMgZW1wdHksIHZhbHVlIGlzIHVzZWQgZm9yIGRpc3BsYXlpbmcuXG4gKiBUaGUgdGV4dCBwcm9wZXJ0eSBpcyBsb2NhbGl6YWJsZSBhbmQgc3VwcG9ydCBtYXJrZG93bi5cbiAqL1xuZXhwb3J0IGNsYXNzIEl0ZW1WYWx1ZSB7XG4gICAgcHVibGljIHN0YXRpYyBTZXBhcmF0b3IgPSAnfCc7XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVBcnJheShsb2NPd25lcjogSUxvY2FsaXphYmxlT3duZXIpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICAgICAgdmFyIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+ID0gW107XG4gICAgICAgIEl0ZW1WYWx1ZS5zZXR1cEFycmF5KGl0ZW1zLCBsb2NPd25lcik7XG4gICAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBzZXR1cEFycmF5KGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LCBsb2NPd25lcjogSUxvY2FsaXphYmxlT3duZXIpIHtcbiAgICAgICAgaXRlbXMucHVzaCA9IGZ1bmN0aW9uKHZhbHVlKTogbnVtYmVyIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICAgIHZhbHVlLmxvY093bmVyID0gbG9jT3duZXI7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgICBpdGVtcy5zcGxpY2UgPSBmdW5jdGlvbiAoc3RhcnQ/OiBudW1iZXIsIGRlbGV0ZUNvdW50PzogbnVtYmVyLCAuLi5pdGVtczogSXRlbVZhbHVlW10pOiBJdGVtVmFsdWVbXSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKHRoaXMsIHN0YXJ0LCBkZWxldGVDb3VudCwgLi4uIGl0ZW1zKTtcbiAgICAgICAgICAgIGlmKCFpdGVtcykgaXRlbXMgPSBbXTtcbiAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgICAgICBpdGVtc1tpXS5sb2NPd25lciA9IGxvY093bmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBzZXREYXRhKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LCB2YWx1ZXM6IEFycmF5PGFueT4pIHtcbiAgICAgICAgaXRlbXMubGVuZ3RoID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlc1tpXTtcbiAgICAgICAgICAgIHZhciBpdGVtID0gbmV3IEl0ZW1WYWx1ZShudWxsKTtcbiAgICAgICAgICAgIGl0ZW0uc2V0RGF0YSh2YWx1ZSk7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGF0YShpdGVtczogQXJyYXk8SXRlbVZhbHVlPik6IGFueSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goaXRlbXNbaV0uZ2V0RGF0YSgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldEl0ZW1CeVZhbHVlKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LCB2YWw6IGFueSk6IEl0ZW1WYWx1ZSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICBpZiAoaXRlbXNbaV0udmFsdWUgPT0gdmFsKSByZXR1cm4gaXRlbXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VGV4dE9ySHRtbEJ5VmFsdWUoaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sIHZhbDogYW55KTogc3RyaW5nIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUoaXRlbXMsIHZhbCk7XG4gICAgICAgIHJldHVybiBpdGVtICE9PSBudWxsID8gaXRlbS5sb2NUZXh0LnRleHRPckh0bWwgOiBcIlwiO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIE5vdGlmeUFycmF5T25Mb2NhbGVDaGFuZ2VkKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+KSB7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIGl0ZW1zW2ldLmxvY1RleHQub25DaGFuZ2VkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgaXRlbVZhbHVlUHJvcCA9IFsgXCJ0ZXh0XCIsIFwidmFsdWVcIiwgXCJoYXNUZXh0XCIsIFwibG9jT3duZXJcIiwgXCJsb2NUZXh0XCIsIFwiaXNWYWx1ZUVtcHR5XCIsIFwibG9jVGV4dFZhbHVlXCIsIFwicG9zXCJdO1xuICAgIHByaXZhdGUgaXRlbVZhbHVlOiBhbnk7XG4gICAgcHJpdmF0ZSBsb2NUZXh0VmFsdWU6IExvY2FsaXphYmxlU3RyaW5nO1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBhbnksIHRleHQ6IHN0cmluZyA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5sb2NUZXh0VmFsdWUgPSBuZXcgTG9jYWxpemFibGVTdHJpbmcobnVsbCwgdHJ1ZSk7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy5sb2NUZXh0VmFsdWUub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7IHJldHVybiB0ZXh0ID8gdGV4dCA6ICghc2VsZi5pc1ZhbHVlRW1wdHkgPyBzZWxmLnZhbHVlLnRvU3RyaW5nKCkgOiBudWxsKTsgfVxuICAgICAgICBpZih0ZXh0KSB0aGlzLmxvY1RleHQudGV4dCA9IHRleHQ7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHsgcmV0dXJuIFwiaXRlbXZhbHVlXCI7IH1cbiAgICBwdWJsaWMgZ2V0IGxvY1RleHQoKTogTG9jYWxpemFibGVTdHJpbmcgeyByZXR1cm4gdGhpcy5sb2NUZXh0VmFsdWU7IH1cbiAgICBwdWJsaWMgZ2V0IGxvY093bmVyKCkgOiBJTG9jYWxpemFibGVPd25lciB7IHJldHVybiB0aGlzLmxvY1RleHQub3duZXI7IH1cbiAgICBwdWJsaWMgc2V0IGxvY093bmVyKHZhbHVlOiBJTG9jYWxpemFibGVPd25lcikgeyB0aGlzLmxvY1RleHQub3duZXIgPSB2YWx1ZTsgfVxuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHsgcmV0dXJuIHRoaXMuaXRlbVZhbHVlOyB9XG4gICAgcHVibGljIHNldCB2YWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuaXRlbVZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIGlmICghdGhpcy5pdGVtVmFsdWUpIHJldHVybjtcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gdGhpcy5pdGVtVmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgdmFyIGluZGV4ID0gc3RyLmluZGV4T2YoSXRlbVZhbHVlLlNlcGFyYXRvcik7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1WYWx1ZSA9IHN0ci5zbGljZSgwLCBpbmRleCk7XG4gICAgICAgICAgICB0aGlzLnRleHQgPSBzdHIuc2xpY2UoaW5kZXggKyAxKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhhc1RleHQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmxvY1RleHQucHVyZVRleHQgPyB0cnVlIDogZmFsc2U7IH1cbiAgICBwdWJsaWMgZ2V0IHRleHQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMubG9jVGV4dC50ZXh0OyB9XG4gICAgcHVibGljIHNldCB0ZXh0KG5ld1RleHQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLmxvY1RleHQudGV4dCA9IG5ld1RleHQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXREYXRhKCk6IGFueSB7XG4gICAgICAgIHZhciBjdXN0b21BdHRyaWJ1dGVzID0gdGhpcy5nZXRDdXN0b21BdHRyaWJ1dGVzKCk7XG4gICAgICAgIHZhciB0ZXh0SnNvbiA9IHRoaXMubG9jVGV4dC5nZXRKc29uKCk7XG4gICAgICAgIGlmKCFjdXN0b21BdHRyaWJ1dGVzICYmICF0ZXh0SnNvbikgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgICAgIHZhciByZXN1bHQgPSB7dmFsdWU6IHRoaXMudmFsdWV9O1xuICAgICAgICBpZih0ZXh0SnNvbikgcmVzdWx0W1widGV4dFwiXSA9IHRleHRKc29uO1xuICAgICAgICBpZihjdXN0b21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IodmFyIGtleSBpbiBjdXN0b21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBjdXN0b21BdHRyaWJ1dGVzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcHVibGljIHNldERhdGEodmFsdWU6IGFueSkge1xuICAgICAgICBpZiAodHlwZW9mICh2YWx1ZS52YWx1ZSkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB2YXIgZXhjZXB0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzT2JqSXRlbVZhbHVlKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlLml0ZW1WYWx1ZSA9IHZhbHVlLml0ZW1WYWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvY1RleHQuc2V0SnNvbih2YWx1ZS5sb2NUZXh0LmdldEpzb24oKSk7XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gSXRlbVZhbHVlLml0ZW1WYWx1ZVByb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvcHlBdHRyaWJ1dGVzKHZhbHVlLCBleGNlcHRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0IGlzVmFsdWVFbXB0eSgpIHsgcmV0dXJuICF0aGlzLml0ZW1WYWx1ZSAmJiB0aGlzLml0ZW1WYWx1ZSAhPT0gMCAmJiB0aGlzLml0ZW1WYWx1ZSAhPT0gZmFsc2U7IH1cbiAgICBwcml2YXRlICBpc09iakl0ZW1WYWx1ZShvYmo6IGFueSkgeyByZXR1cm4gdHlwZW9mIChvYmouZ2V0VHlwZSkgIT09ICd1bmRlZmluZWQnICYmIG9iai5nZXRUeXBlKCkgPT0gJ2l0ZW12YWx1ZSc7fVxuICAgIHByaXZhdGUgY29weUF0dHJpYnV0ZXMoc3JjOiBhbnksIGV4Y2VwdG9uczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgICAgICAgICBpZiAoKHR5cGVvZiBzcmNba2V5XSA9PSAnZnVuY3Rpb24nKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoZXhjZXB0b25zICYmIGV4Y2VwdG9ucy5pbmRleE9mKGtleSkgPiAtMSkgY29udGludWU7XG4gICAgICAgICAgICBpZihrZXkgPT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvY1RleHQuc2V0SnNvbihzcmNba2V5XSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXNba2V5XSA9IHNyY1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0Q3VzdG9tQXR0cmlidXRlcygpOiBhbnkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMpIHtcbiAgICAgICAgICAgIGlmICgodHlwZW9mIHRoaXNba2V5XSA9PSAnZnVuY3Rpb24nKSB8fCBJdGVtVmFsdWUuaXRlbVZhbHVlUHJvcC5pbmRleE9mKGtleSkgPiAtMSB8fCBrZXkgPT0gXCJpdGVtVmFsdWVcIikgY29udGludWU7XG4gICAgICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0ge307XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IHRoaXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcIml0ZW12YWx1ZVwiLCBbXCIhdmFsdWVcIiwge25hbWU6IFwidGV4dFwiLCBvbkdldFZhbHVlOiBmdW5jdGlvbiAob2JqOiBhbnkpIHsgcmV0dXJuIG9iai5sb2NUZXh0LnB1cmVUZXh0OyB9fV0pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9pdGVtdmFsdWUudHMiLCJleHBvcnQgdmFyIHN1cnZleUNzcyA9IHtcbiAgICBjdXJyZW50VHlwZTogXCJcIixcbiAgICBnZXRDc3M6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudFR5cGUgPyB0aGlzW3RoaXMuY3VycmVudFR5cGVdIDogZGVmYXVsdFN0YW5kYXJkQ3NzO1xuICAgICAgICBpZiAoIWxvYykgbG9jID0gZGVmYXVsdFN0YW5kYXJkQ3NzO1xuICAgICAgICByZXR1cm4gbG9jO1xuICAgIH0sXG59O1xuXG5leHBvcnQgdmFyIGRlZmF1bHRTdGFuZGFyZENzcyA9IHtcbiAgICByb290OiBcInN2X21haW5cIixcbiAgICBoZWFkZXI6IFwiXCIsXG4gICAgYm9keTogXCJzdl9ib2R5XCIsXG4gICAgZm9vdGVyOiBcInN2X25hdlwiLFxuICAgIG5hdmlnYXRpb25CdXR0b246IFwiXCIsIG5hdmlnYXRpb246IHsgY29tcGxldGU6IFwic3ZfY29tcGxldGVfYnRuXCIsIHByZXY6XCJzdl9wcmV2X2J0blwiLCBuZXh0OiBcInN2X25leHRfYnRuXCJ9LFxuICAgIHByb2dyZXNzOiBcInN2X3Byb2dyZXNzXCIsIHByb2dyZXNzQmFyOiBcIlwiLFxuICAgIHBhZ2VUaXRsZTogXCJzdl9wX3RpdGxlXCIsIHBhZ2VEZXNjcmlwdGlvbjogXCJcIixcbiAgICByb3c6IFwic3Zfcm93XCIsXG4gICAgcXVlc3Rpb246IHsgbWFpblJvb3Q6IFwic3ZfcSBzdl9xc3RuXCIsIHRpdGxlOiBcInN2X3FfdGl0bGVcIiwgZGVzY3JpcHRpb246IFwic3ZfcV9kZXNjcmlwdGlvblwiLCBjb21tZW50OiBcIlwiLCByZXF1aXJlZDogXCJcIiwgdGl0bGVSZXF1aXJlZDogXCJcIiwgaW5kZW50OiAyMCB9LFxuICAgIHBhbmVsOiB7IHRpdGxlOiBcInN2X3BfdGl0bGVcIiwgZGVzY3JpcHRpb246IFwiXCIsIGNvbnRhaW5lcjogXCJzdl9wX2NvbnRhaW5lclwiIH0sXG4gICAgZXJyb3I6IHsgcm9vdDogXCJzdl9xX2VyYm94XCIsIGljb246IFwiXCIsIGl0ZW06IFwiXCIgfSxcblxuICAgIGJvb2xlYW46IHsgcm9vdDogXCJzdl9xY2JjIHN2X3FibG5cIiwgaXRlbTogXCJzdl9xX2NoZWNrYm94XCJ9LFxuICAgIGNoZWNrYm94OiB7IHJvb3Q6IFwic3ZfcWNiYyBzdl9xY2J4XCIsIGl0ZW06IFwic3ZfcV9jaGVja2JveFwiLCBvdGhlcjogXCJzdl9xX290aGVyIHN2X3FfY2hlY2tib3hfb3RoZXJcIiB9LFxuICAgIGNvbW1lbnQ6IFwiXCIsXG4gICAgZHJvcGRvd246IHsgcm9vdDogXCJcIiwgY29udHJvbDogXCJcIiwgb3RoZXI6IFwic3ZfcV9vdGhlclwiIH0sXG4gICAgbWF0cml4OiB7IHJvb3Q6IFwic3ZfcV9tYXRyaXhcIiwgbGFiZWw6IFwic3ZfcV9tX2xhYmVsXCIgfSxcbiAgICBtYXRyaXhkcm9wZG93bjogeyByb290OiBcInN2X3FfbWF0cml4XCIgfSxcbiAgICBtYXRyaXhkeW5hbWljOiB7IHJvb3Q6IFwidGFibGVcIiwgYnV0dG9uOiBcIlwiIH0sXG4gICAgcGFuZWxkeW5hbWljOiB7IHJvb3Q6IFwiXCIsIGJ1dHRvbjogXCJcIiB9LFxuICAgIG11bHRpcGxldGV4dDogeyByb290OiBcIlwiLCBpdGVtVGl0bGU6IFwiXCIsIHJvdzogXCJcIiwgaXRlbVZhbHVlOiBcInN2X3FfbXRfaXRlbV92YWx1ZVwiIH0sXG4gICAgcmFkaW9ncm91cDogeyByb290OiBcInN2X3FjYmNcIiwgaXRlbTogXCJzdl9xX3JhZGlvZ3JvdXBcIiwgbGFiZWw6IFwiXCIsIG90aGVyOiBcInN2X3Ffb3RoZXIgc3ZfcV9yYWRpb2dyb3VwX290aGVyXCIgfSxcbiAgICByYXRpbmc6IHsgcm9vdDogXCJzdl9xX3JhdGluZ1wiLCBpdGVtOiBcInN2X3FfcmF0aW5nX2l0ZW1cIiwgc2VsZWN0ZWQ6IFwiYWN0aXZlXCIgfSxcbiAgICB0ZXh0OiBcIlwiLFxuICAgIGV4cHJlc3Npb246IFwiXCIsXG4gICAgc2F2ZURhdGE6IHtyb290OiBcIlwiLCBzYXZpbmc6IFwiXCIsIGVycm9yOiBcIlwiLCBzdWNjZXNzOiBcIlwiLCBzYXZlQWdhaW5CdXR0b246IFwiXCJ9LFxuICAgIHdpbmRvdzoge1xuICAgICAgICByb290OiBcInN2X3dpbmRvd1wiLCBib2R5OiBcInN2X3dpbmRvd19jb250ZW50XCIsXG4gICAgICAgIGhlYWRlcjoge1xuICAgICAgICAgICAgcm9vdDogXCJzdl93aW5kb3dfdGl0bGVcIiwgdGl0bGU6IFwiXCIsIGJ1dHRvbjogXCJcIiwgYnV0dG9uRXhwYW5kZWQ6IFwiXCIsIGJ1dHRvbkNvbGxhcHNlZDogXCJcIlxuICAgICAgICB9XG4gICAgfVxufTtcblxuc3VydmV5Q3NzW1wic3RhbmRhcmRcIl0gPSBkZWZhdWx0U3RhbmRhcmRDc3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZGVmYXVsdENzcy9jc3NzdGFuZGFyZC50cyIsImltcG9ydCB7SGFzaFRhYmxlfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtDb25kaXRpb25zUGFyc2VyfSBmcm9tICcuL2NvbmRpdGlvbnNQYXJzZXInO1xuaW1wb3J0IHtGdW5jdGlvbkZhY3Rvcnl9IGZyb20gXCIuL2Z1bmN0aW9uc2ZhY3RvcnlcIjtcbmltcG9ydCB7UHJvY2Vzc1ZhbHVlfSBmcm9tIFwiLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcblxuZXhwb3J0IGNsYXNzIE9wZXJhbmQge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBvcmlnaW9uYWxWYWx1ZTogYW55KSB7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRWYWx1ZShwcm9jZXNzVmFsdWU6IFByb2Nlc3NWYWx1ZSk6IGFueSB7XG4gICAgICAgIHZhciByZXMgPSB0aGlzLmdldFNpbXBsZVZhbHVlKHRoaXMub3JpZ2lvbmFsVmFsdWUpO1xuICAgICAgICBpZihyZXMuaXNTaW1wbGUpIHJldHVybiByZXMudmFsdWU7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLnJlbW92ZVF1b3Rlcyh0aGlzLm9yaWdpb25hbFZhbHVlKTtcbiAgICAgICAgaWYocHJvY2Vzc1ZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgbmFtZSA9IHRoaXMuZ2V0VmFsdWVOYW1lKHZhbCk7XG4gICAgICAgICAgICBpZihuYW1lKXtcbiAgICAgICAgICAgICAgICBpZighcHJvY2Vzc1ZhbHVlLmhhc1ZhbHVlKG5hbWUpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB2YWwgPSBwcm9jZXNzVmFsdWUuZ2V0VmFsdWUobmFtZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2ltcGxlVmFsdWUodmFsKS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGlzQm9vbGVhbigpIHsgcmV0dXJuIHRoaXMuaXNCb29sZWFuVmFsdWUodGhpcy5vcmlnaW9uYWxWYWx1ZSk7IH1cbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMub3JpZ2lvbmFsVmFsdWU7XG4gICAgICAgIGlmICh2YWwgJiYgKCF0aGlzLmlzTnVtZXJpYyh2YWwpICYmICF0aGlzLmlzQm9vbGVhblZhbHVlKHZhbCkpKSB2YWwgPSBcIidcIiArIHZhbCArIFwiJ1wiO1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICBwcml2YXRlIHJlbW92ZVF1b3Rlcyh2YWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICh2YWwubGVuZ3RoID4gMCAmJiAodmFsWzBdID09IFwiJ1wiIHx8IHZhbFswXSA9PSAnXCInKSkgdmFsID0gdmFsLnN1YnN0cigxKTtcbiAgICAgICAgdmFyIGxlbiA9IHZhbC5sZW5ndGg7XG4gICAgICAgIGlmIChsZW4gPiAwICYmICh2YWxbbGVuIC0gMV0gPT0gXCInXCIgfHwgdmFsW2xlbiAtIDFdID09ICdcIicpKSB2YWwgPSB2YWwuc3Vic3RyKDAsIGxlbiAtIDEpO1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFZhbHVlTmFtZSh2YWw6IGFueSkge1xuICAgICAgICBpZiAodmFsLmxlbmd0aCA8IDMgfHwgdmFsWzBdICE9ICd7JyB8fCB2YWxbdmFsLmxlbmd0aCAtIDFdICE9ICd9JykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB2YWwuc3Vic3RyKDEsIHZhbC5sZW5ndGggLSAyKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBpc0Jvb2xlYW5WYWx1ZSh2YWx1ZTogc3RyaW5nKSA6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdmFsdWUgJiYgKHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiIHx8IHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwiZmFsc2VcIik7XG4gICAgfVxuICAgIHByaXZhdGUgaXNOdW1lcmljKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYodmFsdWUgJiYgKHZhbHVlLmluZGV4T2YoJy0nKSA+IC0xIHx8IHZhbHVlLmluZGV4T2YoJysnKSA+IDEgfHwgdmFsdWUuaW5kZXhPZignKicpID4gLTEgfHwgdmFsdWUuaW5kZXhPZignLycpID4gLTEpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciB2YWwgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgaWYgKGlzTmFOKHZhbCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGlzRmluaXRlKHZhbCk7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0U2ltcGxlVmFsdWUodmFsOiBhbnkpOiBhbnkge1xuICAgICAgICB2YXIgcmVzID0ge2lzU2ltcGxlOiBmYWxzZSwgdmFsdWU6IHZhbH07XG4gICAgICAgIGlmKHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJlcy52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICByZXMuaXNTaW1wbGUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZhbCB8fCAodHlwZW9mIHZhbCAhPSBcInN0cmluZ1wiKSkge1xuICAgICAgICAgICAgcmVzLmlzU2ltcGxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5pc051bWVyaWModmFsKSkge1xuICAgICAgICAgICAgcmVzLmlzU2ltcGxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlcy52YWx1ZSA9IHBhcnNlRmxvYXQodmFsKTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5pc0Jvb2xlYW5WYWx1ZSh2YWwpKSB7XG4gICAgICAgICAgICByZXMudmFsdWUgPSB2YWwudG9Mb3dlckNhc2UoKSA9PSBcInRydWVcIjtcbiAgICAgICAgICAgIHJlcy5pc1NpbXBsZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uT3BlcmFuZCBleHRlbmRzIE9wZXJhbmQge1xuICAgIHB1YmxpYyBwYXJhbWV0ZXJzOiBBcnJheTxPcGVyYW5kPiA9IG5ldyBBcnJheTxPcGVyYW5kPigpO1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBvcmlnaW9uYWxWYWx1ZTogYW55KSB7XG4gICAgICAgIHN1cGVyKG9yaWdpb25hbFZhbHVlKTtcbiAgICB9XG4gICAgcHVibGljIGdldFZhbHVlKHByb2Nlc3NWYWx1ZTogUHJvY2Vzc1ZhbHVlKSB7XG4gICAgICAgIHZhciBwYXJhbVZhbHVlcyA9IFtdO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgcGFyYW1WYWx1ZXMucHVzaCh0aGlzLnBhcmFtZXRlcnNbaV0uZ2V0VmFsdWUocHJvY2Vzc1ZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5ydW4odGhpcy5vcmlnaW9uYWxWYWx1ZSwgcGFyYW1WYWx1ZXMpO1xuICAgIH1cbiAgICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgICAgIHZhciByZXMgPSB0aGlzLm9yaWdpb25hbFZhbHVlICsgXCIoXCJcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMucGFyYW1ldGVycy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIGlmKGkgPiAwKSByZXMgKz0gXCIsIFwiO1xuICAgICAgICAgICAgcmVzICs9IHRoaXMucGFyYW1ldGVyc1tpXS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEV4cHJlc3Npb25PcGVyYW5kIGV4dGVuZHMgT3BlcmFuZCB7XG4gICAgcHVibGljIGxlZnQ6IE9wZXJhbmQ7XG4gICAgcHVibGljIHJpZ2h0OiBPcGVyYW5kO1xuICAgIHB1YmxpYyBvcGVyYXRvcjogc3RyaW5nO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihudWxsKTtcbiAgICB9XG4gICAgcHVibGljIGdldFZhbHVlKHByb2Nlc3NWYWx1ZTogUHJvY2Vzc1ZhbHVlKTogYW55IHtcbiAgICAgICAgaWYoIXRoaXMubGVmdCB8fCAhdGhpcy5yaWdodCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBsID0gdGhpcy5sZWZ0LmdldFZhbHVlKHByb2Nlc3NWYWx1ZSk7XG4gICAgICAgIHZhciByID0gdGhpcy5yaWdodC5nZXRWYWx1ZShwcm9jZXNzVmFsdWUpO1xuICAgICAgICBpZih0aGlzLm9wZXJhdG9yID09ICcrJykge1xuICAgICAgICAgICAgcmV0dXJuICBsICsgcjtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLm9wZXJhdG9yID09ICctJykge1xuICAgICAgICAgICAgcmV0dXJuICBsIC0gcjtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLm9wZXJhdG9yID09ICcqJykge1xuICAgICAgICAgICAgcmV0dXJuICBsICogcjtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLm9wZXJhdG9yID09ICcvJykge1xuICAgICAgICAgICAgaWYoIXIpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuICBsIC8gcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgICAgICB2YXIgcmVzID0gdGhpcy5sZWZ0ID8gdGhpcy5sZWZ0LnRvU3RyaW5nKCkgOiBcIlwiO1xuICAgICAgICByZXMgKz0gJyAnICsgdGhpcy5vcGVyYXRvciArICcgJztcbiAgICAgICAgaWYodGhpcy5yaWdodCkgcmVzICs9IHRoaXMucmlnaHQudG9TdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uIHtcbiAgICBzdGF0aWMgb3BlcmF0b3JzVmFsdWU6IEhhc2hUYWJsZTxGdW5jdGlvbj4gPSBudWxsO1xuICAgIHN0YXRpYyBnZXQgb3BlcmF0b3JzKCkge1xuICAgICAgICBpZiAoQ29uZGl0aW9uLm9wZXJhdG9yc1ZhbHVlICE9IG51bGwpIHJldHVybiBDb25kaXRpb24ub3BlcmF0b3JzVmFsdWU7XG4gICAgICAgIENvbmRpdGlvbi5vcGVyYXRvcnNWYWx1ZSA9IHtcbiAgICAgICAgICAgIGVtcHR5OiBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsgXG4gICAgICAgICAgICAgICAgaWYobGVmdCA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gIWxlZnQ7IH0sXG4gICAgICAgICAgICBub3RlbXB0eTogZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7IFxuICAgICAgICAgICAgICAgIGlmKGxlZnQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiAhKCFsZWZ0KTsgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXF1YWw6IGZ1bmN0aW9uIChsZWZ0LCByaWdodCkgeyBcbiAgICAgICAgICAgICAgICBpZihsZWZ0ID09IG51bGwgJiYgcmlnaHQgIT0gbnVsbCB8fCBsZWZ0ICE9IG51bGwgJiYgcmlnaHQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmKGxlZnQgPT0gbnVsbCAmJiByaWdodCA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCA9PSByaWdodDsgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbm90ZXF1YWw6IGZ1bmN0aW9uIChsZWZ0LCByaWdodCkgeyBcbiAgICAgICAgICAgICAgICBpZihsZWZ0ID09IG51bGwgJiYgcmlnaHQgIT0gbnVsbCB8fCBsZWZ0ICE9IG51bGwgJiYgcmlnaHQgPT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgaWYobGVmdCA9PSBudWxsICYmIHJpZ2h0ID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCAhPSByaWdodDsgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGFpbnM6IGZ1bmN0aW9uIChsZWZ0LCByaWdodCkgeyBcbiAgICAgICAgICAgICAgICBpZighbGVmdCB8fCAhbGVmdC5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVmdC5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYobGVmdFtpXSA9PSByaWdodCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBub3Rjb250YWluczogZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7IFxuICAgICAgICAgICAgICAgIGlmKCFsZWZ0IHx8ICFsZWZ0Lmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlZnQubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKGxlZnRbaV0gPT0gcmlnaHQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ3JlYXRlcjogZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7IFxuICAgICAgICAgICAgICAgIGlmKGxlZnQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmKHJpZ2h0ID09IG51bGwpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ID4gcmlnaHQ7IFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlc3M6IGZ1bmN0aW9uIChsZWZ0LCByaWdodCkgeyBcbiAgICAgICAgICAgICAgICBpZihyaWdodCA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYobGVmdCA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCA8IHJpZ2h0OyBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBncmVhdGVyb3JlcXVhbDogZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7IFxuICAgICAgICAgICAgICAgIGlmKGxlZnQgPT0gbnVsbCAmJiByaWdodCAhPSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYocmlnaHQgPT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgPj0gcmlnaHQ7IFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlc3NvcmVxdWFsOiBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsgXG4gICAgICAgICAgICAgICAgaWYobGVmdCAhPSBudWxsICYmIHJpZ2h0ID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZihsZWZ0ID09IG51bGwpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0IDw9IHJpZ2h0OyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIENvbmRpdGlvbi5vcGVyYXRvcnNWYWx1ZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRPcGVyYXRvcihvcE5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIHJldHVybiBDb25kaXRpb24ub3BlcmF0b3JzW29wTmFtZV07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2V0T3BlcmF0b3Iob3BOYW1lOiBzdHJpbmcsIGZ1bmM6IChsZWZ0OiBhbnksIHJpZ2h0OiBhbnkpID0+IGJvb2xlYW4pIHtcbiAgICAgICAgQ29uZGl0aW9uLm9wZXJhdG9yc1tvcE5hbWVdID0gZnVuYztcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0NvcnJlY3RPcGVyYXRvcihvcE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZighb3BOYW1lKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIG9wTmFtZSA9IG9wTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gQ29uZGl0aW9uLm9wZXJhdG9yc1tvcE5hbWVdICE9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc05vUmlnaHRPcGVyYXRpb24ob3A6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gb3AgPT0gXCJlbXB0eVwiIHx8IG9wID09IFwibm90ZW1wdHlcIjtcbiAgICB9XG4gICAgcHJpdmF0ZSBvcFZhbHVlOiBzdHJpbmcgPSBcImVxdWFsXCI7XG4gICAgcHJpdmF0ZSBsZWZ0VmFsdWU6IE9wZXJhbmQgPSBudWxsO1xuICAgIHByaXZhdGUgcmlnaHRWYWx1ZTogT3BlcmFuZCA9IG51bGw7XG4gICAgcHVibGljIGdldCBsZWZ0KCk6IE9wZXJhbmQgeyByZXR1cm4gdGhpcy5sZWZ0VmFsdWU7IH1cbiAgICBwdWJsaWMgc2V0IGxlZnQodmFsOiBPcGVyYW5kKSB7IHRoaXMubGVmdFZhbHVlID0gdmFsOyB9XG4gICAgcHVibGljIGdldCByaWdodCgpOiBPcGVyYW5kIHsgcmV0dXJuIHRoaXMucmlnaHRWYWx1ZTsgfVxuICAgIHB1YmxpYyBzZXQgcmlnaHQodmFsOiBPcGVyYW5kKSB7IHRoaXMucmlnaHRWYWx1ZSA9IHZhbDsgfVxuICAgIHB1YmxpYyBnZXQgb3BlcmF0b3IoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMub3BWYWx1ZTsgfVxuICAgIHB1YmxpYyBzZXQgb3BlcmF0b3IodmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCFDb25kaXRpb24ub3BlcmF0b3JzW3ZhbHVlXSkgcmV0dXJuO1xuICAgICAgICB0aGlzLm9wVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgcHVibGljIHBlcmZvcm0obGVmdDogYW55ID0gbnVsbCwgcmlnaHQ6IGFueSA9IG51bGwsIHByb2Nlc3NWYWx1ZTogUHJvY2Vzc1ZhbHVlID0gbnVsbCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWxlZnQpIGxlZnQgPSB0aGlzLmxlZnQ7XG4gICAgICAgIGlmICghcmlnaHQpIHJpZ2h0ID0gdGhpcy5yaWdodDtcbiAgICAgICAgcmV0dXJuIHRoaXMucGVyZm9ybUV4cGxpY2l0KGxlZnQsIHJpZ2h0LCBwcm9jZXNzVmFsdWUpO1xuICAgIH1cbiAgICBwdWJsaWMgcGVyZm9ybUV4cGxpY2l0KGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgcHJvY2Vzc1ZhbHVlOiBQcm9jZXNzVmFsdWUpIDogYm9vbGVhbiB7XG4gICAgICAgIHZhciBsZWZ0VmFsdWUgPSBsZWZ0ID8gbGVmdC5nZXRWYWx1ZShwcm9jZXNzVmFsdWUpIDogbnVsbDtcbiAgICAgICAgaWYoIXJpZ2h0ICYmIChsZWZ0VmFsdWUgPT09IHRydWUgfHwgbGVmdFZhbHVlID09PSBmYWxzZSkpIHJldHVybiBsZWZ0VmFsdWU7XG4gICAgICAgIHZhciByaWdodFZhbHVlID0gcmlnaHQgPyByaWdodC5nZXRWYWx1ZShwcm9jZXNzVmFsdWUpIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIENvbmRpdGlvbi5vcGVyYXRvcnNbdGhpcy5vcGVyYXRvcl0obGVmdFZhbHVlLCByaWdodFZhbHVlKTtcbiAgICB9XG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdGhpcy5yaWdodCB8fCAhdGhpcy5vcGVyYXRvcikgcmV0dXJuIFwiXCI7XG4gICAgICAgIHZhciBsZWZ0ID0gdGhpcy5sZWZ0LnRvU3RyaW5nKCk7XG4gICAgICAgIHZhciByZXMgPSBsZWZ0ICsgJyAnICsgdGhpcy5vcGVyYXRpb25Ub1N0cmluZygpO1xuICAgICAgICBpZiAoQ29uZGl0aW9uLmlzTm9SaWdodE9wZXJhdGlvbih0aGlzLm9wZXJhdG9yKSkgcmV0dXJuIHJlcztcbiAgICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5yaWdodC50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gcmVzICsgJyAnICsgcmlnaHQ7XG4gICAgfVxuICAgIHByaXZhdGUgb3BlcmF0aW9uVG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgdmFyIG9wID0gdGhpcy5vcGVyYXRvcjtcbiAgICAgICAgaWYgKG9wID09IFwiZXF1YWxcIikgcmV0dXJuIFwiPVwiO1xuICAgICAgICBpZiAob3AgPT0gXCJub3RlcXVhbFwiKSByZXR1cm4gXCIhPVwiO1xuICAgICAgICBpZiAob3AgPT0gXCJncmVhdGVyXCIpIHJldHVybiBcIj5cIjtcbiAgICAgICAgaWYgKG9wID09IFwibGVzc1wiKSByZXR1cm4gXCI8XCI7XG4gICAgICAgIGlmIChvcCA9PSBcImdyZWF0ZXJvcmVxdWFsXCIpIHJldHVybiBcIj49XCI7XG4gICAgICAgIGlmIChvcCA9PSBcImxlc3NvcmVxdWFsXCIpIHJldHVybiBcIjw9XCI7XG4gICAgICAgIHJldHVybiBvcDtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uTm9kZSB7XG4gICAgcHJpdmF0ZSBjb25uZWN0aXZlVmFsdWU6IHN0cmluZyA9IFwiYW5kXCI7XG4gICAgcHVibGljIGNoaWxkcmVuOiBBcnJheTxhbnk+ID0gW107XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkgeyB9XG4gICAgcHVibGljIGdldCBjb25uZWN0aXZlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmNvbm5lY3RpdmVWYWx1ZTsgfVxuICAgIHB1YmxpYyBzZXQgY29ubmVjdGl2ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybjtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT0gXCImXCIgfHwgdmFsdWUgPT0gXCImJlwiKSB2YWx1ZSA9IFwiYW5kXCI7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBcInxcIiB8fCB2YWx1ZSA9PSBcInx8XCIpIHZhbHVlID0gXCJvclwiO1xuICAgICAgICBpZiAodmFsdWUgIT0gXCJhbmRcIiAmJiB2YWx1ZSAhPSBcIm9yXCIpIHJldHVybjtcbiAgICAgICAgdGhpcy5jb25uZWN0aXZlVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBpc0VtcHR5KCkgeyByZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGggPT0gMDsgfVxuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgICAgICB0aGlzLmNvbm5lY3RpdmUgPSBcImFuZFwiO1xuICAgIH1cbiAgICBwdWJsaWMgdG9TdHJpbmcoKSA6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkpIHJldHVybiBcIlwiO1xuICAgICAgICB2YXIgcmVzID0gXCJcIjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgdmFyIG5vZGVUZXh0ID0gY2hpbGQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGlmKGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBub2RlVGV4dCA9ICcoJyArIG5vZGVUZXh0ICsgJyknO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGVUZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcykgcmVzICs9ICcgJyArIHRoaXMuY29ubmVjdGl2ZSArICcgJztcbiAgICAgICAgICAgICAgICByZXMgKz0gbm9kZVRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgRXhwcmVzc2lvblJ1bm5lciB7XG4gICAgcHJpdmF0ZSBleHByZXNzaW9uVmFsdWU6IHN0cmluZztcbiAgICBwcml2YXRlIHByb2Nlc3NWYWx1ZTogUHJvY2Vzc1ZhbHVlO1xuICAgIHByaXZhdGUgb3BlcmFuZDogT3BlcmFuZDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgICAgIHRoaXMucHJvY2Vzc1ZhbHVlID0gbmV3IFByb2Nlc3NWYWx1ZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGV4cHJlc3Npb24oKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZXhwcmVzc2lvblZhbHVlOyB9XG4gICAgcHVibGljIHNldCBleHByZXNzaW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbiA9PSB2YWx1ZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25WYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm9wZXJhbmQgPSBuZXcgQ29uZGl0aW9uc1BhcnNlcigpLnBhcnNlRXhwcmVzc2lvbih0aGlzLmV4cHJlc3Npb25WYWx1ZSk7XG4gICAgfVxuICAgIHB1YmxpYyBydW4odmFsdWVzOiBIYXNoVGFibGU8YW55Pik6IGFueSB7XG4gICAgICAgIGlmKCF0aGlzLm9wZXJhbmQpIHJldHVybiBudWxsO1xuICAgICAgICB0aGlzLnByb2Nlc3NWYWx1ZS52YWx1ZXMgPSB2YWx1ZXM7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZXJhbmQuZ2V0VmFsdWUodGhpcy5wcm9jZXNzVmFsdWUpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25SdW5uZXIge1xuICAgIHByaXZhdGUgZXhwcmVzc2lvblZhbHVlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBwcm9jZXNzVmFsdWU6IFByb2Nlc3NWYWx1ZTtcbiAgICBwcml2YXRlIHJvb3Q6IENvbmRpdGlvbk5vZGU7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IHN0cmluZykge1xuICAgICAgICB0aGlzLnJvb3QgPSBuZXcgQ29uZGl0aW9uTm9kZSgpO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICB0aGlzLnByb2Nlc3NWYWx1ZSA9IG5ldyBQcm9jZXNzVmFsdWUoKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBleHByZXNzaW9uKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmV4cHJlc3Npb25WYWx1ZTsgfVxuICAgIHB1YmxpYyBzZXQgZXhwcmVzc2lvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb24gPT0gdmFsdWUpIHJldHVybjtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgbmV3IENvbmRpdGlvbnNQYXJzZXIoKS5wYXJzZSh0aGlzLmV4cHJlc3Npb25WYWx1ZSwgdGhpcy5yb290KTtcbiAgICB9XG4gICAgcHVibGljIHJ1bih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+KTogYm9vbGVhbiB7XG4gICAgICAgIHRoaXMucHJvY2Vzc1ZhbHVlLnZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgcmV0dXJuIHRoaXMucnVuTm9kZSh0aGlzLnJvb3QpO1xuICAgIH1cbiAgICBwcml2YXRlIHJ1bk5vZGUobm9kZTogQ29uZGl0aW9uTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICB2YXIgb25GaXJzdEZhaWwgPSBub2RlLmNvbm5lY3RpdmUgPT0gXCJhbmRcIjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcmVzID0gdGhpcy5ydW5Ob2RlQ29uZGl0aW9uKG5vZGUuY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgaWYgKCFyZXMgJiYgb25GaXJzdEZhaWwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChyZXMgJiYgIW9uRmlyc3RGYWlsKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb25GaXJzdEZhaWw7XG4gICAgfVxuICAgIHByaXZhdGUgcnVuTm9kZUNvbmRpdGlvbih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh2YWx1ZVtcImNoaWxkcmVuXCJdKSByZXR1cm4gdGhpcy5ydW5Ob2RlKHZhbHVlKTtcbiAgICAgICAgaWYgKHZhbHVlW1wibGVmdFwiXSkgcmV0dXJuIHRoaXMucnVuQ29uZGl0aW9uKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBwcml2YXRlIHJ1bkNvbmRpdGlvbihjb25kaXRpb246IENvbmRpdGlvbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY29uZGl0aW9uLnBlcmZvcm1FeHBsaWNpdChjb25kaXRpb24ubGVmdCwgY29uZGl0aW9uLnJpZ2h0LCB0aGlzLnByb2Nlc3NWYWx1ZSk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NvbmRpdGlvbnMudHMiLCJleHBvcnQgaW50ZXJmYWNlIEhhc2hUYWJsZTxUPiB7XG4gICAgW2tleTogc3RyaW5nXTogVDtcbn1cblxuZXhwb3J0IGNsYXNzIEhlbHBlcnMge1xuICAgIC8qKlxuICAgICAqIEEgc3RhdGljIG1ldGhvZHMgdGhhdCByZXR1cm5zIHRydWUgaWYgYSB2YWx1ZSB1bmRlcmZpbmVkLCBudWxsLCBlbXB0eSBzdHJpbmcgb3IgZW1wdHkgYXJyYXkuXG4gICAgICogQHBhcmFtIHZhbHVlIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNWYWx1ZUVtcHR5KHZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmKHZhbHVlICYmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICF2YWx1ZSAmJiB2YWx1ZSAhPT0gMCAmJiB2YWx1ZSAhPT0gZmFsc2U7XG4gICAgfVxufVxuaWYgKCFTdHJpbmcucHJvdG90eXBlW1wiZm9ybWF0XCJdKSB7XG4gICAgU3RyaW5nLnByb3RvdHlwZVtcImZvcm1hdFwiXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UoL3soXFxkKyl9L2csIGZ1bmN0aW9uIChtYXRjaCwgbnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFyZ3NbbnVtYmVyXSAhPSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gYXJnc1tudW1iZXJdXG4gICAgICAgICAgICAgICAgOiBtYXRjaFxuICAgICAgICAgICAgICAgIDtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvaGVscGVycy50cyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7U3VydmV5RWxlbWVudEJhc2UsIFJlYWN0U3VydmV5RWxlbWVudCwgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcbmltcG9ydCB7UXVlc3Rpb25Db21tZW50TW9kZWx9IGZyb20gXCIuLi9xdWVzdGlvbl9jb21tZW50XCI7XG5pbXBvcnQge1F1ZXN0aW9ufSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7UmVhY3RRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkNvbW1lbnQgZXh0ZW5kcyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHsgdmFsdWU6IHRoaXMuZ2V0U3RhdGVWYWx1ZSgpIH07XG4gICAgICAgIHRoaXMuaGFuZGxlT25DaGFuZ2UgPSB0aGlzLmhhbmRsZU9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuaGFuZGxlT25CbHVyID0gdGhpcy5oYW5kbGVPbkJsdXIuYmluZCh0aGlzKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbkNvbW1lbnRNb2RlbCB7IHJldHVybiB0aGlzLnF1ZXN0aW9uQmFzZSBhcyBRdWVzdGlvbkNvbW1lbnRNb2RlbDsgfVxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzOiBhbnkpIHtcbiAgICAgICAgc3VwZXIuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmFsdWU6IHRoaXMuZ2V0U3RhdGVWYWx1ZSgpIH0pO1xuICAgIH1cbiAgICBoYW5kbGVPbkNoYW5nZShldmVudCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmFsdWU6IGV2ZW50LnRhcmdldC52YWx1ZSB9KTtcbiAgICB9XG4gICAgaGFuZGxlT25CbHVyKGV2ZW50KSB7XG4gICAgICAgIHRoaXMucXVlc3Rpb24udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdGhpcy5nZXRTdGF0ZVZhbHVlKCkgfSk7XG4gICAgfVxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIGlmICghdGhpcy5xdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBjc3NDbGFzc2VzID0gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPXt0aGlzLnF1ZXN0aW9uLmlucHV0SWR9IGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5yb290fSB0eXBlPVwidGV4dFwiIHJlYWRPbmx5PXt0aGlzLmlzRGlzcGxheU1vZGV9IHZhbHVlPXt0aGlzLnN0YXRlLnZhbHVlfSBwbGFjZWhvbGRlcj17dGhpcy5xdWVzdGlvbi5wbGFjZUhvbGRlcn0gb25CbHVyPXt0aGlzLmhhbmRsZU9uQmx1cn0gb25DaGFuZ2U9e3RoaXMuaGFuZGxlT25DaGFuZ2V9IGNvbHM9e3RoaXMucXVlc3Rpb24uY29sc30gcm93cz17dGhpcy5xdWVzdGlvbi5yb3dzfSBhcmlhLWxhYmVsPXt0aGlzLnF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH0vPlxuICAgICAgICApO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFN0YXRlVmFsdWUoKTogYW55IHsgcmV0dXJuICF0aGlzLnF1ZXN0aW9uLmlzRW1wdHkoKSA/IHRoaXMucXVlc3Rpb24udmFsdWU6ICcnOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkNvbW1lbnRJdGVtIGV4dGVuZHMgUmVhY3RTdXJ2ZXlFbGVtZW50IHtcbiAgICBwcml2YXRlIHF1ZXN0aW9uOiBRdWVzdGlvbjtcbiAgICBwcml2YXRlIGNvbW1lbnQ6IHN0cmluZztcbiAgICBwcml2YXRlIG90aGVyQ3NzOiBzdHJpbmc7XG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSBwcm9wcy5xdWVzdGlvbjtcbiAgICAgICAgdGhpcy5jb21tZW50ID0gdGhpcy5xdWVzdGlvbi5jb21tZW50O1xuICAgICAgICB0aGlzLm90aGVyQ3NzID0gcHJvcHMub3RoZXJDc3M7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7IHZhbHVlOiB0aGlzLmNvbW1lbnQgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVPbkNoYW5nZSA9IHRoaXMuaGFuZGxlT25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVPbkJsdXIgPSB0aGlzLmhhbmRsZU9uQmx1ci5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICBoYW5kbGVPbkNoYW5nZShldmVudCkge1xuICAgICAgICB0aGlzLmNvbW1lbnQgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdGhpcy5jb21tZW50IH0pO1xuICAgIH1cbiAgICBoYW5kbGVPbkJsdXIoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbi5jb21tZW50ID0gdGhpcy5jb21tZW50O1xuICAgIH1cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wczogYW55KSB7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSBuZXh0UHJvcHMucXVlc3Rpb247XG4gICAgfVxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIGlmICghdGhpcy5xdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICh0aGlzLmlzRGlzcGxheU1vZGUpXG4gICAgICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXt0aGlzLmNzc0NsYXNzZXMuY29tbWVudH0+e3RoaXMuY29tbWVudH08L2Rpdj4pO1xuICAgICAgICB2YXIgY2xhc3NOYW1lID0gdGhpcy5vdGhlckNzcyA/IHRoaXMub3RoZXJDc3MgOiB0aGlzLmNzc0NsYXNzZXMuY29tbWVudDtcbiAgICAgICAgcmV0dXJuICg8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzc05hbWU9e2NsYXNzTmFtZX0gdmFsdWU9e3RoaXMuc3RhdGUudmFsdWV9IG9uQ2hhbmdlPXt0aGlzLmhhbmRsZU9uQ2hhbmdlfSBvbkJsdXI9e3RoaXMuaGFuZGxlT25CbHVyfSBhcmlhLWxhYmVsPXt0aGlzLnF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH0vPik7XG4gICAgfVxufVxuXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiY29tbWVudFwiLCAocHJvcHMpID0+IHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbkNvbW1lbnQsIHByb3BzKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25jb21tZW50LnRzeCIsImltcG9ydCB7SGFzaFRhYmxlfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5leHBvcnQgY2xhc3MgUHJvY2Vzc1ZhbHVlIHtcbiAgICBwdWJsaWMgdmFsdWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGw7ICAgIFxuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG4gICAgcHVibGljIGdldEZpcnN0TmFtZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXRleHQpIHJldHVybiB0ZXh0O1xuICAgICAgICB2YXIgcmVzID0gXCJcIjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2ggPSB0ZXh0W2ldO1xuICAgICAgICAgICAgaWYgKGNoID09ICcuJyB8fCBjaCA9PSAnWycpIGJyZWFrO1xuICAgICAgICAgICAgcmVzICs9IGNoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHB1YmxpYyBoYXNWYWx1ZSh0ZXh0OiBzdHJpbmcsIHZhbHVlczogSGFzaFRhYmxlPGFueT4gPSBudWxsKTogYm9vbGVhbiB7XG4gICAgICAgIGlmKCF2YWx1ZXMpIHZhbHVlcyA9IHRoaXMudmFsdWVzO1xuICAgICAgICB2YXIgcmVzID0gdGhpcy5nZXRWYWx1ZUNvcmUodGV4dCwgdmFsdWVzKTtcbiAgICAgICAgcmV0dXJuIHJlcy5oYXNWYWx1ZTtcbiAgICB9XG4gICAgcHVibGljIGdldFZhbHVlKHRleHQ6IHN0cmluZywgdmFsdWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGwpOiBhbnkge1xuICAgICAgICBpZighdmFsdWVzKSB2YWx1ZXMgPSB0aGlzLnZhbHVlcztcbiAgICAgICAgdmFyIHJlcyA9IHRoaXMuZ2V0VmFsdWVDb3JlKHRleHQsIHZhbHVlcyk7XG4gICAgICAgIHJldHVybiByZXMudmFsdWU7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0VmFsdWVDb3JlKHRleHQ6IHN0cmluZywgdmFsdWVzOiBhbnkpOiBhbnkge1xuICAgICAgICB2YXIgcmVzID0geyBoYXNWYWx1ZTogZmFsc2UsIHZhbHVlOiBudWxsIH07XG4gICAgICAgIHZhciBjdXJWYWx1ZSA9IHZhbHVlcztcbiAgICAgICAgaWYgKCFjdXJWYWx1ZSkgcmV0dXJuIHJlcztcbiAgICAgICAgdmFyIGlzRmlyc3QgPSB0cnVlO1xuICAgICAgICB3aGlsZSAodGV4dCAmJiB0ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBpc0FycmF5ID0gIWlzRmlyc3QgJiYgdGV4dFswXSA9PSAnWyc7XG4gICAgICAgICAgICBpZiAoIWlzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzRmlyc3QpIHRleHQgPSB0ZXh0LnN1YnN0cigxKTtcbiAgICAgICAgICAgICAgICB2YXIgY3VyTmFtZSA9IHRoaXMuZ2V0Rmlyc3ROYW1lKHRleHQpO1xuICAgICAgICAgICAgICAgIGlmICghY3VyTmFtZSkgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICBpZiAoIWN1clZhbHVlW2N1ck5hbWVdKSByZXR1cm4gcmVzO1xuICAgICAgICAgICAgICAgIGN1clZhbHVlID0gY3VyVmFsdWVbY3VyTmFtZV1cbiAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHIoY3VyTmFtZS5sZW5ndGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY3VyVmFsdWUpKSByZXR1cm4gcmVzO1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IDE7XG4gICAgICAgICAgICAgICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgdGV4dC5sZW5ndGggJiYgdGV4dFtpbmRleF0gIT0gJ10nKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciArPSB0ZXh0W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGV4dCA9IGluZGV4IDwgdGV4dC5sZW5ndGggPyB0ZXh0LnN1YnN0cihpbmRleCArIDEpIDogXCJcIjtcbiAgICAgICAgICAgICAgICBpbmRleCA9IHRoaXMuZ2V0SW50VmFsdWUoc3RyKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGN1clZhbHVlLmxlbmd0aCkgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICBjdXJWYWx1ZSA9IGN1clZhbHVlW2luZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXMudmFsdWUgPSBjdXJWYWx1ZTtcbiAgICAgICAgcmVzLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRJbnRWYWx1ZShzdHI6IGFueSkge1xuICAgICAgICBpZiAoc3RyID09IFwiMFwiIHx8ICgoc3RyIHwgMCkgPiAwICYmIHN0ciAlIDEgPT0gMCkpXG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyKHN0cik7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29uZGl0aW9uUHJvY2Vzc1ZhbHVlLnRzIiwiaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQge1F1ZXN0aW9ufSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHtTdXJ2ZXlFcnJvcn0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHtJdGVtVmFsdWV9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7Q3VzdG9tRXJyb3J9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQge0Nob2ljZXNSZXN0ZnVsbH0gZnJvbSBcIi4vY2hvaWNlc1Jlc3RmdWxsXCI7XG5pbXBvcnQge0xvY2FsaXphYmxlU3RyaW5nfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuXG4vKipcbiAqIEl0IGlzIGEgYmFzZSBjbGFzcyBmb3IgY2hlY2tib3gsIGRyb3Bkb3duIGFuZCByYWRpb2dyb3VwIHF1ZXN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uU2VsZWN0QmFzZSBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgICBwcml2YXRlIHZpc2libGVDaG9pY2VzQ2FjaGU6IEFycmF5PEl0ZW1WYWx1ZT4gPSBudWxsO1xuICAgIHByaXZhdGUgY29tbWVudFZhbHVlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvdGhlckl0ZW1WYWx1ZTogSXRlbVZhbHVlID0gbmV3IEl0ZW1WYWx1ZShcIm90aGVyXCIsIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlckl0ZW1UZXh0XCIpKTtcbiAgICBwcm90ZWN0ZWQgY2FjaGVkVmFsdWU6IGFueTtcbiAgICBwcml2YXRlIGNob2ljZXNGcm9tVXJsOiBBcnJheTxJdGVtVmFsdWU+ID0gbnVsbDtcbiAgICBwcml2YXRlIGNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHM6IGFueSA9IG51bGw7XG4gICAgcHJpdmF0ZSBjaG9pY2VzVmFsdWVzOiBBcnJheTxJdGVtVmFsdWU+O1xuICAgIC8qKlxuICAgICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGZpbGwgdGhlIGNob2ljZXMgZnJvbSBhIHJlc3RmdWwgc2VydmljZS5cbiAgICAgKiBAc2VlIGNob2ljZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgY2hvaWNlc0J5VXJsOiBDaG9pY2VzUmVzdGZ1bGw7XG4gICAgY2hvaWNlc0NoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIobmFtZSk7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy5jaG9pY2VzVmFsdWVzID0gdGhpcy5jcmVhdGVJdGVtVmFsdWVzKFwiY2hvaWNlc1wiKTtcbiAgICAgICAgdGhpcy5jaG9pY2VzQnlVcmwgPSB0aGlzLmNyZWF0ZVJlc3RmdWxsKCk7XG4gICAgICAgIHRoaXMuY2hvaWNlc0J5VXJsLm93bmVyID0gdGhpcztcbiAgICAgICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcIm90aGVyVGV4dFwiLCB0aGlzLCB0cnVlKTtcbiAgICAgICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcIm90aGVyRXJyb3JUZXh0XCIsIHRoaXMsIHRydWUpO1xuICAgICAgICB0aGlzLm90aGVySXRlbVZhbHVlLmxvY093bmVyID0gdGhpcztcblxuICAgICAgICB0aGlzLmNob2ljZXNCeVVybC5nZXRSZXN1bHRDYWxsYmFjayA9IGZ1bmN0aW9uIChpdGVtczogQXJyYXk8SXRlbVZhbHVlPikgeyBzZWxmLm9uTG9hZENob2ljZXNGcm9tVXJsKGl0ZW1zKSB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBvdGhlciBpdGVtLiBCeSB1c2luZyB0aGlzIHByb3BlcnR5LCB5b3UgbWF5IGNoYW5nZSBwcm9ncmFtbWF0aWNhbGx5IGl0J3MgdmFsdWUgYW5kIHRleHQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBvdGhlckl0ZW0oKTogSXRlbVZhbHVlIHtcbiAgICAgICAgdGhpcy5vdGhlckl0ZW1WYWx1ZS50ZXh0ID0gdGhpcy5vdGhlclRleHQgPyB0aGlzLm90aGVyVGV4dCA6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlckl0ZW1UZXh0XCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5vdGhlckl0ZW1WYWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIGEgdXNlciBzZWxlY3QgdGhlICdvdGhlcicgaXRlbS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzT3RoZXJTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RvcmVPdGhlcnNBc0NvbW1lbnQoKSA/IHRoaXMuZ2V0SGFzT3RoZXIodGhpcy52YWx1ZSkgOiB0aGlzLmdldEhhc090aGVyKHRoaXMuY2FjaGVkVmFsdWUpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0SGFzT3RoZXIodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHZhbCA9PSB0aGlzLm90aGVySXRlbS52YWx1ZTtcbiAgICB9XG4gICAgZ2V0IHZhbGlkYXRlZFZhbHVlKCk6IGFueSB7ICByZXR1cm4gdGhpcy52YWx1ZVRvRGF0YUNvcmUodGhpcy52YWx1ZSk7IH1cbiAgICBwcm90ZWN0ZWQgY3JlYXRlUmVzdGZ1bGwoKTogQ2hvaWNlc1Jlc3RmdWxsIHsgcmV0dXJuIG5ldyBDaG9pY2VzUmVzdGZ1bGwoKTsgfVxuICAgIHByb3RlY3RlZCBnZXRDb21tZW50KCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkpIHJldHVybiBzdXBlci5nZXRDb21tZW50KCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1lbnRWYWx1ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBpc1NldHRpbmdDb21tZW50OiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIHNldENvbW1lbnQobmV3VmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpKVxuICAgICAgICAgICAgc3VwZXIuc2V0Q29tbWVudChuZXdWYWx1ZSk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2V0dGluZ0NvbW1lbnQgJiYgbmV3VmFsdWUgIT0gdGhpcy5jb21tZW50VmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2V0dGluZ0NvbW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY29tbWVudFZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNPdGhlclNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0TmV3VmFsdWVJbkRhdGEodGhpcy5jYWNoZWRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaXNTZXR0aW5nQ29tbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHByb3RlY3RlZCBzZXROZXdWYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuY2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyA9IG5ld1ZhbHVlO1xuICAgICAgICBzdXBlci5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gICAgfVxuICAgIHByb3RlY3RlZCB2YWx1ZUZyb21EYXRhKHZhbDogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0U3RvcmVPdGhlcnNBc0NvbW1lbnQoKSkgcmV0dXJuIHN1cGVyLnZhbHVlRnJvbURhdGEodmFsKTtcbiAgICAgICAgdGhpcy5jYWNoZWRWYWx1ZSA9IHRoaXMudmFsdWVGcm9tRGF0YUNvcmUodmFsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkVmFsdWU7XG4gICAgfVxuICAgIHByb3RlY3RlZCB2YWx1ZVRvRGF0YSh2YWw6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh0aGlzLmdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkpIHJldHVybiBzdXBlci52YWx1ZVRvRGF0YSh2YWwpO1xuICAgICAgICB0aGlzLmNhY2hlZFZhbHVlID0gdmFsO1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZVRvRGF0YUNvcmUodmFsKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHZhbHVlRnJvbURhdGFDb3JlKHZhbDogYW55KTogYW55IHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1Vua25vd25WYWx1ZSh2YWwpKSByZXR1cm4gdmFsO1xuICAgICAgICBpZiAodmFsID09IHRoaXMub3RoZXJJdGVtLnZhbHVlKSByZXR1cm4gdmFsO1xuICAgICAgICB0aGlzLmNvbW1lbnQgPSB2YWw7XG4gICAgICAgIHJldHVybiB0aGlzLm90aGVySXRlbS52YWx1ZTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHZhbHVlVG9EYXRhQ29yZSh2YWw6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh2YWwgPT0gdGhpcy5vdGhlckl0ZW0udmFsdWUgJiYgdGhpcy5nZXRDb21tZW50KCkpIHtcbiAgICAgICAgICAgIHZhbCA9IHRoaXMuZ2V0Q29tbWVudCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIHByb3RlY3RlZCBoYXNVbmtub3duVmFsdWUodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF2YWwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGl0ZW1zID0gdGhpcy5hY3RpdmVDaG9pY2VzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaXRlbXNbaV0udmFsdWUgPT0gdmFsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIGl0ZW1zLiBFdmVyeSBpdGVtIGhhcyB2YWx1ZSBhbmQgdGV4dC4gSWYgdGV4dCBpcyBlbXB0eSwgdGhlIHZhbHVlIGlzIHJlbmRlcmVkLiBUaGUgaXRlbSB0ZXh0IHN1cHBvcnRzIG1hcmtkb3duLlxuICAgICAqIEBzZWUgY2hvaWNlc0J5VXJsXG4gICAgICovXG4gICAgcHVibGljIGdldCBjaG9pY2VzKCk6IEFycmF5PGFueT4geyByZXR1cm4gdGhpcy5jaG9pY2VzVmFsdWVzOyB9XG4gICAgcHVibGljIHNldCBjaG9pY2VzKG5ld1ZhbHVlOiBBcnJheTxhbnk+KSB7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNcIiwgbmV3VmFsdWUpO1xuICAgICAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIGVudGVyZWQgdGV4dCBpbiB0aGUgb3RoZXJzIGlucHV0IGluIHRoZSBjaGVja2JveC9yYWRpb2dyb3VwL2Ryb3Bkb3duIGFyZSBzdG9yZWQgYXMgXCJxdWVzdGlvbiBuYW1lIFwiICsgXCItQ29tbWVudFwiLiBUaGUgdmFsdWUgaXRzZWxmIGlzIFwicXVlc3Rpb24gbmFtZVwiOiBcIm90aGVyc1wiLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSwgdG8gc3RvcmUgdGhlIGVudGVyZWQgdGV4dCBkaXJlY3RseSBpbiB0aGUgXCJxdWVzdGlvbiBuYW1lXCIga2V5LlxuICAgICAqIEBzZWUgU3VydmV5TW9kZWwuc3RvcmVPdGhlcnNBc0NvbW1lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHN0b3JlT3RoZXJzQXNDb21tZW50KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3RvcmVPdGhlcnNBc0NvbW1lbnRcIiwgdHJ1ZSk7IH1cbiAgICBwdWJsaWMgc2V0IHN0b3JlT3RoZXJzQXNDb21tZW50KHZhbDogYm9vbGVhbikgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLCB2YWwpOyB9XG4gICAgcHJvdGVjdGVkIGhhc090aGVyQ2hhbmdlZCgpIHtcbiAgICAgICAgdGhpcy5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byByZW5kZXIgaXRlbXMgaW4gYSBzcGVjaWZpYyBvcmRlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNob2ljZXNPcmRlcigpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc09yZGVyXCIsIFwibm9uZVwiKTsgfVxuICAgIHB1YmxpYyBzZXQgY2hvaWNlc09yZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgICAgIHZhbCA9IHZhbC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsID09IHRoaXMuY2hvaWNlc09yZGVyKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNPcmRlclwiLCB2YWwpO1xuICAgICAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgZGlmZmVyZW50IHRleHQgZm9yIG90aGVyIGl0ZW0uXG4gICAgICovXG4gICAgcHVibGljIGdldCBvdGhlclRleHQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwib3RoZXJUZXh0XCIpOyB9XG4gICAgcHVibGljIHNldCBvdGhlclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJvdGhlclRleHRcIiwgdmFsKTtcbiAgICAgICAgdGhpcy5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgIH1cbiAgICBnZXQgbG9jT3RoZXJUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJvdGhlclRleHRcIik7IH1cbiAgICAvKipcbiAgICAgKiBUaGUgdGV4dCB0aGF0IHNob3dzIHdoZW4gdGhlIG90aGVyIGl0ZW0gaXMgY2hvb3NlZCBieSB0aGUgb3RoZXIgaW5wdXQgaXMgZW1wdHkuXG4gICAgICovXG4gICAgcHVibGljIGdldCBvdGhlckVycm9yVGV4dCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJvdGhlckVycm9yVGV4dFwiKTsgfVxuICAgIHB1YmxpYyBzZXQgb3RoZXJFcnJvclRleHQodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJvdGhlckVycm9yVGV4dFwiLCB2YWwpOyAgfVxuICAgIGdldCBsb2NPdGhlckVycm9yVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwib3RoZXJFcnJvclRleHRcIik7IH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIGl0ZW1zIGFzIHRoZXkgd2lsbCBiZSByZW5kZXJlZC4gSWYgbmVlZGVkIGl0ZW1zIGFyZSBzb3J0ZWQgYW5kIHRoZSBvdGhlciBpdGVtIGlzIGFkZGVkLlxuICAgICAqIEBzZWUgaGFzT3RoZXJcbiAgICAgKiBAc2VlIGNob2ljZXNPcmRlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmlzaWJsZUNob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgICAgIGlmICghdGhpcy5oYXNPdGhlciAmJiB0aGlzLmNob2ljZXNPcmRlciA9PSBcIm5vbmVcIikgcmV0dXJuIHRoaXMuYWN0aXZlQ2hvaWNlcztcbiAgICAgICAgaWYoIXRoaXMudmlzaWJsZUNob2ljZXNDYWNoZSkge1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlQ2hvaWNlc0NhY2hlID0gdGhpcy5zb3J0VmlzaWJsZUNob2ljZXModGhpcy5hY3RpdmVDaG9pY2VzLnNsaWNlKCkpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzT3RoZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpc2libGVDaG9pY2VzQ2FjaGUucHVzaCh0aGlzLm90aGVySXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJsZUNob2ljZXNDYWNoZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhlIGN1cnJlbnQgdmFsdWUuIElmIHRoZSB2YWx1ZSBpcyBudWxsIHRoZW4gcmV0dXJucyBlbXB0eSBzdHJpbmcuIElmICdvdGhlcicgaXMgc2VsZWN0ZWQgdGhlbiByZXR1cm5zIHRoZSB0ZXh0IGZvciBvdGhlciB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRpc3BsYXlWYWx1ZSgpOiBhbnkge1xuICAgICAgICBpZih0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgIHJldHVybiB0aGlzLmdldERpc3BsYXlWYWx1ZSh0aGlzLnZpc2libGVDaG9pY2VzLCB0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZShpdGVtczogSXRlbVZhbHVlW10sIHZhbDogYW55KTogYW55IHtcbiAgICAgICAgaWYodmFsID09IHRoaXMub3RoZXJJdGVtVmFsdWUudmFsdWUpIHJldHVybiB0aGlzLmNvbW1lbnQgPyB0aGlzLmNvbW1lbnQgOiBcIlwiO1xuICAgICAgICB2YXIgc3RyID0gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKGl0ZW1zLCB2YWwpO1xuICAgICAgICByZXR1cm4gKHN0ciA9PSBcIlwiICYmIHZhbCkgPyB2YWwgOiBzdHI7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0IGFjdGl2ZUNob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7IHJldHVybiB0aGlzLmNob2ljZXNGcm9tVXJsID8gdGhpcy5jaG9pY2VzRnJvbVVybCA6IHRoaXMuY2hvaWNlczsgfVxuICAgIHB1YmxpYyBzdXBwb3J0Q29tbWVudCgpOiBib29sZWFuIHsgcmV0dXJuIHRydWU7IH1cbiAgICBwdWJsaWMgc3VwcG9ydE90aGVyKCk6IGJvb2xlYW4geyByZXR1cm4gdHJ1ZTsgfVxuICAgIHByb3RlY3RlZCBvbkNoZWNrRm9yRXJyb3JzKGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+KSB7XG4gICAgICAgIHN1cGVyLm9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3RoZXJTZWxlY3RlZCB8fCB0aGlzLmNvbW1lbnQpIHJldHVybjtcbiAgICAgICAgdmFyIHRleHQgPSB0aGlzLm90aGVyRXJyb3JUZXh0O1xuICAgICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgICAgIHRleHQgPSBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3RoZXJSZXF1aXJlZEVycm9yXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBDdXN0b21FcnJvcih0ZXh0KSk7XG4gICAgfVxuICAgIHB1YmxpYyBvbkxvY2FsZUNoYW5nZWQoKSB7XG4gICAgICAgIHN1cGVyLm9uTG9jYWxlQ2hhbmdlZCgpO1xuICAgICAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpIHsgcmV0dXJuIHRoaXMuc3RvcmVPdGhlcnNBc0NvbW1lbnQgJiYgKHRoaXMuc3VydmV5ICE9IG51bGwgPyB0aGlzLnN1cnZleS5zdG9yZU90aGVyc0FzQ29tbWVudCA6IHRydWUpOyB9XG4gICAgb25TdXJ2ZXlMb2FkKCkge1xuICAgICAgICBzdXBlci5vblN1cnZleUxvYWQoKTtcbiAgICAgICAgdGhpcy5ydW5DaG9pY2VzQnlVcmwoKTtcbiAgICAgICAgdGhpcy5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgIH1cbiAgICBvbkFueVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcpe1xuICAgICAgICBzdXBlci5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICAgICAgdGhpcy5ydW5DaG9pY2VzQnlVcmwoKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBydW5DaG9pY2VzQnlVcmwoKSB7XG4gICAgICAgIGlmICh0aGlzLmNob2ljZXNCeVVybCkge1xuICAgICAgICAgICAgdmFyIHByb2Nlc3NvciA9IHRoaXMuc3VydmV5SW1wbCA/ICB0aGlzLnN1cnZleUltcGwuZ2V0VGV4dFByb2Nlc3NvcigpIDogdGhpcy5zdXJ2ZXk7XG4gICAgICAgICAgICB0aGlzLmNob2ljZXNCeVVybC5ydW4ocHJvY2Vzc29yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIG9uTG9hZENob2ljZXNGcm9tVXJsKGFycmF5OiBBcnJheTxJdGVtVmFsdWU+KSB7XG4gICAgICAgIHZhciBlcnJvckNvdW50ID0gdGhpcy5lcnJvcnMubGVuZ3RoO1xuICAgICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5jaG9pY2VzQnlVcmwgJiYgdGhpcy5jaG9pY2VzQnlVcmwuZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JzLnB1c2godGhpcy5jaG9pY2VzQnlVcmwuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvckNvdW50ID4gMCB8fCB0aGlzLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmVycm9yc0NoYW5nZWRDYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5ld0Nob2ljZXMgPSBudWxsO1xuICAgICAgICB2YXIgY2FjaGVkVmFsdWVzID0gdGhpcy5jcmVhdGVDYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzKHRoaXMuY2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyk7XG4gICAgICAgIGlmIChhcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBuZXdDaG9pY2VzID0gbmV3IEFycmF5PEl0ZW1WYWx1ZT4oKTtcbiAgICAgICAgICAgIEl0ZW1WYWx1ZS5zZXREYXRhKG5ld0Nob2ljZXMsIGFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNob2ljZXNGcm9tVXJsID0gbmV3Q2hvaWNlcztcbiAgICAgICAgaWYobmV3Q2hvaWNlcykge1xuICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy51cGRhdGVDYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzKGNhY2hlZFZhbHVlcyk7XG4gICAgICAgICAgICBpZiAobmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWUudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgIH1cbiAgICBwcml2YXRlIGNyZWF0ZUNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHModmFsOiBhbnkpOiBhbnkge1xuICAgICAgICBpZih0aGlzLmlzVmFsdWVFbXB0eSh2YWwpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgICAgICB2YXIgcmVzID0gW107XG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKHRoaXMuY3JlYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyh2YWxbaV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHZhbCwgaXNFeGlzdHM6ICF0aGlzLmhhc1Vua25vd25WYWx1ZSh2YWwpIH07XG4gICAgfVxuICAgIHByaXZhdGUgdXBkYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyh2YWw6IGFueSk6IGFueSB7XG4gICAgICAgIGlmKHRoaXMuaXNWYWx1ZUVtcHR5KHZhbCkpIHJldHVybiBudWxsO1xuICAgICAgICBpZihBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIHZhciByZXMgPSBbXTtcbiAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHVwZGF0ZWRWYWx1ZSA9IHRoaXMudXBkYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyh2YWxbaV0pO1xuICAgICAgICAgICAgICAgIGlmKHVwZGF0ZWRWYWx1ZSAmJiAhdGhpcy5pc1ZhbHVlRW1wdHkodXBkYXRlZFZhbHVlLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXMucHVzaCh1cGRhdGVkVmFsdWUudmFsdWUpOyBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge3ZhbHVlOiByZXN9O1xuICAgICAgICB9XG4gICAgICAgIHZhciB2YWx1ZSA9IHZhbC5pc0V4aXN0cyAmJiB0aGlzLmhhc1Vua25vd25WYWx1ZSh2YWwudmFsdWUpID8gbnVsbCA6IHZhbC52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHt2YWx1ZTogdmFsdWV9O1xuICAgIH1cbiAgICBwcml2YXRlIG9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCkge1xuICAgICAgICBpZih0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgICAgIHRoaXMudmlzaWJsZUNob2ljZXNDYWNoZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY2hvaWNlc0NoYW5nZWRDYWxsYmFjayk7XG4gICAgfVxuICAgIHByaXZhdGUgc29ydFZpc2libGVDaG9pY2VzKGFycmF5OiBBcnJheTxJdGVtVmFsdWU+KTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgICAgIHZhciBvcmRlciA9IHRoaXMuY2hvaWNlc09yZGVyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChvcmRlciA9PSBcImFzY1wiKSByZXR1cm4gdGhpcy5zb3J0QXJyYXkoYXJyYXksIDEpO1xuICAgICAgICBpZiAob3JkZXIgPT0gXCJkZXNjXCIpIHJldHVybiB0aGlzLnNvcnRBcnJheShhcnJheSwgLTEpO1xuICAgICAgICBpZiAob3JkZXIgPT0gXCJyYW5kb21cIikgcmV0dXJuIHRoaXMucmFuZG9taXplQXJyYXkoYXJyYXkpO1xuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuICAgIHByaXZhdGUgc29ydEFycmF5KGFycmF5OiBBcnJheTxJdGVtVmFsdWU+LCBtdWx0OiBudW1iZXIpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICAgICAgcmV0dXJuIGFycmF5LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIGlmIChhLnRleHQgPCBiLnRleHQpIHJldHVybiAtMSAqIG11bHQ7XG4gICAgICAgICAgICBpZiAoYS50ZXh0ID4gYi50ZXh0KSByZXR1cm4gMSAqIG11bHQ7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHByaXZhdGUgcmFuZG9taXplQXJyYXkoYXJyYXk6IEFycmF5PEl0ZW1WYWx1ZT4pOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICAgICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIHZhciBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICAgICAgICB2YXIgdGVtcCA9IGFycmF5W2ldO1xuICAgICAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgICAgICAgICAgIGFycmF5W2pdID0gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuICAgIGNsZWFyVW51c2VkVmFsdWVzKCkge1xuICAgICAgICBzdXBlci5jbGVhclVudXNlZFZhbHVlcygpO1xuICAgICAgICBpZighdGhpcy5pc090aGVyU2VsZWN0ZWQgJiYgIXRoaXMuaGFzQ29tbWVudCkge1xuICAgICAgICAgICAgdGhpcy5jb21tZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQSBiYXNlIGNsYXNzIGZvciBjaGVja2JveCBhbmQgcmFkaW9ncm91cCBxdWVzdGlvbnMuIEl0IGludHJvZHVjZWQgYSBjb2xDb3VudCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ2hlY2tib3hCYXNlIGV4dGVuZHMgUXVlc3Rpb25TZWxlY3RCYXNlIHtcbiAgICBwcml2YXRlIGNvbENvdW50VmFsdWU6IG51bWJlciA9IDE7XG4gICAgY29sQ291bnRDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihuYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjb2x1bW5zIGZvciByYWRpb2dyb3VwIGFuZCBjaGVja2JveCBxdWVzdGlvbnMuIEl0ZW1zIGFyZSByZW5kcmVkIGluIG9uZSBsaW5lIGlmIHRoZSB2YWx1ZSBpcyAwLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29sQ291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuY29sQ291bnRWYWx1ZTsgfVxuICAgIHB1YmxpYyBzZXQgY29sQ291bnQodmFsdWU6IG51bWJlcikge1xuICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gNCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmNvbENvdW50VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jb2xDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gICAgfVxufVxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcInNlbGVjdGJhc2VcIiwgW1wiaGFzQ29tbWVudDpib29sZWFuXCIsIFwiaGFzT3RoZXI6Ym9vbGVhblwiLFxuICAgIHsgbmFtZTogXCJjaG9pY2VzOml0ZW12YWx1ZXNcIiwgb25HZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55KSB7IHJldHVybiBJdGVtVmFsdWUuZ2V0RGF0YShvYmouY2hvaWNlcyk7IH0sIG9uU2V0VmFsdWU6IGZ1bmN0aW9uIChvYmo6IGFueSwgdmFsdWU6IGFueSkgeyBvYmouY2hvaWNlcyA9IHZhbHVlOyB9fSxcbiAgICB7IG5hbWU6IFwiY2hvaWNlc09yZGVyXCIsIGRlZmF1bHQ6IFwibm9uZVwiLCBjaG9pY2VzOiBbXCJub25lXCIsIFwiYXNjXCIsIFwiZGVzY1wiLCBcInJhbmRvbVwiXSB9LFxuICAgIHsgbmFtZTogXCJjaG9pY2VzQnlVcmw6cmVzdGZ1bGxcIiwgY2xhc3NOYW1lOiBcIkNob2ljZXNSZXN0ZnVsbFwiLCBvbkdldFZhbHVlOiBmdW5jdGlvbiAob2JqOiBhbnkpIHsgcmV0dXJuIG9iai5jaG9pY2VzQnlVcmwuZ2V0RGF0YSgpOyB9LCBvblNldFZhbHVlOiBmdW5jdGlvbiAob2JqOiBhbnksIHZhbHVlOiBhbnkpIHsgb2JqLmNob2ljZXNCeVVybC5zZXREYXRhKHZhbHVlKTsgfSB9LFxuICAgIHsgbmFtZTogXCJvdGhlclRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY090aGVyVGV4dFwiIH0sIHtuYW1lOiBcIm90aGVyRXJyb3JUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NPdGhlckVycm9yVGV4dFwifSxcbiAgICB7IG5hbWU6IFwic3RvcmVPdGhlcnNBc0NvbW1lbnQ6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlfV0sIG51bGwsIFwicXVlc3Rpb25cIik7XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJjaGVja2JveGJhc2VcIiwgW3sgbmFtZTogXCJjb2xDb3VudDpudW1iZXJcIiwgZGVmYXVsdDogMSwgY2hvaWNlczogWzAsIDEsIDIsIDMsIDRdIH1dLCBudWxsLCBcInNlbGVjdGJhc2VcIik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fYmFzZXNlbGVjdC50cyIsImV4cG9ydCBjbGFzcyBUZXh0UHJlUHJvY2Vzc29ySXRlbSB7XG4gICAgcHVibGljIHN0YXJ0OiBudW1iZXI7XG4gICAgcHVibGljIGVuZDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgVGV4dFByZVByb2Nlc3NvciB7XG4gICAgcHJpdmF0ZSBoYXNBbGxWYWx1ZXNPbkxhc3RSdW5WYWx1ZSA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgb25Qcm9jZXNzOiAobmFtZTogc3RyaW5nLCByZXR1cm5EaXNwbGF5VmFsdWU6IGJvb2xlYW4pID0+IGFueTtcbiAgICBwdWJsaWMgb25IYXNWYWx1ZTogKG5hbWU6IHN0cmluZykgPT4gYm9vbGVhbjtcbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxuICAgIHB1YmxpYyBwcm9jZXNzKHRleHQ6IHN0cmluZywgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgICAgICB0aGlzLmhhc0FsbFZhbHVlc09uTGFzdFJ1blZhbHVlID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0ZXh0KSByZXR1cm4gdGV4dDtcbiAgICAgICAgaWYgKCF0aGlzLm9uUHJvY2VzcykgcmV0dXJuIHRleHQ7XG4gICAgICAgIHZhciBpdGVtcyA9IHRoaXMuZ2V0SXRlbXModGV4dCk7XG4gICAgICAgIGZvciAodmFyIGkgPSBpdGVtcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgICAgIHZhciBuYW1lID0gdGhpcy5nZXROYW1lKHRleHQuc3Vic3RyaW5nKGl0ZW0uc3RhcnQgKyAxLCBpdGVtLmVuZCkpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNhblByb2Nlc3NOYW1lKG5hbWUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLm9uSGFzVmFsdWUgJiYgIXRoaXMub25IYXNWYWx1ZShuYW1lKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMub25Qcm9jZXNzKG5hbWUsIHJldHVybkRpc3BsYXlWYWx1ZSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICB2YWx1ZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgIHRoaXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cigwLCBpdGVtLnN0YXJ0KSArIHZhbHVlICsgdGV4dC5zdWJzdHIoaXRlbS5lbmQgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgcHVibGljIGdldCBoYXNBbGxWYWx1ZXNPbkxhc3RSdW4oKSB7IHJldHVybiB0aGlzLmhhc0FsbFZhbHVlc09uTGFzdFJ1blZhbHVlOyB9XG4gICAgcHJpdmF0ZSBnZXRJdGVtcyh0ZXh0OiBzdHJpbmcpOiBBcnJheTxUZXh0UHJlUHJvY2Vzc29ySXRlbT4ge1xuICAgICAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRleHQubGVuZ3RoO1xuICAgICAgICB2YXIgc3RhcnQgPSAtMTtcbiAgICAgICAgdmFyIGNoID0gJyc7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNoID0gdGV4dFtpXTtcbiAgICAgICAgICAgIGlmIChjaCA9PSAneycpIHN0YXJ0ID0gaTtcbiAgICAgICAgICAgIGlmIChjaCA9PSAnfScpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG5ldyBUZXh0UHJlUHJvY2Vzc29ySXRlbSgpO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RhcnQgPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIW5hbWUpIHJldHVybjtcbiAgICAgICAgcmV0dXJuIG5hbWUudHJpbSgpO1xuICAgIH1cbiAgICBwcml2YXRlIGNhblByb2Nlc3NOYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5hbWUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2ggPSBuYW1lW2ldO1xuICAgICAgICAgICAgaWYgKGNoID09ICcgJyB8fCBjaCA9PSAnLScgfHwgY2ggPT0gJyYnKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3RleHRQcmVQcm9jZXNzb3IudHMiLCJpbXBvcnQge0hhc2hUYWJsZX0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQge0Jhc2UsIElTdXJ2ZXksIFN1cnZleUVsZW1lbnQsIElTdXJ2ZXlEYXRhLCBJU3VydmV5SW1wbCwgSVRleHRQcm9jZXNzb3IsIElRdWVzdGlvbiwgSVBhbmVsLCBJRWxlbWVudCwgSUNvbmRpdGlvblJ1bm5lciwgSVBhZ2UsIFN1cnZleUVycm9yLCBFdmVudH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHtJU3VydmV5VHJpZ2dlck93bmVyLCBTdXJ2ZXlUcmlnZ2VyfSBmcm9tIFwiLi90cmlnZ2VyXCI7XG5pbXBvcnQge1BhZ2VNb2RlbH0gZnJvbSBcIi4vcGFnZVwiO1xuaW1wb3J0IHtUZXh0UHJlUHJvY2Vzc29yfSBmcm9tIFwiLi90ZXh0UHJlUHJvY2Vzc29yXCI7XG5pbXBvcnQge1Byb2Nlc3NWYWx1ZX0gZnJvbSBcIi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XG5pbXBvcnQge2R4U3VydmV5U2VydmljZX0gZnJvbSBcIi4vZHhTdXJ2ZXlTZXJ2aWNlXCI7XG5pbXBvcnQge0pzb25FcnJvcn0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7UXVlc3Rpb25CYXNlfSBmcm9tIFwiLi9xdWVzdGlvbmJhc2VcIjtcbmltcG9ydCB7Q3VzdG9tRXJyb3J9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQge0lMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZ30gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7U3R5bGVzTWFuYWdlcn0gZnJvbSBcIi4vc3R5bGVzbWFuYWdlclwiO1xuaW1wb3J0IHtTdXJ2ZXlUaW1lcn0gZnJvbSBcIi4vc3VydmV5dGltZXJcIjtcblxuLyoqXG4gKiBTdXJ2ZXkgb2JqZWN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdXJ2ZXkuIFBhZ2VzLCBRdWVzdGlvbnMsIGZsb3cgbG9naWMgYW5kIGV0Yy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleU1vZGVsIGV4dGVuZHMgQmFzZSBpbXBsZW1lbnRzIElTdXJ2ZXksIElTdXJ2ZXlEYXRhLCBJU3VydmV5SW1wbCwgSVN1cnZleVRyaWdnZXJPd25lciwgSUxvY2FsaXphYmxlT3duZXIge1xuICAgIHByaXZhdGUgc3RhdGljIHN0eWxlc01hbmFnZXIgPSBuZXcgU3R5bGVzTWFuYWdlcigpO1xuICAgIHB1YmxpYyBzdGF0aWMgcGxhdGZvcm06IHN0cmluZyA9IFwidW5rbm93blwiO1xuICAgIHB1YmxpYyBnZXQgcGxhdGZvcm1OYW1lKCk6IHN0cmluZyB7IHJldHVybiBTdXJ2ZXlNb2RlbC5wbGF0Zm9ybTsgfVxuICAgIC8qKlxuICAgICAqIFlvdSBtYXkgc2hvdyBjb21tZW50cyBpbnB1dCBmb3IgdGhlIG1vc3Qgb2YgcXVlc3Rpb25zLiBUaGUgZW50ZXJlZCB0ZXh0IGluIHRoZSBjb21tZW50IGlucHV0IHdpbGwgYmUgc2F2ZWQgYXMgJ3F1ZXN0aW9uIG5hbWUnICsgJ2NvbW1lbnRQcmVmaXgnLlxuICAgICAqIEBzZWUgZGF0YVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29tbWVudFByZWZpeCgpOiBzdHJpbmcgeyByZXR1cm4gIEJhc2UuY29tbWVudFByZWZpeDsgfVxuICAgIHB1YmxpYyBzZXQgY29tbWVudFByZWZpeCh2YWw6IHN0cmluZykge0Jhc2UuY29tbWVudFByZWZpeCA9IHZhbDsgfVxuICAgXG4gICAgcHJpdmF0ZSBwYWdlc1ZhbHVlOiBBcnJheTxQYWdlTW9kZWw+O1xuICAgIHByaXZhdGUgdHJpZ2dlcnNWYWx1ZTogQXJyYXk8U3VydmV5VHJpZ2dlcj47XG4gICAgcHJpdmF0ZSBjdXJyZW50UGFnZVZhbHVlOiBQYWdlTW9kZWwgPSBudWxsO1xuICAgIHByaXZhdGUgdmFsdWVzSGFzaDogSGFzaFRhYmxlPGFueT4gPSB7fTtcbiAgICBwcml2YXRlIHZhcmlhYmxlc0hhc2g6IEhhc2hUYWJsZTxhbnk+ID0ge307XG5cbiAgICBwcml2YXRlIGxvY2FsZVZhbHVlOiBzdHJpbmcgPSBcIlwiO1xuICAgIFxuICAgIHByaXZhdGUgaXNDb21wbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIGlzQ29tcGxldGVkQmVmb3JlOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIHByb2Nlc3NlZFRleHRWYWx1ZXM6IEhhc2hUYWJsZTxhbnk+ID0ge307XG4gICAgcHJpdmF0ZSB0ZXh0UHJlUHJvY2Vzc29yOiBUZXh0UHJlUHJvY2Vzc29yO1xuICAgIHByaXZhdGUgY29tcGxldGVkU3RhdGVWYWx1ZTogc3RyaW5nID0gXCJcIjtcbiAgICBwcml2YXRlIGNvbXBsZXRlZFN0YXRlVGV4dFZhbHVlOiBzdHJpbmcgPSBcIlwiO1xuXG4gICAgcHJpdmF0ZSBpc1RpbWVyU3RhcnRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpcyBmaXJlZCBhZnRlciBhIHVzZXIgY2xpY2sgb24gJ0NvbXBsZXRlJyBidXR0b24gYW5kIGZpbmlzaGVkIHRoZSBzdXJ2ZXkuIFlvdSBtYXkgdXNlIGl0IHRvIHNlbmQgdGhlIGRhdGEgdG8geW91ciB3ZWIgc2VydmVyLlxuICAgICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgICAqIDxici8+IG9wdGlvbnMuc2hvd0RhdGFTYXZpbmcodGV4dCkgY2FsbCB0aGlzIG1ldGhvZCB0byBzaG93IHRoYXQgdGhlIHN1cnZleSBpcyBzYXZpbmcgdGhlIGRhdGEgb24geW91ciBzZXJ2ZXIuIFRoZSB0ZXh0IGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0byBzaG93IHlvdXIgbWVzc2FnZSBpbnN0ZWFkIG9mIGRlZmF1bHQuXG4gICAgICogPGJyLz4gb3B0aW9ucy5zaG93RGF0YVNhdmluZ0Vycm9yKHRleHQpIGNhbGwgdGhpcyBtZXRob2QgdG8gc2hvdyB0aGF0IHRoZXJlIGlzIGFuIGVycm9yIG9uIHNhdmluZyB0aGUgZGF0YSBvbiB5b3VyIHNlcnZlci4gSWYgeW91IHdhbnQgdG8gc2hvdyBhIGN1c3RvbSBlcnJvciwgdXNlIGFuIG9wdGlvbmFsIHRleHQgcGFyYW1ldGVyLlxuICAgICAqIDxici8+IG9wdGlvbnMuc2hvd0RhdGFTYXZpbmdTdWNjZXNzKHRleHQpIGNhbGwgdGhpcyBtZXRob2QgdG8gc2hvdyB0aGF0IHRoZSBkYXRhIHdlcmUgc3VjY2Vzc2Z1bCBzYXZlZCBvbiB0aGUgc2VydmVyLiBcbiAgICAgKiA8YnIvPiBvcHRpb25zLnNob3dEYXRhU2F2aW5nQ2xlYXIgY2FsbCB0aGlzIG1ldGhvZCB0byBoaWRlIHRoZSB0ZXh0IGFib3V0IHRoZSBzYXZpbmcgcHJvZ3Jlc3MuXG4gICAgICogQHNlZSBkYXRhXG4gICAgICogQHNlZSBjbGVhckludmlzaWJsZVZhbHVlc1xuICAgICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgICAqIEBzZWUgc3VydmV5UG9zdElkXG4gICAgICovXG4gICAgcHVibGljIG9uQ29tcGxldGU6IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gY2xpY2tpbmcgJ05leHQnIHBhZ2UgaWYgc2VuZFJlc3VsdE9uUGFnZU5leHQgaXMgc2V0IHRvIHRydWUuIFlvdSBtYXkgdXNlIGl0IHRvIHNhdmUgdGhlIGludGVybWVkaWF0ZSByZXN1bHRzLCBmb3IgZXhhbXBsZSwgaWYgeW91ciBzdXJ2ZXkgaXMgbGFyZ2UgZW5vdWdoLlxuICAgICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgICAqIEBzZWUgc2VuZFJlc3VsdE9uUGFnZU5leHRcbiAgICAgKi9cbiAgICBwdWJsaWMgb25QYXJ0aWFsU2VuZDogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCkgPT4gYW55LCBhbnk+KCk7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHdoZW4gYW5vdGhlciBwYWdlIGJlY29tZXMgdGhlIGN1cnJlbnQuIFR5cGljYWxseSBpdCBoYXBwZW5zIHdoZW4gYSB1c2VyIGNsaWNrIG9uICdOZXh0JyBvciAnUHJldicgYnV0dG9ucy5cbiAgICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICAgKiA8YnIvPiBvcHRpb24ub2xkQ3VycmVudFBhZ2UgdGhlIHByZXZpb3VzIGN1cnJlbnQvYWN0aXZlIHBhZ2VcbiAgICAgKiA8YnIvPiBvcHRpb24ubmV3Q3VycmVudFBhZ2UgYSBuZXcgY3VycmVudC9hY3RpdmUgcGFnZVxuICAgICAqIEBzZWUgY3VycmVudFBhZ2VcbiAgICAgKiBAc2VlIGN1cnJlbnRQYWdlTm9cbiAgICAgKiBAc2VlIG5leHRQYWdlXG4gICAgICogQHNlZSBwcmV2UGFnZVxuICAgICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgICAqL1xuICAgIHB1YmxpYyBvbkN1cnJlbnRQYWdlQ2hhbmdlZDogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpcyBmaXJlZCB3aGVuIHRoZSBxdWVzdGlvbiB2YWx1ZSBpcyBjaGFuZ2VkLiBJdCBjYW4gYmUgZG9uZSB2aWEgVUkgYnkgYSB1c2VyIG9yIHByb2dyYW1tYXRpY2FsbHkgb24gY2FsbGluZyBzZXRWYWx1ZSBtZXRob2QuXG4gICAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAgICogPGJyLz4gb3B0aW9ucy5uYW1lIHRoZSB2YWx1ZSBuYW1lIHRoYXQgaGFzIGJlZW4gY2hhbmdlZFxuICAgICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSBxdWVzdGlvbiB3aGljaCBxdWVzdGlvbi5uYW1lIGVxdWFscyB0byB0aGUgdmFsdWUgbmFtZS4gSWYgdGhlcmUgYXJlIHNldmVyYWwgcXVlc3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSwgdGhlIGZpcnN0IHF1ZXN0aW9uIGlzIHRha2VuLiBJZiB0aGVyZSBpcyBubyBzdWNoIHF1ZXN0aW9ucywgdGhlIG9wdGlvbnMucXVlc3Rpb24gaXMgbnVsbC5cbiAgICAgKiA8YnIvPiBvcHRpb25zLnZhbHVlIGEgbmV3IHZhbHVlXG4gICAgICogQHNlZSBzZXRWYWx1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBvblZhbHVlQ2hhbmdlZDogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBjaGFuZ2luZyBhIHF1ZXN0aW9uIHZpc2liaWxpdHkuXG4gICAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiBhIHF1ZXN0aW9uIHdoaWNoIHZpc2liaWxpdHkgaGFzIGJlZW4gY2hhbmdlZFxuICAgICAqIDxici8+IG9wdGlvbnMubmFtZSBhIHF1ZXN0aW9uIG5hbWVcbiAgICAgKiA8YnIvPiBvcHRpb25zLnZpc2libGUgYSBxdWVzdGlvbiB2aXNpYmxlIGJvb2xlYW4gdmFsdWVcbiAgICAgKiBAc2VlIFF1ZXN0aW9uQmFzZS52aXNpYmlsZVxuICAgICAqIEBzZWUgUXVlc3Rpb25CYXNlLnZpc2liaWxlSWZcbiAgICAgKi9cbiAgICBwdWJsaWMgb25WaXNpYmxlQ2hhbmdlZDogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBjaGFuZ2luZyBhIHBhZ2UgdmlzaWJpbGl0eS5cbiAgICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICAgKiA8YnIvPiBvcHRpb25zLnBhZ2UgYSBwYWdlICB3aGljaCB2aXNpYmlsaXR5IGhhcyBiZWVuIGNoYW5nZWRcbiAgICAgKiA8YnIvPiBvcHRpb25zLnZpc2libGUgYSBwYWdlIHZpc2libGUgYm9vbGVhbiB2YWx1ZVxuICAgICAqIEBzZWUgUGFnZU1vZGVsLnZpc2liaWxlXG4gICAgICogQHNlZSBQYWdlTW9kZWwudmlzaWJpbGVJZlxuICAgICAqL1xuICAgIHB1YmxpYyBvblBhZ2VWaXNpYmxlQ2hhbmdlZDogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBjaGFuZ2luZyBhIHBhbmVsIHZpc2liaWxpdHkuXG4gICAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAgICogPGJyLz4gb3B0aW9ucy5wYW5lbCBhIHBhbmVsIHdoaWNoIHZpc2liaWxpdHkgaGFzIGJlZW4gY2hhbmdlZFxuICAgICAqIDxici8+IG9wdGlvbnMudmlzaWJsZSBhIHBhbmVsIHZpc2libGUgYm9vbGVhbiB2YWx1ZVxuICAgICAqIEBzZWUgUGFuZWxNb2RlbC52aXNpYmlsZVxuICAgICAqIEBzZWUgUGFuZWxNb2RlbC52aXNpYmlsZUlmXG4gICAgICovXG4gICAgcHVibGljIG9uUGFuZWxWaXNpYmxlQ2hhbmdlZDogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBhZGRpbmcgYSBuZXcgcXVlc3Rpb24gaW50byBzdXJ2ZXkuXG4gICAgICogJ3F1ZXN0aW9uJzogcXVlc3Rpb24sICduYW1lJzogcXVlc3Rpb24ubmFtZSwgJ2luZGV4JzogaW5kZXgsICdwYXJlbnRQYW5lbCc6IHBhcmVudFBhbmVsLCAncm9vdFBhbmVsJzogcm9vdFBhbmVsXG4gICAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiBhIG5ld2x5IGFkZGVkIHF1ZXN0aW9uIG9iamVjdC5cbiAgICAgKiA8YnIvPiBvcHRpb25zLm5hbWUgYSBxdWVzdGlvbiBuYW1lXG4gICAgICogPGJyLz4gb3B0aW9ucy5pbmRleCBhIGluZGV4IG9mIHRoZSBxdWVzdGlvbiBpbiB0aGUgY29udGFpbmVyIChwYWdlIG9yIHBhbmVsKVxuICAgICAqIDxici8+IG9wdGlvbnMucGFyZW50UGFuZWwgYSBjb250YWluZXIgd2hlcmUgcXVlc3Rpb24gaXMgbG9jYXRlZC4gSXQgY2FuIGJlIHBhZ2Ugb3IgcGFuZWwuXG4gICAgICogPGJyLz4gb3B0aW9ucy5yb290UGFuZWwgdHlwaWNhbGx5IGl0IGlzIGEgcGFnZS5cbiAgICAgKiBAc2VlIFF1ZXN0aW9uQmFzZVxuICAgICAqL1xuICAgIHB1YmxpYyBvblF1ZXN0aW9uQWRkZWQ6IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gcmVtb3ZpbmcgYSBxdWVzdGlvbiBmcm9tIHN1cnZleVxuICAgICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSByZW1vdmVkIHF1ZXN0aW9uIG9iamVjdC5cbiAgICAgKiA8YnIvPiBvcHRpb25zLm5hbWUgYSBxdWVzdGlvbiBuYW1lXG4gICAgICogQHNlZSBRdWVzdGlvbkJhc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgb25RdWVzdGlvblJlbW92ZWQ6IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gYWRkaW5nIGEgcGFuZWwgaW50byBzdXJ2ZXlcbiAgICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICAgKiA8YnIvPiBvcHRpb25zLnBhbmVsIGEgbmV3bHkgYWRkZWQgcGFuZWwgb2JqZWN0LlxuICAgICAqIDxici8+IG9wdGlvbnMubmFtZSBhIHBhbmVsIG5hbWVcbiAgICAgKiA8YnIvPiBvcHRpb25zLmluZGV4IGEgaW5kZXggb2YgdGhlIHBhbmVsIGluIHRoZSBjb250YWluZXIgKHBhZ2Ugb3IgcGFuZWwpXG4gICAgICogPGJyLz4gb3B0aW9ucy5wYXJlbnRQYW5lbCBhIGNvbnRhaW5lciB3aGVyZSBxdWVzdGlvbiBpcyBsb2NhdGVkLiBJdCBjYW4gYmUgcGFnZSBvciBwYW5lbC5cbiAgICAgKiA8YnIvPiBvcHRpb25zLnJvb3RQYW5lbCB0eXBpY2FsbHkgaXQgaXMgYSBwYWdlLlxuICAgICAqIEBzZWUgUGFuZWxNb2RlbFxuICAgICAqL1xuICAgIHB1YmxpYyBvblBhbmVsQWRkZWQ6IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gcmVtb3ZpbmcgYSBwYW5lbCBmcm9tIHN1cnZleVxuICAgICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgICAqIDxici8+IG9wdGlvbnMucGFuZWwgYSByZW1vdmVkIHBhbmVsIG9iamVjdC5cbiAgICAgKiA8YnIvPiBvcHRpb25zLm5hbWUgYSBwYW5lbCBuYW1lXG4gICAgICogQHNlZSBQYW5lbE1vZGVsXG4gICAgICovXG4gICAgcHVibGljIG9uUGFuZWxSZW1vdmVkOiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIGFkZGluZyBhIHBhZ2UgaW50byBzdXJ2ZXlcbiAgICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICAgKiA8YnIvPiBvcHRpb25zLnBhZ2UgYSBuZXdseSBhZGRlZCBwYW5lbCBvYmplY3QuXG4gICAgICogQHNlZSBQYW5lbE1vZGVsXG4gICAgICovXG4gICAgcHVibGljIG9uUGFnZUFkZGVkOiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIHZhbGlkYXRpbmcgdmFsdWUgaW4gYSBxdWVzdGlvbi4gU2V0IHlvdXIgZXJyb3IgdG8gb3B0aW9ucy5lcnJvciBhbmQgc3VydmV5IHdpbGwgc2hvdyB0aGUgZXJyb3IgZm9yIHRoZSBxdWVzdGlvbiBhbmQgYmxvY2sgY29tcGxldGluZyB0aGUgc3VydmV5IG9yIGdvaW5nIHRvIHRoZSBuZXh0IHBhZ2UuXG4gICAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAgICogPGJyLz4gb3B0aW9ucy5uYW1lIGEgcXVlc3Rpb24gbmFtZVxuICAgICAqIDxici8+IG9wdGlvbnMudmFsdWUgdGhlIGN1cnJlbnQgcXVlc3Rpb24gdmFsdWVcbiAgICAgKiA8YnIvPiBvcHRpb25zLmVycm9yIGFuIGVycm9yIHN0cmluZy4gSXQgaXMgZW1wdHkgYnkgZGVmYXVsdC5cbiAgICAgKiBAc2VlIG9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgb25WYWxpZGF0ZVF1ZXN0aW9uOiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gICAgLyoqXG4gICAgICogVXNlIHRoaXMgZXZlbnQgdG8gdmFsaWRhdGUgZGF0YSBvbiB5b3VyIHNlcnZlci5cbiAgICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICAgKiA8YnIvPiBvcHRpb25zLmRhdGEgdGhlIHZhbHVlcyBvZiBhbGwgbm9uLWVtcHR5IHF1ZXN0aW9ucyBvbiB0aGUgY3VycmVudCBwYWdlLiBZb3UgY2FuIGdldCBhIHF1ZXN0aW9uIHZhbHVlIGFzIG9wdGlvbnMuZGF0YVtcIm15UXVlc3Rpb25OYW1lXCJdLlxuICAgICAqIDxici8+IG9wdGlvbnMuZXJyb3JzIHNldCB5b3VyIGVycm9ycyB0byB0aGlzIG9iamVjdCBhczogb3B0aW9ucy5lcnJvcnNbXCJteVF1ZXN0aW9uTmFtZVwiXSA9IFwiRXJyb3IgdGV4dFwiOy4gSXQgd2lsbCBiZSBzaG93biBhcyBhIHF1ZXN0aW9uIGVycm9yLlxuICAgICAqIEBzZWUgb25WYWxpZGF0ZVF1ZXN0aW9uXG4gICAgICovXG4gICAgcHVibGljIG9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnM6IChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueTtcbiAgICAvKipcbiAgICAgKiBVc2UgdGhpcyBldmVudCB0byBtb2RpZnkgdGhlIGh0bWwgYmVmb3JlIHJlbmRlcmluZywgZm9yIGV4YW1wbGUgaHRtbCBvbiAnVGhhbmsgeW91JyBwYWdlLiBPcHRpb25zIGhhcyBvbmUgcGFyYW1ldGVyOiBvcHRpb25zLmh0bWwuXG4gICAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAgICogPGJyLz4gb3B0aW9ucy5odG1sIGFuIGh0bWwgdGhhdCB5b3UgbWF5IGNoYW5nZSBiZWZvcmUgdGV4dCBwcm9jZXNzaW5nIGFuZCB0aGVuIHJlbmRlcmluZy5cbiAgICAgKiBAc2VlIGNvbXBsZXRlZEh0bWxcbiAgICAgKiBAc2VlIGxvYWRpbmdIdG1sXG4gICAgICogQHNlZSBRdWVzdGlvbkh0bWxNb2RlbC5odG1sXG4gICAgICovXG4gICAgcHVibGljIG9uUHJvY2Vzc0h0bWw6IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgICAvKipcbiAgICAgKiBVc2UgdGhpcyBldmVudCB0byBwcm9jZXNzIHRoZSBtYXJrZG93biB0ZXh0LiBcbiAgICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICAgKiA8YnIvPiBvcHRpb25zLnRleHQgYSB0ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgcmVuZGVyZWRcbiAgICAgKiA8YnIvPiBvcHRpb25zLmh0bWwgYSBodG1sLiBJdCBpcyBudWxsIGJ5IGRlZmF1bHQuIFNldCBpdCBhbmQgc3VydmV5IHdpbGwgdXNlIGl0IGluc3RlYWQgb2Ygb3B0aW9ucy50ZXh0XG4gICAgICovXG4gICAgcHVibGljIG9uVGV4dE1hcmtkb3duOiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IGZpcmVzIHdoZW4gaXQgZ2V0IHJlc3BvbnNlIGZyb20gdGhlIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlIG9uIHNhdmluZyBzdXJ2ZXkgcmVzdWx0cy4gVXNlIGl0IHRvIGZpbmQgb3V0IGlmIHRoZSByZXN1bHRzIGhhdmUgYmVlbiBzYXZlZCBzdWNjZXNzZnVsLlxuICAgICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgICAqIDxici8+IG9wdGlvbnMuc3VjY2VzcyBpdCBpcyB0cnVlIGlmIHRoZSByZXN1bHRzIHdlcmUgc2VudCB0byB0aGUgc2VydmljZSBzdWNjZXNzZnVsXG4gICAgICogPGJyLz4gb3B0aW9ucy5yZXNwb25zZSBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgb25TZW5kUmVzdWx0OiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gICAgLyoqXG4gICAgICogVXNlIGl0IHRvIGdldCByZXN1bHRzIGFmdGVyIGNhbGxpbmcgdGhlIGdldFJlc3VsdCBtZXRob2QuIEl0IHJldHVybnMgYSBzaW1wbGUgYW5hbHl0aWMgZnJvbSBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZS5cbiAgICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICAgKiA8YnIvPiBvcHRpb25zLnN1Y2Nlc3MgaXQgaXMgdHJ1ZSBpZiB0aGUgcmVzdWx0cyB3ZXJlIGdvdCBmcm9tIHRoZSBzZXJ2aWNlIHN1Y2Nlc3NmdWxcbiAgICAgKiA8YnIvPiBvcHRpb25zLmRhdGEgdGhlIG9iamVjdCB7QW5zd2Vyc0NvdW50LCBRdWVzdGlvblJlc3VsdCA6IHt9IH0uIEFuc3dlcnNDb3VudCBpcyB0aGUgbnVtYmVyIG9mIHBvc3RlZCBzdXJ2ZXkgcmVzdWx0cy4gUXVlc3Rpb25SZXN1bHQgaXMgYW4gb2JqZWN0IHdpdGggYWxsIHBvc3NpYmxlIHVuaXF1ZSBhbnN3ZXJzIHRvIHRoZSBxdWVzdGlvbiBhbmQgbnVtYmVyIG9mIHRoZXNlIGFuc3dlcnMuXG4gICAgICogPGJyLz4gb3B0aW9ucy5kYXRhTGlzdCBhbiBhcnJheSBvZiBvYmplY3RzIHtuYW1lLCB2YWx1ZX0sIHdoZXJlICduYW1lJyBpcyBhbiB1bmlxdWUgdmFsdWUvYW5zd2VyIHRvIHRoZSBxdWVzdGlvbiBhbmQgdmFsdWUgaXMgYSBudW1iZXIvY291bnQgb2Ygc3VjaCBhbnN3ZXJzLlxuICAgICAqIDxici8+IG9wdGlvbnMucmVzcG9uc2UgdGhlIHNlcnZlciByZXNwb25zZSBcbiAgICAgKiBAc2VlIGdldFJlc3VsdFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkdldFJlc3VsdDogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiB1cGxvYWRpbmcgdGhlIGZpbGUgaW4gUXVlc3Rpb25GaWxlLiBZb3UgbWF5IHVzZSBpdCB0byBjaGFuZ2UgdGhlIGZpbGUgbmFtZSBvciB0ZWxscyB0aGUgbGlicmFyeSBkbyBub3QgYWNjZXB0IHRoZSBmaWxlLiBUaGVyZSBhcmUgdGhyZWUgcHJvcGVydGllcyBpbiBvcHRpb25zOiBvcHRpb25zLm5hbWUsIG9wdGlvbnMuZmlsZSBhbmQgb3B0aW9ucy5hY2NlcHQuXG4gICAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAgICogbmFtZTogbmFtZSwgZmlsZTogZmlsZSwgYWNjZXB0OiBhY2NlcHRcbiAgICAgKiA8YnIvPiBuYW1lIHRoZSBmaWxlIG5hbWVcbiAgICAgKiA8YnIvPiBmaWxlIHRoZSBKYXZhc2NyaXB0IEZpbGUgb2JqZWN0XG4gICAgICogPGJyLz4gYWNjZXB0IGEgYm9vbGVhbiB2YWx1ZSwgdHJ1ZSBieSBkZWZhdWx0LiBTZXQgaXQgdG8gZmFsc2UgdG8gZGVueSB0aGlzIGZpbGUgdG8gdXBsb2FkXG4gICAgICogQHNlZSB1cGxvYWRGaWxlXG4gICAgICovXG4gICAgcHVibGljIG9uVXBsb2FkRmlsZTogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgcmVuZGVyaW5nIGEgcXVlc3Rpb24uIFVzZSBpdCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBxdWVzdGlvbiBjc3MgY2xhc3Nlcy4gXG4gICAgICogVGhlcmUgYXJlIHR3byBwYXJhbWV0ZXJzIGluIG9wdGlvbnM6IG9wdGlvbnMucXVlc3Rpb24gYW5kIG9wdGlvbnMuY3NzQ2xhc3Nlc1xuICAgICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSBxdWVzdGlvbiBmb3Igd2hpY2ggeW91IG1heSBjaGFuZ2UgdGhlIGNzcyBjbGFzc2VzXG4gICAgICogPGJyLz4gb3B0aW9ucy5jc3NDbGFzc2VzIGFuIG9iamVjdCB3aXRoIGNzcyBjbGFzc2VzLiBGb3IgZXhhbXBsZSB7cm9vdDogXCJ0YWJsZVwiLCBidXR0b246IFwiYnV0dG9uXCJ9LiBZb3UgbWF5IGNoYW5nZSB0aGVtIHRvIHlvdXIgb3duIGNzcyBjbGFzc2VzLlxuICAgICAqL1xuICAgIHB1YmxpYyBvblVwZGF0ZVF1ZXN0aW9uQ3NzQ2xhc3NlczogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpcyBmaXJlZCByaWdodCBhZnRlciBzdXJ2ZXkgaXMgcmVuZGVyZWQgaW4gRE9NLiBvcHRpb25zLmh0bWxFbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQuXG4gICAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAgICogPGJyLz4gb3B0aW9ucy5odG1sRWxlbWVudCBhIHJvb3QgaHRtbCBlbGVtZW50IGJpbmRlZCB3aXRoIHRoZSBzdXJ2ZXkgb2JqZWN0XG4gICAgICovXG4gICAgcHVibGljIG9uQWZ0ZXJSZW5kZXJTdXJ2ZXk6IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgcmlnaHQgYWZ0ZXIgYSBwYWdlIGlzIHJlbmRyZWQgaW4gRE9NLiBVc2UgaXQgdG8gbW9kaWZ5IGh0bWwgZWxlbWVudHMuIFRoZXJlIGFyZSB0d28gcGFyYW1ldGVycyBpbiBvcHRpb25zOiBvcHRpb25zLmN1cnJlbnRQYWdlLCBvcHRpb25zLmh0bWxFbGVtZW50XG4gICAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAgICogPGJyLz4gb3B0aW9ucy5wYWdlIGEgcGFnZSBvYmplY3QgZm9yIHdoaWNoIHRoZSBldmVudCBpcyBmaXJlZC4gVHlwaWNhbGx5IHRoZSBjdXJyZW50L2FjdGl2ZSBwYWdlLlxuICAgICAqIDxici8+IG9wdGlvbnMuaHRtbEVsZW1lbnQgYW4gaHRtbCBlbGVtZW50IGJpbmRlZCB3aXRoIHRoZSBwYWdlIG9iamVjdFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkFmdGVyUmVuZGVyUGFnZTogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpcyBmaXJlZCByaWdodCBhZnRlciBhIHF1ZXN0aW9uIGlzIHJlbmRyZWQgaW4gRE9NLiBVc2UgaXQgdG8gbW9kaWZ5IGh0bWwgZWxlbWVudHMuIFRoZXJlIGFyZSB0d28gcGFyYW1ldGVycyBpbiBvcHRpb25zOiBvcHRpb25zLnF1ZXN0aW9uLCBvcHRpb25zLmh0bWxFbGVtZW50XG4gICAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiBhIHF1ZXN0aW9uIG9iamVjdCBmb3Igd2hpY2ggdGhlIGV2ZW50IGlzIGZpcmVkXG4gICAgICogPGJyLz4gb3B0aW9ucy5odG1sRWxlbWVudCBhbiBodG1sIGVsZW1lbnQgYmluZGVkIHdpdGggdGhlIHF1ZXN0aW9uIG9iamVjdFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkFmdGVyUmVuZGVyUXVlc3Rpb246IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgcmlnaHQgYWZ0ZXIgYSBwYW5lbCBpcyByZW5kcmVkIGluIERPTS4gVXNlIGl0IHRvIG1vZGlmeSBodG1sIGVsZW1lbnRzLiBUaGVyZSBhcmUgdHdvIHBhcmFtZXRlcnMgaW4gb3B0aW9uczogb3B0aW9ucy5wYW5lbCwgb3B0aW9ucy5odG1sRWxlbWVudFxuICAgICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgICAqIDxici8+IG9wdGlvbnMucGFuZWwgYSBwYW5lbCBvYmplY3QgZm9yIHdoaWNoIHRoZSBldmVudCBpcyBmaXJlZFxuICAgICAqIDxici8+IG9wdGlvbnMuaHRtbEVsZW1lbnQgYW4gaHRtbCBlbGVtZW50IGJpbmRlZCB3aXRoIHRoZSBwYW5lbCBvYmplY3RcbiAgICAgKi9cbiAgICBwdWJsaWMgb25BZnRlclJlbmRlclBhbmVsOiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIGFkZGluZyBhIG5ldyByb3cgaW4gTWF0cml4IER5bmFtaWMgcXVlc2l0b24uIFxuICAgICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSBtYXRyaXggcXVlc3Rpb24uXG4gICAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwudmlzaWJsZVJvd3NcbiAgICAgKi9cbiAgICBwdWJsaWMgb25NYXRyaXhSb3dBZGRlZDogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBhZGRpbmcgYSBuZXcgcm93IGluIE1hdHJpeCBEeW5hbWljIHF1ZXNpdG9uLiBcbiAgICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIGEgbWF0cml4IHF1ZXN0aW9uLlxuICAgICAqIDxici8+IG9wdGlvbnMucm93SW5kZXggYSByZW1vdmVkIHJvdyBpbmRleC5cbiAgICAgKiA8YnIvPiBvcHRpb25zLnJvdyBhIHJlbW92ZWQgcm93IG9iamVjdC5cbiAgICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsXG4gICAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbC52aXNpYmxlUm93c1xuICAgICAqL1xuICAgIHB1YmxpYyBvbk1hdHJpeFJvd1JlbW92ZWQ6IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgZm9yIGV2ZXJ5IGNlbGwgY3JlYXRlZCBpbiBNYXRyaXggRHltaWMgYW5kIE1hdHJpeCBEcm9wZG93biBxdWVzdGlvbnMuXG4gICAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiAtIHRoZSBtYXRyaXggcXVlc3Rpb25cbiAgICAgKiA8YnIvPiBvcHRpb25zLmNlbGwgLSB0aGUgbWF0cml4IGNlbGxcbiAgICAgKiA8YnIvPiBvcHRpb25zLmNlbGxRdWVzdGlvbiAtIHRoZSBxdWVzdGlvbi9lZGl0b3IgaW4gdGhlIGNlbGwuIFlvdSBtYXkgY3VzdG9taXplIGl0LCBjaGFuZ2UgaXQncyBwcm9wZXJ0aWVzLCBsaWtlIGNob2ljZXMgb3IgdmlzaWJsZS5cbiAgICAgKiA8YnIvPiBvcHRpb25zLnJvd1ZhbHVlIC0gdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHJvdy4gVG8gYWNjZXNzIHRoZSB2YWx1ZSBvZiBwYXRpY3VsYXIgY29sdW1uIHVzZTogb3B0aW9ucy5yb3dWYWx1ZVtcImNvbHVtblZhbHVlXCJdXG4gICAgICogPGJyLz4gb3B0aW9ucy5jb2x1bW4gLSB0aGUgbWF0cml4IGNvbHVtbiBvYmplY3RcbiAgICAgKiA8YnIvPiBvcHRpb25zLmNvbHVtTmFtZSAtIHRoZSBtYXRyaXggY29sdW1uIG5hbWVcbiAgICAgKiA8YnIvPiBvcHRpb25zLnJvdyAtIHRoZSBtYXRyaXggcm93IG9iamVjdFxuICAgICAqIEBzZWUgb25NYXRyaXhSb3dBZGRlZFxuICAgICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbk1hdHJpeENlbGxDcmVhdGVkOiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGZvciBldmVyeSBjZWxsIGFmdGVyIGlzIGhhcyBiZWVuIHJlbmRlcmVkIGluIERPTS5cbiAgICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIC0gdGhlIG1hdHJpeCBxdWVzdGlvblxuICAgICAqIDxici8+IG9wdGlvbnMuY2VsbCAtIHRoZSBtYXRyaXggY2VsbFxuICAgICAqIDxici8+IG9wdGlvbnMuY2VsbFF1ZXN0aW9uIC0gdGhlIHF1ZXN0aW9uL2VkaXRvciBpbiB0aGUgY2VsbC4gXG4gICAgICogPGJyLz4gb3B0aW9ucy5odG1sRWxlbWVudCBhIGh0bWwgZWxlbWVudCBiaW5kZWQgd2l0aCB0aGUgY2VsbFF1ZXN0aW9uIG9iamVjdFxuICAgICAqIDxici8+IG9wdGlvbnMuY29sdW1uIC0gdGhlIG1hdHJpeCBjb2x1bW4gb2JqZWN0XG4gICAgICogPGJyLz4gb3B0aW9ucy5yb3cgLSB0aGUgbWF0cml4IHJvdyBvYmplY3RcbiAgICAgKiBAc2VlIG9uTWF0cml4Q2VsbENyZWF0ZWRcbiAgICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsXG4gICAgICogQHNlZSBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25NYXRyaXhBZnRlckNlbGxSZW5kZXI6IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgd2hlbiBjZWxsIHZhbHVlIGlzIGNoYW5nZWQgaW4gTWF0cml4IER5bWljIGFuZCBNYXRyaXggRHJvcGRvd24gcXVlc3Rpb25zLlxuICAgICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gLSB0aGUgbWF0cml4IHF1ZXN0aW9uXG4gICAgICogPGJyLz4gb3B0aW9ucy5jb2x1bU5hbWUgLSB0aGUgbWF0cml4IGNvbHVtbiBuYW1lXG4gICAgICogPGJyLz4gb3B0aW9ucy52YWx1ZSAtIGEgbmV3IHZhbHVlXG4gICAgICogPGJyLz4gb3B0aW9ucy5yb3cgLSB0aGUgbWF0cml4IHJvdyBvYmplY3RcbiAgICAgKiA8YnIvPiBvcHRpb25zLmdldENlbGxRdWVzdGlvbihjb2x1bW5OYW1lKSAtIHRoZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNlbGwgcXVlc3Rpb24gYnkgY29sdW1uIG5hbWUuXG4gICAgICogQHNlZSBvbk1hdHJpeFJvd0FkZGVkXG4gICAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsXG4gICAgICovXG4gICAgcHVibGljIG9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdlZDogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpcyBmaXJlZCB3aGVuIE1hdHJpeCBEeW1pYyBhbmQgTWF0cml4IERyb3Bkb3duIHF1ZXN0aW9ucyB2YWxpZGF0ZSB0aGUgY2VsbCB2YWx1ZS5cbiAgICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIC0gdGhlIG1hdHJpeCBxdWVzdGlvblxuICAgICAqIDxici8+IG9wdGlvbnMuY29sdW1OYW1lIC0gdGhlIG1hdHJpeCBjb2x1bW4gbmFtZVxuICAgICAqIDxici8+IG9wdGlvbnMudmFsdWUgLSBhIGNlbGwgdmFsdWVcbiAgICAgKiA8YnIvPiBvcHRpb25zLnJvdyAtIHRoZSBtYXRyaXggcm93IG9iamVjdFxuICAgICAqIDxici8+IG9wdGlvbnMuZ2V0Q2VsbFF1ZXN0aW9uKGNvbHVtbk5hbWUpIC0gdGhlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgY2VsbCBxdWVzdGlvbiBieSBjb2x1bW4gbmFtZS5cbiAgICAgKiBAc2VlIG9uTWF0cml4Um93QWRkZWRcbiAgICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsXG4gICAgICogQHNlZSBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25NYXRyaXhDZWxsVmFsaWRhdGU6IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgZXZlcnkgc2Vjb25kIGlmIHRoZSBtZXRob2Qgc3RhcnRUaW1lciBoYXMgYmVlbiBjYWxsZWQuXG4gICAgICogQHNlZSBzdGFydFRpbWVyXG4gICAgICogQHNlZSB0aW1lU3BlbnRcbiAgICAgKiBAc2VlIFBhZ2UudGltZVNwZW50XG4gICAgICovXG4gICAgcHVibGljIG9uVGltZXI6IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsKSA9PiBhbnksIGFueT4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwpID0+IGFueSwgYW55PigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgZGlzcGxheWluZyBhIG5ldyBpbmZvcm1hdGlvbiBpbiB0aGUgVGltZXIgUGFuZWwuIFVzZSBpdCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdGV4dC5cbiAgICAgKiA8YnIvPiBvcHRpb25zLnRleHQgLSB0aGUgdGltZXIgcGFuZWwgaW5mbyB0ZXh0LlxuICAgICAqL1xuICAgIHB1YmxpYyBvblRpbWVyUGFuZWxJbmZvVGV4dDogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIGVycm9ycyBvbiBsb2FkaW5nIHN1cnZleSBqc29uLiBJZiB0aGUgbGlzdCBpcyBlbXB0eSBhZnRlciBsb2FkaW5nIGEganNvbiB0aGVuIHRoZSBqc29uIGlzIGNvcnJlY3QgYW5kIHRoZXJlIGlzIG5vIGVycm9ycyBpbiBpdC5cbiAgICAgKiBAc2VlIEpzb25FcnJvclxuICAgICAqL1xuICAgIHB1YmxpYyBqc29uRXJyb3JzOiBBcnJheTxKc29uRXJyb3I+ID0gbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKGpzb25PYmo6IGFueSA9IG51bGwpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgbG9jVGl0bGVWYWx1ZSA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJ0aXRsZVwiLCB0aGlzLCB0cnVlKTtcbiAgICAgICAgbG9jVGl0bGVWYWx1ZS5vblJlbmRlcmVkSHRtbENhbGxiYWNrID0gZnVuY3Rpb24odGV4dCkgeyByZXR1cm4gc2VsZi5wcm9jZXNzZWRUaXRsZTsgfTtcbiAgICAgICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImNvbXBsZXRlZEh0bWxcIiwgdGhpcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIsIHRoaXMpO1xuICAgICAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwibG9hZGluZ0h0bWxcIiwgdGhpcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwYWdlUHJldlwiLCB0aGlzKTtcbiAgICAgICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInBhZ2VOZXh0XCIsIHRoaXMpO1xuICAgICAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29tcGxldGVcIiwgdGhpcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJxdWVzdGlvblRpdGxlVGVtcGxhdGVcIiwgdGhpcywgdHJ1ZSk7XG5cbiAgICAgICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yID0gbmV3IFRleHRQcmVQcm9jZXNzb3IoKTtcbiAgICAgICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yLm9uSGFzVmFsdWUgPSBmdW5jdGlvbiAobmFtZTogc3RyaW5nKSB7IHJldHVybiBzZWxmLmhhc1Byb2Nlc3NlZFRleHRWYWx1ZShuYW1lKTsgfTtcbiAgICAgICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yLm9uUHJvY2VzcyA9IGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbikgeyByZXR1cm4gc2VsZi5nZXRQcm9jZXNzZWRUZXh0VmFsdWUobmFtZSwgcmV0dXJuRGlzcGxheVZhbHVlKTsgfTtcbiAgICAgICAgdGhpcy5wYWdlc1ZhbHVlID0gdGhpcy5jcmVhdGVOZXdBcnJheShcInBhZ2VzXCIsIGZ1bmN0aW9uKHZhbHVlKXsgc2VsZi5kb09uUGFnZUFkZGVkKHZhbHVlKTsgfSk7XG4gICAgICAgIHRoaXMudHJpZ2dlcnNWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJ0cmlnZ2Vyc1wiLCBmdW5jdGlvbih2YWx1ZSl7IHZhbHVlLnNldE93bmVyKHNlbGYpOyB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVQcm9jZXNzZWRUZXh0VmFsdWVzKCk7XG4gICAgICAgIHRoaXMub25CZWZvcmVDcmVhdGluZygpO1xuICAgICAgICBpZiAoanNvbk9iaikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uT2JqID09PSAnc3RyaW5nJyB8fCBqc29uT2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICAgICAgICAgICAganNvbk9iaiA9IEpTT04ucGFyc2UoanNvbk9iaiBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoanNvbk9iaiAmJiBqc29uT2JqLmNsaWVudElkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGpzb25PYmouY2xpZW50SWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldEpzb25PYmplY3QoanNvbk9iaik7XG4gICAgICAgICAgICBpZiAodGhpcy5zdXJ2ZXlJZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZFN1cnZleUZyb21TZXJ2aWNlKHRoaXMuc3VydmV5SWQsIHRoaXMuY2xpZW50SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25DcmVhdGluZygpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcgeyByZXR1cm4gXCJzdXJ2ZXlcIjsgfVxuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIGFsbCBwYWdlcyBpbiB0aGUgc3VydmV5LCBpbmNsdWRpbmcgaW52aXNpYmxlLlxuICAgICAqIEBzZWUgUGFnZU1vZGVsXG4gICAgICogQHNlZSB2aXNpYmxlUGFnZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhZ2VzKCk6IEFycmF5PFBhZ2VNb2RlbD4geyByZXR1cm4gdGhpcy5wYWdlc1ZhbHVlOyB9XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2YgdHJpZ2dlcnMgaW4gdGhlIHN1cnZleS5cbiAgICAgKiBAc2VlIFN1cnZleVRyaWdnZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRyaWdnZXJzKCk6IEFycmF5PFN1cnZleVRyaWdnZXI+IHsgcmV0dXJuIHRoaXMudHJpZ2dlcnNWYWx1ZTsgfVxuICAgIHB1YmxpYyBzZXQgdHJpZ2dlcnModmFsOiBBcnJheTxTdXJ2ZXlUcmlnZ2VyPikgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0cmlnZ2Vyc1wiLCB2YWwpOyB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gYXV0b21hdGljYWxseSBsb2FkIHN1cnZleSBKc29uIGZyb20gW2R4c3VydmV5LmNvbV0oaHR0cDovL3d3dy5keHN1cnZleS5jb20pIHNlcnZpY2UuXG4gICAgICogQHNlZSBsb2FkU3VydmV5RnJvbVNlcnZpY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHN1cnZleUlkKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdXJ2ZXlJZFwiLCBcIlwiKTsgfVxuICAgIHB1YmxpYyBzZXQgc3VydmV5SWQodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5SWRcIiwgdmFsKTsgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGF1dG9tYXRpY2FsbHkgc2F2ZSB0aGUgZGF0YSBpbnRvIHRoZSBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZS5cbiAgICAgKiBAc2VlIG9uQ29tcGxldGVcbiAgICAgKiBAc2VlIHN1cnZleVNob3dEYXRhU2F2aW5nXG4gICAgICovXG4gICAgcHVibGljIGdldCBzdXJ2ZXlQb3N0SWQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN1cnZleVBvc3RJZFwiLCBcIlwiKTsgfVxuICAgIHB1YmxpYyBzZXQgc3VydmV5UG9zdElkKHZhbDogc3RyaW5nKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN1cnZleVBvc3RJZFwiLCB2YWwpOyB9XG4gICAgLyoqXG4gICAgICogVXNlIHRoaXMgcHJvcGVydHkgYXMgaW5kZW50aWZpY2F0b3IgZm9yIGEgdXNlciwgZm9yIGV4YW1wbGUgZS1tYWlsIG9yIHVuaXF1ZSBjdXN0b21lciBpZCBpbiB5b3VyIHdlYiBhcHBsaWNhdGlvbi4gSWYgeW91IGFyZSBsb2FkaW5nIHN1cnZleSBvciBwb3N0aW5nIHN1cnZleSByZXN1bHRzICBmcm9tL3RvIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlLCB0aGVuIHRoZSBsaWJyYXJ5IGRvIG5vdCBhbGxvdyB0byBydW4gdGhlIHNhbWUgc3VydmV5IHRoZSBzZWNvbmQgdGltZS4gT24gdGhlIHNlY29uZCBydW4sIHRoZSB1c2VyIHdpbGwgc2VlIHRoZSAnVGhhbmsgeW91JyBwYWdlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2xpZW50SWQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNsaWVudElkXCIsIFwiXCIpOyB9XG4gICAgcHVibGljIHNldCBjbGllbnRJZCh2YWw6IHN0cmluZykgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjbGllbnRJZFwiLCB2YWwpOyB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBlbXB0eSwgYmVmb3JlIHN0YXJ0aW5nIHRvIHJ1biB0aGUgc3VydmV5LCB0aGUgbGlicmFyeSBjaGVja2VzIGlmIHRoZSBjb29raWUgd2l0aCB0aGlzIG5hbWUgZXhpc3RzLiBJZiBpdCBpcyB0cnVlLCB0aGUgc3VydmV5IGdvZXMgdG8gY29tcGxldGUgbW9kZSBhbmQgYW4gdXNlciBzZWVzIHRoZSAnVGhhbmsgeW91JyBwYWdlLiBPbiBjb21wbGV0aW5nIHRoZSBzdXJ2ZXkgdGhlIGNvb2tpZSB3aXRoIHRoaXMgbmFtZSBpcyBjcmVhdGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29va2llTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29va2llTmFtZVwiLCBcIlwiKTsgfVxuICAgIHB1YmxpYyBzZXQgY29va2llTmFtZSh2YWw6IHN0cmluZykgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb29raWVOYW1lXCIsIHZhbCk7IH1cbiAgICAvKipcbiAgICAgKiBTZXQgaXQgdG8gdHJ1ZSwgdG8gc2F2ZSByZXN1bHRzIG9uIGNvbXBsZXRpbmcgZXZlcnkgcGFnZS4gb25QYXJ0aWFsU2VuZCBldmVudCBpcyBmaXJlZC5cbiAgICAgKiBAc2VlIG9uUGFydGlhbFNlbmRcbiAgICAgKiBAc2VlIGNsaWVudElkXG4gICAgICovXG4gICAgcHVibGljIGdldCBzZW5kUmVzdWx0T25QYWdlTmV4dCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNlbmRSZXN1bHRPblBhZ2VOZXh0XCIsIGZhbHNlKTsgfVxuICAgIHB1YmxpYyBzZXQgc2VuZFJlc3VsdE9uUGFnZU5leHQodmFsOiBib29sZWFuKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNlbmRSZXN1bHRPblBhZ2VOZXh0XCIsIHZhbCk7IH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCB0byBzaG93IHRoZSBwcm9ncmVzcyBvbiBzYXZpbmcvc2VuZGluZyBkYXRhIGludG8gdGhlIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlLlxuICAgICAqIEBzZWUgc3VydmV5UG9zdElkXG4gICAgICovXG4gICAgcHVibGljIGdldCBzdXJ2ZXlTaG93RGF0YVNhdmluZygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN1cnZleVNob3dEYXRhU2F2aW5nXCIsIGZhbHNlKTsgfVxuICAgIHB1YmxpYyBzZXQgc3VydmV5U2hvd0RhdGFTYXZpbmcodmFsOiBib29sZWFuKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN1cnZleVNob3dEYXRhU2F2aW5nXCIsIHZhbCk7IH1cbiAgICAvKipcbiAgICAgKiBPbiBzaG93aW5nIHRoZSBuZXh0IG9yIHByZXZpb3VzIHBhZ2UsIGEgZmlyc3QgaW5wdXQgaXMgZm9jdXNlZCwgaWYgdGhlIHByb3BlcnR5IHNldCB0byB0cnVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljXCIsIHRydWUpOyB9XG4gICAgcHVibGljIHNldCBmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWModmFsOiBib29sZWFuKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpY1wiLCB2YWwpOyB9XG4gICAgLyoqXG4gICAgICogU2V0IGl0IHRvIGZhbHNlIHRvIGhpZGUgJ1ByZXYnLCAnTmV4dCcgYW5kICdDb21wbGV0ZScgYnV0dG9ucy4gSXQgbWFrZXMgc2Vuc2UgaWYgeW91IGFyZSBnb2luZyB0byBjcmVhdGUgYSBjdXN0b20gbmF2aWdhdGlvbiBvciBoYXZlIGp1c3Qgb25lIHBhZ2Ugb3Igb24gc2V0dGluZyBnb05leHRQYWdlQXV0b21hdGljIHByb3BlcnR5LlxuICAgICAqIEBzZWUgZ29OZXh0UGFnZUF1dG9tYXRpY1xuICAgICAqIEBzZWUgc2hvd1ByZXZCdXR0b25cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dOYXZpZ2F0aW9uQnV0dG9ucygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dOYXZpZ2F0aW9uQnV0dG9uc1wiLCB0cnVlKTsgfVxuICAgIHB1YmxpYyBzZXQgc2hvd05hdmlnYXRpb25CdXR0b25zKHZhbDogYm9vbGVhbikgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93TmF2aWdhdGlvbkJ1dHRvbnNcIiwgdmFsKTsgfVxuICAgIC8qKlxuICAgICAqIFNldCBpdCB0byBmYWxzZSB0byBoaWRlIHRoZSAnUHJldicgdG8gZGlzYWJsZSBmb3IgZW5kLXVzZXJzIGdvIGJhY2sgdG8gdGhlaXIgYW5zd2Vycy5cbiAgICAgKiBAc2VlIHNob3dOYXZpZ2F0aW9uQnV0dG9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2hvd1ByZXZCdXR0b24oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UHJldkJ1dHRvblwiLCB0cnVlKTsgfVxuICAgIHB1YmxpYyBzZXQgc2hvd1ByZXZCdXR0b24odmFsOiBib29sZWFuKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dQcmV2QnV0dG9uXCIsIHZhbCk7IH1cbiAgICAvKipcbiAgICAgKiBTZXQgaXQgdG8gZmFsc2UgaGlkZSBzdXJ2ZXkgdGl0bGUuXG4gICAgICogQHNlZSB0aXRsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2hvd1RpdGxlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpdGxlXCIsIHRydWUpOyB9XG4gICAgcHVibGljIHNldCBzaG93VGl0bGUodmFsOiBib29sZWFuKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dUaXRsZVwiLCB2YWwpOyB9XG4gICAgLyoqXG4gICAgICogU2V0IGl0IHRvIGZhbHNlIHRvIGhpZGUgcGFnZSB0aXRsZXMuXG4gICAgICogQHNlZSBQYWdlTW9kZWwudGl0bGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dQYWdlVGl0bGVzKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1BhZ2VUaXRsZXNcIiwgdHJ1ZSk7IH1cbiAgICBwdWJsaWMgc2V0IHNob3dQYWdlVGl0bGVzKHZhbDogYm9vbGVhbikgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UGFnZVRpdGxlc1wiLCB2YWwpOyB9XG4gICAgLyoqXG4gICAgICogT24gZmluaXNoaW5nIHRoZSBzdXJ2ZXkgdGhlICdUaGFuayB5b3UnLCBwYWdlIG9uIGNvbXBsZXRlLCBpcyBzaG93bi4gU2V0IHRoZSBwcm9wZXJ0eSB0byBmYWxzZSwgdG8gaGlkZSB0aGUgJ1RoYW5rIHlvdScgcGFnZS5cbiAgICAgKiBAc2VlIGRhdGFcbiAgICAgKiBAc2VlIG9uQ29tcGxldGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dDb21wbGV0ZWRQYWdlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0NvbXBsZXRlZFBhZ2VcIiwgdHJ1ZSk7IH1cbiAgICBwdWJsaWMgc2V0IHNob3dDb21wbGV0ZWRQYWdlKHZhbDogYm9vbGVhbikgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93Q29tcGxldGVkUGFnZVwiLCB2YWwpOyB9XG4gICAgLyoqXG4gICAgICogQSBjaGFyL3N0cmluZyB0aGF0IHdpbGwgYmUgcmVuZGVyZWQgaW4gdGhlIHRpdGxlIHJlcXVpcmVkIHF1ZXN0aW9ucy5cbiAgICAgKiBAc2VlIFF1ZXN0aW9uQmFzZS50aXRsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVxdWlyZWRUZXh0KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZXF1aXJlZFRleHRcIiwgXCIqXCIpOyB9XG4gICAgcHVibGljIHNldCByZXF1aXJlZFRleHQodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVxdWlyZWRUZXh0XCIsIHZhbCk7IH1cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0IHRoZSBmaXJzdCBxdWVzdGlvbiBpbmRleCBpcyAxLiBZb3UgbWF5IHN0YXJ0IGl0IGZyb20gMTAwIG9yIGZyb20gJ0EnLCBieSBzZXR0aW5nIDEwMCBvciAnQScgdG8gdGhpcyBwcm9wZXJ0eS5cbiAgICAgKiBAc2VlIFF1ZXN0aW9uQmFzZS50aXRsZVxuICAgICAqIEBzZWUgcmVxdWlyZWRUZXh0XG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVzdGlvblN0YXJ0SW5kZXgoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uU3RhcnRJbmRleFwiLCBcIlwiKTsgfVxuICAgIHB1YmxpYyBzZXQgcXVlc3Rpb25TdGFydEluZGV4KHZhbDogc3RyaW5nKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uU3RhcnRJbmRleFwiLCB2YWwpOyB9O1xuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIGVudGVyZWQgdGV4dCBpbiB0aGUgb3RoZXJzIGlucHV0IGluIHRoZSBjaGVja2JveC9yYWRpb2dyb3VwL2Ryb3Bkb3duIGFyZSBzdG9yZWQgYXMgXCJxdWVzdGlvbiBuYW1lIFwiICsgXCItQ29tbWVudFwiLiBUaGUgdmFsdWUgaXRzZWxmIGlzIFwicXVlc3Rpb24gbmFtZVwiOiBcIm90aGVyc1wiLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSwgdG8gc3RvcmUgdGhlIGVudGVyZWQgdGV4dCBkaXJlY3RseSBpbiB0aGUgXCJxdWVzdGlvbiBuYW1lXCIga2V5LlxuICAgICAqIEBzZWUgY29tbWVudFByZWZpeFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3RvcmVPdGhlcnNBc0NvbW1lbnQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLCB0cnVlKTsgfVxuICAgIHB1YmxpYyBzZXQgc3RvcmVPdGhlcnNBc0NvbW1lbnQodmFsOiBib29sZWFuKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0b3JlT3RoZXJzQXNDb21tZW50XCIsIHZhbCk7IH1cbiAgICAvKipcbiAgICAgKiBTZXQgaXQgdHJ1ZSBpZiB5b3Ugd2FudCB0byBnbyB0byB0aGUgbmV4dCBwYWdlIHdpdGhvdXQgcHJlc3NpbmcgJ05leHQnIGJ1dHRvbiB3aGVuIGFsbCBxdWVzdGlvbnMgYXJlIGFud2VyZWQuXG4gICAgKiBAc2VlIHNob3dOYXZpZ2F0aW9uQnV0dG9ucyBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGdvTmV4dFBhZ2VBdXRvbWF0aWMoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJnb05leHRQYWdlQXV0b21hdGljXCIsIGZhbHNlKTsgfVxuICAgIHB1YmxpYyBzZXQgZ29OZXh0UGFnZUF1dG9tYXRpYyh2YWw6IGJvb2xlYW4pIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZ29OZXh0UGFnZUF1dG9tYXRpY1wiLCB2YWwpOyB9XG4gICAgLyoqXG4gICAgICogU2V0IGl0IHRvICdvbkNvbXBsZXRlJywgdG8gcmVtb3ZlIGZyb20gZGF0YSBwcm9wZXJ0eSB2YWx1ZXMgb2YgaW52aXNpYmxlIHF1ZXN0aW9ucyBvbiBzdXJ2ZXkgY29tcGxldGUuIEluIHRoaXMgY2FzZSwgdGhlIGludmlzaWJsZSBxdWVzdGlvbnMgd2lsbCBub3QgYmUgc3RvcmVkIG9uIHRoZSBzZXJ2ZXIuXG4gICAgICogPC9icj4gU2V0IGl0IHRvICdvbkhpZGRlbicgdG8gY2xlYXIgdGhlIHF1ZXN0aW9uIHZhbHVlIHdoZW4gaXQgYmVjb21lcyBpbnZpc2libGUuXG4gICAgICogPC9icj4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgJ25vbmUnLlxuICAgICAqIEBzZWUgUXVlc3Rpb25CYXNlLnZpc2libGVcbiAgICAgKiBAc2VlIG9uQ29tcGxldGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNsZWFySW52aXNpYmxlVmFsdWVzKCk6IGFueSB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjbGVhckludmlzaWJsZVZhbHVlc1wiLCBcIm5vbmVcIik7IH1cbiAgICBwdWJsaWMgc2V0IGNsZWFySW52aXNpYmxlVmFsdWVzKHZhbDogYW55KSB7XG4gICAgICAgIGlmKHZhbCA9PT0gdHJ1ZSkgdmFsID0gXCJvbkNvbXBsZXRlXCI7XG4gICAgICAgIGlmKHZhbCA9PT0gZmFsc2UpIHZhbCA9IFwibm9uZVwiOyBcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2xlYXJJbnZpc2libGVWYWx1ZXNcIiwgdmFsKTsgXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGl0IHRvIGNoYW5nZSB0aGUgc3VydmV5IGxvY2FsZS4gQnkgZGVmYXVsdCBpdCBpcyBlbXB0eSwgJ2VuJy4gWW91IG1heSBzZXQgaXQgdG8gJ2RlJyAtIGdlcm1hbiwgJ2ZyJyAtIGZyZW5jaCBhbmQgc28gb24uIFRoZSBsaWJyYXJ5IGhhcyBidWlsdC1pbiBsb2NhbGl6YXRpb24gZm9yIHNldmVyYWwgbGFuZ3VhZ2VzLiBUaGUgbGlicmFyeSBoYXMgYSBtdWx0aS1sYW5ndWFnZSBzdXBwb3J0IGFzIHdlbGwuXG4gICAgICovXG4gICAgcHVibGljIGdldCBsb2NhbGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMubG9jYWxlVmFsdWU7IH1cbiAgICBwdWJsaWMgc2V0IGxvY2FsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubG9jYWxlVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibG9jYWxlXCIsIHZhbHVlKTtcbiAgICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGUgPSB2YWx1ZTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VzW2ldLm9uTG9jYWxlQ2hhbmdlZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vSUxvY2FsaXphYmxlT3duZXJcbiAgICBnZXRMb2NhbGUoKSB7IHJldHVybiB0aGlzLmxvY2FsZTsgfVxuICAgIHB1YmxpYyBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nKSAge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHt0ZXh0OiB0ZXh0LCBodG1sOiBudWxsfVxuICAgICAgICB0aGlzLm9uVGV4dE1hcmtkb3duLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmh0bWw7XG4gICAgfVxuICAgIGdldExvY1N0cmluZyhzdHI6IHN0cmluZykgeyByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhzdHIpOyB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdGV4dCB0aGF0IHJlbmRlcnMgd2hlbiB0aGVyZSBpcyBubyBhbnkgdmlzaWJsZSBwYWdlIGFuZCBxdWVzdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVtcHR5U3VydmV5VGV4dCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcoXCJlbXB0eVN1cnZleVwiKTsgfVxuICAgIC8qKlxuICAgICAqIFN1cnZleSB0aXRsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRpdGxlXCIpOyB9XG4gICAgcHVibGljIHNldCB0aXRsZSh2YWx1ZTogc3RyaW5nKSB7IHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGl0bGVcIiwgdmFsdWUpOyB9XG4gICAgZ2V0IGxvY1RpdGxlKCk6IExvY2FsaXphYmxlU3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJ0aXRsZVwiKTsgfVxuICAgIC8qKlxuICAgICAqIFRoZSBodG1sIHRoYXQgc2hvd3Mgb24gY29tcGxldGVkICgnVGhhbmsgeW91JykgcGFnZS4gU2V0IGl0IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0LlxuICAgICAqIEBzZWUgc2hvd0NvbXBsZXRlZFBhZ2VcbiAgICAgKiBAc2VlIGxvY2FsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29tcGxldGVkSHRtbCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZWRIdG1sXCIpO31cbiAgICBwdWJsaWMgc2V0IGNvbXBsZXRlZEh0bWwodmFsdWU6IHN0cmluZykgeyB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbXBsZXRlZEh0bWxcIiwgdmFsdWUpO31cbiAgICBnZXQgbG9jQ29tcGxldGVkSHRtbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiY29tcGxldGVkSHRtbFwiKTsgfVxuICAgIC8qKlxuICAgICAqIFRoZSBodG1sIHRoYXQgc2hvd3MgaWYgdGhlIGVuZCB1c2VyIGhhcyBhbHJlYWR5IGNvbXBsZXRlZCB0aGUgc3VydmV5LlxuICAgICAqIEBzZWUgY2xpZW50SWRcbiAgICAgKiBAc2VlIGxvY2FsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29tcGxldGVkQmVmb3JlSHRtbCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIpO31cbiAgICBwdWJsaWMgc2V0IGNvbXBsZXRlZEJlZm9yZUh0bWwodmFsdWU6IHN0cmluZykgeyB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbXBsZXRlZEJlZm9yZUh0bWxcIiwgdmFsdWUpO31cbiAgICBnZXQgbG9jQ29tcGxldGVkQmVmb3JlSHRtbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiY29tcGxldGVkQmVmb3JlSHRtbFwiKTt9XG4gICAgLyoqXG4gICAgICogVGhlIGh0bWwgdGhhdCBzaG93cyBvbiBsb2FkaW5nIHN1cnZleSBKc29uIGZyb20gdGhlIGR4c3VydmV5LmNvbSBzZXJ2aWNlLlxuICAgICAqIEBzZWUgc3VydmV5SWRcbiAgICAgKiBAc2VlIGxvY2FsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbG9hZGluZ0h0bWwoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibG9hZGluZ0h0bWxcIik7fVxuICAgIHB1YmxpYyBzZXQgbG9hZGluZ0h0bWwodmFsdWU6IHN0cmluZykgeyB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImxvYWRpbmdIdG1sXCIsIHZhbHVlKTt9XG4gICAgZ2V0IGxvY0xvYWRpbmdIdG1sKCk6IExvY2FsaXphYmxlU3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJsb2FkaW5nSHRtbFwiKTt9XG4gICAgLyoqXG4gICAgICogQSB0ZXh0IHRoYXQgcmVuZGVycyBvbiB0aGUgJ1ByZXYnIGJ1dHRvbi4gU2V0IGl0IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0LlxuICAgICAqIEBzZWUgbG9jYWxlXG4gICAgICovXG4gICAgcHVibGljIGdldCBwYWdlUHJldlRleHQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFnZVByZXZcIiwgdGhpcy5nZXRMb2NTdHJpbmcoXCJwYWdlUHJldlRleHRcIikpOyB9XG4gICAgcHVibGljIHNldCBwYWdlUHJldlRleHQobmV3VmFsdWU6IHN0cmluZykgeyB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBhZ2VQcmV2XCIsIG5ld1ZhbHVlKTsgfVxuICAgIGdldCBsb2NQYWdlUHJldlRleHQoKTogTG9jYWxpemFibGVTdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBhZ2VQcmV2XCIpO31cbiAgICAvKipcbiAgICAgKiBBIHRleHQgdGhhdCByZW5kZXJzIG9uIHRoZSAnTmV4dCcgYnV0dG9uLiBTZXQgaXQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHRleHQuXG4gICAgICogQHNlZSBsb2NhbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhZ2VOZXh0VGV4dCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwYWdlTmV4dFwiLCB0aGlzLmdldExvY1N0cmluZyhcInBhZ2VOZXh0VGV4dFwiKSk7IH1cbiAgICBwdWJsaWMgc2V0IHBhZ2VOZXh0VGV4dChuZXdWYWx1ZTogc3RyaW5nKSB7IHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFnZU5leHRcIiwgbmV3VmFsdWUpOyB9XG4gICAgZ2V0IGxvY1BhZ2VOZXh0VGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicGFnZU5leHRcIik7fVxuICAgIC8qKlxuICAgICAqIEEgdGV4dCB0aGF0IHJlbmRlcnMgb24gdGhlICdDb21wbGV0ZScgYnV0dG9uLiBTZXQgaXQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHRleHQuXG4gICAgICogQHNlZSBsb2NhbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbXBsZXRlVGV4dCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZVwiLCB0aGlzLmdldExvY1N0cmluZyhcImNvbXBsZXRlVGV4dFwiKSk7IH1cbiAgICBwdWJsaWMgc2V0IGNvbXBsZXRlVGV4dChuZXdWYWx1ZTogc3RyaW5nKSB7IHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiY29tcGxldGVcIiwgIG5ld1ZhbHVlKTsgfVxuICAgIGdldCBsb2NDb21wbGV0ZVRleHQoKTogTG9jYWxpemFibGVTdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImNvbXBsZXRlXCIpIDt9XG4gICAgLyoqXG4gICAgICogQSB0ZW1wbGF0ZSBmb3IgYSBxdWVzdGlvbiB0aXRsZS5cbiAgICAgKiBAc2VlIFF1ZXN0aW9uTW9kZWwudGl0bGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJxdWVzdGlvblRpdGxlVGVtcGxhdGVcIik7fVxuICAgIHB1YmxpYyBzZXQgcXVlc3Rpb25UaXRsZVRlbXBsYXRlKHZhbHVlOiBzdHJpbmcpIHsgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJxdWVzdGlvblRpdGxlVGVtcGxhdGVcIiwgdmFsdWUpO31cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBxdWVzdGlvbiB0aXRsZSB0ZW1wbGF0ZVxuICAgICAqIEBzZWUgcXVlc3Rpb25UaXRsZVRlbXBsYXRlXG4gICAgICogQHNlZSBRdWVzdGlvbk1vZGVsLnRpdGxlXG4gICAgICovXG4gICAgcHVibGljIGdldFF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5sb2NRdWVzdGlvblRpdGxlVGVtcGxhdGUudGV4dE9ySHRtbDsgfVxuICAgIGdldCBsb2NRdWVzdGlvblRpdGxlVGVtcGxhdGUoKTogTG9jYWxpemFibGVTdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiKTsgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UgdG8gdHVybiBvZmYgdGhlIG51bWJlcmluZyBvbiBwYWdlcyB0aXRsZXMuXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG93UGFnZU51bWJlcnMoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UGFnZU51bWJlcnNcIiwgZmFsc2UpOyB9XG4gICAgcHVibGljIHNldCBzaG93UGFnZU51bWJlcnModmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB0aGlzLnNob3dQYWdlTnVtYmVycykgcmV0dXJuO1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UGFnZU51bWJlcnNcIiwgdmFsdWUpO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIFwib2ZmXCIgdG8gdHVybiBvZmYgdGhlIG51bWJlcmluZyBvbiBxdWVzdGlvbnMgdGl0bGVzIG9yIFwib25wYWdlXCIgdG8gc3RhcnQgbnVtYmVyaW5nIG9uIGV2ZXJ5IHBhZ2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFwib25cIi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dRdWVzdGlvbk51bWJlcnMoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dRdWVzdGlvbk51bWJlcnNcIiwgXCJvblwiKTsgfTtcbiAgICBwdWJsaWMgc2V0IHNob3dRdWVzdGlvbk51bWJlcnModmFsdWU6IHN0cmluZykge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHZhbHVlID0gKHZhbHVlID09PSBcIm9ucGFnZVwiKSA/IFwib25QYWdlXCIgOiB2YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMpIHJldHVybjtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIFwidG9wXCIgdG8gc2hvdyB0aGUgcHJvZ3Jlc3MgYmFyIG9uIHRoZSBib3R0b20gb3IgdG8gXCJib3R0b21cIiB0byBzaG93IGl0IG9uIHRoZSBib3R0b20uXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG93UHJvZ3Jlc3NCYXIoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dQcm9ncmVzc0JhclwiLCBcIm9mZlwiKTsgfVxuICAgIHB1YmxpYyBzZXQgc2hvd1Byb2dyZXNzQmFyKG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dQcm9ncmVzc0JhclwiLCBuZXdWYWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdGV4dC9odG1sIHRoYXQgcmVuZGVycyBhcyBzdXJ2ZXkgdGl0bGUuXG4gICAgICovXG4gICAgcHVibGljIGdldCBwcm9jZXNzZWRUaXRsZSgpIHsgcmV0dXJuIHRoaXMucHJvY2Vzc1RleHQodGhpcy5sb2NUaXRsZS50ZXh0T3JIdG1sLCB0cnVlKTsgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIHByb3BlcnR5IHRvICdib3R0b20nIG9yICdsZWZ0JyB0byBzaG93IHF1ZXN0aW9uIHRpdGxlIHVuZGVyIHRoZSBxdWVzdGlvbiBvciBvbiB0aGUgbGVmdC5cbiAgICAgKiA8YnIvPjxiPk5vdGU6PC9iPiBTb21lIHF1ZXN0aW9ucywgZm9yIGV4YW1wbGUgbWF0cml4ZXMsIGRvIG5vdCBzdXBwb3J0ICdsZWZ0JyB2YWx1ZS4gVGhlIHRpdGxlIGZvciB0aGVtIHdpbGwgYmUgZGlzcGxheWVkIG9uIHRoZSB0b3AuXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVzdGlvblRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLCBcInRvcFwiKTsgfTtcbiAgICBwdWJsaWMgc2V0IHF1ZXN0aW9uVGl0bGVMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLCB2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIHByb3BlcnR5IHRvICdib3R0b20nIHRvIHNob3cgcXVlc3Rpb24gZXJyb3IocykgdW5kZXIgdGhlIHF1ZXN0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcXVlc3Rpb25FcnJvckxvY2F0aW9uKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvbkVycm9yTG9jYXRpb25cIiwgXCJ0b3BcIik7IH07XG4gICAgcHVibGljIHNldCBxdWVzdGlvbkVycm9yTG9jYXRpb24odmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvbkVycm9yTG9jYXRpb25cIiwgdmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBtb2RlIHRvICdkaXNwbGF5JyB0byBtYWtlIHRoZSBzdXJ2ZXkgcmVhZC1vbmx5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAnZWRpdCcuIFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbW9kZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibW9kZVwiLCBcImVkaXRcIik7IH1cbiAgICBwdWJsaWMgc2V0IG1vZGUodmFsdWU6IHN0cmluZykge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh2YWx1ZSA9PSB0aGlzLm1vZGUpIHJldHVybjtcbiAgICAgICAgaWYgKHZhbHVlICE9IFwiZWRpdFwiICYmIHZhbHVlICE9IFwiZGlzcGxheVwiKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1vZGVcIiwgdmFsdWUpXG4gICAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucygpO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgcXVlc3Rpb25zW2ldLm9uUmVhZE9ubHlDaGFuZ2VkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHRoYXQgc3RvcmVzIHRoZSBzdXJ2ZXkgcmVzdWx0cy9kYXRhLiBZb3UgbWF5IHNldCBpdCBkaXJlY3RseSBhcyB7ICdxdWVzdGlvbiBuYW1lJzogcXVlc3Rpb25WYWx1ZSwgLi4uIH1cbiAgICAgKiBAc2VlIHNldFZhbHVlXG4gICAgICogQHNlZSBnZXRWYWx1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGF0YSgpOiBhbnkge1xuICAgICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnZhbHVlc0hhc2gpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdGhpcy52YWx1ZXNIYXNoW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZ2V0QWxsVmFsdWVzKCkgOiBhbnkgeyByZXR1cm4gdGhpcy5kYXRhOyB9XG4gICAgcHVibGljIHNldCBkYXRhKGRhdGE6IGFueSkge1xuICAgICAgICB0aGlzLnZhbHVlc0hhc2ggPSB7fTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwga2V5LCBkYXRhW2tleV0pO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tUcmlnZ2VycyhrZXksIGRhdGFba2V5XSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5wcm9jZXNzZWRUZXh0VmFsdWVzW2tleS50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NlZFRleHRWYWx1ZXNba2V5LnRvTG93ZXJDYXNlKCldID0gXCJ2YWx1ZVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vdGlmeUFsbFF1ZXN0aW9uc09uVmFsdWVDaGFuZ2VkKCk7XG4gICAgICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0RGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoOiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHZhbHVlc0hhc2hba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCBjb21tZW50cyBmcm9tIHRoZSBkYXRhLlxuICAgICAqIEBzZWUgZGF0YVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29tbWVudHMoKTogYW55IHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy52YWx1ZXNIYXNoKSB7XG4gICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YodGhpcy5jb21tZW50UHJlZml4KSA+IDApIHtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHRoaXMudmFsdWVzSGFzaFtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdmlzaWJsZSBwYWdlcy4gSWYgYWxsIHBhZ2VzIGFyZSB2aXNpYmxlIHRoZW4gaXQgaXMgdGhlIHNhbWUgYXMgcGFnZXMgcHJvcGVydHkuXG4gICAgICogQHNlZSBwYWdlc1xuICAgICAqIEBzZWUgUGFnZU1vZGVsLnZpc2libGVcbiAgICAgKiBAc2VlIFBhZ2VNb2RlbC52aXNpYmxlSWZcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZpc2libGVQYWdlcygpOiBBcnJheTxQYWdlTW9kZWw+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm4gdGhpcy5wYWdlcztcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxQYWdlTW9kZWw+KCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFnZXNbaV0uaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5wYWdlc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIG5vIGFueSBwYWdlIGluIHRoZSBzdXJ2ZXkuIFRoZSBzdXJ2ZXkgaXMgZW1wdHkuXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5wYWdlcy5sZW5ndGggPT0gMDsgfVxuICAgIC8qKlxuICAgICAqIGRlcHJpY2F0ZWQsIG1pc3NwZWxsaW5nLCB1c2UgcGFnZUNvdW50IHByb3BlcnR5XG4gICAgICovXG4gICAgZ2V0IFBhZ2VDb3VudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5wYWdlQ291bnQ7IH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdXJ2ZXkgcGFnZXMgY291bnQuXG4gICAgICogQHNlZSB2aXNpYmxlUGFnZUNvdW50XG4gICAgICogQHNlZSBwYWdlc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2VzLmxlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3VydmV5IHZpc2libGUgcGFnZXMgY291bnRcbiAgICAgKiBAc2VlIHBhZ2VDb3VudFxuICAgICAqIEBzZWUgdmlzaWJsZVBhZ2VzXG4gICAgICovXG4gICAgcHVibGljIGdldCB2aXNpYmxlUGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2libGVQYWdlcy5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3VydmV5IHBhZ2UuIElmIHN1cnZleSBpcyByZW5kcmVkIHRoZW4gaXQgaXMgYSBwYWdlIHRoYXQgYSB1c2VyIGNhbiBzZWUvZWRpdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRQYWdlKCk6IFBhZ2VNb2RlbCB7XG4gICAgICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFBhZ2VWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodlBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZVZhbHVlKSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jdXJyZW50UGFnZVZhbHVlID09IG51bGwgJiYgdlBhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB2UGFnZXNbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2VWYWx1ZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBjdXJyZW50UGFnZSh2YWx1ZTogUGFnZU1vZGVsKSB7XG4gICAgICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdlBhZ2VzLmluZGV4T2YodmFsdWUpIDwgMCkgcmV0dXJuO1xuICAgICAgICBpZiAodmFsdWUgPT0gdGhpcy5jdXJyZW50UGFnZVZhbHVlKSByZXR1cm47XG4gICAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuY3VycmVudFBhZ2VWYWx1ZTtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZVZhbHVlID0gdmFsdWU7XG4gICAgICAgIGlmKHZhbHVlKSB2YWx1ZS51cGRhdGVDdXN0b21XaWRnZXRzKCk7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2VDaGFuZ2VkKHZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBwYWdlIGluIHRoZSB2aXNpYmxlIHBhZ2VzIGFycmF5LiBJdCBzdGFydHMgZnJvbSAwLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVudFBhZ2VObygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpYmxlUGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKTtcbiAgICB9XG4gICAgcHVibGljIHNldCBjdXJyZW50UGFnZU5vKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID49IHRoaXMudmlzaWJsZVBhZ2VzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy52aXNpYmxlUGFnZXNbdmFsdWVdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGlucHV0IGZvY3VzIHRvIHRoZSBmaXJzdCBxdWVzdGlvbiB3aXRoIHRoZSBpbnB1dC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZm9jdXNGaXJzdFF1ZXN0aW9uKCkge1xuICAgICAgICB2YXIgcGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgICAgIGlmIChwYWdlKSB7XG4gICAgICAgICAgICBwYWdlLnNjcm9sbFRvVG9wKCk7XG4gICAgICAgICAgICBwYWdlLmZvY3VzRmlyc3RRdWVzdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNjcm9sbFRvVG9wT25QYWdlQ2hhbmdlKCkge1xuICAgICAgICB2YXIgcGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgICAgIGlmKCFwYWdlKSByZXR1cm47XG4gICAgICAgIHBhZ2Uuc2Nyb2xsVG9Ub3AoKTtcbiAgICAgICAgaWYodGhpcy5mb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWMpIHtcbiAgICAgICAgICAgIHBhZ2UuZm9jdXNGaXJzdFF1ZXN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdXJ2ZXkgc3RhdGU6ICdsb2FkaW5nJyAtIGxvYWRpbmcgZnJvbSB0aGUganNvbiwgJ2NvbXBsZXRlZCcgLSBhIHVzZXIgaGFzIGNvbXBsZXRlZCB0aGUgc3VydmV5LCAncnVubmluZycgLSBhIHVzZXIgYW5zd2VycyBhIHF1ZXN0aW9ucyByaWdodCBub3csICdlbXB0eScgLSB0aGVyZSBpcyBub3RoaW5nIHRvIHNob3cgaW4gdGhlIGN1cnJlbnQgc3VydmV5LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3RhdGUoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuaXNMb2FkaW5nKSByZXR1cm4gXCJsb2FkaW5nXCI7XG4gICAgICAgIGlmICh0aGlzLmlzQ29tcGxldGVkKSByZXR1cm4gXCJjb21wbGV0ZWRcIjtcbiAgICAgICAgaWYgKHRoaXMuaXNDb21wbGV0ZWRCZWZvcmUpIHJldHVybiBcImNvbXBsZXRlZGJlZm9yZVwiO1xuICAgICAgICByZXR1cm4gKHRoaXMuY3VycmVudFBhZ2UpID8gXCJydW5uaW5nXCIgOiBcImVtcHR5XCJcbiAgICB9XG4gICAgcHVibGljIGdldCBjb21wbGV0ZWRTdGF0ZSgpOiBzdHJpbmcge3JldHVybiB0aGlzLmNvbXBsZXRlZFN0YXRlVmFsdWU7IH1cbiAgICBnZXQgY29tcGxldGVkU3RhdGVUZXh0KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmNvbXBsZXRlZFN0YXRlVGV4dFZhbHVlOyB9XG4gICAgcHJvdGVjdGVkIHNldENvbXBsZXRlZFN0YXRlKHZhbHVlOiBzdHJpbmcsIHRleHQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLmNvbXBsZXRlZFN0YXRlVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgaWYoIXRleHQpIHtcbiAgICAgICAgICAgIGlmKHZhbHVlID09IFwic2F2aW5nXCIpIHRleHQgPSB0aGlzLmdldExvY1N0cmluZyhcInNhdmluZ0RhdGFcIik7XG4gICAgICAgICAgICBpZih2YWx1ZSA9PSBcImVycm9yXCIpIHRleHQgPSB0aGlzLmdldExvY1N0cmluZyhcInNhdmluZ0RhdGFFcnJvclwiKTtcbiAgICAgICAgICAgIGlmKHZhbHVlID09IFwic3VjY2Vzc1wiKSB0ZXh0ID0gdGhpcy5nZXRMb2NTdHJpbmcoXCJzYXZpbmdEYXRhU3VjY2Vzc1wiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbXBsZXRlZFN0YXRlVGV4dFZhbHVlID0gdGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhlIHN1cnZleSBkYXRhIGFuZCBzdGF0ZS4gSWYgdGhlIHN1cnZleSBoYXMgYSAnY29tcGxldGVkJyBzdGF0ZSwgaXQgd2lsbCBoYXZlIGEgJ3J1bm5pbmcnIHN0YXRlLlxuICAgICAqIEBwYXJhbSBjbGVhckRhdGEgY2xlYXIgdGhlIGRhdGFcbiAgICAgKiBAcGFyYW0gZ290b0ZpcnN0UGFnZSBtYWtlIHRoZSBmaXJzdCBwYWdlIGFzIGEgY3VycmVudCBwYWdlLlxuICAgICAqIEBzZWUgZGF0YVxuICAgICAqIEBzZWUgc3RhdGVcbiAgICAgKiBAc2VlIGN1cnJlbnRQYWdlXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKGNsZWFyRGF0YTogYm9vbGVhbiA9IHRydWUsIGdvdG9GaXJzdFBhZ2U6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgICAgIGlmIChjbGVhckRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlc0hhc2ggPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFRpbWVTcGVudCgwKTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VzW2ldLnRpbWVTcGVudCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0NvbXBsZXRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzQ29tcGxldGVkQmVmb3JlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChnb3RvRmlyc3RQYWdlICYmIHRoaXMudmlzaWJsZVBhZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnZpc2libGVQYWdlc1swXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgbWVyZ2VWYWx1ZXMoc3JjOiBhbnksIGRlc3Q6IGFueSkge1xuICAgICAgICBpZiAoIWRlc3QgfHwgIXNyYykgcmV0dXJuO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBzcmNba2V5XTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFkZXN0W2tleV0pIGRlc3Rba2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VWYWx1ZXModmFsdWUsIGRlc3Rba2V5XSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHByb3RlY3RlZCB1cGRhdGVDdXN0b21XaWRnZXRzKHBhZ2U6IFBhZ2VNb2RlbCkge1xuICAgICAgICBpZiAoIXBhZ2UpIHJldHVybjtcbiAgICAgICAgcGFnZS51cGRhdGVDdXN0b21XaWRnZXRzKCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBjdXJyZW50UGFnZUNoYW5nZWQobmV3VmFsdWU6IFBhZ2VNb2RlbCwgb2xkVmFsdWU6IFBhZ2VNb2RlbCkge1xuICAgICAgICB0aGlzLm9uQ3VycmVudFBhZ2VDaGFuZ2VkLmZpcmUodGhpcywgeyAnb2xkQ3VycmVudFBhZ2UnOiBvbGRWYWx1ZSwgJ25ld0N1cnJlbnRQYWdlJzogbmV3VmFsdWUgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHByb2dyZXNzIHRoYXQgYSB1c2VyIG1hZGUgYnkgYW5zd2VyaW5nIG9uIHRoZSBzdXJ2ZXkuXG4gICAgICovXG4gICAgcHVibGljIGdldFByb2dyZXNzKCk6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID09IG51bGwpIHJldHVybiAwO1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLnZpc2libGVQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpICsgMTtcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCgoaW5kZXggKiAxMDAgLyB0aGlzLnZpc2libGVQYWdlQ291bnQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIG5hdmlnYXRpb24gYnV0dG9uczogJ1ByZXYnLCAnTmV4dCcgb3IgJ0NvbXBsZXRlJyBhcmUgc2hvd24uXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc05hdmlnYXRpb25CdXR0b25zU2hvd2luZygpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBwYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICAgICAgaWYgKCFwYWdlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBwYWdlLm5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eSA9PSBcInNob3dcIiB8fFxuICAgICAgICAgICAgKHBhZ2UubmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5ICE9IFwiaGlkZVwiICYmIHRoaXMuc2hvd05hdmlnYXRpb25CdXR0b25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdXJ2ZXkgaW4gdGhlIGVkaXQgbW9kZS5cbiAgICAgKiBAc2VlIG1vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzRWRpdE1vZGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm1vZGUgPT0gXCJlZGl0XCI7IH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHN1cnZleSBpbiB0aGUgZGlzcGxheSBtb2RlLlxuICAgICAqIEBzZWUgbW9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNEaXNwbGF5TW9kZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMubW9kZSA9PSBcImRpc3BsYXlcIjsgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3VydmV5IGluIHRoZSBkZXNpZ24gbW9kZS4gSXQgaXMgdXNlZCBieSBTdXJ2ZXlKUyBFZGl0b3JcbiAgICAgKiBAc2VlIHNldERlc2lnbk1vZGUgXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0Rlc2lnbk1vZGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc0Rlc2lnbk1vZGVcIiwgZmFsc2UpOyB9XG4gICAgLyoqXG4gICAgICogQ2FsbCBpdCB0byBzZXQgdGhlIHN1cnZleSBpbnRvIHRoZSBkZXNpZ24gbW9kZS5cbiAgICAgKiBAcGFyYW0gdmFsdWUgdXNlIHRydWUgdG8gc2V0IHRoZSBzdXJ2ZXkgaW50byB0aGUgZGVzaWduIG1vZGUuXG4gICAgICovXG4gICAgcHVibGljIHNldERlc2lnbk1vZGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNEZXNpZ25Nb2RlXCIsIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlLCBpZiBhIHVzZXIgaGFzIGFscmVhZHkgY29tcGxldGVkIHRoZSBzdXJ2ZXkgb24gdGhpcyBicm93c2VyIGFuZCB0aGVyZSBpcyBhIGNvb2tpZSBhYm91dCBpdC4gU3VydmV5IGdvZXMgdG8gJ2NvbXBsZXRlZCcgc3RhdGUgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZS5cbiAgICAgKiBAc2VlIGNvb2tpZU5hbWVcbiAgICAgKiBAc2VlIHNldENvb2tpZVxuICAgICAqIEBzZWUgZGVsZXRlQ29va2llICBcbiAgICAgKiBAc2VlIHN0YXRlXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNDb29raWUoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5jb29raWVOYW1lKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llO1xuICAgICAgICByZXR1cm4gY29va2llcyAmJiBjb29raWVzLmluZGV4T2YodGhpcy5jb29raWVOYW1lICsgXCI9dHJ1ZVwiKSA+IC0xO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGNvb2tpZSB3aXRoIGNvb2tpZU5hbWUgaW4gdGhlIGJyb3dzZXIuIEl0IGlzIGRvbmUgYXV0b21hdGljYWxseSBvbiBzdXJ2ZXkgY29tcGxldGUgaWYgY29va2llTmFtZSBpcyBub3QgZW1wdHkuXG4gICAgICogQHNlZSBjb29raWVOYW1lXG4gICAgICogQHNlZSBoYXNDb29raWVcbiAgICAgKiBAc2VlIGRlbGV0ZUNvb2tpZSAgXG4gICAgICovXG4gICAgcHVibGljIHNldENvb2tpZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvb2tpZU5hbWUpIHJldHVybjtcbiAgICAgICAgZG9jdW1lbnQuY29va2llID0gdGhpcy5jb29raWVOYW1lICsgXCI9dHJ1ZTsgZXhwaXJlcz1GcmksIDMxIERlYyA5OTk5IDA6MDowIEdNVFwiO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgdGhlIGNvb2tpZSB3aXRoIGNvb2tpZU5hbWUgaW4gdGhlIGJyb3dzZXIuIFxuICAgICAqIEBzZWUgY29va2llTmFtZVxuICAgICAqIEBzZWUgaGFzQ29va2llXG4gICAgICogQHNlZSBzZXRDb29raWUgIFxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVDb29raWUoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb29raWVOYW1lKSByZXR1cm47XG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IHRoaXMuY29va2llTmFtZSArIFwiPTtcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCBpdCB0byBnbyB0byB0aGUgbmV4dCBwYWdlLiBJdCByZXR1cm5zIGZhbHNlLCBpZiBpdCBpcyB0aGUgbGFzdCBwYWdlLiBJZiB0aGVyZSBpcyBhbiBlcnJvciwgZm9yIGV4YW1wbGUgcmVxdWlyZWQgcXVlc3Rpb24gaXMgZW1wdHksIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIGFzIHdlbGwuXG4gICAgICogQHNlZSBpc0N1cnJlbnRQYWdlSGFzRXJyb3JzXG4gICAgICogQHNlZSBwcmV2UGFnZVxuICAgICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgICAqL1xuICAgIHB1YmxpYyBuZXh0UGFnZSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuaXNMYXN0UGFnZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5pc0VkaXRNb2RlICYmIHRoaXMuaXNDdXJyZW50UGFnZUhhc0Vycm9ycykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5kb1NlcnZlclZhbGlkYXRpb24oKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmRvTmV4dFBhZ2UoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlcmUgaXMgYW55IGVycm9yIG9uIHRoZSBjdXJyZW50IHBhZ2UuIEZvciBleGFtcGxlLCB0aGUgcmVxdWlyZWQgcXVlc3Rpb24gaXMgZW1wdHkgb3IgYSBxdWVzdGlvbiB2YWxpZGF0aW9uIGlzIGZhaWxlZC5cbiAgICAgKiBAc2VlIG5leHRQYWdlXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0N1cnJlbnRQYWdlSGFzRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2UuaGFzRXJyb3JzKHRydWUsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIGl0IHRvIGdvIHRvIHRoZSBwcmV2aW91cyBwYWdlLiBJdCByZXR1cm5zIGZhbHNlIGlmIHRoZSBjdXJyZW50IHBhZ2UgaXMgdGhlIGZpcnN0IHBhZ2UgYWxyZWFkeS4gSXQgZG9lc24ndCBwZXJmb3JtIGFueSBjaGVja3MsIHJlcXVpcmVkIHF1ZXN0aW9ucyBjYW4gYmUgZW1wdHkuXG4gICAgICogQHNlZSBpc0ZpcnN0UGFnZVxuICAgICAqL1xuICAgIHB1YmxpYyBwcmV2UGFnZSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGaXJzdFBhZ2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgICAgICB2YXIgaW5kZXggPSB2UGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKTtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHZQYWdlc1tpbmRleCAtIDFdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIGl0IHRvIGNvbXBsZXRlIHRoZSBzdXJ2ZXksIGlmIHRoZSBjdXJyZW50IHBhZ2UgaXMgdGhlIGxhc3Qgb25lLiBJdCByZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzIGFuIGVycm9yIG9uIHRoZSBwYWdlLiBJZiB0aGVyZSBpcyBubyBlcnJvcnMgb24gdGhlIHBhZ2UsIGl0IGNhbGxzIGRvQ29tcGxldGUgYW5kIHJldHVybnMgdHJ1ZS5cbiAgICAgKiBAc2VlIGlzQ3VycmVudFBhZ2VIYXNFcnJvcnNcbiAgICAgKiBAc2VlIG5leHRQYWdlXG4gICAgICogQHNlZSBkb0NvbXBsZXRlXG4gICAgICovXG4gICAgcHVibGljIGNvbXBsZXRlTGFzdFBhZ2UoKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5pc0VkaXRNb2RlICYmIHRoaXMuaXNDdXJyZW50UGFnZUhhc0Vycm9ycykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5kb1NlcnZlclZhbGlkYXRpb24oKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmRvQ29tcGxldGUoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBmaXJzdCBvbmUuXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0ZpcnN0UGFnZSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2libGVQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpID09IDA7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaXNTaG93UHJldkJ1dHRvbigpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmKHRoaXMuaXNGaXJzdFBhZ2UgfHwgIXRoaXMuc2hvd1ByZXZCdXR0b24pIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYodGhpcy5tYXhUaW1lVG9GaW5pc2ggPiAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBwYWdlID0gdGhpcy52aXNpYmxlUGFnZXNbdGhpcy5jdXJyZW50UGFnZU5vIC0gMV07XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhZ2VNYXhUaW1lVG9GaW5pc2gocGFnZSkgPD0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IHBhZ2UgaXMgdGhlIGxhc3Qgb25lLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNMYXN0UGFnZSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICAgICAgcmV0dXJuIHZQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpID09IHZQYWdlcy5sZW5ndGggLSAxO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIGl0IHRvIGNvbXBsZXRlIHRoZSBzdXJ2ZXkuIEl0IHdyaXRlcyBjb29raWUgaWYgY29va2llTmFtZSBwcm9wZXJ0eSBpcyBub3QgZW1wdHksIHNldCB0aGUgc3VydmV5IGludG8gJ2NvbXBsZXRlZCcgc3RhdGUsIGZpcmUgb25Db21wbGV0ZSBldmVudCBhbmQgc2VuZFJlc3VsdCBpbnRvIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlIGlmIHN1cnZleVBvc3RJZCBwcm9wZXJ0eSBpcyBub3QgZW1wdHkuIEl0IGRvZXNuJ3QgcGVyZm9ybSBhbnkgdmFsaWRhdGlvbiwgdW5saWtlIGNvbXBsZXRlTGFzdFBhZ2UgZnVuY3Rpb24uIFxuICAgICAqIEBzZWUgY29va2llTmFtZVxuICAgICAqIEBzZWUgc3RhdGVcbiAgICAgKiBAc2VlIG9uQ29tcGxldGVcbiAgICAgKiBAc2VlIHN1cnZleVBvc3RJZFxuICAgICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgICAqL1xuICAgIHB1YmxpYyBkb0NvbXBsZXRlKCkge1xuICAgICAgICBsZXQgcHJldmlvdXNDb29raWUgPSB0aGlzLmhhc0Nvb2tpZTtcbiAgICAgICAgdGhpcy5zdG9wVGltZXIoKTtcbiAgICAgICAgdGhpcy5jbGVhclVudXNlZFZhbHVlcygpO1xuICAgICAgICB0aGlzLnNldENvb2tpZSgpO1xuICAgICAgICB0aGlzLnNldENvbXBsZXRlZCgpO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciBvbkNvbXBsZXRlT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHNob3dEYXRhU2F2aW5nOiBmdW5jdGlvbih0ZXh0OiBzdHJpbmcpIHtzZWxmLnNldENvbXBsZXRlZFN0YXRlKFwic2F2aW5nXCIsIHRleHQpO30sXG4gICAgICAgICAgICBzaG93RGF0YVNhdmluZ0Vycm9yOiBmdW5jdGlvbih0ZXh0OiBzdHJpbmcpIHtzZWxmLnNldENvbXBsZXRlZFN0YXRlKFwiZXJyb3JcIiwgdGV4dCk7fSxcbiAgICAgICAgICAgIHNob3dEYXRhU2F2aW5nU3VjY2VzczogZnVuY3Rpb24odGV4dDogc3RyaW5nKSB7c2VsZi5zZXRDb21wbGV0ZWRTdGF0ZShcInN1Y2Nlc3NcIiwgdGV4dCk7fSxcbiAgICAgICAgICAgIHNob3dEYXRhU2F2aW5nQ2xlYXI6IGZ1bmN0aW9uKHRleHQ6IHN0cmluZykge3NlbGYuc2V0Q29tcGxldGVkU3RhdGUoXCJcIiwgXCJcIik7fVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uQ29tcGxldGUuZmlyZSh0aGlzLCBvbkNvbXBsZXRlT3B0aW9ucyk7XG4gICAgICAgIGlmICghcHJldmlvdXNDb29raWUgJiYgdGhpcy5zdXJ2ZXlQb3N0SWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZFJlc3VsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSwgaWYgYXQgdGhlIGN1cnJlbnQgbW9tZW50IHRoZSBxdWVzdGlvbiB2YWx1ZXMgb24gdGhlIGN1cnJlbnQgcGFnZSBhcmUgdmFsaWRhdGluZyBvbiB0aGUgc2VydmVyLlxuICAgICAqIEBzZWUgb25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNWYWxpZGF0aW5nT25TZXJ2ZXIoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1ZhbGlkYXRpbmdPblNlcnZlclwiLCBmYWxzZSk7IH1cbiAgICBwcml2YXRlIHNldElzVmFsaWRhdGluZ09uU2VydmVyKHZhbDogYm9vbGVhbikge1xuICAgICAgICBpZiAodmFsID09IHRoaXMuaXNWYWxpZGF0aW5nT25TZXJ2ZXIpIHJldHVybjtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNWYWxpZGF0aW5nT25TZXJ2ZXJcIiwgdmFsKTtcbiAgICAgICAgdGhpcy5vbklzVmFsaWRhdGluZ09uU2VydmVyQ2hhbmdlZCgpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgb25Jc1ZhbGlkYXRpbmdPblNlcnZlckNoYW5nZWQoKSB7IH1cbiAgICBwcm90ZWN0ZWQgZG9TZXJ2ZXJWYWxpZGF0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMub25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9ucykgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciBvcHRpb25zID0geyBkYXRhOiB7fSwgZXJyb3JzOiB7fSwgc3VydmV5OiB0aGlzLCBjb21wbGV0ZSA6IGZ1bmN0aW9uICgpIHsgc2VsZi5jb21wbGV0ZVNlcnZlclZhbGlkYXRpb24ob3B0aW9ucyk7IH0gfTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmN1cnJlbnRQYWdlLnF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5jdXJyZW50UGFnZS5xdWVzdGlvbnNbaV07XG4gICAgICAgICAgICBpZiAoIXF1ZXN0aW9uLnZpc2libGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZShxdWVzdGlvbi5uYW1lKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkodmFsdWUpKSBvcHRpb25zLmRhdGFbcXVlc3Rpb24ubmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldElzVmFsaWRhdGluZ09uU2VydmVyKHRydWUpO1xuICAgICAgICB0aGlzLm9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnModGhpcywgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBwcml2YXRlIGNvbXBsZXRlU2VydmVyVmFsaWRhdGlvbihvcHRpb25zOiBhbnkpIHtcbiAgICAgICAgdGhpcy5zZXRJc1ZhbGlkYXRpbmdPblNlcnZlcihmYWxzZSk7XG4gICAgICAgIGlmICghb3B0aW9ucyAmJiAhb3B0aW9ucy5zdXJ2ZXkpIHJldHVybjtcbiAgICAgICAgdmFyIHNlbGYgPSBvcHRpb25zLnN1cnZleTtcbiAgICAgICAgdmFyIGhhc0Vycm9ycyA9IGZhbHNlO1xuICAgICAgICBpZiAob3B0aW9ucy5lcnJvcnMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIG5hbWUgaW4gb3B0aW9ucy5lcnJvcnMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcXVlc3Rpb24gPSBzZWxmLmdldFF1ZXN0aW9uQnlOYW1lKG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChxdWVzdGlvbiAmJiBxdWVzdGlvbltcImVycm9yc1wiXSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNFcnJvcnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbltcImFkZEVycm9yXCJdKG5ldyBDdXN0b21FcnJvcihvcHRpb25zLmVycm9yc1tuYW1lXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWhhc0Vycm9ycykge1xuICAgICAgICAgICAgaWYgKHNlbGYuaXNMYXN0UGFnZSkgc2VsZi5kb0NvbXBsZXRlKCk7XG4gICAgICAgICAgICBlbHNlIHNlbGYuZG9OZXh0UGFnZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb3RlY3RlZCBkb05leHRQYWdlKCkge1xuICAgICAgICB0aGlzLmNoZWNrT25QYWdlVHJpZ2dlcnMoKTtcbiAgICAgICAgaWYgKHRoaXMuc2VuZFJlc3VsdE9uUGFnZU5leHQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZFJlc3VsdCh0aGlzLnN1cnZleVBvc3RJZCwgdGhpcy5jbGllbnRJZCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgICAgICB2YXIgaW5kZXggPSB2UGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKTtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHZQYWdlc1tpbmRleCArIDFdO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0Q29tcGxldGVkKCkge1xuICAgICAgICB0aGlzLmlzQ29tcGxldGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaHRtbCBmb3IgY29tcGxldGVkICdUaGFuayB5b3UnIHBhZ2UuXG4gICAgICogQHNlZSBjb21wbGV0ZWRIdG1sXG4gICAgICovXG4gICAgcHVibGljIGdldCBwcm9jZXNzZWRDb21wbGV0ZWRIdG1sKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBsZXRlZEh0bWwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NIdG1sKHRoaXMuY29tcGxldGVkSHRtbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiPGgzPlwiICsgdGhpcy5nZXRMb2NTdHJpbmcoXCJjb21wbGV0aW5nU3VydmV5XCIpICsgXCI8L2gzPlwiO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBodG1sIHNob3dpbmcgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSBjb21wbGV0ZWQgdGhlIHN1cnZleVxuICAgICAqIEBzZWUgY29tcGxldGVkSHRtbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcHJvY2Vzc2VkQ29tcGxldGVkQmVmb3JlSHRtbCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5jb21wbGV0ZWRCZWZvcmVIdG1sKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzSHRtbCh0aGlzLmNvbXBsZXRlZEJlZm9yZUh0bWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIjxoMz5cIiArIHRoaXMuZ2V0TG9jU3RyaW5nKFwiY29tcGxldGluZ1N1cnZleUJlZm9yZVwiKSArIFwiPC9oMz5cIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaHRtbCB0aGF0IHNob3dzIG9uIGxvYWRpbmcgdGhlIGpzb24uXG4gICAgICovXG4gICAgcHVibGljIGdldCBwcm9jZXNzZWRMb2FkaW5nSHRtbCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5sb2FkaW5nSHRtbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0h0bWwodGhpcy5sb2FkaW5nSHRtbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiPGgzPlwiICsgdGhpcy5nZXRMb2NTdHJpbmcoXCJsb2FkaW5nU3VydmV5XCIpICsgXCI8L2gzPlwiO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGUgY3VycmVudCBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHByb2dyZXNzVGV4dCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA9PSBudWxsKSByZXR1cm4gXCJcIjtcbiAgICAgICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgICAgICB2YXIgaW5kZXggPSB2UGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKSArIDE7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcInByb2dyZXNzVGV4dFwiKVtcImZvcm1hdFwiXShpbmRleCwgdlBhZ2VzLmxlbmd0aCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhZnRlclJlbmRlclN1cnZleShodG1sRWxlbWVudCkge1xuICAgICAgICB0aGlzLm9uQWZ0ZXJSZW5kZXJTdXJ2ZXkuZmlyZSh0aGlzLCB7IHN1cnZleTogdGhpcywgaHRtbEVsZW1lbnQ6IGh0bWxFbGVtZW50IH0pO1xuICAgIH1cbiAgICB1cGRhdGVRdWVzdGlvbkNzc0NsYXNzZXMocXVlc3Rpb246IElRdWVzdGlvbiwgY3NzQ2xhc3NlczogYW55KSB7XG4gICAgICAgIHRoaXMub25VcGRhdGVRdWVzdGlvbkNzc0NsYXNzZXMuZmlyZSh0aGlzLCB7IHF1ZXN0aW9uOiBxdWVzdGlvbiwgY3NzQ2xhc3NlczogY3NzQ2xhc3NlcyB9KTtcbiAgICB9XG4gICAgYWZ0ZXJSZW5kZXJQYWdlKGh0bWxFbGVtZW50KSB7XG4gICAgICAgIGlmICh0aGlzLm9uQWZ0ZXJSZW5kZXJQYWdlLmlzRW1wdHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5vbkFmdGVyUmVuZGVyUGFnZS5maXJlKHRoaXMsIHsgcGFnZTogdGhpcy5jdXJyZW50UGFnZSwgaHRtbEVsZW1lbnQ6IGh0bWxFbGVtZW50IH0pO1xuICAgIH1cbiAgICBhZnRlclJlbmRlclF1ZXN0aW9uKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGh0bWxFbGVtZW50KSB7XG4gICAgICAgIHRoaXMub25BZnRlclJlbmRlclF1ZXN0aW9uLmZpcmUodGhpcywgeyBxdWVzdGlvbjogcXVlc3Rpb24sIGh0bWxFbGVtZW50OiBodG1sRWxlbWVudCB9KTtcbiAgICB9XG4gICAgYWZ0ZXJSZW5kZXJQYW5lbChwYW5lbDogSUVsZW1lbnQsIGh0bWxFbGVtZW50KSB7XG4gICAgICAgIHRoaXMub25BZnRlclJlbmRlclBhbmVsLmZpcmUodGhpcywgeyBwYW5lbDogcGFuZWwsIGh0bWxFbGVtZW50OiBodG1sRWxlbWVudCB9KTtcbiAgICB9XG4gICAgbWF0cml4Um93QWRkZWQocXVlc3Rpb246IElRdWVzdGlvbikge1xuICAgICAgICB0aGlzLm9uTWF0cml4Um93QWRkZWQuZmlyZSh0aGlzLCB7cXVlc3Rpb246IHF1ZXN0aW9ufSk7XG4gICAgfVxuICAgIG1hdHJpeFJvd1JlbW92ZWQocXVlc3Rpb246IElRdWVzdGlvbiwgcm93SW5kZXg6IG51bWJlciwgcm93OiBhbnkpIHtcbiAgICAgICAgdGhpcy5vbk1hdHJpeFJvd1JlbW92ZWQuZmlyZSh0aGlzLCB7cXVlc3Rpb246IHF1ZXN0aW9uLCByb3dJbmRleDogcm93SW5kZXgsIHJvdzogcm93fSk7XG4gICAgfVxuICAgIG1hdHJpeENlbGxDcmVhdGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSkge1xuICAgICAgICBvcHRpb25zLnF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgICAgIHRoaXMub25NYXRyaXhDZWxsQ3JlYXRlZC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBtYXRyaXhBZnRlckNlbGxSZW5kZXIocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KSB7XG4gICAgICAgIG9wdGlvbnMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICAgICAgdGhpcy5vbk1hdHJpeEFmdGVyQ2VsbFJlbmRlci5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBtYXRyaXhDZWxsVmFsdWVDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSkge1xuICAgICAgICBvcHRpb25zLnF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgICAgIHRoaXMub25NYXRyaXhDZWxsVmFsdWVDaGFuZ2VkLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICAgIG1hdHJpeENlbGxWYWxpZGF0ZShxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpOiBTdXJ2ZXlFcnJvciB7XG4gICAgICAgIG9wdGlvbnMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICAgICAgdGhpcy5vbk1hdHJpeENlbGxWYWxpZGF0ZS5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5lcnJvciA/IG5ldyBDdXN0b21FcnJvcihvcHRpb25zLmVycm9yKSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwbG9hZCB0aGUgZmlsZSBpbnRvIHNlcnZleVxuICAgICAqIEBwYXJhbSBuYW1lIHF1ZXN0aW9uIG5hbWVcbiAgICAgKiBAcGFyYW0gZmlsZSB1cGxvYWRpbmcgZmlsZVxuICAgICAqIEBwYXJhbSBzdG9yZURhdGFBc1RleHQgc2V0IGl0IHRvIHRydWUgdG8gZW5jb2RlIGZpbGUgY29udGVudCBpbnRvIHRoZSBzdXJ2ZXkgcmVzdWx0c1xuICAgICAqIEBwYXJhbSB1cGxvYWRpbmdDYWxsYmFjayBhIGNhbGwgYmFjayBmdW5jdGlvbiB0byBnZXQgdGhlIHN0YXR1cyBvbiB1cGxvYWRpbmcgdGhlIGZpbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgdXBsb2FkRmlsZShuYW1lOiBzdHJpbmcsIGZpbGU6IEZpbGUsIHN0b3JlRGF0YUFzVGV4dDogYm9vbGVhbiwgdXBsb2FkaW5nQ2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZyk9PmFueSk6IGJvb2xlYW4ge1xuICAgICAgICB2YXIgYWNjZXB0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vblVwbG9hZEZpbGUuZmlyZSh0aGlzLCB7IG5hbWU6IG5hbWUsIGZpbGU6IGZpbGUsIGFjY2VwdDogYWNjZXB0IH0pO1xuICAgICAgICBpZiAoIWFjY2VwdCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIXN0b3JlRGF0YUFzVGV4dCAmJiB0aGlzLnN1cnZleVBvc3RJZCkge1xuICAgICAgICAgICAgdGhpcy51cGxvYWRGaWxlQ29yZShuYW1lLCBmaWxlLCB1cGxvYWRpbmdDYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHByb3RlY3RlZCBjcmVhdGVTdXJ2ZXlTZXJ2aWNlKCkgOiBkeFN1cnZleVNlcnZpY2Uge1xuICAgICAgICByZXR1cm4gbmV3IGR4U3VydmV5U2VydmljZSgpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgdXBsb2FkRmlsZUNvcmUobmFtZTogc3RyaW5nLCBmaWxlOiBGaWxlLCB1cGxvYWRpbmdDYWxsYmFjazogKHN0YXR1czogc3RyaW5nKSA9PiBhbnkpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBpZiAodXBsb2FkaW5nQ2FsbGJhY2spIHVwbG9hZGluZ0NhbGxiYWNrKFwidXBsb2FkaW5nXCIpO1xuICAgICAgICB0aGlzLmNyZWF0ZVN1cnZleVNlcnZpY2UoKS5zZW5kRmlsZSh0aGlzLnN1cnZleVBvc3RJZCwgZmlsZSwgZnVuY3Rpb24gKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgICAgIGlmICh1cGxvYWRpbmdDYWxsYmFjaykgdXBsb2FkaW5nQ2FsbGJhY2soc3VjY2VzcyA/IFwic3VjY2Vzc1wiIDogXCJlcnJvclwiKTtcbiAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShuYW1lLCByZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRQYWdlKGluZGV4OiBudW1iZXIpOiBQYWdlTW9kZWwge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdlc1tpbmRleF07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIHBhZ2UgaW50byB0aGUgc3VydmV5XG4gICAgICogQHBhcmFtIHBhZ2VcbiAgICAgKiBAc2VlIGFkZE5ld1BhZ2VcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkUGFnZShwYWdlOiBQYWdlTW9kZWwpIHtcbiAgICAgICAgaWYgKHBhZ2UgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnBhZ2VzLnB1c2gocGFnZSk7XG4gICAgICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBwYWdlIGFuZCBhZGRzIGl0IGludG8gdGhlIHN1cnZleS4gR2VuYXJhdGVzIGEgbmV3IG5hbWUgaWYgdGhlIG5hbWUgcGFyYW1ldGVyIGlzIG5vdCBzZXQuXG4gICAgICogQHBhcmFtIG5hbWUgYSBwYWdlIG5hbWVcbiAgICAgKiBAc2VlIGFkZFBhZ2VcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkTmV3UGFnZShuYW1lOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgICAgIHZhciBwYWdlID0gdGhpcy5jcmVhdGVOZXdQYWdlKG5hbWUpO1xuICAgICAgICB0aGlzLmFkZFBhZ2UocGFnZSk7XG4gICAgICAgIHJldHVybiBwYWdlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIHBhZ2UgZnJvbSB0aGUgc3VydmV5XG4gICAgICogQHBhcmFtIHBhZ2UgXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVBhZ2UocGFnZTogUGFnZU1vZGVsKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMucGFnZXMuaW5kZXhPZihwYWdlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnBhZ2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlVmFsdWUgPT0gcGFnZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMucGFnZXMubGVuZ3RoID4gMCA/IHRoaXMucGFnZXNbMF0gOiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHF1ZXN0aW9uIGJ5IGl0cyBuYW1lXG4gICAgICogQHBhcmFtIG5hbWUgYSBxdWVzdGlvbiBuYW1lXG4gICAgICogQHBhcmFtIGNhc2VJbnNlbnNpdGl2ZSBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UXVlc3Rpb25CeU5hbWUobmFtZTogc3RyaW5nLCBjYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZSk6IElRdWVzdGlvbiB7XG4gICAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucygpO1xuICAgICAgICBpZiAoY2FzZUluc2Vuc2l0aXZlKSBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcXVlc3Rpb25OYW1lID0gcXVlc3Rpb25zW2ldLm5hbWU7XG4gICAgICAgICAgICBpZiAoY2FzZUluc2Vuc2l0aXZlKSBxdWVzdGlvbk5hbWUgPSBxdWVzdGlvbk5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmKHF1ZXN0aW9uTmFtZSA9PSBuYW1lKSByZXR1cm4gcXVlc3Rpb25zW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgYSBsaXN0IG9mIHF1ZXN0aW9ucyBieSB0aGVpciBuYW1lc1xuICAgICAqIEBwYXJhbSBuYW1lcyB0aGUgYXJyYXkgb2YgbmFtZXNcbiAgICAgKiBAcGFyYW0gY2FzZUluc2Vuc2l0aXZlIFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRRdWVzdGlvbnNCeU5hbWVzKG5hbWVzOiBzdHJpbmdbXSwgY2FzZUluc2Vuc2l0aXZlOiBib29sZWFuID0gZmFsc2UpOiBJUXVlc3Rpb25bXSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgaWYgKCFuYW1lcykgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIW5hbWVzW2ldKSBjb250aW51ZTtcbiAgICAgICAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZXNbaV0sIGNhc2VJbnNlbnNpdGl2ZSk7XG4gICAgICAgICAgICBpZiAocXVlc3Rpb24pIHJlc3VsdC5wdXNoKHF1ZXN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcGFnZSBvbiB3aGljaCBhbiBlbGVtZW50IChxdWVzdGlvbiBvciBwYW5lbCkgaXMgcGxhY2VkLlxuICAgICAqIEBwYXJhbSBlbGVtZW50IFF1ZXN0aW9uIG9yIFBhbmVsXG4gICAgICovXG4gICAgcHVibGljIGdldFBhZ2VCeUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBQYWdlTW9kZWwge1xuICAgICAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHBhZ2UgPSB0aGlzLnBhZ2VzW2ldO1xuICAgICAgICAgICAgaWYocGFnZS5jb250YWluc0VsZW1lbnQoZWxlbWVudCkpIHJldHVybiBwYWdlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcGFnZSBvbiB3aGljaCBhIHF1ZXN0aW9uIGlzIGxvY2F0ZWRcbiAgICAgKiBAcGFyYW0gcXVlc3Rpb24gXG4gICAgICovXG4gICAgcHVibGljIGdldFBhZ2VCeVF1ZXN0aW9uKHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBQYWdlTW9kZWwge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYWdlQnlFbGVtZW50KHF1ZXN0aW9uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHBhZ2UgYnkgaXQncyBuYW1lLlxuICAgICAqIEBwYXJhbSBuYW1lIFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQYWdlQnlOYW1lKG5hbWU6IHN0cmluZyk6IFBhZ2VNb2RlbCB7XG4gICAgICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYWdlc1tpXS5uYW1lID09IG5hbWUpIHJldHVybiB0aGlzLnBhZ2VzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXJ0dW5zIGEgbGlzdCBvZiBwYWdlcyBieSB0aGVpciBuYW1lc1xuICAgICAqIEBwYXJhbSBuYW1lcyBhIGxpc3Qgb2YgcGFnZXMgbmFtZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGFnZXNCeU5hbWVzKG5hbWVzOiBzdHJpbmdbXSk6IFBhZ2VNb2RlbFtde1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIGlmICghbmFtZXMpIHJldHVybiByZXN1bHQ7XG4gICAgICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFuYW1lc1tpXSkgY29udGludWU7XG4gICAgICAgICAgICB2YXIgcGFnZSA9IHRoaXMuZ2V0UGFnZUJ5TmFtZShuYW1lc1tpXSk7XG4gICAgICAgICAgICBpZiAocGFnZSkgcmVzdWx0LnB1c2gocGFnZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgcXVlc3Rpb25zIGluIHRoZSBzdXJ2ZXlcbiAgICAgKiBAcGFyYW0gdmlzaWJsZU9ubHkgc2V0IGl0IHRydWUsIGlmIHlvdSB3YW50IHRvIGdldCBvbmx5IHZpc2libGUgcXVlc3Rpb25zXG4gICAgICovXG4gICAgcHVibGljIGdldEFsbFF1ZXN0aW9ucyh2aXNpYmxlT25seTogYm9vbGVhbiA9IGZhbHNlLCBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuID0gZmFsc2UpOiBBcnJheTxJUXVlc3Rpb24+IHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxJUXVlc3Rpb24+KCk7XG4gICAgICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VzW2ldLmFkZFF1ZXN0aW9uc1RvTGlzdChyZXN1bHQsIHZpc2libGVPbmx5LCBpbmNsdWRpbmdEZXNpZ25UaW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBwYW5lbHMgaW4gdGhlIHN1cnZleVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRBbGxQYW5lbHModmlzaWJsZU9ubHk6IGJvb2xlYW4gPSBmYWxzZSwgaW5jbHVkaW5nRGVzaWduVGltZTogYm9vbGVhbiA9IGZhbHNlKTogQXJyYXk8SVBhbmVsPiB7XG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8SVBhbmVsPigpO1xuICAgICAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5wYWdlc1tpXS5hZGRQYW5lbHNJbnRvTGlzdChyZXN1bHQsIHZpc2libGVPbmx5LCBpbmNsdWRpbmdEZXNpZ25UaW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgY3JlYXRlTmV3UGFnZShuYW1lOiBzdHJpbmcpIHsgcmV0dXJuIG5ldyBQYWdlTW9kZWwobmFtZSk7IH1cbiAgICBwcm90ZWN0ZWQgbm90aWZ5UXVlc3Rpb25PblZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICAgICAgdmFyIHF1ZXN0aW9uID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHF1ZXN0aW9uc1tpXS5uYW1lICE9IG5hbWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcXVlc3Rpb24gPSBxdWVzdGlvbnNbaV07XG4gICAgICAgICAgICB0aGlzLmRvU3VydmV5VmFsdWVDaGFuZ2VkKHF1ZXN0aW9uLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkLmZpcmUodGhpcywgeyAnbmFtZSc6IG5hbWUsICdxdWVzdGlvbic6IHF1ZXN0aW9uLCAndmFsdWUnOiBuZXdWYWx1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZighcXVlc3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQuZmlyZSh0aGlzLCB7ICduYW1lJzogbmFtZSwgJ3F1ZXN0aW9uJzogbnVsbCwgJ3ZhbHVlJzogbmV3VmFsdWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3RpZnlFbGVtZW50c09uQW55VmFsdWVPclZhcmlhYmxlQ2hhbmdlZChuYW1lKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBub3RpZnlFbGVtZW50c09uQW55VmFsdWVPclZhcmlhYmxlQ2hhbmdlZChuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VzW2ldLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpXG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBub3RpZnlBbGxRdWVzdGlvbnNPblZhbHVlQ2hhbmdlZCgpIHtcbiAgICAgICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0QWxsUXVlc3Rpb25zKCk7XG4gICAgICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuZG9TdXJ2ZXlWYWx1ZUNoYW5nZWQocXVlc3Rpb25zW2ldLCB0aGlzLmdldFZhbHVlKHF1ZXN0aW9uc1tpXS5uYW1lKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIGRvU3VydmV5VmFsdWVDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICAgICAgcXVlc3Rpb24ub25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWUpO1xuICAgIH1cbiAgICBwcml2YXRlIGNoZWNrT25QYWdlVHJpZ2dlcnMoKSB7XG4gICAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEN1cnJlbnRQYWdlUXVlc3Rpb25zKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcXVlc3Rpb24gPSBxdWVzdGlvbnNbaV07XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKHF1ZXN0aW9uLm5hbWUpO1xuICAgICAgICAgICAgdGhpcy5jaGVja1RyaWdnZXJzKHF1ZXN0aW9uLm5hbWUsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGdldEN1cnJlbnRQYWdlUXVlc3Rpb25zKCk6IEFycmF5PFF1ZXN0aW9uQmFzZT4ge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIHZhciBwYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICAgICAgaWYgKCFwYWdlKSByZXR1cm4gcmVzdWx0O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2UucXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcXVlc3Rpb24gPSBwYWdlLnF1ZXN0aW9uc1tpXTtcbiAgICAgICAgICAgIGlmICghcXVlc3Rpb24udmlzaWJsZSB8fCAhcXVlc3Rpb24ubmFtZSkgY29udGludWU7XG4gICAgICAgICAgICByZXN1bHQucHVzaChxdWVzdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBjaGVja1RyaWdnZXJzKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSwgaXNPbk5leHRQYWdlOiBib29sZWFuKSB7XG4gICAgICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnRyaWdnZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdHJpZ2dlciA9IHRoaXMudHJpZ2dlcnNbaV07XG4gICAgICAgICAgICBpZiAodHJpZ2dlci5uYW1lID09IG5hbWUgJiYgdHJpZ2dlci5pc09uTmV4dFBhZ2UgPT0gaXNPbk5leHRQYWdlKSB7XG4gICAgICAgICAgICAgICAgdHJpZ2dlci5jaGVjayhuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBkb0VsZW1lbnRzT25Mb2FkKCkge1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIHRoaXMucGFnZXNbaV0ub25TdXJ2ZXlMb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBydW5Db25kaXRpb25zKCkge1xuICAgICAgICB2YXIgcGFnZXMgPSB0aGlzLnBhZ2VzO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICBwYWdlc1tpXS5ydW5Db25kaXRpb24odGhpcy52YWx1ZXNIYXNoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSBzdXJ2ZXkgcmVzdWx0IGludG8gW2R4c3VydmV5LmNvbV0oaHR0cDovL3d3dy5keHN1cnZleS5jb20pIHNlcnZpY2UuXG4gICAgICogQHBhcmFtIHBvc3RJZCBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZSBwb3N0SWRcbiAgICAgKiBAcGFyYW0gY2xpZW50SWQgVHlwaWNhbGx5IGEgY3VzdG9tZXIgZS1tYWlsIG9yIGFuIGlkZW50aWZpY2F0b3JcbiAgICAgKiBAcGFyYW0gaXNQYXJ0aWFsQ29tcGxldGVkIFNldCBpdCB0byB0cnVlIGlmIHRoZSBzdXJ2ZXkgaXMgbm90IGNvbXBsZXRlZCB5ZXQgYW5kIGl0IGlzIGFuIGludGVybWVkaWF0ZSByZXN1bHRzXG4gICAgICogQHNlZSBzdXJ2ZXlQb3N0SWRcbiAgICAgKiBAc2VlIGNsaWVudElkXG4gICAgICovXG4gICAgcHVibGljIHNlbmRSZXN1bHQocG9zdElkOiBzdHJpbmcgPSBudWxsLCBjbGllbnRJZDogc3RyaW5nID0gbnVsbCwgaXNQYXJ0aWFsQ29tcGxldGVkOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRWRpdE1vZGUpIHJldHVybjtcbiAgICAgICAgaWYgKGlzUGFydGlhbENvbXBsZXRlZCAmJiB0aGlzLm9uUGFydGlhbFNlbmQpIHtcbiAgICAgICAgICAgIHRoaXMub25QYXJ0aWFsU2VuZC5maXJlKHRoaXMsIG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwb3N0SWQgJiYgdGhpcy5zdXJ2ZXlQb3N0SWQpIHtcbiAgICAgICAgICAgIHBvc3RJZCA9IHRoaXMuc3VydmV5UG9zdElkO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcG9zdElkKSByZXR1cm47XG4gICAgICAgIGlmIChjbGllbnRJZCkge1xuICAgICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1BhcnRpYWxDb21wbGV0ZWQgJiYgIXRoaXMuY2xpZW50SWQpIHJldHVybjtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBpZih0aGlzLnN1cnZleVNob3dEYXRhU2F2aW5nKSB7XG4gICAgICAgICAgICB0aGlzLnNldENvbXBsZXRlZFN0YXRlKFwic2F2aW5nXCIsIFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3JlYXRlU3VydmV5U2VydmljZSgpLnNlbmRSZXN1bHQocG9zdElkLCB0aGlzLmRhdGEsIGZ1bmN0aW9uIChzdWNjZXNzOiBib29sZWFuLCByZXNwb25zZTogYW55KSB7XG4gICAgICAgICAgICBpZihzZWxmLnN1cnZleVNob3dEYXRhU2F2aW5nKSB7XG4gICAgICAgICAgICAgICAgaWYoc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnNldENvbXBsZXRlZFN0YXRlKFwic3VjY2Vzc1wiLCBcIlwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnNldENvbXBsZXRlZFN0YXRlKFwiZXJyb3JcIiwgXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZi5vblNlbmRSZXN1bHQuZmlyZShzZWxmLCB7IHN1Y2Nlc3M6IHN1Y2Nlc3MsIHJlc3BvbnNlOiByZXNwb25zZX0pO1xuICAgICAgICB9LCB0aGlzLmNsaWVudElkLCBpc1BhcnRpYWxDb21wbGV0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJdCBjYWxscyB0aGUgW2R4c3VydmV5LmNvbV0oaHR0cDovL3d3dy5keHN1cnZleS5jb20pIHNlcnZpY2UgYW5kIG9uIGNhbGxiYWNrIGZpcmVzIG9uR2V0UmVzdWx0IGV2ZW50IHdpdGggYWxsIGFuc3dlcnMgdGhhdCB5b3VyIHVzZXJzIG1hZGUgZm9yIGEgcXVlc3Rpb24uXG4gICAgICogQHBhcmFtIHJlc3VsdElkIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlIHJlc3VsdElkXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIHF1ZXN0aW9uIG5hbWVcbiAgICAgKiBAc2VlIG9uR2V0UmVzdWx0XG4gICAgICovXG4gICAgcHVibGljIGdldFJlc3VsdChyZXN1bHRJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLmNyZWF0ZVN1cnZleVNlcnZpY2UoKS5nZXRSZXN1bHQocmVzdWx0SWQsIG5hbWUsIGZ1bmN0aW9uIChzdWNjZXNzOiBib29sZWFuLCBkYXRhOiBhbnksIGRhdGFMaXN0OiBhbnlbXSwgcmVzcG9uc2U6IGFueSkge1xuICAgICAgICAgICAgc2VsZi5vbkdldFJlc3VsdC5maXJlKHNlbGYsIHsgc3VjY2Vzczogc3VjY2VzcywgZGF0YTogZGF0YSwgZGF0YUxpc3Q6IGRhdGFMaXN0LCByZXNwb25zZTogcmVzcG9uc2UgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgc3VydmV5IEpzb24gZnJvbSB0aGUgW2R4c3VydmV5LmNvbV0oaHR0cDovL3d3dy5keHN1cnZleS5jb20pIHNlcnZpY2UuIElmIGNsaWVudElkIGlzIG5vdCBudWxsIGFuZCB1c2VyIGhhcyBhbHJlYWR5IGNvbXBsZXRlZCB0aGUgc3VydmV5LCB0aGUgc3VydmV5IHdpbGwgZ28gaW50byBcImNvbXBsZXRlZGJlZm9yZVwiIHN0YXRlLlxuICAgICAqIEBwYXJhbSBzdXJ2ZXlJZCBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZSBzdXJ2ZXlJZFxuICAgICAqIEBwYXJhbSBjbGllbnRJZCBpbmRlbnRpZmljYXRvciBmb3IgYSB1c2VyLCBmb3IgZXhhbXBsZSBlLW1haWwgb3IgdW5pcXVlIGN1c3RvbWVyIGlkIGluIHlvdXIgd2ViIGFwcGxpY2F0aW9uLiBcbiAgICAgKiBAc2VlIHN0YXRlXG4gICAgICovXG4gICAgcHVibGljIGxvYWRTdXJ2ZXlGcm9tU2VydmljZShzdXJ2ZXlJZDogc3RyaW5nID0gbnVsbCwgY2xpZW5kSWQ6IHN0cmluZyA9IG51bGwpIHtcbiAgICAgICAgaWYgKHN1cnZleUlkKSB7XG4gICAgICAgICAgICB0aGlzLnN1cnZleUlkID0gc3VydmV5SWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYoY2xpZW5kSWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbmRJZDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vbkxvYWRpbmdTdXJ2ZXlGcm9tU2VydmljZSgpO1xuICAgICAgICBpZihjbGllbmRJZCkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVTdXJ2ZXlTZXJ2aWNlKCkuZ2V0U3VydmV5SnNvbkFuZElzQ29tcGxldGVkKHRoaXMuc3VydmV5SWQsIHRoaXMuY2xpZW50SWQsIGZ1bmN0aW9uIChzdWNjZXNzOiBib29sZWFuLCBqc29uOiBzdHJpbmcsIGlzQ29tcGxldGVkOiBzdHJpbmcsIHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuaXNDb21wbGV0ZWRCZWZvcmUgPSBpc0NvbXBsZXRlZCA9PSBcImNvbXBsZXRlZFwiO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRTdXJ2ZXlGcm9tU2VydmljZUpzb24oanNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVN1cnZleVNlcnZpY2UoKS5sb2FkU3VydmV5KHRoaXMuc3VydmV5SWQsIGZ1bmN0aW9uIChzdWNjZXNzOiBib29sZWFuLCByZXN1bHQ6IHN0cmluZywgcmVzcG9uc2U6IGFueSkge1xuICAgICAgICAgICAgICAgIHNlbGYuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkU3VydmV5RnJvbVNlcnZpY2VKc29uKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBsb2FkU3VydmV5RnJvbVNlcnZpY2VKc29uKGpzb246IGFueSkge1xuICAgICAgICBpZighanNvbikgcmV0dXJuO1xuICAgICAgICB0aGlzLnNldEpzb25PYmplY3QoanNvbik7XG4gICAgICAgIHRoaXMubm90aWZ5QWxsUXVlc3Rpb25zT25WYWx1ZUNoYW5nZWQoKTtcbiAgICAgICAgdGhpcy5vbkxvYWRTdXJ2ZXlGcm9tU2VydmljZSgpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgb25Mb2FkaW5nU3VydmV5RnJvbVNlcnZpY2UoKSB7XG4gICAgfVxuICAgIHByb3RlY3RlZCBvbkxvYWRTdXJ2ZXlGcm9tU2VydmljZSgpIHtcbiAgICB9XG4gICAgcHJpdmF0ZSBjaGVja1BhZ2VWaXNpYmlsaXR5KHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9sZFF1ZXN0aW9uVmlzaWJsZTogYm9vbGVhbikge1xuICAgICAgICB2YXIgcGFnZSA9IHRoaXMuZ2V0UGFnZUJ5UXVlc3Rpb24ocXVlc3Rpb24pO1xuICAgICAgICBpZiAoIXBhZ2UpIHJldHVybjtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gcGFnZS5pc1Zpc2libGU7XG4gICAgICAgIGlmIChuZXdWYWx1ZSAhPSBwYWdlLmdldElzUGFnZVZpc2libGUocXVlc3Rpb24pIHx8IG9sZFF1ZXN0aW9uVmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5wYWdlVmlzaWJpbGl0eUNoYW5nZWQocGFnZSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgdXBkYXRlVmlzaWJsZUluZGV4ZXMoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUGFnZVZpc2libGVJbmRleGVzKHRoaXMuc2hvd1BhZ2VOdW1iZXJzKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyA9PSBcIm9uUGFnZVwiKSB7XG4gICAgICAgICAgICB2YXIgdmlzUGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlzUGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVF1ZXN0aW9uVmlzaWJsZUluZGV4ZXModmlzUGFnZXNbaV0ucXVlc3Rpb25zLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUXVlc3Rpb25WaXNpYmxlSW5kZXhlcyh0aGlzLmdldEFsbFF1ZXN0aW9ucyhmYWxzZSksIHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyA9PSBcIm9uXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgdXBkYXRlUGFnZVZpc2libGVJbmRleGVzKHNob3dJbmRleDogYm9vbGVhbikge1xuICAgICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMucGFnZXNbaV0udmlzaWJsZUluZGV4ID0gdGhpcy5wYWdlc1tpXS52aXNpYmxlID8gKGluZGV4KyspIDogLTE7XG4gICAgICAgICAgICB0aGlzLnBhZ2VzW2ldLm51bSA9IHNob3dJbmRleCAmJiB0aGlzLnBhZ2VzW2ldLnZpc2libGUgPyB0aGlzLnBhZ2VzW2ldLnZpc2libGVJbmRleCArIDEgOiAtMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIHVwZGF0ZVF1ZXN0aW9uVmlzaWJsZUluZGV4ZXMocXVlc3Rpb25zOiBJUXVlc3Rpb25bXSwgc2hvd0luZGV4OiBib29sZWFuKSB7XG4gICAgICAgIFN1cnZleUVsZW1lbnQuc2V0VmlzaWJsZUluZGV4KHF1ZXN0aW9ucywgMCwgc2hvd0luZGV4KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzZXRKc29uT2JqZWN0KGpzb25PYmo6IGFueSkge1xuICAgICAgICBpZiAoIWpzb25PYmopIHJldHVybjtcbiAgICAgICAgdGhpcy5qc29uRXJyb3JzID0gbnVsbDtcbiAgICAgICAgdmFyIGpzb25Db252ZXJ0ZXIgPSBuZXcgSnNvbk9iamVjdCgpO1xuICAgICAgICBqc29uQ29udmVydGVyLnRvT2JqZWN0KGpzb25PYmosIHRoaXMpO1xuICAgICAgICBpZiAoanNvbkNvbnZlcnRlci5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5qc29uRXJyb3JzID0ganNvbkNvbnZlcnRlci5lcnJvcnM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZW5kTG9hZGluZ0Zyb21Kc29uKCkge1xuICAgICAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgICAgICB0aGlzLnVwZGF0ZVByb2Nlc3NlZFRleHRWYWx1ZXMoKTtcbiAgICAgICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc0Nvb2tpZSkge1xuICAgICAgICAgICAgdGhpcy5kb0NvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb0VsZW1lbnRzT25Mb2FkKCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBvbkJlZm9yZUNyZWF0aW5nKCkgeyB9XG4gICAgcHJvdGVjdGVkIG9uQ3JlYXRpbmcoKSB7IH1cbiAgICBwcml2YXRlIHVwZGF0ZVByb2Nlc3NlZFRleHRWYWx1ZXMoKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkVGV4dFZhbHVlcyA9IHt9O1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkVGV4dFZhbHVlc1tcInBhZ2Vub1wiXSA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBzZWxmLmN1cnJlbnRQYWdlICE9IG51bGwgPyBzZWxmLnZpc2libGVQYWdlcy5pbmRleE9mKHNlbGYuY3VycmVudFBhZ2UpICsgMSA6IDA7IH1cbiAgICAgICAgdGhpcy5wcm9jZXNzZWRUZXh0VmFsdWVzW1wicGFnZWNvdW50XCJdID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIHNlbGYudmlzaWJsZVBhZ2VDb3VudDsgfVxuICAgICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuYWRkUXVlc3Rpb25Ub1Byb2Nlc3NlZFRleHRWYWx1ZXMocXVlc3Rpb25zW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGFkZFF1ZXN0aW9uVG9Qcm9jZXNzZWRUZXh0VmFsdWVzKHF1ZXN0aW9uOiBJUXVlc3Rpb24pIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzZWRUZXh0VmFsdWVzW3F1ZXN0aW9uLm5hbWUudG9Mb3dlckNhc2UoKV0gPSBcInF1ZXN0aW9uXCI7XG4gICAgfVxuICAgIHByaXZhdGUgaGFzUHJvY2Vzc2VkVGV4dFZhbHVlKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICB2YXIgZmlyc3ROYW1lID0gbmV3IFByb2Nlc3NWYWx1ZSgpLmdldEZpcnN0TmFtZShuYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc2VkVGV4dFZhbHVlc1tmaXJzdE5hbWUudG9Mb3dlckNhc2UoKV07XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlKG5hbWU6IHN0cmluZywgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuKTogYW55IHtcbiAgICAgICAgdmFyIGZpcnN0TmFtZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRGaXJzdE5hbWUobmFtZSk7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLnByb2Nlc3NlZFRleHRWYWx1ZXNbZmlyc3ROYW1lLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICBpZiAoIXZhbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICh2YWwgPT0gXCJ2YXJpYWJsZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRWYXJpYWJsZShuYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWwgPT0gXCJxdWVzdGlvblwiKSB7XG4gICAgICAgICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlOYW1lKGZpcnN0TmFtZSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoIXF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIG5hbWUgPSBxdWVzdGlvbi5uYW1lICsgbmFtZS5zdWJzdHIoZmlyc3ROYW1lLmxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgdmFsdWVzID0ge307XG4gICAgICAgICAgICB2YWx1ZXNbZmlyc3ROYW1lXSA9IHJldHVybkRpc3BsYXlWYWx1ZSA/IHF1ZXN0aW9uLmRpc3BsYXlWYWx1ZSA6IHRoaXMuZ2V0VmFsdWUoZmlyc3ROYW1lKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvY2Vzc1ZhbHVlKCkuZ2V0VmFsdWUobmFtZSwgdmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsID09IFwidmFsdWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRWYWx1ZShuYW1lLCB0aGlzLnZhbHVlc0hhc2gpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWwobmFtZSk7XG4gICAgfVxuICAgIHByaXZhdGUgY2xlYXJVbnVzZWRWYWx1ZXMoKSB7XG4gICAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucygpO1xuICAgICAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBxdWVzdGlvbnNbaV0uY2xlYXJVbnVzZWRWYWx1ZXMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jbGVhckludmlzaWJsZVZhbHVlcyA9PSBcIm9uQ29tcGxldGVcIikge1xuICAgICAgICAgICAgdGhpcy5jbGVhckludmlzaWJsZVF1ZXN0aW9uVmFsdWVzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBjbGVhckludmlzaWJsZVF1ZXN0aW9uVmFsdWVzKCkge1xuICAgICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICAgICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHF1ZXN0aW9uc1tpXS52aXNpYmxlKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJWYWx1ZShxdWVzdGlvbnNbaV0ubmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHZhcmlhYmxlIHZhbHVlLiBWYXJpYWJsZSwgdW5saWtlIHZhbHVlcywgYXJlIG5vdCBzdG9yZWQgaW4gdGhlIHN1cnZleSByZXN1bHRzLlxuICAgICAqIEBwYXJhbSBuYW1lIEEgdmFyaWFibGUgbmFtZVxuICAgICAqIEBzZWUgU2V0VmFyaWFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VmFyaWFibGUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFyaWFibGVzSGFzaFtuYW1lXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhcmlhYmxlIHZhbHVlLiBWYXJpYWJsZSwgdW5saWtlIHZhbHVlcywgYXJlIG5vdCBzdG9yZWQgaW4gdGhlIHN1cnZleSByZXN1bHRzLlxuICAgICAqIEBwYXJhbSBuYW1lIEEgdmFyaWFibGUgbmFtZVxuICAgICAqIEBwYXJhbSBuZXdWYWx1ZSBcbiAgICAgKiBAc2VlIEdldFZhcmlhYmxlXG4gICAgICovXG4gICAgcHVibGljIHNldFZhcmlhYmxlKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge1xuICAgICAgICBpZiAoIW5hbWUpIHJldHVybjtcbiAgICAgICAgdGhpcy52YXJpYWJsZXNIYXNoW25hbWVdID0gbmV3VmFsdWU7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkVGV4dFZhbHVlc1tuYW1lLnRvTG93ZXJDYXNlKCldID0gXCJ2YXJpYWJsZVwiO1xuICAgICAgICB0aGlzLm5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkKG5hbWUpO1xuICAgIH1cbiAgICAvL0lTdXJ2ZXkgZGF0YVxuICAgIHByb3RlY3RlZCBnZXRVbmJpbmRWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgICAgICAvL2RvIG5vdCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0IGluc3RhbmNlISEhXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHF1ZXN0aW9uIHZhbHVlXG4gICAgICogQHBhcmFtIG5hbWUgQSBxdWVzdGlvbiBuYW1lXG4gICAgICogQHNlZSBkYXRhXG4gICAgICogQHNlZSBzZXRWYWx1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1ZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgICAgICBpZiAoIW5hbWUgfHwgbmFtZS5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWVzSGFzaFtuYW1lXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VW5iaW5kVmFsdWUodmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgcXVlc3Rpb24gdmFsdWUuIEl0IHJ1bnMgYWxsIHRyaWdnZXJzIGFuZCBjb25kaXRpb25zICh2aXNpYmxlSWYgcHJvcGVydGllcykuIEdvZXMgdG8gdGhlIG5leHQgcGFnZSBpZiBnb05leHRQYWdlQXV0b21hdGljIGlzIHRydWUgYW5kIGFsbCBxdWVzdGlvbnMgb24gdGhlIGN1cnJlbnQgcGFnZSBhcmUgYW5zd2VyZWQgY29ycmVjdGx5LlxuICAgICAqIEBwYXJhbSBuYW1lIEEgcXVlc3Rpb24gbmFtZVxuICAgICAqIEBwYXJhbSBuZXdWYWx1ZVxuICAgICAqIEBzZWUgZGF0YVxuICAgICAqIEBzZWUgZ2V0VmFsdWVcbiAgICAgKiBAc2VlIFBhZ2VNb2RlbC52aXNpYmxlSWZcbiAgICAgKiBAc2VlIFF1ZXN0aW9uQmFzZS52aXNpYmxlSWZcbiAgICAgKiBAc2VlIGdvTmV4dFBhZ2VBdXRvbWF0aWNcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0VmFsdWUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLmlzVmFsdWVFcXVhbChuYW1lLCBuZXdWYWx1ZSkpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KG5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMudmFsdWVzSGFzaFtuYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gdGhpcy5nZXRVbmJpbmRWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnNldERhdGFWYWx1ZUNvcmUodGhpcy52YWx1ZXNIYXNoLCBuYW1lLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICB2YXIgcHJvY2Vzc2VkVmFyID0gdGhpcy5wcm9jZXNzZWRUZXh0VmFsdWVzW25hbWUudG9Mb3dlckNhc2UoKV07XG4gICAgICAgICAgICBpZighcHJvY2Vzc2VkVmFyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWRUZXh0VmFsdWVzW25hbWUudG9Mb3dlckNhc2UoKV0gPSBcInZhbHVlXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3RpZnlRdWVzdGlvbk9uVmFsdWVDaGFuZ2VkKG5hbWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgdGhpcy5jaGVja1RyaWdnZXJzKG5hbWUsIG5ld1ZhbHVlLCBmYWxzZSk7XG4gICAgICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xuICAgICAgICB0aGlzLnRyeUdvTmV4dFBhZ2VBdXRvbWF0aWMobmFtZSk7XG4gICAgfVxuICAgIHByaXZhdGUgaXNWYWx1ZUVxdWFsKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAobmV3VmFsdWUgPT0gXCJcIikgbmV3VmFsdWUgPSBudWxsO1xuICAgICAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKG5hbWUpO1xuICAgICAgICBpZiAobmV3VmFsdWUgPT09IG51bGwgfHwgb2xkVmFsdWUgPT09IG51bGwpIHJldHVybiBuZXdWYWx1ZSA9PT0gb2xkVmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVHdvVmFsdWVFcXVhbHMobmV3VmFsdWUsIG9sZFZhbHVlKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGRvT25QYWdlQWRkZWQocGFnZTogUGFnZU1vZGVsKSB7XG4gICAgICAgIHBhZ2Uuc2V0U3VydmV5SW1wbCh0aGlzKTtcbiAgICAgICAgaWYoIXBhZ2UubmFtZSkgcGFnZS5uYW1lID0gdGhpcy5nZW5lcmF0ZU5ld05hbWUodGhpcy5wYWdlcywgXCJwYWdlXCIpO1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtwYWdlOiBwYWdlfTtcbiAgICAgICAgdGhpcy5vblBhZ2VBZGRlZC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBwcml2YXRlIGdlbmVyYXRlTmV3TmFtZShlbGVtZW50czogQXJyYXk8YW55PiwgYmFzZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHZhciBrZXlzID0ge307XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkgKyspIGtleXNbZWxlbWVudHNbaV1bXCJuYW1lXCJdXSA9IHRydWU7XG4gICAgICAgIHZhciBpbmRleCA9IDE7XG4gICAgICAgIHdoaWxlKGtleXNbYmFzZU5hbWUgKyBpbmRleF0pIGluZGV4ICsrO1xuICAgICAgICByZXR1cm4gYmFzZU5hbWUgKyBpbmRleDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHRyeUdvTmV4dFBhZ2VBdXRvbWF0aWMobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy5nb05leHRQYWdlQXV0b21hdGljIHx8ICF0aGlzLmN1cnJlbnRQYWdlKSByZXR1cm47XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZSk7XG4gICAgICAgIGlmIChxdWVzdGlvbiAmJiAoIXF1ZXN0aW9uLnZpc2libGUgfHwgIXF1ZXN0aW9uLnN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkpKSByZXR1cm47XG4gICAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEN1cnJlbnRQYWdlUXVlc3Rpb25zKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKHF1ZXN0aW9uc1tpXS5uYW1lKVxuICAgICAgICAgICAgaWYgKHF1ZXN0aW9uc1tpXS5oYXNJbnB1dCAmJiB0aGlzLmlzVmFsdWVFbXB0eSh2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY3VycmVudFBhZ2UuaGFzRXJyb3JzKHRydWUsIGZhbHNlKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGFzdFBhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRQYWdlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVMYXN0UGFnZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvbW1lbnQgdmFsdWVcbiAgICAgKiBAcGFyYW0gbmFtZSBcbiAgICAgKiBAc2VlIHNldENvbW1lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29tbWVudChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhW25hbWUgKyB0aGlzLmNvbW1lbnRQcmVmaXhdO1xuICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY29tbWVudCB2YWx1ZVxuICAgICAqIEBwYXJhbSBuYW1lIFxuICAgICAqIEBwYXJhbSBuZXdWYWx1ZVxuICAgICAqIEBzZWUgZ2V0Q29tbWVudCBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Q29tbWVudChuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdmFyIGNvbW1lbnROYW1lID0gbmFtZSArIHRoaXMuY29tbWVudFByZWZpeDtcbiAgICAgICAgaWYgKG5ld1ZhbHVlID09PSBcIlwiIHx8IG5ld1ZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZXNIYXNoW2NvbW1lbnROYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIGNvbW1lbnROYW1lLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnRyeUdvTmV4dFBhZ2VBdXRvbWF0aWMobmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgICAgICAgaWYocXVlc3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQuZmlyZSh0aGlzLCB7ICduYW1lJzogY29tbWVudE5hbWUsICdxdWVzdGlvbic6IHF1ZXN0aW9uLCAndmFsdWUnOiBuZXdWYWx1ZSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIHZhbHVlIGZyb20gdGhlIHN1cnZleSByZXN1bHQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbHVlLiBUeXBpY2FsbHkgaXQgaXMgYSBxdWVzdGlvbiBuYW1lXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyVmFsdWUobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2V0VmFsdWUobmFtZSwgbnVsbCk7XG4gICAgICAgIHRoaXMuc2V0Q29tbWVudChuYW1lLCBudWxsKTtcbiAgICB9XG4gICAgcXVlc3Rpb25WaXNpYmlsaXR5Q2hhbmdlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCBuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgICAgIHRoaXMub25WaXNpYmxlQ2hhbmdlZC5maXJlKHRoaXMsIHsgJ3F1ZXN0aW9uJzogcXVlc3Rpb24sICduYW1lJzogcXVlc3Rpb24ubmFtZSwgJ3Zpc2libGUnOiBuZXdWYWx1ZSB9KTtcbiAgICAgICAgdGhpcy5jaGVja1BhZ2VWaXNpYmlsaXR5KHF1ZXN0aW9uLCAhbmV3VmFsdWUpO1xuICAgICAgICBpZihxdWVzdGlvbiAmJiAhcXVlc3Rpb24udmlzaWJsZSAmJiB0aGlzLmNsZWFySW52aXNpYmxlVmFsdWVzID09IFwib25IaWRkZW5cIikge1xuICAgICAgICAgICAgdGhpcy5jbGVhclZhbHVlKHF1ZXN0aW9uLm5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHBhZ2VWaXNpYmlsaXR5Q2hhbmdlZChwYWdlOiBJUGFnZSwgbmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgICAgICB0aGlzLm9uUGFnZVZpc2libGVDaGFuZ2VkLmZpcmUodGhpcywgeyAncGFnZSc6IHBhZ2UsICd2aXNpYmxlJzogbmV3VmFsdWUgfSk7XG4gICAgfVxuICAgIHBhbmVsVmlzaWJpbGl0eUNoYW5nZWQocGFuZWw6IElQYW5lbCwgbmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgICAgICB0aGlzLm9uUGFuZWxWaXNpYmxlQ2hhbmdlZC5maXJlKHRoaXMsIHsgJ3BhbmVsJzogcGFuZWwsICd2aXNpYmxlJzogbmV3VmFsdWUgfSk7XG4gICAgfVxuICAgIHF1ZXN0aW9uQWRkZWQocXVlc3Rpb246IElRdWVzdGlvbiwgaW5kZXg6IG51bWJlciwgcGFyZW50UGFuZWw6IGFueSwgcm9vdFBhbmVsOiBhbnkpIHtcbiAgICAgICAgaWYoIXF1ZXN0aW9uLm5hbWUpIHF1ZXN0aW9uLm5hbWUgPSB0aGlzLmdlbmVyYXRlTmV3TmFtZSh0aGlzLmdldEFsbFF1ZXN0aW9ucyhmYWxzZSwgdHJ1ZSksIFwicXVlc3Rpb25cIik7XG4gICAgICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICAgICAgdGhpcy5hZGRRdWVzdGlvblRvUHJvY2Vzc2VkVGV4dFZhbHVlcyhxdWVzdGlvbik7XG4gICAgICAgIHRoaXMub25RdWVzdGlvbkFkZGVkLmZpcmUodGhpcywgeyAncXVlc3Rpb24nOiBxdWVzdGlvbiwgJ25hbWUnOiBxdWVzdGlvbi5uYW1lLCAnaW5kZXgnOiBpbmRleCwgJ3BhcmVudFBhbmVsJzogcGFyZW50UGFuZWwsICdyb290UGFuZWwnOiByb290UGFuZWwgfSk7XG4gICAgfVxuICAgIHF1ZXN0aW9uUmVtb3ZlZChxdWVzdGlvbjogSVF1ZXN0aW9uKSB7XG4gICAgICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICAgICAgdGhpcy5vblF1ZXN0aW9uUmVtb3ZlZC5maXJlKHRoaXMsIHsgJ3F1ZXN0aW9uJzogcXVlc3Rpb24sICduYW1lJzogcXVlc3Rpb24ubmFtZSB9KTtcbiAgICB9XG4gICAgcGFuZWxBZGRlZChwYW5lbDogSUVsZW1lbnQsIGluZGV4OiBudW1iZXIsIHBhcmVudFBhbmVsOiBhbnksIHJvb3RQYW5lbDogYW55KSB7XG4gICAgICAgIGlmKCFwYW5lbC5uYW1lKSBwYW5lbC5uYW1lID0gdGhpcy5nZW5lcmF0ZU5ld05hbWUodGhpcy5nZXRBbGxQYW5lbHMoZmFsc2UsIHRydWUpLCBcInBhbmVsXCIpO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgICAgIHRoaXMub25QYW5lbEFkZGVkLmZpcmUodGhpcywgeyAncGFuZWwnOiBwYW5lbCwgJ25hbWUnOiBwYW5lbC5uYW1lLCAnaW5kZXgnOiBpbmRleCwgJ3BhcmVudFBhbmVsJzogcGFyZW50UGFuZWwsICdyb290UGFuZWwnOiByb290UGFuZWwgfSk7XG4gICAgfVxuICAgIHBhbmVsUmVtb3ZlZChwYW5lbDogSUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgICAgICB0aGlzLm9uUGFuZWxSZW1vdmVkLmZpcmUodGhpcywgeyAncGFuZWwnOiBwYW5lbCwgJ25hbWUnOiBwYW5lbC5uYW1lIH0pO1xuICAgIH1cbiAgICB2YWxpZGF0ZVF1ZXN0aW9uKG5hbWU6IHN0cmluZyk6IFN1cnZleUVycm9yIHtcbiAgICAgICAgaWYgKHRoaXMub25WYWxpZGF0ZVF1ZXN0aW9uLmlzRW1wdHkpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHsgbmFtZTogbmFtZSwgdmFsdWU6IHRoaXMuZ2V0VmFsdWUobmFtZSksIGVycm9yOiBudWxsIH07XG4gICAgICAgIHRoaXMub25WYWxpZGF0ZVF1ZXN0aW9uLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmVycm9yID8gbmV3IEN1c3RvbUVycm9yKG9wdGlvbnMuZXJyb3IpIDogbnVsbDtcbiAgICB9XG4gICAgcHJvY2Vzc0h0bWwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7IGh0bWw6IGh0bWwgfTtcbiAgICAgICAgdGhpcy5vblByb2Nlc3NIdG1sLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NUZXh0KG9wdGlvbnMuaHRtbCwgdHJ1ZSk7XG4gICAgfVxuICAgIHByb2Nlc3NUZXh0KHRleHQ6IHN0cmluZywgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dFByZVByb2Nlc3Nvci5wcm9jZXNzKHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSk7XG4gICAgfVxuICAgIHByb2Nlc3NUZXh0RXgodGV4dDogc3RyaW5nKTogYW55IHtcbiAgICAgICAgdmFyIHJlcyA9IHt0ZXh0IDogdGhpcy50ZXh0UHJlUHJvY2Vzc29yLnByb2Nlc3ModGV4dCksICBoYXNBbGxWYWx1ZXNPbkxhc3RSdW46IHRydWV9O1xuICAgICAgICByZXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuID0gdGhpcy50ZXh0UHJlUHJvY2Vzc29yLmhhc0FsbFZhbHVlc09uTGFzdFJ1bjtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IGl0IHRvICd0b3AnIG9yICdib3R0b20nIGlmIHlvdSB3YW50IHRvIHNob3cgdGhlIFBhbmVsIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgaG93IG11Y2ggdGltZSB0aGUgZW5kLXVzZXIgc3BlbnQgb2YgdGhlIHN1cnZleS9wYWdlLlxuICAgICAqIElmIHRoZSB2YWx1ZSBkb2Vzbid0IGVxdWFsICdub25lJyB0aGVuIHN1cnZleSBjYWxscyBzdGFydFRpbWVyKCkgbWV0aG9kIG9uIHN1cnZleSByZW5kZXJpbmcuXG4gICAgICogQHNlZSBzaG93VGltZXJQYW5lbE1vZGVcbiAgICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICAgKiBAc2VlIHN0b3BUaW1lclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2hvd1RpbWVyUGFuZWwoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dUaW1lclBhbmVsXCIsIFwibm9uZVwiKTsgfVxuICAgIHB1YmxpYyBzZXQgc2hvd1RpbWVyUGFuZWwodmFsOiBzdHJpbmcpIHsgXG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dUaW1lclBhbmVsXCIsIHZhbCk7IFxuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGlzVGltZXJQYW5lbFNob3dpbmdPblRvcCgpIHsgcmV0dXJuIHRoaXMuaXNUaW1lclN0YXJ0ZWQgJiYgdGhpcy5zaG93VGltZXJQYW5lbCA9PSBcInRvcFwiOyB9XG4gICAgcHVibGljIGdldCBpc1RpbWVyUGFuZWxTaG93aW5nT25Cb3R0b20oKSB7IHJldHVybiB0aGlzLmlzVGltZXJTdGFydGVkICYmIHRoaXMuc2hvd1RpbWVyUGFuZWwgPT0gXCJib3R0b21cIjsgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIHByb3BlcnR5IHRvICdwYWdlJyBvciAnc3VydmV5JyB0byBzaG93IHRoZSB0aW1lciBpbmZvcm1hdGlvbiBmb3IgcGFnZSBvciBzdXJ2ZXkgb25seS5cbiAgICAgKiBVc2Ugb25UaW1lclBhbmVsSW5mb1RleHQgZXZlbnQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHRleHQuXG4gICAgICogQHNlZSBzaG93VGltZXJQYW5lbFxuICAgICAqIEBzZWUgb25UaW1lclBhbmVsSW5mb1RleHRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dUaW1lclBhbmVsTW9kZSgpIDogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dUaW1lclBhbmVsTW9kZVwiLCBcImFsbFwiKTsgfVxuICAgIHB1YmxpYyBzZXQgc2hvd1RpbWVyUGFuZWxNb2RlKHZhbCA6IHN0cmluZykgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93VGltZXJQYW5lbE1vZGVcIiwgdmFsKTsgfVxuICAgIHB1YmxpYyBnZXQgdGltZXJJbmZvVGV4dCgpIDogc3RyaW5nIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7dGV4dDogdGhpcy5nZXRUaW1lckluZm9UZXh0KCl9O1xuICAgICAgICB0aGlzLm9uVGltZXJQYW5lbEluZm9UZXh0LmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnRleHQ7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0VGltZXJJbmZvVGV4dCgpIHtcbiAgICAgICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgICAgICBpZighcGFnZSkgcmV0dXJuIFwiXCI7XG4gICAgICAgIHZhciBwYWdlU3BlbnQgPSB0aGlzLmdldERpc3BsYXlUaW1lKHBhZ2UudGltZVNwZW50KTtcbiAgICAgICAgdmFyIHN1cnZleVNwZW50ID0gdGhpcy5nZXREaXNwbGF5VGltZSh0aGlzLnRpbWVTcGVudCk7XG4gICAgICAgIHZhciBwYWdlTGltaXRTZWMgPSB0aGlzLmdldFBhZ2VNYXhUaW1lVG9GaW5pc2gocGFnZSk7XG4gICAgICAgIHZhciBwYWdlTGltaXQgPSB0aGlzLmdldERpc3BsYXlUaW1lKHBhZ2VMaW1pdFNlYyk7XG4gICAgICAgIHZhciBzdXJ2ZXlMaW1pdCA9IHRoaXMuZ2V0RGlzcGxheVRpbWUodGhpcy5tYXhUaW1lVG9GaW5pc2gpO1xuICAgICAgICBpZih0aGlzLnNob3dUaW1lclBhbmVsTW9kZSA9PSBcInBhZ2VcIikgcmV0dXJuIHRoaXMuZ2V0VGltZXJJbmZvUGFnZVRleHQocGFnZSwgcGFnZVNwZW50LCBwYWdlTGltaXQpO1xuICAgICAgICBpZih0aGlzLnNob3dUaW1lclBhbmVsTW9kZSA9PSBcInN1cnZleVwiKSByZXR1cm4gdGhpcy5nZXRUaW1lckluZm9TdXJ2ZXlUZXh0KHN1cnZleVNwZW50LCBzdXJ2ZXlMaW1pdCk7XG4gICAgICAgIGlmKHRoaXMuc2hvd1RpbWVyUGFuZWxNb2RlID09IFwiYWxsXCIpIHtcbiAgICAgICAgICAgIGlmKHBhZ2VMaW1pdFNlYyA8PSAwICYmIHRoaXMubWF4VGltZVRvRmluaXNoIDw9IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lclNwZW50QWxsXCIpW1wiZm9ybWF0XCJdKHBhZ2VTcGVudCwgc3VydmV5U3BlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYocGFnZUxpbWl0U2VjID4gMCAmJiB0aGlzLm1heFRpbWVUb0ZpbmlzaCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lckxpbWl0QWxsXCIpW1wiZm9ybWF0XCJdKHBhZ2VTcGVudCwgcGFnZUxpbWl0LCBzdXJ2ZXlTcGVudCwgc3VydmV5TGltaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHBhZ2VUZXh0ID0gdGhpcy5nZXRUaW1lckluZm9QYWdlVGV4dChwYWdlLCBwYWdlU3BlbnQsIHBhZ2VMaW1pdCk7XG4gICAgICAgICAgICBsZXQgc3VydmV5VGV4dCA9IHRoaXMuZ2V0VGltZXJJbmZvU3VydmV5VGV4dChzdXJ2ZXlTcGVudCwgc3VydmV5TGltaXQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhZ2VUZXh0ICsgJyAnICsgc3VydmV5VGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRUaW1lckluZm9QYWdlVGV4dChwYWdlOiBQYWdlTW9kZWwsIHBhZ2VTcGVudDogc3RyaW5nLCBwYWdlTGltaXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhZ2VNYXhUaW1lVG9GaW5pc2gocGFnZSkgPiAwID8gdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lckxpbWl0UGFnZVwiKVtcImZvcm1hdFwiXShwYWdlU3BlbnQsIHBhZ2VMaW1pdCkgOiB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyU3BlbnRQYWdlXCIpW1wiZm9ybWF0XCJdKHBhZ2VTcGVudCwgcGFnZUxpbWl0KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRUaW1lckluZm9TdXJ2ZXlUZXh0KHN1cnZleVNwZW50OiBzdHJpbmcsIHN1cnZleUxpbWl0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhUaW1lVG9GaW5pc2ggPiAwID8gdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lckxpbWl0U3VydmV5XCIpW1wiZm9ybWF0XCJdKHN1cnZleVNwZW50LCBzdXJ2ZXlMaW1pdCkgOiB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyU3BlbnRTdXJ2ZXlcIilbXCJmb3JtYXRcIl0oc3VydmV5U3BlbnQsIHN1cnZleUxpbWl0KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXREaXNwbGF5VGltZSh2YWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHZhciBtaW4gPSBNYXRoLmZsb29yKHZhbCAvIDYwKTtcbiAgICAgICAgdmFyIHNlYyA9IHZhbCAlIDYwO1xuICAgICAgICB2YXIgcmVzID0gXCJcIjtcbiAgICAgICAgaWYobWluID4gMCkge1xuICAgICAgICAgICAgcmVzICs9IG1pbiArICcgJyArIHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJNaW5cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYocmVzICYmIHNlYyA9PSAwKSAgcmV0dXJuIHJlcztcbiAgICAgICAgaWYocmVzKSByZXMgKz0gJyAnO1xuICAgICAgICByZXR1cm4gcmVzICsgc2VjICsgJyAnICsgdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lclNlY1wiKTtcbiAgICB9XG4gICAgcHJpdmF0ZSB0aW1lckZ1bmMgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIENhbGwgdGhpcyBtZXRob2QgdG8gc3RhcnQgdGltZXIgdGhhdCB3aWxsIGNhbGN1bGF0ZSBob3cgbXVjaCB0aW1lIGVuZC11c2VyIHNwZW5kcyBvbiB0aGUgc3VydmV5IG9yIG9uIHBhZ2VzXG4gICAgICogQHNlZSBzdG9wVGltZXJcbiAgICAgKiBAc2VlIHRpbWVTcGVudFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGFydFRpbWVyKCkge1xuICAgICAgICBpZih0aGlzLmlzVGltZXJTdGFydGVkIHx8IHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy50aW1lckZ1bmMgPSBmdW5jdGlvbigpIHtzZWxmLmRvVGltZXIoKTt9O1xuICAgICAgICB0aGlzLmlzVGltZXJTdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgU3VydmV5VGltZXIuaW5zdGFuY2Uuc3RhcnQodGhpcy50aW1lckZ1bmMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdG9wIHRoZSB0aW1lci5cbiAgICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICAgKiBAc2VlIHRpbWVTcGVudFxuICAgICAqL1xuICAgIHB1YmxpYyBzdG9wVGltZXIoKSB7XG4gICAgICAgIGlmKCF0aGlzLmlzVGltZXJTdGFydGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMuaXNUaW1lclN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgU3VydmV5VGltZXIuaW5zdGFuY2Uuc3RvcCh0aGlzLnRpbWVyRnVuYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHRpbWUgaW4gc2Vjb25kcyBlbmQtdXNlciBzcGVuZHMgb24gdGhlIHN1cnZleVxuICAgICAqIEBzZWUgc3RhcnRUaW1lclxuICAgICAqIEBzZWUgUGFnZU1vZGVsLnRpbWVTcGVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdGltZVNwZW50KCkgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidGltZVNwZW50XCIsIDApOyB9XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gdGltZSBpbiBzZWNvbmRzIHRoYXQgZW5kLXVzZXIgaGFzIHRvIGNvbXBsZXRlIHRoZSBzdXJ2ZXkuIElmIHRoZSB2YWx1ZSBpcyAwIG9yIGxlc3MsIHRoZSBlbmQtdXNlciBoYXMgdW5saW1pdGVkIG51bWJlciBvZiB0aW1lIHRvIGZpbmlzaCB0aGUgc3VydmV5LiAgXG4gICAgICogQHNlZSBzdGFydFRpbWVyXG4gICAgICogQHNlZSBtYXhUaW1lVG9GaW5pc2hQYWdlXG4gICAgICovXG4gICAgcHVibGljIGdldCBtYXhUaW1lVG9GaW5pc2goKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heFRpbWVUb0ZpbmlzaFwiLCAwKTsgfVxuICAgIHB1YmxpYyBzZXQgbWF4VGltZVRvRmluaXNoKHZhbDogbnVtYmVyKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFRpbWVUb0ZpbmlzaFwiLCB2YWwpOyB9XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gdGltZSBpbiBzZWNvbmRzIHRoYXQgZW5kLXVzZXIgaGFzIHRvIGNvbXBsZXRlIGEgcGFnZSBpbiB0aGUgc3VydmV5LiBJZiB0aGUgdmFsdWUgaXMgMCBvciBsZXNzLCB0aGUgZW5kLXVzZXIgaGFzIHVubGltaXRlZCB0aW1lLiBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgdmFsdWUgZm9yIGV2ZXJ5IHBhZ2UuICBcbiAgICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICAgKiBAc2VlIG1heFRpbWVUb0ZpbmlzaFxuICAgICAqIEBzZWUgUGFnZU1vZGVsLm1heFRpbWVUb0ZpbmlzaFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4VGltZVRvRmluaXNoUGFnZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4VGltZVRvRmluaXNoUGFnZVwiLCAwKTsgfVxuICAgIHB1YmxpYyBzZXQgbWF4VGltZVRvRmluaXNoUGFnZSh2YWw6IG51bWJlcikgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hQYWdlXCIsIHZhbCk7IH1cbiAgICBwcml2YXRlIGdldFBhZ2VNYXhUaW1lVG9GaW5pc2gocGFnZTogUGFnZU1vZGVsKSB7IFxuICAgICAgICBpZighcGFnZSB8fCBwYWdlLm1heFRpbWVUb0ZpbmlzaCA8IDApIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gcGFnZS5tYXhUaW1lVG9GaW5pc2ggPiAwID8gcGFnZS5tYXhUaW1lVG9GaW5pc2ggOiB0aGlzLm1heFRpbWVUb0ZpbmlzaFBhZ2U7IFxuICAgIH1cbiAgICBwcm90ZWN0ZWQgZG9UaW1lcigpIHtcbiAgICAgICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgICAgICBpZihwYWdlKSB7XG4gICAgICAgICAgICBwYWdlLnRpbWVTcGVudCA9IHBhZ2UudGltZVNwZW50ICsgMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFRpbWVTcGVudCh0aGlzLnRpbWVTcGVudCArIDEpO1xuICAgICAgICB0aGlzLm9uVGltZXIuZmlyZSh0aGlzLCB7fSk7XG4gICAgICAgIGlmKHRoaXMubWF4VGltZVRvRmluaXNoID4gMCAmJiB0aGlzLm1heFRpbWVUb0ZpbmlzaCA9PSB0aGlzLnRpbWVTcGVudCkge1xuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZUxhc3RQYWdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYocGFnZSkge1xuICAgICAgICAgICAgdmFyIHBhZ2VMaW1pdCA9IHRoaXMuZ2V0UGFnZU1heFRpbWVUb0ZpbmlzaChwYWdlKTtcbiAgICAgICAgICAgIGlmKHBhZ2VMaW1pdCA+IDAgJiYgcGFnZUxpbWl0ID09IHBhZ2UudGltZVNwZW50KSB7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5pc0xhc3RQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVMYXN0UGFnZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFBhZ2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ICBcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIHNldFRpbWVTcGVudCh2YWw6IG51bWJlcikgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0aW1lU3BlbnRcIiwgdmFsKTsgfVxuICAgIC8vSVN1cnZleUltcGxlbWVudG9yXG4gICAgZ2VTdXJ2ZXlEYXRhKCk6IElTdXJ2ZXlEYXRhIHsgcmV0dXJuIHRoaXM7IH1cbiAgICBnZXRTdXJ2ZXkoKTogSVN1cnZleSB7IHJldHVybiB0aGlzOyB9XG4gICAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3NvciB7IHJldHVybiB0aGlzOyB9XG4gICAgLy9JU3VydmV5VHJpZ2dlck93bmVyXG4gICAgZ2V0T2JqZWN0cyhwYWdlczogc3RyaW5nW10sIHF1ZXN0aW9uczogc3RyaW5nW10pOiBhbnlbXXtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShyZXN1bHQsIHRoaXMuZ2V0UGFnZXNCeU5hbWVzKHBhZ2VzKSk7XG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHJlc3VsdCwgdGhpcy5nZXRRdWVzdGlvbnNCeU5hbWVzKHF1ZXN0aW9ucykpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzZXRUcmlnZ2VyVmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBpc1ZhcmlhYmxlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICghbmFtZSkgcmV0dXJuO1xuICAgICAgICBpZiAoaXNWYXJpYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRWYXJpYWJsZShuYW1lLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcInN1cnZleVwiLCBbeyBuYW1lOiBcImxvY2FsZVwiLCBjaG9pY2VzOiAoKSA9PiB7IHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0TG9jYWxlcygpIH0gfSxcbiAgICB7bmFtZTogXCJ0aXRsZTp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUaXRsZVwifSwgeyBuYW1lOiBcImZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYzpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWV9LFxuICAgIHtuYW1lOiBcImNvbXBsZXRlZEh0bWw6aHRtbFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29tcGxldGVkSHRtbFwifSwge25hbWU6IFwiY29tcGxldGVkQmVmb3JlSHRtbDpodG1sXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NDb21wbGV0ZWRCZWZvcmVIdG1sXCJ9LFxuICAgIHtuYW1lOiBcImxvYWRpbmdIdG1sOmh0bWxcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0xvYWRpbmdIdG1sXCJ9LCB7IG5hbWU6IFwicGFnZXNcIiwgY2xhc3NOYW1lOiBcInBhZ2VcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwicXVlc3Rpb25zXCIsIGFsdGVybmF0aXZlTmFtZTogXCJlbGVtZW50c1wiLCBiYXNlQ2xhc3NOYW1lOiBcInF1ZXN0aW9uXCIsIHZpc2libGU6IGZhbHNlLCBvbkdldFZhbHVlOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBudWxsOyB9LCBvblNldFZhbHVlOiBmdW5jdGlvbiAob2JqLCB2YWx1ZSwganNvbkNvbnZlcnRlcikgeyB2YXIgcGFnZSA9IG9iai5hZGROZXdQYWdlKFwiXCIpOyBqc29uQ29udmVydGVyLnRvT2JqZWN0KHsgcXVlc3Rpb25zOiB2YWx1ZSB9LCBwYWdlKTsgfSB9LFxuICAgIHsgbmFtZTogXCJ0cmlnZ2Vyczp0cmlnZ2Vyc1wiLCBiYXNlQ2xhc3NOYW1lOiBcInN1cnZleXRyaWdnZXJcIiwgY2xhc3NOYW1lUGFydDogXCJ0cmlnZ2VyXCIgfSxcbiAgICB7bmFtZTogXCJzdXJ2ZXlJZFwiLCB2aXNpYmxlOiBmYWxzZX0sIHtuYW1lOiBcInN1cnZleVBvc3RJZFwiLCB2aXNpYmxlOiBmYWxzZX0sIHtuYW1lOiBcInN1cnZleVNob3dEYXRhU2F2aW5nXCIsIHZpc2libGU6IGZhbHNlfSwgXCJjb29raWVOYW1lXCIsIFwic2VuZFJlc3VsdE9uUGFnZU5leHQ6Ym9vbGVhblwiLFxuICAgIHsgbmFtZTogXCJzaG93TmF2aWdhdGlvbkJ1dHRvbnM6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sIHsgbmFtZTogXCJzaG93UHJldkJ1dHRvbjpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSwgeyBuYW1lOiBcInNob3dUaXRsZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICB7IG5hbWU6IFwic2hvd1BhZ2VUaXRsZXM6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sIHsgbmFtZTogXCJzaG93Q29tcGxldGVkUGFnZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBcInNob3dQYWdlTnVtYmVyczpib29sZWFuXCIsIHsgbmFtZTogXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIsIGRlZmF1bHQ6IFwib25cIiwgY2hvaWNlczogW1wib25cIiwgXCJvblBhZ2VcIiwgXCJvZmZcIl0gfSxcbiAgICB7IG5hbWU6IFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsIGRlZmF1bHQ6IFwidG9wXCIsIGNob2ljZXM6IFtcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIl0gfSxcbiAgICB7IG5hbWU6IFwicXVlc3Rpb25FcnJvckxvY2F0aW9uXCIsIGRlZmF1bHQ6IFwidG9wXCIsIGNob2ljZXM6IFtcInRvcFwiLCBcImJvdHRvbVwiXSB9LFxuICAgIHsgbmFtZTogXCJzaG93UHJvZ3Jlc3NCYXJcIiwgZGVmYXVsdDogXCJvZmZcIiwgY2hvaWNlczogW1wib2ZmXCIsIFwidG9wXCIsIFwiYm90dG9tXCJdIH0sXG4gICAgeyBuYW1lOiBcIm1vZGVcIiwgZGVmYXVsdDogXCJlZGl0XCIsIGNob2ljZXM6IFtcImVkaXRcIiwgXCJkaXNwbGF5XCJdIH0sXG4gICAgeyBuYW1lOiBcInN0b3JlT3RoZXJzQXNDb21tZW50OmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LCBcImdvTmV4dFBhZ2VBdXRvbWF0aWM6Ym9vbGVhblwiLCBcbiAgICB7IG5hbWU6IFwiY2xlYXJJbnZpc2libGVWYWx1ZXNcIiwgZGVmYXVsdDogXCJub25lXCIsIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJvbkNvbXBsZXRlXCIsIFwib25IaWRkZW5cIl0gfSxcbiAgICB7IG5hbWU6IFwicGFnZVByZXZUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQYWdlUHJldlRleHRcIn0sXG4gICAgeyBuYW1lOiBcInBhZ2VOZXh0VGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGFnZU5leHRUZXh0XCJ9LFxuICAgIHsgbmFtZTogXCJjb21wbGV0ZVRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbXBsZXRlVGV4dFwifSxcbiAgICB7IG5hbWU6IFwicmVxdWlyZWRUZXh0XCIsIGRlZmF1bHQ6IFwiKlwiIH0sIFwicXVlc3Rpb25TdGFydEluZGV4XCIsIHtuYW1lOiBcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUXVlc3Rpb25UaXRsZVRlbXBsYXRlXCJ9LFxuICAgIHsgbmFtZTogXCJtYXhUaW1lVG9GaW5pc2g6bnVtYmVyXCIsIGRlZmF1bHQ6IDB9LCB7IG5hbWU6IFwibWF4VGltZVRvRmluaXNoUGFnZTpudW1iZXJcIiwgZGVmYXVsdDogMH0sXG4gICAgeyBuYW1lOiBcInNob3dUaW1lclBhbmVsXCIsIGRlZmF1bHQ6IFwibm9uZVwiLCBjaG9pY2VzOiBbXCJub25lXCIsIFwidG9wXCIsIFwiYm90dG9tXCJdfSwge25hbWU6IFwic2hvd1RpbWVyUGFuZWxNb2RlXCIsIGRlZmF1bHQ6IFwiYWxsXCIsIGNob2ljZXM6IFtcImFsbFwiLCBcInBhZ2VcIiwgXCJzdXJ2ZXlcIl19XSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc3VydmV5LnRzIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtTdXJ2ZXlNb2RlbH0gZnJvbSBcIi4uL3N1cnZleVwiO1xuaW1wb3J0IHtTdXJ2ZXlXaW5kb3dNb2RlbH0gZnJvbSBcIi4uL3N1cnZleVdpbmRvd1wiO1xuXG5leHBvcnQgY2xhc3MgUmVhY3RTdXJ2ZXlNb2RlbCBleHRlbmRzIFN1cnZleU1vZGVsIHtcbiAgICByZW5kZXJDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgICBjb25zdHJ1Y3Rvcihqc29uT2JqOiBhbnkgPSBudWxsKSB7XG4gICAgICAgIHN1cGVyKGpzb25PYmopO1xuICAgIH1cbiAgICBwdWJsaWMgcmVuZGVyKCkge1xuICAgICAgICBpZiAodGhpcy5yZW5kZXJDYWxsYmFjaykge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJDYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBtZXJnZUNzcyhzcmM6IGFueSwgZGVzdDogYW55KSB7XG4gICAgICAgIHRoaXMubWVyZ2VWYWx1ZXMoc3JjLCBkZXN0KTtcbiAgICB9XG4gICAgcHVibGljIGRvQWZ0ZXJSZW5kZXJTdXJ2ZXkoZWwpIHtcbiAgICAgICAgdGhpcy5hZnRlclJlbmRlclN1cnZleShlbCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBvbkxvYWRTdXJ2ZXlGcm9tU2VydmljZSgpIHtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIG9uTG9hZGluZ1N1cnZleUZyb21TZXJ2aWNlKCkge1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0Q29tcGxldGVkU3RhdGUodmFsdWU6IHN0cmluZywgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyLnNldENvbXBsZXRlZFN0YXRlKHZhbHVlLCB0ZXh0KTtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWFjdFdpbmRvd01vZGVsIGV4dGVuZHMgU3VydmV5V2luZG93TW9kZWwge1xuICAgIHJlbmRlckNhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICAgIGNvbnN0cnVjdG9yKGpzb25PYmo6IGFueSA9IG51bGwsIG1vZGVsOiBSZWFjdFN1cnZleU1vZGVsID0gbnVsbCkge1xuICAgICAgICBzdXBlcihqc29uT2JqLCBtb2RlbCk7XG4gICAgfVxuICAgIC8vcHVibGljIGdldCByZWFjdFN1cnZleSgpOiBSZWFjdFN1cnZleU1vZGVsIHsgcmV0dXJuIDxSZWFjdFN1cnZleU1vZGVsPnRoaXMuc3VydmV5OyB9XG4gICAgcHJvdGVjdGVkIGNyZWF0ZVN1cnZleShqc29uT2JqOiBhbnkpOiBTdXJ2ZXlNb2RlbCB7XG4gICAgICAgIHJldHVybiBuZXcgUmVhY3RTdXJ2ZXlNb2RlbChqc29uT2JqKVxuICAgIH1cbn1cblxuU3VydmV5TW9kZWwucGxhdGZvcm0gPSBcInJlYWN0XCI7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0c3VydmV5bW9kZWwudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtSZWFjdFN1cnZleU1vZGVsfSBmcm9tIFwiLi9yZWFjdHN1cnZleW1vZGVsXCI7XG5pbXBvcnQge1N1cnZleVBhZ2V9IGZyb20gXCIuL3JlYWN0cGFnZVwiO1xuaW1wb3J0IHtTdXJ2ZXlOYXZpZ2F0aW9ufSBmcm9tIFwiLi9yZWFjdFN1cnZleU5hdmlnYXRpb25cIjtcbmltcG9ydCB7UXVlc3Rpb25CYXNlfSBmcm9tIFwiLi4vcXVlc3Rpb25iYXNlXCI7XG5pbXBvcnQge0lTdXJ2ZXlDcmVhdG9yfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uXCI7XG5pbXBvcnQge1JlYWN0UXVlc3Rpb25GYWN0b3J5fSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHtzdXJ2ZXlDc3N9IGZyb20gXCIuLi9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkXCI7XG5pbXBvcnQge1N1cnZleVByb2dyZXNzfSBmcm9tIFwiLi9yZWFjdFN1cnZleVByb2dyZXNzXCI7XG5pbXBvcnQge1N1cnZleVRpbWVyUGFuZWx9IGZyb20gXCIuL3JlYWN0dGltZXJwYW5lbFwiO1xuaW1wb3J0IHtTdXJ2ZXlFbGVtZW50QmFzZX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxhbnksIGFueT4gaW1wbGVtZW50cyBJU3VydmV5Q3JlYXRvciB7XG4gICAgcHVibGljIHN0YXRpYyBnZXQgY3NzVHlwZSgpOiBzdHJpbmcgeyByZXR1cm4gc3VydmV5Q3NzLmN1cnJlbnRUeXBlOyB9XG4gICAgcHVibGljIHN0YXRpYyBzZXQgY3NzVHlwZSh2YWx1ZTogc3RyaW5nKSB7IHN1cnZleUNzcy5jdXJyZW50VHlwZSA9IHZhbHVlOyB9XG4gICAgcHJvdGVjdGVkIHN1cnZleTogUmVhY3RTdXJ2ZXlNb2RlbDtcbiAgICBwcml2YXRlIGlzQ3VycmVudFBhZ2VDaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuaGFuZGxlVHJ5QWdhaW5DbGljayA9IHRoaXMuaGFuZGxlVHJ5QWdhaW5DbGljay5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZVN1cnZleShwcm9wcyk7XG4gICAgfVxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzOiBhbnkpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh0aGlzLmdldFN0YXRlKCkpO1xuICAgICAgICB0aGlzLnVwZGF0ZVN1cnZleShuZXh0UHJvcHMpO1xuICAgIH1cbiAgICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ3VycmVudFBhZ2VDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmlzQ3VycmVudFBhZ2VDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnN1cnZleS5zY3JvbGxUb1RvcE9uUGFnZUNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICB2YXIgZWwgPSB0aGlzLnJlZnNbXCJyb290XCJdO1xuICAgICAgICBpZiAoZWwgJiYgdGhpcy5zdXJ2ZXkpIHRoaXMuc3VydmV5LmRvQWZ0ZXJSZW5kZXJTdXJ2ZXkoZWwpO1xuICAgICAgICBpZih0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5zaG93VGltZXJQYW5lbCAhPSBcImFsbFwiKSB7XG4gICAgICAgICAgICB0aGlzLnN1cnZleS5zdGFydFRpbWVyKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIGlmKHRoaXMuc3VydmV5KSB7XG4gICAgICAgICAgICB0aGlzLnN1cnZleS5zdG9wVGltZXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICBpZiAodGhpcy5zdXJ2ZXkuc3RhdGUgPT0gXCJjb21wbGV0ZWRcIikgcmV0dXJuIHRoaXMucmVuZGVyQ29tcGxldGVkKCk7XG4gICAgICAgIGlmICh0aGlzLnN1cnZleS5zdGF0ZSA9PSBcImNvbXBsZXRlZGJlZm9yZVwiKSByZXR1cm4gdGhpcy5yZW5kZXJDb21wbGV0ZWRCZWZvcmUoKTtcbiAgICAgICAgaWYgKHRoaXMuc3VydmV5LnN0YXRlID09IFwibG9hZGluZ1wiKSByZXR1cm4gdGhpcy5yZW5kZXJMb2FkaW5nKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlclN1cnZleSgpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGNzcygpOiBhbnkgeyByZXR1cm4gc3VydmV5Q3NzLmdldENzcygpOyB9XG4gICAgcHVibGljIHNldCBjc3ModmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLnN1cnZleS5tZXJnZUNzcyh2YWx1ZSwgdGhpcy5jc3MpO1xuICAgIH1cbiAgICBoYW5kbGVUcnlBZ2FpbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuc3VydmV5LmRvQ29tcGxldGUoKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHJlbmRlckNvbXBsZXRlZCgpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIGlmKCF0aGlzLnN1cnZleS5zaG93Q29tcGxldGVkUGFnZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBjb21wbGV0ZWRTdGF0ZSA9IG51bGw7XG4gICAgICAgIGlmKHRoaXMuc3VydmV5LmNvbXBsZXRlZFN0YXRlKSB7XG4gICAgICAgICAgICB2YXIgdHJ5QWdhaW5CdXR0b24gPSBudWxsO1xuICAgICAgICAgICAgaWYodGhpcy5zdXJ2ZXkuY29tcGxldGVkU3RhdGUgPT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJ0blRleHQgPSB0aGlzLnN1cnZleS5nZXRMb2NTdHJpbmcoJ3NhdmVBZ2FpbkJ1dHRvbicpO1xuICAgICAgICAgICAgICAgIHRyeUFnYWluQnV0dG9uID0gKDxpbnB1dCB0eXBlPXtcImJ1dHRvblwifSB2YWx1ZT17YnRuVGV4dH0gY2xhc3NOYW1lPXt0aGlzLmNzcy5zYXZlRGF0YS5zYXZlQWdhaW5CdXR0b259IG9uQ2xpY2s9e3RoaXMuaGFuZGxlVHJ5QWdhaW5DbGlja30gLz4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNzcyA9IHRoaXMuY3NzLnNhdmVEYXRhW3RoaXMuc3VydmV5LmNvbXBsZXRlZFN0YXRlXTtcbiAgICAgICAgICAgIGNvbXBsZXRlZFN0YXRlID0gPGRpdiBjbGFzc05hbWU9e3RoaXMuY3NzLnNhdmVEYXRhLnJvb3R9PjxkaXYgY2xhc3NOYW1lPXtjc3N9PjxzcGFuPnt0aGlzLnN1cnZleS5jb21wbGV0ZWRTdGF0ZVRleHR9PC9zcGFuPnt0cnlBZ2FpbkJ1dHRvbn08L2Rpdj48L2Rpdj47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGh0bWxWYWx1ZSA9IHsgX19odG1sOiB0aGlzLnN1cnZleS5wcm9jZXNzZWRDb21wbGV0ZWRIdG1sIH07XG4gICAgICAgIHJldHVybiAoPGRpdj48ZGl2IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXtodG1sVmFsdWV9IC8+e2NvbXBsZXRlZFN0YXRlfTwvZGl2Pik7XG4gICAgfVxuICAgIHByb3RlY3RlZCByZW5kZXJDb21wbGV0ZWRCZWZvcmUoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICB2YXIgaHRtbFZhbHVlID0geyBfX2h0bWw6IHRoaXMuc3VydmV5LnByb2Nlc3NlZENvbXBsZXRlZEJlZm9yZUh0bWwgfTtcbiAgICAgICAgcmV0dXJuICg8ZGl2IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXtodG1sVmFsdWV9IC8+KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHJlbmRlckxvYWRpbmcoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICB2YXIgaHRtbFZhbHVlID0geyBfX2h0bWw6IHRoaXMuc3VydmV5LnByb2Nlc3NlZExvYWRpbmdIdG1sIH07XG4gICAgICAgIHJldHVybiAoPGRpdiBkYW5nZXJvdXNseVNldElubmVySFRNTD17aHRtbFZhbHVlfSAvPik7XG4gICAgfVxuICAgIHByb3RlY3RlZCByZW5kZXJTdXJ2ZXkoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICB2YXIgdGl0bGUgPSB0aGlzLnN1cnZleS50aXRsZSAmJiB0aGlzLnN1cnZleS5zaG93VGl0bGUgPyB0aGlzLnJlbmRlclRpdGxlKCkgOiBudWxsO1xuICAgICAgICB2YXIgY3VycmVudFBhZ2UgPSB0aGlzLnN1cnZleS5jdXJyZW50UGFnZSA/IHRoaXMucmVuZGVyUGFnZSgpIDogbnVsbDtcbiAgICAgICAgdmFyIHBhZ2VJZCA9IHRoaXMuc3VydmV5LmN1cnJlbnRQYWdlID8gdGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2UuaWQgOiBcIlwiO1xuICAgICAgICB2YXIgdG9wUHJvZ3Jlc3MgPSB0aGlzLnN1cnZleS5zaG93UHJvZ3Jlc3NCYXIgPT0gXCJ0b3BcIiA/IHRoaXMucmVuZGVyUHJvZ3Jlc3ModHJ1ZSkgOiBudWxsO1xuICAgICAgICB2YXIgYm90dG9tUHJvZ3Jlc3MgPSB0aGlzLnN1cnZleS5zaG93UHJvZ3Jlc3NCYXIgPT0gXCJib3R0b21cIiA/IHRoaXMucmVuZGVyUHJvZ3Jlc3MoZmFsc2UpIDogbnVsbDtcbiAgICAgICAgdmFyIGJ1dHRvbnMgPSAoY3VycmVudFBhZ2UgJiYgdGhpcy5zdXJ2ZXkuaXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmcpID8gdGhpcy5yZW5kZXJOYXZpZ2F0aW9uKCkgOiBudWxsO1xuICAgICAgICBpZiAoIWN1cnJlbnRQYWdlKSB7XG4gICAgICAgICAgICBjdXJyZW50UGFnZSA9IHRoaXMucmVuZGVyRW1wdHlTdXJ2ZXkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiByZWY9XCJyb290XCIgY2xhc3NOYW1lPXt0aGlzLmNzcy5yb290fT5cbiAgICAgICAgICAgICAgICB7dGl0bGV9XG4gICAgICAgICAgICAgICAgPGRpdiBpZD17cGFnZUlkfSBjbGFzc05hbWU9e3RoaXMuY3NzLmJvZHl9PlxuICAgICAgICAgICAgICAgICAgICB7dG9wUHJvZ3Jlc3N9XG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlclRpbWVyUGFuZWwoXCJ0b3BcIil9XG4gICAgICAgICAgICAgICAgICAgIHtjdXJyZW50UGFnZX1cbiAgICAgICAgICAgICAgICAgICAge3RoaXMucmVuZGVyVGltZXJQYW5lbChcImJvdHRvbVwiKX1cbiAgICAgICAgICAgICAgICAgICAge2JvdHRvbVByb2dyZXNzfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIHtidXR0b25zfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxuICAgIHByb3RlY3RlZCByZW5kZXJUaXRsZSgpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIHZhciB0aXRsZSA9IFN1cnZleUVsZW1lbnRCYXNlLnJlbmRlckxvY1N0cmluZyh0aGlzLnN1cnZleS5sb2NUaXRsZSk7XG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5jc3MuaGVhZGVyfT48aDM+e3RpdGxlfTwvaDM+PC9kaXY+O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgcmVuZGVyVGltZXJQYW5lbChsb2NhdGlvbjogc3RyaW5nKSB7XG4gICAgICAgIGlmKHRoaXMuc3VydmV5LnNob3dUaW1lclBhbmVsICE9IGxvY2F0aW9uKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIDxTdXJ2ZXlUaW1lclBhbmVsIHN1cnZleT17dGhpcy5zdXJ2ZXl9IGNzcz17dGhpcy5jc3N9Lz5cbiAgICB9XG4gICAgcHJvdGVjdGVkIHJlbmRlclBhZ2UoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICByZXR1cm4gPFN1cnZleVBhZ2Ugc3VydmV5PXt0aGlzLnN1cnZleX0gcGFnZT17dGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2V9IGNzcz17dGhpcy5jc3N9IGNyZWF0b3I9e3RoaXN9IC8+O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgcmVuZGVyUHJvZ3Jlc3MoaXNUb3A6IGJvb2xlYW4pOiBKU1guRWxlbWVudCB7XG4gICAgICAgIHJldHVybiA8U3VydmV5UHJvZ3Jlc3Mgc3VydmV5PXt0aGlzLnN1cnZleX0gY3NzPXt0aGlzLmNzc30gaXNUb3A9e2lzVG9wfSAgLz47XG4gICAgfVxuICAgIHByb3RlY3RlZCByZW5kZXJOYXZpZ2F0aW9uKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIDxTdXJ2ZXlOYXZpZ2F0aW9uIHN1cnZleSA9IHt0aGlzLnN1cnZleX0gY3NzPXt0aGlzLmNzc30vPjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHJlbmRlckVtcHR5U3VydmV5KCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgcmV0dXJuICg8c3Bhbj57dGhpcy5zdXJ2ZXkuZW1wdHlTdXJ2ZXlUZXh0fTwvc3Bhbj4pO1xuICAgIH1cbiAgICBcbiAgICBwcm90ZWN0ZWQgdXBkYXRlU3VydmV5KG5ld1Byb3BzOiBhbnkpIHtcbiAgICAgICAgaWYgKG5ld1Byb3BzKSB7XG4gICAgICAgICAgICBpZiAobmV3UHJvcHMubW9kZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1cnZleSA9IG5ld1Byb3BzLm1vZGVsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAobmV3UHJvcHMuanNvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cnZleSA9IG5ldyBSZWFjdFN1cnZleU1vZGVsKG5ld1Byb3BzLmpzb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3VydmV5ID0gbmV3IFJlYWN0U3VydmV5TW9kZWwoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV3UHJvcHMpIHtcbiAgICAgICAgICAgIGZvcih2YXIga2V5IGluIG5ld1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYoa2V5ID09IFwibW9kZWxcIiB8fCBrZXkgPT0gXCJjaGlsZHJlblwiKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZihrZXkgPT0gXCJjc3NcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cnZleS5tZXJnZUNzcyhuZXdQcm9wcy5jc3MsIHRoaXMuY3NzKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKGtleS5pbmRleE9mKFwib25cIikgPT0gMCAmJiB0aGlzLnN1cnZleVtrZXldICYmIHRoaXMuc3VydmV5W2tleV0uYWRkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmdW5jQm9keSA9IG5ld1Byb3BzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGxldCBmdW5jID0gZnVuY3Rpb24oc2VuZGVyLCBvcHRpb25zKSB7IGZ1bmNCb2R5KHNlbmRlciwgb3B0aW9ucyk7IH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VydmV5W2tleV0uYWRkKGZ1bmMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VydmV5W2tleV0gPSBuZXdQcm9wc1trZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vc2V0IHRoZSBmaXJzdCBwYWdlXG4gICAgICAgIHZhciBkdW1teSA9IHRoaXMuc3VydmV5LmN1cnJlbnRQYWdlO1xuXG4gICAgICAgIHRoaXMuc2V0U3VydmV5RXZlbnRzKG5ld1Byb3BzKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRTdGF0ZSgpIHsgcmV0dXJuIHsgcGFnZUluZGV4Q2hhbmdlOiAwLCBpc0NvbXBsZXRlZDogZmFsc2UsIG1vZGVsQ2hhbmdlZDogMCB9OyB9XG4gICAgcHJvdGVjdGVkIHNldFN1cnZleUV2ZW50cyhuZXdQcm9wczogYW55KSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy5zdXJ2ZXkucmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnN0YXRlLm1vZGVsQ2hhbmdlZCA9IHNlbGYuc3RhdGUubW9kZWxDaGFuZ2VkICsgMTtcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoc2VsZi5zdGF0ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3VydmV5Lm9uQ29tcGxldGUuYWRkKChzZW5kZXIpID0+IHsgc2VsZi5zdGF0ZS5pc0NvbXBsZXRlZCA9IHRydWU7IHNlbGYuc2V0U3RhdGUoc2VsZi5zdGF0ZSk7IH0pO1xuICAgICAgICB0aGlzLnN1cnZleS5vblBhcnRpYWxTZW5kLmFkZCgoc2VuZGVyKSA9PiB7IHNlbGYuc2V0U3RhdGUoc2VsZi5zdGF0ZSk7IH0pO1xuICAgICAgICB0aGlzLnN1cnZleS5vbkN1cnJlbnRQYWdlQ2hhbmdlZC5hZGQoKHNlbmRlciwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgc2VsZi5pc0N1cnJlbnRQYWdlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICBzZWxmLnN0YXRlLnBhZ2VJbmRleENoYW5nZSA9IHNlbGYuc3RhdGUucGFnZUluZGV4Q2hhbmdlICsgMTtcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoc2VsZi5zdGF0ZSk7XG4gICAgICAgICAgICBpZiAobmV3UHJvcHMgJiYgbmV3UHJvcHMub25DdXJyZW50UGFnZUNoYW5nZWQpIG5ld1Byb3BzLm9uQ3VycmVudFBhZ2VDaGFuZ2VkKHNlbmRlciwgb3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN1cnZleS5vblZpc2libGVDaGFuZ2VkLmFkZCgoc2VuZGVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5xdWVzdGlvbiAmJiBvcHRpb25zLnF1ZXN0aW9uLnJlYWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXRlID0gb3B0aW9ucy5xdWVzdGlvbi5yZWFjdC5zdGF0ZTtcbiAgICAgICAgICAgICAgICBzdGF0ZS52aXNpYmxlID0gb3B0aW9ucy5xdWVzdGlvbi52aXNpYmxlO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMucXVlc3Rpb24ucmVhY3Quc2V0U3RhdGUoc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdXJ2ZXkub25WYWx1ZUNoYW5nZWQuYWRkKChzZW5kZXIsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnF1ZXN0aW9uICYmIG9wdGlvbnMucXVlc3Rpb24ucmVhY3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBvcHRpb25zLnF1ZXN0aW9uLnJlYWN0LnN0YXRlO1xuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnF1ZXN0aW9uLnJlYWN0LnNldFN0YXRlKHN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXdQcm9wcyAmJiBuZXdQcm9wcy5kYXRhKSBuZXdQcm9wcy5kYXRhW29wdGlvbnMubmFtZV0gPSBvcHRpb25zLnZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvL0lTdXJ2ZXlDcmVhdG9yXG4gICAgcHVibGljIGNyZWF0ZVF1ZXN0aW9uRWxlbWVudChxdWVzdGlvbjogUXVlc3Rpb25CYXNlKTogSlNYLkVsZW1lbnQge1xuICAgICAgICByZXR1cm4gUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UuY3JlYXRlUXVlc3Rpb24ocXVlc3Rpb24uZ2V0VGVtcGxhdGUoKSwge1xuICAgICAgICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLCBpc0Rpc3BsYXlNb2RlOiBxdWVzdGlvbi5pc1JlYWRPbmx5LCBjcmVhdG9yOiB0aGlzXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgcmVuZGVyRXJyb3Ioa2V5OiBzdHJpbmcsIGVycm9yVGV4dDogc3RyaW5nLCBjc3NDbGFzc2VzOiBhbnkpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIHJldHVybiA8ZGl2IGtleT17a2V5fSBjbGFzc05hbWU9e2Nzc0NsYXNzZXMuZXJyb3IuaXRlbX0+e2Vycm9yVGV4dH08L2Rpdj47XG4gICAgfVxuICAgIHB1YmxpYyBxdWVzdGlvblRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuc3VydmV5LnF1ZXN0aW9uVGl0bGVMb2NhdGlvbjsgfVxuICAgIHB1YmxpYyBxdWVzdGlvbkVycm9yTG9jYXRpb24oKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuc3VydmV5LnF1ZXN0aW9uRXJyb3JMb2NhdGlvbjsgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0U3VydmV5LnRzeCIsImltcG9ydCB7QmFzZSwgU3VydmV5RXJyb3IsIElUZXh0UHJvY2Vzc29yfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQge0l0ZW1WYWx1ZX0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQge0pzb25PYmplY3QsIEpzb25PYmplY3RQcm9wZXJ0eX0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7Q3VzdG9tRXJyb3J9IGZyb20gXCIuL2Vycm9yXCI7XG4vKipcbiAqIEEgZGVmaW5pdGlvbiBmb3IgZmlsbGluZyBjaG9pY2VzIGZvciBjaGVja2JveCwgZHJvcGRvd24gYW5kIHJhZGlvZ3JvdXAgcXVlc3Rpb25zIGZyb20gcmVzZnVsbCBzZXJ2aWNlcy5cbiAqIFRoZSBydW4gbWV0aG9kIGNhbGwgYSByZXN0ZnVsbCBzZXJ2aWNlIGFuZCByZXN1bHRzIGNhbiBiZSBnZXQgb24gZ2V0UkVzdWx0Q2FsbGJhY2suXG4gKi9cbmV4cG9ydCBjbGFzcyBDaG9pY2VzUmVzdGZ1bGwgZXh0ZW5kcyBCYXNlIHtcbiAgICBwcml2YXRlIHN0YXRpYyBpdGVtc1Jlc3VsdCA9IHt9O1xuICAgIHByaXZhdGUgc3RhdGljIGdldENhY2hlZEl0ZW1zUmVzdWx0KG9iajogQ2hvaWNlc1Jlc3RmdWxsKTogYm9vbGVhbiB7XG4gICAgICAgIHZhciBoYXNoID0gb2JqLm9iakhhc2g7XG4gICAgICAgIHZhciByZXMgPSBDaG9pY2VzUmVzdGZ1bGwuaXRlbXNSZXN1bHRbaGFzaF07XG4gICAgICAgIGlmKCFyZXMpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYob2JqLmdldFJlc3VsdENhbGxiYWNrKSB7XG4gICAgICAgICAgICBvYmouZ2V0UmVzdWx0Q2FsbGJhY2socmVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBsYXN0T2JqSGFzaDogc3RyaW5nID0gXCJcIjtcbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc2VkVXJsOiBzdHJpbmcgPSBcIlwiO1xuICAgIHByb3RlY3RlZCBwcm9jZXNzZWRQYXRoOiBzdHJpbmcgPSBcIlwiO1xuICAgIHB1YmxpYyBnZXRSZXN1bHRDYWxsYmFjazogKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+KSA9PiB2b2lkO1xuICAgIHB1YmxpYyBlcnJvcjogU3VydmV5RXJyb3IgPSBudWxsO1xuICAgIHB1YmxpYyBvd25lcjogQmFzZTtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgcHVibGljIHJ1bih0ZXh0UHJvY2Vzc29yOiBJVGV4dFByb2Nlc3NvciA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVybCB8fCAhdGhpcy5nZXRSZXN1bHRDYWxsYmFjaykgcmV0dXJuO1xuICAgICAgICB0aGlzLnByb2Nlc3NlZFRleHQodGV4dFByb2Nlc3Nvcik7XG4gICAgICAgIGlmKCF0aGlzLnByb2Nlc3NlZFVybCkge1xuICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRDYWxsYmFjayhbXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5sYXN0T2JqSGFzaCA9PSB0aGlzLm9iakhhc2gpIHJldHVybjtcbiAgICAgICAgdGhpcy5sYXN0T2JqSGFzaCA9IHRoaXMub2JqSGFzaDtcbiAgICAgICAgaWYodGhpcy51c2VDaGFuZ2VkSXRlbXNSZXN1bHRzKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VuZFJlcXVlc3QoKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHVzZUNoYW5nZWRJdGVtc1Jlc3VsdHMoKSA6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gQ2hvaWNlc1Jlc3RmdWxsLmdldENhY2hlZEl0ZW1zUmVzdWx0KHRoaXMpO1xuICAgIH1cbiAgICBwcml2YXRlIHByb2Nlc3NlZFRleHQodGV4dFByb2Nlc3NvcjogSVRleHRQcm9jZXNzb3IpIHtcbiAgICAgICAgaWYodGV4dFByb2Nlc3Nvcikge1xuICAgICAgICAgICAgdmFyIHBVcmwgPSB0ZXh0UHJvY2Vzc29yLnByb2Nlc3NUZXh0RXgodGhpcy51cmwpO1xuICAgICAgICAgICAgdmFyIHBQYXRoID0gdGV4dFByb2Nlc3Nvci5wcm9jZXNzVGV4dEV4KHRoaXMucGF0aCk7XG4gICAgICAgICAgICBpZighcFVybC5oYXNBbGxWYWx1ZXNPbkxhc3RSdW4gfHwgIXBQYXRoLmhhc0FsbFZhbHVlc09uTGFzdFJ1bikge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc2VkVXJsID0gXCJcIjtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NlZFBhdGggPSBcIlwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NlZFVybCA9IHBVcmwudGV4dDtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NlZFBhdGggPSBwUGF0aC50ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWRVcmwgPSB0aGlzLnVybDtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc2VkUGF0aCA9IHRoaXMucGF0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2VuZFJlcXVlc3QoKSB7XG4gICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHRoaXMucHJvY2Vzc2VkVXJsKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5vbkxvYWQoSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2VsZi5vbkVycm9yKHhoci5zdGF0dXNUZXh0LCB4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9XG4gICAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHsgcmV0dXJuIFwiY2hvaWNlc0J5VXJsXCI7IH1cbiAgICBwdWJsaWMgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy51cmwgJiYgIXRoaXMucGF0aCAmJiAhdGhpcy52YWx1ZU5hbWUgJiYgIXRoaXMudGl0bGVOYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0Q3VzdG9tUHJvcGVydGllc05hbWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllcygpO1xuICAgICAgICB2YXIgcmVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICByZXMucHVzaCh0aGlzLmdldEN1c3RvbVByb3BlcnR5TmFtZShwcm9wZXJ0aWVzW2ldLm5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBwcml2YXRlIGdldEN1c3RvbVByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHN0cmluZyB7IHJldHVybiBwcm9wZXJ0eU5hbWUgKyBcIk5hbWVcIjsgfVxuICAgIHByaXZhdGUgZ2V0Q3VzdG9tUHJvcGVydGllcygpIDogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgICAgIHZhciBwcm9wZXJ0aWVzID0gSnNvbk9iamVjdC5tZXRhRGF0YS5nZXRQcm9wZXJ0aWVzKHRoaXMuaXRlbVZhbHVlVHlwZSk7XG4gICAgICAgIHZhciByZXMgPSBbXTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICBpZihwcm9wZXJ0aWVzW2ldLm5hbWUgPT0gXCJ2YWx1ZVwiIHx8IHByb3BlcnRpZXNbaV0ubmFtZSA9PSBcInRleHRcIikgY29udGludWU7XG4gICAgICAgICAgICByZXMucHVzaChwcm9wZXJ0aWVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0RGF0YShqc29uOiBhbnkpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBpZiAoanNvbi51cmwpIHRoaXMudXJsID0ganNvbi51cmw7XG4gICAgICAgIGlmIChqc29uLnBhdGgpIHRoaXMucGF0aCA9IGpzb24ucGF0aDtcbiAgICAgICAgaWYgKGpzb24udmFsdWVOYW1lKSB0aGlzLnZhbHVlTmFtZSA9IGpzb24udmFsdWVOYW1lO1xuICAgICAgICBpZiAoanNvbi50aXRsZU5hbWUpIHRoaXMudGl0bGVOYW1lID0ganNvbi50aXRsZU5hbWU7XG4gICAgICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRDdXN0b21Qcm9wZXJ0aWVzTmFtZXMoKTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICBpZihqc29uW3Byb3BlcnRpZXNbaV1dKSB0aGlzW3Byb3BlcnRpZXNbaV1dID0ganNvbltwcm9wZXJ0aWVzW2ldXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgZ2V0RGF0YSgpOiBhbnkge1xuICAgICAgICBpZih0aGlzLmlzRW1wdHkpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgcmVzID0ge307XG4gICAgICAgIGlmKHRoaXMudXJsKSByZXNbXCJ1cmxcIl0gPSB0aGlzLnVybDtcbiAgICAgICAgaWYodGhpcy5wYXRoKSByZXNbXCJwYXRoXCJdID0gdGhpcy5wYXRoO1xuICAgICAgICBpZih0aGlzLnZhbHVlTmFtZSkgcmVzW1widmFsdWVOYW1lXCJdID0gdGhpcy52YWx1ZU5hbWU7XG4gICAgICAgIGlmKHRoaXMudGl0bGVOYW1lKSByZXNbXCJ0aXRsZU5hbWVcIl0gPSB0aGlzLnRpdGxlTmFtZTtcbiAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldEN1c3RvbVByb3BlcnRpZXNOYW1lcygpO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIGlmKHRoaXNbcHJvcGVydGllc1tpXV0pIHJlc1twcm9wZXJ0aWVzW2ldXSA9IHRoaXNbcHJvcGVydGllc1tpXV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgcHVibGljIGdldCB1cmwoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInVybFwiLCBcIlwiKTsgfTtcbiAgICBwdWJsaWMgc2V0IHVybCh2YWw6IHN0cmluZykgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ1cmxcIiwgdmFsKTsgfTtcbiAgICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhdGhcIiwgXCJcIik7IH1cbiAgICBwdWJsaWMgc2V0IHBhdGgodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGF0aFwiLCB2YWwpOyB9XG4gICAgcHVibGljIGdldCB2YWx1ZU5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZhbHVlTmFtZVwiLCBcIlwiKTsgfTtcbiAgICBwdWJsaWMgc2V0IHZhbHVlTmFtZSh2YWw6IHN0cmluZykgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZU5hbWVcIiwgdmFsKTsgfTtcbiAgICBwdWJsaWMgZ2V0IHRpdGxlTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidGl0bGVOYW1lXCIsIFwiXCIpOyB9O1xuICAgIHB1YmxpYyBzZXQgdGl0bGVOYW1lKHZhbDogc3RyaW5nKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRpdGxlTmFtZVwiLCB2YWwpOyB9O1xuICAgIHB1YmxpYyBnZXQgaXRlbVZhbHVlVHlwZSgpOiBzdHJpbmcgeyBcbiAgICAgICAgaWYoIXRoaXMub3duZXIpIHJldHVybiBcIml0ZW12YWx1ZVwiO1xuICAgICAgICB2YXIgcHJvcCA9IEpzb25PYmplY3QubWV0YURhdGEuZmluZFByb3BlcnR5KHRoaXMub3duZXIuZ2V0VHlwZSgpLCBcImNob2ljZXNcIik7XG4gICAgICAgIGlmKCFwcm9wKSByZXR1cm4gXCJpdGVtdmFsdWVcIjtcbiAgICAgICAgaWYocHJvcC50eXBlID09IFwiaXRlbXZhbHVlc1wiKSByZXR1cm4gXCJpdGVtdmFsdWVcIjtcbiAgICAgICAgcmV0dXJuIHByb3AudHlwZTtcbiAgICB9XG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICB0aGlzLnVybCA9IFwiXCI7XG4gICAgICAgIHRoaXMucGF0aCA9IFwiXCI7XG4gICAgICAgIHRoaXMudmFsdWVOYW1lID0gXCJcIjtcbiAgICAgICAgdGhpcy50aXRsZU5hbWUgPSBcIlwiO1xuICAgICAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllc05hbWVzKCk7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgaWYodGhpc1twcm9wZXJ0aWVzW2ldXSkgdGhpc1twcm9wZXJ0aWVzW2ldXSA9IFwiXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIG9uTG9hZChyZXN1bHQ6IGFueSkge1xuICAgICAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5nZXRSZXN1bHRBZnRlclBhdGgocmVzdWx0KTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHRbXCJsZW5ndGhcIl0pIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1WYWx1ZSA9IHJlc3VsdFtpXTtcbiAgICAgICAgICAgICAgICBpZiAoIWl0ZW1WYWx1ZSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZShpdGVtVmFsdWUpO1xuICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9IHRoaXMuZ2V0VGl0bGUoaXRlbVZhbHVlKTtcbiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG5ldyBJdGVtVmFsdWUodmFsdWUsIHRpdGxlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEN1c3RvbVByb3BlcnRpZXMoaXRlbSwgaXRlbVZhbHVlKTtcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lcnJvciA9IG5ldyBDdXN0b21FcnJvcihzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwidXJsR2V0Q2hvaWNlc0Vycm9yXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBDaG9pY2VzUmVzdGZ1bGwuaXRlbXNSZXN1bHRbdGhpcy5vYmpIYXNoXSA9IGl0ZW1zO1xuICAgICAgICB0aGlzLmdldFJlc3VsdENhbGxiYWNrKGl0ZW1zKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzZXRDdXN0b21Qcm9wZXJ0aWVzKGl0ZW06IEl0ZW1WYWx1ZSwgaXRlbVZhbHVlOiBhbnkpIHtcbiAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldEN1c3RvbVByb3BlcnRpZXMoKTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICB2YXIgcHJvcCA9IHByb3BlcnRpZXNbaV07XG4gICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWx1ZUNvcmUoaXRlbVZhbHVlLCB0aGlzLmdldFByb3BlcnR5QmluZGluZyhwcm9wLm5hbWUpKTtcbiAgICAgICAgICAgIGlmKCF0aGlzLmlzVmFsdWVFbXB0eSh2YWwpKSB7XG4gICAgICAgICAgICAgICAgaXRlbVtwcm9wLm5hbWVdID0gdmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0UHJvcGVydHlCaW5kaW5nKHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmKHRoaXNbdGhpcy5nZXRDdXN0b21Qcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKV0pIHJldHVybiB0aGlzW3RoaXMuZ2V0Q3VzdG9tUHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSldO1xuICAgICAgICBpZih0aGlzW3Byb3BlcnR5TmFtZV0pIHJldHVybiB0aGlzW3Byb3BlcnR5TmFtZV07XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7XG4gICAgfVxuICAgIHByaXZhdGUgb25FcnJvcihzdGF0dXM6IHN0cmluZywgcmVzcG9uc2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLmVycm9yID0gbmV3IEN1c3RvbUVycm9yKHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJ1cmxSZXF1ZXN0RXJyb3JcIilbXCJmb3JtYXRcIl0oc3RhdHVzLCByZXNwb25zZSkpO1xuICAgICAgICB0aGlzLmdldFJlc3VsdENhbGxiYWNrKFtdKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRSZXN1bHRBZnRlclBhdGgocmVzdWx0OiBhbnkpIHtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICAgIGlmICghdGhpcy5wcm9jZXNzZWRQYXRoKSByZXR1cm4gcmVzdWx0O1xuICAgICAgICB2YXIgcGF0aGVzID0gdGhpcy5nZXRQYXRoZXMoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdFtwYXRoZXNbaV1dO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0UGF0aGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICB2YXIgcGF0aGVzID0gW107XG4gICAgICAgIGlmICh0aGlzLnByb2Nlc3NlZFBhdGguaW5kZXhPZignOycpID4gLTEpIHtcbiAgICAgICAgICAgIHBhdGhlcyA9IHRoaXMucGF0aC5zcGxpdCgnOycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF0aGVzID0gdGhpcy5wcm9jZXNzZWRQYXRoLnNwbGl0KCcsJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGhlcy5sZW5ndGggPT0gMCkgcGF0aGVzLnB1c2godGhpcy5wcm9jZXNzZWRQYXRoKTtcbiAgICAgICAgcmV0dXJuIHBhdGhlcztcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRWYWx1ZShpdGVtOiBhbnkpOiBhbnkge1xuICAgICAgICBpZighaXRlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlTmFtZSkgcmV0dXJuIHRoaXMuZ2V0VmFsdWVDb3JlKGl0ZW0sIHRoaXMudmFsdWVOYW1lKTtcbiAgICAgICAgaWYoIShpdGVtIGluc3RhbmNlb2YgT2JqZWN0KSkgcmV0dXJuIGl0ZW07XG4gICAgICAgIHZhciBsZW4gPSBPYmplY3Qua2V5cyhpdGVtKS5sZW5ndGg7XG4gICAgICAgIGlmIChsZW4gPCAxKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIGl0ZW1bT2JqZWN0LmtleXMoaXRlbSlbMF1dO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFRpdGxlKGl0ZW06IGFueSk6IGFueSB7XG4gICAgICAgIHZhciB0aXRsZSA9IHRoaXMudGl0bGVOYW1lID8gdGhpcy50aXRsZU5hbWUgOiBcInRpdGxlXCI7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlQ29yZShpdGVtLCB0aXRsZSk7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0VmFsdWVDb3JlKGl0ZW06IGFueSwgcHJvcGVydHk6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIGlmKCFpdGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYocHJvcGVydHkuaW5kZXhPZignLicpIDwgMCkgcmV0dXJuIGl0ZW1bcHJvcGVydHldO1xuICAgICAgICB2YXIgcHJvcGVydGllcyA9IHByb3BlcnR5LnNwbGl0KCcuJyk7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgaXRlbSA9IGl0ZW1bcHJvcGVydGllc1tpXV07XG4gICAgICAgICAgICBpZighaXRlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0IG9iakhhc2goKSB7IHJldHVybiB0aGlzLnByb2Nlc3NlZFVybCArIFwiO1wiICsgdGhpcy5wcm9jZXNzZWRQYXRoICsgXCI7XCIgKyB0aGlzLnZhbHVlTmFtZSArIFwiO1wiICsgdGhpcy50aXRsZU5hbWU7IH1cbn1cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJjaG9pY2VzQnlVcmxcIiwgW1widXJsXCIsIFwicGF0aFwiLCBcInZhbHVlTmFtZVwiLCBcInRpdGxlTmFtZVwiXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IENob2ljZXNSZXN0ZnVsbCgpOyB9KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9jaG9pY2VzUmVzdGZ1bGwudHMiLCJleHBvcnQgaW50ZXJmYWNlIElMb2NhbGl6YWJsZU93bmVyIHtcbiAgICBnZXRMb2NhbGUoKTogc3RyaW5nO1xuICAgIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBjbGFzcyByZXByZXNlbnRzIHRoZSBzdHJpbmcgdGhhdCBzdXBwb3J0cyBtdWx0aS1sYW5ndWFnZXMgYW5kIG1hcmtkb3duLlxuICogSXQgdXNlcyBpbiBhbGwgb2JqZWN0cyB3aGVyZSBzdXBwb3J0IGZvciBtdWx0aS1sYW5ndWFnZXMgYW5kIG1hcmtkb3duIGlzIHJlcXVpcmVkLlxuICovXG5leHBvcnQgY2xhc3MgTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHB1YmxpYyBzdGF0aWMgIGRlZmF1bHRMb2NhbGU6IHN0cmluZyA9IFwiZGVmYXVsdFwiO1xuICAgIHByaXZhdGUgdmFsdWVzID0ge307XG4gICAgcHJpdmF0ZSBodG1sVmFsdWVzID0ge307XG4gICAgcHVibGljIG9uUmVuZGVyZWRIdG1sQ2FsbGJhY2s6IChodG1sOiBzdHJpbmcpID0+IHN0cmluZztcbiAgICBwdWJsaWMgb25HZXRUZXh0Q2FsbGJhY2s6IChzdHI6IHN0cmluZykgPT4gc3RyaW5nID0gbnVsbDtcbiAgICBjb25zdHJ1Y3RvciAocHVibGljIG93bmVyOiBJTG9jYWxpemFibGVPd25lciwgcHVibGljIHVzZU1hcmtkb3duOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5vbkNyZWF0aW5nKCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgbG9jYWxlKCkge3JldHVybiB0aGlzLm93bmVyID8gdGhpcy5vd25lci5nZXRMb2NhbGUoKSA6IFwiXCI7IH1cbiAgICBwdWJsaWMgZ2V0IHRleHQoKSA6IHN0cmluZyB7XG4gICAgICAgIHZhciByZXMgPSB0aGlzLnB1cmVUZXh0O1xuICAgICAgICBpZih0aGlzLm9uR2V0VGV4dENhbGxiYWNrKSByZXMgPSB0aGlzLm9uR2V0VGV4dENhbGxiYWNrKHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgcHVyZVRleHQoKSB7XG4gICAgICAgIHZhciBsb2MgPSB0aGlzLmxvY2FsZTtcbiAgICAgICAgaWYoIWxvYykgbG9jID0gTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdExvY2FsZTtcbiAgICAgICAgdmFyIHJlcyA9IHRoaXMudmFsdWVzW2xvY107XG4gICAgICAgIGlmKCFyZXMgJiYgbG9jICE9PSBMb2NhbGl6YWJsZVN0cmluZy5kZWZhdWx0TG9jYWxlKSB7XG4gICAgICAgICAgICByZXMgPSB0aGlzLnZhbHVlc1tMb2NhbGl6YWJsZVN0cmluZy5kZWZhdWx0TG9jYWxlXTtcbiAgICAgICAgfVxuICAgICAgICBpZighcmVzKSByZXMgPSBcIlwiO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhhc0h0bWwoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0h0bWxWYWx1ZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGh0bWwoKSB7XG4gICAgICAgIGlmKCF0aGlzLmhhc0h0bWwpIHJldHVybiBcIlwiO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRIdG1sVmFsdWUoKTtcbiAgICB9XG4gICAgcHVibGljIGdldCB0ZXh0T3JIdG1sKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNIdG1sID8gdGhpcy5nZXRIdG1sVmFsdWUoKSA6IHRoaXMudGV4dDtcbiAgICB9XG4gICAgcHVibGljIGdldCByZW5kZXJlZEh0bWwoKSB7XG4gICAgICAgIHZhciByZXMgPSB0aGlzLnRleHRPckh0bWw7XG4gICAgICAgIHJldHVybiB0aGlzLm9uUmVuZGVyZWRIdG1sQ2FsbGJhY2sgPyB0aGlzLm9uUmVuZGVyZWRIdG1sQ2FsbGJhY2socmVzKSA6IHJlcztcbiAgICB9XG4gICAgcHVibGljIHNldCB0ZXh0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zZXRMb2NhbGVUZXh0KHRoaXMubG9jYWxlLCB2YWx1ZSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRMb2NhbGVUZXh0KGxvYzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYoIWxvYykgbG9jID0gTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdExvY2FsZTtcbiAgICAgICAgdmFyIHJlcyA9IHRoaXMudmFsdWVzW2xvY107XG4gICAgICAgIHJldHVybiByZXMgPyByZXMgOiBcIlwiO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0TG9jYWxlVGV4dChsb2M6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZih2YWx1ZSA9PSB0aGlzLmdldExvY2FsZVRleHQobG9jKSkgcmV0dXJuO1xuICAgICAgICBpZighbG9jKSBsb2MgPSBMb2NhbGl6YWJsZVN0cmluZy5kZWZhdWx0TG9jYWxlO1xuICAgICAgICBkZWxldGUgdGhpcy5odG1sVmFsdWVzW2xvY107XG4gICAgICAgIGlmKCF2YWx1ZSkge1xuICAgICAgICAgICAgaWYodGhpcy52YWx1ZXNbbG9jXSkgZGVsZXRlIHRoaXMudmFsdWVzW2xvY107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlmKGxvYyAhPSBMb2NhbGl6YWJsZVN0cmluZy5kZWZhdWx0TG9jYWxlICYmIHZhbHVlID09IHRoaXMuZ2V0TG9jYWxlVGV4dChMb2NhbGl6YWJsZVN0cmluZy5kZWZhdWx0TG9jYWxlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldExvY2FsZVRleHQobG9jLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlc1tsb2NdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmKGxvYyA9PSBMb2NhbGl6YWJsZVN0cmluZy5kZWZhdWx0TG9jYWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVZhbHVlc0VxdWFsc1RvRGVmYXVsdCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkNoYW5nZWQoKTtcbiAgICB9XG4gICAgcHVibGljIGdldEpzb24oKTogYW55IHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcyk7XG4gICAgICAgIGlmKGtleXMubGVuZ3RoID09IDApIHJldHVybiBudWxsO1xuICAgICAgICBpZihrZXlzLmxlbmd0aCA9PSAxICYmIGtleXNbMF0gPT0gTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdExvY2FsZSkgcmV0dXJuIHRoaXMudmFsdWVzW2tleXNbMF1dO1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXM7XG4gICAgfVxuICAgIHB1YmxpYyBzZXRKc29uKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy52YWx1ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5odG1sVmFsdWVzID0ge307XG4gICAgICAgIGlmKCF2YWx1ZSkgcmV0dXJuO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5zZXRMb2NhbGVUZXh0KG51bGwsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcih2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRMb2NhbGVUZXh0KGtleSwgdmFsdWVba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkNoYW5nZWQoKTtcbiAgICB9XG4gICAgcHVibGljIG9uQ2hhbmdlZCgpIHt9XG4gICAgcHJvdGVjdGVkIG9uQ3JlYXRpbmcoKSB7fVxuICAgIHByaXZhdGUgaGFzSHRtbFZhbHVlKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZighdGhpcy5vd25lciB8fCAhdGhpcy51c2VNYXJrZG93bikgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgdGV4dCA9IHRoaXMudGV4dDtcbiAgICAgICAgaWYoIXRleHQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGxvYyA9IHRoaXMubG9jYWxlO1xuICAgICAgICBpZighbG9jKSBsb2MgPSBMb2NhbGl6YWJsZVN0cmluZy5kZWZhdWx0TG9jYWxlO1xuICAgICAgICBpZighKGxvYyBpbiB0aGlzLmh0bWxWYWx1ZXMpKSB7XG4gICAgICAgICAgICB0aGlzLmh0bWxWYWx1ZXNbbG9jXSA9IHRoaXMub3duZXIuZ2V0TWFya2Rvd25IdG1sKHRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmh0bWxWYWx1ZXNbbG9jXSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRIdG1sVmFsdWUoKSA6IHN0cmluZyB7XG4gICAgICAgIHZhciBsb2MgPSB0aGlzLmxvY2FsZTtcbiAgICAgICAgaWYoIWxvYykgbG9jID0gTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdExvY2FsZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHRtbFZhbHVlc1tsb2NdO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVsZXRlVmFsdWVzRXF1YWxzVG9EZWZhdWx0KGRlZmF1bHRWYWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGhpcy52YWx1ZXMpO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIGlmKGtleXNbaV0gPT0gTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdExvY2FsZSkgY29udGludWU7XG4gICAgICAgICAgICBpZih0aGlzLnZhbHVlc1trZXlzW2ldXSA9PSBkZWZhdWx0VmFsdWUpIGRlbGV0ZSB0aGlzLnZhbHVlc1trZXlzW2ldXTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YWJsZXN0cmluZy50cyIsImltcG9ydCB7SnNvbk9iamVjdH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHtIYXNoVGFibGV9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7QmFzZSwgSVN1cnZleUltcGwsIElQYWdlLCBJUGFuZWwsIElDb25kaXRpb25SdW5uZXIsIElTdXJ2ZXksIElTdXJ2ZXlEYXRhLCBJRWxlbWVudCwgSVF1ZXN0aW9uLCBTdXJ2ZXlFbGVtZW50fSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQge1F1ZXN0aW9uQmFzZX0gZnJvbSBcIi4vcXVlc3Rpb25iYXNlXCI7XG5pbXBvcnQge0NvbmRpdGlvblJ1bm5lcn0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuaW1wb3J0IHtRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHtJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmd9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQge3N1cnZleUNzc30gZnJvbSBcIi4vZGVmYXVsdENzcy9jc3NzdGFuZGFyZFwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Sb3dNb2RlbCB7XG4gICAgcHJpdmF0ZSB2aXNpYmxlVmFsdWU6IGJvb2xlYW47XG4gICAgdmlzaWJpbGl0eUNoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcGFuZWw6IFBhbmVsTW9kZWxCYXNlKSB7XG4gICAgICAgIHRoaXMudmlzaWJsZVZhbHVlID0gcGFuZWwuc3VydmV5ICYmIHBhbmVsLnN1cnZleS5pc0Rlc2lnbk1vZGU7XG4gICAgfVxuICAgIHB1YmxpYyBlbGVtZW50czogQXJyYXk8SUVsZW1lbnQ+ID0gW107XG4gICAgLy9UT0RPIHJlbW92ZSBhZnRlciB1cGRhdGluZyByZWFjdCBhbmQgdnVlXG4gICAgcHVibGljIGdldCBxdWVzdGlvbnMoKTogQXJyYXk8SUVsZW1lbnQ+IHsgcmV0dXJuIHRoaXMuZWxlbWVudHM7fVxuICAgIHB1YmxpYyBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMudmlzaWJsZVZhbHVlOyB9XG4gICAgcHVibGljIHNldCB2aXNpYmxlKHZhbDogYm9vbGVhbikge1xuICAgICAgICBpZiAodmFsID09IHRoaXMudmlzaWJsZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnZpc2libGVWYWx1ZSA9IHZhbDtcbiAgICAgICAgdGhpcy5vblZpc2libGVDaGFuZ2VkKCk7XG4gICAgfVxuICAgIHB1YmxpYyB1cGRhdGVWaXNpYmxlKCkge1xuICAgICAgICB0aGlzLnZpc2libGUgPSB0aGlzLmNhbGNWaXNpYmxlKCk7XG4gICAgICAgIHRoaXMuc2V0V2lkdGgoKTtcbiAgICB9XG4gICAgcHVibGljIGFkZEVsZW1lbnQocTogSUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50cy5wdXNoKHEpO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpc2libGUoKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIG9uVmlzaWJsZUNoYW5nZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLnZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2spIHRoaXMudmlzaWJpbGl0eUNoYW5nZWRDYWxsYmFjaygpO1xuICAgIH1cbiAgICBwcml2YXRlIHNldFdpZHRoKCkge1xuICAgICAgICB2YXIgdmlzQ291bnQgPSB0aGlzLmdldFZpc2libGVDb3VudCgpO1xuICAgICAgICBpZiAodmlzQ291bnQgPT0gMCkgcmV0dXJuO1xuICAgICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudHNbaV0uaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHEgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgIHEucmVuZGVyV2lkdGggPSBxLndpZHRoID8gcS53aWR0aCA6IE1hdGguZmxvb3IoMTAwIC8gdmlzQ291bnQpICsgJyUnO1xuICAgICAgICAgICAgICAgIHEucmlnaHRJbmRlbnQgPSBjb3VudGVyIDwgdmlzQ291bnQgLSAxID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRzW2ldLnJlbmRlcldpZHRoID0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGdldFZpc2libGVDb3VudCgpOiBudW1iZXIge1xuICAgICAgICB2YXIgcmVzID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50c1tpXS5pc1Zpc2libGUpIHJlcysrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHByaXZhdGUgY2FsY1Zpc2libGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmdldFZpc2libGVDb3VudCgpID4gMDsgfVxufVxuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyBmb3IgYSBQYW5lbCBhbmQgUGFnZSBvYmplY3RzLlxuICovXG5leHBvcnQgY2xhc3MgUGFuZWxNb2RlbEJhc2UgZXh0ZW5kcyBTdXJ2ZXlFbGVtZW50IGltcGxlbWVudHMgSVBhbmVsLCBJQ29uZGl0aW9uUnVubmVyLCBJTG9jYWxpemFibGVPd25lciB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcGFuZWxDb3VudGVyID0gMTAwO1xuICAgIHByaXZhdGUgc3RhdGljIGdldFBhbmVsSWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwic3BfXCIgKyBQYW5lbE1vZGVsQmFzZS5wYW5lbENvdW50ZXIrKztcbiAgICB9XG5cbiAgICBwcml2YXRlIHJvd1ZhbHVlczogQXJyYXk8UXVlc3Rpb25Sb3dNb2RlbD4gPSBudWxsO1xuICAgIHByaXZhdGUgY29uZGl0aW9uUnVubmVyOiBDb25kaXRpb25SdW5uZXIgPSBudWxsO1xuICAgIHByaXZhdGUgZWxlbWVudHNWYWx1ZTogQXJyYXk8SUVsZW1lbnQ+O1xuICAgIHByaXZhdGUgaXNRdWVzdGlvbnNSZWFkeTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgcXVlc3Rpb25zVmFsdWU6IEFycmF5PFF1ZXN0aW9uQmFzZT4gPSBuZXcgQXJyYXk8UXVlc3Rpb25CYXNlPigpO1xuICAgIHJvd3NDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJcIikge1xuICAgICAgICBzdXBlcihuYW1lKTtcbiAgICAgICAgdGhpcy5lbGVtZW50c1ZhbHVlID0gdGhpcy5jcmVhdGVOZXdBcnJheShcImVsZW1lbnRzXCIsIGZ1bmN0aW9uKGl0ZW0pIHtzZWxmLm9uQWRkRWxlbWVudChpdGVtLCBzZWxmLmVsZW1lbnRzVmFsdWUubGVuZ3RoKTt9LCBmdW5jdGlvbihpdGVtKSB7IHNlbGYub25SZW1vdmVFbGVtZW50KGl0ZW0pO30gKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImVsZW1lbnRzXCIsIGZ1bmN0aW9uKCkge3NlbGYubWFya1F1ZXN0aW9uTGlzdERpcnR5KCk7IHNlbGYub25Sb3dzQ2hhbmdlZCgpO30pO1xuICAgICAgICB0aGlzLmlkID0gUGFuZWxNb2RlbEJhc2UuZ2V0UGFuZWxJZCgpO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciBsb2NUaXRsZVZhbHVlID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInRpdGxlXCIsIHRoaXMsIHRydWUpO1xuICAgICAgICBsb2NUaXRsZVZhbHVlLm9uUmVuZGVyZWRIdG1sQ2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7IHJldHVybiBzZWxmLmdldFJlbmRlcmVkVGl0bGUodGV4dCk7IH07XG4gICAgICAgIHZhciBsb2NEZXNjcmlwdGlvblZhbHVlID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImRlc2NyaXB0aW9uXCIsIHRoaXMsIHRydWUpO1xuICAgICAgICBsb2NEZXNjcmlwdGlvblZhbHVlLm9uR2V0VGV4dENhbGxiYWNrID0gZnVuY3Rpb24oaHRtbCkgeyByZXR1cm4gc2VsZi5nZXRQcm9jZXNzZWRIdG1sKGh0bWwpOyB9XG4gICAgfVxuICAgIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCkge1xuICAgICAgICBzdXBlci5zZXRTdXJ2ZXlJbXBsKHZhbHVlKTtcbiAgICAgICAgaWYodGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNEZXNpZ25Nb2RlKSB0aGlzLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRzW2ldLnNldFN1cnZleUltcGwodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICAgICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgICAgIHRoaXMubWFya1F1ZXN0aW9uTGlzdERpcnR5KCk7IFxuICAgICAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFuZWxNb2RlbCBvciBQYWdlTW9kZWwgdGl0bGUgcHJvcGVydHkuXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICovXG4gICAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0aXRsZVwiKTsgfVxuICAgIHB1YmxpYyBzZXQgdGl0bGUodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0aXRsZVwiLCB2YWwpOyB9XG4gICAgZ2V0IGxvY1RpdGxlKCk6IExvY2FsaXphYmxlU3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJ0aXRsZVwiKTsgfVxuICAgIC8qKlxuICAgICAqIFBhbmVsTW9kZWwgb3IgUGFnZU1vZGVsIGRlc2NyaXB0aW9uIHByb3BlcnR5LiBJdCByZW5kZXJzIHVuZGVyIHRpdGxlIGJ5IHVzaW5nIHNtYWxsZXIgZm9udC4gVW5saWtlIHRoZSB0aXRsZSwgZGVzY3JpcHRpb24gY2FuIGJlIGVtcHR5LlxuICAgICAqIEBzZWUgdGl0bGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImRlc2NyaXB0aW9uXCIpOyB9XG4gICAgcHVibGljIHNldCBkZXNjcmlwdGlvbih2YWw6ICBzdHJpbmcpIHsgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJkZXNjcmlwdGlvblwiLCB2YWwpOyB9XG4gICAgZ2V0IGxvY0Rlc2NyaXB0aW9uKCk6IExvY2FsaXphYmxlU3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJkZXNjcmlwdGlvblwiKTsgfVxuICAgIHB1YmxpYyBnZXQgaGFzRGVzY3JpcHRpb24oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmRlc2NyaXB0aW9uICE9IFwiXCI7IH1cbiAgICBcbiAgICBnZXRMb2NhbGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuc3VydmV5ID8gKDxJTG9jYWxpemFibGVPd25lcj48YW55PnRoaXMuc3VydmV5KS5nZXRMb2NhbGUoKSA6IFwiXCI7IH1cbiAgICBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nKSAgeyByZXR1cm4gdGhpcy5zdXJ2ZXkgPyAoPElMb2NhbGl6YWJsZU93bmVyPjxhbnk+dGhpcy5zdXJ2ZXkpLmdldE1hcmtkb3duSHRtbCh0ZXh0KSA6IG51bGw7IH1cbiAgICAvKipcbiAgICAgKiBBIHBhcmVudCBlbGVtZW50LiBJdCBpcyBhbHdheXMgbnVsbCBmb3IgdGhlIFBhZ2Ugb2JqZWN0IGFuZCBhbHdheXMgbm90IG51bGwgZm9yIHRoZSBQYW5lbCBvYmplY3QuIFBhbmVsIG9iamVjdCBtYXkgY29udGFpbiBRdWVzdGlvbnMgYW5kIG90aGVyIFBhbmVscy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhcmVudCgpOiBQYW5lbE1vZGVsQmFzZSB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwYXJlbnRcIiwgbnVsbCk7IH1cbiAgICBwdWJsaWMgc2V0IHBhcmVudCh2YWw6IFBhbmVsTW9kZWxCYXNlKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInBhcmVudFwiLCB2YWwpOyB9XG4gICAgLyoqXG4gICAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSWYgaXQgcmV0dXJucyB0cnVlIHRoZSBQYW5lbCBiZWNvbWVzIHZpc2libGUgYW5kIGlmIGl0IHJldHVybnMgZmFsc2UgdGhlIFBhbmVsIGJlY29tZXMgaW52aXNpYmxlLiBUaGUgbGlicmFyeSBydW5zIHRoZSBleHByZXNzaW9uIG9uIHN1cnZleSBzdGFydCBhbmQgb24gY2hhbmdpbmcgYSBxdWVzdGlvbiB2YWx1ZS4gSWYgdGhlIHByb3BlcnR5IGlzIGVtcHR5IHRoZW4gdmlzaWJsZSBwcm9wZXJ0eSBpcyB1c2VkLlxuICAgICAqIEBzZWUgdmlzaWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmlzaWJsZUlmKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSWZcIiwgXCJcIik7IH1cbiAgICBwdWJsaWMgc2V0IHZpc2libGVJZih2YWw6IHN0cmluZykgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSWZcIiwgdmFsKTsgfVxuICAgIHB1YmxpYyBnZXQgY3NzQ2xhc3NlcygpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5jc3M7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0IGNzcygpOiBhbnkgeyByZXR1cm4gc3VydmV5Q3NzLmdldENzcygpOyB9XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgZWxlbWVudCBpZGVudGlmaWNhdG9yLiBJdCBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpZFwiKTsgfVxuICAgIHB1YmxpYyBzZXQgaWQodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaWRcIiwgdmFsKTsgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBvYmplY3QgaXMgUGFuZWwuIFJldHVybnMgZmFsc2UgaWYgdGhlIGN1cnJlbnQgb2JqZWN0IGlzIFBhZ2UgKGEgcm9vdCBQYW5lbCkuXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1BhbmVsKCk6IGJvb2xlYW4geyByZXR1cm4gZmFsc2U7IH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBxdWVzdGlvbnMgbG9jYXRlZCBpbiB0aGUgUGFuZWwvUGFnZSwgaW5jbHVkaW5nIGluIHRoZSBuZXN0ZWQgUGFuZWxzLlxuICAgICAqIEBzZWUgUXVlc3Rpb25CYXNlXG4gICAgICogQHNlZSBlbGVtZW50c1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcXVlc3Rpb25zKCk6IEFycmF5PFF1ZXN0aW9uQmFzZT4ge1xuICAgICAgICBpZighdGhpcy5pc1F1ZXN0aW9uc1JlYWR5KSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uc1ZhbHVlID0gW107XG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgIGlmKGVsLmlzUGFuZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHFzID0gKDxQYW5lbE1vZGVsPmVsKS5xdWVzdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIGZvcih2YXIgaiA9IDA7IGogPCBxcy5sZW5ndGg7IGogKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb25zVmFsdWUucHVzaChxc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uc1ZhbHVlLnB1c2goPFF1ZXN0aW9uQmFzZT5lbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pc1F1ZXN0aW9uc1JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uc1ZhbHVlO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0UXVlc3Rpb25CeU5hbWUobmFtZTogc3RyaW5nKSA6IFF1ZXN0aW9uQmFzZSB7XG4gICAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnF1ZXN0aW9ucztcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIGlmKHF1ZXN0aW9uc1tpXS5uYW1lID09IG5hbWUpIHJldHVybiBxdWVzdGlvbnNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHByaXZhdGUgbWFya1F1ZXN0aW9uTGlzdERpcnR5KCkge1xuICAgICAgICB0aGlzLmlzUXVlc3Rpb25zUmVhZHkgPSBmYWxzZTtcbiAgICAgICAgaWYodGhpcy5wYXJlbnQpIHRoaXMucGFyZW50Lm1hcmtRdWVzdGlvbkxpc3REaXJ0eSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgb2JqZWN0LCBQYW5lbC9QYWdlLiBFbGVtZW50cyBjYW4gYmUgcXVlc3Rpb25zIG9yIHBhbmVscy4gVGhlIGZ1bmN0aW9uIGRvZXNuJ3QgcmV0dXJuIGVsZW1lbnRzIGluIHRoZSBuZXN0ZWQgUGFuZWxzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZWxlbWVudHMoKTogQXJyYXk8SUVsZW1lbnQ+IHsgcmV0dXJuIHRoaXMuZWxlbWVudHNWYWx1ZTsgfVxuICAgIHB1YmxpYyBnZXRFbGVtZW50c0luRGVzaWduKGluY2x1ZGVIaWRkZW46IGJvb2xlYW4gPSBmYWxzZSk6IEFycmF5PElFbGVtZW50PiB7IHJldHVybiB0aGlzLmVsZW1lbnRzOyB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IGVsZW1lbnQgYmVsb25ncyB0byB0aGUgUGFuZWwvUGFnZS4gSXQgbG9va3MgaW4gbmVzdGVkIFBhbmVscyBhcyB3ZWxsLlxuICAgICAqIEBwYXJhbSBlbGVtZW50XG4gICAgICogQHNlZSBQYW5lbE1vZGVsXG4gICAgICovXG4gICAgcHVibGljIGNvbnRhaW5zRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIHZhciBlbDogYW55ID0gdGhpcy5lbGVtZW50c1tpXTtcbiAgICAgICAgICAgIGlmKGVsID09IGVsZW1lbnQpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgaWYoZWwuaXNQYW5lbCkge1xuICAgICAgICAgICAgICAgIGlmKCg8UGFuZWxNb2RlbEJhc2U+ZWwpLmNvbnRhaW5zRWxlbWVudChlbGVtZW50KSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUsIGlmIHRoZXJlIGlzIGFuIGVycm9yIG9uIHRoaXMgUGFnZSBvciBpbnNpZGUgdGhlIGN1cnJlbnQgUGFuZWxcbiAgICAgKiBAcGFyYW0gZmlyZUNhbGxiYWNrIHNldCBpdCB0byB0cnVlLCB0byBzaG93IGVycm9ycyBpbiBVSVxuICAgICAqIEBwYXJhbSBmb2N1c2VPbkZpcnN0RXJyb3Igc2V0IGl0IHRvIHRydWUgdG8gZm9jdXNlIG9uIHRoZSBmaXJzdCBxdWVzdGlvbiB0aGF0IGRvZXNuJ3QgcGFzcyB0aGUgdmFsaWRhdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNFcnJvcnMoZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSwgZm9jdXNlT25GaXJzdEVycm9yOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICB2YXIgZmlyc3RFcnJvclF1ZXN0aW9uID0gbnVsbDtcbiAgICAgICAgdmFyIHZpc2libGVRdWVzdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5hZGRRdWVzdGlvbnNUb0xpc3QodmlzaWJsZVF1ZXN0aW9ucywgdHJ1ZSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlzaWJsZVF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHF1ZXN0aW9uID0gdmlzaWJsZVF1ZXN0aW9uc1tpXTtcbiAgICAgICAgICAgIGlmKHF1ZXN0aW9uLmlzUmVhZE9ubHkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHF1ZXN0aW9uLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2spKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvY3VzZU9uRmlyc3RFcnJvciAmJiBmaXJzdEVycm9yUXVlc3Rpb24gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBmaXJzdEVycm9yUXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlyc3RFcnJvclF1ZXN0aW9uKSBmaXJzdEVycm9yUXVlc3Rpb24uZm9jdXModHJ1ZSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbGwgbGlzdCBhcnJheSB3aXRoIHRoZSBxdWVzdGlvbnMuXG4gICAgICogQHBhcmFtIGxpc3QgXG4gICAgICogQHBhcmFtIHZpc2libGVPbmx5IHNldCBpdCB0byB0cnVlIHRvIGdldCB2aXNpYmxlIHF1ZXN0aW9ucyBvbmx5XG4gICAgICovXG4gICAgcHVibGljIGFkZFF1ZXN0aW9uc1RvTGlzdChsaXN0OiBBcnJheTxJUXVlc3Rpb24+LCB2aXNpYmxlT25seTogYm9vbGVhbiA9IGZhbHNlLCBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5hZGRFbGVtZW50c1RvTGlzdChsaXN0LCB2aXNpYmxlT25seSwgaW5jbHVkaW5nRGVzaWduVGltZSwgZmFsc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaWxsIGxpc3QgYXJyYXkgd2l0aCB0aGUgcGFuZWxzLlxuICAgICAqIEBwYXJhbSBsaXN0IFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRQYW5lbHNJbnRvTGlzdChsaXN0OiBBcnJheTxJUGFuZWw+LCB2aXNpYmxlT25seTogYm9vbGVhbiA9IGZhbHNlLCBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5hZGRFbGVtZW50c1RvTGlzdCg8QXJyYXk8SUVsZW1lbnQ+Pig8QXJyYXk8YW55Pj5saXN0KSwgdmlzaWJsZU9ubHksIGluY2x1ZGluZ0Rlc2lnblRpbWUsIHRydWUpO1xuICAgIH1cbiAgICBwcml2YXRlIGFkZEVsZW1lbnRzVG9MaXN0KGxpc3Q6IEFycmF5PElFbGVtZW50PiwgdmlzaWJsZU9ubHk6IGJvb2xlYW4sIGluY2x1ZGluZ0Rlc2lnblRpbWU6IGJvb2xlYW4sIGlzUGFuZWw6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHZpc2libGVPbmx5ICYmICF0aGlzLnZpc2libGUpIHJldHVybjtcbiAgICAgICAgdGhpcy5hZGRFbGVtZW50c1RvTGlzdENvcmUobGlzdCwgdGhpcy5lbGVtZW50cywgdmlzaWJsZU9ubHksIGluY2x1ZGluZ0Rlc2lnblRpbWUsIGlzUGFuZWwpO1xuICAgIH0gICBcbiAgICBwcml2YXRlIGFkZEVsZW1lbnRzVG9MaXN0Q29yZShsaXN0OiBBcnJheTxJRWxlbWVudD4sIGVsZW1lbnRzOiBBcnJheTxJRWxlbWVudD4sIHZpc2libGVPbmx5OiBib29sZWFuLCBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuLCBpc1BhbmVsOiBib29sZWFuKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBlbCA9IGVsZW1lbnRzW2ldO1xuICAgICAgICAgICAgaWYgKHZpc2libGVPbmx5ICYmICFlbC52aXNpYmxlKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmKGlzUGFuZWwgJiYgZWwuaXNQYW5lbCB8fCAhaXNQYW5lbCAmJiAhZWwuaXNQYW5lbCkge1xuICAgICAgICAgICAgICAgIGxpc3QucHVzaChlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihlbC5pc1BhbmVsKSB7XG4gICAgICAgICAgICAgICAgKDxQYW5lbE1vZGVsPmVsKS5hZGRFbGVtZW50c1RvTGlzdENvcmUobGlzdCwgKDxQYW5lbE1vZGVsPmVsKS5lbGVtZW50cywgdmlzaWJsZU9ubHksIGluY2x1ZGluZ0Rlc2lnblRpbWUsIGlzUGFuZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYoaW5jbHVkaW5nRGVzaWduVGltZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEVsZW1lbnRzVG9MaXN0Q29yZShsaXN0LCAoPFN1cnZleUVsZW1lbnQ+PGFueT5lbCkuZ2V0RWxlbWVudHNJbkRlc2lnbihmYWxzZSksIHZpc2libGVPbmx5LCBpbmNsdWRpbmdEZXNpZ25UaW1lLCBpc1BhbmVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9ICAgIFxuICAgIGdldCByb3dzKCk6IEFycmF5PFF1ZXN0aW9uUm93TW9kZWw+IHtcbiAgICAgICAgaWYoIXRoaXMucm93VmFsdWVzKSB7XG4gICAgICAgICAgICB0aGlzLnJvd1ZhbHVlcyA9IHRoaXMuYnVpbGRSb3dzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucm93VmFsdWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgb2JqZWN0IGlzIFBhZ2UgYW5kIGl0IGlzIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0FjdGl2ZSgpIHsgcmV0dXJuICghdGhpcy5zdXJ2ZXkpIHx8IHRoaXMuc3VydmV5LmN1cnJlbnRQYWdlID09IHRoaXMucm9vdDsgfVxuICAgIHB1YmxpYyB1cGRhdGVDdXN0b21XaWRnZXRzKCkgeyBcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRzW2ldLnVwZGF0ZUN1c3RvbVdpZGdldHMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSBkaWZmZXJlbnQgZnJvbSBcImRlZmF1bHRcIiB0byBzZXQgdGhlIHNwZWNpZmljIHF1ZXN0aW9uIHRpdGxlIGxvY2F0aW9uIGZvciB0aGlzIHBhbmVsL3BhZ2UuXG4gICAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblRpdGxlTG9jYXRpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsIFwiZGVmYXVsdFwiKTsgfTtcbiAgICBwdWJsaWMgc2V0IHF1ZXN0aW9uVGl0bGVMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLCB2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9O1xuICAgIGdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgICAgICBpZih0aGlzLnF1ZXN0aW9uVGl0bGVMb2NhdGlvbiAhPSBcImRlZmF1bHRcIikgcmV0dXJuIHRoaXMucXVlc3Rpb25UaXRsZUxvY2F0aW9uO1xuICAgICAgICBpZih0aGlzLnBhcmVudCkgcmV0dXJuIHRoaXMucGFyZW50LmdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpO1xuICAgICAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5xdWVzdGlvblRpdGxlTG9jYXRpb24gOiBcInRvcFwiO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0IHJvb3QoKTogUGFuZWxNb2RlbEJhc2Uge1xuICAgICAgICB2YXIgcmVzID0gPFBhbmVsTW9kZWxCYXNlPnRoaXM7XG4gICAgICAgIHdoaWxlKHJlcy5wYXJlbnQpIHJlcyA9IHJlcy5wYXJlbnQ7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHByb3RlY3RlZCBjcmVhdGVSb3coKTogUXVlc3Rpb25Sb3dNb2RlbCB7IHJldHVybiBuZXcgUXVlc3Rpb25Sb3dNb2RlbCh0aGlzKTsgfVxuICAgIG9uU3VydmV5TG9hZCgpIHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRzW2ldLm9uU3VydmV5TG9hZCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMucm93c0NoYW5nZWRDYWxsYmFjaykgdGhpcy5yb3dzQ2hhbmdlZENhbGxiYWNrKCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBvblJvd3NDaGFuZ2VkKCkge1xuICAgICAgICB0aGlzLnJvd1ZhbHVlcyA9IG51bGw7XG4gICAgICAgIGlmKHRoaXMucm93c0NoYW5nZWRDYWxsYmFjayAmJiAhdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgdGhpcy5yb3dzQ2hhbmdlZENhbGxiYWNrKCk7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0IGlzRGVzaWduTW9kZSgpIHsgcmV0dXJuIHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmlzRGVzaWduTW9kZTsgfVxuICAgIHByaXZhdGUgb25BZGRFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGVsZW1lbnQuc2V0U3VydmV5SW1wbCh0aGlzLnN1cnZleUltcGwpO1xuICAgICAgICBlbGVtZW50LnBhcmVudCA9IHRoaXM7XG4gICAgICAgIGlmKGVsZW1lbnQuaXNQYW5lbCkge1xuICAgICAgICAgICAgdmFyIHAgPSA8UGFuZWxNb2RlbD5lbGVtZW50O1xuICAgICAgICAgICAgaWYodGhpcy5zdXJ2ZXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1cnZleS5wYW5lbEFkZGVkKHAsIGluZGV4LCB0aGlzLCB0aGlzLnJvb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYodGhpcy5zdXJ2ZXkpIHtcbiAgICAgICAgICAgICAgICB2YXIgcSA9IDxRdWVzdGlvbkJhc2U+ZWxlbWVudDtcbiAgICAgICAgICAgICAgICB0aGlzLnN1cnZleS5xdWVzdGlvbkFkZGVkKHEsIGluZGV4LCB0aGlzLCB0aGlzLnJvb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgKDxCYXNlPjxhbnk+ZWxlbWVudCkucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChbXCJ2aXNpYmxlXCIsIFwiaXNWaXNpYmxlXCJdLCBmdW5jdGlvbiAoKSB7IHNlbGYub25FbGVtZW50VmlzaWJpbGl0eUNoYW5nZWQoZWxlbWVudCk7IH0sIHRoaXMuaWQpO1xuICAgICAgICAoPEJhc2U+PGFueT5lbGVtZW50KS5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInN0YXJ0V2l0aE5ld0xpbmVcIiwgZnVuY3Rpb24gKCkgeyBzZWxmLm9uRWxlbWVudFN0YXJ0V2l0aE5ld0xpbmVDaGFuZ2VkKGVsZW1lbnQpOyB9LCB0aGlzLmlkKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBvblJlbW92ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5wYXJlbnQgPSBudWxsO1xuICAgICAgICAoPEJhc2U+PGFueT5lbGVtZW50KS51blJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoW1widmlzaWJsZVwiLCBcImlzVmlzaWJsZVwiLCBcInN0YXJ0V2l0aE5ld0xpbmVcIl0sIHRoaXMuaWQpO1xuICAgICAgICBpZighZWxlbWVudC5pc1BhbmVsKSB7XG4gICAgICAgICAgICBpZih0aGlzLnN1cnZleSkgdGhpcy5zdXJ2ZXkucXVlc3Rpb25SZW1vdmVkKDxRdWVzdGlvbkJhc2U+ZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZih0aGlzLnN1cnZleSkgdGhpcy5zdXJ2ZXkucGFuZWxSZW1vdmVkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgb25FbGVtZW50VmlzaWJpbGl0eUNoYW5nZWQoZWxlbWVudDogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLnJvd1ZhbHVlcykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVSb3dzVmlzaWJpbGl0eShlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQub25FbGVtZW50VmlzaWJpbGl0eUNoYW5nZWQodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBvbkVsZW1lbnRTdGFydFdpdGhOZXdMaW5lQ2hhbmdlZChlbGVtZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5vblJvd3NDaGFuZ2VkKCk7XG4gICAgfVxuICAgIHByaXZhdGUgdXBkYXRlUm93c1Zpc2liaWxpdHkoZWxlbWVudDogYW55KSAge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcm93ID0gdGhpcy5yb3dWYWx1ZXNbaV07XG4gICAgICAgICAgICBpZiAocm93LmVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCkgPiAtMSkge1xuICAgICAgICAgICAgICAgIHJvdy51cGRhdGVWaXNpYmxlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBidWlsZFJvd3MoKTogQXJyYXk8UXVlc3Rpb25Sb3dNb2RlbD4ge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PFF1ZXN0aW9uUm93TW9kZWw+KCk7XG4gICAgICAgIHZhciBsYXN0Um93VmlzaWJsZUluZGV4ID0gLTE7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgICAgICAgdmFyIGlzTmV3Um93ID0gaSA9PSAwIHx8IGVsLnN0YXJ0V2l0aE5ld0xpbmU7XG4gICAgICAgICAgICB2YXIgcm93ID0gaXNOZXdSb3cgPyB0aGlzLmNyZWF0ZVJvdygpIDogcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGlmKGlzTmV3Um93KSByZXN1bHQucHVzaChyb3cpO1xuICAgICAgICAgICAgcm93LmFkZEVsZW1lbnQoZWwpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHRbaV0udXBkYXRlVmlzaWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgcmVuZGVyZWQgdGl0bGUgdGV4dCBvciBodG1sLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcHJvY2Vzc2VkVGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlbmRlcmVkVGl0bGUodGhpcy5sb2NUaXRsZS50ZXh0T3JIdG1sKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldFJlbmRlcmVkVGl0bGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZighc3RyICYmIHRoaXMuaXNQYW5lbCAmJiB0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuIFwiW1wiICsgdGhpcy5uYW1lICsgXCJdXCI7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHRQcm9jZXNzb3IgIT0gbnVsbCA/IHRoaXMudGV4dFByb2Nlc3Nvci5wcm9jZXNzVGV4dChzdHIsIHRydWUpIDogc3RyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVc2UgaXQgdG8gZ2V0L3NldCB0aGUgb2JqZWN0IHZpc2liaWxpdHkuXG4gICAgICogQHNlZSB2aXNpYmxlSWZcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlXCIsIHRydWUpOyB9XG4gICAgcHVibGljIHNldCB2aXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdGhpcy52aXNpYmxlKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVcIiwgdmFsdWUpO1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgdGhpcy5pc1Zpc2libGUpO1xuICAgICAgICBpZighdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgdGhpcy5vblZpc2libGVDaGFuZ2VkKCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBvblZpc2libGVDaGFuZ2VkKCkge1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgdGhpcy5pc1Zpc2libGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgb2JqZWN0IGlzIHZpc2libGUgb3Igc3VydmV5IGlzIGluIGRlc2lnbiBtb2RlIHJpZ2h0IG5vdy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHsgIHJldHVybiAodGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNEZXNpZ25Nb2RlKSB8fCB0aGlzLmdldElzUGFnZVZpc2libGUobnVsbCk7IH1cbiAgICBnZXRJc1BhZ2VWaXNpYmxlKGV4Y2VwdGlvblF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpc2libGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25zW2ldID09IGV4Y2VwdGlvblF1ZXN0aW9uKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uc1tpXS52aXNpYmxlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhbiBlbGVtZW1udCBpbnRvIFBhbmVsIG9yIFBhZ2UuXG4gICAgICogQHBhcmFtIGVsZW1lbnQgXG4gICAgICogQHBhcmFtIGluZGV4IGVsZW1lbnQgaW5kZXggaW4gdGhlIGVsZW1lbnRzIGFycmF5XG4gICAgICovXG4gICAgcHVibGljIGFkZEVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQsIGluZGV4OiBudW1iZXIgPSAtMSkge1xuICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5lbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudHMuc3BsaWNlKGluZGV4LCAwLCBlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBxdWVzdGlvbiBpbnRvIFBhbmVsIG9yIFBhZ2UuXG4gICAgICogQHBhcmFtIHF1ZXN0aW9uIFxuICAgICAqIEBwYXJhbSBpbmRleCBlbGVtZW50IGluZGV4IGluIHRoZSBlbGVtZW50cyBhcnJheVxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRRdWVzdGlvbihxdWVzdGlvbjogUXVlc3Rpb25CYXNlLCBpbmRleDogbnVtYmVyID0gLTEpIHtcbiAgICAgICAgdGhpcy5hZGRFbGVtZW50KHF1ZXN0aW9uLCBpbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIHBhbmVsIGludG8gUGFuZWwgb3IgUGFnZS5cbiAgICAgKiBAcGFyYW0gcGFuZWwgXG4gICAgICogQHBhcmFtIGluZGV4IGVsZW1lbnQgaW5kZXggaW4gdGhlIGVsZW1lbnRzIGFycmF5XG4gICAgICovXG4gICAgcHVibGljIGFkZFBhbmVsKHBhbmVsOiBQYW5lbE1vZGVsLCBpbmRleDogbnVtYmVyID0gLTEpIHtcbiAgICAgICAgdGhpcy5hZGRFbGVtZW50KHBhbmVsLCBpbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcXVlc3Rpb24gYW5kIGFkZHMgaXQgaW50byB0aGUgZW5kIG9mIHRoZSBlbGVtZW50cyBsaXN0LlxuICAgICAqIEBwYXJhbSBxdWVzdGlvblR5cGUgdGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6IFwidGV4dFwiLCBcImNoZWNrYm94XCIsIFwiZHJvcGRvd25cIiwgXCJtYXRyaXhcIiwgXCJodG1sXCIsIFwibWF0cml4ZHluYW1pY1wiLCBcIm1hdHJpeGRyb3Bkb3duXCIgYW5kIHNvIG9uLlxuICAgICAqIEBwYXJhbSBuYW1lIGEgcXVlc3Rpb24gbmFtZVxuICAgICAqL1xuICAgIHB1YmxpYyBhZGROZXdRdWVzdGlvbihxdWVzdGlvblR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nID0gbnVsbCk6IFF1ZXN0aW9uQmFzZSB7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5jcmVhdGVRdWVzdGlvbihxdWVzdGlvblR5cGUsIG5hbWUpO1xuICAgICAgICB0aGlzLmFkZFF1ZXN0aW9uKHF1ZXN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHF1ZXN0aW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHBhbmVsIGFuZCBhZGRzIGl0IGludG8gdGhlIGVuZCBvZiB0aGUgZWxlbWVudHMgbGlzdC5cbiAgICAgKiBAcGFyYW0gbmFtZSBhIHBhbmVsIG5hbWVcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkTmV3UGFuZWwobmFtZTogc3RyaW5nID0gbnVsbCk6IFBhbmVsTW9kZWwge1xuICAgICAgICB2YXIgcGFuZWwgPSB0aGlzLmNyZWF0ZU5ld1BhbmVsKG5hbWUpO1xuICAgICAgICB0aGlzLmFkZFBhbmVsKHBhbmVsKTtcbiAgICAgICAgcmV0dXJuIHBhbmVsO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgY3JlYXRlTmV3UGFuZWwobmFtZTogc3RyaW5nKTogUGFuZWxNb2RlbCB7XG4gICAgICAgIHJldHVybiBuZXcgUGFuZWxNb2RlbChuYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFuIGVsZW1lbnQgKFBhbmVsIG9yIFF1ZXN0aW9uKSBmcm9tIHRoZSBlbGVtZW50cyBsaXN0LlxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqIEBzZWUgZWxlbWVudHNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCk7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgICAgIGlmKHRoaXMuZWxlbWVudHNbaV0ucmVtb3ZlRWxlbWVudChlbGVtZW50KSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbGVtZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHF1ZXN0aW9uICBmcm9tIHRoZSBlbGVtZW50cyBsaXN0LlxuICAgICAqIEBwYXJhbSBxdWVzdGlvbiBcbiAgICAgKiBAc2VlIGVsZW1lbnRzXG4gICAgICogQHNlZSByZW1vdmVFbGVtZW50XG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVF1ZXN0aW9uKHF1ZXN0aW9uOiBRdWVzdGlvbkJhc2UpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFbGVtZW50KHF1ZXN0aW9uKTtcbiAgICB9XG4gICAgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRzW2ldLnJ1bkNvbmRpdGlvbih2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy52aXNpYmxlSWYpIHJldHVybjtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmRpdGlvblJ1bm5lcikgdGhpcy5jb25kaXRpb25SdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMudmlzaWJsZUlmKTtcbiAgICAgICAgdGhpcy5jb25kaXRpb25SdW5uZXIuZXhwcmVzc2lvbiA9IHRoaXMudmlzaWJsZUlmO1xuICAgICAgICB0aGlzLnZpc2libGUgPSB0aGlzLmNvbmRpdGlvblJ1bm5lci5ydW4odmFsdWVzKTtcbiAgICB9XG4gICAgb25Mb2NhbGVDaGFuZ2VkKCkge1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudHNbaV0ub25Mb2NhbGVDaGFuZ2VkKClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvY1RpdGxlLm9uQ2hhbmdlZCgpO1xuICAgIH1cbiAgICBvbkFueVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRzW2ldLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0aXRsZVZhbHVlID0gdGhpcy5sb2NUaXRsZS50ZXh0O1xuICAgICAgICBpZighdGl0bGVWYWx1ZSkgcmV0dXJuOyBcbiAgICAgICAgaWYodGl0bGVWYWx1ZS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluZGV4T2YoJ3snICsgbmFtZS50b0xvd2VyQ2FzZSgpKSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmxvY1RpdGxlLm9uQ2hhbmdlZCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEEgY29udGFpbmVyIGVsZW1lbnQsIHNpbWlsYXIgdG8gdGhlIFBhZ2Ugb2JqZWN0cy4gSG93ZXZlciwgdW5saWtlIHRoZSBQYWdlLCBQYW5lbCBjYW4ndCBiZSBhIHJvb3QuIFxuICogSXQgbWF5IGNvbnRhaW4gcXVlc3Rpb25zIGFuZCBvdGhlciBwYW5lbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYW5lbE1vZGVsIGV4dGVuZHMgUGFuZWxNb2RlbEJhc2UgaW1wbGVtZW50cyBJRWxlbWVudCB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZyA9IFwiXCIpIHtcbiAgICAgICAgc3VwZXIobmFtZSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7IHJldHVybiBcInBhbmVsXCI7IH1cbiAgICBwdWJsaWMgZ2V0IGlzUGFuZWwoKTogYm9vbGVhbiB7IHJldHVybiB0cnVlOyB9XG4gICAgLyoqXG4gICAgICogVGhlIFBhbmVsIHdpZHRoLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgd2lkdGgoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIndpZHRoXCIpOyB9XG4gICAgcHVibGljIHNldCB3aWR0aCh2YWw6IHN0cmluZykgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiLCB2YWwpOyB9XG4gICAgLyoqXG4gICAgICogVGhlIGlubmVyIGluZGVudC4gU2V0IHRoaXMgcHJvcGVydHkgdG8gaW5jcmVhc2UgdGhlIHBhbmVsIGNvbnRlbnQgbWFyZ2luLiBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlubmVySW5kZW50KCk6IG51bWJlciB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbm5lckluZGVudFwiLCAwKTsgfVxuICAgIHB1YmxpYyBzZXQgaW5uZXJJbmRlbnQodmFsOiBudW1iZXIpIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW5uZXJJbmRlbnRcIiwgdmFsKTsgfVxuICAgIGdldCByZW5kZXJXaWR0aCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyV2lkdGhcIik7IH1cbiAgICBzZXQgcmVuZGVyV2lkdGgodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyV2lkdGhcIiwgdmFsKTsgfVxuICAgIC8qKlxuICAgICAqIFRoZSBQYW5lbCByZW5kZXJzIG9uIHRoZSBuZXcgbGluZSBpZiB0aGUgcHJvcGVydHkgaXMgdHJ1ZS4gSWYgdGhlIHByb3BlcnR5IGlzIGZhbHNlLCB0aGUgcGFuZWwgdHJpZXMgdG8gcmVuZGVyIG9uIHRoZSBzYW1lIGxpbmUvcm93IHdpdGggYSBwcmV2aW91cyBxdWVzdGlvbi9wYW5lbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHN0YXJ0V2l0aE5ld0xpbmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdGFydFdpdGhOZXdMaW5lXCIsIHRydWUpOyB9XG4gICAgcHVibGljIHNldCBzdGFydFdpdGhOZXdMaW5lKHZhbHVlOiBib29sZWFuKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0YXJ0V2l0aE5ld0xpbmVcIiwgdmFsdWUpOyB9XG4gICAgLyoqXG4gICAgICogVGhlIHJpZ2h0IGluZGVudCBvZiB0aGUgUGFuZWwuXG4gICAgICovXG4gICAgcHVibGljIGdldCByaWdodEluZGVudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmlnaHRJbmRlbnRcIiwgMCk7IH1cbiAgICBwdWJsaWMgc2V0IHJpZ2h0SW5kZW50KHZhbDogbnVtYmVyKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJpZ2h0SW5kZW50XCIsIHZhbCk7IH1cbiAgICBwcm90ZWN0ZWQgb25WaXNpYmxlQ2hhbmdlZCgpIHtcbiAgICAgICAgc3VwZXIub25WaXNpYmxlQ2hhbmdlZCgpO1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgdGhpcy5pc1Zpc2libGUpO1xuICAgICAgICBpZiAodGhpcy5zdXJ2ZXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zdXJ2ZXkucGFuZWxWaXNpYmlsaXR5Q2hhbmdlZCh0aGlzLCB0aGlzLnZpc2libGUpO1xuICAgICAgICB9XG4gICAgIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcInBhbmVsYmFzZVwiLCBbXCJuYW1lXCIsICB7IG5hbWU6IFwiZWxlbWVudHNcIiwgYWx0ZXJuYXRpdmVOYW1lOiBcInF1ZXN0aW9uc1wiLCBiYXNlQ2xhc3NOYW1lOiBcInF1ZXN0aW9uXCIsIHZpc2libGU6IGZhbHNlIH0sXG57IG5hbWU6IFwidmlzaWJsZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSwgXCJ2aXNpYmxlSWY6Y29uZGl0aW9uXCIsIFxueyBuYW1lOiBcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLCBkZWZhdWx0OiBcImRlZmF1bHRcIiwgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIl0gfSxcbnsgbmFtZTogXCJ0aXRsZTp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUaXRsZVwiIH0sXG57IG5hbWU6IFwiZGVzY3JpcHRpb246dGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jRGVzY3JpcHRpb25cIiB9XSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFBhbmVsTW9kZWxCYXNlKCk7IH0pO1xuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwicGFuZWxcIiwgWyB7IG5hbWU6IFwic3RhcnRXaXRoTmV3TGluZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWV9LCB7bmFtZTogXCJpbm5lckluZGVudDpudW1iZXJcIiwgZGVmYXVsdDogMCwgY2hvaWNlczogWzAsIDEsIDIsIDNdfV0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBQYW5lbE1vZGVsKCk7IH0sIFwicGFuZWxiYXNlXCIpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wYW5lbC50cyIsImltcG9ydCB7SnNvbk9iamVjdCwgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb259IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7UXVlc3Rpb259IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQge0hhc2hUYWJsZSwgSGVscGVyc30gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHtCYXNlLCBJU3VydmV5RGF0YSwgSVN1cnZleSwgSVN1cnZleUltcGwsIElUZXh0UHJvY2Vzc29yLCBTdXJ2ZXlFcnJvcn0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHtUZXh0UHJlUHJvY2Vzc29yfSBmcm9tIFwiLi90ZXh0UHJlUHJvY2Vzc29yXCI7XG5pbXBvcnQge1Byb2Nlc3NWYWx1ZX0gZnJvbSBcIi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XG5pbXBvcnQge0l0ZW1WYWx1ZX0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQge3N1cnZleUxvY2FsaXphdGlvbn0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHtRdWVzdGlvblNlbGVjdEJhc2UsIFF1ZXN0aW9uQ2hlY2tib3hCYXNlfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5pbXBvcnQge1F1ZXN0aW9uRHJvcGRvd25Nb2RlbH0gZnJvbSBcIi4vcXVlc3Rpb25fZHJvcGRvd25cIjtcbmltcG9ydCB7UXVlc3Rpb25DaGVja2JveE1vZGVsfSBmcm9tIFwiLi9xdWVzdGlvbl9jaGVja2JveFwiO1xuaW1wb3J0IHtRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbH0gZnJvbSBcIi4vcXVlc3Rpb25fcmFkaW9ncm91cFwiO1xuaW1wb3J0IHtRdWVzdGlvblRleHRNb2RlbH0gZnJvbSBcIi4vcXVlc3Rpb25fdGV4dFwiO1xuaW1wb3J0IHtRdWVzdGlvbkNvbW1lbnRNb2RlbH0gZnJvbSBcIi4vcXVlc3Rpb25fY29tbWVudFwiO1xuaW1wb3J0IHtRdWVzdGlvbkJvb2xlYW5Nb2RlbH0gZnJvbSBcIi4vcXVlc3Rpb25fYm9vbGVhblwiO1xuaW1wb3J0IHtDaG9pY2VzUmVzdGZ1bGx9IGZyb20gXCIuL2Nob2ljZXNSZXN0ZnVsbFwiO1xuaW1wb3J0IHtRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHtJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmd9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQge1N1cnZleVZhbGlkYXRvcn0gZnJvbSBcIi4vdmFsaWRhdG9yXCI7XG5pbXBvcnQge0N1c3RvbVdpZGdldENvbGxlY3Rpb259IGZyb20gXCIuL3F1ZXN0aW9uQ3VzdG9tV2lkZ2V0c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNYXRyaXhEcm9wZG93bkRhdGEge1xuICAgIG9uUm93Q2hhbmdlZChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLCBjb2x1bW5OYW1lOiBzdHJpbmcsIG5ld1Jvd1ZhbHVlOiBhbnkpO1xuICAgIHZhbGlkYXRlQ2VsbChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLCBjb2x1bW5OYW1lOiBzdHJpbmcsIHJvd1ZhbHVlOiBhbnkpOiBTdXJ2ZXlFcnJvcjtcbiAgICBjb2x1bW5zOiBBcnJheTxNYXRyaXhEcm9wZG93bkNvbHVtbj47XG4gICAgY3JlYXRlUXVlc3Rpb24ocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSwgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IFF1ZXN0aW9uO1xuICAgIGdldExvY2FsZSgpOiBzdHJpbmc7XG4gICAgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZztcbiAgICBnZXRTdXJ2ZXkoKTogSVN1cnZleTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTWF0cml4Q29sdW1uT3duZXIgZXh0ZW5kcyBJTG9jYWxpemFibGVPd25lciB7XG4gICAgZ2V0UmVxdWlyZWRUZXh0KCk6IHN0cmluZztcbiAgICBvbkNvbHVtblByb3BlcnRpZXNDaGFuZ2VkKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pO1xufVxuXG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25Db2x1bW4gZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgSUxvY2FsaXphYmxlT3duZXIge1xuICAgIHByaXZhdGUgY2hvaWNlc1ZhbHVlOiBBcnJheTxJdGVtVmFsdWU+O1xuICAgIHB1YmxpYyBjaG9pY2VzQnlVcmw6IENob2ljZXNSZXN0ZnVsbDtcbiAgICBwdWJsaWMgY29sT3duZXI6IElNYXRyaXhDb2x1bW5Pd25lciA9IG51bGw7XG4gICAgcHVibGljIHZhbGlkYXRvcnM6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4gPSBuZXcgQXJyYXk8U3VydmV5VmFsaWRhdG9yPigpO1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdGl0bGU6IHN0cmluZyA9IG51bGwpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5jaG9pY2VzVmFsdWUgPSB0aGlzLmNyZWF0ZUl0ZW1WYWx1ZXMoXCJjaG9pY2VzXCIpO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciBsb2NUaXRsZVZhbHVlID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInRpdGxlXCIsIHRoaXMsIHRydWUpO1xuICAgICAgICBsb2NUaXRsZVZhbHVlLm9uUmVuZGVyZWRIdG1sQ2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7IHJldHVybiBzZWxmLmdldEZ1bGxUaXRsZSh0ZXh0KTsgfTtcbiAgICAgICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIsIHRoaXMpO1xuICAgICAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGxhY2VIb2xkZXJcIiwgdGhpcyk7XG4gICAgICAgIHRoaXMuY2hvaWNlc0J5VXJsID0gbmV3IENob2ljZXNSZXN0ZnVsbCgpO1xuICAgICAgICBpZih0aXRsZSkgdGhpcy50aXRsZSA9IHRpdGxlO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VHlwZSgpIHsgcmV0dXJuIFwibWF0cml4ZHJvcGRvd25jb2x1bW5cIiB9XG4gICAgcHVibGljIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibmFtZVwiKTsgfVxuICAgIHB1YmxpYyBzZXQgbmFtZSh2YWw6IHN0cmluZykgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJuYW1lXCIsIHZhbCk7IH1cblxuICAgIHB1YmxpYyBnZXQgY2hvaWNlc09yZGVyKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzT3JkZXJcIiwgXCJub25lXCIpOyB9XG4gICAgcHVibGljIHNldCBjaG9pY2VzT3JkZXIodmFsOiBzdHJpbmcpIHtcbiAgICAgICAgdmFsID0gdmFsLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNPcmRlclwiLCB2YWwpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGlucHV0VHlwZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW5wdXRUeXBlXCIsIFwidGV4dFwiKTsgfVxuICAgIHB1YmxpYyBzZXQgaW5wdXRUeXBlKHZhbDogc3RyaW5nKSB7XG4gICAgICAgIHZhbCA9IHZhbC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbnB1dFR5cGVcIiwgdmFsKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBjZWxsVHlwZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2VsbFR5cGVcIiwgXCJkZWZhdWx0XCIpOyB9XG4gICAgcHVibGljIHNldCBjZWxsVHlwZSh2YWw6IHN0cmluZykge1xuICAgICAgICB2YWwgPSB2YWwudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2VsbFR5cGVcIiwgdmFsKTtcbiAgICB9XG4gICAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0aXRsZVwiLCB0aGlzLm5hbWUpOyB9XG4gICAgcHVibGljIHNldCB0aXRsZSh2YWw6IHN0cmluZykgeyB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRpdGxlXCIsIHZhbCk7IH1cbiAgICBwdWJsaWMgZ2V0IGxvY1RpdGxlKCkgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInRpdGxlXCIpOyB9XG4gICAgcHVibGljIGdldCBmdWxsVGl0bGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0RnVsbFRpdGxlKHRoaXMubG9jVGl0bGUudGV4dE9ySHRtbCk7IH1cbiAgICBwdWJsaWMgZ2V0RnVsbFRpdGxlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYoIXN0cikgc3RyID0gdGhpcy5uYW1lO1xuICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKSB7XG4gICAgICAgICAgICB2YXIgcmVxdWlyZVRleHQgPSB0aGlzLmNvbE93bmVyPyB0aGlzLmNvbE93bmVyLmdldFJlcXVpcmVkVGV4dCgpIDogXCJcIjtcbiAgICAgICAgICAgIGlmIChyZXF1aXJlVGV4dCkgcmVxdWlyZVRleHQgKz0gXCIgXCI7XG4gICAgICAgICAgICBzdHIgPSByZXF1aXJlVGV4dCArIHN0cjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IG9wdGlvbnNDYXB0aW9uKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm9wdGlvbnNDYXB0aW9uXCIpOyB9XG4gICAgcHVibGljIHNldCBvcHRpb25zQ2FwdGlvbih2YWw6IHN0cmluZykgeyB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm9wdGlvbnNDYXB0aW9uXCIsIHZhbCk7fVxuICAgIHB1YmxpYyBnZXQgbG9jT3B0aW9uc0NhcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIpOyB9XG4gICAgcHVibGljIGdldCBwbGFjZUhvbGRlcigpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwbGFjZUhvbGRlclwiKTsgfVxuICAgIHB1YmxpYyBzZXQgcGxhY2VIb2xkZXIodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwbGFjZUhvbGRlclwiLCB2YWwpOyB9XG4gICAgcHVibGljIGdldCBsb2NQbGFjZUhvbGRlcigpOiBMb2NhbGl6YWJsZVN0cmluZyB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicGxhY2VIb2xkZXJcIik7IH1cblxuICAgIHB1YmxpYyBnZXQgY2hvaWNlcygpOiBBcnJheTxhbnk+IHsgcmV0dXJuIHRoaXMuY2hvaWNlc1ZhbHVlOyB9XG4gICAgcHVibGljIHNldCBjaG9pY2VzKG5ld1ZhbHVlOiBBcnJheTxhbnk+KSB7ICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzXCIsIG5ld1ZhbHVlKTsgfVxuICAgIHB1YmxpYyBnZXQgY29sQ291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbENvdW50XCIsIC0xKTsgfVxuICAgIHB1YmxpYyBzZXQgY29sQ291bnQodmFsOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHZhbCA8IC0xIHx8IHZhbCA+IDQpIHJldHVybjtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sQ291bnRcIiwgdmFsKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBpc1JlcXVpcmVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNSZXF1aXJlZFwiLCBmYWxzZSk7IH1cbiAgICBwdWJsaWMgc2V0IGlzUmVxdWlyZWQodmFsOiBib29sZWFuKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzUmVxdWlyZWRcIiwgdmFsKTsgfVxuICAgIHB1YmxpYyBnZXQgaGFzT3RoZXIoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJoYXNPdGhlclwiLCBmYWxzZSk7IH1cbiAgICBwdWJsaWMgc2V0IGhhc090aGVyKHZhbDogYm9vbGVhbikgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJoYXNPdGhlclwiLCB2YWwpOyB9XG4gICAgcHVibGljIGdldCBtaW5XaWR0aCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWluV2lkdGhcIiwgXCJcIik7IH1cbiAgICBwdWJsaWMgc2V0IG1pbldpZHRoKHZhbDogc3RyaW5nKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pbldpZHRoXCIsIHZhbCk7IH1cbiAgICBwdWJsaWMgZ2V0IHZpc2libGVJZigpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUlmXCIsIFwiXCIpOyB9XG4gICAgcHVibGljIHNldCB2aXNpYmxlSWYodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUlmXCIsIHZhbCk7IH1cblxuICAgIHB1YmxpYyBnZXQgYm9vbGVhbkRlZmF1bHRWYWx1ZSgpOiBhbnkgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYm9vbGVhbkRlZmF1bHRWYWx1ZVwiLCBcImluZGV0ZXJtaW5hdGVcIik7IH1cbiAgICBwdWJsaWMgc2V0IGJvb2xlYW5EZWZhdWx0VmFsdWUodmFsOiBhbnkpIHtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYm9vbGVhbkRlZmF1bHRWYWx1ZVwiLCB2YWwpO1xuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgZ2V0TG9jYWxlKCkgOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5jb2xPd25lciA/IHRoaXMuY29sT3duZXIuZ2V0TG9jYWxlKCkgOiBcIlwiOyB9XG4gICAgcHVibGljIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcpICB7IHJldHVybiB0aGlzLmNvbE93bmVyID8gdGhpcy5jb2xPd25lci5nZXRNYXJrZG93bkh0bWwodGV4dCkgOiBudWxsOyB9XG4gICAgcHJvdGVjdGVkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZywgb2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSkge1xuICAgICAgICBzdXBlci5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgICBpZih0aGlzLmNvbE93bmVyICE9IG51bGwgJiYgIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29sT3duZXIub25Db2x1bW5Qcm9wZXJ0aWVzQ2hhbmdlZCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duQ2VsbCB7XG4gICAgcHJpdmF0ZSBxdWVzdGlvblZhbHVlOiBRdWVzdGlvbjtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbiwgcHVibGljIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsIHB1YmxpYyBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhKSB7XG4gICAgICAgIHRoaXMucXVlc3Rpb25WYWx1ZSA9IGRhdGEuY3JlYXRlUXVlc3Rpb24odGhpcy5yb3csIHRoaXMuY29sdW1uKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvblZhbHVlLnZhbGlkYXRlVmFsdWVDYWxsYmFjayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gZGF0YS52YWxpZGF0ZUNlbGwocm93LCBjb2x1bW4ubmFtZSwgcm93LnZhbHVlKTsgfVxuICAgICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5nZXRQcm9wZXJ0aWVzKGNvbHVtbi5nZXRUeXBlKCkpLmZvckVhY2gocHJvcGVydHkgPT4ge1xuICAgICAgICAgICAgbGV0IHByb3BlcnR5TmFtZSA9IHByb3BlcnR5Lm5hbWU7XG4gICAgICAgICAgICBpZihjb2x1bW5bcHJvcGVydHlOYW1lXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMucXVlc3Rpb25WYWx1ZS5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5TmFtZSwgbnVsbCkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb25WYWx1ZVtwcm9wZXJ0eU5hbWVdID0gY29sdW1uW3Byb3BlcnR5TmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3Qua2V5cyhjb2x1bW4pLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucXVlc3Rpb25WYWx1ZS51cGRhdGVDdXN0b21XaWRnZXQoKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbiB7IHJldHVybiB0aGlzLnF1ZXN0aW9uVmFsdWU7IH1cbiAgICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7IHJldHVybiB0aGlzLnF1ZXN0aW9uLnZhbHVlOyB9XG4gICAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMucXVlc3Rpb24udmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgICAgIHRoaXMucXVlc3Rpb24ucnVuQ29uZGl0aW9uKHZhbHVlcyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UgaW1wbGVtZW50cyBJU3VydmV5RGF0YSwgSVN1cnZleUltcGwsIElMb2NhbGl6YWJsZU93bmVyLCBJVGV4dFByb2Nlc3NvciB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaWRDb3VudGVyOiBudW1iZXIgPSAxO1xuICAgIHByaXZhdGUgc3RhdGljIGdldElkKCk6IHN0cmluZyB7IHJldHVybiBcInNyb3dfXCIgKyBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZS5pZENvdW50ZXIrKzsgfVxuICAgIHByb3RlY3RlZCBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhO1xuICAgIHByaXZhdGUgcm93VmFsdWVzOiBIYXNoVGFibGU8YW55PiA9IHt9O1xuICAgIHByaXZhdGUgaXNTZXR0aW5nVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIGlkVmFsdWU6IHN0cmluZztcbiAgICBwcml2YXRlIHRleHRQcmVQcm9jZXNzb3IgPSBuZXcgVGV4dFByZVByb2Nlc3NvcigpO1xuICAgIFxuICAgIHB1YmxpYyBjZWxsczogQXJyYXk8TWF0cml4RHJvcGRvd25DZWxsPiA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YSwgdmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMudGV4dFByZVByb2Nlc3NvciA9IG5ldyBUZXh0UHJlUHJvY2Vzc29yKCk7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yLm9uSGFzVmFsdWUgPSBmdW5jdGlvbiAobmFtZTogc3RyaW5nKSB7IHJldHVybiBzZWxmLmhhc1Byb2Nlc3NlZFRleHRWYWx1ZShuYW1lKTsgfTtcbiAgICAgICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yLm9uUHJvY2VzcyA9IGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbikgeyByZXR1cm4gc2VsZi5nZXRQcm9jZXNzZWRUZXh0VmFsdWUobmFtZSwgcmV0dXJuRGlzcGxheVZhbHVlKTsgfTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYodGhpcy5yb3dWYWx1ZXNbdGhpcy5kYXRhLmNvbHVtbnNbaV0ubmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucm93VmFsdWVzW3RoaXMuZGF0YS5jb2x1bW5zW2ldLm5hbWVdID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlkVmFsdWUgPSBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZS5nZXRJZCgpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmlkVmFsdWU7IH1cbiAgICBwdWJsaWMgZ2V0IHJvd05hbWUoKSB7IHJldHVybiBudWxsOyB9XG4gICAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkgeyByZXR1cm4gdGhpcy5yb3dWYWx1ZXM7IH1cbiAgICBnZXRBbGxWYWx1ZXMoKSA6IGFueSB7IHJldHVybiB0aGlzLnZhbHVlOyB9XG4gICAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuaXNTZXR0aW5nVmFsdWUgPSB0cnVlO1xuICAgICAgICB0aGlzLnJvd1ZhbHVlcyA9IHt9O1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3dWYWx1ZXNba2V5XSA9IHZhbHVlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmNlbGxzW2ldLnF1ZXN0aW9uLm9uU3VydmV5VmFsdWVDaGFuZ2VkKHRoaXMuZ2V0VmFsdWUodGhpcy5jZWxsc1tpXS5jb2x1bW4ubmFtZSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNTZXR0aW5nVmFsdWUgPSBmYWxzZTtcbiAgICB9XG4gICAgcHVibGljIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWUgOiBzdHJpbmcpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmNlbGxzW2ldLnF1ZXN0aW9uLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBnZXRWYWx1ZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dWYWx1ZXNbbmFtZV07XG4gICAgfVxuICAgIHB1YmxpYyBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTZXR0aW5nVmFsdWUpIHJldHVybjtcbiAgICAgICAgaWYgKG5ld1ZhbHVlID09PSBcIlwiKSBuZXdWYWx1ZSA9IG51bGw7XG4gICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJvd1ZhbHVlc1tuYW1lXSA9IG5ld1ZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucm93VmFsdWVzW25hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YS5vblJvd0NoYW5nZWQodGhpcywgbmFtZSwgdGhpcy52YWx1ZSk7XG4gICAgICAgIHRoaXMub25BbnlWYWx1ZUNoYW5nZWQoXCJyb3dcIik7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRDb21tZW50KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLmdldFZhbHVlKG5hbWUgKyBCYXNlLmNvbW1lbnRQcmVmaXgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID8gcmVzdWx0IDogXCJcIjtcbiAgICB9XG4gICAgcHVibGljIHNldENvbW1lbnQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2V0VmFsdWUobmFtZSArIEJhc2UuY29tbWVudFByZWZpeCwgbmV3VmFsdWUpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGlzRW1wdHkoKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgICAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiB2YWwpIHtcbiAgICAgICAgICAgIGlmICh2YWxba2V5XSAhPT0gdW5kZWZpbmVkICYmIHZhbFtrZXldICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRRdWVzdGlvbkJ5Q29sdW1uKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pIHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICBpZih0aGlzLmNlbGxzW2ldLmNvbHVtbiA9PSBjb2x1bW4pIHJldHVybiB0aGlzLmNlbGxzW2ldLnF1ZXN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0TG9jYWxlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0TG9jYWxlKCkgOiBcIlwiO31cbiAgICBwdWJsaWMgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZykgIHsgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRNYXJrZG93bkh0bWwodGV4dCkgOiBudWxsOyB9XG4gICAgcHVibGljIG9uTG9jYWxlQ2hhbmdlZCgpIHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICB0aGlzLmNlbGxzW2ldLnF1ZXN0aW9uLm9uTG9jYWxlQ2hhbmdlZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgICAgICB2YWx1ZXNbXCJyb3dcIl0gPSB0aGlzLnZhbHVlO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIHRoaXMuY2VsbHNbaV0ucnVuQ29uZGl0aW9uKHZhbHVlcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIGJ1aWxkQ2VsbHMoKSB7XG4gICAgICAgIHZhciBjb2x1bW5zID0gdGhpcy5kYXRhLmNvbHVtbnM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNvbHVtbiA9IGNvbHVtbnNbaV07XG4gICAgICAgICAgICB0aGlzLmNlbGxzLnB1c2godGhpcy5jcmVhdGVDZWxsKGNvbHVtbikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb3RlY3RlZCBjcmVhdGVDZWxsKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBNYXRyaXhEcm9wZG93bkNlbGwge1xuICAgICAgICByZXR1cm4gbmV3IE1hdHJpeERyb3Bkb3duQ2VsbChjb2x1bW4sIHRoaXMsIHRoaXMuZGF0YSk7XG4gICAgfVxuICAgIGdlU3VydmV5RGF0YSgpOiBJU3VydmV5RGF0YSB7IHJldHVybiB0aGlzOyB9XG4gICAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkgeyByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldFN1cnZleSgpIDogbnVsbDsgfVxuICAgIC8vSVRleHRQcm9jZXNzb3IgXG4gICAgcHJpdmF0ZSBoYXNQcm9jZXNzZWRUZXh0VmFsdWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHZhciBmaXJzdE5hbWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCkuZ2V0Rmlyc3ROYW1lKG5hbWUpO1xuICAgICAgICByZXR1cm4gZmlyc3ROYW1lID09IFwicm93XCI7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlKG5hbWU6IHN0cmluZywgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIC8vbmFtZSBzaG91bGQgc3RhcnQgd2l0aCB0aGUgcm93XG4gICAgICAgIHZhciB2YWx1ZXMgPSB7cm93OiB0aGlzLnZhbHVlfTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRWYWx1ZShuYW1lLCB2YWx1ZXMpO1xuICAgIH1cbiAgICBnZXRUZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yIHsgcmV0dXJuIHRoaXM7IH1cbiAgICBwcm9jZXNzVGV4dCh0ZXh0OiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgICAgIHRleHQgPSB0aGlzLnRleHRQcmVQcm9jZXNzb3IucHJvY2Vzcyh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdXJ2ZXkoKS5wcm9jZXNzVGV4dCh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUpO1xuICAgIH1cbiAgICBwcm9jZXNzVGV4dEV4KHRleHQ6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIHRleHQgPSB0aGlzLnByb2Nlc3NUZXh0KHRleHQsIHRydWUpO1xuICAgICAgICB2YXIgaGFzQWxsVmFsdWVzT25MYXN0UnVuID0gdGhpcy50ZXh0UHJlUHJvY2Vzc29yLmhhc0FsbFZhbHVlc09uTGFzdFJ1bjtcbiAgICAgICAgdmFyIHJlcyA9IHRoaXMuZ2V0U3VydmV5KCkucHJvY2Vzc1RleHRFeCh0ZXh0KTtcbiAgICAgICAgcmVzLmhhc0FsbFZhbHVlc09uTGFzdFJ1biA9IHJlcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW4gJiYgaGFzQWxsVmFsdWVzT25MYXN0UnVuO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgZm9yIG1hdHJpeCBkcm9wZG93biBhbmQgbWF0cml4IGR5bmFtaWMgcXVlc3Rpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZSBleHRlbmRzIFF1ZXN0aW9uIGltcGxlbWVudHMgSU1hdHJpeERyb3Bkb3duRGF0YSB7XG4gICAgcHVibGljIHN0YXRpYyAgYWRkRGVmYXVsdENvbHVtbnMobWF0cml4OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlKSB7XG4gICAgICAgIHZhciBjb2xOYW1lcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q29sdW1zO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgY29sTmFtZXMubGVuZ3RoOyBpICsrKVxuICAgICAgICAgICAgbWF0cml4LmFkZENvbHVtbihjb2xOYW1lc1tpXSk7XG4gICAgfVxuICAgIHByaXZhdGUgY29sdW1uc1ZhbHVlOiBBcnJheTxNYXRyaXhEcm9wZG93bkNvbHVtbj47XG4gICAgcHJpdmF0ZSBjaG9pY2VzVmFsdWU6IEFycmF5PEl0ZW1WYWx1ZT47XG4gICAgcHJpdmF0ZSBpc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIGdlbmVyYXRlZFZpc2libGVSb3dzOiBBcnJheTxNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZT4gPSBudWxsO1xuICAgIGNvbHVtbnNDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gICAgdXBkYXRlQ2VsbHNDYWxsYmFjazogKCkgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIobmFtZSk7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy5jb2x1bW5zVmFsdWUgPSB0aGlzLmNyZWF0ZU5ld0FycmF5KFwiY29sdW1uc1wiLCBmdW5jdGlvbihpdGVtKSB7aXRlbS5jb2xPd25lciA9IHNlbGY7fSApO1xuICAgICAgICB0aGlzLmNob2ljZXNWYWx1ZSA9IHRoaXMuY3JlYXRlSXRlbVZhbHVlcyhcImNob2ljZXNcIik7XG4gICAgICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJvcHRpb25zQ2FwdGlvblwiLCB0aGlzKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImNvbHVtbnNcIiwgZnVuY3Rpb24oKSB7c2VsZi5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IG51bGw7IHNlbGYuZmlyZUNhbGxiYWNrKHNlbGYuY29sdW1uc0NoYW5nZWRDYWxsYmFjayk7IH0pO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJtYXRyaXhkcm9wZG93bmJhc2VcIjtcbiAgICB9XG4gICAgcHVibGljIGdldCBpc0FsbG93VGl0bGVMZWZ0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIG1hdHJpeCBjb2x1bW5zLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29sdW1ucygpOiBBcnJheTxNYXRyaXhEcm9wZG93bkNvbHVtbj4geyByZXR1cm4gdGhpcy5jb2x1bW5zVmFsdWU7IH1cbiAgICBwdWJsaWMgc2V0IGNvbHVtbnModmFsdWU6IEFycmF5PE1hdHJpeERyb3Bkb3duQ29sdW1uPikge1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5zXCIsIHZhbHVlKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIG9uTWF0cml4Um93Q3JlYXRlZChyb3cgOiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSkge1xuICAgICAgICBpZighdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7cm93VmFsdWU6IHJvdy52YWx1ZSwgcm93OiByb3csIGNvbHVtbjogbnVsbCwgY29sdW1uTmFtZTogbnVsbCwgY2VsbDogbnVsbCwgY2VsbFF1ZXN0aW9uOiBudWxsLCB2YWx1ZTogbnVsbH07XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICBvcHRpb25zLmNvbHVtbiA9IHRoaXMuY29sdW1uc1tpXTtcbiAgICAgICAgICAgIG9wdGlvbnMuY29sdW1uTmFtZSA9IG9wdGlvbnMuY29sdW1uLm5hbWU7XG4gICAgICAgICAgICB2YXIgY2VsbCA9IHJvdy5jZWxsc1tpXTtcbiAgICAgICAgICAgIG9wdGlvbnMuY2VsbCA9IGNlbGw7XG4gICAgICAgICAgICBvcHRpb25zLmNlbGxRdWVzdGlvbiA9IGNlbGwucXVlc3Rpb247XG4gICAgICAgICAgICBvcHRpb25zLnZhbHVlID0gY2VsbC52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuc3VydmV5Lm1hdHJpeENlbGxDcmVhdGVkKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBjZWxsIHR5cGUuXG4gICAgICovXG4gICAgcHVibGljIGdldCBjZWxsVHlwZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2VsbFR5cGVcIiwgXCJkcm9wZG93blwiKTsgfVxuICAgIHB1YmxpYyBzZXQgY2VsbFR5cGUodmFsOiBzdHJpbmcpIHtcbiAgICAgICAgdmFsID0gdmFsLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0aGlzLmNlbGxUeXBlID09IHZhbCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjZWxsVHlwZVwiLCB2YWwpO1xuICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnVwZGF0ZUNlbGxzQ2FsbGJhY2spO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCBjb2x1bW4gY291bnQgZm9yIHJhZGlvZ3JvdXAgYW5kIGNoZWNrYm94ICBjZWxsIHR5cGVzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29sdW1uQ29sQ291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbkNvbENvdW50XCIsIDApOyB9XG4gICAgcHVibGljIHNldCBjb2x1bW5Db2xDb3VudCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiA0KSByZXR1cm47XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbkNvbENvdW50XCIsIHZhbHVlKTsgICAgICAgIFxuICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnVwZGF0ZUNlbGxzQ2FsbGJhY2spO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzZXQgdGhlIG1pbWltdW0gY29sdW1uIHdpZHRoLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29sdW1uTWluV2lkdGgoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbk1pbldpZHRoXCIsIFwiXCIpOyB9XG4gICAgcHVibGljIHNldCBjb2x1bW5NaW5XaWR0aCh2YWw6IHN0cmluZykgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5NaW5XaWR0aFwiLCB2YWwpOyB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSB0byBzaG93IHRoZSBob3Jpem9udGFsIHNjcm9sbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhvcml6b250YWxTY3JvbGwoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJob3Jpem9udGFsU2Nyb2xsXCIsIGZhbHNlKTsgfVxuICAgIHB1YmxpYyBzZXQgaG9yaXpvbnRhbFNjcm9sbCh2YWw6IGJvb2xlYW4pIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaG9yaXpvbnRhbFNjcm9sbFwiLCB2YWwpOyB9XG4gICAgXG4gICAgcHVibGljIGdldFJlcXVpcmVkVGV4dCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5yZXF1aXJlZFRleHQgOiBcIlwiOyB9XG4gICAgb25Db2x1bW5Qcm9wZXJ0aWVzQ2hhbmdlZChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKSB7XG4gICAgICAgIGlmKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm47XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgdmFyIHJvdyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV07XG4gICAgICAgICAgICBmb3IodmFyIGogPSAwOyBqIDwgcm93LmNlbGxzLmxlbmd0aDsgaiArKykge1xuICAgICAgICAgICAgICAgIGlmKHJvdy5jZWxsc1tqXS5jb2x1bW4gIT09IGNvbHVtbikgY29udGludWU7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRRdWVzdGlvblByb3BlcnRpZXMocm93LmNlbGxzW2pdLnF1ZXN0aW9uLCBjb2x1bW4sIHJvdyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMpO1xuICAgICAgICB0aGlzLnJ1bkNlbGxzQ29uZGl0aW9uKHZhbHVlcyk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBydW5DZWxsc0NvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgICAgIGlmKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm47XG4gICAgICAgIHZhciBuZXdWYWx1ZXMgPSB7fTtcbiAgICAgICAgaWYgKHZhbHVlcyAmJiB2YWx1ZXMgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3VmFsdWVzW1wicm93XCJdID0ge307XG4gICAgICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICByb3dzW2ldLnJ1bkNvbmRpdGlvbihuZXdWYWx1ZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBvbkxvY2FsZUNoYW5nZWQoKSB7XG4gICAgICAgIHN1cGVyLm9uTG9jYWxlQ2hhbmdlZCgpO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zW2ldLm9uTG9jYWxlQ2hhbmdlZCgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciByb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICAgICAgaWYoIXJvd3MpIHJldHVybjtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICByb3dzW2ldLm9uTG9jYWxlQ2hhbmdlZCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMudXBkYXRlQ2VsbHNDYWxsYmFjayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvbHVtbiBieSBpdCdzIG5hbWUuIFJldHVucyBudWxsIGlmIGEgY29sdW1uIHdpdGggdGhpcyBuYW1lIGRvZXNuJ3QgZXhpc3QuXG4gICAgICogQHBhcmFtIGNvbHVtbiBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29sdW1uTmFtZShjb2x1bW5OYW1lOiBzdHJpbmcpOiBNYXRyaXhEcm9wZG93bkNvbHVtbiB7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmKHRoaXMuY29sdW1uc1tpXS5uYW1lID09IGNvbHVtbk5hbWUpIHJldHVybiB0aGlzLmNvbHVtbnNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvbHVtbiB3aWR0aC5cbiAgICAgKiBAcGFyYW0gY29sdW1uIFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb2x1bW5XaWR0aChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbi5taW5XaWR0aCA/IGNvbHVtbi5taW5XaWR0aCA6IHRoaXMuY29sdW1uTWluV2lkdGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IGNob2ljZXMgZm9yIGRyb3Bkb3duLCBjaGVja2JveCBhbmQgcmFkaW9ncm91cCBjZWxsIHR5cGVzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2hvaWNlcygpOiBBcnJheTxhbnk+IHsgcmV0dXJuIHRoaXMuY2hvaWNlc1ZhbHVlOyB9XG4gICAgcHVibGljIHNldCBjaG9pY2VzKHZhbDogQXJyYXk8YW55Pikge1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzXCIsIHZhbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IG9wdGlvbnMgY2FwdGlvbiBmb3IgZHJvcGRvd24gY2VsbCB0eXBlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgb3B0aW9uc0NhcHRpb24oKSB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm9wdGlvbnNDYXB0aW9uXCIsICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3B0aW9uc0NhcHRpb25cIikpOyB9XG4gICAgcHVibGljIHNldCBvcHRpb25zQ2FwdGlvbih2YWw6IHN0cmluZykgeyB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm9wdGlvbnNDYXB0aW9uXCIsIHZhbCk7IH1cbiAgICBwdWJsaWMgZ2V0IGxvY09wdGlvbnNDYXB0aW9uKCkgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIpOyB9XG4gICAgcHVibGljIGFkZENvbHVtbihuYW1lOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcgPSBudWxsKTogTWF0cml4RHJvcGRvd25Db2x1bW4ge1xuICAgICAgICB2YXIgY29sdW1uID0gbmV3IE1hdHJpeERyb3Bkb3duQ29sdW1uKG5hbWUsIHRpdGxlKTtcbiAgICAgICAgdGhpcy5jb2x1bW5zVmFsdWUucHVzaChjb2x1bW4pO1xuICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSByb3dzIG1vZGVsIG9iamVjdHMgdGhhdCB1c2VkIGR1cmluZyByZW5kZXJpbmcuXG4gICAgICovXG4gICAgcHVibGljIGdldCB2aXNpYmxlUm93cygpOiBBcnJheTxNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZT4ge1xuICAgICAgICBpZih0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgICAgIGlmKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzID0gdGhpcy5nZW5lcmF0ZVJvd3MoKTtcbiAgICAgICAgICAgIGlmKHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMucnVuQ2VsbHNDb25kaXRpb24odGhpcy5kYXRhLmdldEFsbFZhbHVlcygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICB9XG4gICAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICAgICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSByb3cgdmFsdWUuIElmIHRoZSByb3cgdmFsdWUgaXMgZW1wdHksIHRoZSBvYmplY3QgaXMgZW1wdHk6IHt9LiBcbiAgICAgKiBAcGFyYW0gcm93SW5kZXggcm93IGluZGV4IGZyb20gMCB0byB2aXNpYmxlIHJvdyBjb3VudCAtIDEuXG4gICAgICovXG4gICAgcHVibGljIGdldFJvd1ZhbHVlKHJvd0luZGV4OiBudW1iZXIpIHtcbiAgICAgICAgaWYocm93SW5kZXggPCAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIHZpc1Jvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgICAgICBpZihyb3dJbmRleCA+PSB2aXNSb3dzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJvd1ZhbHVlQ29yZSh2aXNSb3dzW3Jvd0luZGV4XSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHJvdyB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gcm93SW5kZXggcm93IGluZGV4IGZyb20gMCB0byB2aXNpYmxlIHJvdyBjb3VudCAtIDEuXG4gICAgICogQHBhcmFtIHJvd1ZhbHVlIGFuIG9iamVjdCB7XCJjb2x1bW4gbmFtZVwiOiBjb2x1bW5WYWx1ZSwuLi4gfVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRSb3dWYWx1ZShyb3dJbmRleDogbnVtYmVyLCByb3dWYWx1ZTogYW55KSB7XG4gICAgICAgIGlmKHJvd0luZGV4IDwgMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciB2aXNSb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICAgICAgaWYocm93SW5kZXggPj0gdmlzUm93cy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgICB0aGlzLm9uUm93Q2hhbmdlZCh2aXNSb3dzW3Jvd0luZGV4XSwgXCJcIiwgcm93VmFsdWUpO1xuICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkKCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZW5lcmF0ZVJvd3MoKTogQXJyYXk8TWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2U+IHsgcmV0dXJuIG51bGw7IH1cbiAgICBwcm90ZWN0ZWQgY3JlYXRlTmV3VmFsdWUoY3VyVmFsdWU6IGFueSk6IGFueSB7IHJldHVybiAhY3VyVmFsdWUgPyB7fSA6IGN1clZhbHVlOyB9XG4gICAgcHJvdGVjdGVkIGdldFJvd1ZhbHVlQ29yZShyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLCBxdWVzdGlvblZhbHVlOiBhbnksIGNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlKTogYW55IHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHF1ZXN0aW9uVmFsdWVbcm93LnJvd05hbWVdID8gcXVlc3Rpb25WYWx1ZVtyb3cucm93TmFtZV0gOiBudWxsO1xuICAgICAgICBpZiAoIXJlc3VsdCAmJiBjcmVhdGUpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHt9O1xuICAgICAgICAgICAgcXVlc3Rpb25WYWx1ZVtyb3cucm93TmFtZV0gPSByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldFJvd0Rpc3BsYXlWYWx1ZShyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLCByb3dWYWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmNvbHVtbnNbaV07XG4gICAgICAgICAgICBpZihyb3dWYWx1ZVtjb2x1bW4ubmFtZV0pIHtcbiAgICAgICAgICAgICAgICByb3dWYWx1ZVtjb2x1bW4ubmFtZV0gPSByb3cuY2VsbHNbaV0ucXVlc3Rpb24uZGlzcGxheVZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dWYWx1ZTtcbiAgICB9ICAgIFxuICAgIHByb3RlY3RlZCBvbkJlZm9yZVZhbHVlQ2hhbmdlZCh2YWw6IGFueSkge1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzUm93Q2hhbmdpbmcpIHJldHVybjtcbiAgICAgICAgdGhpcy5vbkJlZm9yZVZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlKTtcbiAgICAgICAgaWYoISh0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSB8fCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciByb3cgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldO1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS52YWx1ZSA9IHRoaXMuZ2V0Um93VmFsdWVDb3JlKHJvdywgdmFsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XG4gICAgICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICAgICAgaWYgKCFyb3dzKSByb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICAgICAgaWYgKCFyb3dzKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2VsbHMgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLmNlbGxzO1xuICAgICAgICAgICAgaWYgKCFjZWxscykgY29udGludWU7XG4gICAgICAgICAgICBmb3IgKHZhciBjb2xJbmRleCA9IDA7IGNvbEluZGV4IDwgY2VsbHMubGVuZ3RoOyBjb2xJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHF1ZXN0aW9uID0gY2VsbHNbY29sSW5kZXhdLnF1ZXN0aW9uO1xuICAgICAgICAgICAgICAgIGlmIChxdWVzdGlvbiAmJiAoIXF1ZXN0aW9uLnN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkgfHwgIXF1ZXN0aW9uLnZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBwdWJsaWMgaGFzRXJyb3JzKGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUpOiBib29sZWFuIHtcbiAgICAgICAgdmFyIGVycm9zSW5Db2x1bW5zID0gdGhpcy5oYXNFcnJvckluQ29sdW1ucyhmaXJlQ2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gc3VwZXIuaGFzRXJyb3JzKGZpcmVDYWxsYmFjaykgfHwgZXJyb3NJbkNvbHVtbnM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRBbGxFcnJvcnMoKTogQXJyYXk8U3VydmV5RXJyb3I+IHsgXG4gICAgICAgIHZhciByZXN1bHQgPSBzdXBlci5nZXRBbGxFcnJvcnMoKTtcbiAgICAgICAgdmFyIHJvd3MgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciByb3cgPSByb3dzW2ldO1xuICAgICAgICAgICAgZm9yKHZhciBqID0gMDsgaiA8IHJvdy5jZWxscy5sZW5ndGg7IGogKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3JzID0gcm93LmNlbGxzW2pdLnF1ZXN0aW9uLmdldEFsbEVycm9ycygpO1xuICAgICAgICAgICAgICAgIGlmKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KGVycm9ycyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7IFxuICAgIH1cbiAgICBwcml2YXRlIGhhc0Vycm9ySW5Db2x1bW5zKGZpcmVDYWxsYmFjazogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIHJlcyA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjZWxscyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV0uY2VsbHM7XG4gICAgICAgICAgICBpZighY2VsbHMpIGNvbnRpbnVlO1xuICAgICAgICAgICAgZm9yICh2YXIgY29sSW5kZXggPSAwOyBjb2xJbmRleCA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGNvbEluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBpZighY2VsbHNbY29sSW5kZXhdKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB2YXIgcXVlc3Rpb24gPSBjZWxsc1tjb2xJbmRleF0ucXVlc3Rpb247XG4gICAgICAgICAgICAgICAgcmVzID0gcXVlc3Rpb24gJiYgcXVlc3Rpb24udmlzaWJsZSAmJiBxdWVzdGlvbi5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrKSB8fCByZXM7IFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRGaXJzdElucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0Rmlyc3RDZWxsUXVlc3Rpb24oZmFsc2UpO1xuICAgICAgICByZXR1cm4gcXVlc3Rpb24gPyBxdWVzdGlvbi5pbnB1dElkIDogc3VwZXIuZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0Rmlyc3RFcnJvcklucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0Rmlyc3RDZWxsUXVlc3Rpb24odHJ1ZSk7XG4gICAgICAgIHJldHVybiBxdWVzdGlvbiA/IHF1ZXN0aW9uLmlucHV0SWQgOiBzdXBlci5nZXRGaXJzdEVycm9ySW5wdXRFbGVtZW50SWQoKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldEZpcnN0Q2VsbFF1ZXN0aW9uKG9uRXJyb3I6IGJvb2xlYW4pOiBRdWVzdGlvbiB7XG4gICAgICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuIG51bGw7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNlbGxzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS5jZWxscztcbiAgICAgICAgICAgIGZvciAodmFyIGNvbEluZGV4ID0gMDsgY29sSW5kZXggPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBjb2xJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvbkVycm9yKSByZXR1cm4gY2VsbHNbY29sSW5kZXhdLnF1ZXN0aW9uO1xuICAgICAgICAgICAgICAgIGlmIChjZWxsc1tjb2xJbmRleF0ucXVlc3Rpb24uY3VycmVudEVycm9yQ291bnQgPiAwKSByZXR1cm4gY2VsbHNbY29sSW5kZXhdLnF1ZXN0aW9uXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vSU1hdHJpeERyb3Bkb3duRGF0YVxuICAgIHB1YmxpYyBjcmVhdGVRdWVzdGlvbihyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLCBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogUXVlc3Rpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVRdWVzdGlvbkNvcmUocm93LCBjb2x1bW4pO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgY3JlYXRlUXVlc3Rpb25Db3JlKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBRdWVzdGlvbiB7XG4gICAgICAgIHZhciBjZWxsVHlwZSA9IGNvbHVtbi5jZWxsVHlwZSA9PSBcImRlZmF1bHRcIiA/IHRoaXMuY2VsbFR5cGUgOiBjb2x1bW4uY2VsbFR5cGU7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuY3JlYXRlQ2VsbFF1ZXN0aW9uKGNlbGxUeXBlLCBjb2x1bW4ubmFtZSk7XG4gICAgICAgIHF1ZXN0aW9uLnNldFN1cnZleUltcGwocm93KTtcbiAgICAgICAgdGhpcy5zZXRRdWVzdGlvblByb3BlcnRpZXMocXVlc3Rpb24sIGNvbHVtbiwgcm93KTtcbiAgICAgICAgcmV0dXJuIHF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0Q29sdW1uQ2hvaWNlcyhjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogQXJyYXk8YW55PiB7XG4gICAgICAgIHJldHVybiBjb2x1bW4uY2hvaWNlcyAmJiBjb2x1bW4uY2hvaWNlcy5sZW5ndGggPiAwID8gY29sdW1uLmNob2ljZXMgOiB0aGlzLmNob2ljZXM7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRDb2x1bW5PcHRpb25zQ2FwdGlvbihjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbi5vcHRpb25zQ2FwdGlvbiA/IGNvbHVtbi5vcHRpb25zQ2FwdGlvbiA6IHRoaXMub3B0aW9uc0NhcHRpb247XG4gICAgfVxuICAgIHByb3RlY3RlZCBzZXRRdWVzdGlvblByb3BlcnRpZXMocXVlc3Rpb246IFF1ZXN0aW9uLCBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLCByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKSB7XG4gICAgICAgIGlmKCFxdWVzdGlvbikgcmV0dXJuO1xuICAgICAgICBxdWVzdGlvbi5uYW1lID0gY29sdW1uLm5hbWU7XG4gICAgICAgIHF1ZXN0aW9uLmlzUmVxdWlyZWQgPSBjb2x1bW4uaXNSZXF1aXJlZDtcbiAgICAgICAgcXVlc3Rpb24uaGFzT3RoZXIgPSBjb2x1bW4uaGFzT3RoZXI7XG4gICAgICAgIHF1ZXN0aW9uLnJlYWRPbmx5ID0gdGhpcy5yZWFkT25seTtcbiAgICAgICAgcXVlc3Rpb24udmFsaWRhdG9ycyA9IGNvbHVtbi52YWxpZGF0b3JzO1xuICAgICAgICBxdWVzdGlvbi52aXNpYmxlSWYgPSBjb2x1bW4udmlzaWJsZUlmO1xuICAgICAgICBpZiAoY29sdW1uLmhhc090aGVyKSB7XG4gICAgICAgICAgICBpZiAocXVlc3Rpb24gaW5zdGFuY2VvZiBRdWVzdGlvblNlbGVjdEJhc2UpIHtcbiAgICAgICAgICAgICAgICAoPFF1ZXN0aW9uU2VsZWN0QmFzZT5xdWVzdGlvbikuc3RvcmVPdGhlcnNBc0NvbW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgdCA9IHF1ZXN0aW9uLmdldFR5cGUoKTtcbiAgICAgICAgaWYodCA9PSBcImNoZWNrYm94XCIgfHwgdCA9PSBcInJhZGlvZ3JvdXBcIikge1xuICAgICAgICAgICAgKDxRdWVzdGlvbkNoZWNrYm94QmFzZT5xdWVzdGlvbikuY29sQ291bnQgPSBjb2x1bW4uY29sQ291bnQgPiAtIDEgPyBjb2x1bW4uY29sQ291bnQgOiB0aGlzLmNvbHVtbkNvbENvdW50O1xuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RCYXNlUHJvcGVydGllcyg8UXVlc3Rpb25TZWxlY3RCYXNlPnF1ZXN0aW9uLCBjb2x1bW4sIHJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYodCA9PSBcImRyb3Bkb3duXCIpIHtcbiAgICAgICAgICAgKDxRdWVzdGlvbkRyb3Bkb3duTW9kZWw+cXVlc3Rpb24pLm9wdGlvbnNDYXB0aW9uID0gdGhpcy5nZXRDb2x1bW5PcHRpb25zQ2FwdGlvbihjb2x1bW4pOyBcbiAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RCYXNlUHJvcGVydGllcyg8UXVlc3Rpb25TZWxlY3RCYXNlPnF1ZXN0aW9uLCBjb2x1bW4sIHJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYodCA9PSBcInRleHRcIikge1xuICAgICAgICAgICAgKDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbikuaW5wdXRUeXBlID0gY29sdW1uLmlucHV0VHlwZTtcbiAgICAgICAgICAgICg8UXVlc3Rpb25UZXh0TW9kZWw+cXVlc3Rpb24pLnBsYWNlSG9sZGVyID0gY29sdW1uLnBsYWNlSG9sZGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmKHQgPT0gXCJjb21tZW50XCIpIHtcbiAgICAgICAgICAgICg8UXVlc3Rpb25Db21tZW50TW9kZWw+cXVlc3Rpb24pLnBsYWNlSG9sZGVyID0gY29sdW1uLnBsYWNlSG9sZGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmKHQgPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICg8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb24pLmRlZmF1bHRWYWx1ZSA9IGNvbHVtbi5ib29sZWFuRGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikuc2hvd1RpdGxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0U2VsZWN0QmFzZVByb3BlcnRpZXMocXVlc3Rpb246IFF1ZXN0aW9uU2VsZWN0QmFzZSwgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbiwgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSkge1xuICAgICAgICBxdWVzdGlvbi5jaG9pY2VzT3JkZXIgPSBjb2x1bW4uY2hvaWNlc09yZGVyO1xuICAgICAgICBxdWVzdGlvbi5jaG9pY2VzID0gdGhpcy5nZXRDb2x1bW5DaG9pY2VzKGNvbHVtbik7XG4gICAgICAgIHF1ZXN0aW9uLmNob2ljZXNCeVVybC5zZXREYXRhKGNvbHVtbi5jaG9pY2VzQnlVcmwpO1xuICAgICAgICBpZighcXVlc3Rpb24uY2hvaWNlc0J5VXJsLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHF1ZXN0aW9uLmNob2ljZXNCeVVybC5ydW4ocm93KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgY3JlYXRlQ2VsbFF1ZXN0aW9uKHF1ZXN0aW9uVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBRdWVzdGlvbiB7XG4gICAgICAgIHJldHVybiA8UXVlc3Rpb24+UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLmNyZWF0ZVF1ZXN0aW9uKHF1ZXN0aW9uVHlwZSwgbmFtZSk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBkZWxldGVSb3dWYWx1ZShuZXdWYWx1ZTogYW55LCByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogYW55IHtcbiAgICAgICAgZGVsZXRlIG5ld1ZhbHVlW3Jvdy5yb3dOYW1lXTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG5ld1ZhbHVlKS5sZW5ndGggPT0gMCA/IG51bGwgOiBuZXdWYWx1ZTtcbiAgICB9XG4gICAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICAgICAgdmFyIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIHJvd3NbaV0ub25BbnlWYWx1ZUNoYW5nZWQobmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIG9uQ2VsbFZhbHVlQ2hhbmdlZChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLCBjb2x1bW5OYW1lOiBzdHJpbmcsIHJvd1ZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYoIXRoaXMuc3VydmV5KSByZXR1cm47XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIGdldFF1ZXN0aW9uID0gZnVuY3Rpb24oY29sTmFtZSkge1xuICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgc2VsZi5jb2x1bW5zLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgICAgIGlmKHNlbGYuY29sdW1uc1tpXS5uYW1lID09IGNvbE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdy5jZWxsc1tpXS5xdWVzdGlvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3B0aW9ucyA9IHtyb3c6IHJvdywgY29sdW1uTmFtZTogY29sdW1uTmFtZSwgcm93VmFsdWU6IHJvd1ZhbHVlLCB2YWx1ZTogcm93VmFsdWVbY29sdW1uTmFtZV0sIGdldENlbGxRdWVzdGlvbjogZ2V0UXVlc3Rpb259O1xuICAgICAgICB0aGlzLnN1cnZleS5tYXRyaXhDZWxsVmFsdWVDaGFuZ2VkKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICB2YWxpZGF0ZUNlbGwocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSwgY29sdW1uTmFtZTogc3RyaW5nLCByb3dWYWx1ZTogYW55KTogU3VydmV5RXJyb3Ige1xuICAgICAgICBpZighdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtyb3c6IHJvdywgY29sdW1uTmFtZTogY29sdW1uTmFtZSwgcm93VmFsdWU6IHJvd1ZhbHVlLCB2YWx1ZTogcm93VmFsdWVbY29sdW1uTmFtZV19O1xuICAgICAgICByZXR1cm4gdGhpcy5zdXJ2ZXkubWF0cml4Q2VsbFZhbGlkYXRlKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBvblJvd0NoYW5nZWQocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSwgY29sdW1uTmFtZTogc3RyaW5nLCBuZXdSb3dWYWx1ZTogYW55KSB7XG4gICAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgICAgIGlmKHRoaXMuaXNNYXRyaXhWYWx1ZUVtcHR5KG9sZFZhbHVlKSkgb2xkVmFsdWUgPSBudWxsO1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgICB2YXIgcm93VmFsdWUgPSB0aGlzLmdldFJvd1ZhbHVlQ29yZShyb3csIG5ld1ZhbHVlLCB0cnVlKTtcbiAgICAgICAgaWYoIXJvd1ZhbHVlKSByb3dWYWx1ZSA9IHt9O1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gcm93VmFsdWUpIGRlbGV0ZSByb3dWYWx1ZVtrZXldO1xuICAgICAgICBpZiAobmV3Um93VmFsdWUpIHtcbiAgICAgICAgICAgIG5ld1Jvd1ZhbHVlID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShuZXdSb3dWYWx1ZSkpO1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIG5ld1Jvd1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuaXNWYWx1ZUVtcHR5KG5ld1Jvd1ZhbHVlW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd1ZhbHVlW2tleV0gPSBuZXdSb3dWYWx1ZVtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMocm93VmFsdWUpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHRoaXMuZGVsZXRlUm93VmFsdWUobmV3VmFsdWUsIHJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5pc1R3b1ZhbHVlRXF1YWxzKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHJldHVybjtcbiAgICAgICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICAgICAgICBpZihjb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2VsbFZhbHVlQ2hhbmdlZChyb3csIGNvbHVtbk5hbWUsIHJvd1ZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGlzTWF0cml4VmFsdWVFbXB0eSh2YWwpIHtcbiAgICAgICAgaWYoIXZhbCkgcmV0dXJuO1xuICAgICAgICBpZihBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICAgICAgaWYoT2JqZWN0LmtleXModmFsW2ldKS5sZW5ndGggPiAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModmFsKS5sZW5ndGggPT0gMDtcbiAgICB9XG4gICAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkgeyByZXR1cm4gdGhpcy5zdXJ2ZXk7IH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcIm1hdHJpeGRyb3Bkb3duY29sdW1uXCIsIFtcIm5hbWVcIiwgeyBuYW1lOiBcInRpdGxlXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUaXRsZVwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJjaG9pY2VzOml0ZW12YWx1ZXNcIiwgb25HZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55KSB7IHJldHVybiBJdGVtVmFsdWUuZ2V0RGF0YShvYmouY2hvaWNlcyk7IH0sIG9uU2V0VmFsdWU6IGZ1bmN0aW9uIChvYmo6IGFueSwgdmFsdWU6IGFueSkgeyBvYmouY2hvaWNlcyA9IHZhbHVlOyB9fSxcbiAgICAgICAgeyBuYW1lOiBcIm9wdGlvbnNDYXB0aW9uXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NPcHRpb25zQ2FwdGlvblwifSAsIHsgbmFtZTogXCJjZWxsVHlwZVwiLCBkZWZhdWx0OiBcImRlZmF1bHRcIiwgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcImRyb3Bkb3duXCIsIFwiY2hlY2tib3hcIiwgXCJyYWRpb2dyb3VwXCIsIFwidGV4dFwiLCBcImNvbW1lbnRcIiwgXCJib29sZWFuXCJdIH0sXG4gICAgICAgIHsgbmFtZTogXCJjb2xDb3VudFwiLCBkZWZhdWx0OiAtMSwgY2hvaWNlczogWy0xLCAwLCAxLCAyLCAzLCA0XSB9LCBcImlzUmVxdWlyZWQ6Ym9vbGVhblwiLCBcImhhc090aGVyOmJvb2xlYW5cIiwgXCJtaW5XaWR0aFwiLCB7IG5hbWU6IFwicGxhY2VIb2xkZXJcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BsYWNlSG9sZGVyXCJ9LFxuICAgICAgICB7IG5hbWU6IFwiY2hvaWNlc09yZGVyXCIsIGRlZmF1bHQ6IFwibm9uZVwiLCBjaG9pY2VzOiBbXCJub25lXCIsIFwiYXNjXCIsIFwiZGVzY1wiLCBcInJhbmRvbVwiXSB9LFxuICAgICAgICB7IG5hbWU6IFwiY2hvaWNlc0J5VXJsOnJlc3RmdWxsXCIsIGNsYXNzTmFtZTogXCJDaG9pY2VzUmVzdGZ1bGxcIiwgb25HZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55KSB7IHJldHVybiBvYmouY2hvaWNlc0J5VXJsLmlzRW1wdHkgPyBudWxsIDogb2JqLmNob2ljZXNCeVVybDsgfSwgb25TZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55LCB2YWx1ZTogYW55KSB7IG9iai5jaG9pY2VzQnlVcmwuc2V0RGF0YSh2YWx1ZSk7IH0gfSxcbiAgICAgICAgeyBuYW1lOiBcImJvb2xlYW5EZWZhdWx0VmFsdWVcIiwgZGVmYXVsdDogXCJpbmRldGVybWluYXRlXCIsIGNob2ljZXM6IFtcImluZGV0ZXJtaW5hdGVcIiwgXCJmYWxzZVwiLCBcInRydWVcIl0gfSxcbiAgICAgICAgeyBuYW1lOiBcImlucHV0VHlwZVwiLCBkZWZhdWx0OiBcInRleHRcIiwgY2hvaWNlczogW1wiY29sb3JcIiwgXCJkYXRlXCIsIFwiZGF0ZXRpbWVcIiwgXCJkYXRldGltZS1sb2NhbFwiLCBcImVtYWlsXCIsIFwibW9udGhcIiwgXCJudW1iZXJcIiwgXCJwYXNzd29yZFwiLCBcInJhbmdlXCIsIFwidGVsXCIsIFwidGV4dFwiLCBcInRpbWVcIiwgXCJ1cmxcIiwgXCJ3ZWVrXCJdIH0sXG4gICAgICAgIFwidmlzaWJsZUlmOmNvbmRpdGlvblwiLCB7IG5hbWU6IFwidmFsaWRhdG9yczp2YWxpZGF0b3JzXCIsIGJhc2VDbGFzc05hbWU6IFwic3VydmV5dmFsaWRhdG9yXCIsIGNsYXNzTmFtZVBhcnQ6IFwidmFsaWRhdG9yXCIgfV0sXG4gICAgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE1hdHJpeERyb3Bkb3duQ29sdW1uKFwiXCIpOyB9KTtcblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcIm1hdHJpeGRyb3Bkb3duYmFzZVwiLCBbeyBuYW1lOiBcImNvbHVtbnM6bWF0cml4ZHJvcGRvd25jb2x1bW5zXCIsIGNsYXNzTmFtZTogXCJtYXRyaXhkcm9wZG93bmNvbHVtblwifSxcbiAgICAgICAgXCJob3Jpem9udGFsU2Nyb2xsOmJvb2xlYW5cIixcbiAgICAgICAgeyBuYW1lOiBcImNob2ljZXM6aXRlbXZhbHVlc1wiLCBvbkdldFZhbHVlOiBmdW5jdGlvbiAob2JqOiBhbnkpIHsgcmV0dXJuIEl0ZW1WYWx1ZS5nZXREYXRhKG9iai5jaG9pY2VzKTsgfSwgb25TZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55LCB2YWx1ZTogYW55KSB7IG9iai5jaG9pY2VzID0gdmFsdWU7IH19LFxuICAgICAgICB7IG5hbWU6IFwib3B0aW9uc0NhcHRpb25cIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY09wdGlvbnNDYXB0aW9uXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImNlbGxUeXBlXCIsIGRlZmF1bHQ6IFwiZHJvcGRvd25cIiwgY2hvaWNlczogW1wiZHJvcGRvd25cIiwgXCJjaGVja2JveFwiLCBcInJhZGlvZ3JvdXBcIiwgXCJ0ZXh0XCIsIFwiY29tbWVudFwiLCBcImJvb2xlYW5cIl0gfSxcbiAgICAgICAgeyBuYW1lOiBcImNvbHVtbkNvbENvdW50XCIsIGRlZmF1bHQ6IDAsIGNob2ljZXM6IFswLCAxLCAyLCAzLCA0XSB9LCBcImNvbHVtbk1pbldpZHRoXCJdLFxuICAgIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlKFwiXCIpOyB9LCBcInF1ZXN0aW9uXCIpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZS50cyIsImltcG9ydCB7SGFzaFRhYmxlfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQge0Jhc2UsIFN1cnZleUVsZW1lbnQsIElFbGVtZW50LCBJUXVlc3Rpb24sIElDb25kaXRpb25SdW5uZXIsIElTdXJ2ZXlEYXRhLCBJU3VydmV5LCBFdmVudCwgU3VydmV5RXJyb3IsIElQYW5lbH0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7UXVlc3Rpb25DdXN0b21XaWRnZXR9IGZyb20gJy4vcXVlc3Rpb25DdXN0b21XaWRnZXRzJztcbmltcG9ydCB7SnNvbk9iamVjdH0gZnJvbSAnLi9qc29ub2JqZWN0JztcbmltcG9ydCB7Q29uZGl0aW9uUnVubmVyfSBmcm9tICcuL2NvbmRpdGlvbnMnO1xuaW1wb3J0IHtJTG9jYWxpemFibGVPd25lcn0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7c3VydmV5Q3NzfSBmcm9tIFwiLi9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkXCI7XG5pbXBvcnQge0N1c3RvbVdpZGdldENvbGxlY3Rpb259IGZyb20gJy4vcXVlc3Rpb25DdXN0b21XaWRnZXRzJztcblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgZm9yIGFsbCBxdWVzdGlvbnMuIFF1ZXN0aW9uQmFzZSBkb2Vzbid0IGhhdmUgaW5mb3JtYXRpb24gYWJvdXQgdGl0bGUsIHZhbHVlcywgZXJyb3JzIGFuZCBzbyBvbi5cbiAqIFRob3NlIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgaW4gdGhlIFF1ZXN0aW9uIGNsYXNzLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25CYXNlIGV4dGVuZHMgU3VydmV5RWxlbWVudCBpbXBsZW1lbnRzIElRdWVzdGlvbiwgSUNvbmRpdGlvblJ1bm5lciwgSUxvY2FsaXphYmxlT3duZXIge1xuICAgIHByaXZhdGUgc3RhdGljIHF1ZXN0aW9uQ291bnRlciA9IDEwMDtcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRRdWVzdGlvbklkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcInNxX1wiICsgUXVlc3Rpb25CYXNlLnF1ZXN0aW9uQ291bnRlcisrO1xuICAgIH1cbiAgICBwcml2YXRlIGNvbmRpdGlvblJ1bm5lcjogQ29uZGl0aW9uUnVubmVyID0gbnVsbDtcbiAgICBwcml2YXRlIGlzQ3VzdG9tV2lkZ2V0UmVxdWVzdGVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBjdXN0b21XaWRnZXRWYWx1ZTogUXVlc3Rpb25DdXN0b21XaWRnZXQ7XG4gICAgY3VzdG9tV2lkZ2V0RGF0YSA9IHsgaXNOZWVkUmVuZGVyOiB0cnVlIH07XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHdoZW4gdGhlIHN1cnZleSBjaGFuZ2UgaXQncyBsb2NhbGVcbiAgICAgKiBAc2VlIFN1cnZleU1vZGVsLmxvY2FsZVxuICAgICAqL1xuICAgIHB1YmxpYyBsb2NhbGVDaGFuZ2VkOiBFdmVudDwoc2VuZGVyOiBRdWVzdGlvbkJhc2UpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoc2VuZGVyOiBRdWVzdGlvbkJhc2UpID0+IGFueSwgYW55PigpO1xuICAgIGZvY3VzQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gICAgc3VydmV5TG9hZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihuYW1lKTtcbiAgICAgICAgdGhpcy5pZCA9IFF1ZXN0aW9uQmFzZS5nZXRRdWVzdGlvbklkKCk7XG4gICAgICAgIHRoaXMub25DcmVhdGluZygpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcgeyByZXR1cm4gXCJxdWVzdGlvbmJhc2VcIjsgfVxuICAgIC8qKlxuICAgICAqIEEgcGFyZW50IGVsZW1lbnQuIEl0IGNhbiBiZSBwYW5lbCBvciBwYWdlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGFyZW50KCk6IElQYW5lbCB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwYXJlbnRcIiwgbnVsbCk7IH1cbiAgICBwdWJsaWMgc2V0IHBhcmVudCh2YWw6IElQYW5lbCkgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYXJlbnRcIiwgdmFsKTsgfVxuICAgIC8qKlxuICAgICAqIEFsd2F5cyByZXR1cm5zIGZhbHNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNQYW5lbCgpOiBib29sZWFuIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgICogVXNlIGl0IHRvIGdldC9zZXQgdGhlIHF1ZXN0aW9uIHZpc2liaWxpdHkuXG4gICAgICogQHNlZSB2aXNpYmxlSWZcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlXCIsIHRydWUpOyB9XG4gICAgcHVibGljIHNldCB2aXNpYmxlKHZhbDogYm9vbGVhbikge1xuICAgICAgICBpZiAodmFsID09IHRoaXMudmlzaWJsZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlXCIsIHZhbCk7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzVmlzaWJsZVwiLCB0aGlzLmlzVmlzaWJsZSk7XG4gICAgICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgICAgICAgdGhpcy5zdXJ2ZXkucXVlc3Rpb25WaXNpYmlsaXR5Q2hhbmdlZCg8SVF1ZXN0aW9uPnRoaXMsIHRoaXMudmlzaWJsZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSWYgaXQgcmV0dXJucyB0cnVlIHRoZSBRdWVzdGlvbiBiZWNvbWVzIHZpc2libGUgYW5kIGlmIGl0IHJldHVybnMgZmFsc2UgdGhlIFF1ZXN0aW9uIGJlY29tZXMgaW52aXNpYmxlLiBUaGUgbGlicmFyeSBydW5zIHRoZSBleHByZXNzaW9uIG9uIHN1cnZleSBzdGFydCBhbmQgb24gY2hhbmdpbmcgYSBxdWVzdGlvbiB2YWx1ZS4gSWYgdGhlIHByb3BlcnR5IGlzIGVtcHR5IHRoZW4gdmlzaWJsZSBwcm9wZXJ0eSBpcyB1c2VkLlxuICAgICAqIEBzZWUgdmlzaWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmlzaWJsZUlmKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSWZcIiwgXCJcIik7IH1cbiAgICBwdWJsaWMgc2V0IHZpc2libGVJZih2YWw6IHN0cmluZykgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSWZcIiwgdmFsKTsgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcXVlc3Rpb24gaXMgdmlzaWJsZSBvciBzdXJ2ZXkgaXMgaW4gZGVzaWduIG1vZGUgcmlnaHQgbm93LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy52aXNpYmxlIHx8IHRoaXMuaXNEZXNpZ25Nb2RlOyB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBxdWVzdGlvbiBpbiBkZXNpZ24gbW9kZSByaWdodCBub3cuXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0Rlc2lnbk1vZGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rlc2lnbk1vZGU7IH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgbm8gaW5wdXQgaW4gdGhlIHF1ZXN0aW9uLiBJdCBhbHdheXMgcmV0dXJucyB0cnVlIGZvciBodG1sIHF1ZXN0aW9uIG9yIHN1cnZleSBpcyBpbiAnZGlzcGxheScgbW9kZS5cbiAgICAgKiBAc2VlIFF1ZXN0aW9uSHRtbE1vZGVsXG4gICAgICogQHNlZSBTdXJ2ZXlNb2RlbC5tb2RlXG4gICAgICogQHNlZSBRdWVzdGlvbi5yZWFkT25seVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNSZWFkT25seSgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2aXNpYmxlIGluZGV4IG9mIHRoZSBxdWVzdGlvbiBpbiB0aGUgc3VydmV5LiBJdCBjYW4gYmUgZnJvbSAwIHRvIGFsbCB2aXNpYmxlIHF1ZXN0aW9ucyBjb3VudCAtIDFcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZpc2libGVJbmRleCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUluZGV4XCIsIC0xKTsgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZXJyb3Igb24gcXVlc3Rpb24gdmFsaWRhdGlvbi5cbiAgICAgKiBAcGFyYW0gZmlyZUNhbGxiYWNrIHNldCBpdCB0byB0cnVlIHRvIHNob3cgZXJyb3IgaW4gVUlcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzRXJyb3JzKGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUpOiBib29sZWFuIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVycm9zIG9uIHZhbGlkYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIGdldCBjdXJyZW50RXJyb3JDb3VudCgpOiBudW1iZXIgeyByZXR1cm4gMDsgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIHF1ZXN0aW9uIGRvZXNuJ3QgaGF2ZSBhIHRpdGxlIHByb3BlcnR5LCBmb3IgZXhhbXBsZTogUXVlc3Rpb25IdG1sTW9kZWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1RpdGxlKCk6IGJvb2xlYW4geyByZXR1cm4gZmFsc2U7IH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBxdWVzdGlvbiBkb2Vzbid0IGhhdmUgYSBkZXNjcmlwdGlvbiBwcm9wZXJ0eSwgZm9yIGV4YW1wbGU6IFF1ZXN0aW9uSHRtbE1vZGVsLCBvciBkZXNjcmlwdGlvbiBwcm9wZXJ0eSBpcyBlbXB0eS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc0Rlc2NyaXB0aW9uKCk6IGJvb2xlYW4geyByZXR1cm4gZmFsc2U7IH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBxdWVzdGlvbiBkb2Vzbid0IGhhdmUgYW4gaW5wdXQgZWxlbWVudCwgZm9yIGV4YW1wbGU6IFF1ZXN0aW9uSHRtbE1vZGVsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNJbnB1dCgpOiBib29sZWFuIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlLCBpZiB5b3UgY2FuIGhhdmUgYSBjb21tZW50IGZvciB0aGUgcXVlc3Rpb24uXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNDb21tZW50KCk6IGJvb2xlYW4geyByZXR1cm4gZmFsc2U7IH1cbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpY2F0b3IuIEl0IGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LiBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpZFwiKTsgfVxuICAgIHB1YmxpYyBzZXQgaWQodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaWRcIiwgdmFsKTsgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgZXJyb3JzIHRoYXQgaGFzIGluIHRoZSBxdWVzdGlvbi4gRm9yIGV4YW1wbGUsIGlzUmVxdWlyZWQgZXJyb3IuXG4gICAgICovXG4gICAgcHVibGljIGdldEFsbEVycm9ycygpOiBBcnJheTxTdXJ2ZXlFcnJvcj4geyByZXR1cm4gW107IH1cbiAgICAvKipcbiAgICAgKiBUaGUgbGluayB0byB0aGUgY3VzdG9tIHdpZGdldC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1c3RvbVdpZGdldCgpOiBRdWVzdGlvbkN1c3RvbVdpZGdldCB7IFxuICAgICAgICBpZighdGhpcy5pc0N1c3RvbVdpZGdldFJlcXVlc3RlZCAmJiAhdGhpcy5jdXN0b21XaWRnZXRWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5pc0N1c3RvbVdpZGdldFJlcXVlc3RlZCA9IHRydWU7ICAgIFxuICAgICAgICAgICAgdGhpcy51cGRhdGVDdXN0b21XaWRnZXQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21XaWRnZXRWYWx1ZTsgXG4gICAgfVxuICAgIHB1YmxpYyB1cGRhdGVDdXN0b21XaWRnZXQoKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tV2lkZ2V0VmFsdWUgPSBDdXN0b21XaWRnZXRDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1c3RvbVdpZGdldCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIFF1ZXN0aW9uIHJlbmRlcnMgb24gdGhlIG5ldyBsaW5lIGlmIHRoZSBwcm9wZXJ0eSBpcyB0cnVlLiBJZiB0aGUgcHJvcGVydHkgaXMgZmFsc2UsIHRoZSBxdWVzdGlvbiB0cmllcyB0byByZW5kZXIgb24gdGhlIHNhbWUgbGluZS9yb3cgd2l0aCBhIHByZXZpb3VzIHF1ZXN0aW9uL3BhbmVsLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3RhcnRXaXRoTmV3TGluZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN0YXJ0V2l0aE5ld0xpbmVcIiwgdHJ1ZSk7IH1cbiAgICBwdWJsaWMgc2V0IHN0YXJ0V2l0aE5ld0xpbmUodmFsOiBib29sZWFuKSB7XG4gICAgICAgIGlmKHRoaXMuc3RhcnRXaXRoTmV3TGluZSA9PSB2YWwpIHJldHVybjtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3RhcnRXaXRoTmV3TGluZVwiLCB2YWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCBjc3MgY2xhc3NlcyB0aGF0IHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgcXVlc3Rpb24uIFlvdSBtYXkgdXNlIHN1cnZleS51cGRhdGVRdWVzdGlvbkNzc0NsYXNzZXMgZXZlbnQgdG8gb3ZlcnJpZGUgY3NzIGNsYXNzZXMgZm9yIGEgcXVlc3Rpb24uXG4gICAgICogQHNlZSBTdXJ2ZXlNb2RlbC51cGRhdGVRdWVzdGlvbkNzc0NsYXNzZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNzc0NsYXNzZXMoKTogYW55IHtcbiAgICAgICAgdmFyIHN1cnZleUNzcyA9IHRoaXMuY3NzO1xuICAgICAgICB2YXIgY2xhc3NlcyA9IHsgZXJyb3IgOiB7fX07XG4gICAgICAgIHRoaXMuY29weUNzc0NsYXNzZXMoY2xhc3Nlcywgc3VydmV5Q3NzLnF1ZXN0aW9uKTtcbiAgICAgICAgdGhpcy5jb3B5Q3NzQ2xhc3NlcyhjbGFzc2VzLmVycm9yLCBzdXJ2ZXlDc3MuZXJyb3IpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNzc0NsYXNzZXMoY2xhc3Nlcywgc3VydmV5Q3NzKTtcbiAgICAgICAgaWYodGhpcy5zdXJ2ZXkpIHtcbiAgICAgICAgICAgIHRoaXMuc3VydmV5LnVwZGF0ZVF1ZXN0aW9uQ3NzQ2xhc3Nlcyh0aGlzLCBjbGFzc2VzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xhc3NlcztcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldFJvb3RDc3MoY2xhc3NlczogYW55KSB7IHJldHVybiBjbGFzc2VzLnF1ZXN0aW9uLnJvb3Q7IH1cbiAgICBwcm90ZWN0ZWQgdXBkYXRlQ3NzQ2xhc3NlcyhyZXM6IGFueSwgc3VydmV5Q3NzOiBhbnkpIHsgXG4gICAgICAgIHZhciBvYmpDc3MgPSBzdXJ2ZXlDc3NbdGhpcy5nZXRUeXBlKCldO1xuICAgICAgICBpZiAob2JqQ3NzID09PSB1bmRlZmluZWQgfHwgb2JqQ3NzID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqQ3NzID09PSAnc3RyaW5nJyB8fCBvYmpDc3MgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgICAgIHJlcy5yb290ID0gb2JqQ3NzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yKHZhciBrZXkgaW4gb2JqQ3NzKSB7XG4gICAgICAgICAgICAgICAgcmVzW2tleV0gPSBvYmpDc3Nba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGNvcHlDc3NDbGFzc2VzKGRlc3Q6IGFueSwgc291cmNlOiBhbnkpIHtcbiAgICAgICAgaWYoIXNvdXJjZSkgcmV0dXJuO1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgfHwgc291cmNlIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICAgICAgICBkZXN0W1wicm9vdFwiXSA9IHNvdXJjZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcih2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0IGNzcygpOiBhbnkgeyByZXR1cm4gc3VydmV5Q3NzLmdldENzcygpOyB9XG4gICAgLyoqXG4gICAgICogVXNlIGl0IHRvIHNldCB0aGUgc3BlY2lmaWMgd2lkdGggdG8gdGhlIHF1ZXN0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgd2lkdGgoKSA6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiLCBcIlwiKTsgfVxuICAgIHB1YmxpYyBzZXQgd2lkdGgodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwid2lkdGhcIiwgdmFsKTsgfVxuICAgIC8qKlxuICAgICAqIFRoZSByZW5kZXJlZCB3aWR0aCBvZiB0aGUgcXVlc3Rpb24uXG4gICAgICovXG4gICAgcHVibGljIGdldCByZW5kZXJXaWR0aCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyV2lkdGhcIiwgXCJcIik7IH1cbiAgICBwdWJsaWMgc2V0IHJlbmRlcldpZHRoKHZhbDogc3RyaW5nKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlbmRlcldpZHRoXCIsIHZhbCk7IH1cbiAgICAvKipcbiAgICAgKiBTZXQgaXQgZGlmZmVyZW50IGZyb20gMCB0byBpbmNyZWFzZSB0aGUgbGVmdCBwYWRkaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW5kZW50KCk6IG51bWJlciB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbmRlbnRcIiwgMCk7IH1cbiAgICBwdWJsaWMgc2V0IGluZGVudCh2YWw6IG51bWJlcikgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbmRlbnRcIiwgdmFsKTsgfVxuICAgIC8qKlxuICAgICAqIFNldCBpdCBkaWZmZXJlbnQgZnJvbSAwIHRvIGluY3JlYXNlIHRoZSByaWdodCBwYWRkaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmlnaHRJbmRlbnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJpZ2h0SW5kZW50XCIsIDApOyB9XG4gICAgcHVibGljIHNldCByaWdodEluZGVudCh2YWw6IG51bWJlcikgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyaWdodEluZGVudFwiLCB2YWwpOyB9XG4gICAgLyoqXG4gICAgICogRm9jdXMgdGhlIHF1ZXN0aW9uIGlucHV0LlxuICAgICAqIEBwYXJhbSBvbkVycm9yIEZvY3VzIGlmIHRoZXJlIGlzIGFuIGVycm9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBmb2N1cyhvbkVycm9yOiBib29sZWFuID0gZmFsc2UpIHsgfVxuICAgIHByb3RlY3RlZCBmaXJlQ2FsbGJhY2soY2FsbGJhY2s6ICgpID0+IHZvaWQpIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgb25DcmVhdGluZygpIHsgfVxuICAgIC8qKlxuICAgICAqIFJ1biB2aXNpYmxlSWYgYW5kIGVuYWJsZUlmIGV4cHJlc3Npb25zLiBJZiB2aXNpYmxlSWYgb3IvYW5kIGVuYWJsZWRJZiBhcmUgbm90IGVtcHR5LCB0aGVuIHRoZSByZXN1bHRzIG9mIHBlcmZvcm1pbmcgdGhlIGV4cHJlc3Npb24gKHRydWUgb3IgZmFsc2UpIHNldCB0byB0aGUgdmlzaWJsZS9yZWFkT25seSBwcm9wZXJ0aWVzLlxuICAgICAqIEBwYXJhbSB2YWx1ZXMgVHlwaWNhbGx5IHN1cnZleSByZXN1bHRzXG4gICAgICogQHNlZSB2aXNpYmxlXG4gICAgICogQHNlZSB2aXNpYmxlSWZcbiAgICAgKiBAc2VlIHJlYWRPbmx5XG4gICAgICogQHNlZSBlbmFibGVJZlxuICAgICAqL1xuICAgIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgICAgICBpZiAoIXRoaXMudmlzaWJsZUlmKSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5jb25kaXRpb25SdW5uZXIpIHRoaXMuY29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLnZpc2libGVJZik7XG4gICAgICAgIHRoaXMuY29uZGl0aW9uUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLnZpc2libGVJZjtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gdGhpcy5jb25kaXRpb25SdW5uZXIucnVuKHZhbHVlcyk7XG4gICAgfVxuICAgIC8vSVF1ZXN0aW9uXG4gICAgcHVibGljIG9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICB9XG4gICAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5zdXJ2ZXlMb2FkQ2FsbGJhY2spO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0VmlzaWJsZUluZGV4KHZhbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMudmlzaWJsZUluZGV4ID09IHZhbCkgcmV0dXJuIDE7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVJbmRleFwiLCB2YWwpO1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcHVibGljIHJlbW92ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgcHVibGljIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBwdWJsaWMgY2xlYXJVbnVzZWRWYWx1ZXMoKSB7fVxuICAgIHB1YmxpYyBnZXQgZGlzcGxheVZhbHVlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBwdWJsaWMgb25Mb2NhbGVDaGFuZ2VkKCkge1xuICAgICAgICBzdXBlci5vbkxvY2FsZUNoYW5nZWQoKTtcbiAgICAgICAgdGhpcy5sb2NhbGVDaGFuZ2VkLmZpcmUodGhpcywgdGhpcy5nZXRMb2NhbGUoKSk7XG4gICAgfVxuICAgIG9uUmVhZE9ubHlDaGFuZ2VkKCkge31cbiAgICBvbkFueVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcpe31cbiAgICAvL0lMb2NhbGl6YWJsZU93bmVyXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdXJ2ZXkgbG9jYWxlXG4gICAgICogQHNlZSBTdXJ2ZXlNb2RlbC5sb2NhbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TG9jYWxlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnN1cnZleSA/ICg8SUxvY2FsaXphYmxlT3duZXI+PGFueT50aGlzLnN1cnZleSkuZ2V0TG9jYWxlKCkgOiBcIlwiOyB9XG4gICAgcHVibGljIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcpICB7IHJldHVybiB0aGlzLnN1cnZleSA/ICg8SUxvY2FsaXphYmxlT3duZXI+PGFueT50aGlzLnN1cnZleSkuZ2V0TWFya2Rvd25IdG1sKHRleHQpIDogbnVsbDsgfVxufVxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcInF1ZXN0aW9uYmFzZVwiLCBbXCIhbmFtZVwiLCB7IG5hbWU6IFwidmlzaWJsZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSwgXCJ2aXNpYmxlSWY6Y29uZGl0aW9uXCIsXG4gICAgeyBuYW1lOiBcIndpZHRoXCIgfSwgeyBuYW1lOiBcInN0YXJ0V2l0aE5ld0xpbmU6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlfSwge25hbWU6IFwiaW5kZW50Om51bWJlclwiLCBkZWZhdWx0OiAwLCBjaG9pY2VzOiBbMCwgMSwgMiwgM119XSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25iYXNlLnRzIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtTdXJ2ZXlNb2RlbH0gZnJvbSBcIi4uL3N1cnZleVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5TmF2aWdhdGlvbkJhc2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8YW55LCBhbnk+IHtcbiAgICBwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlNb2RlbDtcbiAgICBwcm90ZWN0ZWQgY3NzOiBhbnk7XG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3VydmV5ID0gcHJvcHMuc3VydmV5O1xuICAgICAgICB0aGlzLmNzcyA9IHByb3BzLmNzcztcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHsgdXBkYXRlOiAwIH07XG4gICAgfVxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzOiBhbnkpIHtcbiAgICAgICAgdGhpcy5zdXJ2ZXkgPSBuZXh0UHJvcHMuc3VydmV5O1xuICAgICAgICB0aGlzLmNzcyA9IG5leHRQcm9wcy5jc3M7XG4gICAgfVxuICAgIHByaXZhdGUgdXBkYXRlU3RhdGVGdW5jdGlvbjogYW55ID0gbnVsbDtcbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlRnVuY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5zdGF0ZS51cGRhdGUgPSBzZWxmLnN0YXRlLnVwZGF0ZSArIDE7XG4gICAgICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZShzZWxmLnN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3VydmV5Lm9uUGFnZVZpc2libGVDaGFuZ2VkLmFkZCh0aGlzLnVwZGF0ZVN0YXRlRnVuY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICBpZiAodGhpcy5zdXJ2ZXkgJiYgdGhpcy51cGRhdGVTdGF0ZUZ1bmN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnN1cnZleS5vblBhZ2VWaXNpYmxlQ2hhbmdlZC5yZW1vdmUodGhpcy51cGRhdGVTdGF0ZUZ1bmN0aW9uKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGVGdW5jdGlvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RTdXJ2ZXlOYXZpZ2F0aW9uQmFzZS50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1N1cnZleVF1ZXN0aW9ufSBmcm9tICcuL3JlYWN0cXVlc3Rpb24nXG5pbXBvcnQge1BhZ2VNb2RlbH0gZnJvbSBcIi4uL3BhZ2VcIjtcbmltcG9ydCB7U3VydmV5TW9kZWx9IGZyb20gXCIuLi9zdXJ2ZXlcIjtcbmltcG9ydCB7SVN1cnZleUNyZWF0b3J9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25cIjtcbmltcG9ydCB7UXVlc3Rpb25Sb3dNb2RlbCwgUGFuZWxNb2RlbH0gZnJvbSBcIi4uL3BhbmVsXCI7XG5pbXBvcnQge1F1ZXN0aW9uQmFzZX0gZnJvbSBcIi4uL3F1ZXN0aW9uYmFzZVwiO1xuaW1wb3J0IHtTdXJ2ZXlFbGVtZW50QmFzZX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVBhZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8YW55LCBhbnk+IHtcbiAgICBwcml2YXRlIHBhZ2U6IFBhZ2VNb2RlbDtcbiAgICBwcml2YXRlIHN1cnZleTogU3VydmV5TW9kZWw7XG4gICAgcHJpdmF0ZSBjcmVhdG9yOiBJU3VydmV5Q3JlYXRvcjtcbiAgICBwcm90ZWN0ZWQgY3NzOiBhbnk7XG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMucGFnZSA9IHByb3BzLnBhZ2U7XG4gICAgICAgIHRoaXMuc3VydmV5ID0gcHJvcHMuc3VydmV5O1xuICAgICAgICB0aGlzLmNyZWF0b3IgPSBwcm9wcy5jcmVhdG9yO1xuICAgICAgICB0aGlzLmNzcyA9IHByb3BzLmNzcztcbiAgICB9XG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xuICAgICAgICB0aGlzLnBhZ2UgPSBuZXh0UHJvcHMucGFnZTtcbiAgICAgICAgdGhpcy5zdXJ2ZXkgPSBuZXh0UHJvcHMuc3VydmV5O1xuICAgICAgICB0aGlzLmNyZWF0b3IgPSBuZXh0UHJvcHMuY3JlYXRvcjtcbiAgICAgICAgdGhpcy5jc3MgPSBuZXh0UHJvcHMuY3NzO1xuICAgIH1cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgdmFyIGVsID0gdGhpcy5yZWZzW1wicm9vdFwiXTtcbiAgICAgICAgaWYgKGVsICYmIHRoaXMuc3VydmV5KSB0aGlzLnN1cnZleS5hZnRlclJlbmRlclBhZ2UoZWwpO1xuICAgIH1cbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICBpZiAodGhpcy5wYWdlID09IG51bGwgfHwgdGhpcy5zdXJ2ZXkgPT0gbnVsbCB8fCB0aGlzLmNyZWF0b3IgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciB0aXRsZSA9IHRoaXMucmVuZGVyVGl0bGUoKTtcbiAgICAgICAgdmFyIGRlc2NyaXB0aW9uID0gdGhpcy5yZW5kZXJEZXNjcmlwdGlvbigpO1xuICAgICAgICB2YXIgcm93cyA9IFtdO1xuICAgICAgICB2YXIgcXVlc3Rpb25Sb3dzID0gdGhpcy5wYWdlLnJvd3M7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25Sb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByb3dzLnB1c2godGhpcy5jcmVhdGVSb3cocXVlc3Rpb25Sb3dzW2ldLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgcmVmPVwicm9vdFwiPlxuICAgICAgICAgICAgICAgIHt0aXRsZX1cbiAgICAgICAgICAgICAgICB7ZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAge3Jvd3N9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGNyZWF0ZVJvdyhyb3c6IFF1ZXN0aW9uUm93TW9kZWwsIGluZGV4OiBudW1iZXIpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIHZhciByb3dOYW1lID0gXCJyb3dcIiArIChpbmRleCArIDEpO1xuICAgICAgICByZXR1cm4gPFN1cnZleVJvdyBrZXk9e3Jvd05hbWV9IHJvdz17cm93fSBzdXJ2ZXk9e3RoaXMuc3VydmV5fSBjcmVhdG9yPXt0aGlzLmNyZWF0b3J9IGNzcz17dGhpcy5jc3N9IC8+O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgcmVuZGVyVGl0bGUoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICBpZiAoIXRoaXMucGFnZS50aXRsZSB8fCAhdGhpcy5zdXJ2ZXkuc2hvd1BhZ2VUaXRsZXMpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgdGV4dCA9IFN1cnZleUVsZW1lbnRCYXNlLnJlbmRlckxvY1N0cmluZyh0aGlzLnBhZ2UubG9jVGl0bGUpO1xuICAgICAgICByZXR1cm4gKDxoNCBjbGFzc05hbWU9e3RoaXMuY3NzLnBhZ2VUaXRsZX0+e3RleHR9PC9oND4pO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgcmVuZGVyRGVzY3JpcHRpb24oKTogSlNYLkVsZW1lbnQge1xuICAgICAgICBpZiAoIXRoaXMucGFnZS5kZXNjcmlwdGlvbiB8fCAhdGhpcy5zdXJ2ZXkuc2hvd1BhZ2VUaXRsZXMpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgdGV4dCA9IFN1cnZleUVsZW1lbnRCYXNlLnJlbmRlckxvY1N0cmluZyh0aGlzLnBhZ2UubG9jRGVzY3JpcHRpb24pO1xuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXt0aGlzLmNzcy5wYWdlRGVzY3JpcHRpb259Pnt0ZXh0fTwvZGl2Pik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5UGFuZWwgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8YW55LCBhbnk+IHtcbiAgICBwcml2YXRlIHBhbmVsOiBQYW5lbE1vZGVsO1xuICAgIHByaXZhdGUgc3VydmV5OiBTdXJ2ZXlNb2RlbDtcbiAgICBwcml2YXRlIGNyZWF0b3I6IElTdXJ2ZXlDcmVhdG9yO1xuICAgIHByb3RlY3RlZCBjc3M6IGFueTtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5wYW5lbCA9IHByb3BzLnBhbmVsO1xuICAgICAgICB0aGlzLnN1cnZleSA9IHByb3BzLnN1cnZleTtcbiAgICAgICAgdGhpcy5jcmVhdG9yID0gcHJvcHMuY3JlYXRvcjtcbiAgICAgICAgdGhpcy5jc3MgPSBwcm9wcy5jc3M7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7IG1vZGVsQ2hhbmdlZDogMCB9O1xuICAgIH1cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wczogYW55KSB7XG4gICAgICAgIHRoaXMucGFuZWwgPSBuZXh0UHJvcHMucGFuZWw7XG4gICAgICAgIHRoaXMuc3VydmV5ID0gbmV4dFByb3BzLnN1cnZleTtcbiAgICAgICAgdGhpcy5jcmVhdG9yID0gbmV4dFByb3BzLmNyZWF0b3I7XG4gICAgICAgIHRoaXMuY3NzID0gbmV4dFByb3BzLmNzcztcbiAgICB9XG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgbGV0IGVsID0gdGhpcy5yZWZzWydyb290J107XG4gICAgICAgIGlmIChlbCAmJiB0aGlzLnN1cnZleSkgeyB0aGlzLnN1cnZleS5hZnRlclJlbmRlclBhbmVsKHRoaXMucGFuZWwsIGVsKTsgfVxuICAgICAgICB0aGlzLnBhbmVsLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoW1wiaXNWaXNpYmxlXCIsIFwicmVuZGVyV2lkdGhcIiwgXCJpbm5lckluZGVudFwiLCBcInJpZ2h0SW5kZW50XCJdLCBmdW5jdGlvbiAoKSB7IFxuICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUubW9kZWxDaGFuZ2VkID0gc2VsZi5zdGF0ZS5tb2RlbENoYW5nZWQgKyAxO1xuICAgICAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoc2VsZi5zdGF0ZSk7XG4gICAgICAgICAgICB9LCBcInJlYWN0XCIpO1xuICAgIH1cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFuZWwpIHtcbiAgICAgICAgICAgIHRoaXMucGFuZWwudW5SZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFtcImlzVmlzaWJsZVwiLCBcInJlbmRlcldpZHRoXCIsIFwiaW5uZXJJbmRlbnRcIiwgXCJyaWdodEluZGVudFwiXSwgXCJyZWFjdFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICBpZiAodGhpcy5wYW5lbCA9PSBudWxsIHx8IHRoaXMuc3VydmV5ID09IG51bGwgfHwgdGhpcy5jcmVhdG9yID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIXRoaXMucGFuZWwuaXNWaXNpYmxlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIHRpdGxlID0gdGhpcy5yZW5kZXJUaXRsZSgpO1xuICAgICAgICB2YXIgZGVzY3JpcHRpb24gPSB0aGlzLnJlbmRlckRlc2NyaXB0aW9uKCk7XG4gICAgICAgIHZhciByb3dzID0gW107XG4gICAgICAgIHZhciBxdWVzdGlvblJvd3MgPSB0aGlzLnBhbmVsLnJvd3M7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25Sb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByb3dzLnB1c2godGhpcy5jcmVhdGVSb3cocXVlc3Rpb25Sb3dzW2ldLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0eWxlID0geyBcInBhZGRpbmdMZWZ0XCI6IHRoaXMucGFuZWwuaW5uZXJJbmRlbnQgKiB0aGlzLmNzcy5xdWVzdGlvbi5pbmRlbnQgKyAncHgnIH07XG4gICAgICAgIHZhciByb290U3R5bGUgPSB7IH07XG4gICAgICAgIGlmICh0aGlzLnBhbmVsLnJlbmRlcldpZHRoKSByb290U3R5bGVbXCJ3aWR0aFwiXSA9IHRoaXMucGFuZWwucmVuZGVyV2lkdGg7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IHJlZj1cInJvb3RcIiBjbGFzc05hbWU9e3RoaXMuY3NzLnBhbmVsLmNvbnRhaW5lcn0gc3R5bGU9e3Jvb3RTdHlsZX0+XG4gICAgICAgICAgICAgICAge3RpdGxlfVxuICAgICAgICAgICAgICAgIHtkZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtzdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIHtyb3dzfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBjcmVhdGVSb3cocm93OiBRdWVzdGlvblJvd01vZGVsLCBpbmRleDogbnVtYmVyKTogSlNYLkVsZW1lbnQge1xuICAgICAgICB2YXIgcm93TmFtZSA9IFwicm93XCIgKyAoaW5kZXggKyAxKTtcbiAgICAgICAgcmV0dXJuIDxTdXJ2ZXlSb3cga2V5PXtyb3dOYW1lfSByb3c9e3Jvd30gc3VydmV5PXt0aGlzLnN1cnZleX0gY3JlYXRvcj17dGhpcy5jcmVhdG9yfSBjc3M9e3RoaXMuY3NzfSAvPjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHJlbmRlclRpdGxlKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgaWYgKCF0aGlzLnBhbmVsLnRpdGxlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIHRleHQgPSBTdXJ2ZXlFbGVtZW50QmFzZS5yZW5kZXJMb2NTdHJpbmcodGhpcy5wYW5lbC5sb2NUaXRsZSk7XG4gICAgICAgIHJldHVybiAoPGg0IGNsYXNzTmFtZT17dGhpcy5jc3MucGFuZWwudGl0bGV9Pnt0ZXh0fTwvaDQ+KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHJlbmRlckRlc2NyaXB0aW9uKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgaWYgKCF0aGlzLnBhbmVsLmRlc2NyaXB0aW9uKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIHRleHQgPSBTdXJ2ZXlFbGVtZW50QmFzZS5yZW5kZXJMb2NTdHJpbmcodGhpcy5wYW5lbC5sb2NEZXNjcmlwdGlvbik7XG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3RoaXMuY3NzLnBhbmVsLmRlc2NyaXB0aW9ufT57dGV4dH08L2Rpdj4pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVJvdyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxhbnksIGFueT4ge1xuICAgIHByaXZhdGUgcm93OiBRdWVzdGlvblJvd01vZGVsO1xuICAgIHByaXZhdGUgc3VydmV5OiBTdXJ2ZXlNb2RlbDtcbiAgICBwcml2YXRlIGNyZWF0b3I6IElTdXJ2ZXlDcmVhdG9yO1xuICAgIHByb3RlY3RlZCBjc3M6IGFueTtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0aWVzKHByb3BzKTtcbiAgICB9XG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xuICAgICAgICB0aGlzLnNldFByb3BlcnRpZXMobmV4dFByb3BzKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzZXRQcm9wZXJ0aWVzKHByb3BzOiBhbnkpIHtcbiAgICAgICAgdGhpcy5yb3cgPSBwcm9wcy5yb3c7XG4gICAgICAgIGlmICh0aGlzLnJvdykge1xuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5yb3cudmlzaWJpbGl0eUNoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHsgc2VsZi5zZXRTdGF0ZSh7IHZpc2libGU6IHNlbGYucm93LnZpc2libGUgfSk7IH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN1cnZleSA9IHByb3BzLnN1cnZleTtcbiAgICAgICAgdGhpcy5jcmVhdG9yID0gcHJvcHMuY3JlYXRvcjtcbiAgICAgICAgdGhpcy5jc3MgPSBwcm9wcy5jc3M7XG4gICAgfVxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIGlmICh0aGlzLnJvdyA9PSBudWxsIHx8IHRoaXMuc3VydmV5ID09IG51bGwgfHwgdGhpcy5jcmVhdG9yID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgcXVlc3Rpb25zID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMucm93LnZpc2libGUpIHtcbiAgICAgICAgICAgIHF1ZXN0aW9ucyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvdy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBxdWVzdGlvbiA9IHRoaXMucm93LmVsZW1lbnRzW2ldIGFzIFF1ZXN0aW9uQmFzZTtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbnMucHVzaCh0aGlzLmNyZWF0ZVF1ZXN0aW9uKHF1ZXN0aW9uKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0eWxlID0gdGhpcy5yb3cudmlzaWJsZSA/ICB7fSA6IHsgZGlzcGxheTogXCJub25lXCIgfTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmNzcy5yb3d9IHN0eWxlPXtzdHlsZX0+XG4gICAgICAgICAgICAgICAge3F1ZXN0aW9uc31cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgY3JlYXRlUXVlc3Rpb24ocXVlc3Rpb246IFF1ZXN0aW9uQmFzZSk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmlzUGFuZWwpIHtcbiAgICAgICAgICAgIHJldHVybiA8U3VydmV5UGFuZWwga2V5PXtxdWVzdGlvbi5uYW1lfSBwYW5lbD17cXVlc3Rpb259IGNyZWF0b3I9e3RoaXMuY3JlYXRvcn0gc3VydmV5PXt0aGlzLnN1cnZleX0gY3NzPXt0aGlzLmNzc30gLz47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gPFN1cnZleVF1ZXN0aW9uIGtleT17cXVlc3Rpb24ubmFtZX0gcXVlc3Rpb249e3F1ZXN0aW9ufSBjcmVhdG9yPXt0aGlzLmNyZWF0b3J9IGNzcz17dGhpcy5jc3N9IC8+O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cGFnZS50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1F1ZXN0aW9uQmFzZX0gZnJvbSAnLi4vcXVlc3Rpb25iYXNlJztcbmltcG9ydCB7UXVlc3Rpb259IGZyb20gJy4uL3F1ZXN0aW9uJztcbmltcG9ydCB7U3VydmV5UXVlc3Rpb25Db21tZW50SXRlbX0gZnJvbSAnLi9yZWFjdHF1ZXN0aW9uY29tbWVudCc7XG5pbXBvcnQge1N1cnZleUVsZW1lbnRCYXNlLCBSZWFjdFN1cnZleUVsZW1lbnR9IGZyb20gJy4vcmVhY3RxdWVzdGlvbmVsZW1lbnQnO1xuaW1wb3J0IHtTdXJ2ZXlDdXN0b21XaWRnZXR9IGZyb20gJy4vY3VzdG9tLXdpZGdldCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cnZleUNyZWF0b3Ige1xuICAgIGNyZWF0ZVF1ZXN0aW9uRWxlbWVudChxdWVzdGlvbjogUXVlc3Rpb25CYXNlKTogSlNYLkVsZW1lbnQ7XG4gICAgcmVuZGVyRXJyb3Ioa2V5OiBzdHJpbmcsIGVycm9yVGV4dDogc3RyaW5nLCBjc3NDbGFzc2VzOiBhbnkpOiBKU1guRWxlbWVudDtcbiAgICBxdWVzdGlvblRpdGxlTG9jYXRpb24oKTogc3RyaW5nO1xuICAgIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbigpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxhbnksIGFueT4ge1xuICAgIHByaXZhdGUgcXVlc3Rpb25CYXNlOiBRdWVzdGlvbkJhc2U7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbjtcbiAgICBwcml2YXRlIGNyZWF0b3I6IElTdXJ2ZXlDcmVhdG9yO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnNldFF1ZXN0aW9uKHByb3BzLnF1ZXN0aW9uKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICAgICAgdGhpcy5jcmVhdG9yID0gcHJvcHMuY3JlYXRvcjtcbiAgICB9XG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xuICAgICAgICB0aGlzLmNyZWF0b3IgPSBuZXh0UHJvcHMuY3JlYXRvcjtcbiAgICAgICAgdGhpcy5zZXRRdWVzdGlvbihuZXh0UHJvcHMucXVlc3Rpb24pO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHRoaXMuZ2V0U3RhdGUoKSk7XG4gICAgfVxuICAgIHByaXZhdGUgc2V0UXVlc3Rpb24ocXVlc3Rpb24pIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbkJhc2UgPSBxdWVzdGlvbjtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IHF1ZXN0aW9uIGluc3RhbmNlb2YgUXVlc3Rpb24gPyBxdWVzdGlvbiA6IG51bGw7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0U3RhdGUoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMucXVlc3Rpb24gPyB0aGlzLnF1ZXN0aW9uLnZhbHVlIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZpc2libGU6IHRoaXMucXVlc3Rpb25CYXNlLnZpc2libGUsIHZhbHVlOiB2YWx1ZSwgZXJyb3I6IDAsIHJlbmRlcldpZHRoOiAwLFxuICAgICAgICAgICAgdmlzaWJsZUluZGV4VmFsdWU6IC0xLCBpc1JlYWRPbmx5IDogdGhpcy5xdWVzdGlvbkJhc2UuaXNSZWFkT25seVxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25CYXNlKSB7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uQmFzZVtcInJlYWN0XCJdID0gc2VsZjtcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25CYXNlLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoW1wicmVuZGVyV2lkdGhcIiwgXCJpbmRlbnRcIiwgXCJyaWdodEluZGVudFwiXSwgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZS5yZW5kZXJXaWR0aCA9IHNlbGYuc3RhdGUucmVuZGVyV2lkdGggKyAxO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFN0YXRlKHNlbGYuc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICB9LCBcInJlYWN0XCIpO1xuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbkJhc2UucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJ2aXNpYmxlSW5kZXhcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUudmlzaWJsZUluZGV4VmFsdWUgPSBzZWxmLnF1ZXN0aW9uQmFzZS52aXNpYmxlSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoc2VsZi5zdGF0ZSk7XG4gICAgICAgICAgICAgICAgfSwgXCJyZWFjdFwiKTtcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25CYXNlLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiaXNSZWFkT25seVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZS5pc1JlYWRPbmx5ID0gc2VsZi5xdWVzdGlvbkJhc2UuaXNSZWFkT25seTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZShzZWxmLnN0YXRlKTtcbiAgICAgICAgICAgICAgICB9LCBcInJlYWN0XCIpO1xuICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5yZWZzW1wicm9vdFwiXTtcbiAgICAgICAgICAgIGlmIChlbCAmJiB0aGlzLnF1ZXN0aW9uQmFzZS5zdXJ2ZXkpIHRoaXMucXVlc3Rpb25CYXNlLnN1cnZleS5hZnRlclJlbmRlclF1ZXN0aW9uKHRoaXMucXVlc3Rpb25CYXNlLCBlbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uQmFzZSkge1xuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbkJhc2VbXCJyZWFjdFwiXSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uQmFzZS51blJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoW1widmlzaWJsZUluZGV4XCIsIFwicmVuZGVyV2lkdGhcIiwgXCJpbmRlbnRcIiwgXCJyaWdodEluZGVudCwgaXNSZWFkT25seVwiXSwgXCJyZWFjdFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICBpZiAoIXRoaXMucXVlc3Rpb25CYXNlIHx8ICF0aGlzLmNyZWF0b3IpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIXRoaXMucXVlc3Rpb25CYXNlLnZpc2libGUpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgY3NzQ2xhc3NlcyA9IHRoaXMucXVlc3Rpb25CYXNlLmNzc0NsYXNzZXM7XG4gICAgICAgIHZhciBxdWVzdGlvblJlbmRlciA9IHRoaXMucmVuZGVyUXVlc3Rpb24oKTtcbiAgICAgICAgdmFyIHRpdGxlID0gdGhpcy5xdWVzdGlvbkJhc2UuaGFzVGl0bGUgPyB0aGlzLnJlbmRlclRpdGxlKGNzc0NsYXNzZXMpIDogbnVsbDtcbiAgICAgICAgdmFyIGRlc2NyaXB0aW9uID0gdGhpcy5yZW5kZXJEZXNjcmlwdGlvbihjc3NDbGFzc2VzKTtcbiAgICAgICAgdmFyIHRpdGxlVG9wID0gKHRoaXMucXVlc3Rpb24gJiYgdGhpcy5xdWVzdGlvbi50aXRsZUxvY2F0aW9uID09IFwidG9wXCIpID8gdGl0bGUgOiBudWxsO1xuICAgICAgICB2YXIgdGl0bGVCb3R0b20gPSAodGhpcy5xdWVzdGlvbiAmJiB0aGlzLnF1ZXN0aW9uLnRpdGxlTG9jYXRpb24gPT0gXCJib3R0b21cIikgPyB0aXRsZSA6IG51bGw7XG4gICAgICAgIHZhciB0aXRsZUxlZnQgPSAodGhpcy5xdWVzdGlvbiAmJiB0aGlzLnF1ZXN0aW9uLnRpdGxlTG9jYXRpb24gPT0gXCJsZWZ0XCIpID8gdGl0bGUgOiBudWxsO1xuICAgICAgICB2YXIgdGl0bGVMZWZ0Q2xhc3MgPSAodGhpcy5xdWVzdGlvbiAmJiB0aGlzLnF1ZXN0aW9uLnRpdGxlTG9jYXRpb24gPT09ICdsZWZ0JykgPyBcInRpdGxlLWxlZnRcIiA6IG51bGw7XG4gICAgICAgIHZhciBjb250ZW50TGVmdENsYXNzID0gKHRoaXMucXVlc3Rpb24gJiYgdGhpcy5xdWVzdGlvbi50aXRsZUxvY2F0aW9uID09PSAnbGVmdCcpID8gXCJjb250ZW50LWxlZnRcIiA6IG51bGw7XG4gICAgICAgIHZhciBkZXNjcmlwdGlvbkxlZnQgPSAodGhpcy5xdWVzdGlvbiAmJiB0aGlzLnF1ZXN0aW9uLnRpdGxlTG9jYXRpb24gPT0gXCJsZWZ0XCIpID8gZGVzY3JpcHRpb24gOiBudWxsO1xuICAgICAgICB2YXIgZGVzY3JpcHRpb25Ub3AgPSAodGhpcy5xdWVzdGlvbiAmJiB0aGlzLnF1ZXN0aW9uLnRpdGxlTG9jYXRpb24gPT0gXCJ0b3BcIikgPyBkZXNjcmlwdGlvbiA6IG51bGw7XG4gICAgICAgIHZhciBkZXNjcmlwdGlvbkJvdHRvbSA9ICh0aGlzLnF1ZXN0aW9uICYmIHRoaXMucXVlc3Rpb24udGl0bGVMb2NhdGlvbiA9PSBcImJvdHRvbVwiKSA/IGRlc2NyaXB0aW9uIDogbnVsbDtcbiAgICAgICAgdmFyIGNvbW1lbnQgPSAodGhpcy5xdWVzdGlvbiAmJiB0aGlzLnF1ZXN0aW9uLmhhc0NvbW1lbnQpID8gdGhpcy5yZW5kZXJDb21tZW50KGNzc0NsYXNzZXMpIDogbnVsbDtcbiAgICAgICAgdmFyIGVycm9ycyA9IHRoaXMucmVuZGVyRXJyb3JzKGNzc0NsYXNzZXMpO1xuICAgICAgICB2YXIgZXJyb3JzVG9wID0gdGhpcy5jcmVhdG9yLnF1ZXN0aW9uRXJyb3JMb2NhdGlvbigpID09IFwidG9wXCIgPyBlcnJvcnMgOiBudWxsO1xuICAgICAgICB2YXIgZXJyb3JzQm90dG9tID0gdGhpcy5jcmVhdG9yLnF1ZXN0aW9uRXJyb3JMb2NhdGlvbigpID09IFwiYm90dG9tXCIgPyBlcnJvcnMgOiBudWxsO1xuICAgICAgICB2YXIgcGFkZGluZ0xlZnQgPSAodGhpcy5xdWVzdGlvbkJhc2UuaW5kZW50ID4gMCkgPyB0aGlzLnF1ZXN0aW9uQmFzZS5pbmRlbnQgKiBjc3NDbGFzc2VzLmluZGVudCArIFwicHhcIiA6IG51bGw7XG4gICAgICAgIHZhciBwYWRkaW5nUmlnaHQgPSAodGhpcy5xdWVzdGlvbkJhc2UucmlnaHRJbmRlbnQgPiAwKSA/IHRoaXMucXVlc3Rpb25CYXNlLnJpZ2h0SW5kZW50ICogY3NzQ2xhc3Nlcy5pbmRlbnQgKyBcInB4XCIgOiBudWxsO1xuICAgICAgICBsZXQgcm9vdFN0eWxlID0geyB9O1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbkJhc2UucmVuZGVyV2lkdGgpIHJvb3RTdHlsZVtcIndpZHRoXCJdID0gdGhpcy5xdWVzdGlvbkJhc2UucmVuZGVyV2lkdGg7XG4gICAgICAgIGlmIChwYWRkaW5nTGVmdCkgcm9vdFN0eWxlW1wicGFkZGluZ0xlZnRcIl0gPSBwYWRkaW5nTGVmdDtcbiAgICAgICAgaWYgKHBhZGRpbmdSaWdodCkgcm9vdFN0eWxlW1wicGFkZGluZ1JpZ2h0XCJdID0gcGFkZGluZ1JpZ2h0O1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IHJlZj1cInJvb3RcIiBpZD17dGhpcy5xdWVzdGlvbkJhc2UuaWR9IGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5tYWluUm9vdH0gc3R5bGU9e3Jvb3RTdHlsZX0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3RpdGxlTGVmdENsYXNzfT5cbiAgICAgICAgICAgICAgICAgICAge3RpdGxlVG9wfVxuICAgICAgICAgICAgICAgICAgICB7ZGVzY3JpcHRpb25Ub3B9XG4gICAgICAgICAgICAgICAgICAgIHt0aXRsZUxlZnR9XG4gICAgICAgICAgICAgICAgICAgIHtkZXNjcmlwdGlvbkxlZnR9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NvbnRlbnRMZWZ0Q2xhc3N9PlxuICAgICAgICAgICAgICAgICAgICB7ZXJyb3JzVG9wfVxuICAgICAgICAgICAgICAgICAgICB7cXVlc3Rpb25SZW5kZXJ9XG4gICAgICAgICAgICAgICAgICAgIHtjb21tZW50fVxuICAgICAgICAgICAgICAgICAgICB7ZXJyb3JzQm90dG9tfVxuICAgICAgICAgICAgICAgICAgICB7dGl0bGVCb3R0b219XG4gICAgICAgICAgICAgICAgICAgIHtkZXNjcmlwdGlvbkJvdHRvbX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgcmVuZGVyUXVlc3Rpb24oKTogSlNYLkVsZW1lbnQge1xuICAgICAgICB2YXIgY3VzdG9tV2lkZ2V0ID0gdGhpcy5xdWVzdGlvbkJhc2UuY3VzdG9tV2lkZ2V0O1xuICAgICAgICBpZiAoIWN1c3RvbVdpZGdldCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRvci5jcmVhdGVRdWVzdGlvbkVsZW1lbnQodGhpcy5xdWVzdGlvbkJhc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiA8U3VydmV5Q3VzdG9tV2lkZ2V0IGNyZWF0b3I9e3RoaXMuY3JlYXRvcn0gcXVlc3Rpb249e3RoaXMucXVlc3Rpb25CYXNlfT48L1N1cnZleUN1c3RvbVdpZGdldD5cbiAgICB9XG4gICAgcHJvdGVjdGVkIHJlbmRlclRpdGxlKGNzc0NsYXNzZXM6IGFueSk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgdmFyIHRpdGxlVGV4dCA9IFN1cnZleUVsZW1lbnRCYXNlLnJlbmRlckxvY1N0cmluZyh0aGlzLnF1ZXN0aW9uLmxvY1RpdGxlKTtcbiAgICAgICAgcmV0dXJuIDxoNSBjbGFzc05hbWU9e2Nzc0NsYXNzZXMudGl0bGV9Pnt0aXRsZVRleHR9PC9oNT47XG4gICAgfVxuICAgIHByb3RlY3RlZCByZW5kZXJEZXNjcmlwdGlvbihjc3NDbGFzc2VzOiBhbnkpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIGlmKCF0aGlzLnF1ZXN0aW9uQmFzZS5oYXNEZXNjcmlwdGlvbikgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBkZXNjcmlwdGlvblRleHQgPSBTdXJ2ZXlFbGVtZW50QmFzZS5yZW5kZXJMb2NTdHJpbmcodGhpcy5xdWVzdGlvbi5sb2NEZXNjcmlwdGlvbik7XG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5kZXNjcmlwdGlvbn0+e2Rlc2NyaXB0aW9uVGV4dH08L2Rpdj47XG4gICAgfVxuICAgIHByb3RlY3RlZCByZW5kZXJDb21tZW50KGNzc0NsYXNzZXM6IGFueSk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgdmFyIGNvbW1lbnRUZXh0ID0gU3VydmV5RWxlbWVudEJhc2UucmVuZGVyTG9jU3RyaW5nKHRoaXMucXVlc3Rpb24ubG9jQ29tbWVudFRleHQpO1xuICAgICAgICByZXR1cm4gKDxkaXY+XG4gICAgICAgICAgICA8ZGl2Pntjb21tZW50VGV4dH08L2Rpdj5cbiAgICAgICAgICAgIDxTdXJ2ZXlRdWVzdGlvbkNvbW1lbnRJdGVtICBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn0gY3NzQ2xhc3Nlcz17Y3NzQ2xhc3Nlc30gLz5cbiAgICAgICAgPC9kaXY+KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHJlbmRlckVycm9ycyhjc3NDbGFzc2VzOiBhbnkpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIHJldHVybiA8U3VydmV5UXVlc3Rpb25FcnJvcnMgcXVlc3Rpb249e3RoaXMucXVlc3Rpb259IGNzc0NsYXNzZXM9e2Nzc0NsYXNzZXN9IGNyZWF0b3I9e3RoaXMuY3JlYXRvcn0gLz5cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkVycm9ycyBleHRlbmRzIFJlYWN0U3VydmV5RWxlbWVudCB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbjtcbiAgICBwcml2YXRlIGNyZWF0b3I6IElTdXJ2ZXlDcmVhdG9yO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnNldFF1ZXN0aW9uKHByb3BzLnF1ZXN0aW9uKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKVxuICAgICAgICB0aGlzLmNyZWF0b3IgPSBwcm9wcy5jcmVhdG9yO1xuICAgIH1cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wczogYW55KSB7XG4gICAgICAgIHRoaXMuc2V0UXVlc3Rpb24obmV4dFByb3BzLnF1ZXN0aW9uKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh0aGlzLmdldFN0YXRlKCkpO1xuICAgICAgICB0aGlzLmNyZWF0b3IgPSBuZXh0UHJvcHMuY3JlYXRvcjtcbiAgICB9XG4gICAgcHJpdmF0ZSBzZXRRdWVzdGlvbihxdWVzdGlvbikge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gcXVlc3Rpb24gaW5zdGFuY2VvZiBRdWVzdGlvbiA/IHF1ZXN0aW9uIDogbnVsbDtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uZXJyb3JzQ2hhbmdlZENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUodGhpcy5nZXRTdGF0ZSh0aGlzLnN0YXRlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRTdGF0ZShwcmV2U3RhdGUgPSBudWxsKSB7XG4gICAgICAgIHJldHVybiAhcHJldlN0YXRlID8geyBlcnJvcjogMCB9IDogeyBlcnJvcjogcHJldlN0YXRlLmVycm9yICsgMSB9O1xuICAgIH1cbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICBpZiAoIXRoaXMucXVlc3Rpb24gfHwgdGhpcy5xdWVzdGlvbi5lcnJvcnMubGVuZ3RoID09IDApIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgZXJyb3JzID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi5lcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBlcnJvclRleHQgPSB0aGlzLnF1ZXN0aW9uLmVycm9yc1tpXS5nZXRUZXh0KCk7XG4gICAgICAgICAgICB2YXIga2V5ID0gXCJlcnJvclwiICsgaTtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHRoaXMuY3JlYXRvci5yZW5kZXJFcnJvcihrZXksIGVycm9yVGV4dCwgdGhpcy5jc3NDbGFzc2VzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICg8ZGl2IHJvbGU9XCJhbGVydFwiIGNsYXNzTmFtZT17dGhpcy5jc3NDbGFzc2VzLmVycm9yLnJvb3R9PntlcnJvcnN9PC9kaXY+KTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbi50c3giLCJpbXBvcnQge0Jhc2UsIFN1cnZleUVycm9yfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQge0N1c3RvbUVycm9yLCBSZXF1cmVOdW1lcmljRXJyb3J9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQge3N1cnZleUxvY2FsaXphdGlvbn0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tICcuL2pzb25vYmplY3QnO1xuXG5leHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVzdWx0IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdmFsdWU6IGFueSwgcHVibGljIGVycm9yOiBTdXJ2ZXlFcnJvciA9IG51bGwpIHtcbiAgICB9XG59XG4vKipcbiAqIEJhc2UgU3VydmV5SlMgdmFsaWRhdG9yIGNsYXNzLlxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5VmFsaWRhdG9yIGV4dGVuZHMgQmFzZSB7XG4gICAgcHVibGljIHRleHQ6IHN0cmluZyA9IFwiXCI7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRFcnJvclRleHQobmFtZTogc3RyaW5nKSA6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnRleHQpIHJldHVybiB0aGlzLnRleHQ7XG4gICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRFcnJvclRleHQobmFtZSk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXREZWZhdWx0RXJyb3JUZXh0KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBwdWJsaWMgdmFsaWRhdGUodmFsdWU6IGFueSwgbmFtZTogc3RyaW5nID0gbnVsbCk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVZhbGlkYXRvck93bmVyIHtcbiAgICB2YWxpZGF0b3JzOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+O1xuICAgIHZhbGlkYXRlZFZhbHVlOiBhbnk7XG4gICAgZ2V0VmFsaWRhdG9yVGl0bGUoKTogc3RyaW5nO1xufVxuZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJ1bm5lciB7XG4gICAgcHVibGljIHJ1bihvd25lcjogSVZhbGlkYXRvck93bmVyKTogU3VydmV5RXJyb3Ige1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG93bmVyLnZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB2YWxpZGF0b3JSZXN1bHQgPSBvd25lci52YWxpZGF0b3JzW2ldLnZhbGlkYXRlKG93bmVyLnZhbGlkYXRlZFZhbHVlLCBvd25lci5nZXRWYWxpZGF0b3JUaXRsZSgpKTtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0b3JSZXN1bHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3JSZXN1bHQuZXJyb3IpIHJldHVybiB2YWxpZGF0b3JSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvclJlc3VsdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBvd25lci52YWxpZGF0ZWRWYWx1ZSA9IHZhbGlkYXRvclJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuLyoqXG4gKiBWYWxpZGF0ZSBudW1lcmljIHZhbHVlcy4gXG4gKi9cbmV4cG9ydCBjbGFzcyBOdW1lcmljVmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWluVmFsdWU6IG51bWJlciA9IG51bGwsIHB1YmxpYyBtYXhWYWx1ZTogbnVtYmVyID0gbnVsbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcgeyByZXR1cm4gXCJudW1lcmljdmFsaWRhdG9yXCI7IH1cbiAgICBwdWJsaWMgdmFsaWRhdGUodmFsdWU6IGFueSwgbmFtZTogc3RyaW5nID0gbnVsbCk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgICAgIGlmICghdGhpcy5pc051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KG51bGwsIG5ldyBSZXF1cmVOdW1lcmljRXJyb3IoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQocGFyc2VGbG9hdCh2YWx1ZSkpO1xuICAgICAgICBpZiAodGhpcy5taW5WYWx1ZSAhPT0gbnVsbCAmJiB0aGlzLm1pblZhbHVlID4gcmVzdWx0LnZhbHVlKSB7XG4gICAgICAgICAgICByZXN1bHQuZXJyb3IgPSBuZXcgQ3VzdG9tRXJyb3IodGhpcy5nZXRFcnJvclRleHQobmFtZSkpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tYXhWYWx1ZSAhPT0gbnVsbCAmJiB0aGlzLm1heFZhbHVlIDwgcmVzdWx0LnZhbHVlKSB7XG4gICAgICAgICAgICByZXN1bHQuZXJyb3IgPSBuZXcgQ3VzdG9tRXJyb3IodGhpcy5nZXRFcnJvclRleHQobmFtZSkpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpID8gbnVsbCA6IHJlc3VsdDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHZhciB2TmFtZSA9IG5hbWUgPyBuYW1lIDogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInZhbHVlXCIpO1xuICAgICAgICBpZiAodGhpcy5taW5WYWx1ZSAhPT0gbnVsbCAmJiB0aGlzLm1heFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm51bWVyaWNNaW5NYXhcIilbXCJmb3JtYXRcIl0odk5hbWUsIHRoaXMubWluVmFsdWUsIHRoaXMubWF4VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMubWluVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm51bWVyaWNNaW5cIilbXCJmb3JtYXRcIl0odk5hbWUsIHRoaXMubWluVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJudW1lcmljTWF4XCIpW1wiZm9ybWF0XCJdKHZOYW1lLCB0aGlzLm1heFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGlzTnVtYmVyKHZhbHVlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdCh2YWx1ZSkpICYmIGlzRmluaXRlKHZhbHVlKTtcbiAgICB9XG59XG4vKipcbiAqIFZhbGlkYXRlIHRleHQgdmFsdWVzXG4gKi9cbmV4cG9ydCBjbGFzcyBUZXh0VmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWluTGVuZ3RoOiBudW1iZXIgPSAwLCBwdWJsaWMgbWF4TGVuZ3RoOiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7IHJldHVybiBcInRleHR2YWxpZGF0b3JcIjsgfVxuICAgIHB1YmxpYyB2YWxpZGF0ZSh2YWx1ZTogYW55LCBuYW1lOiBzdHJpbmcgPSBudWxsKTogVmFsaWRhdG9yUmVzdWx0IHtcbiAgICAgICAgaWYgKHRoaXMubWluTGVuZ3RoID4gMCAmJiB2YWx1ZS5sZW5ndGggPCB0aGlzLm1pbkxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQobnVsbCwgbmV3IEN1c3RvbUVycm9yKHRoaXMuZ2V0RXJyb3JUZXh0KG5hbWUpKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWF4TGVuZ3RoID4gMCAmJiB2YWx1ZS5sZW5ndGggPiB0aGlzLm1heExlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQobnVsbCwgbmV3IEN1c3RvbUVycm9yKHRoaXMuZ2V0RXJyb3JUZXh0KG5hbWUpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXREZWZhdWx0RXJyb3JUZXh0KG5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5taW5MZW5ndGggPiAwICYmIHRoaXMubWF4TGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwidGV4dE1pbk1heExlbmd0aFwiKVtcImZvcm1hdFwiXSh0aGlzLm1pbkxlbmd0aCwgdGhpcy5tYXhMZW5ndGgpO1xuICAgICAgICBpZiAodGhpcy5taW5MZW5ndGggPiAwKSByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInRleHRNaW5MZW5ndGhcIilbXCJmb3JtYXRcIl0odGhpcy5taW5MZW5ndGgpO1xuICAgICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInRleHRNYXhMZW5ndGhcIilbXCJmb3JtYXRcIl0odGhpcy5tYXhMZW5ndGgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFuc3dlckNvdW50VmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWluQ291bnQ6IG51bWJlciA9IG51bGwsIHB1YmxpYyBtYXhDb3VudDogbnVtYmVyID0gbnVsbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcgeyByZXR1cm4gXCJhbnN3ZXJjb3VudHZhbGlkYXRvclwiOyB9XG4gICAgcHVibGljIHZhbGlkYXRlKHZhbHVlOiBhbnksIG5hbWU6IHN0cmluZyA9IG51bGwpOiBWYWxpZGF0b3JSZXN1bHQge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5jb25zdHJ1Y3RvciAhPSBBcnJheSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBjb3VudCA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMubWluQ291bnQgJiYgY291bnQgPCB0aGlzLm1pbkNvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdChudWxsLCBuZXcgQ3VzdG9tRXJyb3IodGhpcy5nZXRFcnJvclRleHQoc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1pblNlbGVjdEVycm9yXCIpW1wiZm9ybWF0XCJdKHRoaXMubWluQ291bnQpKSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1heENvdW50ICYmIGNvdW50ID4gdGhpcy5tYXhDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQobnVsbCwgbmV3IEN1c3RvbUVycm9yKHRoaXMuZ2V0RXJyb3JUZXh0KHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtYXhTZWxlY3RFcnJvclwiKVtcImZvcm1hdFwiXSh0aGlzLm1heENvdW50KSkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cbn1cbi8qKlxuICogVXNlIGl0IHRvIHZhbGlkYXRlIHRoZSB0ZXh0IGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWdleFZhbGlkYXRvciBleHRlbmRzIFN1cnZleVZhbGlkYXRvciB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZ2V4OiBzdHJpbmcgPSBudWxsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7IHJldHVybiBcInJlZ2V4dmFsaWRhdG9yXCI7IH1cbiAgICBwdWJsaWMgdmFsaWRhdGUodmFsdWU6IGFueSwgbmFtZTogc3RyaW5nID0gbnVsbCk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgICAgIGlmICghdGhpcy5yZWdleCB8fCAhdmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKHRoaXMucmVnZXgpO1xuICAgICAgICBpZihBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgICAgIHZhciByZXMgPSB0aGlzLmhhc0Vycm9yKHJlLCB2YWx1ZVtpXSwgbmFtZSk7XG4gICAgICAgICAgICAgICAgaWYocmVzKSByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0Vycm9yKHJlLCB2YWx1ZSwgbmFtZSk7O1xuICAgIH1cbiAgICBwcml2YXRlIGhhc0Vycm9yKHJlOiBSZWdFeHAsIHZhbHVlOiBhbnksIG5hbWU6IHN0cmluZyk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgICAgIGlmIChyZS50ZXN0KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KHZhbHVlLCBuZXcgQ3VzdG9tRXJyb3IodGhpcy5nZXRFcnJvclRleHQobmFtZSkpKTtcbiAgICB9XG59XG4vKipcbiAqIFZhbGlkYXRlIGUtbWFpbCBhZGRyZXNzIGluIHRoZSB0ZXh0IGlucHV0XG4gKi9cbmV4cG9ydCBjbGFzcyBFbWFpbFZhbGlkYXRvciBleHRlbmRzIFN1cnZleVZhbGlkYXRvciB7XG4gICAgcHJpdmF0ZSByZSA9IC9eKChbXjw+KClcXFtcXF1cXC4sOzpcXHNAXFxcIl0rKFxcLltePD4oKVxcW1xcXVxcLiw7Olxcc0BcXFwiXSspKil8KFxcXCIuK1xcXCIpKUAoKFtePD4oKVtcXF1cXC4sOzpcXHNAXFxcIl0rXFwuKStbXjw+KClbXFxdXFwuLDs6XFxzQFxcXCJdezIsfSkkL2k7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7IHJldHVybiBcImVtYWlsdmFsaWRhdG9yXCI7IH1cbiAgICBwdWJsaWMgdmFsaWRhdGUodmFsdWU6IGFueSwgbmFtZTogc3RyaW5nID0gbnVsbCk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAodGhpcy5yZS50ZXN0KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KHZhbHVlLCBuZXcgQ3VzdG9tRXJyb3IodGhpcy5nZXRFcnJvclRleHQobmFtZSkpKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiaW52YWxpZEVtYWlsXCIpO1xuICAgIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcInN1cnZleXZhbGlkYXRvclwiLCBbXCJ0ZXh0XCJdKTtcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJudW1lcmljdmFsaWRhdG9yXCIsIFtcIm1pblZhbHVlOm51bWJlclwiLCBcIm1heFZhbHVlOm51bWJlclwiXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE51bWVyaWNWYWxpZGF0b3IoKTsgfSwgXCJzdXJ2ZXl2YWxpZGF0b3JcIik7XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwidGV4dHZhbGlkYXRvclwiLCBbXCJtaW5MZW5ndGg6bnVtYmVyXCIsIFwibWF4TGVuZ3RoOm51bWJlclwiXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFRleHRWYWxpZGF0b3IoKTsgfSwgXCJzdXJ2ZXl2YWxpZGF0b3JcIik7XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwiYW5zd2VyY291bnR2YWxpZGF0b3JcIiwgW1wibWluQ291bnQ6bnVtYmVyXCIsIFwibWF4Q291bnQ6bnVtYmVyXCJdLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgQW5zd2VyQ291bnRWYWxpZGF0b3IoKTsgfSwgXCJzdXJ2ZXl2YWxpZGF0b3JcIik7XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwicmVnZXh2YWxpZGF0b3JcIiwgW1wicmVnZXhcIl0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBSZWdleFZhbGlkYXRvcigpOyB9LCBcInN1cnZleXZhbGlkYXRvclwiKTtcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJlbWFpbHZhbGlkYXRvclwiLCBbXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEVtYWlsVmFsaWRhdG9yKCk7IH0sIFwic3VydmV5dmFsaWRhdG9yXCIpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3ZhbGlkYXRvci50cyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7U3VydmV5fSBmcm9tIFwiLi9yZWFjdFN1cnZleVwiO1xuaW1wb3J0IHtSZWFjdFN1cnZleU1vZGVsLCBSZWFjdFdpbmRvd01vZGVsfSBmcm9tIFwiLi9yZWFjdHN1cnZleW1vZGVsXCI7XG5pbXBvcnQge1N1cnZleU1vZGVsfSBmcm9tIFwiLi4vc3VydmV5XCI7XG5pbXBvcnQge1N1cnZleUVsZW1lbnRCYXNlfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5V2luZG93IGV4dGVuZHMgU3VydmV5IHtcbiAgICBwcm90ZWN0ZWQgd2luZG93OiBSZWFjdFdpbmRvd01vZGVsO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLmhhbmRsZU9uRXhwYW5kZWQgPSB0aGlzLmhhbmRsZU9uRXhwYW5kZWQuYmluZCh0aGlzKTtcbiAgICB9XG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVN1cnZleShuZXh0UHJvcHMpO1xuICAgIH1cbiAgICBoYW5kbGVPbkV4cGFuZGVkKGV2ZW50KSB7XG4gICAgICAgIHRoaXMud2luZG93LmlzRXhwYW5kZWQgPSAhdGhpcy53aW5kb3cuaXNFeHBhbmRlZDtcbiAgICB9XG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgaWYgKCF0aGlzLndpbmRvdy5pc1Nob3dpbmcpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgaGVhZGVyID0gdGhpcy5yZW5kZXJIZWFkZXIoKTtcbiAgICAgICAgdmFyIGJvZHkgPSB0aGlzLndpbmRvdy5pc0V4cGFuZGVkID8gdGhpcy5yZW5kZXJCb2R5KCkgOiBudWxsO1xuICAgICAgICBsZXQgc3R5bGU6IFJlYWN0LkNTU1Byb3BlcnRpZXMgID0geyBwb3NpdGlvbjogXCJmaXhlZFwiLCBib3R0b206IDMsIHJpZ2h0OiAxMCB9O1xuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e3RoaXMuY3NzLndpbmRvdy5yb290fSBzdHlsZT17c3R5bGV9PlxuICAgICAgICAgICAge2hlYWRlcn1cbiAgICAgICAgICAgIHtib2R5fVxuICAgICAgICA8L2Rpdj47XG5cbiAgICB9XG4gICAgcHJvdGVjdGVkIHJlbmRlckhlYWRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIHZhciBzdHlsZUEgPSB7IHdpZHRoOiAnMTAwJScsIGN1cnNvcjogJ3BvaW50ZXInIH07XG4gICAgICAgIHZhciBzdHlsZVRpdGxlID0geyBwYWRkaW5nUmlnaHQ6IFwiMTBweFwiIH07XG4gICAgICAgIHZhciBnbHlwaENsYXNzTmFtZSA9IHRoaXMud2luZG93LmlzRXhwYW5kZWQgPyB0aGlzLmNzcy53aW5kb3cuaGVhZGVyLmJ1dHRvbkNvbGxhcHNlZCA6IHRoaXMuY3NzLndpbmRvdy5oZWFkZXIuYnV0dG9uRXhwYW5kZWQ7XG4gICAgICAgIGdseXBoQ2xhc3NOYW1lID0gXCJnbHlwaGljb24gcHVsbC1yaWdodCBcIiArIGdseXBoQ2xhc3NOYW1lO1xuICAgICAgICB2YXIgdGl0bGUgPSBTdXJ2ZXlFbGVtZW50QmFzZS5yZW5kZXJMb2NTdHJpbmcodGhpcy5zdXJ2ZXkubG9jVGl0bGUpO1xuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e3RoaXMuY3NzLndpbmRvdy5oZWFkZXIucm9vdH0+XG4gICAgICAgICAgICA8c3BhbiBvbkNsaWNrPXt0aGlzLmhhbmRsZU9uRXhwYW5kZWR9IHN0eWxlPXtzdHlsZUF9PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17dGhpcy5jc3Mud2luZG93LmhlYWRlci50aXRsZX0gc3R5bGU9e3N0eWxlVGl0bGV9Pnt0aXRsZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtnbHlwaENsYXNzTmFtZX0gYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj47XG4gICAgfVxuICAgIHByb3RlY3RlZCByZW5kZXJCb2R5KCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmNzcy53aW5kb3cuYm9keX0+XG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlclN1cnZleSgpIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj47XG4gICAgfVxuICAgIHByb3RlY3RlZCB1cGRhdGVTdXJ2ZXkobmV3UHJvcHM6IGFueSkge1xuICAgICAgICBpZighbmV3UHJvcHMpIG5ld1Byb3BzID0ge307XG4gICAgICAgIGlmIChuZXdQcm9wcy53aW5kb3cpIHtcbiAgICAgICAgICAgIHRoaXMud2luZG93ID0gbmV3UHJvcHMud2luZG93O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG5ld1Byb3BzLmpzb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLndpbmRvdyA9IG5ldyBSZWFjdFdpbmRvd01vZGVsKG5ld1Byb3BzLmpzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYobmV3UHJvcHMubW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53aW5kb3cgPSBuZXcgUmVhY3RXaW5kb3dNb2RlbChudWxsLCBuZXdQcm9wcy5tb2RlbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmKCF0aGlzLndpbmRvdykge1xuICAgICAgICAgICAgdGhpcy53aW5kb3cgPSBuZXcgUmVhY3RXaW5kb3dNb2RlbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3UHJvcHMubW9kZWwgPSB0aGlzLndpbmRvdy5zdXJ2ZXk7XG4gICAgICAgIGlmKG5ld1Byb3BzLmV4cGFuZGVkIHx8IG5ld1Byb3BzLmlzRXhwYW5kZWQpIHRoaXMud2luZG93LmV4cGFuZCgpO1xuICAgICAgICB0aGlzLndpbmRvdy5pc1Nob3dpbmcgPSB0cnVlO1xuICAgICAgICBcbiAgICAgICAgc3VwZXIudXBkYXRlU3VydmV5KG5ld1Byb3BzKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGV4cGFuZGVkOiB0aGlzLndpbmRvdy5pc0V4cGFuZGVkLCBpc1Nob3dpbmc6IHRoaXMud2luZG93LmlzU2hvd2luZyB9KTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLndpbmRvdy5leHBhbmRlZENoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5zdGF0ZS5leHBhbmRlZCA9IHNlbGYud2luZG93LmlzRXhwYW5kZWQ7XG4gICAgICAgICAgICBzZWxmLnNldFN0YXRlKHNlbGYuc3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud2luZG93LnNob3dpbmdDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuc3RhdGUuaXNTaG93aW5nID0gc2VsZi53aW5kb3cuaXNTaG93aW5nO1xuICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZShzZWxmLnN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN1cnZleS5vbkNvbXBsZXRlLmFkZChmdW5jdGlvbiAoczogU3VydmV5TW9kZWwpIHtcbiAgICAgICAgICAgIHNlbGYud2luZG93LmhpZGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0U3VydmV5V2luZG93LnRzeCIsImltcG9ydCB7Q29uZGl0aW9uLCBDb25kaXRpb25Ob2RlLCBPcGVyYW5kLCBGdW5jdGlvbk9wZXJhbmQsIEV4cHJlc3Npb25PcGVyYW5kfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25zUGFyc2VyIHtcbiAgICBwcml2YXRlIHRleHQ6IHN0cmluZztcbiAgICBwcml2YXRlIHJvb3Q6IENvbmRpdGlvbk5vZGU7XG4gICAgcHJpdmF0ZSBleHByZXNzaW9uTm9kZXM6IEFycmF5PGFueT47XG4gICAgcHJpdmF0ZSBub2RlOiBhbnk7XG4gICAgcHJpdmF0ZSBhdDogbnVtYmVyO1xuICAgIHByaXZhdGUgbGVuZ3RoOiBudW1iZXI7XG4gICAgcHVibGljIHBhcnNlKHRleHQ6IHN0cmluZywgcm9vdDogQ29uZGl0aW9uTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICB0aGlzLnNldFByb3BlcnRpZXModGV4dCwgcm9vdCk7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVGV4dCgpO1xuICAgIH1cbiAgICBwdWJsaWMgcGFyc2VFeHByZXNzaW9uKHRleHQ6IHN0cmluZyk6IE9wZXJhbmQge1xuICAgICAgICB0aGlzLnNldFByb3BlcnRpZXModGV4dCwgbmV3IENvbmRpdGlvbk5vZGUoKSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRFeHByZXNzaW9uT3BlcmFuZCgpO1xuICAgIH1cbiAgICBwcml2YXRlIHNldFByb3BlcnRpZXModGV4dDogc3RyaW5nLCByb290OiBDb25kaXRpb25Ob2RlKSB7XG4gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgICAgIHRoaXMuYXQgPSAwO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMudGV4dC5sZW5ndGg7XG4gICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7XG4gICAgICAgIHRoaXMucm9vdC5jbGVhcigpO1xuICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLnJvb3Q7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk5vZGVzID0gW107XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk5vZGVzLnB1c2godGhpcy5ub2RlKTtcbiAgICB9XG4gICAgcHVibGljIHRvU3RyaW5nKHJvb3Q6IENvbmRpdGlvbk5vZGUpOiBzdHJpbmcgeyByZXR1cm4gcm9vdC50b1N0cmluZygpOyB9XG4gICAgcHJpdmF0ZSBwYXJzZVRleHQoKTogYm9vbGVhbiB7XG4gICAgICAgIHZhciByZXMgPSB0aGlzLnJlYWRDb25kaXRpb25zKCk7XG4gICAgICAgIHJldHVybiByZXMgJiYgdGhpcy5hdCA+PSB0aGlzLmxlbmd0aDtcbiAgICB9XG4gICAgcHJpdmF0ZSByZWFkQ29uZGl0aW9ucygpOiBib29sZWFuIHtcbiAgICAgICAgdmFyIHJlcyA9IHRoaXMucmVhZENvbmRpdGlvbigpO1xuICAgICAgICBpZiAoIXJlcykgcmV0dXJuIHJlcztcbiAgICAgICAgdmFyIGNvbm5lY3RpdmUgPSB0aGlzLnJlYWRDb25uZWN0aXZlKCk7XG4gICAgICAgIGlmIChjb25uZWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLmFkZENvbm5lY3RpdmUoY29ubmVjdGl2ZSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkQ29uZGl0aW9ucygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBwcml2YXRlIHJlYWRDb25kaXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHZhciBleHBSZXMgPSB0aGlzLnJlYWRFeHByZXNzaW9uKCk7XG4gICAgICAgIGlmIChleHBSZXMgPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmKGV4cFJlcyA9PSAxKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgdmFyIGxlZnQgPSB0aGlzLnJlYWRFeHByZXNzaW9uT3BlcmFuZCgpO1xuICAgICAgICBpZiAoIWxlZnQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIG9wID0gdGhpcy5yZWFkT3BlcmF0b3IoKTtcbiAgICAgICAgaWYoIW9wKSB7XG4gICAgICAgICAgICBpZihsZWZ0LmlzQm9vbGVhbikge1xuICAgICAgICAgICAgICAgIHZhciBjID0gbmV3IENvbmRpdGlvbigpO1xuICAgICAgICAgICAgICAgIGMubGVmdCA9IGxlZnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDb25kaXRpb24oYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGMgPSBuZXcgQ29uZGl0aW9uKCk7XG4gICAgICAgIGMubGVmdCA9IGxlZnQ7XG4gICAgICAgIGMub3BlcmF0b3IgPSBvcDtcbiAgICAgICAgaWYgKCFDb25kaXRpb24uaXNOb1JpZ2h0T3BlcmF0aW9uKG9wKSkge1xuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5yZWFkRXhwcmVzc2lvbk9wZXJhbmQoKTtcbiAgICAgICAgICAgIGlmICghcmlnaHQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGMucmlnaHQgPSByaWdodDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZENvbmRpdGlvbihjKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHByaXZhdGUgcmVhZE9wZXJhbmQoKTogT3BlcmFuZCB7XG4gICAgICAgIHZhciBzdHIgPSB0aGlzLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgaWYgKCFzdHIpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgcGFyYW1zID0gdGhpcy5yZWFkUGFyYW1ldGVycygpO1xuICAgICAgICBpZihwYXJhbXMpIHtcbiAgICAgICAgICAgIHZhciByZXMgPSBuZXcgRnVuY3Rpb25PcGVyYW5kKHN0cik7XG4gICAgICAgICAgICByZXMucGFyYW1ldGVycyA9IHBhcmFtcztcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBPcGVyYW5kKHN0cik7XG4gICAgfVxuICAgIHByaXZhdGUgcmVhZEV4cHJlc3Npb24oKTogbnVtYmVyIHtcbiAgICAgICAgdGhpcy5za2lwKCk7XG4gICAgICAgIGlmICh0aGlzLmF0ID49IHRoaXMubGVuZ3RoIHx8IHRoaXMuY2ggIT0gJygnKSByZXR1cm4gMDtcbiAgICAgICAgdGhpcy5hdCsrO1xuICAgICAgICB0aGlzLnB1c2hFeHByZXNzaW9uKCk7XG4gICAgICAgIHZhciByZXMgPSB0aGlzLnJlYWRDb25kaXRpb25zKCk7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc2tpcCgpO1xuICAgICAgICAgICAgcmVzID0gdGhpcy5jaCA9PSA8c3RyaW5nPicpJztcbiAgICAgICAgICAgIHRoaXMuYXQrKztcbiAgICAgICAgICAgIHRoaXMucG9wRXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBwcml2YXRlIHJlYWRFeHByZXNzaW9uT3BlcmFuZChwcmV2RXhwcjogRXhwcmVzc2lvbk9wZXJhbmQgPSBudWxsLCBzdGFjazogQXJyYXk8RXhwcmVzc2lvbk9wZXJhbmQ+ID0gbnVsbCk6IE9wZXJhbmQge1xuICAgICAgICB0aGlzLnNraXAoKTtcbiAgICAgICAgaWYodGhpcy5hdCA+PSB0aGlzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBpc09wZW5CcmFja2V0ID0gdGhpcy5pc09wZW5CcmFja2V0KHRoaXMuY2gpO1xuICAgICAgICBpZihpc09wZW5CcmFja2V0KSB7XG4gICAgICAgICAgICB0aGlzLmF0ICsrO1xuICAgICAgICAgICAgdGhpcy5wdXNoRXhwcmVzc2lvbigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhID0gdGhpcy5yZWFkT3BlcmFuZCgpO1xuICAgICAgICBpZighYSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBvcGVyYXRvciA9IHRoaXMucmVhZE9wZXJhbmRPcGVyYXRvcigpO1xuICAgICAgICBpZighb3BlcmF0b3IpIHsgXG4gICAgICAgICAgICBpZihwcmV2RXhwciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcHJldkV4cHIucmlnaHQgPSBhO1xuICAgICAgICAgICAgICAgIGEgPSBwcmV2RXhwcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMuaXNDbG9zZUJyYWNrZXQodGhpcy5jaCkpIHtcbiAgICAgICAgICAgICAgICBwcmV2RXhwciA9IHN0YWNrICYmIHN0YWNrLmxlbmd0aCA+IDAgPyBzdGFjay5wb3AoKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgdmFyIHNhdmVBdCA9IHRoaXMuYXQ7XG4gICAgICAgICAgICAgICAgdGhpcy5hdCArKztcbiAgICAgICAgICAgICAgICBvcGVyYXRvciA9IHRoaXMucmVhZE9wZXJhbmRPcGVyYXRvcigpO1xuICAgICAgICAgICAgICAgIHZhciBkb1BvcEV4cHJlc3Npb24gPSBvcGVyYXRvciB8fCAocHJldkV4cHIgJiYgcHJldkV4cHJbXCJpc09wZW5CcmFja2V0XCJdKTtcbiAgICAgICAgICAgICAgICBpZighb3BlcmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdCA9IHNhdmVBdCArIChkb1BvcEV4cHJlc3Npb24gPyAxIDogMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKGRvUG9wRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcEV4cHJlc3Npb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihvcGVyYXRvcikge1xuICAgICAgICAgICAgICAgIHZhciBleHByID0gbmV3IEV4cHJlc3Npb25PcGVyYW5kKCk7XG4gICAgICAgICAgICAgICAgZXhwci5sZWZ0ID0gcHJldkV4cHIgPyBwcmV2RXhwciA6IGE7XG4gICAgICAgICAgICAgICAgZXhwci5vcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRFeHByZXNzaW9uT3BlcmFuZChleHByLCBzdGFjayk7ICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXhwciA9IG5ldyBFeHByZXNzaW9uT3BlcmFuZCgpO1xuICAgICAgICBleHByW1wiaXNPcGVuQnJhY2tldFwiXSA9IGlzT3BlbkJyYWNrZXQ7XG4gICAgICAgIGV4cHIubGVmdCA9IGE7XG4gICAgICAgIGV4cHIub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgaWYoIXN0YWNrKSB7XG4gICAgICAgICAgICBzdGFjayA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmKHN0YWNrLmxlbmd0aCA9PSAwIHx8IGlzT3BlbkJyYWNrZXQpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goZXhwcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYocHJldkV4cHIpIHtcbiAgICAgICAgICAgIGlmKCFpc09wZW5CcmFja2V0ICYmICh0aGlzLmlzSGlnaFByaW9yaXR5T3BlcmFuZChwcmV2RXhwci5vcGVyYXRvcikgfHwgIXRoaXMuaXNIaWdoUHJpb3JpdHlPcGVyYW5kKG9wZXJhdG9yKSkpIHtcbiAgICAgICAgICAgICAgICBwcmV2RXhwci5yaWdodCA9IGE7XG4gICAgICAgICAgICAgICAgZXhwci5sZWZ0ID0gcHJldkV4cHI7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gc3RhY2suaW5kZXhPZihwcmV2RXhwcik7XG4gICAgICAgICAgICAgICAgaWYoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICBzdGFja1tpbmRleF0gPSBleHByO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJldkV4cHIucmlnaHQgPSB0aGlzLnJlYWRFeHByZXNzaW9uT3BlcmFuZChleHByLCBzdGFjayk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXZFeHByO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRFeHByZXNzaW9uT3BlcmFuZChleHByLCBzdGFjayk7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0IGNoKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnRleHQuY2hhckF0KHRoaXMuYXQpOyB9XG4gICAgcHJpdmF0ZSBza2lwKCkge1xuICAgICAgICB3aGlsZSAodGhpcy5hdCA8IHRoaXMubGVuZ3RoICYmIHRoaXMuaXNTcGFjZSh0aGlzLmNoKSkgdGhpcy5hdCsrO1xuICAgIH1cbiAgICBwcml2YXRlIGlzU3BhY2UoYzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjID09ICcgJyB8fCBjID09ICdcXG4nIHx8IGMgPT0gJ1xcdCcgfHwgYyA9PSAnXFxyJztcbiAgICB9XG4gICAgcHJpdmF0ZSBpc1F1b3RlcyhjOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGMgPT0gXCInXCIgfHwgYyA9PSAnXCInXG4gICAgfVxuICAgIHByaXZhdGUgaXNDb21tYShjOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIGMgPT0gJywnOyB9XG4gICAgcHJpdmF0ZSBpc09wZXJhdG9yQ2hhcihjOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGMgPT0gJz4nIHx8IGMgPT0gJzwnIHx8IGMgPT0gJz0nIHx8IGMgPT0gJyEnIHx8IGMgPT0gJysnIHx8IGMgPT0gJy0nIHx8IGMgPT0gJyonIHx8IGMgPT0gJy8nO1xuICAgIH1cbiAgICBwcml2YXRlIGlzT3BlbkJyYWNrZXQoYzogc3RyaW5nKTogYm9vbGVhbiB7IHJldHVybiBjID09ICcoJzt9XG4gICAgcHJpdmF0ZSBpc0Nsb3NlQnJhY2tldChjOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIGMgPT0gJyknO31cbiAgICBwcml2YXRlIGlzQnJhY2tldHMoYzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzT3BlbkJyYWNrZXQoYykgfHwgdGhpcy5pc0Nsb3NlQnJhY2tldChjKTtcbiAgICB9XG4gICAgcHJpdmF0ZSByZWFkU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHRoaXMuc2tpcCgpO1xuICAgICAgICBpZiAodGhpcy5hdCA+PSB0aGlzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuYXQ7XG4gICAgICAgIHZhciBoYXNRdW90ZXMgPSB0aGlzLmlzUXVvdGVzKHRoaXMuY2gpO1xuICAgICAgICB2YXIgaGFzQnJhY2VzID0gdGhpcy5jaCA9PSAneyc7XG4gICAgICAgIGlmIChoYXNRdW90ZXMpIHRoaXMuYXQrKztcbiAgICAgICAgdmFyIGlzRmlyc3RPcENoID0gdGhpcy5pc09wZXJhdG9yQ2hhcih0aGlzLmNoKTtcbiAgICAgICAgd2hpbGUgKHRoaXMuYXQgPCB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKCFoYXNRdW90ZXMgJiYgdGhpcy5pc1NwYWNlKHRoaXMuY2gpKSBicmVhaztcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUXVvdGVzKHRoaXMuY2gpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc1F1b3RlcykgdGhpcy5hdCsrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFoYXNRdW90ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoKCFoYXNCcmFjZXMgfHwgdGhpcy5jaCAhPSAnLScpICYmIGlzRmlyc3RPcENoICE9IHRoaXMuaXNPcGVyYXRvckNoYXIodGhpcy5jaCkpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQnJhY2tldHModGhpcy5jaCkgfHwgdGhpcy5pc0NvbW1hKHRoaXMuY2gpKSBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXQrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hdCA8PSBzdGFydCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciByZXMgPSB0aGlzLnRleHQuc3Vic3RyKHN0YXJ0LCB0aGlzLmF0IC0gc3RhcnQpO1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBpZiAocmVzLmxlbmd0aCA+IDEgJiYgdGhpcy5pc1F1b3RlcyhyZXNbMF0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxlbiA9IHJlcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUXVvdGVzKHJlc1tyZXMubGVuZ3RoIC0gMV0pKSBsZW4tLTtcbiAgICAgICAgICAgICAgICByZXMgPSByZXMuc3Vic3RyKDEsIGxlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgcHJpdmF0ZSByZWFkUGFyYW1ldGVycygpOiBBcnJheTxPcGVyYW5kPiB7XG4gICAgICAgIGlmKCF0aGlzLmlzT3BlbkJyYWNrZXQodGhpcy5jaCkpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgcGFyYW1zID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLmF0IDwgdGhpcy5sZW5ndGggJiYgIXRoaXMuaXNDbG9zZUJyYWNrZXQodGhpcy5jaCkpIHtcbiAgICAgICAgICAgIHRoaXMuYXQrKztcbiAgICAgICAgICAgIHZhciBvcGVyYW5kID0gdGhpcy5yZWFkT3BlcmFuZCgpO1xuICAgICAgICAgICAgaWYob3BlcmFuZCkge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5wdXNoKG9wZXJhbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXQrKztcbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG4gICAgcHJpdmF0ZSBpc0hpZ2hQcmlvcml0eU9wZXJhbmQob3A6IHN0cmluZykgOiBib29sZWFuIHsgcmV0dXJuIG9wID09IFwiKlwiIHx8IG9wID09IFwiL1wiOyB9XG4gICAgcHJpdmF0ZSByZWFkT3BlcmFuZE9wZXJhdG9yKCk6IHN0cmluZyB7XG4gICAgICAgIHRoaXMuc2tpcCgpO1xuICAgICAgICBpZih0aGlzLmNoID09ICcrJyB8fCB0aGlzLmNoID09ICctJyB8fCB0aGlzLmNoID09ICcqJyB8fCB0aGlzLmNoID09ICcvJykge1xuICAgICAgICAgICAgdmFyIHJlcyA9IHRoaXMuY2g7XG4gICAgICAgICAgICB0aGlzLmF0Kys7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBwcml2YXRlIHJlYWRPcGVyYXRvcigpOiBzdHJpbmcge1xuICAgICAgICB0aGlzLnNraXAoKTtcbiAgICAgICAgdmFyIGN1ckF0ID0gdGhpcy5hdDtcbiAgICAgICAgdmFyIG9wID0gdGhpcy5yZWFkU3RyaW5nKCk7XG4gICAgICAgIGlmICghb3ApIHJldHVybiBudWxsO1xuICAgICAgICBvcCA9IG9wLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChvcCA9PSAnPicpIG9wID0gXCJncmVhdGVyXCI7XG4gICAgICAgIGlmIChvcCA9PSAnPCcpIG9wID0gXCJsZXNzXCI7XG4gICAgICAgIGlmIChvcCA9PSAnPj0nIHx8IG9wID09ICc9PicpIG9wID0gXCJncmVhdGVyb3JlcXVhbFwiO1xuICAgICAgICBpZiAob3AgPT0gJzw9JyB8fCBvcCA9PSAnPTwnKSBvcCA9IFwibGVzc29yZXF1YWxcIjtcbiAgICAgICAgaWYgKG9wID09ICc9JyB8fCBvcCA9PSAnPT0nKSBvcCA9IFwiZXF1YWxcIjtcbiAgICAgICAgaWYgKG9wID09ICc8PicgfHwgb3AgPT0gJyE9Jykgb3AgPSBcIm5vdGVxdWFsXCI7XG4gICAgICAgIGlmIChvcCA9PSAnY29udGFpbicgfHwgb3AgPT0gJyo9Jykgb3AgPSBcImNvbnRhaW5zXCI7XG4gICAgICAgIGlmIChvcCA9PSAnbm90Y29udGFpbicpIG9wID0gXCJub3Rjb250YWluc1wiO1xuICAgICAgICBpZihDb25kaXRpb24uaXNDb3JyZWN0T3BlcmF0b3Iob3ApKSByZXR1cm4gb3A7XG4gICAgICAgIHRoaXMuYXQgPSBjdXJBdDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHByaXZhdGUgcmVhZENvbm5lY3RpdmUoKTogc3RyaW5nIHtcbiAgICAgICAgdmFyIGNvbiA9IHRoaXMucmVhZFN0cmluZygpO1xuICAgICAgICBpZiAoIWNvbikgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbiA9IGNvbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoY29uID09IFwiJlwiIHx8IGNvbiA9PSBcIiYmXCIpIGNvbiA9IFwiYW5kXCI7XG4gICAgICAgIGlmIChjb24gPT0gXCJ8XCIgfHwgY29uID09IFwifHxcIikgY29uID0gXCJvclwiO1xuICAgICAgICBpZiAoY29uICE9IFwiYW5kXCIgJiYgY29uICE9IFwib3JcIikgY29uID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGNvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBwdXNoRXhwcmVzc2lvbigpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25Ob2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgIH1cbiAgICBwcml2YXRlIG1ha2VOb2RlQ29uZGl0aW9uKCkge1xuICAgICAgICBpZighdGhpcy5ub2RlIHx8ICF0aGlzLm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHRoaXMubm9kZSA9IG5ldyBDb25kaXRpb25Ob2RlKCk7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25Ob2Rlc1t0aGlzLmV4cHJlc3Npb25Ob2Rlcy5sZW5ndGggLSAxXSA9IHRoaXMubm9kZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIHBvcEV4cHJlc3Npb24oKSB7XG4gICAgICAgIHZhciBub2RlID0gdGhpcy5leHByZXNzaW9uTm9kZXMucG9wKCk7XG4gICAgICAgIHRoaXMubm9kZSA9IHRoaXMuZXhwcmVzc2lvbk5vZGVzW3RoaXMuZXhwcmVzc2lvbk5vZGVzLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZihub2RlKSB7XG4gICAgICAgICAgICB0aGlzLm1ha2VOb2RlQ29uZGl0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLm5vZGUuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGFkZENvbmRpdGlvbihjOiBDb25kaXRpb24pIHtcbiAgICAgICAgdGhpcy5tYWtlTm9kZUNvbmRpdGlvbigpO1xuICAgICAgICB0aGlzLm5vZGUuY2hpbGRyZW4ucHVzaChjKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhZGRDb25uZWN0aXZlKGNvbjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubWFrZU5vZGVDb25kaXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMubm9kZS5jaGlsZHJlbi5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICB0aGlzLm5vZGUuY29ubmVjdGl2ZSA9IGNvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5vZGUuY29ubmVjdGl2ZSAhPSBjb24pIHtcbiAgICAgICAgICAgICAgICB2YXIgb2xkQ29uID0gdGhpcy5ub2RlLmNvbm5lY3RpdmU7XG4gICAgICAgICAgICAgICAgdmFyIG9sZENoaWxkcmVuID0gdGhpcy5ub2RlLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZS5jbGVhcigpO1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZS5jb25uZWN0aXZlID0gY29uO1xuICAgICAgICAgICAgICAgIHZhciBvbGROb2RlID0gbmV3IENvbmRpdGlvbk5vZGUoKTtcbiAgICAgICAgICAgICAgICBvbGROb2RlLmNvbm5lY3RpdmUgPSBvbGRDb247XG4gICAgICAgICAgICAgICAgb2xkTm9kZS5jaGlsZHJlbiA9IG9sZENoaWxkcmVuO1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZS5jaGlsZHJlbi5wdXNoKG9sZE5vZGUpO1xuICAgICAgICAgICAgICAgIHZhciBuZXdOb2RlID0gbmV3IENvbmRpdGlvbk5vZGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGUuY2hpbGRyZW4ucHVzaChuZXdOb2RlKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBuZXdOb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NvbmRpdGlvbnNQYXJzZXIudHMiLCIvKipcbiAqIFRoZSBjbGFzcyBjb250YWlucyBtZXRob2RzIHRvIHdvcmsgd2l0aCB3d3cuZHhzdXJ2ZXkuY29tIHNlcnZpY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBkeFN1cnZleVNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgc2VydmljZVVybDogc3RyaW5nID0gXCJodHRwczovL2R4c3VydmV5YXBpLmF6dXJld2Vic2l0ZXMubmV0L2FwaS9TdXJ2ZXlcIjtcbiAgICAvL3B1YmxpYyBzdGF0aWMgc2VydmljZVVybDogc3RyaW5nID0gXCJodHRwOi8vbG9jYWxob3N0OjUwNDg4L2FwaS9TdXJ2ZXlcIjtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG4gICAgcHVibGljIGxvYWRTdXJ2ZXkoc3VydmV5SWQ6IHN0cmluZywgb25Mb2FkOiAoc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIHJlc3BvbnNlOiBhbnkpID0+IHZvaWQpIHtcbiAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbignR0VUJywgZHhTdXJ2ZXlTZXJ2aWNlLnNlcnZpY2VVcmwgKyAnL2dldFN1cnZleT9zdXJ2ZXlJZD0nICsgc3VydmV5SWQpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgIG9uTG9hZCh4aHIuc3RhdHVzID09IDIwMCwgcmVzdWx0LCB4aHIucmVzcG9uc2UpO1xuICAgICAgICB9O1xuICAgICAgICB4aHIuc2VuZCgpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0U3VydmV5SnNvbkFuZElzQ29tcGxldGVkKHN1cnZleUlkOiBzdHJpbmcsIGNsaWVudElkOiBzdHJpbmcsIG9uTG9hZDogKHN1Y2Nlc3M6IGJvb2xlYW4sIHN1cnZleUpzb246IGFueSwgcmVzdWx0OiBzdHJpbmcsICByZXNwb25zZTogYW55KSA9PiB2b2lkKSB7XG4gICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgJy9nZXRTdXJ2ZXlBbmRJc0NvbXBsZXRlZD9zdXJ2ZXlJZD0nICsgc3VydmV5SWQgKyAnJmNsaWVudElkPScgKyBjbGllbnRJZCk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpO1xuICAgICAgICAgICAgdmFyIHN1cnZleUpzb24gPSByZXN1bHQgPyByZXN1bHQuc3VydmV5IDogbnVsbDtcbiAgICAgICAgICAgIHZhciBpc0NvbXBsZXRlZCA9IHJlc3VsdCA/IHJlc3VsdC5pc0NvbXBsZXRlZCA6IG51bGw7XG4gICAgICAgICAgICBvbkxvYWQoeGhyLnN0YXR1cyA9PSAyMDAsIHN1cnZleUpzb24sIGlzQ29tcGxldGVkLCB4aHIucmVzcG9uc2UpO1xuICAgICAgICB9O1xuICAgICAgICB4aHIuc2VuZCgpO1xuICAgIH1cbiAgICBwdWJsaWMgc2VuZFJlc3VsdChwb3N0SWQ6IHN0cmluZywgcmVzdWx0OiBKU09OLCBvblNlbmRSZXN1bHQ6IChzdWNjZXNzOiBib29sZWFuLCByZXNwb25zZTogYW55KT0+IHZvaWQsIGNsaWVudElkOiBzdHJpbmcgPSBudWxsLCBpc1BhcnRpYWxDb21wbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKCdQT1NUJywgZHhTdXJ2ZXlTZXJ2aWNlLnNlcnZpY2VVcmwgKyAnL3Bvc3QvJyk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcpO1xuICAgICAgICB2YXIgZGF0YSA9IHsgcG9zdElkOiBwb3N0SWQsIHN1cnZleVJlc3VsdDogSlNPTi5zdHJpbmdpZnkocmVzdWx0KSB9O1xuICAgICAgICBpZiAoY2xpZW50SWQpIGRhdGFbJ2NsaWVudElkJ10gPSBjbGllbnRJZDtcbiAgICAgICAgaWYgKGlzUGFydGlhbENvbXBsZXRlZCkgZGF0YVsnaXNQYXJ0aWFsQ29tcGxldGVkJ10gPSB0cnVlO1xuICAgICAgICB2YXIgZGF0YVN0cmluZ2lmeTogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgeGhyLm9ubG9hZCA9IHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFvblNlbmRSZXN1bHQpIHJldHVybjtcbiAgICAgICAgICAgIG9uU2VuZFJlc3VsdCh4aHIuc3RhdHVzID09IDIwMCwgeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgfTtcbiAgICAgICAgeGhyLnNlbmQoZGF0YVN0cmluZ2lmeSk7XG4gICAgfVxuICAgIHB1YmxpYyBzZW5kRmlsZShwb3N0SWQ6IHN0cmluZywgZmlsZTogRmlsZSwgb25TZW5kRmlsZTogKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3BvbnNlOiBhbnkpID0+IHZvaWQpIHtcbiAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub25sb2FkID0geGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIW9uU2VuZEZpbGUpIHJldHVybjtcbiAgICAgICAgICAgIG9uU2VuZEZpbGUoeGhyLnN0YXR1cyA9PSAyMDAsIEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKSk7XG4gICAgICAgIH07XG4gICAgICAgIHhoci5vcGVuKFwiUE9TVFwiLCBkeFN1cnZleVNlcnZpY2Uuc2VydmljZVVybCArICcvdXBsb2FkLycsIHRydWUpO1xuICAgICAgICB2YXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKFwiZmlsZVwiLCBmaWxlKTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKFwicG9zdElkXCIsIHBvc3RJZCk7XG4gICAgICAgIHhoci5zZW5kKGZvcm1EYXRhKTtcbiAgICB9XG4gICAgcHVibGljIGdldFJlc3VsdChyZXN1bHRJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIG9uR2V0UmVzdWx0OiAoc3VjY2VzczogYm9vbGVhbiwgZGF0YTogYW55LCBkYXRhTGlzdDogQXJyYXk8YW55PiwgcmVzcG9uc2U6IGFueSkgPT4gdm9pZCkge1xuICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHZhciBkYXRhID0gJ3Jlc3VsdElkPScgKyByZXN1bHRJZCArICcmbmFtZT0nICsgbmFtZTtcbiAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgJy9nZXRSZXN1bHQ/JyArIGRhdGEpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgICAgIHZhciBsaXN0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09IDIwMCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICBsaXN0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdC5RdWVzdGlvblJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZWwgPSB7IG5hbWU6IGtleSwgdmFsdWU6IHJlc3VsdC5RdWVzdGlvblJlc3VsdFtrZXldIH07XG4gICAgICAgICAgICAgICAgICAgIGxpc3QucHVzaChlbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25HZXRSZXN1bHQoeGhyLnN0YXR1cyA9PSAyMDAsIHJlc3VsdCwgbGlzdCwgeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgfTtcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9XG4gICAgcHVibGljIGlzQ29tcGxldGVkKHJlc3VsdElkOiBzdHJpbmcsIGNsaWVudElkOiBzdHJpbmcsIG9uSXNDb21wbGV0ZWQ6IChzdWNjZXNzOiBib29sZWFuLCByZXN1bHQ6IHN0cmluZywgcmVzcG9uc2U6IGFueSkgPT4gdm9pZCkge1xuICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHZhciBkYXRhID0gJ3Jlc3VsdElkPScgKyByZXN1bHRJZCArICcmY2xpZW50SWQ9JyArIGNsaWVudElkO1xuICAgICAgICB4aHIub3BlbignR0VUJywgZHhTdXJ2ZXlTZXJ2aWNlLnNlcnZpY2VVcmwgKyAnL2lzQ29tcGxldGVkPycgKyBkYXRhKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PSAyMDApIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvbklzQ29tcGxldGVkKHhoci5zdGF0dXMgPT0gMjAwLCByZXN1bHQsIHhoci5yZXNwb25zZSk7XG4gICAgICAgIH07XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2R4U3VydmV5U2VydmljZS50cyIsImltcG9ydCB7SGFzaFRhYmxlfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBGdW5jdGlvbkZhY3Rvcnkge1xuICAgIHB1YmxpYyBzdGF0aWMgSW5zdGFuY2U6IEZ1bmN0aW9uRmFjdG9yeSA9IG5ldyBGdW5jdGlvbkZhY3RvcnkoKTtcbiAgICBwcml2YXRlIGZ1bmN0aW9uSGFzaDogSGFzaFRhYmxlPChwYXJhbXM6IGFueVtdKT0+YW55PiA9IHt9O1xuXG4gICAgcHVibGljIHJlZ2lzdGVyKG5hbWU6IHN0cmluZywgZnVuYzogKHBhcmFtczogYW55W10pPT5hbnkpIHtcbiAgICAgICAgdGhpcy5mdW5jdGlvbkhhc2hbbmFtZV0gPSBmdW5jO1xuICAgIH1cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuZnVuY3Rpb25IYXNoID0ge307XG4gICAgfVxuICAgIHB1YmxpYyBnZXRBbGwoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yKHZhciBrZXkgaW4gdGhpcy5mdW5jdGlvbkhhc2gpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5zb3J0KCk7XG4gICAgfVxuICAgIHB1YmxpYyBydW4obmFtZTogc3RyaW5nLCBwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgICAgICAgdmFyIGZ1bmMgPSB0aGlzLmZ1bmN0aW9uSGFzaFtuYW1lXTtcbiAgICAgICAgaWYoIWZ1bmMpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gZnVuYyhwYXJhbXMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc3VtKHBhcmFtczogYW55W10pOiBhbnkge1xuICAgIHZhciByZXMgPSAwO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgIHJlcyArPSBwYXJhbXNbaV07XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJzdW1cIiwgc3VtKTtcblxuZnVuY3Rpb24gc3VtSW5BcnJheShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgICBpZihwYXJhbXMubGVuZ3RoICE9IDIpIHJldHVybiAwO1xuICAgIHZhciBhcnIgPSBwYXJhbXNbMF07XG4gICAgaWYoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuO1xuICAgIHZhciBuYW1lID0gcGFyYW1zWzFdO1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgJiYgIShuYW1lIGluc3RhbmNlb2YgU3RyaW5nKSkgcmV0dXJuIDA7XG4gICAgdmFyIHJlcyA9IDA7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBhcnJbaV07XG4gICAgICAgIGlmKGl0ZW0gJiYgaXRlbVs8c3RyaW5nPm5hbWVdKSB7XG4gICAgICAgICAgICByZXMgKz0gaXRlbVs8c3RyaW5nPm5hbWVdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJzdW1JbkFycmF5XCIsIHN1bUluQXJyYXkpO1xuXG5mdW5jdGlvbiBhZ2UocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gICAgaWYocGFyYW1zLmxlbmd0aCA8IDEpIHJldHVybiAtMTtcbiAgICB2YXIgYmlydGhEYXkgPSBuZXcgRGF0ZShwYXJhbXNbMF0pO1xuICAgIHZhciBhZ2VEaWZNcyA9IERhdGUubm93KCkgLSBiaXJ0aERheS5nZXRUaW1lKCk7XG4gICAgdmFyIGFnZURhdGUgPSBuZXcgRGF0ZShhZ2VEaWZNcyk7IC8vIG1pbGlzZWNvbmRzIGZyb20gZXBvY2hcbiAgICByZXR1cm4gTWF0aC5hYnMoYWdlRGF0ZS5nZXRVVENGdWxsWWVhcigpIC0gMTk3MCk7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJhZ2VcIiwgYWdlKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mdW5jdGlvbnNmYWN0b3J5LnRzIiwiaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQge0hhc2hUYWJsZX0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHtCYXNlLCBJUGFnZSwgSUNvbmRpdGlvblJ1bm5lciwgSVN1cnZleSwgSUVsZW1lbnQsIElRdWVzdGlvbiwgU3VydmV5RWxlbWVudH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHtRdWVzdGlvbkJhc2V9IGZyb20gXCIuL3F1ZXN0aW9uYmFzZVwiO1xuaW1wb3J0IHtDb25kaXRpb25SdW5uZXJ9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7UXVlc3Rpb25GYWN0b3J5fSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7UGFuZWxNb2RlbCwgUGFuZWxNb2RlbEJhc2UsIFF1ZXN0aW9uUm93TW9kZWx9IGZyb20gXCIuL3BhbmVsXCI7XG4vKipcbiAqIFRoZSBwYWdlIG9iamVjdC4gSXQgaGFzIGVsZW1lbnRzIGNvbGxlY3Rpb24sIHRoYXQgY29udGFpbnMgcXVlc3Rpb25zIGFuZCBwYW5lbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlTW9kZWwgZXh0ZW5kcyBQYW5lbE1vZGVsQmFzZSBpbXBsZW1lbnRzIElQYWdlIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJcIikge1xuICAgICAgICBzdXBlcihuYW1lKTtcbiAgICB9XG4gICAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHsgcmV0dXJuIFwicGFnZVwiOyB9XG4gICAgLyoqXG4gICAgICogVGhlIHZpc2libGUgaW5kZXggb2YgdGhlIHBhZ2UuIEl0IGhhcyB2YWx1ZXMgZnJvbSAwIHRvIHZpc2libGUgcGFnZSBjb3VudCAtIDEuXG4gICAgICogQHNlZSBTdXJ2ZXlNb2RlbC52aXNpYmxlUGFnZXNcbiAgICAgKiBAc2VlIFN1cnZleU1vZGVsLnBhZ2VzXG4gICAgICovXG4gICAgcHVibGljIGdldCB2aXNpYmxlSW5kZXgoKTogbnVtYmVyeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUluZGV4XCIsIC0xKTsgfVxuICAgIHB1YmxpYyBzZXQgdmlzaWJsZUluZGV4KHZhbCA6IG51bWJlcikgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSW5kZXhcIiwgdmFsKTsgfVxuICAgIHB1YmxpYyBnZXQgbnVtKCkgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibnVtXCIsIC0xKTsgfVxuICAgIHB1YmxpYyBzZXQgbnVtKHZhbDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLm51bSA9PSB2YWwpIHJldHVybjtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibnVtXCIsIHZhbCk7XG4gICAgICAgIHRoaXMub25OdW1DaGFuZ2VkKHZhbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIFwiaGlkZVwiIHRvIG1ha2UgXCJQcmV2XCIsIFwiTmV4dFwiIGFuZCBcIkNvbXBsZXRlXCIgYnV0dG9ucyBhcmUgaW52aXNpYmxlIGZvciB0aGlzIHBhZ2UuIFNldCB0aGlzIHByb3BlcnR5IHRvIFwic2hvd1wiIHRvIG1ha2UgdGhlc2UgYnV0dG9ucyB2aXNpYmxlLCBldmVuIGlmIHN1cnZleSBzaG93TmF2aWdhdGlvbkJ1dHRvbnMgcHJvcGVydHkgaXMgZmFsc2UuXG4gICAgICogQHNlZSBTdXJ2ZXlNb2RlLnNob3dOYXZpZ2F0aW9uQnV0dG9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJuYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHlcIiwgXCJpbmhlcml0XCIpOyB9XG4gICAgcHVibGljIHNldCBuYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHkodmFsOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5XCIsIHZhbC50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldFJlbmRlcmVkVGl0bGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBzdHIgPSBzdXBlci5nZXRSZW5kZXJlZFRpdGxlKHN0cik7XG4gICAgICAgIGlmKHRoaXMubnVtID4gMCkge1xuICAgICAgICAgICAgc3RyID0gdGhpcy5udW0gICsgXCIuIFwiICsgc3RyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIC8qKiBcbiAgICAgKiBDYWxsIGl0IHRvIGZvY3VzIHRoZSBpbnB1dCBvbiB0aGUgZmlyc3QgcXVlc3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgZm9jdXNGaXJzdFF1ZXN0aW9uKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLnF1ZXN0aW9uc1tpXTtcbiAgICAgICAgICAgIGlmICghcXVlc3Rpb24udmlzaWJsZSB8fCAhcXVlc3Rpb24uaGFzSW5wdXQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbnNbaV0uZm9jdXMoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgaXQgdG8gZm9jdXMgdGhlIGlucHV0IG9mIHRoZSBmaXJzdCBxdWVzdGlvbiB0aGF0IGhhcyBhbiBlcnJvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgZm9jdXNGaXJzdEVycm9yUXVlc3Rpb24oKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5xdWVzdGlvbnNbaV0udmlzaWJsZSB8fCB0aGlzLnF1ZXN0aW9uc1tpXS5jdXJyZW50RXJyb3JDb3VudCA9PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25zW2ldLmZvY3VzKHRydWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCBpdCB0byBzY3JvbGwgdG8gdGhlIHBhZ2UgdG9wLlxuICAgICAqL1xuICAgIHB1YmxpYyBzY3JvbGxUb1RvcCgpIHtcbiAgICAgICAgU3VydmV5RWxlbWVudC5TY3JvbGxFbGVtZW50VG9Ub3AodGhpcy5pZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRpbWUgaW4gc2Vjb25kcyBlbmQtdXNlciBzcGVudCBvbiB0aGlzIHBhZ2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRpbWVTcGVudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidGltZVNwZW50XCIsIDApOyB9XG4gICAgcHVibGljIHNldCB0aW1lU3BlbnQodmFsOiBudW1iZXIpIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidGltZVNwZW50XCIsIHZhbCk7IH1cbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSB0aW1lIGluIHNlY29uZHMgdGhhdCBlbmQtdXNlciBoYXMgdG8gY29tcGxldGUgdGhlIHBhZ2UuIElmIHRoZSB2YWx1ZSBpcyAwIG9yIGxlc3MsIHRoZSBlbmQtdXNlciBoYXMgdW5saW1pdGVkIG51bWJlciBvZiB0aW1lIHRvIGZpbmlzaCB0aGUgcGFnZS4gIFxuICAgICAqIEBzZWUgc3RhcnRUaW1lclxuICAgICAqIEBzZWUgU3VydmV5TW9kZWwubWF4VGltZVRvRmluaXNoUGFnZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4VGltZVRvRmluaXNoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hcIiwgMCk7IH1cbiAgICBwdWJsaWMgc2V0IG1heFRpbWVUb0ZpbmlzaCh2YWw6IG51bWJlcikgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hcIiwgdmFsKTsgfSAgICBcbiAgICBwcm90ZWN0ZWQgb25OdW1DaGFuZ2VkKHZhbHVlOiBudW1iZXIpIHtcbiAgICB9XG4gICAgcHJvdGVjdGVkIG9uVmlzaWJsZUNoYW5nZWQoKSB7XG4gICAgICAgIHN1cGVyLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgICAgICAgaWYgKHRoaXMuc3VydmV5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc3VydmV5LnBhZ2VWaXNpYmlsaXR5Q2hhbmdlZCh0aGlzLCB0aGlzLnZpc2libGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwicGFnZVwiLCBbeyBuYW1lOiBcIm5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eVwiLCBkZWZhdWx0OiBcImluaGVyaXRcIiwgY2hvaWNlczogW1wiaW5oZXJpdFwiLCBcInNob3dcIiwgXCJoaWRlXCJdIH0sXG4gICAgeyBuYW1lOiBcIm1heFRpbWVUb0ZpbmlzaDpudW1iZXJcIiwgZGVmYXVsdDogMH1dLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgUGFnZU1vZGVsKCk7IH0sIFwicGFuZWxiYXNlXCIpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BhZ2UudHMiLCJpbXBvcnQge0Jhc2UsIElRdWVzdGlvbiwgRXZlbnR9IGZyb20gXCIuL2Jhc2VcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0IHtcbiAgICBwdWJsaWMgaHRtbFRlbXBsYXRlOiBzdHJpbmc7XG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHdpZGdldEpzb246IGFueSkge1xuICAgICAgICB0aGlzLmh0bWxUZW1wbGF0ZSA9IHdpZGdldEpzb24uaHRtbFRlbXBsYXRlID8gd2lkZ2V0SnNvbi5odG1sVGVtcGxhdGUgOiBcIlwiO1xuICAgIH1cbiAgICBwdWJsaWMgYWZ0ZXJSZW5kZXIocXVlc3Rpb246IElRdWVzdGlvbiwgZWw6IGFueSkge1xuICAgICAgICBpZiAodGhpcy53aWRnZXRKc29uLmFmdGVyUmVuZGVyKSB0aGlzLndpZGdldEpzb24uYWZ0ZXJSZW5kZXIocXVlc3Rpb24sIGVsKTtcbiAgICB9XG4gICAgcHVibGljIHdpbGxVbm1vdW50KHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGVsOiBhbnkpIHtcbiAgICAgICAgaWYgKHRoaXMud2lkZ2V0SnNvbi53aWxsVW5tb3VudCkgdGhpcy53aWRnZXRKc29uLndpbGxVbm1vdW50KHF1ZXN0aW9uLCBlbCk7XG4gICAgfVxuICAgIHB1YmxpYyBpc0ZpdChxdWVzdGlvbjogSVF1ZXN0aW9uKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmlzTGlicmFyeUxvYWRlZCgpICYmIHRoaXMud2lkZ2V0SnNvbi5pc0ZpdCkgcmV0dXJuIHRoaXMud2lkZ2V0SnNvbi5pc0ZpdChxdWVzdGlvbik7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcHVibGljIGFjdGl2YXRlZEJ5Q2hhbmdlZChhY3RpdmF0ZWRCeTogc3RyaW5nKSB7XG4gICAgICAgIGlmKHRoaXMuaXNMaWJyYXJ5TG9hZGVkKCkgJiYgdGhpcy53aWRnZXRKc29uLmFjdGl2YXRlZEJ5Q2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy53aWRnZXRKc29uLmFjdGl2YXRlZEJ5Q2hhbmdlZChhY3RpdmF0ZWRCeSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBpc0xpYnJhcnlMb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmKHRoaXMud2lkZ2V0SnNvbi53aWRnZXRJc0xvYWRlZCkgcmV0dXJuIHRoaXMud2lkZ2V0SnNvbi53aWRnZXRJc0xvYWRlZCgpID09IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGlzRGVmYXVsdFJlbmRlcigpIDogYm9vbGVhbiB7IHJldHVybiB0aGlzLndpZGdldEpzb24uaXNEZWZhdWx0UmVuZGVyOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBDdXN0b21XaWRnZXRDb2xsZWN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIEluc3RhbmNlOiBDdXN0b21XaWRnZXRDb2xsZWN0aW9uID0gbmV3IEN1c3RvbVdpZGdldENvbGxlY3Rpb24oKTtcbiAgICBwcml2YXRlIHdpZGdldHNWYWx1ZXM6IEFycmF5PFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0PiA9IFtdO1xuICAgIHByaXZhdGUgd2lkZ2V0c0FjdGl2YXRlZEJ5ID0ge307XG5cbiAgICBwdWJsaWMgb25DdXN0b21XaWRnZXRBZGRlZDogRXZlbnQ8KGN1c3RvbVdpZGdldDogUXVlc3Rpb25DdXN0b21XaWRnZXQpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoY3VzdG9tV2lkZ2V0OiBRdWVzdGlvbkN1c3RvbVdpZGdldCkgPT4gYW55LCBhbnk+KCk7XG5cbiAgICBwdWJsaWMgZ2V0IHdpZGdldHMoKTogQXJyYXk8UXVlc3Rpb25DdXN0b21XaWRnZXQ+IHsgcmV0dXJuIHRoaXMud2lkZ2V0c1ZhbHVlczsgfVxuICAgIHB1YmxpYyBhZGRDdXN0b21XaWRnZXQod2lkZ2V0SnNvbjogYW55LCBhY3RpdmF0ZWRCeTogc3RyaW5nID0gXCJwcm9wZXJ0eVwiKSB7XG4gICAgICAgIHZhciBuYW1lID0gd2lkZ2V0SnNvbi5uYW1lO1xuICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgIG5hbWUgPSBcIndpZGdldF9cIiArIHRoaXMud2lkZ2V0cy5sZW5ndGggKyAxO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjdXN0b21XaWRnZXQgPSBuZXcgUXVlc3Rpb25DdXN0b21XaWRnZXQobmFtZSwgd2lkZ2V0SnNvbik7XG4gICAgICAgIHRoaXMud2lkZ2V0c1ZhbHVlcy5wdXNoKGN1c3RvbVdpZGdldCk7XG4gICAgICAgIHRoaXMud2lkZ2V0c0FjdGl2YXRlZEJ5W25hbWVdID0gYWN0aXZhdGVkQnk7XG4gICAgICAgIGN1c3RvbVdpZGdldC5hY3RpdmF0ZWRCeUNoYW5nZWQoYWN0aXZhdGVkQnkpO1xuICAgICAgICB0aGlzLm9uQ3VzdG9tV2lkZ2V0QWRkZWQuZmlyZShjdXN0b21XaWRnZXQsIG51bGwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB3YXkgdGhlIGN1c3RvbSB3aWdldCBpcyBhY3RpdmF0ZWQuIEl0IGNhbiBiZSBhY3RpdmF0ZWQgYnkgYSBwcm9wZXJ0eSAoXCJwcm9wZXJ0eVwiKSwgcXVlc3Rpb24gdHlwZSAoXCJ0eXBlXCIpIG9yIGJ5IG5ldy9jdXN0b20gcXVlc3Rpb24gdHlwZSAoXCJjdXN0b210eXBlXCIpLlxuICAgICAqIEBwYXJhbSB3aWRnZXROYW1lIHRoZSBjdXN0b20gd2lkZ2V0IG5hbWVcbiAgICAgKiBAc2VlIHNldEFjdGl2YXRlZEJ5IFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRBY3RpdmF0ZWRCeSh3aWRnZXROYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdmFyIHJlcyA9IHRoaXMud2lkZ2V0c0FjdGl2YXRlZEJ5W3dpZGdldE5hbWVdO1xuICAgICAgICByZXR1cm4gcmVzID8gcmVzIDogXCJwcm9wZXJ0eVwiO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB3YXkgdGhlIGN1c3RvbSB3aWdldCBpcyBhY3RpdmF0ZWQuIFRoZSBhY3RpdmF0aW9uIHR5cGVzIGFyZTogcHJvcGVydHkgKFwicHJvcGVydHlcIiksIHF1ZXN0aW9uIHR5cGUgKFwidHlwZVwiKSBvciBuZXcvY3VzdG9tIHF1ZXN0aW9uIHR5cGUgKFwiY3VzdG9tdHlwZVwiKS4gQSBjdXN0b20gd2lnZXQgbWF5IHN1cHBvcnQgYWxsIG9yIG9ubHkgc29tZSBvZiB0aGlzIGFjdGl2YXRpb24gdHlwZXMuXG4gICAgICogQHBhcmFtIHdpZGdldE5hbWUgXG4gICAgICogQHBhcmFtIGFjdGl2YXRlZEJ5IHRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSB2YXJpYW50czogXCJwcm9wZXJ0eVwiLCBcInR5cGVcIiBhbmQgXCJjdXN0b210eXBlXCJcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0QWN0aXZhdGVkQnkod2lkZ2V0TmFtZTogc3RyaW5nLCBhY3RpdmF0ZWRCeTogc3RyaW5nKSB7XG4gICAgICAgIGlmKCF3aWRnZXROYW1lIHx8ICFhY3RpdmF0ZWRCeSkgcmV0dXJuO1xuICAgICAgICB2YXIgd2lkZ2V0ID0gdGhpcy5nZXRDdXN0b21XaWRnZXRCeU5hbWUod2lkZ2V0TmFtZSk7XG4gICAgICAgIGlmKCF3aWRnZXQpIHJldHVybjtcbiAgICAgICAgdGhpcy53aWRnZXRzQWN0aXZhdGVkQnlbd2lkZ2V0TmFtZV0gPSBhY3RpdmF0ZWRCeTtcbiAgICAgICAgd2lkZ2V0LmFjdGl2YXRlZEJ5Q2hhbmdlZChhY3RpdmF0ZWRCeSk7XG4gICAgfVxuICAgIHB1YmxpYyBjbGVhcigpIHsgdGhpcy53aWRnZXRzVmFsdWVzID0gW107IH1cbiAgICBwdWJsaWMgZ2V0Q3VzdG9tV2lkZ2V0QnlOYW1lKG5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0IHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMud2lkZ2V0cy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIGlmKHRoaXMud2lkZ2V0c1tpXS5uYW1lID09IG5hbWUpIHJldHVybiB0aGlzLndpZGdldHNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRDdXN0b21XaWRnZXQocXVlc3Rpb246IElRdWVzdGlvbik6IFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0IHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLndpZGdldHNWYWx1ZXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy53aWRnZXRzVmFsdWVzW2ldLmlzRml0KHF1ZXN0aW9uKSkgcmV0dXJuIHRoaXMud2lkZ2V0c1ZhbHVlc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25DdXN0b21XaWRnZXRzLnRzIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlfSBmcm9tICcuL3JlYWN0cXVlc3Rpb25lbGVtZW50JztcblxuZXhwb3J0IGNsYXNzIFN1cnZleUN1c3RvbVdpZGdldCBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgIH1cbiAgICBsb2NhbGVDaGFuZ2VkSGFuZGxlciA9IChzZW5kZXIpID0+IHNlbmRlci5jdXN0b21XaWRnZXREYXRhLmlzTmVlZFJlbmRlciA9IHRydWU7XG4gICAgcHJpdmF0ZSBfYWZ0ZXJSZW5kZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uQmFzZS5jdXN0b21XaWRnZXQpIHtcbiAgICAgICAgICAgIGxldCBlbCA9IHRoaXMucmVmc1snd2lkZ2V0J107XG4gICAgICAgICAgICBpZiAoISFlbCkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb25CYXNlLmN1c3RvbVdpZGdldC5hZnRlclJlbmRlcih0aGlzLnF1ZXN0aW9uQmFzZSwgZWwpO1xuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb25CYXNlLmN1c3RvbVdpZGdldERhdGEuaXNOZWVkUmVuZGVyID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uQmFzZSkge1xuICAgICAgICAgICAgdGhpcy5fYWZ0ZXJSZW5kZXIoKTtcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25CYXNlLmxvY2FsZUNoYW5nZWQuYWRkKHRoaXMubG9jYWxlQ2hhbmdlZEhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25CYXNlKSB7XG4gICAgICAgICAgICB0aGlzLl9hZnRlclJlbmRlcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbkJhc2UuY3VzdG9tV2lkZ2V0KSB7XG4gICAgICAgICAgICBsZXQgZWwgPSB0aGlzLnJlZnNbJ3dpZGdldCddO1xuICAgICAgICAgICAgaWYgKCEhZWwpIHsgdGhpcy5xdWVzdGlvbkJhc2UuY3VzdG9tV2lkZ2V0LndpbGxVbm1vdW50KHRoaXMucXVlc3Rpb25CYXNlLCBlbCk7IH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnF1ZXN0aW9uQmFzZS5sb2NhbGVDaGFuZ2VkLnJlbW92ZSh0aGlzLmxvY2FsZUNoYW5nZWRIYW5kbGVyKTtcbiAgICB9XG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXN0aW9uQmFzZSB8fCAhdGhpcy5jcmVhdG9yKSB7IHJldHVybiBudWxsOyB9XG4gICAgICAgIGlmICghdGhpcy5xdWVzdGlvbkJhc2UudmlzaWJsZSkgeyByZXR1cm4gbnVsbDsgfVxuXG4gICAgICAgIGxldCBjdXN0b21XaWRnZXQgPSB0aGlzLnF1ZXN0aW9uQmFzZS5jdXN0b21XaWRnZXQ7XG5cbiAgICAgICAgaWYgKGN1c3RvbVdpZGdldC5pc0RlZmF1bHRSZW5kZXIpIHtcbiAgICAgICAgICAgIHJldHVybiA8ZGl2IHJlZj0nd2lkZ2V0Jz57dGhpcy5jcmVhdG9yLmNyZWF0ZVF1ZXN0aW9uRWxlbWVudCh0aGlzLnF1ZXN0aW9uQmFzZSl9PC9kaXY+O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHdpZGdldCA9IG51bGw7XG4gICAgICAgIGlmIChjdXN0b21XaWRnZXQud2lkZ2V0SnNvbi5yZW5kZXIpIHtcbiAgICAgICAgICAgIHdpZGdldCA9IGN1c3RvbVdpZGdldC53aWRnZXRKc29uLnJlbmRlcih0aGlzLnF1ZXN0aW9uQmFzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3VzdG9tV2lkZ2V0Lmh0bWxUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgIGxldCBodG1sVmFsdWUgPSB7IF9faHRtbDogY3VzdG9tV2lkZ2V0Lmh0bWxUZW1wbGF0ZSB9O1xuICAgICAgICAgICAgICAgIHJldHVybiA8ZGl2IHJlZj0nd2lkZ2V0JyBkYW5nZXJvdXNseVNldElubmVySFRNTD17aHRtbFZhbHVlfT48L2Rpdj47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDxkaXYgcmVmPSd3aWRnZXQnPnt3aWRnZXR9PC9kaXY+O1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9jdXN0b20td2lkZ2V0LnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7U3VydmV5TW9kZWx9IGZyb20gXCIuLi9zdXJ2ZXlcIjtcbmltcG9ydCB7U3VydmV5TmF2aWdhdGlvbkJhc2V9IGZyb20gXCIuL3JlYWN0U3VydmV5TmF2aWdhdGlvbkJhc2VcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleU5hdmlnYXRpb24gZXh0ZW5kcyBTdXJ2ZXlOYXZpZ2F0aW9uQmFzZSB7XG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuaGFuZGxlUHJldkNsaWNrID0gdGhpcy5oYW5kbGVQcmV2Q2xpY2suYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVOZXh0Q2xpY2sgPSB0aGlzLmhhbmRsZU5leHRDbGljay5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmhhbmRsZUNvbXBsZXRlQ2xpY2sgPSB0aGlzLmhhbmRsZUNvbXBsZXRlQ2xpY2suYmluZCh0aGlzKTtcbiAgICB9XG4gICAgaGFuZGxlUHJldkNsaWNrKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuc3VydmV5LnByZXZQYWdlKCk7XG4gICAgfVxuICAgIGhhbmRsZU5leHRDbGljayhldmVudCkge1xuICAgICAgICB0aGlzLnN1cnZleS5uZXh0UGFnZSgpO1xuICAgIH1cbiAgICBoYW5kbGVDb21wbGV0ZUNsaWNrKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuc3VydmV5LmNvbXBsZXRlTGFzdFBhZ2UoKTtcbiAgICB9XG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgaWYgKCF0aGlzLnN1cnZleSB8fCAhdGhpcy5zdXJ2ZXkuaXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmcpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgcHJldkJ1dHRvbiA9ICF0aGlzLnN1cnZleS5pc0ZpcnN0UGFnZSAmJiB0aGlzLnN1cnZleS5pc1Nob3dQcmV2QnV0dG9uID8gdGhpcy5yZW5kZXJCdXR0b24odGhpcy5oYW5kbGVQcmV2Q2xpY2ssIHRoaXMuc3VydmV5LnBhZ2VQcmV2VGV4dCwgdGhpcy5jc3MubmF2aWdhdGlvbi5wcmV2KSA6IG51bGw7XG4gICAgICAgIHZhciBuZXh0QnV0dG9uID0gIXRoaXMuc3VydmV5LmlzTGFzdFBhZ2UgPyB0aGlzLnJlbmRlckJ1dHRvbih0aGlzLmhhbmRsZU5leHRDbGljaywgdGhpcy5zdXJ2ZXkucGFnZU5leHRUZXh0LCB0aGlzLmNzcy5uYXZpZ2F0aW9uLm5leHQpIDogbnVsbDtcbiAgICAgICAgdmFyIGNvbXBsZXRlQnV0dG9uID0gdGhpcy5zdXJ2ZXkuaXNMYXN0UGFnZSAmJiB0aGlzLnN1cnZleS5pc0VkaXRNb2RlID8gdGhpcy5yZW5kZXJCdXR0b24odGhpcy5oYW5kbGVDb21wbGV0ZUNsaWNrLCB0aGlzLnN1cnZleS5jb21wbGV0ZVRleHQsIHRoaXMuY3NzLm5hdmlnYXRpb24uY29tcGxldGUpIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmNzcy5mb290ZXJ9PlxuICAgICAgICAgICAgICAgIHtwcmV2QnV0dG9ufVxuICAgICAgICAgICAgICAgIHtuZXh0QnV0dG9ufVxuICAgICAgICAgICAgICAgIHtjb21wbGV0ZUJ1dHRvbn1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHJlbmRlckJ1dHRvbihjbGljazogYW55LCB0ZXh0OiBzdHJpbmcsIGJ0bkNsYXNzTmFtZTogc3RyaW5nKTogSlNYLkVsZW1lbnQge1xuICAgICAgICB2YXIgc3R5bGUgPSB7IG1hcmdpblJpZ2h0OiBcIjVweFwiIH07XG4gICAgICAgIHZhciBjbGFzc05hbWUgPSB0aGlzLmNzcy5uYXZpZ2F0aW9uQnV0dG9uICsgKGJ0bkNsYXNzTmFtZSA/ICcgJyArIGJ0bkNsYXNzTmFtZSA6IFwiXCIpO1xuICAgICAgICByZXR1cm4gPGlucHV0IGNsYXNzTmFtZT17Y2xhc3NOYW1lfSBzdHlsZT17c3R5bGV9IHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXtjbGlja30gdmFsdWU9e3RleHR9IC8+O1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdFN1cnZleU5hdmlnYXRpb24udHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtTdXJ2ZXlNb2RlbH0gZnJvbSBcIi4uL3N1cnZleVwiO1xuaW1wb3J0IHtTdXJ2ZXlOYXZpZ2F0aW9uQmFzZX0gZnJvbSBcIi4vcmVhY3RTdXJ2ZXlOYXZpZ2F0aW9uQmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UHJvZ3Jlc3MgZXh0ZW5kcyBTdXJ2ZXlOYXZpZ2F0aW9uQmFzZSB7XG4gICAgcHJvdGVjdGVkIGlzVG9wOiBib29sZWFuO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLmlzVG9wID0gcHJvcHMuaXNUb3A7XG4gICAgfVxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzOiBhbnkpIHtcbiAgICAgICAgc3VwZXIuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpO1xuICAgICAgICB0aGlzLmlzVG9wID0gbmV4dFByb3BzLmlzVG9wO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0IHByb2dyZXNzKCk6IG51bWJlciB7IHJldHVybiB0aGlzLnN1cnZleS5nZXRQcm9ncmVzcygpOyB9XG4gICAgcHJvdGVjdGVkIGdldCBwcm9ncmVzc1RleHQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuc3VydmV5LnByb2dyZXNzVGV4dDsgfVxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIHZhciBzdHlsZSA9IHRoaXMuaXNUb3AgPyB7IHdpZHRoOiBcIjYwJVwiIH0gOiB7IHdpZHRoOiBcIjYwJVwiLCBtYXJnaW5Ub3A6IFwiMTBweFwiIH07XG4gICAgICAgIHZhciBwcm9ncmVzc1N0eWxlID0geyB3aWR0aDogXCJhdXRvXCIsIG1pbldpZHRoOiB0aGlzLnByb2dyZXNzICsgXCIlXCIsIHBhZGRpbmdMZWZ0OiBcIjJweFwiLCBwYWRkaW5nUmlnaHQ6IFwiMnB4XCIgfTtcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17dGhpcy5jc3MucHJvZ3Jlc3N9IHN0eWxlPXtzdHlsZX0+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXtwcm9ncmVzc1N0eWxlfSBjbGFzc05hbWU9e3RoaXMuY3NzLnByb2dyZXNzQmFyfSByb2xlPVwicHJvZ3Jlc3NiYXJcIiBhcmlhLXZhbHVlbWluPVwiMFwiIGFyaWEtdmFsdWVtYXg9XCIxMDBcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57dGhpcy5wcm9ncmVzc1RleHR9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+KTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RTdXJ2ZXlQcm9ncmVzcy50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1JlYWN0U3VydmV5RWxlbWVudCwgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcbmltcG9ydCB7UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsfSBmcm9tIFwiLi4vcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25cIjtcbmltcG9ydCB7SVN1cnZleUNyZWF0b3IsIFN1cnZleVF1ZXN0aW9uRXJyb3JzfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uXCI7XG5pbXBvcnQge01hdHJpeERyb3Bkb3duUm93TW9kZWx9IGZyb20gXCIuLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93blwiO1xuaW1wb3J0IHtNYXRyaXhEcm9wZG93bkNlbGx9IGZyb20gXCIuLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmJhc2VcIjtcbmltcG9ydCB7UmVhY3RRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQge1N1cnZleUN1c3RvbVdpZGdldH0gZnJvbSAnLi9jdXN0b20td2lkZ2V0JztcblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uTWF0cml4RHJvcGRvd24gZXh0ZW5kcyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwgeyByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsOyB9XG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGNzc0NsYXNzZXMgPSB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgICAgIHZhciBoZWFkZXJzID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5xdWVzdGlvbi5jb2x1bW5zW2ldO1xuICAgICAgICAgICAgdmFyIGtleSA9IFwiY29sdW1uXCIgKyBpO1xuICAgICAgICAgICAgdmFyIG1pbldpZHRoID0gdGhpcy5xdWVzdGlvbi5nZXRDb2x1bW5XaWR0aChjb2x1bW4pO1xuICAgICAgICAgICAgdmFyIGNvbHVtblN0eWxlID0gbWluV2lkdGggPyB7IG1pbldpZHRoOiBtaW5XaWR0aCB9IDoge307XG4gICAgICAgICAgICB2YXIgY29sdW1uVGl0bGUgPSB0aGlzLnJlbmRlckxvY1N0cmluZyhjb2x1bW4ubG9jVGl0bGUpO1xuICAgICAgICAgICAgaGVhZGVycy5wdXNoKDx0aCBrZXk9e2tleX0gc3R5bGU9e2NvbHVtblN0eWxlfT57Y29sdW1uVGl0bGV9PC90aD4pO1xuICAgICAgICB9XG4gICAgICAgIHZhciByb3dzID0gW107XG4gICAgICAgIHZhciB2aXNpYmxlUm93cyA9IHRoaXMucXVlc3Rpb24udmlzaWJsZVJvd3M7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciByb3cgPSB2aXNpYmxlUm93c1tpXTtcbiAgICAgICAgICAgIHJvd3MucHVzaCg8U3VydmV5UXVlc3Rpb25NYXRyaXhEcm9wZG93blJvdyBrZXk9e2l9IHJvdz17cm93fSBjc3NDbGFzc2VzPXtjc3NDbGFzc2VzfSBpc0Rpc3BsYXlNb2RlPXt0aGlzLmlzRGlzcGxheU1vZGV9IGNyZWF0b3I9e3RoaXMuY3JlYXRvcn0gLz4pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkaXZTdHlsZSA9IHRoaXMucXVlc3Rpb24uaG9yaXpvbnRhbFNjcm9sbCA/IHsgb3ZlcmZsb3dYOiAnc2Nyb2xsJ30gOiB7fTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgIHN0eWxlPXtkaXZTdHlsZX0+XG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5yb290fT5cbiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtoZWFkZXJzfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAge3Jvd3N9XG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uTWF0cml4RHJvcGRvd25Sb3cgZXh0ZW5kcyBSZWFjdFN1cnZleUVsZW1lbnQge1xuICAgIHByaXZhdGUgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsO1xuICAgIHByb3RlY3RlZCBjcmVhdG9yOiBJU3VydmV5Q3JlYXRvcjtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0aWVzKHByb3BzKTtcbiAgICB9XG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlci5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyk7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydGllcyhuZXh0UHJvcHMpO1xuICAgIH1cbiAgICBwcml2YXRlIHNldFByb3BlcnRpZXMobmV4dFByb3BzOiBhbnkpIHtcbiAgICAgICAgdGhpcy5yb3cgPSBuZXh0UHJvcHMucm93O1xuICAgICAgICB0aGlzLmNyZWF0b3IgPSBuZXh0UHJvcHMuY3JlYXRvcjsgICAgICAgIFxuICAgIH1cbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICBpZiAoIXRoaXMucm93KSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIHRkcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2VsbCA9IHRoaXMucm93LmNlbGxzW2ldO1xuICAgICAgICAgICAgdmFyIGNlbGxFbGVtZW50ID0gPFN1cnZleVF1ZXN0aW9uTWF0cml4RHJvcGRvd25DZWxsIGtleT17XCJyb3dcIiArIGl9IGNzc0NsYXNzZXM9e3RoaXMuY3NzQ2xhc3Nlc30gY2VsbD17Y2VsbH0gY3JlYXRvcj17dGhpcy5jcmVhdG9yfSAvPlxuICAgICAgICAgICAgdGRzLnB1c2goY2VsbEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciByb3dUZXh0ID0gdGhpcy5yZW5kZXJMb2NTdHJpbmcodGhpcy5yb3cubG9jVGV4dCk7XG4gICAgICAgIHJldHVybiAoPHRyPjx0ZD57cm93VGV4dH08L3RkPnt0ZHN9PC90cj4pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uTWF0cml4RHJvcGRvd25DZWxsIGV4dGVuZHMgUmVhY3RTdXJ2ZXlFbGVtZW50IHtcbiAgICBwcml2YXRlIGNlbGwgOiBNYXRyaXhEcm9wZG93bkNlbGw7XG4gICAgcHJvdGVjdGVkIGNyZWF0b3I6IElTdXJ2ZXlDcmVhdG9yO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnNldFByb3BlcnRpZXMocHJvcHMpO1xuICAgICAgICBpZih0aGlzLmNlbGwgJiYgdGhpcy5jZWxsLnF1ZXN0aW9uKSB7XG4gICAgICAgICAgICB2YXIgcSA9IHRoaXMuY2VsbC5xdWVzdGlvbjtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSB7aXNSZWFkT25seTogcS5pc1JlYWRPbmx5LCB2aXNpYmxlOiBxLnZpc2libGV9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgIH1cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wczogYW55KSB7XG4gICAgICAgIHN1cGVyLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKTtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0aWVzKG5leHRQcm9wcyk7XG4gICAgfVxuICAgIHByaXZhdGUgc2V0UHJvcGVydGllcyhuZXh0UHJvcHM6IGFueSkge1xuICAgICAgICB0aGlzLmNlbGwgPSBuZXh0UHJvcHMuY2VsbDtcbiAgICAgICAgdGhpcy5jcmVhdG9yID0gbmV4dFByb3BzLmNyZWF0b3I7ICAgICAgICBcbiAgICB9XG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHZhciBlbCA9IHRoaXMucmVmc1tcImNlbGxcIl07XG4gICAgICAgIGlmIChlbCAmJiB0aGlzLmNlbGwgJiYgdGhpcy5jZWxsLnF1ZXN0aW9uLnN1cnZleSkge1xuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7IGNlbGw6IHRoaXMuY2VsbCwgY2VsbFF1ZXN0aW9uOiB0aGlzLmNlbGwucXVlc3Rpb24sIGh0bWxFbGVtZW50OiBlbCwgcm93OiB0aGlzLmNlbGwucm93LCBjb2x1bW46IHRoaXMuY2VsbC5jb2x1bW4gfTsgXG4gICAgICAgICAgICB0aGlzLmNlbGwucXVlc3Rpb24uc3VydmV5Lm1hdHJpeEFmdGVyQ2VsbFJlbmRlcih0aGlzLmNlbGwucXVlc3Rpb24sIG9wdGlvbnMpO1xuICAgICAgICB9IFxuICAgICAgICBpZih0aGlzLmNlbGwgJiYgdGhpcy5jZWxsLnF1ZXN0aW9uKSB7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmNlbGwucXVlc3Rpb24ucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJpc1JlYWRPbmx5XCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUuaXNSZWFkT25seSA9IHNlbGYuY2VsbC5xdWVzdGlvbi5pc1JlYWRPbmx5O1xuICAgICAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoc2VsZi5zdGF0ZSk7XG4gICAgICAgICAgICB9LCBcInJlYWN0XCIpO1xuICAgICAgICAgICAgdGhpcy5jZWxsLnF1ZXN0aW9uLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwidmlzaWJsZVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBzZWxmLnN0YXRlLnZpc2libGUgPSBzZWxmLmNlbGwucXVlc3Rpb24udmlzaWJsZTtcbiAgICAgICAgICAgICAgICBzZWxmLnNldFN0YXRlKHNlbGYuc3RhdGUpO1xuICAgICAgICAgICAgfSwgXCJyZWFjdFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2VsbCAmJiB0aGlzLmNlbGwucXVlc3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY2VsbC5xdWVzdGlvbi51blJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoW1widmlzaWJsZVwiLCBcImlzUmVhZE9ubHlcIl0sIFwicmVhY3RcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgaWYgKCF0aGlzLmNlbGwpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgZXJyb3JzID0gPFN1cnZleVF1ZXN0aW9uRXJyb3JzIHF1ZXN0aW9uPXt0aGlzLmNlbGwucXVlc3Rpb259IGNzc0NsYXNzZXM9e3RoaXMuY3NzQ2xhc3Nlc30gY3JlYXRvcj17dGhpcy5jcmVhdG9yfSAvPlxuICAgICAgICB2YXIgcmVuZGVyZWRDZWxsID0gdGhpcy5yZW5kZXJDZWxsKCk7XG4gICAgICAgIHJldHVybiAoPHRkIHJlZj1cImNlbGxcIiBjbGFzc05hbWU9e3RoaXMuY3NzQ2xhc3Nlcy5pdGVtVmFsdWV9PntlcnJvcnN9e3JlbmRlcmVkQ2VsbH08L3RkPik7XG4gICAgfVxuICAgIHJlbmRlckNlbGwoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICBpZighdGhpcy5jZWxsLnF1ZXN0aW9uLnZpc2libGUpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgY3VzdG9tV2lkZ2V0ID0gdGhpcy5jZWxsLnF1ZXN0aW9uLmN1c3RvbVdpZGdldDtcbiAgICAgICAgaWYgKCFjdXN0b21XaWRnZXQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0b3IuY3JlYXRlUXVlc3Rpb25FbGVtZW50KHRoaXMuY2VsbC5xdWVzdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDxTdXJ2ZXlDdXN0b21XaWRnZXQgY3JlYXRvcj17dGhpcy5jcmVhdG9yfSBxdWVzdGlvbj17dGhpcy5jZWxsLnF1ZXN0aW9ufT48L1N1cnZleUN1c3RvbVdpZGdldD5cbiAgICB9XG59XG5cblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtYXRyaXhkcm9wZG93blwiLCAocHJvcHMpID0+IHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbk1hdHJpeERyb3Bkb3duLCBwcm9wcyk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ubWF0cml4ZHJvcGRvd24udHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtTdXJ2ZXlNb2RlbH0gZnJvbSBcIi4uL3N1cnZleVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5VGltZXJQYW5lbCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxhbnksIGFueT4ge1xuICAgIHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleU1vZGVsO1xuICAgIHByb3RlY3RlZCBjc3M6IGFueTtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5zdXJ2ZXkgPSBwcm9wcy5zdXJ2ZXk7XG4gICAgICAgIHRoaXMuY3NzID0gcHJvcHMuY3NzO1xuICAgICAgICB0aGlzLnN0YXRlID0geyB0aW1lU3BlbnQ6IDAgfTtcbiAgICB9XG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xuICAgICAgICB0aGlzLnN1cnZleSA9IG5leHRQcm9wcy5zdXJ2ZXk7XG4gICAgICAgIHRoaXMuY3NzID0gbmV4dFByb3BzLmNzcztcbiAgICB9XG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5zdXJ2ZXkucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJ0aW1lU3BlbnRcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5zdGF0ZS50aW1lU3BlbnQgPSBzZWxmLnN1cnZleS50aW1lU3BlbnQ7XG4gICAgICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZShzZWxmLnN0YXRlKTtcbiAgICAgICAgICAgIH0sIFwidGltZXJQYW5lbFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICAgICAgICB0aGlzLnN1cnZleS51blJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwidGltZVNwZW50XCIsIFwidGltZXJQYW5lbFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICBpZighdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICAgICAgcmV0dXJuIDxkaXY+e3RoaXMuc3VydmV5LnRpbWVySW5mb1RleHR9PC9kaXY+O1xuICAgIH0gICAgICAgIFxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0dGltZXJwYW5lbC50c3giLCJpbXBvcnQge0Jhc2V9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7U3VydmV5TW9kZWx9IGZyb20gXCIuL3N1cnZleVwiO1xuaW1wb3J0IHtMb2NhbGl6YWJsZVN0cmluZ30gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIHN1cnZleSBydW5uaW5nIGluIHRoZSBXaW5kb3cuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlXaW5kb3dNb2RlbCBleHRlbmRzIEJhc2UgIHtcbiAgICBwdWJsaWMgc3RhdGljIHN1cnZleUVsZW1lbnROYW1lID0gXCJ3aW5kb3dTdXJ2ZXlKU1wiO1xuICAgIHByaXZhdGUgaXNFeHBhbmRlZFZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBpc1Nob3dpbmdWYWx1ZTogYm9vbGVhbjtcbiAgICBzdXJ2ZXlWYWx1ZTogU3VydmV5TW9kZWw7XG4gICAgd2luZG93RWxlbWVudDogSFRNTERpdkVsZW1lbnQ7XG4gICAgXG4gICAgdGVtcGxhdGVWYWx1ZTogc3RyaW5nO1xuICAgIGV4cGFuZGVkQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICAgIHNob3dpbmdDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihqc29uT2JqOiBhbnksIGluaXRpYWxNb2RlbDogU3VydmV5TW9kZWwgPSBudWxsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIGlmKGluaXRpYWxNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zdXJ2ZXlWYWx1ZSA9IGluaXRpYWxNb2RlbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3VydmV5VmFsdWUgPSB0aGlzLmNyZWF0ZVN1cnZleShqc29uT2JqKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN1cnZleVZhbHVlLnNob3dUaXRsZSA9IGZhbHNlO1xuICAgICAgICBpZiAoXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIGRvY3VtZW50KSB7XG4gICAgICAgICAgICB0aGlzLndpbmRvd0VsZW1lbnQgPSA8SFRNTERpdkVsZW1lbnQ+ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgZ2V0VHlwZSgpIDogc3RyaW5nIHsgcmV0dXJuIFwid2luZG93XCIgfVxuICAgIC8qKlxuICAgICAqIEEgc3VydmV5IG9iamVjdC5cbiAgICAgKiBAc2VlIFN1cnZleU1vZGVsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzdXJ2ZXkoKTogU3VydmV5TW9kZWwgeyByZXR1cm4gdGhpcy5zdXJ2ZXlWYWx1ZTsgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIGN1cnJlbnRseSBzaG93aW5nLiBTZXQgaXQgdG8gdHJ1ZSB0byBzaG93IHRoZSB3aW5kb3cgYW5kIGZhbHNlIHRvIGhpZGUgaXQuXG4gICAgICogQHNlZSBzaG93XG4gICAgICogQHNlZSBoaWRlXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1Nob3dpbmcoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmlzU2hvd2luZ1ZhbHVlOyB9XG4gICAgcHVibGljIHNldCBpc1Nob3dpbmcodmFsOiBib29sZWFuKSB7XG4gICAgICAgIGlmKHRoaXMuaXNTaG93aW5nID09IHZhbCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmlzU2hvd2luZ1ZhbHVlID0gdmFsO1xuICAgICAgICBpZih0aGlzLnNob3dpbmdDaGFuZ2VkQ2FsbGJhY2spIHRoaXMuc2hvd2luZ0NoYW5nZWRDYWxsYmFjaygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaG93IHRoZSB3aW5kb3dcbiAgICAgKiBAc2VlIGhpZGVcbiAgICAgKiBAc2VlIGlzU2hvd2luZ1xuICAgICAqL1xuICAgIHB1YmxpYyBzaG93KCkgeyB0aGlzLmlzU2hvd2luZyA9IHRydWU7IH1cbiAgICAvKipcbiAgICAgKiBIaWRlIHRoZSB3aW5kb3dcbiAgICAgKiBAc2VlIHNob3dcbiAgICAgKiBAc2VlIGlzU2hvd2luZ1xuICAgICAqL1xuICAgIHB1YmxpYyBoaWRlKCkgeyB0aGlzLmlzU2hvd2luZyA9IGZhbHNlOyB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgZXhwYW5kZWQuIFNldCBpdCB0byB0cnVlIHRvIGV4cGFuZCB0aGUgd2luZG93IG9yIGZhbHNlIHRvIGNvbGxhcHNlIGl0LlxuICAgICAqIEBzZWUgZXhwYW5kXG4gICAgICogQHNlZSBjb2xsYXBzZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNFeHBhbmRlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuaXNFeHBhbmRlZFZhbHVlOyB9XG4gICAgcHVibGljIHNldCBpc0V4cGFuZGVkKHZhbDogYm9vbGVhbikge1xuICAgICAgICBpZih2YWwpIHRoaXMuZXhwYW5kKCk7XG4gICAgICAgIGVsc2UgdGhpcy5jb2xsYXBzZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgd2luZG93IGFuZCBzdXJ2ZXkgdGl0bGUuXG4gICAgICovXG4gICAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5zdXJ2ZXkudGl0bGU7IH1cbiAgICBwdWJsaWMgc2V0IHRpdGxlKHZhbHVlOiBzdHJpbmcpIHsgdGhpcy5zdXJ2ZXkudGl0bGUgPSB2YWx1ZTsgfVxuICAgIGdldCBsb2NUaXRsZSgpOiBMb2NhbGl6YWJsZVN0cmluZyB7IHJldHVybiB0aGlzLnN1cnZleS5sb2NUaXRsZTsgfVxuICAgIC8qKlxuICAgICAqIEV4cGFuZCB0aGUgd2luZG93IHRvIHNob3cgdGhlIHN1cnZleS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZXhwYW5kKCkge1xuICAgICAgICB0aGlzLmV4cGFuZGNvbGxhcHNlKHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb2xsYXBzZSB0aGUgd2luZG93IGFuZCBzaG93IHN1cnZleSB0aXRsZSBvbmx5LlxuICAgICAqL1xuICAgIHB1YmxpYyBjb2xsYXBzZSgpIHtcbiAgICAgICAgdGhpcy5leHBhbmRjb2xsYXBzZShmYWxzZSk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBjcmVhdGVTdXJ2ZXkoanNvbk9iajogYW55KTogU3VydmV5TW9kZWwge1xuICAgICAgICByZXR1cm4gbmV3IFN1cnZleU1vZGVsKGpzb25PYmopXG4gICAgfVxuICAgIHByb3RlY3RlZCBleHBhbmRjb2xsYXBzZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZih0aGlzLmlzRXhwYW5kZWRWYWx1ZSA9PSB2YWx1ZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmlzRXhwYW5kZWRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBpZih0aGlzLmV4cGFuZGVkQ2hhbmdlZENhbGxiYWNrKSB0aGlzLmV4cGFuZGVkQ2hhbmdlZENhbGxiYWNrKCk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3N1cnZleVdpbmRvdy50cyIsImltcG9ydCB7RXZlbnR9IGZyb20gXCIuL2Jhc2VcIjtcblxuZXhwb3J0IHZhciBzdXJ2ZXlUaW1lckZ1bmN0aW9ucyA9IHtcbiAgICBzZXRJbnRlcnZhbDogZnVuY3Rpb24oZnVuYzogKCkgPT4gYW55KTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jLCAxMDAwKTtcbiAgICB9LFxuICAgIGNsZWFySW50ZXJ2YWw6IGZ1bmN0aW9uKHRpbWVySWQ6IG51bWJlcikge1xuICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aW1lcklkKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUaW1lciB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2VWYWx1ZTogU3VydmV5VGltZXIgPSBudWxsO1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGluc3RhbmNlKCkge1xuICAgICAgICBpZighU3VydmV5VGltZXIuaW5zdGFuY2VWYWx1ZSkge1xuICAgICAgICAgICAgU3VydmV5VGltZXIuaW5zdGFuY2VWYWx1ZSA9IG5ldyBTdXJ2ZXlUaW1lcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdXJ2ZXlUaW1lci5pbnN0YW5jZVZhbHVlO1xuICAgIH1cbiAgICBwcml2YXRlIGxpc3RlbmVyQ291bnRlciA9IDA7XG4gICAgcHJpdmF0ZSB0aW1lcklkID0gLTE7XG4gICAgcHVibGljIG9uVGltZXI6IEV2ZW50PCgpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoKSA9PiBhbnksIGFueT4oKTtcbiAgICBwdWJsaWMgc3RhcnQoZnVuYzogKCk9PiBhbnkgPSBudWxsKSB7XG4gICAgICAgIGlmKGZ1bmMpIHtcbiAgICAgICAgICAgIHRoaXMub25UaW1lci5hZGQoZnVuYyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy50aW1lcklkIDwgMCkge1xuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy50aW1lcklkID0gc3VydmV5VGltZXJGdW5jdGlvbnMuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7c2VsZi5kb1RpbWVyKCk7fSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5saXN0ZW5lckNvdW50ZXIgKys7IFxuICAgIH1cbiAgICBwdWJsaWMgc3RvcChmdW5jOiAoKT0+IGFueT0gbnVsbCkge1xuICAgICAgICBpZihmdW5jKSB7XG4gICAgICAgICAgICB0aGlzLm9uVGltZXIucmVtb3ZlKGZ1bmMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGVuZXJDb3VudGVyIC0tO1xuICAgICAgICBpZih0aGlzLmxpc3RlbmVyQ291bnRlciA9PSAwICYmIHRoaXMudGltZXJJZCA+IC0xKSB7XG4gICAgICAgICAgICBzdXJ2ZXlUaW1lckZ1bmN0aW9ucy5jbGVhckludGVydmFsKHRoaXMudGltZXJJZCk7XG4gICAgICAgICAgICB0aGlzLnRpbWVySWQgPSAtMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgZG9UaW1lcigpIHtcbiAgICAgICAgaWYodGhpcy50aW1lcklkIDwgMCkgcmV0dXJuO1xuICAgICAgICB0aGlzLm9uVGltZXIuZmlyZSh0aGlzLCB7fSk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zdXJ2ZXl0aW1lci50cyIsIi8vIG1vZGVsXG5leHBvcnQgKiBmcm9tIFwiLi9jaHVua3MvbW9kZWxcIjtcblxuLy8gbG9jYWxpemF0aW9uXG5pbXBvcnQgJy4vY2h1bmtzL2xvY2FsaXphdGlvbic7XG5cbi8vIGhlbHBlcnNcbmV4cG9ydCAqIGZyb20gICcuL2NodW5rcy9oZWxwZXJzJztcblxuLy8gY3NzIHN0YW5kYXJkXG5leHBvcnQge2RlZmF1bHRTdGFuZGFyZENzc30gZnJvbSBcIi4uL2RlZmF1bHRDc3MvY3Nzc3RhbmRhcmRcIjtcbi8vIGNzcyBib290c3RyYXBcbmV4cG9ydCB7ZGVmYXVsdEJvb3RzdHJhcENzc30gZnJvbSBcIi4uL2RlZmF1bHRDc3MvY3NzYm9vdHN0cmFwXCI7XG4vLyBjc3MgYm9vdHN0cmFwICsgbWF0ZXJpYWxcbmV4cG9ydCB7ZGVmYXVsdEJvb3RzdHJhcE1hdGVyaWFsQ3NzfSBmcm9tIFwiLi4vZGVmYXVsdENzcy9jc3Nib290c3RyYXBtYXRlcmlhbFwiO1xuXG4vLyByZWFjdFxuZXhwb3J0IHtTdXJ2ZXl9IGZyb20gXCIuLi9yZWFjdC9yZWFjdFN1cnZleVwiO1xuZXhwb3J0IHtSZWFjdFN1cnZleU1vZGVsLCBSZWFjdFdpbmRvd01vZGVsfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RzdXJ2ZXltb2RlbFwiOyBcbmV4cG9ydCB7UmVhY3RTdXJ2ZXlNb2RlbCBhcyBNb2RlbCwgUmVhY3RXaW5kb3dNb2RlbCBhcyBXaW5kb3dNb2RlbH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0c3VydmV5bW9kZWxcIjtcbmV4cG9ydCB7U3VydmV5TmF2aWdhdGlvbkJhc2V9IGZyb20gXCIuLi9yZWFjdC9yZWFjdFN1cnZleU5hdmlnYXRpb25CYXNlXCI7XG5leHBvcnQge1N1cnZleVRpbWVyUGFuZWx9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHRpbWVycGFuZWxcIjtcbmV4cG9ydCB7U3VydmV5TmF2aWdhdGlvbn0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0U3VydmV5TmF2aWdhdGlvblwiO1xuZXhwb3J0IHtTdXJ2ZXlQYWdlLCBTdXJ2ZXlSb3d9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHBhZ2VcIjtcbmV4cG9ydCB7U3VydmV5UXVlc3Rpb24sIFN1cnZleVF1ZXN0aW9uRXJyb3JzfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvblwiO1xuZXhwb3J0IHtTdXJ2ZXlFbGVtZW50QmFzZSwgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZX0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5leHBvcnQge1N1cnZleVF1ZXN0aW9uQ29tbWVudEl0ZW0sIFN1cnZleVF1ZXN0aW9uQ29tbWVudH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25jb21tZW50XCI7XG5leHBvcnQge1N1cnZleVF1ZXN0aW9uQ2hlY2tib3gsIFN1cnZleVF1ZXN0aW9uQ2hlY2tib3hJdGVtfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvbmNoZWNrYm94XCI7XG5leHBvcnQge1N1cnZleVF1ZXN0aW9uRHJvcGRvd259IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uZHJvcGRvd25cIjtcbmV4cG9ydCB7U3VydmV5UXVlc3Rpb25NYXRyaXhEcm9wZG93biwgU3VydmV5UXVlc3Rpb25NYXRyaXhEcm9wZG93blJvd30gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25tYXRyaXhkcm9wZG93blwiO1xuZXhwb3J0IHtTdXJ2ZXlRdWVzdGlvbk1hdHJpeCwgU3VydmV5UXVlc3Rpb25NYXRyaXhSb3d9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9ubWF0cml4XCI7XG5leHBvcnQge1N1cnZleVF1ZXN0aW9uSHRtbH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25odG1sXCI7XG5leHBvcnQge1N1cnZleVF1ZXN0aW9uRmlsZX0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25maWxlXCI7XG5leHBvcnQge1N1cnZleVF1ZXN0aW9uTXVsdGlwbGVUZXh0LCBTdXJ2ZXlRdWVzdGlvbk11bHRpcGxlVGV4dEl0ZW19IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9ubXVsdGlwbGV0ZXh0XCI7XG5leHBvcnQge1N1cnZleVF1ZXN0aW9uUmFkaW9ncm91cH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25yYWRpb2dyb3VwXCI7XG5leHBvcnQge1N1cnZleVF1ZXN0aW9uVGV4dH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb250ZXh0XCI7XG5leHBvcnQge1N1cnZleVF1ZXN0aW9uQm9vbGVhbn0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25ib29sZWFuXCI7XG5leHBvcnQge1N1cnZleVF1ZXN0aW9uRW1wdHl9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uZW1wdHlcIjtcbmV4cG9ydCB7U3VydmV5UXVlc3Rpb25NYXRyaXhEeW5hbWljLCBTdXJ2ZXlRdWVzdGlvbk1hdHJpeER5bmFtaWNSb3d9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9ubWF0cml4ZHluYW1pY1wiO1xuZXhwb3J0IHtTdXJ2ZXlRdWVzdGlvblBhbmVsRHluYW1pY30gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25wYW5lbGR5bmFtaWNcIjtcbmV4cG9ydCB7U3VydmV5UHJvZ3Jlc3N9IGZyb20gXCIuLi9yZWFjdC9yZWFjdFN1cnZleVByb2dyZXNzXCI7XG5leHBvcnQge1N1cnZleVF1ZXN0aW9uUmF0aW5nfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvbnJhdGluZ1wiO1xuZXhwb3J0IHtTdXJ2ZXlRdWVzdGlvbkV4cHJlc3Npb259IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uZXhwcmVzc2lvblwiO1xuZXhwb3J0IHtTdXJ2ZXlXaW5kb3d9IGZyb20gXCIuLi9yZWFjdC9yZWFjdFN1cnZleVdpbmRvd1wiO1xuZXhwb3J0IHtSZWFjdFF1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5cbi8vVW5jb21tZW50IHRvIGluY2x1ZGUgdGhlIFwiZGF0ZVwiIHF1ZXN0aW9uIHR5cGUuXG4vL2V4cG9ydCB7ZGVmYXVsdCBhcyBTdXJ2ZXlRdWVzdGlvbkRhdGV9IGZyb20gXCIuLi9wbHVnaW5zL3JlYWN0L3JlYWN0cXVlc3Rpb25kYXRlXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZW50cmllcy9yZWFjdC50cyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV80NF9fO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcInJvb3RcIjpcImpRdWVyeVwiLFwiY29tbW9uanMyXCI6XCJqcXVlcnlcIixcImNvbW1vbmpzXCI6XCJqcXVlcnlcIixcImFtZFwiOlwianF1ZXJ5XCJ9XG4vLyBtb2R1bGUgaWQgPSA0NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyByZW1vdmVkIGJ5IGV4dHJhY3QtdGV4dC13ZWJwYWNrLXBsdWdpblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL21haW4uc2Nzc1xuLy8gbW9kdWxlIGlkID0gNDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiIWZ1bmN0aW9uKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgICdvYmplY3QnID09IHR5cGVvZiBleHBvcnRzICYmICd1bmRlZmluZWQnICE9IHR5cGVvZiBtb2R1bGUgPyBmYWN0b3J5KGV4cG9ydHMpIDogJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGVmaW5lICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWyAnZXhwb3J0cycgXSwgZmFjdG9yeSkgOiBmYWN0b3J5KGdsb2JhbC5wcmVhY3QgPSBnbG9iYWwucHJlYWN0IHx8IHt9KTtcbn0odGhpcywgZnVuY3Rpb24oZXhwb3J0cykge1xuICAgIGZ1bmN0aW9uIFZOb2RlKG5vZGVOYW1lLCBhdHRyaWJ1dGVzLCBjaGlsZHJlbikge1xuICAgICAgICB0aGlzLm5vZGVOYW1lID0gbm9kZU5hbWU7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy5rZXkgPSBhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXMua2V5O1xuICAgIH1cbiAgICBmdW5jdGlvbiBoKG5vZGVOYW1lLCBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHZhciBjaGlsZHJlbiwgbGFzdFNpbXBsZSwgY2hpbGQsIHNpbXBsZSwgaTtcbiAgICAgICAgZm9yIChpID0gYXJndW1lbnRzLmxlbmd0aDsgaS0tID4gMjsgKSBzdGFjay5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgICAgIGlmIChhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSBzdGFjay5wdXNoKGF0dHJpYnV0ZXMuY2hpbGRyZW4pO1xuICAgICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMuY2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkgaWYgKChjaGlsZCA9IHN0YWNrLnBvcCgpKSBpbnN0YW5jZW9mIEFycmF5KSBmb3IgKGkgPSBjaGlsZC5sZW5ndGg7IGktLTsgKSBzdGFjay5wdXNoKGNoaWxkW2ldKTsgZWxzZSBpZiAobnVsbCAhPSBjaGlsZCAmJiBjaGlsZCAhPT0gITAgJiYgY2hpbGQgIT09ICExKSB7XG4gICAgICAgICAgICBpZiAoJ251bWJlcicgPT0gdHlwZW9mIGNoaWxkKSBjaGlsZCA9IFN0cmluZyhjaGlsZCk7XG4gICAgICAgICAgICBzaW1wbGUgPSAnc3RyaW5nJyA9PSB0eXBlb2YgY2hpbGQ7XG4gICAgICAgICAgICBpZiAoc2ltcGxlICYmIGxhc3RTaW1wbGUpIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdICs9IGNoaWxkOyBlbHNlIHtcbiAgICAgICAgICAgICAgICAoY2hpbGRyZW4gfHwgKGNoaWxkcmVuID0gW10pKS5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgICAgICBsYXN0U2ltcGxlID0gc2ltcGxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBwID0gbmV3IFZOb2RlKG5vZGVOYW1lLCBhdHRyaWJ1dGVzIHx8IHZvaWQgMCwgY2hpbGRyZW4gfHwgRU1QVFlfQ0hJTERSRU4pO1xuICAgICAgICBpZiAob3B0aW9ucy52bm9kZSkgb3B0aW9ucy52bm9kZShwKTtcbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGV4dGVuZChvYmosIHByb3BzKSB7XG4gICAgICAgIGlmIChwcm9wcykgZm9yICh2YXIgaSBpbiBwcm9wcykgb2JqW2ldID0gcHJvcHNbaV07XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNsb25lKG9iaikge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBvYmopO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWx2ZShvYmosIGtleSkge1xuICAgICAgICBmb3IgKHZhciBwID0ga2V5LnNwbGl0KCcuJyksIGkgPSAwOyBpIDwgcC5sZW5ndGggJiYgb2JqOyBpKyspIG9iaiA9IG9ialtwW2ldXTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbihvYmopIHtcbiAgICAgICAgcmV0dXJuICdmdW5jdGlvbicgPT0gdHlwZW9mIG9iajtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNTdHJpbmcob2JqKSB7XG4gICAgICAgIHJldHVybiAnc3RyaW5nJyA9PSB0eXBlb2Ygb2JqO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoYXNoVG9DbGFzc05hbWUoYykge1xuICAgICAgICB2YXIgc3RyID0gJyc7XG4gICAgICAgIGZvciAodmFyIHByb3AgaW4gYykgaWYgKGNbcHJvcF0pIHtcbiAgICAgICAgICAgIGlmIChzdHIpIHN0ciArPSAnICc7XG4gICAgICAgICAgICBzdHIgKz0gcHJvcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjbG9uZUVsZW1lbnQodm5vZGUsIHByb3BzKSB7XG4gICAgICAgIHJldHVybiBoKHZub2RlLm5vZGVOYW1lLCBleHRlbmQoY2xvbmUodm5vZGUuYXR0cmlidXRlcyksIHByb3BzKSwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMikgOiB2bm9kZS5jaGlsZHJlbik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZUxpbmtlZFN0YXRlKGNvbXBvbmVudCwga2V5LCBldmVudFBhdGgpIHtcbiAgICAgICAgdmFyIHBhdGggPSBrZXkuc3BsaXQoJy4nKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciB0ID0gZSAmJiBlLnRhcmdldCB8fCB0aGlzLCBzdGF0ZSA9IHt9LCBvYmogPSBzdGF0ZSwgdiA9IGlzU3RyaW5nKGV2ZW50UGF0aCkgPyBkZWx2ZShlLCBldmVudFBhdGgpIDogdC5ub2RlTmFtZSA/IHQudHlwZS5tYXRjaCgvXmNoZXxyYWQvKSA/IHQuY2hlY2tlZCA6IHQudmFsdWUgOiBlLCBpID0gMDtcbiAgICAgICAgICAgIGZvciAoO2kgPCBwYXRoLmxlbmd0aCAtIDE7IGkrKykgb2JqID0gb2JqW3BhdGhbaV1dIHx8IChvYmpbcGF0aFtpXV0gPSAhaSAmJiBjb21wb25lbnQuc3RhdGVbcGF0aFtpXV0gfHwge30pO1xuICAgICAgICAgICAgb2JqW3BhdGhbaV1dID0gdjtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zZXRTdGF0ZShzdGF0ZSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVucXVldWVSZW5kZXIoY29tcG9uZW50KSB7XG4gICAgICAgIGlmICghY29tcG9uZW50Ll9kaXJ0eSAmJiAoY29tcG9uZW50Ll9kaXJ0eSA9ICEwKSAmJiAxID09IGl0ZW1zLnB1c2goY29tcG9uZW50KSkgKG9wdGlvbnMuZGVib3VuY2VSZW5kZXJpbmcgfHwgZGVmZXIpKHJlcmVuZGVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVyZW5kZXIoKSB7XG4gICAgICAgIHZhciBwLCBsaXN0ID0gaXRlbXM7XG4gICAgICAgIGl0ZW1zID0gW107XG4gICAgICAgIHdoaWxlIChwID0gbGlzdC5wb3AoKSkgaWYgKHAuX2RpcnR5KSByZW5kZXJDb21wb25lbnQocCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb25hbENvbXBvbmVudCh2bm9kZSkge1xuICAgICAgICB2YXIgbm9kZU5hbWUgPSB2bm9kZSAmJiB2bm9kZS5ub2RlTmFtZTtcbiAgICAgICAgcmV0dXJuIG5vZGVOYW1lICYmIGlzRnVuY3Rpb24obm9kZU5hbWUpICYmICEobm9kZU5hbWUucHJvdG90eXBlICYmIG5vZGVOYW1lLnByb3RvdHlwZS5yZW5kZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBidWlsZEZ1bmN0aW9uYWxDb21wb25lbnQodm5vZGUsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHZub2RlLm5vZGVOYW1lKGdldE5vZGVQcm9wcyh2bm9kZSksIGNvbnRleHQgfHwgRU1QVFkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc1NhbWVOb2RlVHlwZShub2RlLCB2bm9kZSkge1xuICAgICAgICBpZiAoaXNTdHJpbmcodm5vZGUpKSByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIFRleHQ7XG4gICAgICAgIGlmIChpc1N0cmluZyh2bm9kZS5ub2RlTmFtZSkpIHJldHVybiAhbm9kZS5fY29tcG9uZW50Q29uc3RydWN0b3IgJiYgaXNOYW1lZE5vZGUobm9kZSwgdm5vZGUubm9kZU5hbWUpO1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih2bm9kZS5ub2RlTmFtZSkpIHJldHVybiAobm9kZS5fY29tcG9uZW50Q29uc3RydWN0b3IgPyBub2RlLl9jb21wb25lbnRDb25zdHJ1Y3RvciA9PT0gdm5vZGUubm9kZU5hbWUgOiAhMCkgfHwgaXNGdW5jdGlvbmFsQ29tcG9uZW50KHZub2RlKTsgZWxzZSA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzTmFtZWROb2RlKG5vZGUsIG5vZGVOYW1lKSB7XG4gICAgICAgIHJldHVybiBub2RlLm5vcm1hbGl6ZWROb2RlTmFtZSA9PT0gbm9kZU5hbWUgfHwgdG9Mb3dlckNhc2Uobm9kZS5ub2RlTmFtZSkgPT09IHRvTG93ZXJDYXNlKG5vZGVOYW1lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Tm9kZVByb3BzKHZub2RlKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IGNsb25lKHZub2RlLmF0dHJpYnV0ZXMpO1xuICAgICAgICBwcm9wcy5jaGlsZHJlbiA9IHZub2RlLmNoaWxkcmVuO1xuICAgICAgICB2YXIgZGVmYXVsdFByb3BzID0gdm5vZGUubm9kZU5hbWUuZGVmYXVsdFByb3BzO1xuICAgICAgICBpZiAoZGVmYXVsdFByb3BzKSBmb3IgKHZhciBpIGluIGRlZmF1bHRQcm9wcykgaWYgKHZvaWQgMCA9PT0gcHJvcHNbaV0pIHByb3BzW2ldID0gZGVmYXVsdFByb3BzW2ldO1xuICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbW92ZU5vZGUobm9kZSkge1xuICAgICAgICB2YXIgcCA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgaWYgKHApIHAucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldEFjY2Vzc29yKG5vZGUsIG5hbWUsIG9sZCwgdmFsdWUsIGlzU3ZnKSB7XG4gICAgICAgIGlmICgnY2xhc3NOYW1lJyA9PT0gbmFtZSkgbmFtZSA9ICdjbGFzcyc7XG4gICAgICAgIGlmICgnY2xhc3MnID09PSBuYW1lICYmIHZhbHVlICYmICdvYmplY3QnID09IHR5cGVvZiB2YWx1ZSkgdmFsdWUgPSBoYXNoVG9DbGFzc05hbWUodmFsdWUpO1xuICAgICAgICBpZiAoJ2tleScgPT09IG5hbWUpIDsgZWxzZSBpZiAoJ2NsYXNzJyA9PT0gbmFtZSAmJiAhaXNTdmcpIG5vZGUuY2xhc3NOYW1lID0gdmFsdWUgfHwgJyc7IGVsc2UgaWYgKCdzdHlsZScgPT09IG5hbWUpIHtcbiAgICAgICAgICAgIGlmICghdmFsdWUgfHwgaXNTdHJpbmcodmFsdWUpIHx8IGlzU3RyaW5nKG9sZCkpIG5vZGUuc3R5bGUuY3NzVGV4dCA9IHZhbHVlIHx8ICcnO1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmICdvYmplY3QnID09IHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNTdHJpbmcob2xkKSkgZm9yICh2YXIgaSBpbiBvbGQpIGlmICghKGkgaW4gdmFsdWUpKSBub2RlLnN0eWxlW2ldID0gJyc7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB2YWx1ZSkgbm9kZS5zdHlsZVtpXSA9ICdudW1iZXInID09IHR5cGVvZiB2YWx1ZVtpXSAmJiAhTk9OX0RJTUVOU0lPTl9QUk9QU1tpXSA/IHZhbHVlW2ldICsgJ3B4JyA6IHZhbHVlW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCdkYW5nZXJvdXNseVNldElubmVySFRNTCcgPT09IG5hbWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkgbm9kZS5pbm5lckhUTUwgPSB2YWx1ZS5fX2h0bWwgfHwgJyc7XG4gICAgICAgIH0gZWxzZSBpZiAoJ28nID09IG5hbWVbMF0gJiYgJ24nID09IG5hbWVbMV0pIHtcbiAgICAgICAgICAgIHZhciBsID0gbm9kZS5fbGlzdGVuZXJzIHx8IChub2RlLl9saXN0ZW5lcnMgPSB7fSk7XG4gICAgICAgICAgICBuYW1lID0gdG9Mb3dlckNhc2UobmFtZS5zdWJzdHJpbmcoMikpO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFsW25hbWVdKSBub2RlLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZXZlbnRQcm94eSwgISFOT05fQlVCQkxJTkdfRVZFTlRTW25hbWVdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobFtuYW1lXSkgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGV2ZW50UHJveHksICEhTk9OX0JVQkJMSU5HX0VWRU5UU1tuYW1lXSk7XG4gICAgICAgICAgICBsW25hbWVdID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoJ2xpc3QnICE9PSBuYW1lICYmICd0eXBlJyAhPT0gbmFtZSAmJiAhaXNTdmcgJiYgbmFtZSBpbiBub2RlKSB7XG4gICAgICAgICAgICBzZXRQcm9wZXJ0eShub2RlLCBuYW1lLCBudWxsID09IHZhbHVlID8gJycgOiB2YWx1ZSk7XG4gICAgICAgICAgICBpZiAobnVsbCA9PSB2YWx1ZSB8fCB2YWx1ZSA9PT0gITEpIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIG5zID0gaXNTdmcgJiYgbmFtZS5tYXRjaCgvXnhsaW5rXFw6PyguKykvKTtcbiAgICAgICAgICAgIGlmIChudWxsID09IHZhbHVlIHx8IHZhbHVlID09PSAhMSkgaWYgKG5zKSBub2RlLnJlbW92ZUF0dHJpYnV0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgdG9Mb3dlckNhc2UobnNbMV0pKTsgZWxzZSBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsgZWxzZSBpZiAoJ29iamVjdCcgIT0gdHlwZW9mIHZhbHVlICYmICFpc0Z1bmN0aW9uKHZhbHVlKSkgaWYgKG5zKSBub2RlLnNldEF0dHJpYnV0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgdG9Mb3dlckNhc2UobnNbMV0pLCB2YWx1ZSk7IGVsc2Ugbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldFByb3BlcnR5KG5vZGUsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBub2RlW25hbWVdID0gdmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGV2ZW50UHJveHkoZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGlzdGVuZXJzW2UudHlwZV0ob3B0aW9ucy5ldmVudCAmJiBvcHRpb25zLmV2ZW50KGUpIHx8IGUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb2xsZWN0Tm9kZShub2RlKSB7XG4gICAgICAgIHJlbW92ZU5vZGUobm9kZSk7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICAgICAgbm9kZS5fY29tcG9uZW50ID0gbm9kZS5fY29tcG9uZW50Q29uc3RydWN0b3IgPSBudWxsO1xuICAgICAgICAgICAgdmFyIF9uYW1lID0gbm9kZS5ub3JtYWxpemVkTm9kZU5hbWUgfHwgdG9Mb3dlckNhc2Uobm9kZS5ub2RlTmFtZSk7XG4gICAgICAgICAgICAobm9kZXNbX25hbWVdIHx8IChub2Rlc1tfbmFtZV0gPSBbXSkpLnB1c2gobm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlTm9kZShub2RlTmFtZSwgaXNTdmcpIHtcbiAgICAgICAgdmFyIG5hbWUgPSB0b0xvd2VyQ2FzZShub2RlTmFtZSksIG5vZGUgPSBub2Rlc1tuYW1lXSAmJiBub2Rlc1tuYW1lXS5wb3AoKSB8fCAoaXNTdmcgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgbm9kZU5hbWUpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChub2RlTmFtZSkpO1xuICAgICAgICBub2RlLm5vcm1hbGl6ZWROb2RlTmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmbHVzaE1vdW50cygpIHtcbiAgICAgICAgdmFyIGM7XG4gICAgICAgIHdoaWxlIChjID0gbW91bnRzLnBvcCgpKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5hZnRlck1vdW50KSBvcHRpb25zLmFmdGVyTW91bnQoYyk7XG4gICAgICAgICAgICBpZiAoYy5jb21wb25lbnREaWRNb3VudCkgYy5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRpZmYoZG9tLCB2bm9kZSwgY29udGV4dCwgbW91bnRBbGwsIHBhcmVudCwgY29tcG9uZW50Um9vdCkge1xuICAgICAgICBpZiAoIWRpZmZMZXZlbCsrKSB7XG4gICAgICAgICAgICBpc1N2Z01vZGUgPSBwYXJlbnQgJiYgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIHBhcmVudC5vd25lclNWR0VsZW1lbnQ7XG4gICAgICAgICAgICBoeWRyYXRpbmcgPSBkb20gJiYgIShBVFRSX0tFWSBpbiBkb20pO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXQgPSBpZGlmZihkb20sIHZub2RlLCBjb250ZXh0LCBtb3VudEFsbCk7XG4gICAgICAgIGlmIChwYXJlbnQgJiYgcmV0LnBhcmVudE5vZGUgIT09IHBhcmVudCkgcGFyZW50LmFwcGVuZENoaWxkKHJldCk7XG4gICAgICAgIGlmICghLS1kaWZmTGV2ZWwpIHtcbiAgICAgICAgICAgIGh5ZHJhdGluZyA9ICExO1xuICAgICAgICAgICAgaWYgKCFjb21wb25lbnRSb290KSBmbHVzaE1vdW50cygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlkaWZmKGRvbSwgdm5vZGUsIGNvbnRleHQsIG1vdW50QWxsKSB7XG4gICAgICAgIHZhciByZWYgPSB2bm9kZSAmJiB2bm9kZS5hdHRyaWJ1dGVzICYmIHZub2RlLmF0dHJpYnV0ZXMucmVmO1xuICAgICAgICB3aGlsZSAoaXNGdW5jdGlvbmFsQ29tcG9uZW50KHZub2RlKSkgdm5vZGUgPSBidWlsZEZ1bmN0aW9uYWxDb21wb25lbnQodm5vZGUsIGNvbnRleHQpO1xuICAgICAgICBpZiAobnVsbCA9PSB2bm9kZSkgdm5vZGUgPSAnJztcbiAgICAgICAgaWYgKGlzU3RyaW5nKHZub2RlKSkge1xuICAgICAgICAgICAgaWYgKGRvbSAmJiBkb20gaW5zdGFuY2VvZiBUZXh0ICYmIGRvbS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRvbS5ub2RlVmFsdWUgIT0gdm5vZGUpIGRvbS5ub2RlVmFsdWUgPSB2bm9kZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGRvbSkgcmVjb2xsZWN0Tm9kZVRyZWUoZG9tKTtcbiAgICAgICAgICAgICAgICBkb20gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2bm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZG9tO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHZub2RlLm5vZGVOYW1lKSkgcmV0dXJuIGJ1aWxkQ29tcG9uZW50RnJvbVZOb2RlKGRvbSwgdm5vZGUsIGNvbnRleHQsIG1vdW50QWxsKTtcbiAgICAgICAgdmFyIG91dCA9IGRvbSwgbm9kZU5hbWUgPSBTdHJpbmcodm5vZGUubm9kZU5hbWUpLCBwcmV2U3ZnTW9kZSA9IGlzU3ZnTW9kZSwgdmNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47XG4gICAgICAgIGlzU3ZnTW9kZSA9ICdzdmcnID09PSBub2RlTmFtZSA/ICEwIDogJ2ZvcmVpZ25PYmplY3QnID09PSBub2RlTmFtZSA/ICExIDogaXNTdmdNb2RlO1xuICAgICAgICBpZiAoIWRvbSkgb3V0ID0gY3JlYXRlTm9kZShub2RlTmFtZSwgaXNTdmdNb2RlKTsgZWxzZSBpZiAoIWlzTmFtZWROb2RlKGRvbSwgbm9kZU5hbWUpKSB7XG4gICAgICAgICAgICBvdXQgPSBjcmVhdGVOb2RlKG5vZGVOYW1lLCBpc1N2Z01vZGUpO1xuICAgICAgICAgICAgd2hpbGUgKGRvbS5maXJzdENoaWxkKSBvdXQuYXBwZW5kQ2hpbGQoZG9tLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgaWYgKGRvbS5wYXJlbnROb2RlKSBkb20ucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQob3V0LCBkb20pO1xuICAgICAgICAgICAgcmVjb2xsZWN0Tm9kZVRyZWUoZG9tKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZmMgPSBvdXQuZmlyc3RDaGlsZCwgcHJvcHMgPSBvdXRbQVRUUl9LRVldO1xuICAgICAgICBpZiAoIXByb3BzKSB7XG4gICAgICAgICAgICBvdXRbQVRUUl9LRVldID0gcHJvcHMgPSB7fTtcbiAgICAgICAgICAgIGZvciAodmFyIGEgPSBvdXQuYXR0cmlidXRlcywgaSA9IGEubGVuZ3RoOyBpLS07ICkgcHJvcHNbYVtpXS5uYW1lXSA9IGFbaV0udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFoeWRyYXRpbmcgJiYgdmNoaWxkcmVuICYmIDEgPT09IHZjaGlsZHJlbi5sZW5ndGggJiYgJ3N0cmluZycgPT0gdHlwZW9mIHZjaGlsZHJlblswXSAmJiBmYyAmJiBmYyBpbnN0YW5jZW9mIFRleHQgJiYgIWZjLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICBpZiAoZmMubm9kZVZhbHVlICE9IHZjaGlsZHJlblswXSkgZmMubm9kZVZhbHVlID0gdmNoaWxkcmVuWzBdO1xuICAgICAgICB9IGVsc2UgaWYgKHZjaGlsZHJlbiAmJiB2Y2hpbGRyZW4ubGVuZ3RoIHx8IGZjKSBpbm5lckRpZmZOb2RlKG91dCwgdmNoaWxkcmVuLCBjb250ZXh0LCBtb3VudEFsbCwgISFwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCk7XG4gICAgICAgIGRpZmZBdHRyaWJ1dGVzKG91dCwgdm5vZGUuYXR0cmlidXRlcywgcHJvcHMpO1xuICAgICAgICBpZiAocmVmKSAocHJvcHMucmVmID0gcmVmKShvdXQpO1xuICAgICAgICBpc1N2Z01vZGUgPSBwcmV2U3ZnTW9kZTtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW5uZXJEaWZmTm9kZShkb20sIHZjaGlsZHJlbiwgY29udGV4dCwgbW91bnRBbGwsIGFic29yYikge1xuICAgICAgICB2YXIgaiwgYywgdmNoaWxkLCBjaGlsZCwgb3JpZ2luYWxDaGlsZHJlbiA9IGRvbS5jaGlsZE5vZGVzLCBjaGlsZHJlbiA9IFtdLCBrZXllZCA9IHt9LCBrZXllZExlbiA9IDAsIG1pbiA9IDAsIGxlbiA9IG9yaWdpbmFsQ2hpbGRyZW4ubGVuZ3RoLCBjaGlsZHJlbkxlbiA9IDAsIHZsZW4gPSB2Y2hpbGRyZW4gJiYgdmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbikgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIF9jaGlsZCA9IG9yaWdpbmFsQ2hpbGRyZW5baV0sIHByb3BzID0gX2NoaWxkW0FUVFJfS0VZXSwga2V5ID0gdmxlbiA/IChjID0gX2NoaWxkLl9jb21wb25lbnQpID8gYy5fX2tleSA6IHByb3BzID8gcHJvcHMua2V5IDogbnVsbCA6IG51bGw7XG4gICAgICAgICAgICBpZiAobnVsbCAhPSBrZXkpIHtcbiAgICAgICAgICAgICAgICBrZXllZExlbisrO1xuICAgICAgICAgICAgICAgIGtleWVkW2tleV0gPSBfY2hpbGQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGh5ZHJhdGluZyB8fCBhYnNvcmIgfHwgcHJvcHMgfHwgX2NoaWxkIGluc3RhbmNlb2YgVGV4dCkgY2hpbGRyZW5bY2hpbGRyZW5MZW4rK10gPSBfY2hpbGQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZsZW4pIGZvciAodmFyIGkgPSAwOyBpIDwgdmxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2Y2hpbGQgPSB2Y2hpbGRyZW5baV07XG4gICAgICAgICAgICBjaGlsZCA9IG51bGw7XG4gICAgICAgICAgICB2YXIga2V5ID0gdmNoaWxkLmtleTtcbiAgICAgICAgICAgIGlmIChudWxsICE9IGtleSkge1xuICAgICAgICAgICAgICAgIGlmIChrZXllZExlbiAmJiBrZXkgaW4ga2V5ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBrZXllZFtrZXldO1xuICAgICAgICAgICAgICAgICAgICBrZXllZFtrZXldID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICBrZXllZExlbi0tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNoaWxkICYmIG1pbiA8IGNoaWxkcmVuTGVuKSBmb3IgKGogPSBtaW47IGogPCBjaGlsZHJlbkxlbjsgaisrKSB7XG4gICAgICAgICAgICAgICAgYyA9IGNoaWxkcmVuW2pdO1xuICAgICAgICAgICAgICAgIGlmIChjICYmIGlzU2FtZU5vZGVUeXBlKGMsIHZjaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBjO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbltqXSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPT09IGNoaWxkcmVuTGVuIC0gMSkgY2hpbGRyZW5MZW4tLTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPT09IG1pbikgbWluKys7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoaWxkID0gaWRpZmYoY2hpbGQsIHZjaGlsZCwgY29udGV4dCwgbW91bnRBbGwpO1xuICAgICAgICAgICAgaWYgKGNoaWxkICYmIGNoaWxkICE9PSBkb20pIGlmIChpID49IGxlbikgZG9tLmFwcGVuZENoaWxkKGNoaWxkKTsgZWxzZSBpZiAoY2hpbGQgIT09IG9yaWdpbmFsQ2hpbGRyZW5baV0pIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQgPT09IG9yaWdpbmFsQ2hpbGRyZW5baSArIDFdKSByZW1vdmVOb2RlKG9yaWdpbmFsQ2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgIGRvbS5pbnNlcnRCZWZvcmUoY2hpbGQsIG9yaWdpbmFsQ2hpbGRyZW5baV0gfHwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleWVkTGVuKSBmb3IgKHZhciBpIGluIGtleWVkKSBpZiAoa2V5ZWRbaV0pIHJlY29sbGVjdE5vZGVUcmVlKGtleWVkW2ldKTtcbiAgICAgICAgd2hpbGUgKG1pbiA8PSBjaGlsZHJlbkxlbikge1xuICAgICAgICAgICAgY2hpbGQgPSBjaGlsZHJlbltjaGlsZHJlbkxlbi0tXTtcbiAgICAgICAgICAgIGlmIChjaGlsZCkgcmVjb2xsZWN0Tm9kZVRyZWUoY2hpbGQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY29sbGVjdE5vZGVUcmVlKG5vZGUsIHVubW91bnRPbmx5KSB7XG4gICAgICAgIHZhciBjb21wb25lbnQgPSBub2RlLl9jb21wb25lbnQ7XG4gICAgICAgIGlmIChjb21wb25lbnQpIHVubW91bnRDb21wb25lbnQoY29tcG9uZW50LCAhdW5tb3VudE9ubHkpOyBlbHNlIHtcbiAgICAgICAgICAgIGlmIChub2RlW0FUVFJfS0VZXSAmJiBub2RlW0FUVFJfS0VZXS5yZWYpIG5vZGVbQVRUUl9LRVldLnJlZihudWxsKTtcbiAgICAgICAgICAgIGlmICghdW5tb3VudE9ubHkpIGNvbGxlY3ROb2RlKG5vZGUpO1xuICAgICAgICAgICAgdmFyIGM7XG4gICAgICAgICAgICB3aGlsZSAoYyA9IG5vZGUubGFzdENoaWxkKSByZWNvbGxlY3ROb2RlVHJlZShjLCB1bm1vdW50T25seSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZGlmZkF0dHJpYnV0ZXMoZG9tLCBhdHRycywgb2xkKSB7XG4gICAgICAgIHZhciBuYW1lO1xuICAgICAgICBmb3IgKG5hbWUgaW4gb2xkKSBpZiAoIShhdHRycyAmJiBuYW1lIGluIGF0dHJzKSAmJiBudWxsICE9IG9sZFtuYW1lXSkgc2V0QWNjZXNzb3IoZG9tLCBuYW1lLCBvbGRbbmFtZV0sIG9sZFtuYW1lXSA9IHZvaWQgMCwgaXNTdmdNb2RlKTtcbiAgICAgICAgaWYgKGF0dHJzKSBmb3IgKG5hbWUgaW4gYXR0cnMpIGlmICghKCdjaGlsZHJlbicgPT09IG5hbWUgfHwgJ2lubmVySFRNTCcgPT09IG5hbWUgfHwgbmFtZSBpbiBvbGQgJiYgYXR0cnNbbmFtZV0gPT09ICgndmFsdWUnID09PSBuYW1lIHx8ICdjaGVja2VkJyA9PT0gbmFtZSA/IGRvbVtuYW1lXSA6IG9sZFtuYW1lXSkpKSBzZXRBY2Nlc3Nvcihkb20sIG5hbWUsIG9sZFtuYW1lXSwgb2xkW25hbWVdID0gYXR0cnNbbmFtZV0sIGlzU3ZnTW9kZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbGxlY3RDb21wb25lbnQoY29tcG9uZW50KSB7XG4gICAgICAgIHZhciBuYW1lID0gY29tcG9uZW50LmNvbnN0cnVjdG9yLm5hbWUsIGxpc3QgPSBjb21wb25lbnRzW25hbWVdO1xuICAgICAgICBpZiAobGlzdCkgbGlzdC5wdXNoKGNvbXBvbmVudCk7IGVsc2UgY29tcG9uZW50c1tuYW1lXSA9IFsgY29tcG9uZW50IF07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudChDdG9yLCBwcm9wcywgY29udGV4dCkge1xuICAgICAgICB2YXIgaW5zdCA9IG5ldyBDdG9yKHByb3BzLCBjb250ZXh0KSwgbGlzdCA9IGNvbXBvbmVudHNbQ3Rvci5uYW1lXTtcbiAgICAgICAgQ29tcG9uZW50LmNhbGwoaW5zdCwgcHJvcHMsIGNvbnRleHQpO1xuICAgICAgICBpZiAobGlzdCkgZm9yICh2YXIgaSA9IGxpc3QubGVuZ3RoOyBpLS07ICkgaWYgKGxpc3RbaV0uY29uc3RydWN0b3IgPT09IEN0b3IpIHtcbiAgICAgICAgICAgIGluc3QubmV4dEJhc2UgPSBsaXN0W2ldLm5leHRCYXNlO1xuICAgICAgICAgICAgbGlzdC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5zdDtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0Q29tcG9uZW50UHJvcHMoY29tcG9uZW50LCBwcm9wcywgb3B0cywgY29udGV4dCwgbW91bnRBbGwpIHtcbiAgICAgICAgaWYgKCFjb21wb25lbnQuX2Rpc2FibGUpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5fZGlzYWJsZSA9ICEwO1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5fX3JlZiA9IHByb3BzLnJlZikgZGVsZXRlIHByb3BzLnJlZjtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuX19rZXkgPSBwcm9wcy5rZXkpIGRlbGV0ZSBwcm9wcy5rZXk7XG4gICAgICAgICAgICBpZiAoIWNvbXBvbmVudC5iYXNlIHx8IG1vdW50QWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5jb21wb25lbnRXaWxsTW91bnQpIGNvbXBvbmVudC5jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMpIGNvbXBvbmVudC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHByb3BzLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQgIT09IGNvbXBvbmVudC5jb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb21wb25lbnQucHJldkNvbnRleHQpIGNvbXBvbmVudC5wcmV2Q29udGV4dCA9IGNvbXBvbmVudC5jb250ZXh0O1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY29tcG9uZW50LnByZXZQcm9wcykgY29tcG9uZW50LnByZXZQcm9wcyA9IGNvbXBvbmVudC5wcm9wcztcbiAgICAgICAgICAgIGNvbXBvbmVudC5wcm9wcyA9IHByb3BzO1xuICAgICAgICAgICAgY29tcG9uZW50Ll9kaXNhYmxlID0gITE7XG4gICAgICAgICAgICBpZiAoMCAhPT0gb3B0cykgaWYgKDEgPT09IG9wdHMgfHwgb3B0aW9ucy5zeW5jQ29tcG9uZW50VXBkYXRlcyAhPT0gITEgfHwgIWNvbXBvbmVudC5iYXNlKSByZW5kZXJDb21wb25lbnQoY29tcG9uZW50LCAxLCBtb3VudEFsbCk7IGVsc2UgZW5xdWV1ZVJlbmRlcihjb21wb25lbnQpO1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5fX3JlZikgY29tcG9uZW50Ll9fcmVmKGNvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVuZGVyQ29tcG9uZW50KGNvbXBvbmVudCwgb3B0cywgbW91bnRBbGwsIGlzQ2hpbGQpIHtcbiAgICAgICAgaWYgKCFjb21wb25lbnQuX2Rpc2FibGUpIHtcbiAgICAgICAgICAgIHZhciBza2lwLCByZW5kZXJlZCwgaW5zdCwgY2Jhc2UsIHByb3BzID0gY29tcG9uZW50LnByb3BzLCBzdGF0ZSA9IGNvbXBvbmVudC5zdGF0ZSwgY29udGV4dCA9IGNvbXBvbmVudC5jb250ZXh0LCBwcmV2aW91c1Byb3BzID0gY29tcG9uZW50LnByZXZQcm9wcyB8fCBwcm9wcywgcHJldmlvdXNTdGF0ZSA9IGNvbXBvbmVudC5wcmV2U3RhdGUgfHwgc3RhdGUsIHByZXZpb3VzQ29udGV4dCA9IGNvbXBvbmVudC5wcmV2Q29udGV4dCB8fCBjb250ZXh0LCBpc1VwZGF0ZSA9IGNvbXBvbmVudC5iYXNlLCBuZXh0QmFzZSA9IGNvbXBvbmVudC5uZXh0QmFzZSwgaW5pdGlhbEJhc2UgPSBpc1VwZGF0ZSB8fCBuZXh0QmFzZSwgaW5pdGlhbENoaWxkQ29tcG9uZW50ID0gY29tcG9uZW50Ll9jb21wb25lbnQ7XG4gICAgICAgICAgICBpZiAoaXNVcGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQucHJvcHMgPSBwcmV2aW91c1Byb3BzO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zdGF0ZSA9IHByZXZpb3VzU3RhdGU7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmNvbnRleHQgPSBwcmV2aW91c0NvbnRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKDIgIT09IG9wdHMgJiYgY29tcG9uZW50LnNob3VsZENvbXBvbmVudFVwZGF0ZSAmJiBjb21wb25lbnQuc2hvdWxkQ29tcG9uZW50VXBkYXRlKHByb3BzLCBzdGF0ZSwgY29udGV4dCkgPT09ICExKSBza2lwID0gITA7IGVsc2UgaWYgKGNvbXBvbmVudC5jb21wb25lbnRXaWxsVXBkYXRlKSBjb21wb25lbnQuY29tcG9uZW50V2lsbFVwZGF0ZShwcm9wcywgc3RhdGUsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5wcm9wcyA9IHByb3BzO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvbmVudC5wcmV2UHJvcHMgPSBjb21wb25lbnQucHJldlN0YXRlID0gY29tcG9uZW50LnByZXZDb250ZXh0ID0gY29tcG9uZW50Lm5leHRCYXNlID0gbnVsbDtcbiAgICAgICAgICAgIGNvbXBvbmVudC5fZGlydHkgPSAhMTtcbiAgICAgICAgICAgIGlmICghc2tpcCkge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQucmVuZGVyKSByZW5kZXJlZCA9IGNvbXBvbmVudC5yZW5kZXIocHJvcHMsIHN0YXRlLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmdldENoaWxkQ29udGV4dCkgY29udGV4dCA9IGV4dGVuZChjbG9uZShjb250ZXh0KSwgY29tcG9uZW50LmdldENoaWxkQ29udGV4dCgpKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoaXNGdW5jdGlvbmFsQ29tcG9uZW50KHJlbmRlcmVkKSkgcmVuZGVyZWQgPSBidWlsZEZ1bmN0aW9uYWxDb21wb25lbnQocmVuZGVyZWQsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHZhciB0b1VubW91bnQsIGJhc2UsIGNoaWxkQ29tcG9uZW50ID0gcmVuZGVyZWQgJiYgcmVuZGVyZWQubm9kZU5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oY2hpbGRDb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZFByb3BzID0gZ2V0Tm9kZVByb3BzKHJlbmRlcmVkKTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdCA9IGluaXRpYWxDaGlsZENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3QgJiYgaW5zdC5jb25zdHJ1Y3RvciA9PT0gY2hpbGRDb21wb25lbnQgJiYgY2hpbGRQcm9wcy5rZXkgPT0gaW5zdC5fX2tleSkgc2V0Q29tcG9uZW50UHJvcHMoaW5zdCwgY2hpbGRQcm9wcywgMSwgY29udGV4dCk7IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9Vbm1vdW50ID0gaW5zdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3QgPSBjcmVhdGVDb21wb25lbnQoY2hpbGRDb21wb25lbnQsIGNoaWxkUHJvcHMsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdC5uZXh0QmFzZSA9IGluc3QubmV4dEJhc2UgfHwgbmV4dEJhc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0Ll9wYXJlbnRDb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuX2NvbXBvbmVudCA9IGluc3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDb21wb25lbnRQcm9wcyhpbnN0LCBjaGlsZFByb3BzLCAwLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlckNvbXBvbmVudChpbnN0LCAxLCBtb3VudEFsbCwgITApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJhc2UgPSBpbnN0LmJhc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2Jhc2UgPSBpbml0aWFsQmFzZTtcbiAgICAgICAgICAgICAgICAgICAgdG9Vbm1vdW50ID0gaW5pdGlhbENoaWxkQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9Vbm1vdW50KSBjYmFzZSA9IGNvbXBvbmVudC5fY29tcG9uZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluaXRpYWxCYXNlIHx8IDEgPT09IG9wdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYmFzZSkgY2Jhc2UuX2NvbXBvbmVudCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYXNlID0gZGlmZihjYmFzZSwgcmVuZGVyZWQsIGNvbnRleHQsIG1vdW50QWxsIHx8ICFpc1VwZGF0ZSwgaW5pdGlhbEJhc2UgJiYgaW5pdGlhbEJhc2UucGFyZW50Tm9kZSwgITApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpbml0aWFsQmFzZSAmJiBiYXNlICE9PSBpbml0aWFsQmFzZSAmJiBpbnN0ICE9PSBpbml0aWFsQ2hpbGRDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJhc2VQYXJlbnQgPSBpbml0aWFsQmFzZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZVBhcmVudCAmJiBiYXNlICE9PSBiYXNlUGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYXNlUGFyZW50LnJlcGxhY2VDaGlsZChiYXNlLCBpbml0aWFsQmFzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvVW5tb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxCYXNlLl9jb21wb25lbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29sbGVjdE5vZGVUcmVlKGluaXRpYWxCYXNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodG9Vbm1vdW50KSB1bm1vdW50Q29tcG9uZW50KHRvVW5tb3VudCwgYmFzZSAhPT0gaW5pdGlhbEJhc2UpO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5iYXNlID0gYmFzZTtcbiAgICAgICAgICAgICAgICBpZiAoYmFzZSAmJiAhaXNDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50UmVmID0gY29tcG9uZW50LCB0ID0gY29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodCA9IHQuX3BhcmVudENvbXBvbmVudCkgKGNvbXBvbmVudFJlZiA9IHQpLmJhc2UgPSBiYXNlO1xuICAgICAgICAgICAgICAgICAgICBiYXNlLl9jb21wb25lbnQgPSBjb21wb25lbnRSZWY7XG4gICAgICAgICAgICAgICAgICAgIGJhc2UuX2NvbXBvbmVudENvbnN0cnVjdG9yID0gY29tcG9uZW50UmVmLmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNVcGRhdGUgfHwgbW91bnRBbGwpIG1vdW50cy51bnNoaWZ0KGNvbXBvbmVudCk7IGVsc2UgaWYgKCFza2lwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5jb21wb25lbnREaWRVcGRhdGUpIGNvbXBvbmVudC5jb21wb25lbnREaWRVcGRhdGUocHJldmlvdXNQcm9wcywgcHJldmlvdXNTdGF0ZSwgcHJldmlvdXNDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hZnRlclVwZGF0ZSkgb3B0aW9ucy5hZnRlclVwZGF0ZShjb21wb25lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGZuLCBjYiA9IGNvbXBvbmVudC5fcmVuZGVyQ2FsbGJhY2tzO1xuICAgICAgICAgICAgaWYgKGNiKSB3aGlsZSAoZm4gPSBjYi5wb3AoKSkgZm4uY2FsbChjb21wb25lbnQpO1xuICAgICAgICAgICAgaWYgKCFkaWZmTGV2ZWwgJiYgIWlzQ2hpbGQpIGZsdXNoTW91bnRzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gYnVpbGRDb21wb25lbnRGcm9tVk5vZGUoZG9tLCB2bm9kZSwgY29udGV4dCwgbW91bnRBbGwpIHtcbiAgICAgICAgdmFyIGMgPSBkb20gJiYgZG9tLl9jb21wb25lbnQsIG9yaWdpbmFsQ29tcG9uZW50ID0gYywgb2xkRG9tID0gZG9tLCBpc0RpcmVjdE93bmVyID0gYyAmJiBkb20uX2NvbXBvbmVudENvbnN0cnVjdG9yID09PSB2bm9kZS5ub2RlTmFtZSwgaXNPd25lciA9IGlzRGlyZWN0T3duZXIsIHByb3BzID0gZ2V0Tm9kZVByb3BzKHZub2RlKTtcbiAgICAgICAgd2hpbGUgKGMgJiYgIWlzT3duZXIgJiYgKGMgPSBjLl9wYXJlbnRDb21wb25lbnQpKSBpc093bmVyID0gYy5jb25zdHJ1Y3RvciA9PT0gdm5vZGUubm9kZU5hbWU7XG4gICAgICAgIGlmIChjICYmIGlzT3duZXIgJiYgKCFtb3VudEFsbCB8fCBjLl9jb21wb25lbnQpKSB7XG4gICAgICAgICAgICBzZXRDb21wb25lbnRQcm9wcyhjLCBwcm9wcywgMywgY29udGV4dCwgbW91bnRBbGwpO1xuICAgICAgICAgICAgZG9tID0gYy5iYXNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG9yaWdpbmFsQ29tcG9uZW50ICYmICFpc0RpcmVjdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgdW5tb3VudENvbXBvbmVudChvcmlnaW5hbENvbXBvbmVudCwgITApO1xuICAgICAgICAgICAgICAgIGRvbSA9IG9sZERvbSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjID0gY3JlYXRlQ29tcG9uZW50KHZub2RlLm5vZGVOYW1lLCBwcm9wcywgY29udGV4dCk7XG4gICAgICAgICAgICBpZiAoZG9tICYmICFjLm5leHRCYXNlKSB7XG4gICAgICAgICAgICAgICAgYy5uZXh0QmFzZSA9IGRvbTtcbiAgICAgICAgICAgICAgICBvbGREb20gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0Q29tcG9uZW50UHJvcHMoYywgcHJvcHMsIDEsIGNvbnRleHQsIG1vdW50QWxsKTtcbiAgICAgICAgICAgIGRvbSA9IGMuYmFzZTtcbiAgICAgICAgICAgIGlmIChvbGREb20gJiYgZG9tICE9PSBvbGREb20pIHtcbiAgICAgICAgICAgICAgICBvbGREb20uX2NvbXBvbmVudCA9IG51bGw7XG4gICAgICAgICAgICAgICAgcmVjb2xsZWN0Tm9kZVRyZWUob2xkRG9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZG9tO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50KGNvbXBvbmVudCwgcmVtb3ZlKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmJlZm9yZVVubW91bnQpIG9wdGlvbnMuYmVmb3JlVW5tb3VudChjb21wb25lbnQpO1xuICAgICAgICB2YXIgYmFzZSA9IGNvbXBvbmVudC5iYXNlO1xuICAgICAgICBjb21wb25lbnQuX2Rpc2FibGUgPSAhMDtcbiAgICAgICAgaWYgKGNvbXBvbmVudC5jb21wb25lbnRXaWxsVW5tb3VudCkgY29tcG9uZW50LmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gICAgICAgIGNvbXBvbmVudC5iYXNlID0gbnVsbDtcbiAgICAgICAgdmFyIGlubmVyID0gY29tcG9uZW50Ll9jb21wb25lbnQ7XG4gICAgICAgIGlmIChpbm5lcikgdW5tb3VudENvbXBvbmVudChpbm5lciwgcmVtb3ZlKTsgZWxzZSBpZiAoYmFzZSkge1xuICAgICAgICAgICAgaWYgKGJhc2VbQVRUUl9LRVldICYmIGJhc2VbQVRUUl9LRVldLnJlZikgYmFzZVtBVFRSX0tFWV0ucmVmKG51bGwpO1xuICAgICAgICAgICAgY29tcG9uZW50Lm5leHRCYXNlID0gYmFzZTtcbiAgICAgICAgICAgIGlmIChyZW1vdmUpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVOb2RlKGJhc2UpO1xuICAgICAgICAgICAgICAgIGNvbGxlY3RDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjO1xuICAgICAgICAgICAgd2hpbGUgKGMgPSBiYXNlLmxhc3RDaGlsZCkgcmVjb2xsZWN0Tm9kZVRyZWUoYywgIXJlbW92ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBvbmVudC5fX3JlZikgY29tcG9uZW50Ll9fcmVmKG51bGwpO1xuICAgICAgICBpZiAoY29tcG9uZW50LmNvbXBvbmVudERpZFVubW91bnQpIGNvbXBvbmVudC5jb21wb25lbnREaWRVbm1vdW50KCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIENvbXBvbmVudChwcm9wcywgY29udGV4dCkge1xuICAgICAgICB0aGlzLl9kaXJ0eSA9ICEwO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZSkgdGhpcy5zdGF0ZSA9IHt9O1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW5kZXIodm5vZGUsIHBhcmVudCwgbWVyZ2UpIHtcbiAgICAgICAgcmV0dXJuIGRpZmYobWVyZ2UsIHZub2RlLCB7fSwgITEsIHBhcmVudCk7XG4gICAgfVxuICAgIHZhciBvcHRpb25zID0ge307XG4gICAgdmFyIHN0YWNrID0gW107XG4gICAgdmFyIEVNUFRZX0NISUxEUkVOID0gW107XG4gICAgdmFyIGxjQ2FjaGUgPSB7fTtcbiAgICB2YXIgdG9Mb3dlckNhc2UgPSBmdW5jdGlvbihzKSB7XG4gICAgICAgIHJldHVybiBsY0NhY2hlW3NdIHx8IChsY0NhY2hlW3NdID0gcy50b0xvd2VyQ2FzZSgpKTtcbiAgICB9O1xuICAgIHZhciByZXNvbHZlZCA9ICd1bmRlZmluZWQnICE9IHR5cGVvZiBQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHZhciBkZWZlciA9IHJlc29sdmVkID8gZnVuY3Rpb24oZikge1xuICAgICAgICByZXNvbHZlZC50aGVuKGYpO1xuICAgIH0gOiBzZXRUaW1lb3V0O1xuICAgIHZhciBFTVBUWSA9IHt9O1xuICAgIHZhciBBVFRSX0tFWSA9ICd1bmRlZmluZWQnICE9IHR5cGVvZiBTeW1ib2wgPyBTeW1ib2wuZm9yKCdwcmVhY3RhdHRyJykgOiAnX19wcmVhY3RhdHRyXyc7XG4gICAgdmFyIE5PTl9ESU1FTlNJT05fUFJPUFMgPSB7XG4gICAgICAgIGJveEZsZXg6IDEsXG4gICAgICAgIGJveEZsZXhHcm91cDogMSxcbiAgICAgICAgY29sdW1uQ291bnQ6IDEsXG4gICAgICAgIGZpbGxPcGFjaXR5OiAxLFxuICAgICAgICBmbGV4OiAxLFxuICAgICAgICBmbGV4R3JvdzogMSxcbiAgICAgICAgZmxleFBvc2l0aXZlOiAxLFxuICAgICAgICBmbGV4U2hyaW5rOiAxLFxuICAgICAgICBmbGV4TmVnYXRpdmU6IDEsXG4gICAgICAgIGZvbnRXZWlnaHQ6IDEsXG4gICAgICAgIGxpbmVDbGFtcDogMSxcbiAgICAgICAgbGluZUhlaWdodDogMSxcbiAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgb3JkZXI6IDEsXG4gICAgICAgIG9ycGhhbnM6IDEsXG4gICAgICAgIHN0cm9rZU9wYWNpdHk6IDEsXG4gICAgICAgIHdpZG93czogMSxcbiAgICAgICAgekluZGV4OiAxLFxuICAgICAgICB6b29tOiAxXG4gICAgfTtcbiAgICB2YXIgTk9OX0JVQkJMSU5HX0VWRU5UUyA9IHtcbiAgICAgICAgYmx1cjogMSxcbiAgICAgICAgZXJyb3I6IDEsXG4gICAgICAgIGZvY3VzOiAxLFxuICAgICAgICBsb2FkOiAxLFxuICAgICAgICByZXNpemU6IDEsXG4gICAgICAgIHNjcm9sbDogMVxuICAgIH07XG4gICAgdmFyIGl0ZW1zID0gW107XG4gICAgdmFyIG5vZGVzID0ge307XG4gICAgdmFyIG1vdW50cyA9IFtdO1xuICAgIHZhciBkaWZmTGV2ZWwgPSAwO1xuICAgIHZhciBpc1N2Z01vZGUgPSAhMTtcbiAgICB2YXIgaHlkcmF0aW5nID0gITE7XG4gICAgdmFyIGNvbXBvbmVudHMgPSB7fTtcbiAgICBleHRlbmQoQ29tcG9uZW50LnByb3RvdHlwZSwge1xuICAgICAgICBsaW5rU3RhdGU6IGZ1bmN0aW9uKGtleSwgZXZlbnRQYXRoKSB7XG4gICAgICAgICAgICB2YXIgYyA9IHRoaXMuX2xpbmtlZFN0YXRlcyB8fCAodGhpcy5fbGlua2VkU3RhdGVzID0ge30pO1xuICAgICAgICAgICAgcmV0dXJuIGNba2V5ICsgZXZlbnRQYXRoXSB8fCAoY1trZXkgKyBldmVudFBhdGhdID0gY3JlYXRlTGlua2VkU3RhdGUodGhpcywga2V5LCBldmVudFBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0U3RhdGU6IGZ1bmN0aW9uKHN0YXRlLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgdmFyIHMgPSB0aGlzLnN0YXRlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnByZXZTdGF0ZSkgdGhpcy5wcmV2U3RhdGUgPSBjbG9uZShzKTtcbiAgICAgICAgICAgIGV4dGVuZChzLCBpc0Z1bmN0aW9uKHN0YXRlKSA/IHN0YXRlKHMsIHRoaXMucHJvcHMpIDogc3RhdGUpO1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSAodGhpcy5fcmVuZGVyQ2FsbGJhY2tzID0gdGhpcy5fcmVuZGVyQ2FsbGJhY2tzIHx8IFtdKS5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGVucXVldWVSZW5kZXIodGhpcyk7XG4gICAgICAgIH0sXG4gICAgICAgIGZvcmNlVXBkYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJlbmRlckNvbXBvbmVudCh0aGlzLCAyKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHt9XG4gICAgfSk7XG4gICAgZXhwb3J0cy5oID0gaDtcbiAgICBleHBvcnRzLmNsb25lRWxlbWVudCA9IGNsb25lRWxlbWVudDtcbiAgICBleHBvcnRzLkNvbXBvbmVudCA9IENvbXBvbmVudDtcbiAgICBleHBvcnRzLnJlbmRlciA9IHJlbmRlcjtcbiAgICBleHBvcnRzLnJlcmVuZGVyID0gcmVyZW5kZXI7XG4gICAgZXhwb3J0cy5vcHRpb25zID0gb3B0aW9ucztcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJlYWN0LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9wcmVhY3QvZGlzdC9wcmVhY3QuanNcbi8vIG1vZHVsZSBpZCA9IDQ2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcHJvY2Vzcy9icm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSA0N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKCdQcm9wVHlwZXMnLCBbJ2V4cG9ydHMnLCAnbW9kdWxlJ10sIGZhY3RvcnkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xuICAgIGZhY3RvcnkoZXhwb3J0cywgbW9kdWxlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbW9kID0ge1xuICAgICAgZXhwb3J0czoge31cbiAgICB9O1xuICAgIGZhY3RvcnkobW9kLmV4cG9ydHMsIG1vZCk7XG4gICAgZ2xvYmFsLlByb3BUeXBlcyA9IG1vZC5leHBvcnRzO1xuICB9XG59KSh0aGlzLCBmdW5jdGlvbiAoZXhwb3J0cywgbW9kdWxlKSB7XG5cbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbFsnZm9yJ10gJiYgU3ltYm9sWydmb3InXSgncmVhY3QuZWxlbWVudCcpIHx8IDB4ZWFjNztcblxuICB2YXIgUmVhY3RFbGVtZW50ID0ge307XG5cbiAgUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50ID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG4gIH07XG5cbiAgdmFyIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzID0ge1xuICAgIHByb3A6ICdwcm9wJyxcbiAgICBjb250ZXh0OiAnY29udGV4dCcsXG4gICAgY2hpbGRDb250ZXh0OiAnY2hpbGQgY29udGV4dCdcbiAgfTtcblxuICB2YXIgZW1wdHlGdW5jdGlvbiA9IHtcbiAgICB0aGF0UmV0dXJuczogZnVuY3Rpb24gdGhhdFJldHVybnMod2hhdCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHdoYXQ7XG4gICAgICB9O1xuICAgIH1cbiAgfTtcblxuICB2YXIgSVRFUkFUT1JfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3I7XG4gIHZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbiAgZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBtYXliZUl0ZXJhYmxlICYmIChJVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtJVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdKTtcbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBpdGVyYXRvckZuO1xuICAgIH1cbiAgfVxuXG4gIHZhciBBTk9OWU1PVVMgPSAnPDxhbm9ueW1vdXM+Pic7XG5cbiAgdmFyIFJlYWN0UHJvcFR5cGVzID0ge1xuICAgIGFycmF5OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYXJyYXknKSxcbiAgICBib29sOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYm9vbGVhbicpLFxuICAgIGZ1bmM6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdmdW5jdGlvbicpLFxuICAgIG51bWJlcjogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ251bWJlcicpLFxuICAgIG9iamVjdDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ29iamVjdCcpLFxuICAgIHN0cmluZzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N0cmluZycpLFxuICAgIHN5bWJvbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N5bWJvbCcpLFxuXG4gICAgYW55OiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpLFxuICAgIGFycmF5T2Y6IGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcixcbiAgICBlbGVtZW50OiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSxcbiAgICBpbnN0YW5jZU9mOiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyLFxuICAgIG5vZGU6IGNyZWF0ZU5vZGVDaGVja2VyKCksXG4gICAgb2JqZWN0T2Y6IGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIsXG4gICAgb25lT2Y6IGNyZWF0ZUVudW1UeXBlQ2hlY2tlcixcbiAgICBvbmVPZlR5cGU6IGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIsXG4gICAgc2hhcGU6IGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXJcbiAgfTtcblxuICBmdW5jdGlvbiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSkge1xuICAgIGZ1bmN0aW9uIGNoZWNrVHlwZShpc1JlcXVpcmVkLCBwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgIHByb3BGdWxsTmFtZSA9IHByb3BGdWxsTmFtZSB8fCBwcm9wTmFtZTtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgICAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1JlcXVpcmVkICcgKyBsb2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agd2FzIG5vdCBzcGVjaWZpZWQgaW4gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoYWluZWRDaGVja1R5cGUgPSBjaGVja1R5cGUuYmluZChudWxsLCBmYWxzZSk7XG4gICAgY2hhaW5lZENoZWNrVHlwZS5pc1JlcXVpcmVkID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gY2hhaW5lZENoZWNrVHlwZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKGV4cGVjdGVkVHlwZSkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuXG4gICAgICAgIHZhciBwcmVjaXNlVHlwZSA9IGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcmVjaXNlVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCAnKSArICgnYCcgKyBleHBlY3RlZFR5cGUgKyAnYC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFueVR5cGVDaGVja2VyKCkge1xuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcihlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zKG51bGwpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl07XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uTmFtZSArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gYXJyYXkuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBpLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJ1snICsgaSArICddJyk7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICghUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KHByb3BzW3Byb3BOYW1lXSkpIHtcbiAgICAgICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyKGV4cGVjdGVkQ2xhc3MpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICghKHByb3BzW3Byb3BOYW1lXSBpbnN0YW5jZW9mIGV4cGVjdGVkQ2xhc3MpKSB7XG4gICAgICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl07XG4gICAgICAgIHZhciBleHBlY3RlZENsYXNzTmFtZSA9IGV4cGVjdGVkQ2xhc3MubmFtZSB8fCBBTk9OWU1PVVM7XG4gICAgICAgIHZhciBhY3R1YWxDbGFzc05hbWUgPSBnZXRDbGFzc05hbWUocHJvcHNbcHJvcE5hbWVdKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBhY3R1YWxDbGFzc05hbWUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2luc3RhbmNlIG9mIGAnICsgZXhwZWN0ZWRDbGFzc05hbWUgKyAnYC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVudW1UeXBlQ2hlY2tlcihleHBlY3RlZFZhbHVlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZFZhbHVlcykpIHtcbiAgICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocHJvcFZhbHVlID09PSBleHBlY3RlZFZhbHVlc1tpXSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl07XG4gICAgICB2YXIgdmFsdWVzU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWRWYWx1ZXMpO1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHZhbHVlIGAnICsgcHJvcFZhbHVlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIG9uZSBvZiAnICsgdmFsdWVzU3RyaW5nICsgJy4nKSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBvYmplY3QuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHByb3BWYWx1ZSkge1xuICAgICAgICBpZiAocHJvcFZhbHVlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSk7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlVW5pb25UeXBlQ2hlY2tlcihhcnJheU9mVHlwZUNoZWNrZXJzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5T2ZUeXBlQ2hlY2tlcnMpKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mVHlwZSwgZXhwZWN0ZWQgYW4gaW5zdGFuY2Ugb2YgYXJyYXkuJyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICAgIGlmIChjaGVja2VyKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl07XG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AuJykpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlTm9kZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAoIWlzTm9kZShwcm9wc1twcm9wTmFtZV0pKSB7XG4gICAgICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl07XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uTmFtZSArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBzdXBwbGllZCB0byAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBSZWFjdE5vZGUuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVTaGFwZVR5cGVDaGVja2VyKHNoYXBlVHlwZXMpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBzaGFwZVR5cGVzKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldO1xuICAgICAgICBpZiAoIWNoZWNrZXIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXJyb3IgPSBjaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTm9kZShwcm9wVmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBwcm9wVmFsdWUpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcmV0dXJuICFwcm9wVmFsdWU7XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3BWYWx1ZS5ldmVyeShpc05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihwcm9wVmFsdWUpO1xuICAgICAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChwcm9wVmFsdWUpO1xuICAgICAgICAgIHZhciBzdGVwO1xuICAgICAgICAgIGlmIChpdGVyYXRvckZuICE9PSBwcm9wVmFsdWUuZW50cmllcykge1xuICAgICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgICBpZiAoIWlzTm9kZShzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOb2RlKGVudHJ5WzFdKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSB7XG4gICAgaWYgKHByb3BUeXBlID09PSAnc3ltYm9sJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BWYWx1ZVsnQEB0b1N0cmluZ1RhZyddID09PSAnU3ltYm9sJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgcHJvcFZhbHVlIGluc3RhbmNlb2YgU3ltYm9sKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRQcm9wVHlwZShwcm9wVmFsdWUpIHtcbiAgICB2YXIgcHJvcFR5cGUgPSB0eXBlb2YgcHJvcFZhbHVlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIH1cbiAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICByZXR1cm4gJ29iamVjdCc7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSkge1xuICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcFR5cGU7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpIHtcbiAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgIGlmIChwcm9wVHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiAnZGF0ZSc7XG4gICAgICB9IGVsc2UgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wVHlwZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldENsYXNzTmFtZShwcm9wVmFsdWUpIHtcbiAgICBpZiAoIXByb3BWYWx1ZS5jb25zdHJ1Y3RvciB8fCAhcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWUpIHtcbiAgICAgIHJldHVybiBBTk9OWU1PVVM7XG4gICAgfVxuICAgIHJldHVybiBwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuXG4gIG1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZXM7XG59KTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3Byb3B0eXBlcy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNDhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IHtzdXJ2ZXlDc3N9IGZyb20gXCIuL2Nzc3N0YW5kYXJkXCI7XG5cbmV4cG9ydCB2YXIgZGVmYXVsdEJvb3RzdHJhcENzcyA9IHtcbiAgICByb290OiBcIlwiLFxuICAgIGhlYWRlcjogXCJwYW5lbC1oZWFkaW5nIGNhcmQtaGVhZGVyXCIsXG4gICAgYm9keTogXCJwYW5lbC1ib2R5IGNhcmQtYmxvY2tcIixcbiAgICBmb290ZXI6IFwicGFuZWwtZm9vdGVyIGNhcmQtZm9vdGVyXCIsXG4gICAgbmF2aWdhdGlvbkJ1dHRvbjogXCJcIixcbiAgICBuYXZpZ2F0aW9uOiB7IGNvbXBsZXRlOiBcInN2X2NvbXBsZXRlX2J0blwiLCBwcmV2OiBcInN2X3ByZXZfYnRuXCIsIG5leHQ6IFwic3ZfbmV4dF9idG5cIiB9LFxuICAgIHByb2dyZXNzOiBcInByb2dyZXNzIGNlbnRlci1ibG9ja1wiLCBwcm9ncmVzc0JhcjogXCJwcm9ncmVzcy1iYXJcIixcbiAgICBwYWdlVGl0bGU6IFwiXCIsIHBhZ2VEZXNjcmlwdGlvbjogXCJzbWFsbFwiLFxuICAgIHJvdzogXCJcIixcbiAgICBxdWVzdGlvbjogeyBtYWluUm9vdDogXCJzdl9xc3RuXCIsIHRpdGxlOiBcIlwiLCBkZXNjcmlwdGlvbjogXCJzbWFsbFwiLCBjb21tZW50OiBcImZvcm0tY29udHJvbFwiLCByZXF1aXJlZDogXCJcIiwgdGl0bGVSZXF1aXJlZDogXCJcIiwgaW5kZW50OiAyMCB9LFxuICAgIHBhbmVsOiB7dGl0bGU6IFwiXCIsIGRlc2NyaXB0aW9uOiBcInNtYWxsXCIsIGNvbnRhaW5lcjogXCJzdl9wX2NvbnRhaW5lclwifSxcbiAgICBlcnJvcjogeyByb290OiBcImFsZXJ0IGFsZXJ0LWRhbmdlclwiLCBpY29uOiBcImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblwiLCBpdGVtOiBcIlwiIH0sXG5cbiAgICBib29sZWFuOiB7IHJvb3Q6IFwic3ZfcWJsbiBmb3JtLWlubGluZVwiLCBpdGVtOiBcImNoZWNrYm94XCJ9LFxuICAgIGNoZWNrYm94OiB7IHJvb3Q6IFwic3ZfcWNieCBmb3JtLWlubGluZVwiLCBpdGVtOiBcImNoZWNrYm94XCIsIG90aGVyOiBcInN2X3FfY2hlY2tib3hfb3RoZXJcIiB9LFxuICAgIGNvbW1lbnQ6IFwiZm9ybS1jb250cm9sXCIsXG4gICAgZHJvcGRvd246IHsgcm9vdDogXCJcIiwgY29udHJvbDogXCJmb3JtLWNvbnRyb2xcIiwgb3RoZXI6IFwiXCIgfSxcbiAgICBtYXRyaXg6IHsgcm9vdDogXCJ0YWJsZVwiLCBsYWJlbDogXCJzdl9xX21fbGFiZWxcIiB9LFxuICAgIG1hdHJpeGRyb3Bkb3duOiB7IHJvb3Q6IFwidGFibGVcIiB9LFxuICAgIG1hdHJpeGR5bmFtaWM6IHsgcm9vdDogXCJ0YWJsZVwiLCBidXR0b246IFwiYnV0dG9uXCIgfSxcbiAgICBwYW5lbGR5bmFtaWM6IHsgcm9vdDogXCJcIiwgYnV0dG9uOiBcImJ1dHRvblwiIH0sXG4gICAgbXVsdGlwbGV0ZXh0OiB7IHJvb3Q6IFwidGFibGVcIiwgaXRlbVRpdGxlOiBcIlwiLCBpdGVtVmFsdWU6IFwic3ZfcV9tdF9pdGVtX3ZhbHVlIGZvcm0tY29udHJvbFwiIH0sXG4gICAgcmFkaW9ncm91cDogeyByb290OiBcImZvcm0taW5saW5lXCIsIGl0ZW06IFwicmFkaW9cIiwgbGFiZWw6IFwiXCIsIG90aGVyOiBcInN2X3FfcmFkaW9ncm91cF9vdGhlclwiIH0sXG4gICAgcmF0aW5nOiB7IHJvb3Q6IFwiYnRuLWdyb3VwXCIsIGl0ZW06IFwiYnRuIGJ0bi1kZWZhdWx0XCIsIHNlbGVjdGVkOiBcImFjdGl2ZVwiIH0sXG4gICAgdGV4dDogXCJmb3JtLWNvbnRyb2xcIixcbiAgICBleHByZXNzaW9uOiBcImZvcm0tY29udHJvbFwiLFxuICAgIHNhdmVEYXRhOiB7cm9vdDogXCJcIiwgc2F2aW5nOiBcImFsZXJ0IGFsZXJ0LWluZm9cIiwgZXJyb3I6IFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIsIHN1Y2Nlc3M6IFwiYWxlcnQgYWxlcnQtc3VjY2Vzc1wiLCBzYXZlQWdhaW5CdXR0b246IFwiXCJ9LFxuICAgIHdpbmRvdzoge1xuICAgICAgICByb290OiBcIm1vZGFsLWNvbnRlbnRcIiwgYm9keTogXCJtb2RhbC1ib2R5XCIsXG4gICAgICAgIGhlYWRlcjoge1xuICAgICAgICAgICAgcm9vdDogXCJtb2RhbC1oZWFkZXIgcGFuZWwtdGl0bGVcIiwgdGl0bGU6IFwicHVsbC1sZWZ0XCIsIGJ1dHRvbjogXCJnbHlwaGljb24gcHVsbC1yaWdodFwiLFxuICAgICAgICAgICAgYnV0dG9uRXhwYW5kZWQ6IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHQgZ2x5cGhpY29uLWNoZXZyb24tdXBcIiwgYnV0dG9uQ29sbGFwc2VkOiBcImdseXBoaWNvbiBwdWxsLXJpZ2h0IGdseXBoaWNvbi1jaGV2cm9uLWRvd25cIlxuICAgICAgICB9XG4gICAgfVxufTtcbnN1cnZleUNzc1tcImJvb3RzdHJhcFwiXSA9IGRlZmF1bHRCb290c3RyYXBDc3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZGVmYXVsdENzcy9jc3Nib290c3RyYXAudHMiLCJpbXBvcnQge3N1cnZleUNzc30gZnJvbSBcIi4vY3Nzc3RhbmRhcmRcIjtcblxuZXhwb3J0IHZhciBkZWZhdWx0Qm9vdHN0cmFwTWF0ZXJpYWxDc3MgPSB7XG4gICAgcm9vdDogXCJcIixcbiAgICBoZWFkZXI6IFwicGFuZWwtaGVhZGluZ1wiLFxuICAgIGJvZHk6IFwicGFuZWwtYm9keVwiLFxuICAgIGZvb3RlcjogXCJwYW5lbC1mb290ZXJcIixcbiAgICBuYXZpZ2F0aW9uQnV0dG9uOiBcIlwiLCBuYXZpZ2F0aW9uOiB7IGNvbXBsZXRlOiBcInN2X2NvbXBsZXRlX2J0blwiLCBwcmV2OiBcInN2X3ByZXZfYnRuXCIsIG5leHQ6IFwic3ZfbmV4dF9idG5cIiB9LFxuICAgIHByb2dyZXNzOiBcInByb2dyZXNzIGNlbnRlci1ibG9ja1wiLCBwcm9ncmVzc0JhcjogXCJwcm9ncmVzcy1iYXJcIixcbiAgICBwYWdlVGl0bGU6IFwiXCIsIHBhZ2VEZXNjcmlwdGlvbjogXCJzbWFsbFwiLFxuICAgIHJvdzogXCJcIixcbiAgICBxdWVzdGlvbjogeyBtYWluUm9vdDogXCJzdl9xc3RuIGZvcm0tZ3JvdXBcIiwgdGl0bGU6IFwiXCIsIGRlc2NyaXB0aW9uOiBcInNtYWxsXCIsIGNvbW1lbnQ6IFwiZm9ybS1jb250cm9sXCIsIHJlcXVpcmVkOiBcIlwiLCB0aXRsZVJlcXVpcmVkOiBcIlwiLCBpbmRlbnQ6IDIwIH0sXG4gICAgcGFuZWw6IHt0aXRsZTogXCJcIiwgZGVzY3JpcHRpb246IFwic21hbGxcIiwgY29udGFpbmVyOiBcInN2X3BfY29udGFpbmVyXCJ9LFxuICAgIGVycm9yOiB7IHJvb3Q6IFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIsIGljb246IFwiZ2x5cGhpY29uIGdseXBoaWNvbi1leGNsYW1hdGlvbi1zaWduXCIsIGl0ZW06IFwiXCIgfSxcblxuICAgIGJvb2xlYW46IHsgcm9vdDogXCJzdl9xYmxuIGZvcm0taW5saW5lXCIsIGl0ZW06IFwiY2hlY2tib3hcIn0sXG4gICAgY2hlY2tib3g6IHsgcm9vdDogXCJzdl9xY2J4IGZvcm0taW5saW5lXCIsIGl0ZW06IFwiY2hlY2tib3hcIiwgb3RoZXI6IFwic3ZfcV9jaGVja2JveF9vdGhlclwiIH0sXG4gICAgY29tbWVudDogXCJmb3JtLWNvbnRyb2xcIixcbiAgICBkcm9wZG93bjogeyByb290OiBcIlwiLCBjb250cm9sOiBcImZvcm0tY29udHJvbFwiLCBvdGhlcjogXCJcIiB9LFxuICAgIG1hdHJpeDogeyByb290OiBcInRhYmxlXCIsIHJvdzogXCJmb3JtLWdyb3VwXCIsIGxhYmVsOiBcInN2X3FfbV9sYWJlbCByYWRpby1pbmxpbmVcIiwgaXRlbVZhbHVlOiBcImZvcm0tY29udHJvbFwiIH0sXG4gICAgbWF0cml4ZHJvcGRvd246IHsgcm9vdDogXCJ0YWJsZVwiLCBpdGVtVmFsdWU6IFwiZm9ybS1ncm91cFwiIH0sXG4gICAgbWF0cml4ZHluYW1pYzogeyByb290OiBcInRhYmxlXCIsIGJ1dHRvbjogXCJidXR0b25cIiB9LFxuICAgIHBhbmVsZHluYW1pYzogeyByb290OiBcIlwiLCBidXR0b246IFwiYnV0dG9uXCIgfSxcbiAgICBtdWx0aXBsZXRleHQ6IHsgcm9vdDogXCJ0YWJsZVwiLCBpdGVtVGl0bGU6IFwiXCIsIHJvdzogXCJmb3JtLWdyb3VwXCIsIGl0ZW1WYWx1ZTogXCJzdl9xX210X2l0ZW1fdmFsdWUgZm9ybS1jb250cm9sXCIgfSxcbiAgICByYWRpb2dyb3VwOiB7IHJvb3Q6IFwiZm9ybS1pbmxpbmVcIiwgaXRlbTogXCJyYWRpby1pbmxpbmVcIiwgbGFiZWw6IFwicmFkaW8taW5saW5lXCIsIG90aGVyOiBcInN2X3FfcmFkaW9ncm91cF9vdGhlclwiIH0sXG4gICAgcmF0aW5nOiB7IHJvb3Q6IFwiYnRuLWdyb3VwXCIsIGl0ZW06IFwiYnRuIGJ0bi1kZWZhdWx0XCIsIHNlbGVjdGVkOiBcImFjdGl2ZVwiIH0sXG4gICAgdGV4dDogXCJmb3JtLWNvbnRyb2xcIixcbiAgICBleHByZXNzaW9uOiBcImZvcm0tY29udHJvbFwiLFxuICAgIHNhdmVEYXRhOiB7cm9vdDogXCJcIiwgc2F2aW5nOiBcImFsZXJ0IGFsZXJ0LWluZm9cIiwgZXJyb3I6IFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIsIHN1Y2Nlc3M6IFwiYWxlcnQgYWxlcnQtc3VjY2Vzc1wiLCBzYXZlQWdhaW5CdXR0b246IFwiXCJ9LFxuICAgIHdpbmRvdzoge1xuICAgICAgICByb290OiBcIm1vZGFsLWNvbnRlbnRcIiwgYm9keTogXCJtb2RhbC1ib2R5XCIsXG4gICAgICAgIGhlYWRlcjoge1xuICAgICAgICAgICAgcm9vdDogXCJtb2RhbC1oZWFkZXIgcGFuZWwtdGl0bGVcIiwgdGl0bGU6IFwicHVsbC1sZWZ0XCIsIGJ1dHRvbjogXCJnbHlwaGljb24gcHVsbC1yaWdodFwiLFxuICAgICAgICAgICAgYnV0dG9uRXhwYW5kZWQ6IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHQgZ2x5cGhpY29uLWNoZXZyb24tdXBcIiwgYnV0dG9uQ29sbGFwc2VkOiBcImdseXBoaWNvbiBwdWxsLXJpZ2h0IGdseXBoaWNvbi1jaGV2cm9uLWRvd25cIlxuICAgICAgICB9XG4gICAgfVxufTtcbnN1cnZleUNzc1tcImJvb3RzdHJhcG1hdGVyaWFsXCJdID0gZGVmYXVsdEJvb3RzdHJhcE1hdGVyaWFsQ3NzO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9kZWZhdWx0Q3NzL2Nzc2Jvb3RzdHJhcG1hdGVyaWFsLnRzIiwiaW1wb3J0ICcuLi8uLi9sb2NhbGl6YXRpb24vYXJhYmljJztcbmltcG9ydCAnLi4vLi4vbG9jYWxpemF0aW9uL2N6ZWNoJztcbmltcG9ydCAnLi4vLi4vbG9jYWxpemF0aW9uL2RhbmlzaCc7XG5pbXBvcnQgJy4uLy4uL2xvY2FsaXphdGlvbi9kdXRjaCc7XG5pbXBvcnQgJy4uLy4uL2xvY2FsaXphdGlvbi9maW5uaXNoJztcbmltcG9ydCAnLi4vLi4vbG9jYWxpemF0aW9uL2ZyZW5jaCc7XG5pbXBvcnQgJy4uLy4uL2xvY2FsaXphdGlvbi9nZXJtYW4nO1xuaW1wb3J0ICcuLi8uLi9sb2NhbGl6YXRpb24vZ3JlZWsnO1xuaW1wb3J0ICcuLi8uLi9sb2NhbGl6YXRpb24vaHVuZ2FyaWFuJztcbmltcG9ydCAnLi4vLi4vbG9jYWxpemF0aW9uL2ljZWxhbmRpYyc7XG5pbXBvcnQgJy4uLy4uL2xvY2FsaXphdGlvbi9pdGFsaWFuJztcbmltcG9ydCAnLi4vLi4vbG9jYWxpemF0aW9uL2xhdHZpYW4nO1xuaW1wb3J0ICcuLi8uLi9sb2NhbGl6YXRpb24vcG9saXNoJztcbmltcG9ydCAnLi4vLi4vbG9jYWxpemF0aW9uL3BvcnR1Z3Vlc2UnO1xuaW1wb3J0ICcuLi8uLi9sb2NhbGl6YXRpb24vcm9tYW5pYW4nO1xuaW1wb3J0ICcuLi8uLi9sb2NhbGl6YXRpb24vcnVzc2lhbic7XG5pbXBvcnQgJy4uLy4uL2xvY2FsaXphdGlvbi9zcGFuaXNoJztcbmltcG9ydCAnLi4vLi4vbG9jYWxpemF0aW9uL3N3ZWRpc2gnO1xuaW1wb3J0ICcuLi8uLi9sb2NhbGl6YXRpb24vdHVya2lzaCc7XG5pbXBvcnQgJy4uLy4uL2xvY2FsaXphdGlvbi9zaW1wbGlmaWVkLWNoaW5lc2UnO1xuaW1wb3J0ICcuLi8uLi9sb2NhbGl6YXRpb24vcGVyc2lhbic7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZW50cmllcy9jaHVua3MvbG9jYWxpemF0aW9uLnRzIiwiLy8gc3R5bGVzXG5pbXBvcnQgXCIuLi8uLi9tYWluLnNjc3NcIjtcblxuZXhwb3J0IGxldCBWZXJzaW9uOiBzdHJpbmc7XG5WZXJzaW9uID0gYCR7cHJvY2Vzcy5lbnYuVkVSU0lPTn1gO1xuXG5leHBvcnQge0hlbHBlcnN9IGZyb20gXCIuLi8uLi9oZWxwZXJzXCI7XG5leHBvcnQge1xuICAgIEFuc3dlckNvdW50VmFsaWRhdG9yLCBFbWFpbFZhbGlkYXRvciwgTnVtZXJpY1ZhbGlkYXRvciwgUmVnZXhWYWxpZGF0b3IsXG4gICAgU3VydmV5VmFsaWRhdG9yLCBUZXh0VmFsaWRhdG9yLCBWYWxpZGF0b3JSZXN1bHQsIFZhbGlkYXRvclJ1bm5lclxufSBmcm9tIFwiLi4vLi4vdmFsaWRhdG9yXCI7XG5leHBvcnQge0l0ZW1WYWx1ZX0gZnJvbSBcIi4uLy4uL2l0ZW12YWx1ZVwiO1xuZXhwb3J0IHtCYXNlLCBFdmVudCwgU3VydmV5RXJyb3IsIElTdXJ2ZXl9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5leHBvcnQge0lMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZ30gZnJvbSBcIi4uLy4uL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5leHBvcnQge0Nob2ljZXNSZXN0ZnVsbH0gZnJvbSBcIi4uLy4uL2Nob2ljZXNSZXN0ZnVsbFwiO1xuZXhwb3J0IHtGdW5jdGlvbkZhY3Rvcnl9IGZyb20gXCIuLi8uLi9mdW5jdGlvbnNmYWN0b3J5XCI7XG5leHBvcnQge0NvbmRpdGlvbiwgQ29uZGl0aW9uTm9kZSwgQ29uZGl0aW9uUnVubmVyfSBmcm9tIFwiLi4vLi4vY29uZGl0aW9uc1wiO1xuZXhwb3J0IHtDb25kaXRpb25zUGFyc2VyfSBmcm9tIFwiLi4vLi4vY29uZGl0aW9uc1BhcnNlclwiO1xuZXhwb3J0IHtQcm9jZXNzVmFsdWV9IGZyb20gXCIuLi8uLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcbmV4cG9ydCB7Q3VzdG9tRXJyb3IsIEV4Y2VlZFNpemVFcnJvciwgUmVxdXJlTnVtZXJpY0Vycm9yfSBmcm9tIFwiLi4vLi4vZXJyb3JcIjtcbmV4cG9ydCB7XG4gICAgSnNvbkVycm9yLCBKc29uSW5jb3JyZWN0VHlwZUVycm9yLCBKc29uTWV0YWRhdGEsIEpzb25NZXRhZGF0YUNsYXNzLFxuICAgIEpzb25NaXNzaW5nVHlwZUVycm9yLCBKc29uTWlzc2luZ1R5cGVFcnJvckJhc2UsIEpzb25PYmplY3QsIEpzb25PYmplY3RQcm9wZXJ0eSxcbiAgICBKc29uUmVxdWlyZWRQcm9wZXJ0eUVycm9yLCBKc29uVW5rbm93blByb3BlcnR5RXJyb3Jcbn0gZnJvbSBcIi4uLy4uL2pzb25vYmplY3RcIjtcbmV4cG9ydCB7XG4gICAgTWF0cml4RHJvcGRvd25DZWxsLCBNYXRyaXhEcm9wZG93bkNvbHVtbiwgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZVxufSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25iYXNlXCI7XG5leHBvcnQge01hdHJpeERyb3Bkb3duUm93TW9kZWwsIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duXCI7XG5leHBvcnQge01hdHJpeER5bmFtaWNSb3dNb2RlbCwgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWx9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9tYXRyaXhkeW5hbWljXCI7XG5leHBvcnQge01hdHJpeFJvd01vZGVsLCBRdWVzdGlvbk1hdHJpeE1vZGVsfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fbWF0cml4XCI7XG5leHBvcnQge011bHRpcGxlVGV4dEl0ZW1Nb2RlbCwgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX211bHRpcGxldGV4dFwiO1xuZXhwb3J0IHtQYW5lbE1vZGVsLCBQYW5lbE1vZGVsQmFzZSwgUXVlc3Rpb25Sb3dNb2RlbH0gZnJvbSBcIi4uLy4uL3BhbmVsXCI7XG5leHBvcnQge1BhZ2VNb2RlbH0gZnJvbSBcIi4uLy4uL3BhZ2VcIjtcbmV4cG9ydCB7UXVlc3Rpb259IGZyb20gXCIuLi8uLi9xdWVzdGlvblwiO1xuZXhwb3J0IHtRdWVzdGlvbkJhc2V9IGZyb20gXCIuLi8uLi9xdWVzdGlvbmJhc2VcIjtcbmV4cG9ydCB7UXVlc3Rpb25FbXB0eU1vZGVsfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fZW1wdHlcIjtcbmV4cG9ydCB7UXVlc3Rpb25DaGVja2JveEJhc2UsIFF1ZXN0aW9uU2VsZWN0QmFzZX0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmV4cG9ydCB7UXVlc3Rpb25DaGVja2JveE1vZGVsfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fY2hlY2tib3hcIjtcbmV4cG9ydCB7UXVlc3Rpb25Db21tZW50TW9kZWx9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9jb21tZW50XCI7XG5leHBvcnQge1F1ZXN0aW9uRHJvcGRvd25Nb2RlbH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2Ryb3Bkb3duXCI7XG5leHBvcnQge1F1ZXN0aW9uRmFjdG9yeSwgRWxlbWVudEZhY3Rvcnl9IGZyb20gXCIuLi8uLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmV4cG9ydCB7UXVlc3Rpb25GaWxlTW9kZWx9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9maWxlXCI7XG5leHBvcnQge1F1ZXN0aW9uSHRtbE1vZGVsfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25faHRtbFwiO1xuZXhwb3J0IHtRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX3JhZGlvZ3JvdXBcIjtcbmV4cG9ydCB7UXVlc3Rpb25SYXRpbmdNb2RlbH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX3JhdGluZ1wiO1xuZXhwb3J0IHtRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2V4cHJlc3Npb25cIjtcbmV4cG9ydCB7UXVlc3Rpb25UZXh0TW9kZWx9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl90ZXh0XCI7XG5leHBvcnQge1F1ZXN0aW9uQm9vbGVhbk1vZGVsfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fYm9vbGVhblwiO1xuZXhwb3J0IHtRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsLCBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW19IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9wYW5lbGR5bmFtaWNcIjtcbmV4cG9ydCB7U3VydmV5VGltZXJ9IGZyb20gJy4uLy4uL3N1cnZleXRpbWVyJztcbmV4cG9ydCB7U3VydmV5TW9kZWx9IGZyb20gXCIuLi8uLi9zdXJ2ZXlcIjtcbmV4cG9ydCB7XG4gICAgU3VydmV5VHJpZ2dlciwgU3VydmV5VHJpZ2dlckNvbXBsZXRlLCBTdXJ2ZXlUcmlnZ2VyU2V0VmFsdWUsIFN1cnZleVRyaWdnZXJWaXNpYmxlLFxuICAgIFRyaWdnZXJcbn0gZnJvbSBcIi4uLy4uL3RyaWdnZXJcIjtcbmV4cG9ydCB7U3VydmV5V2luZG93TW9kZWx9IGZyb20gXCIuLi8uLi9zdXJ2ZXlXaW5kb3dcIjtcbmV4cG9ydCB7VGV4dFByZVByb2Nlc3Nvcn0gZnJvbSBcIi4uLy4uL3RleHRQcmVQcm9jZXNzb3JcIjtcblxuZXhwb3J0IHtkeFN1cnZleVNlcnZpY2V9IGZyb20gXCIuLi8uLi9keFN1cnZleVNlcnZpY2VcIjtcbmV4cG9ydCB7c3VydmV5TG9jYWxpemF0aW9uLCBzdXJ2ZXlTdHJpbmdzfSBmcm9tIFwiLi4vLi4vc3VydmV5U3RyaW5nc1wiO1xuZXhwb3J0IHtRdWVzdGlvbkN1c3RvbVdpZGdldCwgQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uQ3VzdG9tV2lkZ2V0c1wiO1xuXG4vL1VuY29tbWVudCB0byBpbmNsdWRlIHRoZSBcImRhdGVcIiBxdWVzdGlvbiB0eXBlLlxuLy9leHBvcnQge2RlZmF1bHQgYXMgUXVlc3Rpb25EYXRlTW9kZWx9IGZyb20gXCIuLi8uLi9wbHVnaW5zL3F1ZXN0aW9uX2RhdGVcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9lbnRyaWVzL2NodW5rcy9tb2RlbC50cyIsImltcG9ydCB7c3VydmV5TG9jYWxpemF0aW9ufSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGFyYWJpY1N1cnZleVN0cmluZ3MgPSB7XG4gICAgcGFnZVByZXZUZXh0OiBcItin2YTYs9in2KjZglwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCLYp9mE2KrYp9mE2YpcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwi2KfZhtmH2KfYoS0g2KrZhVwiLFxuICAgIHByb2dyZXNzVGV4dDogXCJ7MX0g2LXZgdit2KkgezB9INmF2YZcIixcbiAgICBvdGhlckl0ZW1UZXh0OiBcItmG2LUg2KLYrtixXCIsXG4gICAgZW1wdHlTdXJ2ZXk6IFwi2YTYpyDYqtmI2KzYryDYtdmB2K3YqSDZhdix2KbZitipINij2Ygg2LPYpNin2YQg2YHZiiDYp9mE2YXYs9itXCIsXG4gICAgY29tcGxldGluZ1N1cnZleTogXCLYtNmD2LHYpyDZhNmDINmE2KfYs9iq2YPZhdin2YQg2KfZhNin2LPYqtio2YrYp9mGIVwiLFxuICAgIGxvYWRpbmdTdXJ2ZXk6IFwiLi4u2YrYqtmFINiq2K3ZhdmK2YQg2KfZhNin2LPYqtio2YrYp9mGXCIsXG4gICAgb3B0aW9uc0NhcHRpb246IFwiLi4u2KfYrtiq2LFcIixcbiAgICByZXF1aXJlZEVycm9yOiBcIi7Zitix2KzZiSDYp9mE2KXYrNin2KjYqSDYudmE2Ykg2KfZhNiz2KTYp9mEXCIsXG4gICAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLZitix2KzZiSDYp9mE2KXYrNin2KjYqSDYudmE2Ykg2KfZhNij2LPYptmE2Kkg2YHZiiDYrNmF2YrYuSDYp9mE2LXZgdmI2YFcIixcbiAgICBudW1lcmljRXJyb3I6IFwi2YrYrNioINij2YYg2KrZg9mI2YYg2KfZhNmC2YrZhdipINin2YTYsdmC2YXZitipLlwiLFxuICAgIHRleHRNaW5MZW5ndGg6IFwi2KfZhNix2KzYp9ihINil2K/Yrtin2YQg2YXYpyDZhNinINmK2YLZhCDYudmGIHswfSDYrdix2YFcIixcbiAgICB0ZXh0TWF4TGVuZ3RoOiBcItin2YTYsdis2KfYoSDYpdiv2K7Yp9mEINij2YLZhCDZhdmGIHswfSDYrdix2YFcIixcbiAgICB0ZXh0TWluTWF4TGVuZ3RoOiBcItmK2LHYrNmJINil2K/Yrtin2YQg2KPZg9ir2LEg2YXZhiB7MH0g2YjYo9mC2YQg2YXZhiB7MX0g2K3YsdmBXCIsXG4gICAgbWluUm93Q291bnRFcnJvcjogXCLZitix2KzZiSDZhdmE2KEg2YXYpyDZhNinINmK2YLZhCDYudmGIHswfSDYp9mE2LXZgdmI2YFcIixcbiAgICBtaW5TZWxlY3RFcnJvcjogXCLZitix2KzZiSDYqtit2K/ZitivINmF2Kcg2YTYpyDZitmC2YQg2LnZhiB7MH0g2KfZhNmF2KrYutmK2LHYp9iqXCIsXG4gICAgbWF4U2VsZWN0RXJyb3I6IFwi2YrYsdis2Ykg2KrYrdiv2YrYryDZhdinINmE2Kcg2YrYstmK2K8g2LnZhiB7MH0g2KfZhNmF2KrYutmK2LHYp9iqXCIsXG4gICAgbnVtZXJpY01pbk1heDogXCLZiCd7MH0nINmK2KzYqCDYo9mGINiq2YPZiNmGINmF2LPYp9mI2YrYqSDYo9mIINij2YPYq9ixINmF2YYgezF9INmI2YrYs9in2YjZiiDYo9mIINij2YLZhCDZhdmGIHsyfdinXCIsXG4gICAgbnVtZXJpY01pbjogXCLZiCd7MH0nINmK2KzYqCDYo9mGINiq2YPZiNmGINmF2LPYp9mI2YrYqSDYo9mIINij2YPYq9ixINmF2YYgezF92KdcIixcbiAgICBudW1lcmljTWF4OiBcItmIJ3swfScg2YrYrNioINij2YYg2KrZg9mI2YYg2YXYs9in2YjZitipINij2Ygg2KPZgtmEINmF2YYgezF92KdcIixcbiAgICBpbnZhbGlkRW1haWw6IFwi2LHYrNin2KEg2YLZhSDYqNil2K/Yrtin2YQg2KjYsdmK2K8g2KfZhNmD2KrYsdmI2YbZiiDYtdit2YrYrVwiLFxuICAgIHVybFJlcXVlc3RFcnJvcjogXCLYt9mE2Kgg2KXYsdis2KfYuSDYrti32KMgJ3swfScuIHsxfdinXCIsXG4gICAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIti52KfYryDYt9mE2Kgg2KjZitin2YbYp9iqINmB2KfYsdi62Kkg2KPZiCAn2KfZhNmF2LPYp9ixJyDZhdmF2KrZhNmD2KfYqiDYutmK2LEg2LXYrdmK2K3YqSBcIixcbiAgICBleGNlZWRNYXhTaXplOiBcItmI2YrZhtio2LrZiiDYo9mE2Kcg2YrYqtis2KfZiNiyINit2KzZhSDYp9mE2YXZhNmBIHswfdinXCIsXG4gICAgb3RoZXJSZXF1aXJlZEVycm9yOiBcItin2YTYsdis2KfYoSDYpdiv2K7Yp9mEINmC2YrZhdipINij2K7YsdmJXCIsXG4gICAgdXBsb2FkaW5nRmlsZTogXCLYp9mE2YXZhNmBINin2YTYrtin2LUg2KjZgyDYqtit2YXZitmELiDZitix2KzZiSDYp9mE2KfZhtiq2LjYp9ixINi52K/YqSDYq9mI2KfZhiDZiNit2KfZiNmEINmF2LHYqSDYo9iu2LHZiVwiLFxuICAgIGFkZFJvdzogXCLYp9i22KfZgdipINi12YFcIixcbiAgICByZW1vdmVSb3c6IFwi2KXYstin2YTYqSDYtdmBXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiYXJcIl0gPSBhcmFiaWNTdXJ2ZXlTdHJpbmdzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9hcmFiaWMudHMiLCJpbXBvcnQge3N1cnZleUxvY2FsaXphdGlvbn0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBjemVjaFN1cnZleVN0cmluZ3MgPSB7XG4gICAgcGFnZVByZXZUZXh0OiBcIlDFmWVkY2hvesOtXCIsXG4gICAgcGFnZU5leHRUZXh0OiBcIkRhbMWhw61cIixcbiAgICBjb21wbGV0ZVRleHQ6IFwiSG90b3ZvXCIsXG4gICAgb3RoZXJJdGVtVGV4dDogXCJKaW7DoSBvZHBvdsSbxI8gKG5hcGnFoXRlKVwiLFxuICAgIHByb2dyZXNzVGV4dDogXCJTdHJhbmEgezB9IHogezF9XCIsXG4gICAgZW1wdHlTdXJ2ZXk6IFwiUHLFr3prdW11IG5lb2JzYWh1amUgxb7DoWRuw6kgb3TDoXpreS5cIixcbiAgICBjb21wbGV0aW5nU3VydmV5OiBcIkTEm2t1amVtZSB6YSB2eXBsbsSbbsOtIHByxa96a3VtdSFcIixcbiAgICBsb2FkaW5nU3VydmV5OiBcIlByb2LDrWjDoSBuYcSNw610w6Fuw60gcHLFr3prdW11Li4uXCIsXG4gICAgb3B0aW9uc0NhcHRpb246IFwiVnliZXIuLi5cIixcbiAgICByZXF1aXJlZEVycm9yOiBcIk9kcG92xJt6dGUgcHJvc8OtbSBuYSBvdMOhemt1LlwiLFxuICAgIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiT2Rwb3bEm3p0ZSBwcm9zw61tIG5hIHbFoWVjaG55IG90w6F6a3kuXCIsXG4gICAgbnVtZXJpY0Vycm9yOiBcIlYgdG9tdG8gcG9saSBsemUgemFkYXQgcG91emUgxI3DrXNsYS5cIixcbiAgICB0ZXh0TWluTGVuZ3RoOiBcIlphZGVqdGUgcHJvc8OtbSBhbGVzcG/FiCB7MH0gem5ha8WvLlwiLFxuICAgIHRleHRNYXhMZW5ndGg6IFwiWmFkZWp0ZSBwcm9zw61tIG3DqW7EmyBuZcW+IHswfSB6bmFrxa8uXCIsXG4gICAgdGV4dE1pbk1heExlbmd0aDogXCJaYWRlanRlIHByb3PDrW0gdsOtY2UgbmXFviB7MH0gYSBtw6luxJsgbmXFviB7MX0gem5ha8WvLlwiLFxuICAgIG1pblJvd0NvdW50RXJyb3I6IFwiVnlwbMWIdGUgcHJvc8OtbSBhbGVzcG/FiCB7MH0gxZnDoWRrxa8uXCIsXG4gICAgbWluU2VsZWN0RXJyb3I6IFwiVnliZXJ0ZSBwcm9zw61tIGFsZXNwb8WIIHswfSB2YXJpYW50eS5cIixcbiAgICBtYXhTZWxlY3RFcnJvcjogXCJOZXZ5YsOtcmVqdGUgcHJvc8OtbSB2w61jZSBuZcW+IHswfSB2YXJpYW50LlwiLFxuICAgIG51bWVyaWNNaW5NYXg6IFwiT2Rwb3bEm8SPICd7MH0nIGJ5IG3Em2xvIGLDvXQgdsSbdMWhw60gbmVibyByb3ZubyB7MX0gYSBtZW7FocOtIG5lYm8gcm92bm8gezJ9XCIsXG4gICAgbnVtZXJpY01pbjogXCJPZHBvdsSbxI8gJ3swfScgYnkgbcSbbG8gYsO9dCB2xJt0xaHDrSBuZWJvIHJvdm5vIHsxfVwiLFxuICAgIG51bWVyaWNNYXg6IFwiT2Rwb3bEm8SPICd7MH0nIGJ5IG3Em2xvIGLDvXQgbWVuxaHDrSBuZWJvIHJvdm5vIHsxfVwiLFxuICAgIGludmFsaWRFbWFpbDogXCJaYWRlanRlIHByb3PDrW0gcGxhdG5vdSBlLW1haWxvdm91IGFkcmVzdS5cIixcbiAgICB1cmxSZXF1ZXN0RXJyb3I6IFwiUG/FvmFkYXZlayB2csOhdGlsIGNoeWJ1ICd7MH0nLiB7MX1cIixcbiAgICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwiUG/FvmFkYXZlayBuZXZyw6F0aWwgZGF0YSBuZWJvIGNlc3RhIGplIG5lcGxhdG7DoVwiLFxuICAgIGV4Y2VlZE1heFNpemU6IFwiVmVsaWtvc3Qgc291Ym9ydSBieSBuZW3Em2xhIGLDvXQgdsSbdMWhw60gbmXFviB7MH0uXCIsXG4gICAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlphZGVqdGUgcHJvc8OtbSBqaW5vdSBob2Rub3R1LlwiLFxuICAgIHVwbG9hZGluZ0ZpbGU6IFwiVsOhxaEgc291Ym9yIHNlIG5haHLDoXbDoS4gWmt1c3RlIHRvIHByb3PDrW0gemEgbsSba29saWsgc2VrdW5kLlwiLFxuICAgIGFkZFJvdzogXCJQxZlpZGF0IMWZw6FkZWtcIixcbiAgICByZW1vdmVSb3c6IFwiT2RzdHJhbml0XCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiY3pcIl0gPSBjemVjaFN1cnZleVN0cmluZ3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2N6ZWNoLnRzIiwiaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgZGFuaXNoU3VydmV5U3RyaW5ncyA9IHtcbiAgICBwYWdlUHJldlRleHQ6IFwiVGlsYmFnZVwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCJWaWRlcmVcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwiRsOmcmRpZ1wiLFxuICAgIHByb2dyZXNzVGV4dDogXCJTaWRlIHswfSBhZiB7MX1cIixcbiAgICBlbXB0eVN1cnZleTogXCJEZXIgZXIgaW5nZW4gc3lubGlnZSBzcMO4cmdzbcOlbC5cIixcbiAgICBjb21wbGV0aW5nU3VydmV5OiBcIk1hbmdlIHRhayBmb3IgZGluIGJlc3ZhcmVsc2UhXCIsXG4gICAgbG9hZGluZ1N1cnZleTogXCJTcMO4cmdlc2tlbWFldCBoZW50ZXMgZnJhIHNlcnZlcmVuLi4uXCIsXG4gICAgb3RoZXJJdGVtVGV4dDogXCJWYWxnZnJpdCBzdmFyLi4uXCIsXG4gICAgb3B0aW9uc0NhcHRpb246IFwiVsOmbGcuLi5cIixcbiAgICByZXF1aXJlZEVycm9yOiBcIkJlc3ZhciB2ZW5saWdzdCBzcMO4cmdzbcOlbGV0LlwiLFxuICAgIG51bWVyaWNFcnJvcjogXCJBbmdpdiBldCB0YWwuXCIsXG4gICAgdGV4dE1pbkxlbmd0aDogXCJBbmdpdiBtaW5kc3QgezB9IHRlZ24uXCIsXG4gICAgbWluU2VsZWN0RXJyb3I6IFwiVsOmbGcgdmVubGlnc3QgbWluZHN0ICB7MH0gc3Zhcm11bGlnaGVkKGVyKS5cIixcbiAgICBtYXhTZWxlY3RFcnJvcjogXCJWw6ZsZyB2ZW5saWdzdCBmw6ZycmUgezB9IHN2YXJtdWxpZ2hlZGVyKGVyKS5cIixcbiAgICBudW1lcmljTWluTWF4OiBcIid7MH0nIHNrYWwgdsOmcmUgbGlnIG1lZCBlbGxlciBzdMO4cnJlIGVuZCB7MX0gb2cgbGlnIG1lZCBlbGxlciBtaW5kcmUgZW5kIHsyfVwiLFxuICAgIG51bWVyaWNNaW46IFwiJ3swfScgc2thbCB2w6ZyZSBsaWcgbWVkIGVsbGVyIHN0w7hycmUgZW5kIHsxfVwiLFxuICAgIG51bWVyaWNNYXg6IFwiJ3swfScgc2thbCB2w6ZyZSBsaWcgbWVkIGVsbGVyIG1pbmRyZSBlbmQgezF9XCIsXG4gICAgaW52YWxpZEVtYWlsOiBcIkFuZ2l2IHZlbmxpZ3N0IGVuIGd5bGRpZyBlLW1haWwgYWRyZXNzZS5cIixcbiAgICBleGNlZWRNYXhTaXplOiBcIkZpbHN0w7hycmVsc2VuIG3DpSBpa2tlIG92ZXJzdGlnZSB7MH0uXCIsXG4gICAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIkFuZ2l2IGVuIHbDpnJkaSBmb3IgZGl0IHZhbGdmcmllIHN2YXIuXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZGFcIl0gPSBkYW5pc2hTdXJ2ZXlTdHJpbmdzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9kYW5pc2gudHMiLCIvL0NyZWF0ZWQgb24gYmVoYWxmIGh0dHBzOi8vZ2l0aHViLmNvbS9GcmFuazEzXG5pbXBvcnQge3N1cnZleUxvY2FsaXphdGlvbn0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBkdXRjaFN1cnZleVN0cmluZ3MgPSB7XG4gICAgcGFnZVByZXZUZXh0OiBcIlZvcmlnZVwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCJWb2xnZW5kZVwiLFxuICAgIGNvbXBsZXRlVGV4dDogXCJBZnNsdWl0ZW5cIixcbiAgICBvdGhlckl0ZW1UZXh0OiBcIkFuZGVyZVwiLFxuICAgIHByb2dyZXNzVGV4dDogXCJQYWdpbmEgezB9IHZhbiB7MX1cIixcbiAgICBlbXB0eVN1cnZleTogXCJFciBpcyBnZWVuIHppY2h0YmFyZSBwYWdpbmEgb2YgdnJhYWcgaW4gZGV6ZSB2cmFnZW5saWpzdFwiLFxuICAgIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiQmVkYW5rdCBvbSBkZXplIHZyYWdlbmxpanN0IGluIHRlIHZ1bGxlblwiLFxuICAgIGxvYWRpbmdTdXJ2ZXk6IFwiRGUgdnJhZ2VubGlqc3QgaXMgYWFuIGhldCBsYWRlbi4uLlwiLFxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIktpZXMuLi5cIixcbiAgICByZXF1aXJlZEVycm9yOiBcIkdlbGlldmUgZWVuIGFudHdvb3JkIGluIHRlIHZ1bGxlblwiLFxuICAgIG51bWVyaWNFcnJvcjogXCJIZXQgYW50d29vcmQgbW9ldCBlZW4gZ2V0YWwgemlqblwiLFxuICAgIHRleHRNaW5MZW5ndGg6IFwiR2VsaWV2ZSBtaW5zdGVuIHswfSBrYXJha3RlcnMgaW4gdGUgdnVsbGVuLlwiLFxuICAgIG1pblNlbGVjdEVycm9yOiBcIkdlbGlldmUgbWluaW11bSB7MH0gYW50d29vcmRlbiB0ZSBzZWxlY3RlcmVuLlwiLFxuICAgIG1heFNlbGVjdEVycm9yOiBcIkdlbGlldmUgbmlldCBtZWVyIGRhbiB7MH0gYW50d29vcmRlbiB0ZSBzZWxlY3RlcmVuLlwiLFxuICAgIG51bWVyaWNNaW5NYXg6IFwiVXcgYW50d29vcmQgJ3swfScgbW9ldCBncm90ZXIgb2YgZ2VsaWprIHppam4gYWFuIHsxfSBlbiBrbGVpbmVyIG9mIGdlbGlqayBhYW4gezJ9XCIsXG4gICAgbnVtZXJpY01pbjogXCJVdyBhbnR3b29yZCAnezB9JyBtb2V0IGdyb3RlciBvZiBnZWxpamsgemlqbiBhYW4gezF9XCIsXG4gICAgbnVtZXJpY01heDogXCJVdyBhbnR3b29yZCAnezB9JyBtb2V0IGdyb3RlciBvZiBnZWxpamsgemlqbiBhYW4gezF9XCIsXG4gICAgaW52YWxpZEVtYWlsOiBcIkdlbGlldmUgZWVuIGdlbGRpZyBlLW1haWxhZHJlcyBpbiB0ZSB2dWxsZW4uXCIsXG4gICAgZXhjZWVkTWF4U2l6ZTogXCJEZSBncm9vdHRlIHZhbiBoZXQgYmVzdGFuZCBtYWcgbmlldCBncm90ZXIgemlqbiBkYW4gezB9LlwiLFxuICAgIG90aGVyUmVxdWlyZWRFcnJvcjogXCJHZWxpZXZlIGhldCB2ZWxkICdBbmRlcmUnIGluIHRlIHZ1bGxlblwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcIm5sXCJdID0gZHV0Y2hTdXJ2ZXlTdHJpbmdzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9kdXRjaC50cyIsImltcG9ydCB7c3VydmV5TG9jYWxpemF0aW9ufSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGZpbm5pc2hTdXJ2ZXlTdHJpbmdzID0ge1xuICAgIHBhZ2VQcmV2VGV4dDogXCJFZGVsbGluZW5cIixcbiAgICBwYWdlTmV4dFRleHQ6IFwiU2V1cmFhdmFcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwiVmFsbWlzXCIsXG4gICAgb3RoZXJJdGVtVGV4dDogXCJNdXUgKGt1dmFpbGUpXCIsXG4gICAgcHJvZ3Jlc3NUZXh0OiBcIlNpdnUgezB9L3sxfVwiLFxuICAgIGVtcHR5U3VydmV5OiBcIlTDpHNzw6Qga3lzZWx5c3PDpCBlaSBvbGUgeWh0w6Rrw6TDpG4gbsOka3l2aWxsw6Qgb2xldmFhIHNpdnVhIHRhaSBreXN5bXlzdMOkLlwiLFxuICAgIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiS2lpdG9zIGt5c2VseXluIHZhc3RhYW1pc2VzdGEhXCIsXG4gICAgbG9hZGluZ1N1cnZleTogXCJLeXNlbHnDpCBsYWRhdGFhbiBwYWx2ZWxpbWVsdGEuLi5cIixcbiAgICBvcHRpb25zQ2FwdGlvbjogXCJWYWxpdHNlLi4uXCIsXG4gICAgcmVxdWlyZWRFcnJvcjogXCJWYXN0YWEga3lzeW15a3NlZW4sIGtpaXRvcy5cIixcbiAgICBudW1lcmljRXJyb3I6IFwiQXJ2b24gdHVsZWUgb2xsYSBudW1lZXJpbmVuLlwiLFxuICAgIHRleHRNaW5MZW5ndGg6IFwiT2xlIGh5dsOkIGphIHN5w7Z0w6QgdsOkaGludMOkw6RuIHswfSBtZXJra2nDpC5cIixcbiAgICBtaW5TZWxlY3RFcnJvcjogXCJPbGUgaHl2w6QgamEgdmFsaXRzZSB2w6RoaW50w6TDpG4gezB9IHZhaWh0b2VodG9hLlwiLFxuICAgIG1heFNlbGVjdEVycm9yOiBcIk9sZSBoeXbDpCBqYSB2YWxpdHNlIGVuaW50w6TDpG4gezB9IHZhaWh0b2VodG9hLlwiLFxuICAgIG51bWVyaWNNaW5NYXg6IFwiJ3swfScgdMOkeXR5eSBvbGxhIGVuZW1tw6RuIHRhaSB5aHTDpCBzdXVyaSBrdWluIHsxfSBqYSB2w6RoZW1tw6RuIHRhaSB5aHTDpCBzdXVyaSBrdWluIHsyfVwiLFxuICAgIG51bWVyaWNNaW46IFwiJ3swfScgdMOkeXR5eSBvbGxhIGVuZW1tw6RuIHRhaSB5aHTDpCBzdXVyaSBrdWluIHsxfVwiLFxuICAgIG51bWVyaWNNYXg6IFwiJ3swfScgdMOkeXR5eSBvbGxhIHbDpGhlbW3DpG4gdGFpIHlodMOkIHN1dXJpIGt1aW4gezF9XCIsXG4gICAgaW52YWxpZEVtYWlsOiBcIlN5w7Z0w6QgdmFsaWRpIHPDpGhrw7Zwb3N0aW9zb2l0ZS5cIixcbiAgICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiT2xlIGh5dsOkIGphIHN5w7Z0w6QgXFxcIk11dSAoa3V2YWlsZSlcXFwiXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZmlcIl0gPSBmaW5uaXNoU3VydmV5U3RyaW5ncztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vZmlubmlzaC50cyIsIi8vQ3JlYXRlZCBvbiBiZWhhbGYgaHR0cHM6Ly9naXRodWIuY29tL0ZyYW5rMTNcbmltcG9ydCB7c3VydmV5TG9jYWxpemF0aW9ufSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGZyZW5jaFN1cnZleVN0cmluZ3MgPSB7XG4gICAgcGFnZVByZXZUZXh0OiBcIlByXFx1MDBlOWNcXHUwMGU5ZGVudFwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCJTdWl2YW50XCIsXG4gICAgY29tcGxldGVUZXh0OiBcIlRlcm1pbmVyXCIsXG4gICAgb3RoZXJJdGVtVGV4dDogXCJBdXRyZSAocHJcXHUwMGU5Y2lzZXIpXCIsXG4gICAgcHJvZ3Jlc3NUZXh0OiBcIlBhZ2UgezB9IHN1ciB7MX1cIixcbiAgICBlbXB0eVN1cnZleTogXCJJbCBuJ3kgYSBuaSBwYWdlIHZpc2libGUgbmkgcXVlc3Rpb24gdmlzaWJsZSBkYW5zIGNlIHF1ZXN0aW9ubmFpcmVcIixcbiAgICBjb21wbGV0aW5nU3VydmV5OiBcIk1lcmNpIGQnYXZvaXIgclxcdTAwZTlwb25kdSBhdSBxdWVzdGlvbm5haXJlIVwiLFxuICAgIGxvYWRpbmdTdXJ2ZXk6IFwiTGUgcXVlc3Rpb25uYWlyZSBlc3QgZW4gY291cnMgZGUgY2hhcmdlbWVudC4uLlwiLFxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIkNob2lzaXNzZXouLi5cIixcbiAgICByZXF1aXJlZEVycm9yOiBcIkxhIHJcXHUwMGU5cG9uc2UgXFx1MDBlMCBjZXR0ZSBxdWVzdGlvbiBlc3Qgb2JsaWdhdG9pcmUuXCIsXG4gICAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJUb3V0ZXMgbGVzIGxpZ25lcyBzb250IG9ibGlnYXRvaXJlc1wiLFxuICAgIG51bWVyaWNFcnJvcjogXCJMYSByXFx1MDBlOXBvbnNlIGRvaXQgXFx1MDBlYXRyZSB1biBub21icmUuXCIsXG4gICAgdGV4dE1pbkxlbmd0aDogXCJNZXJjaSBkJ2VudHJlciBhdSBtb2lucyB7MH0gc3ltYm9sZXMuXCIsXG4gICAgbWluU2VsZWN0RXJyb3I6IFwiTWVyY2kgZGUgc1xcdTAwZTlsZWN0aW9ubmVyIGF1IG1vaW5zIHswfXJcXHUwMGU5cG9uc2VzLlwiLFxuICAgIG1heFNlbGVjdEVycm9yOiBcIk1lcmNpIGRlIHNcXHUwMGU5bGVjdGlvbm5lciBhdSBwbHVzIHswfXJcXHUwMGU5cG9uc2VzLlwiLFxuICAgIG51bWVyaWNNaW5NYXg6IFwiVm90cmUgclxcdTAwZTlwb25zZSAnezB9JyBkb2l0IFxcdTAwZWF0cmVzdXBcXHUwMGU5cmlldXJlIG91IFxcdTAwZTlnYWxlIFxcdTAwZTAgezF9IGV0IGluZlxcdTAwZTlyaWV1cmUgb3VcXHUwMGU5Z2FsZSBcXHUwMGUwIHsyfVwiLFxuICAgIG51bWVyaWNNaW46IFwiVm90cmUgclxcdTAwZTlwb25zZSAnezB9JyBkb2l0IFxcdTAwZWF0cmVzdXBcXHUwMGU5cmlldXJlIG91IFxcdTAwZTlnYWxlIFxcdTAwZTAgezF9XCIsXG4gICAgbnVtZXJpY01heDogXCJWb3RyZSByXFx1MDBlOXBvbnNlICd7MH0nIGRvaXQgXFx1MDBlYXRyZWluZlxcdTAwZTlyaWV1cmUgb3UgXFx1MDBlOWdhbGUgXFx1MDBlMCB7MX1cIixcbiAgICBpbnZhbGlkRW1haWw6IFwiTWVyY2kgZCdlbnRyZXIgdW5lIGFkcmVzc2UgbWFpbCB2YWxpZGUuXCIsXG4gICAgZXhjZWVkTWF4U2l6ZTogXCJMYSB0YWlsbGUgZHUgZmljaGllciBuZSBkb2l0IHBhcyBleGNcXHUwMGU5ZGVyIHswfS5cIixcbiAgICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiTWVyY2kgZGUgcHJcXHUwMGU5Y2lzZXIgbGUgY2hhbXAgJ0F1dHJlJy5cIlxufTtcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZnJcIl0gPSBmcmVuY2hTdXJ2ZXlTdHJpbmdzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9mcmVuY2gudHMiLCJpbXBvcnQge3N1cnZleUxvY2FsaXphdGlvbn0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBnZXJtYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICAgIHBhZ2VQcmV2VGV4dDogXCJadXLDvGNrXCIsXG4gICAgcGFnZU5leHRUZXh0OiBcIldlaXRlclwiLFxuICAgIGNvbXBsZXRlVGV4dDogXCJBYnNlbmRlblwiLFxuICAgIHByb2dyZXNzVGV4dDogXCJTZWl0ZSB7MH0gdm9uIHsxfVwiLFxuICAgIGVtcHR5U3VydmV5OiBcIkVzIGdpYnQga2VpbmUgc2ljaHRiYXJlIEZyYWdlLlwiLFxuICAgIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiVmllbGVuIERhbmsgZsO8ciBkaWUgQmVhbnR3b3J0dW5nIGRlcyBGcmFnZWJvZ2VucyFcIixcbiAgICBsb2FkaW5nU3VydmV5OiBcIkRlciBGcmFnZWJvZ2VuIHdpcmQgdm9tIFNlcnZlciBnZWxhZGVuLi4uXCIsXG4gICAgb3RoZXJJdGVtVGV4dDogXCJCZW51dHplcmRlZmluaWVydGUgQW50d29ydC4uLlwiLFxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIlfDpGhsZW4uLi5cIixcbiAgICByZXF1aXJlZEVycm9yOiBcIkJpdHRlIGJlYW50d29ydGVuIFNpZSBkaWVzZSBGcmFnZS5cIixcbiAgICBudW1lcmljRXJyb3I6IFwiRGVyIFdlcnQgc29sbHRlIGVpbmUgWmFobCBzZWluLlwiLFxuICAgIHRleHRNaW5MZW5ndGg6IFwiQml0dGUgZ2ViZW4gU2llIG1pbmRlc3RlbnMgezB9IFplaWNoZW4gZWluLlwiLFxuICAgIG1pblNlbGVjdEVycm9yOiBcIkJpdHRlIHfDpGhsZW4gU2llIG1pbmRlc3RlbnMgezB9IEVpbnRyw6RnZS5cIixcbiAgICBtYXhTZWxlY3RFcnJvcjogXCJCaXR0ZSB3w6RobGVuIFNpZSBuaWNodCBtZWhyIGFscyB7MH0gRWludHLDpGdlLlwiLFxuICAgIG51bWVyaWNNaW5NYXg6IFwiJ3swfScgc29sbHRlIGdsZWljaCBvZGVyIGdyw7bDn2VyIHNlaW4gYWxzIHsxfSB1bmQgZ2xlaWNoIG9kZXIga2xlaW5lciBhbHMgezJ9LlwiLFxuICAgIG51bWVyaWNNaW46IFwiJ3swfScgc29sbHRlIGdsZWljaCBvZGVyIGdyw7bDn2VyIHNlaW4gYWxzIHsxfS5cIixcbiAgICBudW1lcmljTWF4OiBcIid7MH0nIHNvbGx0ZSBnbGVpY2ggb2RlciBrbGVpbmVyIGFscyB7MX0gc2Vpbi5cIixcbiAgICBpbnZhbGlkRW1haWw6IFwiQml0dGUgZ2ViZW4gU2llIGVpbmUgZ8O8bHRpZ2UgRS1NYWlsIEFkcmVzc2UgZWluLlwiLFxuICAgIGV4Y2VlZE1heFNpemU6IFwiRGllIERhdGVpZ3LDtsOfZSBkYXJmIHswfSBLQiBuaWNodCDDvGJlcnNjaHJlaXRlbi5cIixcbiAgICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiQml0dGUgZ2ViZW4gU2llIElocmUgYmVudXR6ZXJkZWZpbmllcnRlIEFudHdvcnQgZWluLlwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImRlXCJdID0gZ2VybWFuU3VydmV5U3RyaW5ncztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vZ2VybWFuLnRzIiwiLy9DcmVhdGVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9hZ2Vsb3NwYW5hZ2lvdGFraXNcbmltcG9ydCB7c3VydmV5TG9jYWxpemF0aW9ufSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGdyZWVrU3VydmV5U3RyaW5ncyA9IHtcbiAgICBwYWdlUHJldlRleHQ6IFwizqDPgc6/zrfOs86/z43OvM61zr3Ov1wiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCLOlc+Az4zOvM61zr3Ov1wiLFxuICAgIGNvbXBsZXRlVGV4dDogXCLOn867zr/Ous67zq7Pgc+Jz4POt1wiLFxuICAgIG90aGVySXRlbVRleHQ6IFwizobOu867zr8gKM+AzrHPgc6xzrrOsc67z44gzrTOuc61z4XOus+BzrnOvc6vz4PPhM61KVwiLFxuICAgIHByb2dyZXNzVGV4dDogXCLOo861zrvOr860zrEgezB9IM6xz4DPjCB7MX1cIixcbiAgICBlbXB0eVN1cnZleTogXCLOlM61zr0gz4XPgM6sz4HPh861zrkgzrrOsc68zq/OsSDOv8+BzrHPhM6uIM+DzrXOu86vzrTOsSDOriDOv8+BzrHPhM6uIM61z4HPjs+EzrfPg863IM+DzrUgzrHPhc+Ez4wgz4TOvyDOtc+Bz4nPhM63zrzOsc+Ezr/Ou8+MzrPOuc6/LlwiLFxuICAgIGNvbXBsZXRpbmdTdXJ2ZXk6IFwizpXPhc+HzrHPgc65z4PPhM6/z43OvM61IM6zzrnOsSDPhM63zr0gz4PPhc68z4DOu86uz4HPic+DzrcgzrHPhc+Ezr/PhSDPhM6/z4UgzrXPgc+Jz4TOt868zrHPhM6/zrvOv86zzq/Ov8+FIVwiLFxuICAgIGxvYWRpbmdTdXJ2ZXk6IFwizqTOvyDOtc+Bz4nPhM63zrzOsc+Ezr/Ou8+MzrPOuc6/IM+Gzr/Pgc+Ez47Ovc61z4TOsc65IM6xz4DOvyDPhM6/IM60zrnOsc66zr/OvM65z4PPhM6uLi4uXCIsXG4gICAgb3B0aW9uc0NhcHRpb246IFwizpXPgM65zrvOrc6+z4TOtS4uLlwiLFxuICAgIHJlcXVpcmVkRXJyb3I6IFwizqDOsc+BzrHOus6xzrvPjiDOsc+AzrHOvc+Ezq7Pg8+EzrUgz4PPhM63zr0gzrXPgc+Oz4TOt8+DzrcuXCIsXG4gICAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLOoM6xz4HOsc66zrHOu8+OIM6xz4DOsc69z4TOrs+Dz4TOtSDPg8+EzrnPgiDOtc+Bz4nPhM6uz4POtc65z4Igz4POtSDPjM67zrXPgiDPhM65z4IgzrPPgc6xzrzOvM6tz4IuXCIsXG4gICAgbnVtZXJpY0Vycm9yOiBcIs6XIM+EzrnOvM6uIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgzrHPgc65zrjOvM65z4TOuc66zq4uXCIsXG4gICAgdGV4dE1pbkxlbmd0aDogXCLOoM6xz4HOsc66zrHOu8+OIM+Dz4XOvM+AzrvOt8+Bz47Pg8+EzrUgz4TOv8+FzrvOrM+HzrnPg8+Ezr/OvSB7MH0gz4PPjc68zrLOv867zrEuXCIsXG4gICAgbWluUm93Q291bnRFcnJvcjogXCLOoM6xz4HOsc66zrHOu8+OIM+Dz4XOvM+AzrvOt8+Bz47Pg8+EzrUgz4TOv8+FzrvOrM+HzrnPg8+Ezr/OvSB7MH0gzrPPgc6xzrzOvM6tz4IuXCIsXG4gICAgbWluU2VsZWN0RXJyb3I6IFwizqDOsc+BzrHOus6xzrvPjiDOtc+AzrnOu86tzr7PhM61IM+Ezr/Phc67zqzPh865z4PPhM6/zr0gezB9IM+AzrHPgc6xzrvOu86xzrPOrc+CLlwiLFxuICAgIG1heFNlbGVjdEVycm9yOiBcIs6gzrHPgc6xzrrOsc67z44gzrXPgM65zrvOrc6+z4TOtSDPjM+Hzrkgz4DOsc+BzrHPgM6szr3PiSDOsc+Azr8gezB9IM+AzrHPgc6xzrvOu86xzrPOrc+CLlwiLFxuICAgIG51bWVyaWNNaW5NYXg6IFwizqTOvyAnezB9JyDOuM6xIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgzq/Pg86/IM6uIM68zrXOs86xzrvPjc+EzrXPgc6/IM6xz4DOvyDPhM6/IHsxfSDOus6xzrkgzq/Pg86/IM6uIM68zrnOus+Bz4zPhM61z4HOvyDOsc+Azr8gz4TOvyB7Mn1cIixcbiAgICBudW1lcmljTWluOiBcIs6kzr8gJ3swfScgz4DPgc6tz4DOtc65IM69zrEgzrXOr869zrHOuSDOvM61zrPOsc67z43PhM61z4HOvyDOriDOuc+Dzr8gzrzOtSDPhM6/IHsxfVwiLFxuICAgIG51bWVyaWNNYXg6IFwizqTOvyAnezB9JyDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM68zrnOus+Bz4zPhM61z4HOvyDOriDOr8+Dzr8gzrHPgM6/IM+Ezr8gezF9XCIsXG4gICAgaW52YWxpZEVtYWlsOiBcIs6gzrHPgc6xzrrOsc67z44gzrTPjs+Dz4TOtSDOvM65zrEgzrHPgM6/zrTOtc66z4TOriDOtM65zrXPjc64z4XOvc+DzrcgZS1tYWlsLlwiLFxuICAgIHVybFJlcXVlc3RFcnJvcjogXCLOlyDOsc6vz4TOt8+DzrcgzrXPgM6tz4PPhM+BzrXPiM61IM+Dz4bOrM67zrzOsSAnezB9Jy4gezF9XCIsXG4gICAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIs6XIM6xzq/PhM63z4POtyDOtc+Azq3Pg8+Ez4HOtc+IzrUgzrrOtc69zqwgzrTOtc60zr/OvM6tzr3OsSDOriDOtyDOuc60z4zPhM63z4TOsSAnzrzOv869zr/PgM6sz4TOuS9wYXRoJyDOtc6vzr3Osc65IM61z4PPhs6xzrvOrc68zq3Ovc63XCIsXG4gICAgZXhjZWVkTWF4U2l6ZTogXCLOpM6/IM68zq3Os861zrjOv8+CIM60zrXOvSDOvM+Azr/Pgc61zq8gzr3OsSDPhc+AzrXPgc6yzq3Ovc61zrkgz4TOsSB7MH0uXCIsXG4gICAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIs6gzrHPgc6xzrrOsc67z44gz4PPhc68z4DOu863z4HPjs+Dz4TOtSDPhM63zr0gz4TOuc68zq4gzrPOuc6xIM+Ezr8gz4DOtc60zq/OvyAnzqzOu867zr8nLlwiLFxuICAgIHVwbG9hZGluZ0ZpbGU6IFwizqTOvyDOsc+Bz4fOtc6vzr8gz4POsc+CIM6xzr3Otc6yzrHOr869zrXOuS4gzqDOsc+BzrHOus6xzrvPjiDPgM61z4HOuc68zq3Ovc61z4TOtSDOus6xz4DOv865zrEgzrTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xIM66zrHOuSDOtM6/zrrOuc68zqzPg8+EzrUgzr7Osc69zqwuXCIsXG4gICAgYWRkUm93OiBcIs6gz4HOv8+DzrjOrs66zrcgzrPPgc6xzrzOvM6uz4JcIixcbiAgICByZW1vdmVSb3c6IFwizpHPhs6xzq/Pgc61z4POt1wiXG59O1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJnclwiXSA9IGdyZWVrU3VydmV5U3RyaW5ncztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vZ3JlZWsudHMiLCJpbXBvcnQge3N1cnZleUxvY2FsaXphdGlvbn0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBodW5nYXJpYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICAgIHBhZ2VQcmV2VGV4dDogXCJWaXNzemFcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwiVG92w6FiYlwiLFxuICAgIGNvbXBsZXRlVGV4dDogXCJLw6lzelwiLFxuICAgIG90aGVySXRlbVRleHQ6IFwiRWd5w6liIChhZGphIG1lZylcIixcbiAgICBwcm9ncmVzc1RleHQ6IFwiezB9Li97MX0gb2xkYWxcIixcbiAgICBlbXB0eVN1cnZleTogXCJUaGVyZSBpcyBubyB2aXNpYmxlIHBhZ2Ugb3IgcXVlc3Rpb24gaW4gdGhlIHN1cnZleS5cIixcbiAgICBjb21wbGV0aW5nU3VydmV5OiBcIkvDtnN6w7ZuasO8aywgaG9neSBraXTDtmx0w7Z0dGUgZmVsbcOpcsOpc8O8bmtldCFcIixcbiAgICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOiBcIk3DoXIga2l0w7ZsdMO2dHRlIGEgZmVsbcOpcsOpc3QuXCIsXG4gICAgbG9hZGluZ1N1cnZleTogXCJGZWxtw6lyw6lzIGJldMO2bHTDqXNlLi4uXCIsXG4gICAgb3B0aW9uc0NhcHRpb246IFwiVsOhbGFzc3pvbi4uLlwiLFxuICAgIHZhbHVlOiBcIsOpcnTDqWtcIixcbiAgICByZXF1aXJlZEVycm9yOiBcIkvDqXJqw7xrLCB2w6FsYXN6b2xqYSBtZWcgZXp0IGEga8OpcmTDqXN0IVwiLFxuICAgIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiS8OpcmrDvGsgYWRqb24gdsOhbGFzenQgbWluZGVuIHNvcmJhbiFcIixcbiAgICBudW1lcmljRXJyb3I6IFwiQXogw6lydMOpayBzesOhbSBrZWxsLCBob2d5IGxlZ3llbiFcIixcbiAgICB0ZXh0TWluTGVuZ3RoOiBcIkFkam9uIG1lZyBsZWdhbMOhYmIgezB9IGthcmFrdGVydCFcIixcbiAgICB0ZXh0TWF4TGVuZ3RoOiBcIkxlZ2ZlbGplYmIgezB9IGthcmFrdGVydCBhZGpvbiBtZWchXCIsXG4gICAgdGV4dE1pbk1heExlbmd0aDogXCJBZGpvbiBtZWcgbGVnYWzDoWJiIHswfSwgZGUgbGVnZmVsamViYiB7MX0ga2FyYWt0ZXJ0IVwiLFxuICAgIG1pblJvd0NvdW50RXJyb3I6IFwiVMO2bHRzw7ZuIGtpIG1pbmltdW0gezB9IHNvcnQhXCIsXG4gICAgbWluU2VsZWN0RXJyb3I6IFwiVsOhbGFzc3pvbiBraSBsZWdhbMOhYmIgezB9IGxlaGV0xZFzw6lnZXQhXCIsXG4gICAgbWF4U2VsZWN0RXJyb3I6IFwiTmUgdsOhbGFzc3pvbiB0w7ZiYmV0LCBtaW50IHswfSBsZWhldMWRc8OpZyFcIixcbiAgICBudW1lcmljTWluTWF4OiBcIid7MH0nIGxlZ3llbiBuYWd5b2JiLCB2YWd5IGVneWVubMWRLCBtaW50IHsxfSDDqXMga2lzZWJiLCB2YWd5IGVneWVubMWRLCBtaW50IHsyfSFcIixcbiAgICBudW1lcmljTWluOiBcIid7MH0nIGxlZ3llbiBsZWdhbMOhYmIgezF9IVwiLFxuICAgIG51bWVyaWNNYXg6IFwiVGhlICd7MH0nIG5lIGxlZ3llbiBuYWd5b2JiLCBtaW50IHsxfSFcIixcbiAgICBpbnZhbGlkRW1haWw6IFwiQWRqb24gbWVnIGVneSB2YWzDs3MgZW1haWwgY8OtbWV0IVwiLFxuICAgIHVybFJlcXVlc3RFcnJvcjogXCJBIGxla8OpcmRlesOpcyBoaWLDoXZhbCB0w6lydCB2aXNzemE6ICd7MH0nLiB7MX1cIixcbiAgICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwiQSBsZWvDqXJkZXrDqXMgw7xyZXMgYWRhdHRhbCB0w6lydCB2aXNzemEsIHZhZ3kgYSAncGF0aCcgcGFyYW3DqXRlciBoZWx5dGVsZW4uXCIsXG4gICAgZXhjZWVkTWF4U2l6ZTogXCJBIG3DqXJldCBuZW0gbGVoZXQgbmFneW9iYiwgbWludCB7MH0uXCIsXG4gICAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIkFkamEgbWVnIGF6IGVnecOpYiDDqXJ0w6lrZXQhXCIsXG4gICAgdXBsb2FkaW5nRmlsZTogXCJGZWx0w7ZsdMOpcyBmb2x5YW1hdGJhbi4gVsOhcmpvbiBww6FyIG3DoXNvZHBlcmNldCwgbWFqZCBwcsOzYsOhbGphIMO6anJhLlwiLFxuICAgIGNvbmZpcm1EZWxldGU6IFwiVMO2cmxpIGV6dCBhIHJla29yZG90P1wiLFxuICAgIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiQXogw6lydMOpa25layBlZ3llZGluZWsga2VsbCBsZW5uaWUuXCIsXG4gICAgYWRkUm93OiBcIlNvciBob3p6w6FhZMOhc2FcIixcbiAgICByZW1vdmVSb3c6IFwiRWx0w6F2b2zDrXTDoXNcIixcbiAgICBhZGRQYW5lbDogXCLDmmogaG96esOhYWTDoXNhXCIsXG4gICAgcmVtb3ZlUGFuZWw6IFwiRWx0w6F2b2zDrXTDoXNcIixcbiAgICBjaG9pY2VzX0l0ZW06IFwiZWxlbVwiLFxuICAgIG1hdHJpeF9jb2x1bW46IFwiT3N6bG9wXCIsXG4gICAgbWF0cml4X3JvdzogXCJTb3JcIixcbiAgICBzYXZpbmdEYXRhOiBcIkVyZWRtw6lueSBtZW50w6lzZSBhIHN6ZXJ2ZXJyZS4uLlwiLFxuICAgIHNhdmluZ0RhdGFFcnJvcjogXCJFZ3kgaGliYSBmb2x5dMOhbiBuZW0gdHVkdHVrIGVsbWVudGVuaSBheiBlcmVkbcOpbnl0LlwiLFxuICAgIHNhdmluZ0RhdGFTdWNjZXNzOiBcIkVyZWRtw6lueSBzaWtlcmVzZW4gbWVudHZlIVwiLFxuICAgIHNhdmVBZ2FpbkJ1dHRvbjogXCJQcsOzYsOhbGphIMO6anJhXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiaHVcIl0gPSBodW5nYXJpYW5TdXJ2ZXlTdHJpbmdzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9odW5nYXJpYW4udHMiLCJpbXBvcnQge3N1cnZleUxvY2FsaXphdGlvbn0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBpY2VsYW5kaWNTdXJ2ZXlTdHJpbmdzID0ge1xuICAgIHBhZ2VQcmV2VGV4dDogXCJUaWxiYWthXCIsXG4gICAgcGFnZU5leHRUZXh0OiBcIsOBZnJhbVwiLFxuICAgIGNvbXBsZXRlVGV4dDogXCJMb2tpw7BcIixcbiAgICBvdGhlckl0ZW1UZXh0OiBcIkhpbm4gKHNrw71yaW5nKVwiLFxuICAgIHByb2dyZXNzVGV4dDogXCJTw63DsGEgezB9IG9mIHsxfVwiLFxuICAgIGVtcHR5U3VydmV5OiBcIsOeYcOwIGVyIGVuZ2lubiBzw63DsGEgZcOwYSBzcHVybmluZ2FyIMOtIMO+ZXNzYXJpIGvDtm5udW4uXCIsXG4gICAgY29tcGxldGluZ1N1cnZleTogXCJUYWtrIGZ5cmlyIGHDsCBmeWxsamEgw7p0IMO+ZXNzYSBrw7ZubnVuIVwiLFxuICAgIGxvYWRpbmdTdXJ2ZXk6IFwiS8O2bm51bmluIGVyIGHDsCBobGHDsGEuLi5cIixcbiAgICBvcHRpb25zQ2FwdGlvbjogXCJWZWxkdS4uLlwiLFxuICAgIHJlcXVpcmVkRXJyb3I6IFwiVmluc2FtbGVnYXN0IHN2YXJpw7Agc3B1cm5pbmd1bm5pLlwiLFxuICAgIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiVmluc2FtbGVnYXN0IHN2YXJpw7Agc3B1cm5pbmd1bSDDrSDDtmxsdW0gcsO2w7B1bS5cIixcbiAgICBudW1lcmljRXJyb3I6IFwiw55ldHRhIGdpbGRpIHZlcsOwdXIgYcOwIHZlcmEgdGFsYS5cIixcbiAgICB0ZXh0TWluTGVuZ3RoOiBcIsOeYcOwIMOmdHRpIGHDsCB2ZXJhIG1pbm5zdCB7MH0gdMOha24uXCIsXG4gICAgdGV4dE1heExlbmd0aDogXCLDnmHDsCDDpnR0aSBhw7AgdmVyYSBtZXN0IHswfSB0w6Frbi5cIixcbiAgICB0ZXh0TWluTWF4TGVuZ3RoOiBcIsOeYcOwIMOmdHRpIGHDsCB2ZXJhIGZsZWlyaSBlbiB7MH0gb2cgZsOmcnJpIGVuIHsxfSB0w6Frbi5cIixcbiAgICBtaW5Sb3dDb3VudEVycm9yOiBcIlZpbnNhbWxlZ2FzdCBmeWxsacOwIMO6ciBhw7AgbWlubnN0YSBrb3N0aSB7MH0gcmHDsGlyLlwiLFxuICAgIG1pblNlbGVjdEVycm9yOiBcIlZpbnNhbWxlZ2FzdCB2ZWxqacOwIGHDsCBtaW5uc3RhIGtvc3RpIHswfSBtw7ZndWxlaWthLlwiLFxuICAgIG1heFNlbGVjdEVycm9yOiBcIlZpbnNhbWxlZ2FzdCB2ZWxqacOwIGVra2kgZmxlaXJpIGVuIHswfSBtw7ZndWxlaWthLlwiLFxuICAgIG51bWVyaWNNaW5NYXg6IFwiJ3swfScgw6Z0dGkgYcOwIHZlcmEgbWVpcmEgZW4gZcOwYSBqYWZudCBvZyB7MX0gbWlubmEgZW4gZcOwYSBqYWZudCBvZyB7Mn1cIixcbiAgICBudW1lcmljTWluOiBcInswfScgw6Z0dGkgYcOwIHZlcmEgbWVpcmEgZW4gZcOwYSBqYWZudCBvZyB7MX1cIixcbiAgICBudW1lcmljTWF4OiBcIid7MH0nIMOmdHRpIGHDsCB2ZXJhIG1pbm5hIGVuIGXDsGEgamFmbnQgb2cgezF9XCIsXG4gICAgaW52YWxpZEVtYWlsOiBcIlZpbnNhbWxlZ2FzdCBzbMOhacOwIGlubiBnaWx0IG5ldGZhbmcuXCIsXG4gICAgdXJsUmVxdWVzdEVycm9yOiBcIkJlacOwbmlubiBza2lsYcOwaSBlZnRpcmZhcmFuYWRpIHZpbGx1ICd7MH0nLiB7MX1cIixcbiAgICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwiQmVpw7BuaW5uZyBza2lsYcOwaSBlbmd1bSBnw7ZnbnVtIGXDsGEgc2zDs8OwaW5uIHZhciByw7ZuZ1wiLFxuICAgIGV4Y2VlZE1heFNpemU6IFwiU2tyw6Fpbm4gc2thbCBla2tpIHZlcmEgc3TDpnJyaSBlbiB7MH0uXCIsXG4gICAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlZpbmFtbGVnYXN0IGZ5bGxpw7Agw7p0IGhpdHQgZ2lsZGnDsC5cIixcbiAgICB1cGxvYWRpbmdGaWxlOiBcIlNrcsOhaW5uIMO+w61uIHZhciBzZW5kLiBWaW5zYW1sZWdhc3QgYsOtw7Bpw7Agw60gbm9ra3JhciBzZWvDum5kdXIgb2cgcmV5bmnDsCBhZnR1ci5cIixcbiAgICBhZGRSb3c6IFwiQsOmdGEgdmnDsCByw7bDsFwiLFxuICAgIHJlbW92ZVJvdzogXCJGamFybMOmZ2phXCIsXG4gICAgY2hvaWNlc19maXJzdEl0ZW06IFwiZnlyc3RpIGhsdXR1clwiLFxuICAgIGNob2ljZXNfc2Vjb25kSXRlbTogXCJhbm5hciBobHV0dXJcIixcbiAgICBjaG9pY2VzX3RoaXJkSXRlbTogXCLDvnJpw7BqaSBobHV0dXJcIixcbiAgICBtYXRyaXhfY29sdW1uOiBcIkTDoWxrdXJcIixcbiAgICBtYXRyaXhfcm93OiBcIlLDtsOwXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiaXNcIl0gPSBpY2VsYW5kaWNTdXJ2ZXlTdHJpbmdzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9pY2VsYW5kaWMudHMiLCJpbXBvcnQge3N1cnZleUxvY2FsaXphdGlvbn0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBpdGFsaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgICBwYWdlUHJldlRleHQ6IFwiUHJlY2VkZW50ZVwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCJTdWNjZXNzaXZvXCIsXG4gICAgY29tcGxldGVUZXh0OiBcIlNhbHZhXCIsXG4gICAgb3RoZXJJdGVtVGV4dDogXCJBbHRybyAoZGVzY3JpdmkpXCIsXG4gICAgcHJvZ3Jlc3NUZXh0OiBcIlBhZ2luYSB7MH0gZGkgezF9XCIsXG4gICAgZW1wdHlTdXJ2ZXk6IFwiTm9uIGNpIHNvbm8gcGFnaW5lIG8gZG9tYW5kZSB2aXNpYmlsaSBuZWwgcXVlc3Rpb25hcmlvLlwiLFxuICAgIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiR3JhemllIHBlciBhdmVyIGNvbXBsZXRhdG8gaWwgcXVlc3Rpb25hcmlvIVwiLFxuICAgIGxvYWRpbmdTdXJ2ZXk6IFwiQ2FyaWNhbWVudG8gZGVsIHF1ZXN0aW9uYXJpbyBpbiBjb3Jzby4uLlwiLFxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIlNjZWdsaS4uLlwiLFxuICAgIHJlcXVpcmVkRXJyb3I6IFwiQ2FtcG8gb2JibGlnYXRvcmlvXCIsXG4gICAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJDb21wbGV0YXJlIHR1dHRlIGxlIHJpZ2hlXCIsXG4gICAgbnVtZXJpY0Vycm9yOiBcIklsIHZhbG9yZSBkZXZlIGVzc2VyZSBudW1lcmljb1wiLFxuICAgIHRleHRNaW5MZW5ndGg6IFwiSW5zZXJpcmUgYWxtZW5vIHswfSBjYXJhdHRlcmlcIixcbiAgICB0ZXh0TWF4TGVuZ3RoOiBcIkx1bmdoZXp6YSBtYXNzaW1hIGNvbnNlbnRpdGEgezB9IGNhcmF0dGVyaVwiLFxuICAgIHRleHRNaW5NYXhMZW5ndGg6IFwiSW5zZXJpcmUgdW5hIHN0cmluZ2EgY29uIG1pbmltbyB7MH0gZSBtYXNzaW1vIHsxfSBjYXJhdHRlcmlcIixcbiAgICBtaW5Sb3dDb3VudEVycm9yOiBcIkNvbXBsZXRhcmUgYWxtZW5vIHswfSByaWdoZS5cIixcbiAgICBtaW5TZWxlY3RFcnJvcjogXCJTZWxlemlvbmFyZSBhbG1lbm8gezB9IHZhcmlhbnRpLlwiLFxuICAgIG1heFNlbGVjdEVycm9yOiBcIlNlbGV6aW9uYXJlIG1hc3NpbW8gezB9IHZhcmlhbnRpLlwiLFxuICAgIG51bWVyaWNNaW5NYXg6IFwiJ3swfScgZGV2ZSBlc3NlcmUgdWd1YWxlIG8gc3VwZXJpb3JlIGEgezF9IGUgdWd1YWxlIG8gaW5mZXJpb3JlIGEgezJ9XCIsXG4gICAgbnVtZXJpY01pbjogXCInezB9JyBkZXZlIGVzc2VyZSB1Z3VhbGUgbyBzdXBlcmlvcmUgYSB7MX1cIixcbiAgICBudW1lcmljTWF4OiBcIid7MH0nIGRldmUgZXNzZXJlIHVndWFsZSBvIGluZmVyaW9yZSBhIHsxfVwiLFxuICAgIGludmFsaWRFbWFpbDogXCJJbnNlcmlyZSBpbmRpcml6em8gbWFpbCB2YWxpZG9cIixcbiAgICB1cmxSZXF1ZXN0RXJyb3I6IFwiTGEgcmljaGllc3RhIGhhIHJpc3Bvc3RvIGNvbiB1biBlcnJvcmUgJ3swfScuIHsxfVwiLFxuICAgIHVybEdldENob2ljZXNFcnJvcjogXCJMYSByaWNoaWVzdGEgaGEgcmlzcG9zdG8gbnVsbCBvcHB1cmUgaWwgcGVyY29yc28gbm9uIMOoIGNvcnJldHRvXCIsXG4gICAgZXhjZWVkTWF4U2l6ZTogXCJJbCBmaWxlIG5vbiBwdcOyIGVjY2VkZXJlIHswfVwiLFxuICAgIG90aGVyUmVxdWlyZWRFcnJvcjogXCJJbnNlcmlyZSBpbCB2YWxvcmUgJ2FsdHJvJ1wiLFxuICAgIHVwbG9hZGluZ0ZpbGU6IFwiRmlsZSBpbiBjYXJpY2FtZW50by4gQXR0ZW5kaSBhbGN1bmkgc2Vjb25kaSBlIHJpcHJvdmFcIixcbiAgICBhZGRSb3c6IFwiQWdnaXVuZ2kgcmlnYVwiLFxuICAgIHJlbW92ZVJvdzogXCJSaW11b3ZpIHJpZ2FcIixcbiAgICBjaG9pY2VzX0l0ZW06IFwiRWxlbWVudG9cIixcbiAgICBtYXRyaXhfY29sdW1uOiBcIkNvbG9ubmFcIixcbiAgICBtYXRyaXhfcm93OiBcIlJpZ2FcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJpdFwiXSA9IGl0YWxpYW5TdXJ2ZXlTdHJpbmdzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9pdGFsaWFuLnRzIiwiaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgbGF0dmlhblN1cnZleVN0cmluZ3MgPSB7XG4gICAgcGFnZVByZXZUZXh0OiBcIkF0cGFrYcS8XCIsXG4gICAgcGFnZU5leHRUZXh0OiBcIlTEgWzEgWtcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwiUGFiZWlndFwiLFxuICAgIHByb2dyZXNzVGV4dDogXCJMYXBwdXNlIHswfSBubyB7MX1cIixcbiAgICBlbXB0eVN1cnZleTogXCJOYXYgbmV2aWVuYSBqYXV0xIFqdW1hLlwiLFxuICAgIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiUGF0ZWljYW1pZXMgSnVtcyBwYXIgYW5rZXRhcyBhaXpwaWxkxKvFoWFudSFcIixcbiAgICBsb2FkaW5nU3VydmV5OiBcIkllbMSBZGUgbm8gc2VydmVyYS4uLlwiLFxuICAgIG90aGVySXRlbVRleHQ6IFwiQ2l0cyAobMWrZHp1LCBhcHJha3N0aWV0ISlcIixcbiAgICBvcHRpb25zQ2FwdGlvbjogXCJJenbEk2zEk3RpZXMuLi5cIixcbiAgICByZXF1aXJlZEVycm9yOiBcIkzFq2R6dSwgYXRiaWxkaWV0IHV6IGphdXTEgWp1bXUhXCIsXG4gICAgbnVtZXJpY0Vycm9yOiBcIkF0YmlsZGVpIGlyIGrEgWLFq3Qgc2thaXRsaW0uXCIsXG4gICAgdGV4dE1pbkxlbmd0aDogXCJMxatkenUsIGlldmFkaWV0IHZpc21heiB7MH0gc2ltYm9sdXMuXCIsXG4gICAgbWluU2VsZWN0RXJyb3I6IFwiTMWrZHp1LCBpenbEk2xpZXRpZXMgdmlzbWF6IHswfSB2YXJpYW50dS5cIixcbiAgICBtYXhTZWxlY3RFcnJvcjogXCJMxatkenUsIGl6dsSTbGlldGllcyBuZSB2YWlyYWsgcGFyIHswfSB2YXJpYW50aWVtLlwiLFxuICAgIG51bWVyaWNNaW5NYXg6IFwiJ3swfScgasSBYsWrdCB2aWVuxIFkYW0gdmFpIGxpZWzEgWthbSBuZWvEgSB7MX0sIHVuIHZpZW7EgWRhbSB2YWkgbWF6xIFrYW0sIG5la8SBIHsyfVwiLFxuICAgIG51bWVyaWNNaW46IFwiJ3swfScgasSBYsWrdCB2aWVuxIFkYW0gdmFpIGxpZWzEgWthbSB7MX1cIixcbiAgICBudW1lcmljTWF4OiBcIid7MH0nIGrEgWLFq3QgdmllbsSBZGFtIHZhaSBsaWVsxIFrYW0gezF9XCIsXG4gICAgaW52YWxpZEVtYWlsOiBcIkzFq2R6dSwgaWV2YWRpZXQgcGF0aWVzdSBlLXBhc3RhIGFkcmVzaSFcIixcbiAgICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiTMWrZHp1LCBpZXZhZGlldCBkYXR1cyBsYXVrxIEgXFxcIkNpdHNcXFwiXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wibHZcIl0gPSBsYXR2aWFuU3VydmV5U3RyaW5ncztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vbGF0dmlhbi50cyIsImltcG9ydCB7c3VydmV5TG9jYWxpemF0aW9ufSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHBlcnNpYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICAgIHBhZ2VQcmV2VGV4dDogXCLZgtio2YTbjFwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCLYqNi52K/bjFwiLFxuICAgIGNvbXBsZXRlVGV4dDogXCLYqtqp2YXbjNmEXCIsXG4gICAgb3RoZXJJdGVtVGV4dDogXCLYr9uM2q/YsSjYqtmI2LbbjNitKVwiLFxuICAgIHByb2dyZXNzVGV4dDogXCLYtdmB2K3ZhyB7MH0g2KfYsiB7MX1cIixcbiAgICBlbXB0eVN1cnZleTogXCLYtdmB2K3ZhyDYp9uMINuM2Kcg2q/YstuM2YbZhyDYp9uMINio2LHYp9uMINin24zZhiDZvtix2LPYtNmG2KfZhdmHINmF2YjYrNmI2K8g2YbbjNiz2KouXCIsXG4gICAgY29tcGxldGluZ1N1cnZleTogXCLYp9iyINi02YXYpyDYqNin2KjYqiDYqtqp2YXbjNmEINin24zZhiDZvtix2LPYtNmG2KfZhdmHINmF2KrYtNqp2LHbjNmFXCIsXG4gICAgY29tcGxldGluZ1N1cnZleUJlZm9yZTogXCLYqNmHINmG2LjYsSDZhduMINix2LPYryDZh9mFINmH2YUg2KfaqdmG2YjZhiDZvtix2LPYtNmG2KfZhdmHINix2Kcg2KraqdmF24zZhCDaqdix2K/ZhyDYp9uM2K8uXCIsXG4gICAgbG9hZGluZ1N1cnZleTogXCLYr9ix2K3Yp9mEINin24zYrNin2K8g2b7Ysdiz2LTZhtin2YXZh1wiLFxuICAgIG9wdGlvbnNDYXB0aW9uOiBcItin2YbYqtiu2KfYqCDaqdmG24zYry4uLlwiLFxuICAgIHZhbHVlOiBcItmF2YLYr9in2LFcIixcbiAgICByZXF1aXJlZEVycm9yOiBcItmE2LfZgdinINio2Ycg2LPZiNin2YQg2b7Yp9iz2K4g2K/Zh9uM2K9cIixcbiAgICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcItmE2LfZgdinINio2Ycg2KrZhdin2YUg2LPYt9ixINmH2KfbjCDYs9mI2KfZhNin2Kog2b7Yp9iz2K4g2K/Zh9uM2K9cIixcbiAgICBudW1lcmljRXJyb3I6IFwi2YXZgtiv2KfYsSDYqNin24zYryDYudiv2K/bjCDYqNin2LTYr1wiLFxuICAgIHRleHRNaW5MZW5ndGg6IFwi2YTYt9mB2Kcg2K3Yr9in2YLZhCAgezB9INit2LHZgSDZiNin2LHYryDaqdmG24zYr1wiLFxuICAgIHRleHRNYXhMZW5ndGg6IFwi2YTYt9mB2Kcg2qnZhdiq2LEg2KfYsiAgezB9INit2LHZgSDZiNin2LHYryDaqdmG24zYry5cIixcbiAgICB0ZXh0TWluTWF4TGVuZ3RoOiBcItmE2LfZgdinINio24zYtNiq2LEg2KfYsiAgezB9INit2LHZgSDZiCDaqdmF2KrYsSDYp9iyIHsxfSDYrdix2YEg2YjYp9ix2K8g2qnZhtuM2K8uXCIsXG4gICAgbWluUm93Q291bnRFcnJvcjogXCLZhNi32YHYpyDYrdiv2KfZgtmEIHswfSDYs9i32LEg2YjYp9ix2K8g2qnZhtuM2K8uXCIsXG4gICAgbWluU2VsZWN0RXJyb3I6IFwi2K3Yr9in2YLZhCB7MH0g2KfZhtiq2K7Yp9ioINqp2YbbjNivLlwiLFxuICAgIG1heFNlbGVjdEVycm9yOiBcItmE2LfZgdinINio24zYtNiq2LEg2KfYsiAgezB9INin2YbYqtiu2KfYqCDaqdmG24zYry5cIixcbiAgICBudW1lcmljTWluTWF4OiBcIid7MH0nINio2KfbjNivINio24zZhiB7MX0g2YggezJ9INio2KfYtNivXCIsXG4gICAgbnVtZXJpY01pbjogXCInezB9JyDYqNiy2LHar9iq2LEg2YXYs9in2YjbjCB7MX0g2KjYp9i02K9cIixcbiAgICBudW1lcmljTWF4OiBcIid7MH0nINio2KfbjNivINqp2Yjahtqp2KrYsSDbjNinINmF2LPYp9mI24wgezF9INio2KfYtNivXCIsXG4gICAgaW52YWxpZEVtYWlsOiBcItmE2LfZgdinINin24zZhduM2YQg2LXYrduM2K0g2K/YsdisINqp2YbbjNivXCIsXG4gICAgdXJsUmVxdWVzdEVycm9yOiBcItiv2LHYrtmI2KfYs9iqINio2Kcg2K7Yt9inINix2YjYqNix2Ygg2LTYrzogJ3swfScuIHsxfVwiLFxuICAgIHVybEdldENob2ljZXNFcnJvcjogXCLYr9ix2K7ZiNin2LPYqiDZhdiz24zYsduMINiu2KfZhNuMINio2KfYstqv2LTYqiDYr9in2K/ZhyDbjNinINmF2LPbjNixINiv2LHYs9iqINiq2YbYuNuM2YUg2YbYtNiv2YdcIixcbiAgICBleGNlZWRNYXhTaXplOiBcItio24zYtNiq2LHbjNmGINit2KzZhSDZhdis2KfYsiDZgdin24zZhDogezB9XCIsXG4gICAgb3RoZXJSZXF1aXJlZEVycm9yOiBcItmF2YLYr9in2LEgJ9iv24zar9ixJyDYsdinINmI2KfYsdivINqp2YbbjNivXCIsXG4gICAgdXBsb2FkaW5nRmlsZTogXCLZgdin24zZhCDYr9ixINit2KfZhCDYotuM2YTZiNivINmF24wg2KjYp9i02K8uINmE2LfZgdinINi12KjYsSDaqdmG24zYry5cIixcbiAgICBjb25maXJtRGVsZXRlOiBcItii24zYpyDZhdin24zZhCDYqNmHINit2LDZgSDYp9uM2YYg2LHYr9uM2YEg2YfYs9iq24zYr9ifXCIsXG4gICAga2V5RHVwbGljYXRpb25FcnJvcjogXCLYp9uM2YYg2YXZgtiv2KfYsSDYqNin24zYryDYutuM2LEg2Kraqdix2KfYsduMINio2KfYtNivXCIsXG4gICAgYWRkUm93OiBcItiz2LfYsSDYrNiv24zYr1wiLFxuICAgIHJlbW92ZVJvdzogXCLYrdiw2YFcIixcbiAgICBhZGRQYW5lbDogXCLYrNiv24zYr1wiLFxuICAgIHJlbW92ZVBhbmVsOiBcItit2LDZgVwiLFxuICAgIGNob2ljZXNfSXRlbTogXCLYotuM2KrZhVwiLFxuICAgIG1hdHJpeF9jb2x1bW46IFwi2LPYqtmI2YZcIixcbiAgICBtYXRyaXhfcm93OiBcItiz2LfYsVwiLFxuICAgIHNhdmluZ0RhdGE6IFwi2YbYqtin24zYrCDYr9ixINit2KfZhCDYsNiu24zYsdmHINiz2KfYstuMINiv2LEg2LPYsdmI2LEg2YXbjCDYqNin2LTYr1wiLFxuICAgIHNhdmluZ0RhdGFFcnJvcjogXCLYrti32KfbjNuMINiv2LEg2LDYrtuM2LHZhyDYs9in2LLbjCDZhtiq2KfbjNisINix2K4g2K/Yp9iv2Ycg2KfYs9iqXCIsXG4gICAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi2YbYqtin24zYrCDYqNinINmF2YjZgdmC24zYqiDYsNiu24zYsdmHINi02K9cIixcbiAgICBzYXZlQWdhaW5CdXR0b246IFwi2YXYrNiv2K8g2KrZhNin2LQg2qnZhtuM2K9cIlxufTtcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZmFcIl0gPSBwZXJzaWFuU3VydmV5U3RyaW5ncztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vcGVyc2lhbi50cyIsImltcG9ydCB7c3VydmV5TG9jYWxpemF0aW9ufSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHBvbGlzaFN1cnZleVN0cmluZ3MgPSB7XG4gICAgcGFnZVByZXZUZXh0OiBcIldzdGVjelwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCJEYWxlalwiLFxuICAgIGNvbXBsZXRlVGV4dDogXCJHb3Rvd2VcIixcbiAgICBvdGhlckl0ZW1UZXh0OiBcIklubmEgb2Rwb3dpZWTFuiAod3Bpc3opXCIsXG4gICAgcHJvZ3Jlc3NUZXh0OiBcIlN0cm9uYSB7MH0geiB7MX1cIixcbiAgICBlbXB0eVN1cnZleTogXCJOaWUgbWEgd2lkb2N6bnljaCBweXRhxYQuXCIsXG4gICAgY29tcGxldGluZ1N1cnZleTogXCJEemnEmWt1amVteSB6YSB3eXBlxYJuaWVuaWUgYW5raWV0eSFcIixcbiAgICBsb2FkaW5nU3VydmV5OiBcIlRyd2Egd2N6eXR5d2FuaWUgYW5raWV0eS4uLlwiLFxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIld5YmllcnouLi5cIixcbiAgICByZXF1aXJlZEVycm9yOiBcIlByb3N6xJkgb2Rwb3dpZWR6aWXEhyBuYSB0byBweXRhbmllLlwiLFxuICAgIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiUHJvc3rEmSBvZHBvd2llZHppZcSHIG5hIHdzenlzdGtpZSBweXRhbmlhLlwiLFxuICAgIG51bWVyaWNFcnJvcjogXCJXIHR5bSBwb2x1IG1vxbxuYSB3cGlzYcSHIHR5bGtvIGxpY3pieS5cIixcbiAgICB0ZXh0TWluTGVuZ3RoOiBcIlByb3N6xJkgd3Bpc2HEhyBjbyBuYWptbmllaiB7MH0gem5ha8Ozdy5cIixcbiAgICB0ZXh0TWF4TGVuZ3RoOiBcIlByb3N6xJkgd3Bpc2HEhyBtbmllaiBuacW8IHswfSB6bmFrw7N3LlwiLFxuICAgIHRleHRNaW5NYXhMZW5ndGg6IFwiUHJvc3rEmSB3cGlzYcSHIHdpxJljZWogbmnFvCB7MH0gaSBtbmllaiBuacW8IHsxfSB6bmFrw7N3LlwiLFxuICAgIG1pblJvd0NvdW50RXJyb3I6IFwiUHJvc3rEmSB1enVwZcWCbmnEhyBwcnp5bmFqbW5pZWogezB9IHdpZXJzenkuXCIsXG4gICAgbWluU2VsZWN0RXJyb3I6IFwiUHJvc3rEmSB3eWJyYcSHIGNvIG5ham1uaWVqIHswfSBwb3p5Y2ppLlwiLFxuICAgIG1heFNlbGVjdEVycm9yOiBcIlByb3N6xJkgd3licmHEhyBuaWUgd2nEmWNlaiBuacW8IHswfSBwb3p5Y2ppLlwiLFxuICAgIG51bWVyaWNNaW5NYXg6IFwiT2Rwb3dpZWTFuiAnezB9JyBwb3dpbm5hIGJ5xIcgd2nEmWtzemEgbHViIHLDs3duYSB7MX0gb3JheiBtbmllanN6YSBsdWIgcsOzd25hIHsyfVwiLFxuICAgIG51bWVyaWNNaW46IFwiT2Rwb3dpZWTFuiAnezB9JyBwb3dpbm5hIGJ5xIcgd2nEmWtzemEgbHViIHLDs3duYSB7MX1cIixcbiAgICBudW1lcmljTWF4OiBcIk9kcG93aWVkxbogJ3swfScgcG93aW5uYSBiecSHIG1uaWVqc3phIGx1YiByw7N3bmEgezF9XCIsXG4gICAgaW52YWxpZEVtYWlsOiBcIlByb3N6xJkgcG9kYcSHIHByYXdpZMWCb3d5IGFkcmVzIGVtYWlsLlwiLFxuICAgIHVybFJlcXVlc3RFcnJvcjogXCLFu8SFZGFuaWUgendyw7NjacWCbyBixYLEhWQgJ3swfScuIHsxfVwiLFxuICAgIHVybEdldENob2ljZXNFcnJvcjogXCLFu8SFZGFuaWUgbmllIHp3csOzY2nFgm8gZGFueWNoIGFsYm8gxZtjaWXFvGthIGplc3QgbmllcHJhd2lkxYJvd2FcIixcbiAgICBleGNlZWRNYXhTaXplOiBcIlJvem1pYXIgcHJ6ZXPFgmFuZWdvIHBsaWt1IG5pZSBtb8W8ZSBwcnpla3JhY3phxIcgezB9LlwiLFxuICAgIG90aGVyUmVxdWlyZWRFcnJvcjogXCJQcm9zesSZIHBvZGHEhyBpbm7EhSBvZHBvd2llZMW6LlwiLFxuICAgIHVwbG9hZGluZ0ZpbGU6IFwiVHJ3YSBwcnplbm9zemVuaWUgVHdvamVnbyBwbGlrdSwgcHJvc3rEmSBzcHLDs2Jvd2HEhyBwb25vd25pZSB6YSBraWxrYSBzZWt1bmQuXCIsXG4gICAgYWRkUm93OiBcIkRvZGFqIHdpZXJzelwiLFxuICAgIHJlbW92ZVJvdzogXCJVc3XFhFwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInBsXCJdID0gcG9saXNoU3VydmV5U3RyaW5ncztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vcG9saXNoLnRzIiwiaW1wb3J0IHtcblx0c3VydmV5TG9jYWxpemF0aW9uXG59IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgcG9ydHVndWVzZVN1cnZleVN0cmluZ3MgPSB7XG5cdHBhZ2VQcmV2VGV4dDogXCJBbnRlcmlvclwiLFxuXHRwYWdlTmV4dFRleHQ6IFwiUHLDs3hpbW9cIixcblx0Y29tcGxldGVUZXh0OiBcIkZpbmFsaXphclwiLFxuXHRvdGhlckl0ZW1UZXh0OiBcIk91dHJvcyAoZGVzY3JldmVyKVwiLFxuXHRwcm9ncmVzc1RleHQ6IFwiUGFnaW5hIHswfSBkZSB7MX1cIixcblx0ZW1wdHlTdXJ2ZXk6IFwiTsOjbyBow6EgcMOhZ2luYSB2aXPDrXZlbCBvdSBwZXJndW50YSBuYSBwZXNxdWlzYS5cIixcblx0Y29tcGxldGluZ1N1cnZleTogXCJPYnJpZ2FkbyBwb3IgZmluYWxpemFyIGEgcGVzcXVpc2EhXCIsXG5cdGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6IFwiTm9zc29zIHJlZ2lzdHJvcyBtb3N0cmFtIHF1ZSB2b2PDqiBqw6EgZmluYWxpem91IGEgcGVzcXVpc2EuXCIsXG5cdGxvYWRpbmdTdXJ2ZXk6IFwiQSBwZXNxdWlzYSBlc3TDoSBjYXJyZWdhbmRvLi4uXCIsXG5cdG9wdGlvbnNDYXB0aW9uOiBcIlNlbGVjaW9uZS4uLlwiLFxuXHR2YWx1ZTogXCJ2YWxvclwiLFxuXHRyZXF1aXJlZEVycm9yOiBcIlBvciBmYXZvciwgcmVzcG9uZGEgYSBwZXJndW50YS5cIixcblx0cmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJQb3IgZmF2b3IsIHJlc3BvbmRhIGFzIHBlcmd1bnRhcyBlbSB0b2RhcyBhcyBsaW5oYXMuXCIsXG5cdG51bWVyaWNFcnJvcjogXCJPIHZhbG9yIGRldmUgc2VyIG51bcOpcmljby5cIixcblx0dGV4dE1pbkxlbmd0aDogXCJQb3IgZmF2b3IsIGluc2lyYSBwZWxvIG1lbm9zIHswfSBjYXJhY3RlcmVzLlwiLFxuXHR0ZXh0TWF4TGVuZ3RoOiBcIlBvciBmYXZvciwgaW5zaXJhIG1lbm9zIGRlIHswfSBjYXJhY3RlcmVzLlwiLFxuXHR0ZXh0TWluTWF4TGVuZ3RoOiBcIlBvciBmYXZvciwgaW5zaXJhIG1haXMgZGUgezB9IGUgbWVub3MgZGUgezF9IGNhcmFjdGVyZXMuXCIsXG5cdG1pblJvd0NvdW50RXJyb3I6IFwiUHJlZW5jaGEgcGVsbyBtZW5vcyB7MH0gbGluaGFzLlwiLFxuXHRtaW5TZWxlY3RFcnJvcjogXCJTZWxlY2lvbmUgcGVsbyBtZW5vcyB7MH0gb3DDp8O1ZXMuXCIsXG5cdG1heFNlbGVjdEVycm9yOiBcIlBvciBmYXZvciwgc2VsZWNpb25lIG7Do28gbWFpcyBkbyBxdWUgezB9IG9ww6fDtWVzLlwiLFxuXHRudW1lcmljTWluTWF4OiBcIk8gJ3swfScgZGV2ZSBzZXIgaWd1YWwgb3Ugc3VwZXJpb3IgYSB7MX0gZSBpZ3VhbCBvdSBtZW5vciBxdWUgezJ9XCIsXG5cdG51bWVyaWNNaW46IFwiTyAnezB9JyBkZXZlIHNlciBpZ3VhbCBvdSBzdXBlcmlvciBhIHsxfVwiLFxuXHRudW1lcmljTWF4OiBcIk8gJ3swfScgZGV2ZSBzZXIgaWd1YWwgb3UgaW5mZXJpb3IgYSB7MX1cIixcblx0aW52YWxpZEVtYWlsOiBcIlBvciBmYXZvciwgaW5mb3JtZSB1bSBlLW1haWwgdsOhbGlkby5cIixcblx0dXJsUmVxdWVzdEVycm9yOiBcIkEgcmVxdWlzacOnw6NvIHJldG9ybm91IG8gZXJybyAnezB9Jy4gezF9XCIsXG5cdHVybEdldENob2ljZXNFcnJvcjogXCJBIHJlcXVpc2nDp8OjbyBuw6NvIHJldG9ybm91IGRhZG9zIG91IG8gJ2NhbWluaG8nIGRhIHJlcXVpc2nDp8OjbyBuw6NvIGVzdMOhIGNvcnJldG9cIixcblx0ZXhjZWVkTWF4U2l6ZTogXCJPIHRhbWFuaG8gZG8gYXJxdWl2byBuw6NvIGRldmUgZXhjZWRlciB7MH0uXCIsXG5cdG90aGVyUmVxdWlyZWRFcnJvcjogXCJQb3IgZmF2b3IsIGluZm9ybWUgbyBvdXRybyB2YWxvci5cIixcblx0dXBsb2FkaW5nRmlsZTogXCJTZXUgYXJxdWl2byBlc3TDoSBzZW5kbyBjYXJyZWdhZG8uIFBvciBmYXZvciwgYWd1YXJkZSBhbGd1bnMgc2VndW5kb3MgZSB0ZW50ZSBub3ZhbWVudGUuXCIsXG5cdGFkZFJvdzogXCJBZGljaW9uYXIgbGluaGFcIixcblx0cmVtb3ZlUm93OiBcIlJlbW92ZXIgbGluaGFcIixcblx0YWRkUGFuZWw6IFwiQWRpY2lvbmFyIG5vdm9cIixcblx0cmVtb3ZlUGFuZWw6IFwiUmVtb3ZlclwiLFxuXHRjaG9pY2VzX0l0ZW06IFwiaXRlbVwiLFxuXHRtYXRyaXhfY29sdW1uOiBcIkNvbHVuYVwiLFxuXHRtYXRyaXhfcm93OiBcIkxpbmhhXCIsXG5cdHNhdmluZ0RhdGE6IFwiT3MgcmVzdWx0YWRvcyBlc3RvIHNlbmRvIHNhbHZvcyBubyBzZXJ2aWRvci4uLlwiLFxuXHRzYXZpbmdEYXRhRXJyb3I6IFwiT2NvcnJldSB1bSBlcnJvIGUgbsOjbyBmb2kgcG9zc8OtdmVsIHNhbHZhciBvcyByZXN1bHRhZG9zLlwiLFxuXHRzYXZpbmdEYXRhU3VjY2VzczogXCJPcyByZXN1bHRhZG9zIGZvcmFtIHNhbHZvcyBjb20gc3VjZXNzbyFcIixcblx0c2F2ZUFnYWluQnV0dG9uOiBcIlRlbnRlIG5vdmFtZW50ZVwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInB0XCJdID0gcG9ydHVndWVzZVN1cnZleVN0cmluZ3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL3BvcnR1Z3Vlc2UudHMiLCJpbXBvcnQge3N1cnZleUxvY2FsaXphdGlvbn0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciByb21hbmlhblN1cnZleVN0cmluZ3MgPSB7XG4gICAgcGFnZVByZXZUZXh0OiBcIlByZWNlZGVudFwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCJVcm3Eg3RvclwiLFxuICAgIGNvbXBsZXRlVGV4dDogXCJGaW5hbGl6YXJlXCIsXG4gICAgb3RoZXJJdGVtVGV4dDogXCJBbHR1bChwcmVjaXphxaNpKVwiLFxuICAgIHByb2dyZXNzVGV4dDogXCJQYWdpbmEgezB9IGRpbiB7MX1cIixcbiAgICBlbXB0eVN1cnZleTogXCJOdSBzdW50IMOubnRyZWLEg3JpIHBlbnRydSBhY2VzdCBjaGVzdGlvbmFyXCIsXG4gICAgY29tcGxldGluZ1N1cnZleTogXCJWxIMgbXVsxaN1bWltIHBlbnRydSB0aW1wdWwgYWNvcmRhdCFcIixcbiAgICBsb2FkaW5nU3VydmV5OiBcIkNoZXN0aW9uYXJ1bCBzZSDDrm5jYXJjxIMuLi5cIixcbiAgICBvcHRpb25zQ2FwdGlvbjogXCJBbGVnZcWjaS4uLlwiLFxuICAgIHJlcXVpcmVkRXJyb3I6IFwiUsSDc3B1bnN1bCBsYSBhY2Vhc3TEgyDDrm50cmViYXJlIGVzdGUgb2JsaWdhdG9yaXUuXCIsXG4gICAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJUb2F0ZSByxINzcHVuc3VyaWxlIHN1bnQgb2JsaWdhdG9yaWlcIixcbiAgICBudW1lcmljRXJyb3I6IFwiUsSDc3B1bnN1bCB0cmVidWllIHPEgyBmaWUgbnVtZXJpYy5cIixcbiAgICB0ZXh0TWluTGVuZ3RoOiBcIlRyZWJ1aWUgc8SDIGludHJvZHVjaSBtaW5pbSB7MH0gY2FyYWN0ZXJlLlwiLFxuICAgIG1pblNlbGVjdEVycm9yOiBcIlRyZWJ1aWUgc8SDIHNlbGVjdGV6aSBtaW5pbSB7MH0gb3DFo2l1bmkuXCIsXG4gICAgbWF4U2VsZWN0RXJyb3I6IFwiVHJlYnVpZSBzxIMgc2VsZWN0ZXppIG1heGltIHswfSBvcMWjaXVuaS5cIixcbiAgICBudW1lcmljTWluTWF4OiBcIlLEg3NwdW5zdWwgJ3swfScgdHJlYnVpZSBzxIMgZmllIG1haSBtYXJlIHNhdSBlZ2FsIGNhIHsxfSDFn8OuIG1haSBtaWMgc2F1IGVnYWwgY3UgezJ9XCIsXG4gICAgbnVtZXJpY01pbjogXCJSxINzcHVuc3VsICd7MH0nIHRyZWJ1aWUgc8SDIGZpZSBtYWkgbWFyZSBzYXUgZWdhbCBjYSB7MX1cIixcbiAgICBudW1lcmljTWF4OiBcIlLEg3NwdW5zdWwgJ3swfScgdHJlYnVpZSBzxIMgZmllIG1haSBtaWMgc2F1IGVnYWwgY2EgezF9XCIsXG4gICAgaW52YWxpZEVtYWlsOiBcIlRyZWJ1aWUgc8SDIGludHJvZHVjZcWjaSBvIGFkcmVzYSBkZSBlbWFpbCB2YWxpZMSDLlwiLFxuICAgIGV4Y2VlZE1heFNpemU6IFwiRGltZW5zaXVuZWEgZmnFn2llcnVsdWkgbnUgdHJlYnVpZSBzxIMgZGVwxIPFn2Vhc2PEgyB7MH0uXCIsXG4gICAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlRyZWJ1aWUgc8SDIGNvbXBsZXRlemkgY8OibXB1bCAnQWx0dWwnLlwiXG59O1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJyb1wiXSA9IHJvbWFuaWFuU3VydmV5U3RyaW5ncztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vcm9tYW5pYW4udHMiLCJpbXBvcnQge3N1cnZleUxvY2FsaXphdGlvbn0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBydXNzaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgICBwYWdlUHJldlRleHQ6IFwi0J3QsNC30LDQtFwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCLQlNCw0LvQtdC1XCIsXG4gICAgY29tcGxldGVUZXh0OiBcItCT0L7RgtC+0LLQvlwiLFxuICAgIHByb2dyZXNzVGV4dDogXCLQodGC0YDQsNC90LjRhtCwIHswfSDQuNC3IHsxfVwiLFxuICAgIGVtcHR5U3VydmV5OiBcItCd0LXRgiDQvdC4INC+0LTQvdC+0LPQviDQstC+0L/RgNC+0YHQsC5cIixcbiAgICBjb21wbGV0aW5nU3VydmV5OiBcItCR0LvQsNCz0L7QtNCw0YDQuNC8INCS0LDRgSDQt9CwINC30LDQv9C+0LvQvdC10L3QuNC1INCw0L3QutC10YLRiyFcIixcbiAgICBsb2FkaW5nU3VydmV5OiBcItCX0LDQs9GA0YPQt9C60LAg0YEg0YHQtdGA0LLQtdGA0LAuLi5cIixcbiAgICBvdGhlckl0ZW1UZXh0OiBcItCU0YDRg9Cz0L7QtSAo0L/QvtC20LDQu9GD0LnRgdGC0LAsINC+0L/QuNGI0LjRgtC1KVwiLFxuICAgIG9wdGlvbnNDYXB0aW9uOiBcItCS0YvQsdGA0LDRgtGMLi4uXCIsXG4gICAgcmVxdWlyZWRFcnJvcjogXCLQn9C+0LbQsNC70YPQudGB0YLQsCwg0L7RgtCy0LXRgtGM0YLQtSDQvdCwINCy0L7Qv9GA0L7RgS5cIixcbiAgICBudW1lcmljRXJyb3I6IFwi0J7RgtCy0LXRgiDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0YfQuNGB0LvQvtC8LlwiLFxuICAgIHRleHRNaW5MZW5ndGg6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0LLQtdC00LjRgtC1INGF0L7RgtGPINCx0YsgezB9INGB0LjQvNCy0L7Qu9C+0LIuXCIsXG4gICAgbWluU2VsZWN0RXJyb3I6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0YvQsdC10YDQuNGC0LUg0YXQvtGC0Y8g0LHRiyB7MH0g0LLQsNGA0LjQsNC90YLQvtCyLlwiLFxuICAgIG1heFNlbGVjdEVycm9yOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQstGL0LHQtdGA0LjRgtC1INC90LUg0LHQvtC70LXQtSB7MH0g0LLQsNGA0LjQsNC90YLQvtCyLlwiLFxuICAgIG51bWVyaWNNaW5NYXg6IFwiJ3swfScg0LTQvtC70LbQvdC+INCx0YvRgtGMINGA0LDQstC90YvQvCDQuNC70Lgg0LHQvtC70YzRiNC1LCDRh9C10LwgezF9LCDQuCDRgNCw0LLQvdGL0Lwg0LjQu9C4INC80LXQvdGM0YjQtSwg0YfQtdC8IHsyfVwiLFxuICAgIG51bWVyaWNNaW46IFwiJ3swfScg0LTQvtC70LbQvdC+INCx0YvRgtGMINGA0LDQstC90YvQvCDQuNC70Lgg0LHQvtC70YzRiNC1LCDRh9C10LwgezF9XCIsXG4gICAgbnVtZXJpY01heDogXCInezB9JyDQtNC+0LvQttC90L4g0LHRi9GC0Ywg0YDQsNCy0L3Ri9C8INC40LvQuCDQvNC10L3RjNGI0LUsINGH0LXQvCB7MX1cIixcbiAgICBpbnZhbGlkRW1haWw6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0LLQtdC00LjRgtC1INC00LXQudGB0YLQstC40YLQtdC70YzQvdGL0Lkg0LDQtNGA0LXRgSDRjdC70LXQutGC0YDQvtC90L3QvtC5INC/0L7Rh9GC0YsuXCIsXG4gICAgb3RoZXJSZXF1aXJlZEVycm9yOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQstCy0LXQtNC40YLQtSDQtNCw0L3QvdGL0LUg0LIg0L/QvtC70LUgXFxcItCU0YDRg9Cz0L7QtVxcXCJcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJydVwiXSA9IHJ1c3NpYW5TdXJ2ZXlTdHJpbmdzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9ydXNzaWFuLnRzIiwiaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgc2ltcGxpZmllZENoaW5lc2VTdXJ2ZXlTdHJpbmdzID0ge1xuICAgIHBhZ2VQcmV2VGV4dDogXCLkuIrkuIDpobVcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwi5LiL5LiA6aG1XCIsXG4gICAgY29tcGxldGVUZXh0OiBcIuaPkOS6pOmXruWNt1wiLFxuICAgIG90aGVySXRlbVRleHQ6IFwi5aGr5YaZ5YW25LuW562U5qGIXCIsXG4gICAgcHJvZ3Jlc3NUZXh0OiBcIuesrCB7MH0g6aG1LCDlhbEgezF9IOmhtVwiLFxuICAgIGVtcHR5U3VydmV5OiBcIumXruWNt+S4reayoeaciemXrumimOaIlumhtemdolwiLFxuICAgIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi5oSf6LCi5oKo55qE5Y+C5LiOIVwiLFxuICAgIGxvYWRpbmdTdXJ2ZXk6IFwi6Zeu5Y235q2j5Zyo5Yqg6L295LitLi4uXCIsXG4gICAgb3B0aW9uc0NhcHRpb246IFwi6K+36YCJ5oupLi4uXCIsXG4gICAgcmVxdWlyZWRFcnJvcjogXCLor7floavlhpnmraTpl67pophcIixcbiAgICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIuivt+Whq+WGmeaJgOacieihjOS4remXrumimFwiLFxuICAgIG51bWVyaWNFcnJvcjogXCLnrZTmoYjlv4XpobvmmK/kuKrmlbDlrZdcIixcbiAgICB0ZXh0TWluTGVuZ3RoOiBcIuetlOahiOmVv+W6puiHs+WwkSB7MH0g5Liq5a2X56ymXCIsXG4gICAgdGV4dE1heExlbmd0aDogXCLnrZTmoYjplb/luqbkuI3og73otoXov4cgezB9IOS4quWtl+esplwiLFxuICAgIHRleHRNaW5NYXhMZW5ndGg6IFwi562U5qGI6ZW/5bqm5b+F6aG75ZyoIHswfSAtIHsxfSDkuKrlrZfnrKbkuYvpl7RcIixcbiAgICBtaW5Sb3dDb3VudEVycm9yOiBcIuacgOWwkemcgOimgeWhq+WGmSB7MH0g6KGM562U5qGIXCIsXG4gICAgbWluU2VsZWN0RXJyb3I6IFwi5pyA5bCR6ZyA6KaB6YCJ5oupIHswfSDpobnnrZTmoYhcIixcbiAgICBtYXhTZWxlY3RFcnJvcjogXCLmnIDlpJrlj6rog73pgInmi6kgezB9IOmhueetlOahiFwiLFxuICAgIG51bWVyaWNNaW5NYXg6IFwi562U5qGIICd7MH0nIOW/hemhu+Wkp+S6juetieS6jiB7MX0g5LiU5bCP5LqO562J5LqOIHsyfVwiLFxuICAgIG51bWVyaWNNaW46IFwi562U5qGIICd7MH0nIOW/hemhu+Wkp+S6juetieS6jiB7MX1cIixcbiAgICBudW1lcmljTWF4OiBcIuetlOahiCAnezB9JyDlv4XpobvlsI/kuo7nrYnkuo4gezF9XCIsXG4gICAgaW52YWxpZEVtYWlsOiBcIuivt+i+k+WFpeacieaViOeahCBFbWFpbCDlnLDlnYBcIixcbiAgICB1cmxSZXF1ZXN0RXJyb3I6IFwi6L295YWl6YCJ6aG55pe25Y+R55Sf6ZSZ6K+vICd7MH0nOiB7MX1cIixcbiAgICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwi5pyq6IO96L295YWl5pyJ5pWI55qE6YCJ6aG55oiW6K+35rGC5Y+C5pWw6Lev5b6E5pyJ6K+vXCIsXG4gICAgZXhjZWVkTWF4U2l6ZTogXCLmlofku7blpKflsI/kuI3og73otoXov4cgezB9XCIsXG4gICAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIuivt+WujOaIkOWFtuS7lumXrumimFwiLFxuICAgIHVwbG9hZGluZ0ZpbGU6IFwi5paH5Lu25LiK5Lyg5LitLi4uIOivt+iAkOW/g+etieW+heWHoOenkuWQjumHjeivlVwiLFxuICAgIGFkZFJvdzogXCLmt7vliqDnrZTmoYhcIixcbiAgICByZW1vdmVSb3c6IFwi5Yig6Zmk562U5qGIXCIsXG4gICAgY2hvaWNlc19JdGVtOiBcIumAiemhuVwiLFxuICAgIG1hdHJpeF9jb2x1bW46IFwi5YiXXCIsXG4gICAgbWF0cml4X3JvdzogXCLooYxcIixcbiAgICBzYXZpbmdEYXRhOiBcIuato+WcqOWwhue7k+aenOS/neWtmOWIsOacjeWKoeWZqC4uLlwiLFxuICAgIHNhdmluZ0RhdGFFcnJvcjogXCLlnKjkv53lrZjnu5Pmnpzov4fnqIvkuK3lj5HnlJ/kuobplJnor6/vvIznu5PmnpzmnKrog73kv53lrZhcIixcbiAgICBzYXZpbmdEYXRhU3VjY2VzczogXCLnu5Pmnpzkv53lrZjmiJDlip8hXCIsXG4gICAgc2F2ZUFnYWluQnV0dG9uOiBcIuivt+mHjeivlVwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInpoLWNuXCJdID0gc2ltcGxpZmllZENoaW5lc2VTdXJ2ZXlTdHJpbmdzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9zaW1wbGlmaWVkLWNoaW5lc2UudHMiLCJpbXBvcnQge3N1cnZleUxvY2FsaXphdGlvbn0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBzcGFuaXNoU3VydmV5U3RyaW5ncyA9IHtcbiAgICBwYWdlUHJldlRleHQ6IFwiQW50ZXJpb3JcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwiU2lndWllbnRlXCIsXG4gICAgY29tcGxldGVUZXh0OiBcIkNvbXBsZXRvXCIsXG4gICAgb3RoZXJJdGVtVGV4dDogXCJPdHJvIChkZXNjcmliYSlcIixcbiAgICBwcm9ncmVzc1RleHQ6IFwiUMOhZ2luYSB7MH0gZGUgezF9XCIsXG4gICAgZW1wdHlTdXJ2ZXk6IFwiTm8gaGF5IHDDoWdpbmEgdmlzaWJsZSBvIHByZWd1bnRhIGVuIGxhIGVuY3Vlc3RhLlwiLFxuICAgIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiR3JhY2lhcyBwb3IgY29tcGxldGFyIGxhIGVuY3Vlc3RhIVwiLFxuICAgIGxvYWRpbmdTdXJ2ZXk6IFwiTGEgZW5jdWVzdGEgZXN0w6EgY2FyZ2FuZG8uLi5cIixcbiAgICBvcHRpb25zQ2FwdGlvbjogXCJTZWxlY2Npb25lLi4uXCIsXG4gICAgcmVxdWlyZWRFcnJvcjogXCJQb3IgZmF2b3IgY29udGVzdGUgbGEgcHJlZ3VudGEuXCIsXG4gICAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJQb3IgZmF2b3IgY29udGVzdGUgbGFzIHByZWd1bnRhcyBlbiBjYWRhIGhpbGVyYS5cIixcbiAgICBudW1lcmljRXJyb3I6IFwiTGEgZXN0aW1hY2nDs24gZGViZSBzZXIgbnVtw6lyaWNhLlwiLFxuICAgIHRleHRNaW5MZW5ndGg6IFwiUG9yIGZhdm9yIGVudHJlIHBvciBsbyBtZW5vcyB7MH0gc8OtbWJvbG9zLlwiLFxuICAgIHRleHRNYXhMZW5ndGg6IFwiUG9yIGZhdm9yIGVudHJlIG1lbm9zIGRlIHswfSBzw61tYm9sb3MuXCIsXG4gICAgdGV4dE1pbk1heExlbmd0aDogXCJQb3IgZmF2b3IgZW50cmUgbcOhcyBkZSB7MH0geSBtZW5vcyBkZSB7MX0gc8OtbWJvbG9zLlwiLFxuICAgIG1pblJvd0NvdW50RXJyb3I6IFwiUG9yIGZhdm9yIGxsZW5lIHBvciBsbyBtZW5vcyB7MH0gaGlsZXJhcy5cIixcbiAgICBtaW5TZWxlY3RFcnJvcjogXCJQb3IgZmF2b3Igc2VsZWNjaW9uZSBwb3IgbG8gbWVub3MgezB9IHZhcmlhbnRlcy5cIixcbiAgICBtYXhTZWxlY3RFcnJvcjogXCJQb3IgZmF2b3Igc2VsZWNjaW9uZSBubyBtw6FzIGRlIHswfSB2YXJpYW50ZXMuXCIsXG4gICAgbnVtZXJpY01pbk1heDogXCJFbCAnezB9JyBkZWJlIGRlIHNlciBpZ3VhbCBvIG3DoXMgZGUgezF9IHkgaWd1YWwgbyBtZW5vcyBkZSB7Mn1cIixcbiAgICBudW1lcmljTWluOiBcIkVsICd7MH0nIGRlYmUgc2VyIGlndWFsIG8gbcOhcyBkZSB7MX1cIixcbiAgICBudW1lcmljTWF4OiBcIkVsICd7MH0nIGRlYmUgc2VyIGlndWFsIG8gbWVub3MgZGUgezF9XCIsXG4gICAgaW52YWxpZEVtYWlsOiBcIlBvciBmYXZvciBhZ3JlZ3VlIHVuIGNvcnJlbyBlbGVjdHLDs25pY28gdsOhbGlkby5cIixcbiAgICB1cmxSZXF1ZXN0RXJyb3I6IFwiTGEgc29saWNpdHVkIHJlZ3Jlc8OzIGVycm9yICd7MH0nLiB7MX1cIixcbiAgICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwiTGEgc29saWNpdHVkIHJlZ3Jlc8OzIHZhY8OtbyBkZSBkYXRhIG8gbGEgcHJvcGllZGFkICd0cmF5ZWN0b3JpYScgbm8gZXMgY29ycmVjdGFcIixcbiAgICBleGNlZWRNYXhTaXplOiBcIkVsIHRhbWHDsW8gZGVsIGFyY2hpdm8gbm8gZGViZSBkZSBleGNlZGVyIHswfS5cIixcbiAgICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiUG9yIGZhdm9yIGFncmVndWUgbGEgb3RyYSBlc3RpbWFjacOzbi5cIixcbiAgICB1cGxvYWRpbmdGaWxlOiBcIlN1IGFyY2hpdm8gc2UgZXN0w6Egc3ViaWVuZG8uIFBvciBmYXZvciBlc3BlcmUgdW5vcyBzZWd1bmRvcyBlIGludGVudGUgZGUgbnVldm8uXCIsXG4gICAgYWRkUm93OiBcIkFncmVndWUgdW5hIGhpbGVyYVwiLFxuICAgIHJlbW92ZVJvdzogXCJFbGltaW5hciB1bmEgaGlsZXJhXCIsXG4gICAgY2hvaWNlc19maXJzdEl0ZW06IFwicHJpbWVyIGFydMOtY3Vsb1wiLFxuICAgIGNob2ljZXNfc2Vjb25kSXRlbTogXCJzZWd1bmRvIGFydMOtY3Vsb1wiLFxuICAgIGNob2ljZXNfdGhpcmRJdGVtOiBcInRlcmNlcmEgYXJ0w61jdWxvXCIsXG4gICAgbWF0cml4X2NvbHVtbjogXCJDb2x1bW5hXCIsXG4gICAgbWF0cml4X3JvdzogXCJIaWxlcmFcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJlc1wiXSA9IHNwYW5pc2hTdXJ2ZXlTdHJpbmdzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9zcGFuaXNoLnRzIiwiLy9DcmVhdGUgYnkgTWF0dGlhcyBBc3BsdW5kXG5pbXBvcnQge3N1cnZleUxvY2FsaXphdGlvbn0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBzd2VkaXNoU3VydmV5U3RyaW5ncyA9IHtcbiAgICBwYWdlUHJldlRleHQ6IFwiRsO2cmVnw6VlbmRlXCIsXG4gICAgcGFnZU5leHRUZXh0OiBcIk7DpHN0YVwiLFxuICAgIGNvbXBsZXRlVGV4dDogXCJGw6RyZGlnXCIsXG4gICAgb3RoZXJJdGVtVGV4dDogXCJBbm5hdCAoYmVza3JpdilcIixcbiAgICBwcm9ncmVzc1RleHQ6IFwiU2lkYSB7MH0gYXYgezF9XCIsXG4gICAgZW1wdHlTdXJ2ZXk6IFwiRGV0IGZpbm5zIGluZ2VuIHN5bmxpZyBzaWRhIGVsbGVyIGZyw6VnYSBpIGVua8OkdGVuLlwiLFxuICAgIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiVGFjayBmw7ZyIGF0dCBkdSBnZW5vbWbDtnJ0IGVua8OkdGVuISFcIixcbiAgICBsb2FkaW5nU3VydmV5OiBcIkVua8OkdGVuIGxhZGRhcy4uLlwiLFxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIlbDpGxqLi4uXCIsXG4gICAgcmVxdWlyZWRFcnJvcjogXCJWYXIgdsOkbmxpZyBiZXN2YXJhIGZyw6VnYW4uXCIsXG4gICAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJWYXIgdsOkbmxpZyBiZXN2YXJhIGZyw6Vnb3JuYSBww6UgYWxsYSByYWRlci5cIixcbiAgICBudW1lcmljRXJyb3I6IFwiVsOkcmRldCBza2EgdmFyYSBudW1lcmlza3QuXCIsXG4gICAgdGV4dE1pbkxlbmd0aDogXCJWYXIgdsOkbmxpZyBhbmdlIG1pbnN0IHswfSB0ZWNrZW4uXCIsXG4gICAgbWluUm93Q291bnRFcnJvcjogXCJWYXIgdsOkbmxpZyBmeWxsIGkgbWluc3QgezB9IHJhZGVyLlwiLFxuICAgIG1pblNlbGVjdEVycm9yOiBcIlZhciB2w6RubGlnIHbDpGxqIMOldG1pbnN0b25lIHswfSB2YXJpYW50ZXIuXCIsXG4gICAgbWF4U2VsZWN0RXJyb3I6IFwiVmFyIHbDpG5saWcgdsOkbGogaW50ZSBmbGVyIMOkbiB7MH0gdmFyaWFudGVyLlwiLFxuICAgIG51bWVyaWNNaW5NYXg6IFwiJ3swfScgc2thIHZhcmEgbGlrYSBtZWQgZWxsZXIgbWVyIMOkbiB7MX0gc2FtdCBsaWthIG1lZCBlbGxlciBtaW5kcmUgw6RuIHsyfVwiLFxuICAgIG51bWVyaWNNaW46IFwiJ3swfScgc2thIHZhcmEgbGlrYSBtZWQgZWxsZXIgbWVyIMOkbiB7MX1cIixcbiAgICBudW1lcmljTWF4OiBcIid7MH0nIHNrYSB2YXJhIGxpa2EgbWVkIGVsbGVyIG1pbmRyZSDDpG4gezF9XCIsXG4gICAgaW52YWxpZEVtYWlsOiBcIlZhciB2w6RubGlnIGFuZ2UgZW4ga29ycmVrdCBlLXBvc3RhZHJlc3MuXCIsXG4gICAgdXJsUmVxdWVzdEVycm9yOiBcIkbDtnJmcsOlZ2FuIHJldHVybmVyYWRlIGZlbGV0ICd7MH0nLiB7MX1cIixcbiAgICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwiQW50aW5nZW4gcmV0dXJuZXJhZGUgZsO2cmZyw6VnYW4gaW5nZW4gZGF0YSBlbGxlciBzw6Ugw6RyIGVnZW5za2FwZW4gJ3BhdGgnIGludGUga29ycmVrdFwiLFxuICAgIGV4Y2VlZE1heFNpemU6IFwiRmlsc3Rvcmxla2VuIGbDpXIgZWogw7Z2ZXJzdGlnYSB7MH0uXCIsXG4gICAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlZhciB2w6RubGlnIGFuZ2UgZGV0IGFuZHJhIHbDpHJkZXQuXCIsXG4gICAgdXBsb2FkaW5nRmlsZTogXCJEaW4gZmlsIGxhZGRhcyB1cHAuIFZhciB2w6RubGlnIHbDpG50YSBuw6VncmEgc2VrdW5kZXIgb2NoIGbDtnJzw7ZrIHNlZGFuIGlnZW4uXCIsXG4gICAgYWRkUm93OiBcIkzDpGdnIHRpbGwgcmFkXCIsXG4gICAgcmVtb3ZlUm93OiBcIlRhIGJvcnRcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJzdlwiXSA9IHN3ZWRpc2hTdXJ2ZXlTdHJpbmdzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9zd2VkaXNoLnRzIiwiaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgdHVya2lzaFN1cnZleVN0cmluZ3MgPSB7XG4gICAgICAgIHBhZ2VQcmV2VGV4dDogXCJHZXJpXCIsXG4gICAgICAgIHBhZ2VOZXh0VGV4dDogXCLEsGxlcmlcIixcbiAgICAgICAgY29tcGxldGVUZXh0OiBcIkFua2V0aSBUYW1hbWxhXCIsXG4gICAgICAgIG90aGVySXRlbVRleHQ6IFwiRGnEn2VyIChhw6fEsWtsYXnEsW7EsXopXCIsXG4gICAgICAgIHByb2dyZXNzVGV4dDogXCJTYXlmYSB7MH0gLyB7MX1cIixcbiAgICAgICAgZW1wdHlTdXJ2ZXk6IFwiQW5rZXR0ZSBnw7Zyw7xudMO8bGVuZWNlayBzYXlmYSB5YSBkYSBzb3J1IG1ldmN1dCBkZcSfaWwuXCIsXG4gICAgICAgIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiQW5rZXRpbWl6aSB0YW1hbWxhZMSxxJ/EsW7EsXogacOnaW4gdGXFn2Vra8O8ciBlZGVyaXouXCIsXG4gICAgICAgIGxvYWRpbmdTdXJ2ZXk6IFwiQW5rZXQgc3VudWN1ZGFuIHnDvGtsZW5peW9yIC4uLlwiLFxuICAgICAgICBvcHRpb25zQ2FwdGlvbjogXCJTZcOnaW5peiAuLi5cIixcbiAgICAgICAgcmVxdWlyZWRFcnJvcjogXCJMw7x0ZmVuIHNvcnV5YSBjZXZhcCB2ZXJpbml6XCIsXG4gICAgICAgIG51bWVyaWNFcnJvcjogXCJHaXJpbGVuIGRlxJ9lciBudW1lcmlrIG9sbWFsxLFkxLFyXCIsXG4gICAgICAgIHRleHRNaW5MZW5ndGg6IFwiRW4gYXogezB9IHNlbWJvbCBnaXJpbml6LlwiLFxuICAgICAgICBtaW5Sb3dDb3VudEVycm9yOiBcIkzDvHRmZW4gZW4gYXogezB9IHNhdMSxcsSxIGRvbGR1cnVuLlwiLFxuICAgICAgICBtaW5TZWxlY3RFcnJvcjogXCJMw7x0ZmVuIGVuIGF6IHswfSBzZcOnZW5lxJ9pIHNlw6dpbml6LlwiLFxuICAgICAgICBtYXhTZWxlY3RFcnJvcjogXCJMw7x0ZmVuIHswfSBhZGV0dGVuIGZhemxhIHNlw6dtZXlpbml6LlwiLFxuICAgICAgICBudW1lcmljTWluTWF4OiBcIlRoZSAnezB9JyBzaG91bGQgYmUgZXF1YWwgb3IgbW9yZSB0aGFuIHsxfSBhbmQgZXF1YWwgb3IgbGVzcyB0aGFuIHsyfVwiLFxuICAgICAgICBudW1lcmljTWluOiBcIid7MH0nIGRlxJ9lcmkgezF9IGRlxJ9lcmluZSBlxZ9pdCB2ZXlhIGLDvHnDvGsgb2xtYWzEsWTEsXJcIixcbiAgICAgICAgbnVtZXJpY01heDogXCInezB9JyBkZcSfZXJpIHsxfSBkZcSfZXJpbmUgZcWfaXQgeWEgZGEga8O8w6fDvGsgb2xtYWzEsWTEsXIuXCIsXG4gICAgICAgIGludmFsaWRFbWFpbDogXCJMw7x0ZmVuIGdlw6dlcmxpIGJpciBlcG9zdGEgYWRyZXNpIGdpcmluaXouXCIsXG4gICAgICAgIHVybFJlcXVlc3RFcnJvcjogXCJUYWxlYmkgxZ91IGhhdGF5xLEgZMO2bmTDvCAnezB9Jy4gezF9XCIsXG4gICAgICAgIHVybEdldENob2ljZXNFcnJvcjogXCJUYWxlcCBoZXJoYW5naSBiaXIgdmVyaSBkw7ZubWVkaSB5YSBkYSAncGF0aCcgw7Z6ZWxsacSfaSBoYXRhbMSxLlwiLFxuICAgICAgICBleGNlZWRNYXhTaXplOiBcIkRvc3lhIGJveXV0dSB7MH0gZGXEn2VyaW5pIGdlw6dlbWV6LlwiLFxuICAgICAgICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiTMO8dGZlbiBkacSfZXIgZGXEn2VybGVyaSBnaXJpbml6LlwiLFxuICAgICAgICB1cGxvYWRpbmdGaWxlOiBcIkRvc3lhbsSxeiB5w7xrbGVuaXlvci4gTMOcdGZlbiBiaXJrYcOnIHNhbml5ZSBiZWtsZXlpbiB2ZSB0ZWtyYXIgZGVuZXlpbi5cIixcbiAgICAgICAgYWRkUm93OiBcIlNhdMSxciBFa2xlXCIsXG4gICAgICAgIHJlbW92ZVJvdzogXCJLYWxkxLFyXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1widHJcIl0gPSB0dXJraXNoU3VydmV5U3RyaW5ncztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vdHVya2lzaC50cyIsImltcG9ydCB7QmFzZX0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHtRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQge1F1ZXN0aW9ufSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHtMb2NhbGl6YWJsZVN0cmluZ30gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIGJvb2xlYW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkJvb2xlYW5Nb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgICBcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKG5hbWUpO1xuICAgICAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwibGFiZWxcIiwgdGhpcywgdHJ1ZSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBxdWVzdGlvbiBjaGVjayB3aWxsIGJlIHJlbmRlcmVkIGluIGluZGV0ZXJtaW5hdGUgbW9kZS4gdmFsdWUgaXMgZW1wdHkuXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0luZGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmlzRW1wdHkoKTsgfVxuICAgIHB1YmxpYyBnZXQgaGFzVGl0bGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnNob3dUaXRsZTsgfVxuICAgIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIC8qKlxuICAgICAqIEdldC9zZXQgcXVlc3Rpb24gdmFsdWUgaW4gMyBtb2RlczogaW5kZXRlcm1pbmF0ZSAodmFsdWUgaXMgZW1wdHkpLCB0cnVlIChjaGVjayBpcyBzZXQpIGFuZCBmYWxzZSAoY2hlY2sgaXMgdW5zZXQpLlxuICAgICAqIEBzZWUgdmFsdWVUcnVlXG4gICAgICogQHNlZSB2YWx1ZUZhbHNlXG4gICAgICovXG4gICAgcHVibGljIGdldCBjaGVja2VkVmFsdWUoKSA6IGFueSB7XG4gICAgICAgIGlmKHRoaXMuaXNFbXB0eSgpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT0gdGhpcy5nZXRWYWx1ZVRydWUoKTtcbiAgICB9XG4gICAgcHVibGljIHNldCBjaGVja2VkVmFsdWUodmFsOiBhbnkpIHtcbiAgICAgICAgaWYodGhpcy5pc1ZhbHVlRW1wdHkodmFsKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsID09IHRydWUgPyB0aGlzLmdldFZhbHVlVHJ1ZSgpIDogdGhpcy5nZXRWYWx1ZUZhbHNlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IHN0YXRlIG9mIHRoZSBjaGVjazogXCJpbmRldGVybWluYXRlXCIgLSBkZWZhdWx0ICh2YWx1ZSBpcyBlbXB0eS9udWxsKSwgXCJ0cnVlXCIgLSB2YWx1ZSBlcXVhbHMgdmFsdWVUcnVlIG9yIHRydWUsIFwiZmFsc2VcIiAtIHZhbHVlIGVxdWFscyB2YWx1ZUZhbHNlIG9yIGZhbHNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVmYXVsdFZhbHVlKCk6IGFueSB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVcIiwgXCJpbmRldGVybWluYXRlXCIpOyB9XG4gICAgcHVibGljIHNldCBkZWZhdWx0VmFsdWUodmFsOiBhbnkpIHtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlXCIsIHZhbCk7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrYm94IGxhYmVsLiBJZiBpdCBpcyBlbXB0eSBhbmQgc2hvd1RpdGxlIGlzIGZhbHNlIHRoZW4gdGl0bGUgaXMgcmVuZGVyZWRcbiAgICAgKiBAc2VlIHNob3dUaXRsZVxuICAgICAqIEBzZWUgdGl0bGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGxhYmVsKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImxhYmVsXCIpOyB9XG4gICAgcHVibGljIHNldCBsYWJlbCh2YWw6ICBzdHJpbmcpIHsgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJsYWJlbFwiLCB2YWwpOyB9XG4gICAgZ2V0IGxvY0xhYmVsKCk6IExvY2FsaXphYmxlU3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJsYWJlbFwiKTsgfVxuICAgIGdldCBsb2NEaXNwbGF5TGFiZWwoKTogTG9jYWxpemFibGVTdHJpbmcgeyBcbiAgICAgICAgaWYodGhpcy5sb2NMYWJlbC50ZXh0KSByZXR1cm4gdGhpcy5sb2NMYWJlbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvd1RpdGxlID8gdGhpcy5sb2NMYWJlbCA6IHRoaXMubG9jVGl0bGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgdG8gc2hvdyB0aGUgcXVlc3Rpb24gdGl0bGUuIEl0IGlzIGhpZGRlbiBieSBkZWZhdWx0LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2hvd1RpdGxlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpdGxlXCIpOyB9XG4gICAgcHVibGljIHNldCBzaG93VGl0bGUodmFsOiBib29sZWFuKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dUaXRsZVwiLCB2YWwpOyB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoaXMgcHJvcGVydHksIGlmIHlvdSB3YW50IHRvIGhhdmUgYSBkaWZmZXJlbnQgdmFsdWUgZnJvbSB0cnVlIHdoZW4gY2hlY2sgaXMgc2V0LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsdWVUcnVlKCk6IGFueSB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZVRydWVcIik7fVxuICAgIHB1YmxpYyBzZXQgdmFsdWVUcnVlKHZhbDogYW55KSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZhbHVlVHJ1ZVwiLCB2YWwpO31cbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSwgaWYgeW91IHdhbnQgdG8gaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZSBmcm9tIGZhbHNlIHdoZW4gY2hlY2sgaXMgdW5zZXQuXG4gICAgICovXG4gICAgcHVibGljIGdldCB2YWx1ZUZhbHNlKCk6IGFueSB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZUZhbHNlXCIpO31cbiAgICBwdWJsaWMgc2V0IHZhbHVlRmFsc2UodmFsOiBhbnkpIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVGYWxzZVwiLCB2YWwpO31cbiAgICBwcml2YXRlIGdldFZhbHVlVHJ1ZSgpOiBhbnkgeyByZXR1cm4gdGhpcy52YWx1ZVRydWUgPyB0aGlzLnZhbHVlVHJ1ZSA6IHRydWU7IH1cbiAgICBwcml2YXRlIGdldFZhbHVlRmFsc2UoKTogYW55IHsgcmV0dXJuIHRoaXMudmFsdWVGYWxzZSA/IHRoaXMudmFsdWVGYWxzZSA6IGZhbHNlOyB9XG4gICAgcHJvdGVjdGVkIHNldERlZmF1bHRWYWx1ZSgpIHtcbiAgICAgICAgaWYodGhpcy5kZWZhdWx0VmFsdWUgPT0gXCJ0cnVlXCIpIHRoaXMuY2hlY2tlZFZhbHVlID0gdHJ1ZTtcbiAgICAgICAgaWYodGhpcy5kZWZhdWx0VmFsdWUgPT0gXCJmYWxzZVwiKSB0aGlzLmNoZWNrZWRWYWx1ZSA9IGZhbHNlO1xuICAgICAgICBpZih0aGlzLmRlZmF1bHRWYWx1ZSA9PSBcImluZGV0ZXJtaW5hdGVcIikgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwiYm9vbGVhblwiLCBbeyBuYW1lOiBcImRlZmF1bHRWYWx1ZVwiLCBkZWZhdWx0OiBcImluZGV0ZXJtaW5hdGVcIiwgY2hvaWNlczogW1wiaW5kZXRlcm1pbmF0ZVwiLCBcImZhbHNlXCIsIFwidHJ1ZVwiXSB9LFxuICAgIHsgbmFtZTogXCJsYWJlbDp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NMYWJlbFwiIH0sIFxuICAgIFwic2hvd1RpdGxlOmJvb2xlYW5cIiwgXCJ2YWx1ZVRydWVcIiwgXCJ2YWx1ZUZhbHNlXCJdLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgUXVlc3Rpb25Cb29sZWFuTW9kZWwoXCJcIik7IH0sIFwicXVlc3Rpb25cIik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiYm9vbGVhblwiLCAobmFtZSkgPT4geyByZXR1cm4gbmV3IFF1ZXN0aW9uQm9vbGVhbk1vZGVsKG5hbWUpOyB9KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9ib29sZWFuLnRzIiwiaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQge1F1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQge1F1ZXN0aW9uQ2hlY2tib3hCYXNlfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBjaGVja2JveCBxdWVzdGlvblxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25DaGVja2JveE1vZGVsIGV4dGVuZHMgUXVlc3Rpb25DaGVja2JveEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIobmFtZSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZGlzcGxheVZhbHVlKCk6IGFueSB7XG4gICAgICAgIGlmKHRoaXMuaXNFbXB0eSgpKSByZXR1cm4gXCJcIjtcbiAgICAgICAgdmFyIGl0ZW1zID0gdGhpcy52aXNpYmxlQ2hvaWNlcztcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsdWU7XG4gICAgICAgIHZhciBzdHIgPSBcIlwiO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgdmFyIHZhbFN0ciA9IHRoaXMuZ2V0RGlzcGxheVZhbHVlKGl0ZW1zLCB2YWx1ZXNbaV0pO1xuICAgICAgICAgICAgaWYodmFsU3RyKSB7XG4gICAgICAgICAgICAgICAgaWYoc3RyKSBzdHIgKz0gXCIsIFwiO1xuICAgICAgICAgICAgICAgIHN0ciArPSB2YWxTdHI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgXG4gICAgcHJvdGVjdGVkIGdldEhhc090aGVyKHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdmFsIHx8ICFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHZhbC5pbmRleE9mKHRoaXMub3RoZXJJdGVtLnZhbHVlKSA+PSAwO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgdmFsdWVGcm9tRGF0YSh2YWw6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICghdmFsKSByZXR1cm4gdmFsO1xuICAgICAgICBpZighQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gW3ZhbF07XG4gICAgICAgIHJldHVybiBzdXBlci52YWx1ZUZyb21EYXRhKHZhbCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCB2YWx1ZUZyb21EYXRhQ29yZSh2YWw6IGFueSk6IGFueSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodmFsW2ldID09IHRoaXMub3RoZXJJdGVtLnZhbHVlKSByZXR1cm4gdmFsO1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzVW5rbm93blZhbHVlKHZhbFtpXSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbW1lbnQgPSB2YWxbaV07XG4gICAgICAgICAgICAgICAgdmFyIG5ld1ZhbCA9IHZhbC5zbGljZSgpO1xuICAgICAgICAgICAgICAgIG5ld1ZhbFtpXSA9IHRoaXMub3RoZXJJdGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXdWYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHZhbHVlVG9EYXRhQ29yZSh2YWw6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICghdmFsIHx8ICF2YWwubGVuZ3RoKSByZXR1cm4gdmFsO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHZhbFtpXSA9PSB0aGlzLm90aGVySXRlbS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldENvbW1lbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmFsID0gdmFsLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbFtpXSA9IHRoaXMuZ2V0Q29tbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJjaGVja2JveFwiO1xuICAgIH1cbn1cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJjaGVja2JveFwiLCBbXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbChcIlwiKTsgfSwgXCJjaGVja2JveGJhc2VcIik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImNoZWNrYm94XCIsIChuYW1lKSA9PiB7IHZhciBxID0gbmV3IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbChuYW1lKTsgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzOyByZXR1cm4gcTsgfSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fY2hlY2tib3gudHMiLCJpbXBvcnQge1F1ZXN0aW9ufSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQge1F1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQge0xvY2FsaXphYmxlU3RyaW5nfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgY29tbWVudCBxdWVzdGlvblxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Db21tZW50TW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihuYW1lKTtcbiAgICAgICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInBsYWNlSG9sZGVyXCIsIHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzZXQgdGhlIGlucHV0IHBsYWNlIGhvbGRlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBsYWNlSG9sZGVyKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBsYWNlSG9sZGVyXCIpOyAgfVxuICAgIHB1YmxpYyBzZXQgcGxhY2VIb2xkZXIodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwbGFjZUhvbGRlclwiLCB2YWwpOyB9XG4gICAgZ2V0IGxvY1BsYWNlSG9sZGVyKCk6IExvY2FsaXphYmxlU3RyaW5nIHtyZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBsYWNlSG9sZGVyXCIpOyB9XG4gICAgLyoqXG4gICAgICogVGhlIGh0bWwgcm93cyBhdHRyaWJ1dGUuXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dzKCk6IG51bWJlciB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyb3dzXCIsIDQpOyB9XG4gICAgcHVibGljIHNldCByb3dzKHZhbDogbnVtYmVyKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd3NcIiwgdmFsKTsgfVxuICAgIC8qKlxuICAgICAqIFRoZSBodG1sIGNvbHMgYXR0cmlidXRlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29scygpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29sc1wiLCA1MCk7IH1cbiAgICBwdWJsaWMgc2V0IGNvbHModmFsOiBudW1iZXIpIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sc1wiLCB2YWwpOyB9XG4gICAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiY29tbWVudFwiO1xuICAgIH1cbiAgICBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gc3VwZXIuaXNFbXB0eSgpIHx8IHRoaXMudmFsdWUgPT09IFwiXCI7XG4gICAgfVxufVxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcImNvbW1lbnRcIiwgW3sgbmFtZTogXCJjb2xzOm51bWJlclwiLCBkZWZhdWx0OiA1MCB9LCB7IG5hbWU6IFwicm93czpudW1iZXJcIiwgZGVmYXVsdDogNCB9LFxuICAgIHtuYW1lOiBcInBsYWNlSG9sZGVyXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQbGFjZUhvbGRlclwifV0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBRdWVzdGlvbkNvbW1lbnRNb2RlbChcIlwiKTsgfSwgXCJxdWVzdGlvblwiKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiY29tbWVudFwiLCAobmFtZSkgPT4geyByZXR1cm4gbmV3IFF1ZXN0aW9uQ29tbWVudE1vZGVsKG5hbWUpOyB9KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9jb21tZW50LnRzIiwiaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQge1F1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQge1F1ZXN0aW9uU2VsZWN0QmFzZX0gZnJvbSBcIi4vcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7TG9jYWxpemFibGVTdHJpbmd9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBkcm9wZG93biBxdWVzdGlvblxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Ecm9wZG93bk1vZGVsIGV4dGVuZHMgUXVlc3Rpb25TZWxlY3RCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKG5hbWUpO1xuICAgICAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwib3B0aW9uc0NhcHRpb25cIiwgdGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgb3B0aW9ucyBjYXB0aW9uIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0YWtlbiBmcm9tIGxvY2FsaXphdGlvbiBzdHJpbmdzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgb3B0aW9uc0NhcHRpb24oKSB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm9wdGlvbnNDYXB0aW9uXCIsIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvcHRpb25zQ2FwdGlvblwiKSk7IH1cbiAgICBwdWJsaWMgc2V0IG9wdGlvbnNDYXB0aW9uKHZhbDogc3RyaW5nKSB7IHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwib3B0aW9uc0NhcHRpb25cIiwgdmFsKTsgfVxuICAgIGdldCBsb2NPcHRpb25zQ2FwdGlvbigpOiBMb2NhbGl6YWJsZVN0cmluZyB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwib3B0aW9uc0NhcHRpb25cIik7IH1cbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJkcm9wZG93blwiO1xuICAgIH1cbiAgICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHsgcmV0dXJuIHRydWU7IH1cbn1cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJkcm9wZG93blwiLCBbeyBuYW1lOiBcIm9wdGlvbnNDYXB0aW9uXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NPcHRpb25zQ2FwdGlvblwifV0sXG4gICAgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbChcIlwiKTsgfSwgXCJzZWxlY3RiYXNlXCIpO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJkcm9wZG93blwiLCAobmFtZSkgPT4geyB2YXIgcSA9IG5ldyBRdWVzdGlvbkRyb3Bkb3duTW9kZWwobmFtZSk7IHEuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlczsgcmV0dXJuIHE7IH0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2Ryb3Bkb3duLnRzIiwiaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQge1F1ZXN0aW9ufSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGFuIHF1ZXN0aW9uIHRoYXQgcmVuZGVycyBlbXB0eSBcImRpdlwiIHRhZy4gSXQgdXNlZCBhcyBhIGJhc2UgY2xhc3MgZm9yIHNvbWUgY3VzdG9tIHdpZGdldHNcbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRW1wdHlNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKG5hbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJlbXB0eVwiO1xuICAgIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcImVtcHR5XCIsIFtdLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgUXVlc3Rpb25FbXB0eU1vZGVsKFwiXCIpOyB9LCBcInF1ZXN0aW9uXCIpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9lbXB0eS50cyIsImltcG9ydCB7SGFzaFRhYmxlfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQge1F1ZXN0aW9ufSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQge1F1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQge0xvY2FsaXphYmxlU3RyaW5nfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHtFeHByZXNzaW9uUnVubmVyfSBmcm9tICcuL2NvbmRpdGlvbnMnO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGV4cHJlc3Npb24gcXVlc3Rpb24uIEl0IGlzIGEgcmVhZC1vbmx5IHF1ZXN0aW9uLiBJdCBjYWxjdWxhdGVzIHZhbHVlIGJhc2VkIG9uIGVweHJlc3Npb24gcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgICBwcml2YXRlIGV4cHJlc3Npb25Jc1J1bm5pbmc6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBleHByZXNzaW9uUnVubmVyOiBFeHByZXNzaW9uUnVubmVyO1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIobmFtZSk7XG4gICAgICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJmb3JtYXRcIiwgdGhpcyk7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImV4cHJlc3Npb25cIiwgXG4gICAgICAgICAgICBmdW5jdGlvbigpIHsgXG4gICAgICAgICAgICAgICAgaWYoc2VsZi5leHByZXNzaW9uUnVubmVyKSB7IFxuICAgICAgICAgICAgICAgICAgICBzZWxmLmV4cHJlc3Npb25SdW5uZXIgPSBuZXcgRXhwcmVzc2lvblJ1bm5lcihzZWxmLmV4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7ICByZXR1cm4gXCJleHByZXNzaW9uXCI7ICB9XG4gICAgLyoqXG4gICAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gZGlzcGxheSB0aGUgdmFsdWUgaW4geW91ciBvd24gZm9ybWF0LiBNYWtlIHN1cmUgeW91IGhhdmUgXCJ7MH1cIiBzdWJzdHJpbmcgaW4geW91ciBzdHJpbmcsIHRvIGRpc3BsYXkgdGhlIGFjdHVhbCB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZvcm1hdCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJmb3JtYXRcIiwgXCJcIik7IH1cbiAgICBwdWJsaWMgc2V0IGZvcm1hdCh2YWw6IHN0cmluZykgeyB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImZvcm1hdFwiLCB2YWwpOyB9XG4gICAgZ2V0IGxvY0Zvcm1hdCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiZm9ybWF0XCIpOyB9XG4gICAgLyoqXG4gICAgICogVGhlIEV4cHJlc3Npb24gdGhhdCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcXVlc3Rpb24gdmFsdWUuIFlvdSBtYXkgdXNlIHN0YW5kYXJkIG9wZXJhdG9ycyBsaWtlICssIC0sICogYW5kIC8sIHNxdWFyZXMgKCkuIEhlcmUgaXMgdGhlIGV4YW1wbGUgb2YgYWNjZXNzaW5nIHRoZSBxdWVzdGlvbiB2YWx1ZSB7cXVlc3Rpb25uYW1lfS4gXG4gICAgICogPGJyLz5FeGFtcGxlOiBcIih7cXVhbnRpdHl9ICoge3ByaWNlfSkgKiAoMTAwIC0ge2Rpc2NvdW50fSkgLyAxMDBcIlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZXhwcmVzc2lvblwiLCBcIlwiKTsgfVxuICAgIHB1YmxpYyBzZXQgZXhwcmVzc2lvbih2YWw6IHN0cmluZykgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJleHByZXNzaW9uXCIsIHZhbCk7IH1cbiAgICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICAgICAgc3VwZXIucnVuQ29uZGl0aW9uKHZhbHVlcyk7XG4gICAgICAgIGlmKCF0aGlzLmV4cHJlc3Npb24gfHwgdGhpcy5leHByZXNzaW9uSXNSdW5uaW5nKSByZXR1cm47XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbklzUnVubmluZyA9IHRydWU7XG4gICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uUnVubmVyKSB0aGlzLmV4cHJlc3Npb25SdW5uZXIgPSBuZXcgRXhwcmVzc2lvblJ1bm5lcih0aGlzLmV4cHJlc3Npb24pO1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5leHByZXNzaW9uUnVubmVyLnJ1bih2YWx1ZXMpO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25Jc1J1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBkaXNwbGF5VmFsdWUoKTogYW55IHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMudmFsdWUpID8gdGhpcy5kZWZhdWx0VmFsdWUgOiB0aGlzLnZhbHVlO1xuICAgICAgICBpZih0aGlzLmlzVmFsdWVFbXB0eSh2YWwpKSByZXR1cm4gXCJcIjtcbiAgICAgICAgdmFyIHN0ciA9IHRoaXMuZ2V0VmFsdWVBc1N0cih2YWwpO1xuICAgICAgICBpZighdGhpcy5mb3JtYXQpIHJldHVybiBzdHI7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdFtcImZvcm1hdFwiXShzdHIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBZb3UgbWF5IHNldCB0aGlzIHByb3BlcnR5IHRvIFwiZGVjaW1hbFwiLCBcImN1cnJlbmN5XCIgb3IgXCJwZXJjZW50XCIuIElmIHlvdSBzZXQgaXQgdG8gXCJjdXJyZW5jeVwiLCB5b3UgbWF5IHVzZSB0aGUgY3VycmVuY3kgcHJvcGVydHkgdG8gZGlzcGxheSB0aGUgdmFsdWUgaW4gY3VycmVuY3kgZGlmZmVyZW50IGZyb20gVVNELlxuICAgICAqIEBzZWUgY3VycmVuY3lcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRpc3BsYXlTdHlsZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVN0eWxlXCIsIFwibm9uZVwiKTsgfVxuICAgIHB1YmxpYyBzZXQgZGlzcGxheVN0eWxlKHZhbDogc3RyaW5nKSB7dGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVN0eWxlXCIsIHZhbCk7fVxuICAgIC8qKlxuICAgICAqIFVzZSBpdCB0byBkaXNwbGF5IHRoZSB2YWx1ZSBpbiB0aGUgY3VycmVuY3kgZGlmZmVyZW4gZnJvbSBVU0QuIFRoZSBkaXNwbGF5U3R5cGUgc2hvdWxkIGJlIHNldCB0byBcImN1cnJlbmN5XCIuXG4gICAgICogQHNlZSBkaXNwbGF5U3R5bGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbmN5KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjdXJyZW5jeVwiLCBcIlVTRFwiKTsgfVxuICAgIHB1YmxpYyBzZXQgY3VycmVuY3kodmFsOiBzdHJpbmcpIHsgXG4gICAgICAgIGlmKGdldEN1cnJlY3lDb2RlcygpLmluZGV4T2YodmFsKSA8IDApIHJldHVybjtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY3VycmVuY3lcIiwgdmFsKTsgXG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdXNlR3JvdXBpbmcoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ1c2VHcm91cGluZ1wiLCB0cnVlKTsgfVxuICAgIHB1YmxpYyBzZXQgdXNlR3JvdXBpbmcodmFsOiBib29sZWFuKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInVzZUdyb3VwaW5nXCIsIHZhbCk7IH1cbiAgICBwcm90ZWN0ZWQgZ2V0VmFsdWVBc1N0cih2YWw6IGFueSk6IHN0cmluZyB7XG4gICAgICAgIGlmKHRoaXMuZGlzcGxheVN0eWxlICE9IFwibm9uZVwiICYmICFpc05hTihwYXJzZUZsb2F0KHZhbCkpICYmIGlzRmluaXRlKHZhbCkpIHtcbiAgICAgICAgICAgIHZhciBsb2NhbGUgPSB0aGlzLmdldExvY2FsZSgpO1xuICAgICAgICAgICAgaWYoIWxvY2FsZSkgbG9jYWxlID0gXCJlblwiO1xuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7c3R5bGU6IHRoaXMuZGlzcGxheVN0eWxlLCBjdXJyZW5jeTogdGhpcy5jdXJyZW5jeSwgdXNlR3JvdXBpbmc6IHRoaXMudXNlR3JvdXBpbmd9O1xuICAgICAgICAgICAgcmV0dXJuIHZhbC50b0xvY2FsZVN0cmluZyhsb2NhbGUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWwudG9TdHJpbmcoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlY3lDb2RlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gW1wiQUVEXCIsXCJBRk5cIixcIkFMTFwiLFwiQU1EXCIsXCJBTkdcIixcIkFPQVwiLFwiQVJTXCIsXCJBVURcIixcIkFXR1wiLFwiQVpOXCIsXCJCQU1cIixcIkJCRFwiLFwiQkRUXCIsXCJCR05cIixcIkJIRFwiLFwiQklGXCIsXCJCTURcIixcIkJORFwiLFwiQk9CXCIsXCJCT1ZcIixcIkJSTFwiLFwiQlNEXCIsXCJCVE5cIixcIkJXUFwiLFwiQllOXCIsXCJCWkRcIixcIkNBRFwiLFwiQ0RGXCIsXCJDSEVcIixcIkNIRlwiLFwiQ0hXXCIsXCJDTEZcIixcIkNMUFwiLFwiQ05ZXCIsXG4gICAgXCJDT1BcIixcIkNPVVwiLFwiQ1JDXCIsXCJDVUNcIixcIkNVUFwiLFwiQ1ZFXCIsXCJDWktcIixcIkRKRlwiLFwiREtLXCIsXCJET1BcIixcIkRaRFwiLFwiRUdQXCIsXCJFUk5cIixcIkVUQlwiLFwiRVVSXCIsXCJGSkRcIixcIkZLUFwiLFwiR0JQXCIsXCJHRUxcIixcIkdIU1wiLFwiR0lQXCIsXCJHTURcIixcIkdORlwiLFwiR1RRXCIsXCJHWURcIixcIkhLRFwiLFwiSE5MXCIsXCJIUktcIixcIkhUR1wiLFwiSFVGXCIsXCJJRFJcIixcIklMU1wiLFwiSU5SXCIsXCJJUURcIixcbiAgICBcIklSUlwiLFwiSVNLXCIsXCJKTURcIixcIkpPRFwiLFwiSlBZXCIsXCJLRVNcIixcIktHU1wiLFwiS0hSXCIsXCJLTUZcIixcIktQV1wiLFwiS1dEXCIsXCJLWURcIixcIktaVFwiLFwiTEFLXCIsXCJMQlBcIixcIkxLUlwiLFwiTFJEXCIsXCJMU0xcIixcIkxZRFwiLFwiTUFEXCIsXCJNRExcIixcIk1HQVwiLFwiTUtEXCIsXCJNTUtcIixcIk1OVFwiLFwiTU9QXCIsXCJNUk9cIixcIk1VUlwiLFwiTVZSXCIsXCJNV0tcIixcIk1YTlwiLFwiTVhWXCIsXCJNWVJcIixcIk1aTlwiLFxuICAgIFwiTkFEXCIsXCJOR05cIixcIk5JT1wiLFwiTk9LXCIsXCJOUFJcIixcIk5aRFwiLFwiT01SXCIsXCJQQUJcIixcIlBFTlwiLFwiUEdLXCIsXCJQSFBcIixcIlBLUlwiLFwiUExOXCIsXCJQWUdcIixcIlFBUlwiLFwiUk9OXCIsXCJSU0RcIixcIlJVQlwiLFwiUldGXCIsXCJTQVJcIixcIlNCRFwiLFwiU0NSXCIsXCJTREdcIixcIlNFS1wiLFwiU0dEXCIsXCJTSFBcIixcIlNMTFwiLFwiU09TXCIsXCJTUkRcIixcIlNTUFwiLFwiU1REXCIsXCJTVkNcIixcIlNZUFwiLFwiU1pMXCIsXG4gICAgXCJUSEJcIixcIlRKU1wiLFwiVE1UXCIsXCJUTkRcIixcIlRPUFwiLFwiVFJZXCIsXCJUVERcIixcIlRXRFwiLFwiVFpTXCIsXCJVQUhcIixcIlVHWFwiLFwiVVNEXCIsXCJVU05cIixcIlVZSVwiLFwiVVlVXCIsXCJVWlNcIixcIlZFRlwiLFwiVk5EXCIsXCJWVVZcIixcIldTVFwiLFwiWEFGXCIsXCJYQUdcIixcIlhBVVwiLFwiWEJBXCIsXCJYQkJcIixcIlhCQ1wiLFwiWEJEXCIsXCJYQ0RcIixcIlhEUlwiLFwiWE9GXCIsXCJYUERcIixcIlhQRlwiLFwiWFBUXCIsXCJYU1VcIixcbiAgICBcIlhUU1wiLFwiWFVBXCIsXCJYWFhcIixcIllFUlwiLFwiWkFSXCIsXCJaQVJcIixcIlpNV1wiLFwiWldMXCJdO1xufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwiZXhwcmVzc2lvblwiLCBbXCJleHByZXNzaW9uOmV4cHJlc3Npb25cIiwge25hbWU6XCJmb3JtYXRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0Zvcm1hdFwifSxcbiAgICB7bmFtZTogXCJkaXNwbGF5U3R5bGVcIiwgZGVmYXVsdDogXCJkZWNpbWFsXCIsIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJkZWNpbWFsXCIsIFwiY3VycmVuY3lcIiwgXCJwZXJjZW50XCJdfSxcbiAgICB7bmFtZTogXCJjdXJyZW5jeVwiLCBjaG9pY2VzOiAoKSA9PiB7IHJldHVybiBnZXRDdXJyZWN5Q29kZXMoKSB9LCBkZWZhdWx0OiBcIlVTRFwifSwge25hbWU6IFwidXNlR3JvdXBpbmc6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlfSxcbiAgICB7bmFtZTpcImNvbW1lbnRUZXh0XCIsIHZpc2libGU6IGZhbHNlfSwge25hbWU6XCJlbmFibGVJZlwiLCB2aXNpYmxlOiBmYWxzZX0sIHtuYW1lOlwiaXNSZXF1aXJlZFwiLCB2aXNpYmxlOiBmYWxzZX0sIFxuICAgIHtuYW1lOlwicmVhZE9ubHlcIiwgdmlzaWJsZTogZmFsc2V9LCB7bmFtZTpcInJlcXVpcmVkRXJyb3JUZXh0XCIsIHZpc2libGU6IGZhbHNlfSwge25hbWU6XCJ2YWxpZGF0b3JzXCIsIHZpc2libGU6IGZhbHNlfV0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbChcIlwiKTsgfSwgXCJxdWVzdGlvblwiKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiZXhwcmVzc2lvblwiLCAobmFtZSkgPT4geyByZXR1cm4gbmV3IFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsKG5hbWUpOyB9KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fZXhwcmVzc2lvbi50cyIsImltcG9ydCB7UXVlc3Rpb259IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQge0pzb25PYmplY3R9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7UXVlc3Rpb25GYWN0b3J5fSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7U3VydmV5RXJyb3J9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7Q3VzdG9tRXJyb3IsIEV4Y2VlZFNpemVFcnJvcn0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7c3VydmV5TG9jYWxpemF0aW9ufSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBmaWxlIHF1ZXN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkZpbGVNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgICBwcml2YXRlIGlzVXBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJldmlld1ZhbHVlTG9hZGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihuYW1lKTtcbiAgICB9XG4gICAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiZmlsZVwiO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgaXQgdG8gdHJ1ZSwgdG8gc2hvdyB0aGUgcHJldmlldyBmb3IgdGhlIGltYWdlIGZpbGVzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2hvd1ByZXZpZXcoKSB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UHJldmlld1wiLCBmYWxzZSk7IH1cbiAgICBwdWJsaWMgc2V0IHNob3dQcmV2aWV3KHZhbDogYm9vbGVhbikgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UHJldmlld1wiLCB2YWwpIH1cbiAgICAvKipcbiAgICAgKiBUaGUgaW1hZ2UgaGVpZ2h0LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW1hZ2VIZWlnaHQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImltYWdlSGVpZ2h0XCIpOyB9XG4gICAgcHVibGljIHNldCBpbWFnZUhlaWdodCh2YWw6IHN0cmluZykgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbWFnZUhlaWdodFwiLCB2YWwpOyB9XG4gICAgLyoqXG4gICAgICogVGhlIGltYWdlIHdpZHRoLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW1hZ2VXaWR0aCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VXaWR0aFwiKTsgfVxuICAgIHB1YmxpYyBzZXQgaW1hZ2VXaWR0aCh2YWw6IHN0cmluZykgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbWFnZVdpZHRoXCIsIHZhbCk7IH1cbiAgICAvKipcbiAgICAgKiBTZXQgaXQgdG8gdHJ1ZSB0byBzZXJpYWxpemUgZmlsZSBjb250ZW50IGFzIHRleHQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBzdG9yZURhdGFBc1RleHQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdG9yZURhdGFBc1RleHRcIiwgZmFsc2UpOyB9XG4gICAgcHVibGljIHNldCBzdG9yZURhdGFBc1RleHQodmFsOiBib29sZWFuKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0b3JlRGF0YUFzVGV4dFwiLCB2YWwpOyB9XG4gICAgLyoqXG4gICAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gc2V0dXAgdGhlIG1heGltdW0gYWxsb3dlZCBmaWxlIHNpemUuXG4gICAgICovXG4gICAgcHVibGljIGdldCBtYXhTaXplKCk6IG51bWJlciB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhTaXplXCIsIDApOyB9XG4gICAgcHVibGljIHNldCBtYXhTaXplKHZhbDogbnVtYmVyKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFNpemVcIiwgdmFsKTsgfVxuICAgIC8qKlxuICAgICAqIExvYWQgZmlsZSBwcm9ncmFtbWF0aWNhbGx5LlxuICAgICAqIEBwYXJhbSBmaWxlIFxuICAgICAqL1xuICAgIHB1YmxpYyBsb2FkRmlsZShmaWxlOiBGaWxlKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuc3VydmV5ICYmICF0aGlzLnN1cnZleS51cGxvYWRGaWxlKHRoaXMubmFtZSwgZmlsZSwgdGhpcy5zdG9yZURhdGFBc1RleHQsIGZ1bmN0aW9uIChzdGF0dXM6IHN0cmluZykgeyBzZWxmLmlzVXBsb2FkaW5nID0gc3RhdHVzID09IFwidXBsb2FkaW5nXCI7ICB9KSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNldEZpbGVWYWx1ZShmaWxlKTtcbiAgICB9XG4gICAgcHVibGljIHByZXZpZXdWYWx1ZTogYW55O1xuICAgIHByb3RlY3RlZCBzZXRGaWxlVmFsdWUoZmlsZTogRmlsZSkge1xuICAgICAgICBpZiAoIUZpbGVSZWFkZXIpIHJldHVybjtcbiAgICAgICAgaWYgKCF0aGlzLnNob3dQcmV2aWV3ICYmICF0aGlzLnN0b3JlRGF0YUFzVGV4dCkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5jaGVja0ZpbGVGb3JFcnJvcnMoZmlsZSkpIHJldHVybjtcbiAgICAgICAgdmFyIGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGlmIChzZWxmLnNob3dQcmV2aWV3KSB7XG4gICAgICAgICAgICAgICAgc2VsZi5wcmV2aWV3VmFsdWUgPSBzZWxmLmlzRmlsZUltYWdlKGZpbGUpID8gZmlsZVJlYWRlci5yZXN1bHQgOiBudWxsO1xuICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKHNlbGYucHJldmlld1ZhbHVlTG9hZGVkQ2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlbGYuc3RvcmVEYXRhQXNUZXh0KSB7XG4gICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IGZpbGVSZWFkZXIucmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIG9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcbiAgICAgICAgc3VwZXIub25DaGVja0ZvckVycm9ycyhlcnJvcnMpO1xuICAgICAgICBpZiAodGhpcy5pc1VwbG9hZGluZykge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IEN1c3RvbUVycm9yKHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJ1cGxvYWRpbmdGaWxlXCIpKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBjaGVja0ZpbGVGb3JFcnJvcnMoZmlsZTogRmlsZSk6IGJvb2xlYW4ge1xuICAgICAgICB2YXIgZXJyb3JMZW5ndGggPSB0aGlzLmVycm9ycyA/IHRoaXMuZXJyb3JzLmxlbmd0aCA6IDA7XG4gICAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgICAgIGlmICh0aGlzLm1heFNpemUgPiAwICYmIGZpbGUuc2l6ZSA+IHRoaXMubWF4U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvcnMucHVzaChuZXcgRXhjZWVkU2l6ZUVycm9yKHRoaXMubWF4U2l6ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvckxlbmd0aCAhPSB0aGlzLmVycm9ycy5sZW5ndGggfHwgdGhpcy5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5lcnJvcnNDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9ycy5sZW5ndGggPiAwO1xuICAgIH1cbiAgICBwcml2YXRlIGlzRmlsZUltYWdlKGZpbGU6IEZpbGUpIHtcbiAgICAgICAgaWYgKCFmaWxlIHx8ICFmaWxlLnR5cGUpIHJldHVybjtcbiAgICAgICAgdmFyIHN0ciA9IGZpbGUudHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gc3RyLmluZGV4T2YoXCJpbWFnZVwiKSA9PSAwO1xuICAgIH1cbn1cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJmaWxlXCIsIFtcInNob3dQcmV2aWV3OmJvb2xlYW5cIiwgXCJpbWFnZUhlaWdodFwiLCBcImltYWdlV2lkdGhcIiwgXCJzdG9yZURhdGFBc1RleHQ6Ym9vbGVhblwiLCBcIm1heFNpemU6bnVtYmVyXCJdLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgUXVlc3Rpb25GaWxlTW9kZWwoXCJcIik7IH0sIFwicXVlc3Rpb25cIik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImZpbGVcIiwgKG5hbWUpID0+IHsgcmV0dXJuIG5ldyBRdWVzdGlvbkZpbGVNb2RlbChuYW1lKTsgfSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fZmlsZS50cyIsImltcG9ydCB7UXVlc3Rpb25CYXNlfSBmcm9tIFwiLi9xdWVzdGlvbmJhc2VcIjtcbmltcG9ydCB7SnNvbk9iamVjdH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHtRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHtMb2NhbGl6YWJsZVN0cmluZ30gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBodG1sIHF1ZXN0aW9uLiBVbmxpa2Ugb3RoZXIgcXVlc3Rpb25zIGl0IGRvZXNuJ3QgaGF2ZSB2YWx1ZSBhbmQgdGl0bGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkh0bWxNb2RlbCBleHRlbmRzIFF1ZXN0aW9uQmFzZSB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihuYW1lKTtcbiAgICAgICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImh0bWxcIiwgdGhpcyk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcImh0bWxcIjtcbiAgICB9XG4gICAgcHVibGljIGdldCBodG1sKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImh0bWxcIiwgXCJcIik7IH1cbiAgICBwdWJsaWMgc2V0IGh0bWwodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJodG1sXCIsIHZhbCk7IH1cbiAgICBnZXQgbG9jSHRtbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiaHRtbFwiKTsgfVxuICAgIHB1YmxpYyBnZXQgcHJvY2Vzc2VkSHRtbCgpIHsgcmV0dXJuIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkucHJvY2Vzc0h0bWwodGhpcy5odG1sKSA6IHRoaXMuaHRtbDsgfVxufVxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcImh0bWxcIiwgW3tuYW1lOlwiaHRtbDpodG1sXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NIdG1sXCJ9XSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFF1ZXN0aW9uSHRtbE1vZGVsKFwiXCIpOyB9LCBcInF1ZXN0aW9uYmFzZVwiKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiaHRtbFwiLCAobmFtZSkgPT4geyByZXR1cm4gbmV3IFF1ZXN0aW9uSHRtbE1vZGVsKG5hbWUpOyB9KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9odG1sLnRzIiwiaW1wb3J0IHtCYXNlfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQge0l0ZW1WYWx1ZX0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQge1F1ZXN0aW9ufSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQge1N1cnZleUVycm9yfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQge3N1cnZleUxvY2FsaXphdGlvbn0gZnJvbSAnLi9zdXJ2ZXlTdHJpbmdzJztcbmltcG9ydCB7Q3VzdG9tRXJyb3J9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQge1F1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQge0xvY2FsaXphYmxlU3RyaW5nfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNYXRyaXhEYXRhIHtcbiAgICBvbk1hdHJpeFJvd0NoYW5nZWQocm93OiBNYXRyaXhSb3dNb2RlbCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhSb3dNb2RlbCB7XG4gICAgcHJpdmF0ZSBkYXRhOiBJTWF0cml4RGF0YTtcbiAgICBwcml2YXRlIGl0ZW06IEl0ZW1WYWx1ZTtcbiAgICBwcm90ZWN0ZWQgcm93VmFsdWU6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKGl0ZW06IEl0ZW1WYWx1ZSwgcHVibGljIGZ1bGxOYW1lOiBzdHJpbmcsIGRhdGE6IElNYXRyaXhEYXRhLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuaXRlbSA9IGl0ZW07XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMucm93VmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLml0ZW0udmFsdWU7IH1cbiAgICBwdWJsaWMgZ2V0IHRleHQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuaXRlbS50ZXh0OyB9XG4gICAgcHVibGljIGdldCBsb2NUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbS5sb2NUZXh0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhpcy5yb3dWYWx1ZTsgfVxuICAgIHB1YmxpYyBzZXQgdmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLnJvd1ZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIGlmICh0aGlzLmRhdGEpIHRoaXMuZGF0YS5vbk1hdHJpeFJvd0NoYW5nZWQodGhpcyk7XG4gICAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQoKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIG9uVmFsdWVDaGFuZ2VkKCkge1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIHNpbXBsZSBtYXRyaXggcXVlc3Rpb24uIFxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIGltcGxlbWVudHMgSU1hdHJpeERhdGEge1xuICAgIHByaXZhdGUgY29sdW1uc1ZhbHVlOiBBcnJheTxJdGVtVmFsdWU+O1xuICAgIHByaXZhdGUgcm93c1ZhbHVlOiBBcnJheTxJdGVtVmFsdWU+O1xuICAgIHByaXZhdGUgaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgZ2VuZXJhdGVkVmlzaWJsZVJvd3M6IEFycmF5PE1hdHJpeFJvd01vZGVsPjtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKG5hbWUpO1xuICAgICAgICB0aGlzLmNvbHVtbnNWYWx1ZSA9IHRoaXMuY3JlYXRlSXRlbVZhbHVlcyhcImNvbHVtbnNcIik7XG4gICAgICAgIHRoaXMucm93c1ZhbHVlID0gdGhpcy5jcmVhdGVJdGVtVmFsdWVzKFwicm93c1wiKTtcbiAgICB9XG4gICAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwibWF0cml4XCI7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaXNBbGxvd1RpdGxlTGVmdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCBpZiB5b3Ugd2FudCBhIHVzZXIgdG8gYW5zd2VyIGFsbCByb3dzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNBbGxSb3dSZXF1aXJlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzQWxsUm93UmVxdWlyZWRcIiwgZmFsc2UpOyB9XG4gICAgcHVibGljIHNldCBpc0FsbFJvd1JlcXVpcmVkKHZhbDogYm9vbGVhbikgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc0FsbFJvd1JlcXVpcmVkXCIsIHZhbCk7IH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUsIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSByb3cuXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNSb3dzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dzVmFsdWUubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2YgY29sdW1ucy4gQSBjb2x1bW4gaGFzIGEgdmFsdWUgYW5kIGFuIG9wdGlvbmFsIHRleHRcbiAgICAgKi9cbiAgICBnZXQgY29sdW1ucygpOiBBcnJheTxhbnk+IHsgcmV0dXJuIHRoaXMuY29sdW1uc1ZhbHVlOyB9XG4gICAgc2V0IGNvbHVtbnMobmV3VmFsdWU6IEFycmF5PGFueT4pIHtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uc1wiLCBuZXdWYWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIHJvd3MuIEEgcm93IGhhcyBhIHZhbHVlIGFuZCBhbiBvcHRpb25hbCB0ZXh0XG4gICAgICovXG4gICAgZ2V0IHJvd3MoKTogQXJyYXk8YW55PiB7IHJldHVybiB0aGlzLnJvd3NWYWx1ZTsgfVxuICAgIHNldCByb3dzKG5ld1ZhbHVlOiBBcnJheTxhbnk+KSB7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd3NcIiwgbmV3VmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHJvd3MgYXMgbW9kZWwgb2JqZWN0cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZpc2libGVSb3dzKCk6IEFycmF5PE1hdHJpeFJvd01vZGVsPiB7XG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8TWF0cml4Um93TW9kZWw+KCk7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgICAgICBpZiAoIXZhbCkgdmFsID0ge307XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucm93c1tpXS52YWx1ZSkgY29udGludWU7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmNyZWF0ZU1hdHJpeFJvdyh0aGlzLnJvd3NbaV0sIHRoaXMubmFtZSArICdfJyArIHRoaXMucm93c1tpXS52YWx1ZS50b1N0cmluZygpLCB2YWxbdGhpcy5yb3dzW2ldLnZhbHVlXSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY3JlYXRlTWF0cml4Um93KG5ldyBJdGVtVmFsdWUobnVsbCksIHRoaXMubmFtZSwgdmFsKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IHJlc3VsdDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7IHJldHVybiB0aGlzLmhhc1ZhbHVlc0luQWxsUm93cygpOyB9XG4gICAgcHJvdGVjdGVkIG9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcbiAgICAgICAgc3VwZXIub25DaGVja0ZvckVycm9ycyhlcnJvcnMpO1xuICAgICAgICBpZiAodGhpcy5oYXNFcnJvckluUm93cygpKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgQ3VzdG9tRXJyb3Ioc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInJlcXVpcmVkSW5BbGxSb3dzRXJyb3JcIikpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGhhc0Vycm9ySW5Sb3dzKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNBbGxSb3dSZXF1aXJlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gIXRoaXMuaGFzVmFsdWVzSW5BbGxSb3dzKCk7XG4gICAgfVxuICAgIHByaXZhdGUgaGFzVmFsdWVzSW5BbGxSb3dzKCk6IGJvb2xlYW4ge1xuICAgICAgICB2YXIgcm93cyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3M7XG4gICAgICAgIGlmICghcm93cykgcm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgICAgIGlmICghcm93cykgcmV0dXJuIHRydWU7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHJvd3NbaV0udmFsdWU7XG4gICAgICAgICAgICBpZiAoIXZhbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgY3JlYXRlTWF0cml4Um93KGl0ZW06IEl0ZW1WYWx1ZSwgZnVsbE5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IE1hdHJpeFJvd01vZGVsIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXRyaXhSb3dNb2RlbChpdGVtLCBmdWxsTmFtZSwgdGhpcywgdmFsdWUpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzUm93Q2hhbmdpbmcgfHwgISh0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSB8fCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgICAgICBpZiAoIXZhbCkgdmFsID0ge307XG4gICAgICAgIGlmICh0aGlzLnJvd3MubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbMF0udmFsdWUgPSB2YWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcm93ID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgcm93VmFsID0gdmFsW3Jvdy5uYW1lXSA/IHZhbFtyb3cubmFtZV0gOiBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV0udmFsdWUgPSByb3dWYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZGlzcGxheVZhbHVlKCk6IGFueSB7XG4gICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLnZhbHVlO1xuICAgICAgICBpZighdmFsdWVzKSByZXR1cm4gdmFsdWVzO1xuICAgICAgICBmb3IodmFyIGtleSBpbiB2YWx1ZXMpIHtcbiAgICAgICAgICAgIHZhbHVlc1trZXldID0gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKHRoaXMuY29sdW1ucywgdmFsdWVzW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuICAgIC8vSU1hdHJpeERhdGFcbiAgICBvbk1hdHJpeFJvd0NoYW5nZWQocm93OiBNYXRyaXhSb3dNb2RlbCkge1xuICAgICAgICBpZiAodGhpcy5pc1Jvd0NoYW5naW5nKSByZXR1cm47XG4gICAgICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XG4gICAgICAgIGlmICghdGhpcy5oYXNSb3dzKSB7XG4gICAgICAgICAgICB0aGlzLnNldE5ld1ZhbHVlKHJvdy52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgaWYgKCFuZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdWYWx1ZVtyb3cubmFtZV0gPSByb3cudmFsdWU7XG4gICAgICAgICAgICB0aGlzLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSBmYWxzZTtcbiAgICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJtYXRyaXhcIiwgW3sgbmFtZTogXCJjb2x1bW5zOml0ZW12YWx1ZXNcIiwgb25HZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55KSB7IHJldHVybiBJdGVtVmFsdWUuZ2V0RGF0YShvYmouY29sdW1ucyk7IH0sIG9uU2V0VmFsdWU6IGZ1bmN0aW9uIChvYmo6IGFueSwgdmFsdWU6IGFueSkgeyBvYmouY29sdW1ucyA9IHZhbHVlOyB9fSxcbiAgICB7IG5hbWU6IFwicm93czppdGVtdmFsdWVzXCIsIG9uR2V0VmFsdWU6IGZ1bmN0aW9uIChvYmo6IGFueSkgeyByZXR1cm4gSXRlbVZhbHVlLmdldERhdGEob2JqLnJvd3MpOyB9LCBvblNldFZhbHVlOiBmdW5jdGlvbiAob2JqOiBhbnksIHZhbHVlOiBhbnkpIHsgb2JqLnJvd3MgPSB2YWx1ZTsgfSB9LFxuICAgIFwiaXNBbGxSb3dSZXF1aXJlZDpib29sZWFuXCJdLCAgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFF1ZXN0aW9uTWF0cml4TW9kZWwoXCJcIik7IH0sIFwicXVlc3Rpb25cIik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibWF0cml4XCIsIChuYW1lKSA9PiB7IHZhciBxID0gbmV3IFF1ZXN0aW9uTWF0cml4TW9kZWwobmFtZSk7IHEucm93cyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Um93czsgcS5jb2x1bW5zID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDb2x1bXM7IHJldHVybiBxOyB9KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9tYXRyaXgudHMiLCJpbXBvcnQge1F1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UsXG4gICAgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgSU1hdHJpeERyb3Bkb3duRGF0YVxufSBmcm9tIFwiLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmJhc2VcIjtcbmltcG9ydCB7SnNvbk9iamVjdH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHtJdGVtVmFsdWV9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHtRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7TG9jYWxpemFibGVTdHJpbmd9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhEcm9wZG93blJvd01vZGVsIGV4dGVuZHMgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2Uge1xuICAgIHByaXZhdGUgaXRlbTogSXRlbVZhbHVlO1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcsIGl0ZW06IEl0ZW1WYWx1ZSwgZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YSwgdmFsdWU6IGFueSkge1xuICAgICAgICBzdXBlcihkYXRhLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuaXRlbSA9IGl0ZW07XG4gICAgICAgIHRoaXMuYnVpbGRDZWxscygpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHJvd05hbWUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMubmFtZTsgfVxuICAgIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5pdGVtLnRleHQ7IH1cbiAgICBwdWJsaWMgZ2V0IGxvY1RleHQoKTogTG9jYWxpemFibGVTdHJpbmcgeyByZXR1cm4gdGhpcy5pdGVtLmxvY1RleHQ7IH1cbn1cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBtYXRyaXggZHJvcGRvd24gcXVlc3Rpb24uIFlvdSBtYXkgdXNlIGEgZHJvcGRvd24sIGNoZWNrYm94LCByYWRpb2dyb3VwLCB0ZXh0IGFuZCBjb21tZW50IHF1ZXN0aW9ucyBhcyBhIGNlbGwgZWRpdG9ycy5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCBleHRlbmRzIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UgaW1wbGVtZW50cyBJTWF0cml4RHJvcGRvd25EYXRhIHtcbiAgICBwcml2YXRlIHJvd3NWYWx1ZTogQXJyYXk8SXRlbVZhbHVlPjtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIobmFtZSk7XG4gICAgICAgIHRoaXMucm93c1ZhbHVlID0gdGhpcy5jcmVhdGVJdGVtVmFsdWVzKFwicm93c1wiKTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwicm93c1wiLCBmdW5jdGlvbigpIHtzZWxmLmdlbmVyYXRlZFZpc2libGVSb3dzID0gbnVsbDt9KTtcbiAgICB9XG4gICAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwibWF0cml4ZHJvcGRvd25cIjtcbiAgICB9XG4gICAgcHVibGljIGdldCBkaXNwbGF5VmFsdWUoKTogYW55IHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsdWU7XG4gICAgICAgIGlmKCF2YWx1ZXMpIHJldHVybiB2YWx1ZXM7XG4gICAgICAgIHZhciByb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICB2YXIgcm93VmFsdWUgPSB0aGlzLnJvd3NbaV0udmFsdWU7XG4gICAgICAgICAgICB2YXIgdmFsID0gdmFsdWVzW3Jvd1ZhbHVlXTtcbiAgICAgICAgICAgIGlmKCF2YWwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdmFsdWVzW3Jvd1ZhbHVlXSA9IHRoaXMuZ2V0Um93RGlzcGxheVZhbHVlKHJvd3NbaV0sIHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiByb3dzLiBBIHJvdyBoYXMgYSB2YWx1ZSBhbmQgYW4gb3B0aW9uYWwgdGV4dFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm93cygpOiBBcnJheTxhbnk+IHsgcmV0dXJuIHRoaXMucm93c1ZhbHVlOyB9XG4gICAgcHVibGljIHNldCByb3dzKHZhbDogQXJyYXk8YW55Pikge1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyb3dzXCIsIHZhbCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZW5lcmF0ZVJvd3MoKTogQXJyYXk8TWF0cml4RHJvcGRvd25Sb3dNb2RlbD4ge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PE1hdHJpeERyb3Bkb3duUm93TW9kZWw+KCk7XG4gICAgICAgIGlmICghdGhpcy5yb3dzIHx8IHRoaXMucm93cy5sZW5ndGggPT09IDApIHJldHVybiByZXN1bHQ7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgICAgICBpZiAoIXZhbCkgdmFsID0ge307XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucm93c1tpXS52YWx1ZSkgY29udGludWU7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmNyZWF0ZU1hdHJpeFJvdyh0aGlzLnJvd3NbaV0sIHZhbFt0aGlzLnJvd3NbaV0udmFsdWVdKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGNyZWF0ZU1hdHJpeFJvdyhpdGVtOiBJdGVtVmFsdWUsIHZhbHVlOiBhbnkpOiBNYXRyaXhEcm9wZG93blJvd01vZGVsIHtcbiAgICAgICAgdmFyIHJvdyA9IG5ldyBNYXRyaXhEcm9wZG93blJvd01vZGVsKGl0ZW0udmFsdWUsIGl0ZW0sIHRoaXMsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vbk1hdHJpeFJvd0NyZWF0ZWQocm93KTtcbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJtYXRyaXhkcm9wZG93blwiLCBbeyBuYW1lOiBcInJvd3M6aXRlbXZhbHVlc1wiLCBvbkdldFZhbHVlOiBmdW5jdGlvbiAob2JqOiBhbnkpIHsgcmV0dXJuIEl0ZW1WYWx1ZS5nZXREYXRhKG9iai5yb3dzKTsgfSwgb25TZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55LCB2YWx1ZTogYW55KSB7IG9iai5yb3dzID0gdmFsdWU7IH19XSxcbiAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsKFwiXCIpOyB9LCBcIm1hdHJpeGRyb3Bkb3duYmFzZVwiKTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtYXRyaXhkcm9wZG93blwiLCAobmFtZSkgPT4geyB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwobmFtZSk7IHEuY2hvaWNlcyA9IFsxLCAyLCAzLCA0LCA1XTsgcS5yb3dzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDb2x1bXM7IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UuYWRkRGVmYXVsdENvbHVtbnMocSk7IHJldHVybiBxOyB9KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bi50cyIsImltcG9ydCB7UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZSxcbiAgICBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSwgSU1hdHJpeERyb3Bkb3duRGF0YSwgTWF0cml4RHJvcGRvd25Db2x1bW5cbn0gZnJvbSBcIi4vcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25iYXNlXCI7XG5pbXBvcnQge0pzb25PYmplY3R9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7UXVlc3Rpb25GYWN0b3J5fSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7c3VydmV5TG9jYWxpemF0aW9ufSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQge0Jhc2UsIFN1cnZleUVycm9yfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQge0N1c3RvbUVycm9yfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHtMb2NhbGl6YWJsZVN0cmluZ30gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeER5bmFtaWNSb3dNb2RlbCBleHRlbmRzIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaW5kZXg6IG51bWJlciwgZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YSwgdmFsdWU6IGFueSkge1xuICAgICAgICBzdXBlcihkYXRhLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuYnVpbGRDZWxscygpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHJvd05hbWUoKSB7IHJldHVybiB0aGlzLmlkOyB9XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBtYXRyaXggZHltYW5pYyBxdWVzdGlvbi4gWW91IG1heSB1c2UgYSBkcm9wZG93biwgY2hlY2tib3gsIHJhZGlvZ3JvdXAsIHRleHQgYW5kIGNvbW1lbnQgcXVlc3Rpb25zIGFzIGEgY2VsbCBlZGl0b3JzLlxuICogQW4gZW5kLXVzZXIgbWF5IGR5bmFtaWNhbGx5IGFkZC9yZW1vdmUgcm93cywgdW5saWtlIGluIG1hdHJpeCBkcm9wZG93biBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsIGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZSBpbXBsZW1lbnRzIElNYXRyaXhEcm9wZG93bkRhdGEge1xuICAgIHB1YmxpYyBzdGF0aWMgTWF4Um93Q291bnQgPSAxMDA7XG4gICAgcHJpdmF0ZSByb3dDb3VudGVyID0gMDtcbiAgICBwcml2YXRlIHJvd0NvdW50VmFsdWU6IG51bWJlciA9IDI7XG4gICAgcm93Q291bnRDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKG5hbWUpO1xuICAgICAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29uZmlybURlbGV0ZVRleHRcIiwgdGhpcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsIHRoaXMpO1xuICAgICAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiYWRkUm93VGV4dFwiLCB0aGlzKTtcbiAgICAgICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInJlbW92ZVJvd1RleHRcIiwgdGhpcyk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcIm1hdHJpeGR5bmFtaWNcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IGl0IHRvIHRydWUsIHRvIHNob3cgYSBjb25maXJtYXRpb24gZGlhbG9nIG9uIHJlbW92aW5nIGEgcm93XG4gICAgICogQHNlZSBDb25maXJtRGVsZXRlVGV4dFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29uZmlybURlbGV0ZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbmZpcm1EZWxldGVcIiwgZmFsc2UpOyB9XG4gICAgcHVibGljIHNldCBjb25maXJtRGVsZXRlKHZhbDogYm9vbGVhbikgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb25maXJtRGVsZXRlXCIsIHZhbCk7IH1cbiAgICAvKipcbiAgICAgKiBTZXQgaXQgdG8gYSBjb2x1bW4gbmFtZSBhbmQgdGhlIGxpYnJhcnkgc2hvd3MgZHVwbGljYXRpb24gZXJyb3IsIGlmIHRoZXJlIGFyZSBzYW1lIHZhbHVlcyBpbiBkaWZmZXJlbnQgcm93cyBpbiB0aGUgY29sdW1uLlxuICAgICAqIEBzZWUga2V5RHVwbGljYXRpb25FcnJvclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQga2V5TmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwia2V5TmFtZVwiLCBcIlwiKTsgfVxuICAgIHB1YmxpYyBzZXQga2V5TmFtZSh2YWw6IHN0cmluZykgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJrZXlOYW1lXCIsIHZhbCk7IH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIG1hdHJpeC5cbiAgICAgKiBAc2VlIG1pblJvd0NvdW50XG4gICAgICogQHNlZSBtYXhSb3dDb3VudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm93Q291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMucm93Q291bnRWYWx1ZTsgfVxuICAgIHB1YmxpYyBzZXQgcm93Q291bnQodmFsOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHZhbCA8IDAgfHwgdmFsID4gUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwuTWF4Um93Q291bnQpIHJldHVybjtcbiAgICAgICAgdmFyIHByZXZWYWx1ZSA9IHRoaXMucm93Q291bnRWYWx1ZTtcbiAgICAgICAgdGhpcy5yb3dDb3VudFZhbHVlID0gdmFsO1xuICAgICAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLnZhbHVlLmxlbmd0aCA+IHZhbCkge1xuICAgICAgICAgICAgdmFyIHFWYWwgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgcVZhbC5zcGxpY2UodmFsKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBxVmFsO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICAgICAgaWYodGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5zcGxpY2UodmFsKTsgICAgICAgICAgICBcbiAgICAgICAgICAgIGZvcih2YXIgaSA9IHByZXZWYWx1ZTsgaSA8IHZhbDsgaSArKykge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MucHVzaCh0aGlzLmNyZWF0ZU1hdHJpeFJvdyhudWxsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5yb3dDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIHJvdyBjb3VudC4gQSB1c2VyIGNvdWxkIG5vdCBkZWxldGUgYSByb3cgaWYgdGhlIHJvd0NvdW50IGVxdWFscyB0byBtaW5Sb3dDb3VudFxuICAgICAqIEBzZWUgcm93Q291bnRcbiAgICAgKiBAc2VlIG1heFJvd0NvdW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBtaW5Sb3dDb3VudCgpIDogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1pblJvd0NvdW50XCIsIDApOyB9XG4gICAgcHVibGljIHNldCBtaW5Sb3dDb3VudCh2YWwgOiBudW1iZXIpIHtcbiAgICAgICAgaWYodmFsIDwgMCkgdmFsID0gMDtcbiAgICAgICAgaWYodmFsID09IHRoaXMubWluUm93Q291bnQgfHwgdmFsID4gdGhpcy5tYXhSb3dDb3VudCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtaW5Sb3dDb3VudFwiLCB2YWwpO1xuICAgICAgICBpZih0aGlzLnJvd0NvdW50IDwgdmFsKSB0aGlzLnJvd0NvdW50ID0gdmFsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSByb3cgY291bnQuIEEgdXNlciBjb3VsZCBub3QgYWRkIGEgcm93IGlmIHRoZSByb3dDb3VudCBlcXVhbHMgdG8gbWF4Um93Q291bnRcbiAgICAgKiBAc2VlIHJvd0NvdW50XG4gICAgICogQHNlZSBtaW5Sb3dDb3VudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4Um93Q291bnQoKSA6IG51bWJlciB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhSb3dDb3VudFwiLCBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbC5NYXhSb3dDb3VudCk7IH1cbiAgICBwdWJsaWMgc2V0IG1heFJvd0NvdW50KHZhbCA6IG51bWJlcikge1xuICAgICAgICBpZih2YWwgPD0gMCkgcmV0dXJuO1xuICAgICAgICBpZih2YWwgPiBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbC5NYXhSb3dDb3VudCkgdmFsID0gUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwuTWF4Um93Q291bnQ7XG4gICAgICAgIGlmKHZhbCA9PSB0aGlzLm1heFJvd0NvdW50IHx8IHZhbCA8IHRoaXMubWluUm93Q291bnQpIHJldHVybjtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4Um93Q291bnRcIiwgdmFsKTtcbiAgICAgICAgaWYodGhpcy5yb3dDb3VudCA+IHZhbCkgdGhpcy5yb3dDb3VudCA9IHZhbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlLCBpZiBhIG5ldyByb3cgY2FuIGJlIGFkZGVkLlxuICAgICAqIEBzZWUgbWF4Um93Q291bnRcbiAgICAgKiBAc2VlIGNhblJlbW92ZVJvd1xuICAgICAqIEBzZWUgcm93Q291bnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNhbkFkZFJvdygpIDogYm9vbGVhbiB7IHJldHVybiB0aGlzLnJvd0NvdW50IDwgdGhpcy5tYXhSb3dDb3VudDsgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSwgaWYgYSByb3cgY2FuIGJlIHJlbW92ZWQuXG4gICAgICogQHNlZSBtaW5Sb3dDb3VudFxuICAgICAqIEBzZWUgY2FuQWRkUm93XG4gICAgICogQHNlZSByb3dDb3VudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2FuUmVtb3ZlUm93KCkgOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucm93Q291bnQgPiB0aGlzLm1pblJvd0NvdW50OyB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbmQgYWRkIGEgbmV3IHJvdy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkUm93KCkge1xuICAgICAgICBpZighdGhpcy5jYW5BZGRSb3cpIHJldHVybjtcbiAgICAgICAgdmFyIHByZXZSb3dDb3VudCA9IHRoaXMucm93Q291bnQ7XG4gICAgICAgIHRoaXMucm93Q291bnQgPSB0aGlzLnJvd0NvdW50ICsgMTtcbiAgICAgICAgaWYodGhpcy5kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnJ1bkNlbGxzQ29uZGl0aW9uKHRoaXMuZGF0YS5nZXRBbGxWYWx1ZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5zdXJ2ZXkpIHtcbiAgICAgICAgICAgIGlmKHByZXZSb3dDb3VudCArIDEgPT0gdGhpcy5yb3dDb3VudCkgdGhpcy5zdXJ2ZXkubWF0cml4Um93QWRkZWQodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHJvdyBieSBpdCdzIGluZGV4LiBJZiBjb25maXJtRGVsZXRlIGlzIHRydWUsIHNob3cgYSBjb25maXJtYXRpb24gZGlhbG9nXG4gICAgICogQHBhcmFtIGluZGV4IGEgcm93IGluZGV4LCBmcm9tIDAgdG8gcm93Q291bnQgLSAxXG4gICAgICogQHNlZSByZW1vdmVSb3dcbiAgICAgKiBAc2VlIGNvbmZpcm1EZWxldGVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlUm93VUkodmFsdWU6IGFueSkge1xuICAgICAgICBpZighdGhpcy5jb25maXJtRGVsZXRlIHx8IGNvbmZpcm0odGhpcy5jb25maXJtRGVsZXRlVGV4dCkpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlUm93KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgcm93IGJ5IGl0J3MgaW5kZXguXG4gICAgICogQHBhcmFtIGluZGV4IGEgcm93IGluZGV4LCBmcm9tIDAgdG8gcm93Q291bnQgLSAxXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVJvdyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGlmKCF0aGlzLmNhblJlbW92ZVJvdykgcmV0dXJuO1xuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucm93Q291bnQpIHJldHVybjtcbiAgICAgICAgaWYodGhpcy5zdXJ2ZXkpIHtcbiAgICAgICAgICAgIHZhciByb3cgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzID8gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpbmRleF0gOiBudWxsO1xuICAgICAgICAgICAgdGhpcy5zdXJ2ZXkubWF0cml4Um93UmVtb3ZlZCh0aGlzLCBpbmRleCwgcm93KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyAmJiBpbmRleCA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgICAgICAgdmFsLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB2YWwgPSB0aGlzLmRlbGV0ZVJvd1ZhbHVlKHZhbCwgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm93Q291bnRWYWx1ZS0tO1xuICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnJvd0NvdW50Q2hhbmdlZENhbGxiYWNrKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHRleHQgc2hvd2luZyBpbiB0aGUgY29uZmlybWF0aW9uIGRlbGV0ZSBkaWFsb2cgb24gcmVtb3ZpbmcgYSByb3cuXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb25maXJtRGVsZXRlVGV4dCgpIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiY29uZmlybURlbGV0ZVRleHRcIiwgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNvbmZpcm1EZWxldGVcIikpOyB9IFxuICAgIHB1YmxpYyBzZXQgY29uZmlybURlbGV0ZVRleHQodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb25maXJtRGVsZXRlVGV4dFwiLCB2YWwpOyB9XG4gICAgZ2V0IGxvY0NvbmZpcm1EZWxldGVUZXh0KCkgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImNvbmZpcm1EZWxldGVUZXh0XCIpOyB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZHVwbGljYXRpb24gdmFsdWUgZXJyb3IgdGV4dC4gU2V0IGl0IHRvIHNob3cgdGhlIHRleHQgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQuXG4gICAgICogQHNlZSBrZXlOYW1lXG4gICAgICovXG4gICAgcHVibGljIGdldCBrZXlEdXBsaWNhdGlvbkVycm9yKCkgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIpKTsgfSBcbiAgICBwdWJsaWMgc2V0IGtleUR1cGxpY2F0aW9uRXJyb3IodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsIHZhbCk7IH1cbiAgICBnZXQgbG9jS2V5RHVwbGljYXRpb25FcnJvcigpIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIpOyB9XG4gICAgLyoqXG4gICAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGFkZCByb3cgYnV0dG9uIHRleHQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBhZGRSb3dUZXh0KCkgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJhZGRSb3dUZXh0XCIsIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJhZGRSb3dcIikpOyB9XG4gICAgcHVibGljIHNldCBhZGRSb3dUZXh0KHZhbDogc3RyaW5nKSB7IHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiYWRkUm93VGV4dFwiLCB2YWwpOyB9XG4gICAgZ2V0IGxvY0FkZFJvd1RleHQoKSB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiYWRkUm93VGV4dFwiKTsgfVxuICAgIC8qKlxuICAgICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiByZW1vdmUgcm93IGJ1dHRvbiB0ZXh0LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVtb3ZlUm93VGV4dCgpIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicmVtb3ZlUm93VGV4dFwiLCBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVtb3ZlUm93XCIpKTsgfVxuICAgIHB1YmxpYyBzZXQgcmVtb3ZlUm93VGV4dCh2YWw6IHN0cmluZykgeyB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInJlbW92ZVJvd1RleHRcIiwgIHZhbCk7IH1cbiAgICBnZXQgbG9jUmVtb3ZlUm93VGV4dCgpIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJyZW1vdmVSb3dUZXh0XCIpOyB9XG4gICAgcHVibGljIGdldCBkaXNwbGF5VmFsdWUoKTogYW55IHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsdWU7XG4gICAgICAgIGlmKCF2YWx1ZXMpIHJldHVybiB2YWx1ZXM7XG4gICAgICAgIHZhciByb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoICYmIGkgPCB2YWx1ZXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gdmFsdWVzW2ldO1xuICAgICAgICAgICAgaWYoIXZhbCkgY29udGludWU7XG4gICAgICAgICAgICB2YWx1ZXNbaV0gPSB0aGlzLmdldFJvd0Rpc3BsYXlWYWx1ZShyb3dzW2ldLCB2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuXG4gICAgcHVibGljIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkgeyAgIHJldHVybiBmYWxzZTsgIH1cbiAgICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xuICAgICAgICBzdXBlci5vbkNoZWNrRm9yRXJyb3JzKGVycm9ycyk7XG4gICAgICAgIGlmICh0aGlzLmhhc0Vycm9ySW5Sb3dzKCkpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBDdXN0b21FcnJvcihzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibWluUm93Q291bnRFcnJvclwiKVtcImZvcm1hdFwiXSh0aGlzLm1pblJvd0NvdW50KSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBoYXNFcnJvcnMoZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSk6IGJvb2xlYW4ge1xuICAgICAgICB2YXIgcHJldlZhbHVlID0gc3VwZXIuaGFzRXJyb3JzKGZpcmVDYWxsYmFjaylcbiAgICAgICAgcmV0dXJuICB0aGlzLmlzVmFsdWVEdXBsaWNhdGVkKCkgfHwgcHJldlZhbHVlO1xuICAgIH1cbiAgICBwcml2YXRlIGhhc0Vycm9ySW5Sb3dzKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5taW5Sb3dDb3VudCA8PSAwIHx8ICF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciByZXMgPSBmYWxzZTtcbiAgICAgICAgdmFyIHNldFJvd0NvdW50ID0gMDtcbiAgICAgICAgZm9yICh2YXIgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyByb3dJbmRleCsrKSB7XG4gICAgICAgICAgICB2YXIgcm93ID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tyb3dJbmRleF07XG4gICAgICAgICAgICBpZiAoIXJvdy5pc0VtcHR5KSBzZXRSb3dDb3VudCsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXRSb3dDb3VudCA8IHRoaXMubWluUm93Q291bnQ7XG4gICAgfVxuICAgIHByaXZhdGUgaXNWYWx1ZUR1cGxpY2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5rZXlOYW1lIHx8ICF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmdldENvbHVtbk5hbWUodGhpcy5rZXlOYW1lKTtcbiAgICAgICAgaWYoIWNvbHVtbikgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIga2V5VmFsdWVzID0gW107XG4gICAgICAgIHZhciByZXMgPSBmYWxzZTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICByZXMgPSB0aGlzLmlzVmFsdWVEdXBsaWNhdGVkSW5Sb3codGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXSwgY29sdW1uLCBrZXlWYWx1ZXMpIHx8IHJlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBwcml2YXRlIGlzVmFsdWVEdXBsaWNhdGVkSW5Sb3cocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSwgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbiwga2V5VmFsdWVzOiBBcnJheTxhbnk+KTogYm9vbGVhbiB7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IHJvdy5nZXRRdWVzdGlvbkJ5Q29sdW1uKGNvbHVtbik7XG4gICAgICAgIGlmKCFxdWVzdGlvbiB8fCBxdWVzdGlvbi5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIHZhbHVlID0gcXVlc3Rpb24udmFsdWU7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBrZXlWYWx1ZXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICBpZih2YWx1ZSA9PSBrZXlWYWx1ZXNbaV0pIHtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbi5hZGRFcnJvcihuZXcgQ3VzdG9tRXJyb3IodGhpcy5rZXlEdXBsaWNhdGlvbkVycm9yKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAga2V5VmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZW5lcmF0ZVJvd3MoKTogQXJyYXk8TWF0cml4RHluYW1pY1Jvd01vZGVsPiB7XG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8TWF0cml4RHluYW1pY1Jvd01vZGVsPigpO1xuICAgICAgICBpZiAodGhpcy5yb3dDb3VudCA9PT0gMCkgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuY3JlYXRlTmV3VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmNyZWF0ZU1hdHJpeFJvdyh0aGlzLmdldFJvd1ZhbHVlQnlJbmRleCh2YWwsIGkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGNyZWF0ZU1hdHJpeFJvdyh2YWx1ZTogYW55KTogTWF0cml4RHluYW1pY1Jvd01vZGVsIHtcbiAgICAgICAgdmFyIHJvdyA9IG5ldyBNYXRyaXhEeW5hbWljUm93TW9kZWwodGhpcy5yb3dDb3VudGVyICsrLCB0aGlzLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub25NYXRyaXhSb3dDcmVhdGVkKHJvdyk7XG4gICAgICAgIHJldHVybiByb3c7XG4gICAgfVxuICAgIHByb3RlY3RlZCBvbkJlZm9yZVZhbHVlQ2hhbmdlZCh2YWw6IGFueSkge1xuICAgICAgICB2YXIgbmV3Um93Q291bnQgPSB2YWwgJiYgQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsLmxlbmd0aCA6IDA7XG4gICAgICAgIGlmIChuZXdSb3dDb3VudCA8PSB0aGlzLnJvd0NvdW50KSByZXR1cm47XG4gICAgICAgIHRoaXMucm93Q291bnRWYWx1ZSA9IG5ld1Jvd0NvdW50O1xuICAgICAgICBpZiAodGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgY3JlYXRlTmV3VmFsdWUoY3VyVmFsdWU6IGFueSk6IGFueSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjdXJWYWx1ZTtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHJlc3VsdCA9IFtdO1xuICAgICAgICB2YXIgciA9IFtdO1xuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IHRoaXMucm93Q291bnQpIHJlc3VsdC5zcGxpY2UodGhpcy5yb3dDb3VudCAtIDEpO1xuICAgICAgICBmb3IgKHZhciBpID0gcmVzdWx0Lmxlbmd0aDsgaSA8IHRoaXMucm93Q291bnQ7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goe30pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHByb3RlY3RlZCBkZWxldGVSb3dWYWx1ZShuZXdWYWx1ZTogYW55LCByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogYW55IHtcbiAgICAgICAgdmFyIGlzRW1wdHkgPSB0cnVlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMobmV3VmFsdWVbaV0pLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpc0VtcHR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzRW1wdHkgPyBudWxsIDogbmV3VmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRSb3dWYWx1ZUJ5SW5kZXgocXVlc3Rpb25WYWx1ZTogYW55LCBpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgJiYgaW5kZXggPCBxdWVzdGlvblZhbHVlLmxlbmd0aCA/IHF1ZXN0aW9uVmFsdWVbaW5kZXhdIDogbnVsbDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldFJvd1ZhbHVlQ29yZShyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLCBxdWVzdGlvblZhbHVlOiBhbnksIGNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlKTogYW55IHtcbiAgICAgICAgaWYoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHJldHVybiB7fTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Um93VmFsdWVCeUluZGV4KHF1ZXN0aW9uVmFsdWUsIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MuaW5kZXhPZihyb3cpKTtcbiAgICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJtYXRyaXhkeW5hbWljXCIsIFt7IG5hbWU6IFwicm93Q291bnQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDIgfSwgeyBuYW1lOiBcIm1pblJvd0NvdW50Om51bWJlclwiLCBkZWZhdWx0OiAwIH0sIHsgbmFtZTogXCJtYXhSb3dDb3VudDpudW1iZXJcIiwgZGVmYXVsdDogUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwuTWF4Um93Q291bnQgfSxcbiAgICB7bmFtZTogXCJrZXlOYW1lXCJ9LCB7IG5hbWU6IFwia2V5RHVwbGljYXRpb25FcnJvclwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jS2V5RHVwbGljYXRpb25FcnJvclwiIH0sXG4gICAge25hbWU6IFwiY29uZmlybURlbGV0ZTpib29sZWFuXCJ9LCB7IG5hbWU6IFwiY29uZmlybURlbGV0ZVRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbmZpcm1EZWxldGVUZXh0XCIgfSxcbiAgICB7IG5hbWU6IFwiYWRkUm93VGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQWRkUm93VGV4dFwiIH0sIHsgbmFtZTogXCJyZW1vdmVSb3dUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NSZW1vdmVSb3dUZXh0XCIgfV0sXG4gICAgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsKFwiXCIpOyB9LCBcIm1hdHJpeGRyb3Bkb3duYmFzZVwiKTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtYXRyaXhkeW5hbWljXCIsIChuYW1lKSA9PiB7IHZhciBxID0gbmV3IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsKG5hbWUpOyBxLmNob2ljZXMgPSBbMSwgMiwgMywgNCwgNV07IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UuYWRkRGVmYXVsdENvbHVtbnMocSk7IHJldHVybiBxOyB9KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9tYXRyaXhkeW5hbWljLnRzIiwiaW1wb3J0IHtCYXNlfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQge1N1cnZleVZhbGlkYXRvciwgSVZhbGlkYXRvck93bmVyLCBWYWxpZGF0b3JSdW5uZXJ9IGZyb20gXCIuL3ZhbGlkYXRvclwiO1xuaW1wb3J0IHtRdWVzdGlvbn0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7SnNvbk9iamVjdH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHtRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHtTdXJ2ZXlFcnJvcn0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHtBbnN3ZXJSZXF1aXJlZEVycm9yfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHtJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmd9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU11bHRpcGxlVGV4dERhdGEge1xuICAgIGdldE11bHRpcGxlVGV4dFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueTtcbiAgICBzZXRNdWx0aXBsZVRleHRWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpO1xuICAgIGdldElzUmVxdWlyZWRUZXh0KCk6IHN0cmluZztcbiAgICBnZXRMb2NhbGUoKTogc3RyaW5nO1xuICAgIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNdWx0aXBsZVRleHRJdGVtTW9kZWwgZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgSVZhbGlkYXRvck93bmVyLCBJTG9jYWxpemFibGVPd25lciB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaXRlbUNvdW50ZXIgPSAxMDA7XG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0SXRlbUlkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcInNwX1wiICsgTXVsdGlwbGVUZXh0SXRlbU1vZGVsLml0ZW1Db3VudGVyKys7XG4gICAgfVxuICAgIHByaXZhdGUgZGF0YTogSU11bHRpcGxlVGV4dERhdGE7XG4gICAgcHJpdmF0ZSBpZFZhbHVlOiBzdHJpbmcgPSBNdWx0aXBsZVRleHRJdGVtTW9kZWwuZ2V0SXRlbUlkKCk7XG5cbiAgICB2YWx1ZUNoYW5nZWRDYWxsYmFjazogKG5ld1ZhbHVlOiBhbnkpPT52b2lkO1xuICAgIHZhbGlkYXRvcnM6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4gPSBuZXcgQXJyYXk8U3VydmV5VmFsaWRhdG9yPigpO1xuXG4gICAgY29uc3RydWN0b3IobmFtZTogYW55ID0gbnVsbCwgdGl0bGU6IHN0cmluZyA9IG51bGwpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB2YXIgbG9jVGl0bGVWYWx1ZSA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJ0aXRsZVwiLCB0aGlzLCB0cnVlKTtcbiAgICAgICAgbG9jVGl0bGVWYWx1ZS5vblJlbmRlcmVkSHRtbENhbGxiYWNrID0gZnVuY3Rpb24odGV4dCkge3JldHVybiBzZWxmLmdldEZ1bGxUaXRsZSh0ZXh0KTsgfTtcbiAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xuICAgICAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGxhY2VIb2xkZXJcIiwgdGhpcyk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcIm11bHRpcGxldGV4dGl0ZW1cIjtcbiAgICB9XG4gICAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5pZFZhbHVlOyB9XG4gICAgLyoqXG4gICAgICogVGhlIGl0ZW0gbmFtZS4gXG4gICAgICovXG4gICAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJuYW1lXCIpOyB9XG4gICAgcHVibGljIHNldCBuYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm5hbWVcIiwgdmFsKTtcbiAgICAgICAgaWYodGhpcy5sb2NUaXRsZSkge1xuICAgICAgICAgICAgdGhpcy5sb2NUaXRsZS5vbkNoYW5nZWQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXREYXRhKGRhdGE6IElNdWx0aXBsZVRleHREYXRhKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxuICAgIC8qKiBcbiAgICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCB0byBtYWtlIHRoZSBpdGVtIGEgcmVxdWlyZWQuIElmIGEgdXNlciBkb2Vzbid0IGZpbGwgdGhlIGl0ZW0gdGhlbiBhIHZhbGlkYXRpb24gZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1JlcXVpcmVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNSZXF1aXJlZFwiLCBmYWxzZSk7IH1cbiAgICBwdWJsaWMgc2V0IGlzUmVxdWlyZWQodmFsOiBib29sZWFuKSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzUmVxdWlyZWRcIiwgdmFsKTsgfVxuICAgIC8qKlxuICAgICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBpbnB1dCB0eXBlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW5wdXRUeXBlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbnB1dFR5cGVcIiwgXCJ0ZXh0XCIpOyB9XG4gICAgcHVibGljIHNldCBpbnB1dFR5cGUodmFsOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlucHV0VHlwZVwiLCB2YWwudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEl0ZW0gdGl0bGUuIElmIGl0IGlzIGVtcHR5LCB0aGUgaXRlbSBuYW1lIGlzIHJlbmRlcmVkIGFzIHRpdGxlLiBUaGlzIHByb3BlcnR5IHN1cHBvcnRzIG1hcmtkb3duLlxuICAgICAqIEBzZWUgbmFtZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdGl0bGUoKSB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRpdGxlXCIsIHRoaXMubmFtZSk7IH1cbiAgICBwdWJsaWMgc2V0IHRpdGxlKHZhbDogc3RyaW5nKSB7IHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGl0bGVcIiwgdmFsKTsgfVxuICAgIGdldCBsb2NUaXRsZSgpIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJ0aXRsZVwiKTsgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHRleHQgb3IgaHRtbCBmb3IgcmVuZGVyaW5nIHRoZSB0aXRsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZ1bGxUaXRsZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRGdWxsVGl0bGUodGhpcy5sb2NUaXRsZS50ZXh0T3JIdG1sKTsgfVxuICAgIHByb3RlY3RlZCBnZXRGdWxsVGl0bGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZighc3RyKSBzdHIgPSB0aGlzLm5hbWU7XG4gICAgICAgIGlmKHRoaXMuaXNSZXF1aXJlZCAmJiB0aGlzLmRhdGEpIHN0ciA9IHRoaXMuZGF0YS5nZXRJc1JlcXVpcmVkVGV4dCgpICsgJyAnICsgc3RyO1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgaW5wdXQgcGxhY2UgaG9sZGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGxhY2VIb2xkZXIoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGxhY2VIb2xkZXJcIik7IH1cbiAgICBwdWJsaWMgc2V0IHBsYWNlSG9sZGVyKHZhbDogc3RyaW5nKSB7IHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGxhY2VIb2xkZXJcIiwgdmFsKTsgfVxuICAgIGdldCBsb2NQbGFjZUhvbGRlcigpOiBMb2NhbGl6YWJsZVN0cmluZyB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicGxhY2VIb2xkZXJcIik7IH1cbiAgICAvKiogXG4gICAgICogVGhlIGl0ZW0gdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIGdldCB2YWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRNdWx0aXBsZVRleHRWYWx1ZSh0aGlzLm5hbWUpIDogbnVsbDtcbiAgICB9XG4gICAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5kYXRhLnNldE11bHRpcGxlVGV4dFZhbHVlKHRoaXMubmFtZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBvblZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7XG4gICAgICAgIGlmKHRoaXMudmFsdWVDaGFuZ2VkQ2FsbGJhY2spIHRoaXMudmFsdWVDaGFuZ2VkQ2FsbGJhY2sobmV3VmFsdWUpO1xuICAgIH1cbiAgICAvL0lWYWxpZGF0b3JPd25lclxuICAgIGdldFZhbGlkYXRvclRpdGxlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnRpdGxlOyB9XG4gICAgZ2V0IHZhbGlkYXRlZFZhbHVlKCk6IGFueSB7IHJldHVybiB0aGlzLnZhbHVlOyB9XG4gICAgc2V0IHZhbGlkYXRlZFZhbHVlKHZhbDogYW55KSB7IHRoaXMudmFsdWUgPSB2YWw7IH1cbiAgICAvL0lMb2NhbGl6YWJsZU93bmVyXG4gICAgZ2V0TG9jYWxlKCkgeyByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldExvY2FsZSgpIDogXCJcIjt9XG4gICAgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZykgIHsgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRNYXJrZG93bkh0bWwodGV4dCkgOiBudWxsOyB9XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBtdWx0aXBsZSB0ZXh0IHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIGltcGxlbWVudHMgSU11bHRpcGxlVGV4dERhdGEge1xuICAgIGNvbENvdW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgaXRlbXNWYWx1ZXM6IEFycmF5PE11bHRpcGxlVGV4dEl0ZW1Nb2RlbD4gPSBuZXcgQXJyYXk8TXVsdGlwbGVUZXh0SXRlbU1vZGVsPigpO1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIobmFtZSk7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy5pdGVtc1ZhbHVlcyA9IHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJpdGVtc1wiLCBmdW5jdGlvbihpdGVtKSB7IGl0ZW0uc2V0RGF0YShzZWxmKTsgfSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJpdGVtc1wiLCBmdW5jdGlvbigpIHtzZWxmLmZpcmVDYWxsYmFjayhzZWxmLmNvbENvdW50Q2hhbmdlZENhbGxiYWNrKTt9KTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImNvbENvdW50XCIsIGZ1bmN0aW9uKCkge3NlbGYuZmlyZUNhbGxiYWNrKHNlbGYuY29sQ291bnRDaGFuZ2VkQ2FsbGJhY2spO30pO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJtdWx0aXBsZXRleHRcIjtcbiAgICB9XG4gICAgZW5kTG9hZGluZ0Zyb21Kc29uKCkge1xuICAgICAgICBzdXBlci5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jb2xDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIGlucHV0IGl0ZW1zLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXRlbXMoKTogQXJyYXk8TXVsdGlwbGVUZXh0SXRlbU1vZGVsPiB7IHJldHVybiB0aGlzLml0ZW1zVmFsdWVzOyB9XG4gICAgcHVibGljIHNldCBpdGVtcyh2YWw6IEFycmF5PE11bHRpcGxlVGV4dEl0ZW1Nb2RlbD4pIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXRlbXNcIiwgdmFsKTsgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIG5ldyB0ZXh0IGl0ZW0uXG4gICAgICogQHBhcmFtIG5hbWUgYSBpdGVtIG5hbWVcbiAgICAgKiBAcGFyYW0gdGl0bGUgYSBpdGVtIHRpdGxlIChvcHRpb25hbClcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkSXRlbShuYW1lOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcgPSBudWxsKTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsIHtcbiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNyZWF0ZVRleHRJdGVtKG5hbWUsIHRpdGxlKTtcbiAgICAgICAgdGhpcy5pdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG4gICAgcHVibGljIG9uTG9jYWxlQ2hhbmdlZCgpIHtcbiAgICAgICAgc3VwZXIub25Mb2NhbGVDaGFuZ2VkKCk7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgdGhpcy5pdGVtc1tpXS5vbkxvY2FsZUNoYW5nZWQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXRlbXNbaV0udmFsdWUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjb2x1bW5zLiBJdGVtcyBhcmUgcmVuZHJlZCBpbiBvbmUgbGluZSBpZiB0aGUgdmFsdWUgaXMgMC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbENvdW50KCk6IG51bWJlciB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2xDb3VudFwiLCAxKTsgfVxuICAgIHB1YmxpYyBzZXQgY29sQ291bnQodmFsOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHZhbCA8IDEgfHwgdmFsID4gNCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb2xDb3VudFwiLCB2YWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCB0ZXh0IGlucHV0IHNpemUuXG4gICAgICovXG4gICAgcHVibGljIGdldCBpdGVtU2l6ZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXRlbVNpemVcIiwgMjUpIH0gXG4gICAgcHVibGljIHNldCBpdGVtU2l6ZSh2YWw6IG51bWJlcikgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpdGVtU2l6ZVwiLCB2YWwpOyB9IFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcmVuZGVyZWQgcm93cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Um93cygpOiBBcnJheTxhbnk+IHtcbiAgICAgICAgdmFyIGNvbENvdW50ID0gdGhpcy5jb2xDb3VudDtcbiAgICAgICAgdmFyIGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICAgICAgdmFyIHJvd3MgPSBbXTtcbiAgICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHtcbiAgICAgICAgICAgICAgICByb3dzLnB1c2goW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm93c1tyb3dzLmxlbmd0aCAtIDFdLnB1c2goaXRlbXNbaV0pO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSBjb2xDb3VudCkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93cztcbiAgICB9XG4gICAgcHJpdmF0ZSBpc011bHRpcGxlSXRlbVZhbHVlQ2hhbmdpbmcgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQoKSB7XG4gICAgICAgIHN1cGVyLm9uVmFsdWVDaGFuZ2VkKCk7XG4gICAgICAgIHRoaXMub25JdGVtVmFsdWVDaGFuZ2VkKCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBjcmVhdGVUZXh0SXRlbShuYW1lOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcpOiBNdWx0aXBsZVRleHRJdGVtTW9kZWwge1xuICAgICAgICByZXR1cm4gbmV3IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbChuYW1lLCB0aXRsZSk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBvbkl0ZW1WYWx1ZUNoYW5nZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVJdGVtVmFsdWVDaGFuZ2luZykgcmV0dXJuO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpdGVtVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgJiYgKHRoaXMuaXRlbXNbaV0ubmFtZSBpbiB0aGlzLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGl0ZW1WYWx1ZSA9IHRoaXMudmFsdWVbdGhpcy5pdGVtc1tpXS5uYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXRlbXNbaV0ub25WYWx1ZUNoYW5nZWQoaXRlbVZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgcnVuVmFsaWRhdG9ycygpOiBTdXJ2ZXlFcnJvciB7XG4gICAgICAgIHZhciBlcnJvciA9IHN1cGVyLnJ1blZhbGlkYXRvcnMoKTtcbiAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHJldHVybiBlcnJvcjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBlcnJvciA9IG5ldyBWYWxpZGF0b3JSdW5uZXIoKS5ydW4odGhpcy5pdGVtc1tpXSk7XG4gICAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xuICAgICAgICBzdXBlci5vbkNoZWNrRm9yRXJyb3JzKGVycm9ycyk7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1zW2ldO1xuICAgICAgICAgICAgaWYoaXRlbS5pc1JlcXVpcmVkICYmICFpdGVtLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IEFuc3dlclJlcXVpcmVkRXJyb3IoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy9JTXVsdGlwbGVUZXh0RGF0YVxuICAgIGdldE11bHRpcGxlVGV4dFZhbHVlKG5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZVtuYW1lXTtcbiAgICB9XG4gICAgc2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuaXNNdWx0aXBsZUl0ZW1WYWx1ZUNoYW5naW5nID0gdHJ1ZTtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgaWYgKCFuZXdWYWx1ZSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBuZXdWYWx1ZVtuYW1lXSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgICAgdGhpcy5pc011bHRpcGxlSXRlbVZhbHVlQ2hhbmdpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgZ2V0SXNSZXF1aXJlZFRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkucmVxdWlyZWRUZXh0IDogXCJcIjtcbiAgICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJtdWx0aXBsZXRleHRpdGVtXCIsIFtcIm5hbWVcIiwgXCJpc1JlcXVpcmVkOmJvb2xlYW5cIiwgeyBuYW1lOiBcInBsYWNlSG9sZGVyXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQbGFjZUhvbGRlclwifSxcbiAgICB7IG5hbWU6IFwiaW5wdXRUeXBlXCIsIGRlZmF1bHQ6IFwidGV4dFwiLCBjaG9pY2VzOiBbXCJjb2xvclwiLCBcImRhdGVcIiwgXCJkYXRldGltZVwiLCBcImRhdGV0aW1lLWxvY2FsXCIsIFwiZW1haWxcIiwgXCJtb250aFwiLCBcIm51bWJlclwiLCBcInBhc3N3b3JkXCIsIFwicmFuZ2VcIiwgXCJ0ZWxcIiwgXCJ0ZXh0XCIsIFwidGltZVwiLCBcInVybFwiLCBcIndlZWtcIl0gfSxcbiAgICB7IG5hbWU6IFwidGl0bGVcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RpdGxlXCIgfSwgeyBuYW1lOiBcInZhbGlkYXRvcnM6dmFsaWRhdG9yc1wiLCBiYXNlQ2xhc3NOYW1lOiBcInN1cnZleXZhbGlkYXRvclwiLCBjbGFzc05hbWVQYXJ0OiBcInZhbGlkYXRvclwiIH1dLFxuICAgIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNdWx0aXBsZVRleHRJdGVtTW9kZWwoXCJcIik7IH0pO1xuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwibXVsdGlwbGV0ZXh0XCIsIFt7IG5hbWU6IFwiIWl0ZW1zOnRleHRpdGVtc1wiLCBjbGFzc05hbWU6IFwibXVsdGlwbGV0ZXh0aXRlbVwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJpdGVtU2l6ZTpudW1iZXJcIiwgZGVmYXVsdDogMjUgfSwgeyBuYW1lOiBcImNvbENvdW50Om51bWJlclwiLCBkZWZhdWx0OiAxLCBjaG9pY2VzOiBbMSwgMiwgMywgNF0gfV0sXG4gICAgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWwoXCJcIik7IH0sIFwicXVlc3Rpb25cIik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibXVsdGlwbGV0ZXh0XCIsIChuYW1lKSA9PiB7IHZhciBxID0gbmV3IFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWwobmFtZSk7IHEuYWRkSXRlbShcInRleHQxXCIpOyBxLmFkZEl0ZW0oXCJ0ZXh0MlwiKTsgcmV0dXJuIHE7IH0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX211bHRpcGxldGV4dC50cyIsImltcG9ydCB7SGFzaFRhYmxlfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQge0lFbGVtZW50LCBCYXNlLCBTdXJ2ZXlFbGVtZW50LCBTdXJ2ZXlFcnJvciwgSVN1cnZleURhdGEsIElTdXJ2ZXksIElTdXJ2ZXlJbXBsLCBJVGV4dFByb2Nlc3Nvcn0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7SUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHtUZXh0UHJlUHJvY2Vzc29yfSBmcm9tIFwiLi90ZXh0UHJlUHJvY2Vzc29yXCI7XG5pbXBvcnQge1Byb2Nlc3NWYWx1ZX0gZnJvbSBcIi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XG5pbXBvcnQge1F1ZXN0aW9ufSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHtQYW5lbE1vZGVsfSBmcm9tIFwiLi9wYW5lbFwiO1xuaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQge1F1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQge0N1c3RvbUVycm9yfSBmcm9tIFwiLi9lcnJvclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElRdWVzdGlvblBhbmVsRHluYW1pY0RhdGEge1xuICAgIGdldEl0ZW1JbmRleChpdGVtOiBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0pOiBudW1iZXI7XG4gICAgZ2V0UGFuZWxJdGVtRGF0YShpdGVtOiBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0pOiBhbnk7XG4gICAgc2V0UGFuZWxJdGVtRGF0YShpdGVtOiBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0sIG5hbWU6IHN0cmluZywgdmFsOiBhbnkpO1xuICAgIGdldFN1cnZleSgpOiBJU3VydmV5O1xufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtIGltcGxlbWVudHMgSVN1cnZleURhdGEsIElTdXJ2ZXlJbXBsLCBJVGV4dFByb2Nlc3NvciB7XG4gICAgcHVibGljIHN0YXRpYyBJdGVtVmFyaWFibGVOYW1lID0gXCJwYW5lbFwiO1xuICAgIHB1YmxpYyBzdGF0aWMgSW5kZXhWYXJpYWJsZU5hbWUgPSBcInBhbmVsSW5kZXhcIjtcbiAgICBwcml2YXRlIHBhbmVsVmFsdWU6IFBhbmVsTW9kZWw7XG4gICAgcHJpdmF0ZSBkYXRhOiBJUXVlc3Rpb25QYW5lbER5bmFtaWNEYXRhO1xuICAgIHByaXZhdGUgdGV4dFByZVByb2Nlc3NvciA9IG5ldyBUZXh0UHJlUHJvY2Vzc29yKCk7XG4gICAgY29uc3RydWN0b3IoZGF0YTogSVF1ZXN0aW9uUGFuZWxEeW5hbWljRGF0YSwgcGFuZWw6IFBhbmVsTW9kZWwpIHtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5wYW5lbFZhbHVlID0gcGFuZWw7XG4gICAgICAgIHRoaXMucGFuZWwuc2V0U3VydmV5SW1wbCh0aGlzKTtcbiAgICAgICAgdGhpcy5wYW5lbC51cGRhdGVDdXN0b21XaWRnZXRzKCk7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yID0gbmV3IFRleHRQcmVQcm9jZXNzb3IoKTtcbiAgICAgICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yLm9uSGFzVmFsdWUgPSBmdW5jdGlvbiAobmFtZTogc3RyaW5nKSB7IHJldHVybiBzZWxmLmhhc1Byb2Nlc3NlZFRleHRWYWx1ZShuYW1lKTsgfTtcbiAgICAgICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yLm9uUHJvY2VzcyA9IGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbikgeyByZXR1cm4gc2VsZi5nZXRQcm9jZXNzZWRUZXh0VmFsdWUobmFtZSwgcmV0dXJuRGlzcGxheVZhbHVlKTsgfTtcbiAgICB9XG4gICAgcHVibGljIGdldCBwYW5lbCgpOiBQYW5lbE1vZGVsIHsgcmV0dXJuIHRoaXMucGFuZWxWYWx1ZTsgfVxuICAgIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgICAgICB0aGlzLnBhbmVsLnJ1bkNvbmRpdGlvbih2YWx1ZXMpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VmFsdWUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuZGF0YS5nZXRQYW5lbEl0ZW1EYXRhKHRoaXMpO1xuICAgICAgICByZXR1cm4gdmFsdWVzW25hbWVdO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0VmFsdWUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuZGF0YS5zZXRQYW5lbEl0ZW1EYXRhKHRoaXMsIG5hbWUsIG5ld1ZhbHVlKTtcbiAgICB9XG4gICAgcHVibGljIGdldENvbW1lbnQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuZ2V0VmFsdWUobmFtZSArIEJhc2UuY29tbWVudFByZWZpeCk7XG4gICAgICAgIHJldHVybiByZXN1bHQgPyByZXN1bHQgOiBcIlwiO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0Q29tbWVudChuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zZXRWYWx1ZShuYW1lICsgQmFzZS5jb21tZW50UHJlZml4LCBuZXdWYWx1ZSk7XG4gICAgfVxuICAgIHB1YmxpYyBvblN1cnZleVZhbHVlQ2hhbmdlZCgpIHtcbiAgICAgICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucGFuZWwucXVlc3Rpb25zO1xuICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5kYXRhLmdldFBhbmVsSXRlbURhdGEodGhpcyk7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICB2YXIgcSA9IHF1ZXN0aW9uc1tpXTtcbiAgICAgICAgICAgIHEub25TdXJ2ZXlWYWx1ZUNoYW5nZWQodmFsdWVzW3EubmFtZV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBzZXRWaXNpYmxlSW5kZXgoaW5kZXg6IG51bWJlciwgc2hvd0luZGV4OiBib29sZWFuKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIFN1cnZleUVsZW1lbnQuc2V0VmlzaWJsZUluZGV4KHRoaXMucGFuZWwucXVlc3Rpb25zLCBpbmRleCwgc2hvd0luZGV4KTtcbiAgICB9XG5cbiAgICBnZXRBbGxWYWx1ZXMoKSA6IGFueSB7IHJldHVybiB0aGlzLmRhdGEuZ2V0UGFuZWxJdGVtRGF0YSh0aGlzKTsgfVxuICAgIGdlU3VydmV5RGF0YSgpOiBJU3VydmV5RGF0YSB7IHJldHVybiB0aGlzOyB9XG4gICAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkgeyByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldFN1cnZleSgpIDogbnVsbDsgfVxuICAgIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3IgeyByZXR1cm4gdGhpczsgfVxuICAgIC8vSVRleHRQcm9jZXNzb3IgXG4gICAgcHJpdmF0ZSBoYXNQcm9jZXNzZWRUZXh0VmFsdWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmKG5hbWUgPT0gUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkluZGV4VmFyaWFibGVOYW1lKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgdmFyIGZpcnN0TmFtZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRGaXJzdE5hbWUobmFtZSk7XG4gICAgICAgIHJldHVybiBmaXJzdE5hbWUgPT0gUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkl0ZW1WYXJpYWJsZU5hbWU7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlKG5hbWU6IHN0cmluZywgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmKG5hbWUgPT0gUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkluZGV4VmFyaWFibGVOYW1lKSByZXR1cm4gdGhpcy5kYXRhLmdldEl0ZW1JbmRleCh0aGlzKSArIDE7XG4gICAgICAgIC8vbmFtZSBzaG91bGQgc3RhcnQgd2l0aCB0aGUgcGFuZWxcbiAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0uSXRlbVZhcmlhYmxlTmFtZSArIFwiLlwiLCBcIlwiKTtcbiAgICAgICAgdmFyIGZpcnN0TmFtZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRGaXJzdE5hbWUobmFtZSk7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IDxRdWVzdGlvbj50aGlzLnBhbmVsLmdldFF1ZXN0aW9uQnlOYW1lKGZpcnN0TmFtZSk7XG4gICAgICAgIGlmKCFxdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciB2YWx1ZXMgPSB7fTtcbiAgICAgICAgdmFsdWVzW2ZpcnN0TmFtZV0gPSByZXR1cm5EaXNwbGF5VmFsdWUgPyBxdWVzdGlvbi5kaXNwbGF5VmFsdWUgOiBxdWVzdGlvbi52YWx1ZTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRWYWx1ZShuYW1lLCB2YWx1ZXMpO1xuICAgIH1cbiAgICBwcm9jZXNzVGV4dCh0ZXh0OiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgICAgIHRleHQgPSB0aGlzLnRleHRQcmVQcm9jZXNzb3IucHJvY2Vzcyh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUpO1xuICAgICAgICB2YXIgc3VydmV5ID0gdGhpcy5nZXRTdXJ2ZXkoKTtcbiAgICAgICAgcmV0dXJuIHN1cnZleSA/IHN1cnZleS5wcm9jZXNzVGV4dCh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUpIDogdGV4dDtcbiAgICB9XG4gICAgcHJvY2Vzc1RleHRFeCh0ZXh0OiBzdHJpbmcpOiBhbnkge1xuICAgICAgICB0ZXh0ID0gdGhpcy5wcm9jZXNzVGV4dCh0ZXh0LCB0cnVlKTtcbiAgICAgICAgdmFyIGhhc0FsbFZhbHVlc09uTGFzdFJ1biA9IHRoaXMudGV4dFByZVByb2Nlc3Nvci5oYXNBbGxWYWx1ZXNPbkxhc3RSdW47XG4gICAgICAgIHZhciByZXMgPSB7aGFzQWxsVmFsdWVzT25MYXN0UnVuOiB0cnVlLCB0ZXh0IDogdGV4dH07XG4gICAgICAgIGlmKHRoaXMuZ2V0U3VydmV5KCkpIHtcbiAgICAgICAgICAgIHJlcyA9ICB0aGlzLmdldFN1cnZleSgpLnByb2Nlc3NUZXh0RXgodGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmhhc0FsbFZhbHVlc09uTGFzdFJ1biA9IHJlcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW4gJiYgaGFzQWxsVmFsdWVzT25MYXN0UnVuO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBvbkFueVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5wYW5lbC5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICAgICAgdGhpcy5wYW5lbC5vbkFueVZhbHVlQ2hhbmdlZChRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0uSXRlbVZhcmlhYmxlTmFtZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgcGFuZWwgZHltYW5pYyBxdWVzdGlvbi4gWW91IHNldHVwIHRoZSB0ZW1wbGF0ZSBwYW5lbCwgYnV0IGFkZGluZyBlbGVtZW50cyAoYW55IHF1ZXN0aW9uIG9yIGEgcGFuZWwpIGFuZCBhc3NpZ24gYSB0ZXh0IHRvIGl0J3MgdGl0bGUsIGFuZCB0aGlzIHBhbmVsIHdpbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIG9uIGNyZWF0aW5nIGR5bmFtaWMgcGFuZWxzLiBUaGUgbnVtYmVyIG9mIHBhbmVscyBpcyBkZWZpbmVkIGJ5IHBhbmVsQ291bnQgcHJvcGVydHkuXG4gKiBBbiBlbmQtdXNlciBtYXkgZHluYW1pY2FsbHkgYWRkL3JlbW92ZSBwYW5lbHMsIHVubGVzcyB5b3UgZm9yYmlkZGVuIHRoaXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsIGV4dGVuZHMgUXVlc3Rpb24gaW1wbGVtZW50cyBJUXVlc3Rpb25QYW5lbER5bmFtaWNEYXRhIHtcbiAgICBwdWJsaWMgc3RhdGljIE1heFBhbmVsQ291bnQgPSAxMDA7XG4gICAgcHJpdmF0ZSB0ZW1wbGF0ZVZhbHVlOiBQYW5lbE1vZGVsO1xuICAgIHByaXZhdGUgaXRlbXNWYWx1ZTogQXJyYXk8UXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtPiA9IG5ldyBBcnJheTxRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0+KCk7XG4gICAgcHJpdmF0ZSBsb2FkaW5nUGFuZWxDb3VudDogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIGlzVmFsdWVDaGFuZ2luZ0ludGVybmFsbHk6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBvbGRUZW1wbGF0ZVJvd3NDaGFuZ2VkQ2FsbGJhY2s6IGFueTtcbiAgICBwcml2YXRlIGN1cnJlbnRJbmRleFZhbHVlOiBudW1iZXIgPSAtMTtcbiAgICBcbiAgICByZW5kZXJNb2RlQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICAgIHBhbmVsQ291bnRDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gICAgY3VycmVudEluZGV4Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihuYW1lKTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVZhbHVlID0gdGhpcy5jcmVhdGVOZXdQYW5lbE9iamVjdCgpO1xuICAgICAgICB0aGlzLnRlbXBsYXRlLnJlbmRlcldpZHRoID0gXCIxMDAlXCI7XG4gICAgICAgIHRoaXMudGVtcGxhdGUuc2VsZWN0ZWRFbGVtZW50SW5EZXNpZ24gPSB0aGlzO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMub2xkVGVtcGxhdGVSb3dzQ2hhbmdlZENhbGxiYWNrID0gdGhpcy50ZW1wbGF0ZS5yb3dzQ2hhbmdlZENhbGxiYWNrO1xuICAgICAgICB0aGlzLnRlbXBsYXRlLnJvd3NDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHsgc2VsZi50ZW1wbGF0ZU9uUm93c0NoYW5nZWQoKTsgaWYoc2VsZi5vbGRUZW1wbGF0ZVJvd3NDaGFuZ2VkQ2FsbGJhY2spIHNlbGYub2xkVGVtcGxhdGVSb3dzQ2hhbmdlZENhbGxiYWNrKCk7IH1cblxuICAgICAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29uZmlybURlbGV0ZVRleHRcIiwgdGhpcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsIHRoaXMpO1xuICAgICAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxBZGRUZXh0XCIsIHRoaXMpO1xuICAgICAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxSZW1vdmVUZXh0XCIsIHRoaXMpO1xuICAgICAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxQcmV2VGV4dFwiLCB0aGlzKTtcbiAgICAgICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsTmV4dFRleHRcIiwgdGhpcyk7XG4gICAgfVxuICAgIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCkge1xuICAgICAgICBzdXBlci5zZXRTdXJ2ZXlJbXBsKHZhbHVlKTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZS5zZXRTdXJ2ZXlJbXBsKHRoaXMuc3VydmV5SW1wbCk7XG4gICAgfVxuICAgIHByaXZhdGUgdGVtcGxhdGVPblJvd3NDaGFuZ2VkKCkge1xuICAgICAgICBpZih0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgICAgIHRoaXMucmVidWlsZFBhbmVscygpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJwYW5lbGR5bmFtaWNcIjtcbiAgICB9XG4gICAgcHVibGljIHJlbW92ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGUucmVtb3ZlRWxlbWVudChlbGVtZW50KTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogVGhlIHRlbXBsYXRlIFBhbmVsLiBUaGlzIHBhbmVsIGlzIHVzZWQgYXMgYSB0ZW1wbGF0ZSBvbiBjcmVhdGlnbiBkeW5hbWljIHBhbmVsc1xuICAgICAqIEBzZWUgIHRlbXBsYXRlRWxlbWVudHNcbiAgICAgKiBAc2VlIHRlbXBsYXRlVGl0bGVcbiAgICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRlbXBsYXRlKCk6IFBhbmVsTW9kZWwgeyByZXR1cm4gdGhpcy50ZW1wbGF0ZVZhbHVlOyB9XG4gICAgLyoqXG4gICAgICogVGhlIHRlbXBsYXRlIFBhbmVsIGVsZW1lbnRzLCBxdWVzdGlvbnMgYW5kIHBhbmVscy5cbiAgICAgKiBAc2VlICB0ZW1wbGF0ZUVsZW1lbnRzXG4gICAgICogQHNlZSB0ZW1wbGF0ZVxuICAgICAqIEBzZWUgcGFuZWxDb3VudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdGVtcGxhdGVFbGVtZW50cygpOiBBcnJheTxJRWxlbWVudD4geyByZXR1cm4gdGhpcy50ZW1wbGF0ZS5lbGVtZW50czsgfVxuICAgIC8qKlxuICAgICAqIFRoZSB0ZW1wbGF0ZSBQYW5lbCB0aXRsZSBwcm9wZXJ0eS5cbiAgICAgKiBAc2VlICB0ZW1wbGF0ZUVsZW1lbnRzXG4gICAgICogQHNlZSB0ZW1wbGF0ZVxuICAgICAqIEBzZWUgcGFuZWxDb3VudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdGVtcGxhdGVUaXRsZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy50ZW1wbGF0ZS50aXRsZTsgfVxuICAgIHB1YmxpYyBzZXQgdGVtcGxhdGVUaXRsZShuZXdWYWx1ZTogc3RyaW5nKSB7IHRoaXMudGVtcGxhdGUudGl0bGUgPSBuZXdWYWx1ZTsgfVxuICAgIGdldCBsb2NUZW1wbGF0ZVRpdGxlKCk6IExvY2FsaXphYmxlU3RyaW5nIHsgcmV0dXJuIHRoaXMudGVtcGxhdGUubG9jVGl0bGU7IH1cbiAgICAvKipcbiAgICAgKiBUaGUgdGVtcGxhdGUgUGFuZWwgZGVzY3JpcHRpb24gcHJvcGVydHkuXG4gICAgICogQHNlZSAgdGVtcGxhdGVFbGVtZW50c1xuICAgICAqIEBzZWUgdGVtcGxhdGVcbiAgICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICAgKiBAc2VlIHRlbXBsYXRlVGl0bGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRlbXBsYXRlRGVzY3JpcHRpb24oKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMudGVtcGxhdGUuZGVzY3JpcHRpb247IH1cbiAgICBwdWJsaWMgc2V0IHRlbXBsYXRlRGVzY3JpcHRpb24obmV3VmFsdWU6IHN0cmluZykgeyB0aGlzLnRlbXBsYXRlLmRlc2NyaXB0aW9uID0gbmV3VmFsdWU7IH1cbiAgICBnZXQgbG9jVGVtcGxhdGVEZXNjcmlwdGlvbigpOiBMb2NhbGl6YWJsZVN0cmluZyB7IHJldHVybiB0aGlzLnRlbXBsYXRlLmxvY0Rlc2NyaXB0aW9uOyB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IGl0ZW1zKCk6IEFycmF5PFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbT4geyByZXR1cm4gdGhpcy5pdGVtc1ZhbHVlOyB9XG4gICAgLyoqXG4gICAgICogVGhlIGFycmF5IG9mIGR5bmFtaWMgcGFuZWxzIGNyZWF0ZWQgYmFzZWQgb24gcGFuZWwgdGVtcGxhdGVcbiAgICAgKiBAc2VlIHRlbXBsYXRlXG4gICAgICogQHNlZSBwYW5lbENvdW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBwYW5lbHMoKTogQXJyYXk8UGFuZWxNb2RlbD4ge1xuICAgICAgICB2YXIgcmVzID0gW107XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgcmVzLnB1c2godGhpcy5pdGVtc1tpXS5wYW5lbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGluZGV4IG9mIGN1cnJlbnQgYWN0aXZlIGR5bmFtaWNhbCBwYW5lbCB3aGVuIHRoZSByZW5kZXJNb2RlIGlzIG5vdCBcImxpc3RcIi4gSWYgdGhlcmUgaXMgbm8gZHltYW1pYyBwYW5lbCAocGFuZWxDb3VudCA9IDApIG9yIHJlbmRlck1vZGUgZXF1YWxzIFwibGlzdFwiIGl0IHJldHVybnMgLTEsIG90aGVyd2lzZSBpdCByZXR1cm5zIGEgdmFsdWUgZnJvbSAwIHRvIHBhbmVsQ291bnQgLSAxLlxuICAgICAqIEBzZWUgY3VycmVudFBhbmVsXG4gICAgICogQHNlZSBwYW5lbHNcbiAgICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICAgKiBAc2VlIHJlbmRlck1vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRJbmRleCgpOiBudW1iZXIge1xuICAgICAgICBpZih0aGlzLmlzUmVuZGVyTW9kZUxpc3QpIHJldHVybiAtMTtcbiAgICAgICAgaWYodGhpcy5jdXJyZW50SW5kZXhWYWx1ZSA8IDAgJiYgdGhpcy5wYW5lbENvdW50ID4gMCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXhWYWx1ZSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5jdXJyZW50SW5kZXhWYWx1ZSAgPj0gdGhpcy5wYW5lbENvdW50KSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleFZhbHVlID0gdGhpcy5wYW5lbENvdW50IC0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50SW5kZXhWYWx1ZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBjdXJyZW50SW5kZXgodmFsOiBudW1iZXIpIHtcbiAgICAgICAgaWYodmFsID49IHRoaXMucGFuZWxDb3VudCkgdmFsID0gdGhpcy5wYW5lbENvdW50IC0gMTtcbiAgICAgICAgdGhpcy5jdXJyZW50SW5kZXhWYWx1ZSA9IHZhbDtcbiAgICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jdXJyZW50SW5kZXhDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBhY3RpdmUgZHluYW1pY2FsIHBhbmVsIHdoZW4gdGhlIHJlbmRlck1vZGUgaXMgbm90IFwibGlzdFwiLiBJZiB0aGVyZSBpcyBubyBkeW1hbWljIHBhbmVsIChwYW5lbENvdW50ID0gMCkgb3IgcmVuZGVyTW9kZSBlcXVhbHMgXCJsaXN0XCIgaXQgcmV0dXJucyBudWxsLlxuICAgICAqIEBzZWUgY3VycmVuSW5kZXhcbiAgICAgKiBAc2VlIHBhbmVsc1xuICAgICAqIEBzZWUgcGFuZWxDb3VudFxuICAgICAqIEBzZWUgcmVuZGVyTW9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVudFBhbmVsKCk6IFBhbmVsTW9kZWwge1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmN1cnJlbnRJbmRleDtcbiAgICAgICAgaWYoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucGFuZWxzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLnBhbmVsc1tpbmRleF07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBpdCB0byB0cnVlLCB0byBzaG93IGEgY29uZmlybWF0aW9uIGRpYWxvZyBvbiByZW1vdmluZyBhIHBhbmVsXG4gICAgICogQHNlZSBDb25maXJtRGVsZXRlVGV4dFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29uZmlybURlbGV0ZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbmZpcm1EZWxldGVcIiwgZmFsc2UpOyB9XG4gICAgcHVibGljIHNldCBjb25maXJtRGVsZXRlKHZhbDogYm9vbGVhbikgeyB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb25maXJtRGVsZXRlXCIsIHZhbCk7IH1cbiAgICAvKipcbiAgICAgKiBTZXQgaXQgdG8gYSBxdWVzdGlvbiBuYW1lIHVzZWQgaW4gdGhlIHRlbXBsYXRlIHBhbmVsIGFuZCB0aGUgbGlicmFyeSBzaG93cyBkdXBsaWNhdGlvbiBlcnJvciwgaWYgdGhlcmUgYXJlIHNhbWUgdmFsdWVzIGluIGRpZmZlcmVudCBwYW5lbHMgb2YgdGhpcyBxdWVzdGlvbi5cbiAgICAgKiBAc2VlIGtleUR1cGxpY2F0aW9uRXJyb3JcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGtleU5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImtleU5hbWVcIiwgXCJcIik7IH1cbiAgICBwdWJsaWMgc2V0IGtleU5hbWUodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwia2V5TmFtZVwiLCB2YWwpOyB9XG4gICAgLyoqXG4gICAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHRleHQgc2hvd2luZyBpbiB0aGUgY29uZmlybWF0aW9uIGRlbGV0ZSBkaWFsb2cgb24gcmVtb3ZpbmcgYSBwYW5lbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbmZpcm1EZWxldGVUZXh0KCkgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb25maXJtRGVsZXRlVGV4dFwiLCBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY29uZmlybURlbGV0ZVwiKSk7IH0gXG4gICAgcHVibGljIHNldCBjb25maXJtRGVsZXRlVGV4dCh2YWw6IHN0cmluZykgeyB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbmZpcm1EZWxldGVUZXh0XCIsIHZhbCk7IH1cbiAgICBnZXQgbG9jQ29uZmlybURlbGV0ZVRleHQoKTogTG9jYWxpemFibGVTdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImNvbmZpcm1EZWxldGVUZXh0XCIpOyB9XG4gICAgLyoqXG4gICAgICogVGhlIGR1cGxpY2F0aW9uIHZhbHVlIGVycm9yIHRleHQuIFNldCBpdCB0byBzaG93IHRoZSB0ZXh0IGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0LlxuICAgICAqIEBzZWUga2V5TmFtZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQga2V5RHVwbGljYXRpb25FcnJvcigpIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwia2V5RHVwbGljYXRpb25FcnJvclwiLCBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwia2V5RHVwbGljYXRpb25FcnJvclwiKSk7IH0gXG4gICAgcHVibGljIHNldCBrZXlEdXBsaWNhdGlvbkVycm9yKHZhbDogc3RyaW5nKSB7IHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwia2V5RHVwbGljYXRpb25FcnJvclwiLCB2YWwpOyB9XG4gICAgZ2V0IGxvY0tleUR1cGxpY2F0aW9uRXJyb3IoKTogTG9jYWxpemFibGVTdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImtleUR1cGxpY2F0aW9uRXJyb3JcIik7IH1cbiAgICAvKipcbiAgICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgcHJldmlvdXMgYnV0dG9uIHRleHQuIFByZXZpb3VzIGJ1dHRvbiBzaG93cyB0aGUgcHJldmlvdXMgcGFuZWwsIGNoYW5nZSB0aGUgY3VycmVudFBhbmVsLCB3aGVuIHRoZSByZW5kZXJNb2RlIGRvZXNuJ3QgZXF1YWwgdG8gXCJsaXN0XCIuXG4gICAgICogQHNlZSBjdXJyZW50UGFuZWxcbiAgICAgKiBAc2VlIGN1cnJlbnRJbmRleFxuICAgICAqIEBzZWUgcmVuZGVyTW9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGFuZWxQcmV2VGV4dCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwYW5lbFByZXZUZXh0XCIsIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJwYWdlUHJldlRleHRcIikpOyB9XG4gICAgcHVibGljIHNldCBwYW5lbFByZXZUZXh0KHZhbDogc3RyaW5nKSB7IHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFuZWxQcmV2VGV4dFwiLCB2YWwpOyB9XG4gICAgZ2V0IGxvY1BhbmVsUHJldlRleHQoKTogTG9jYWxpemFibGVTdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsUHJldlRleHRcIik7fVxuICAgIC8qKlxuICAgICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBuZXh0IGJ1dHRvbiB0ZXh0LiBOZXh0IGJ1dHRvbiBzaG93cyB0aGUgbmV4dCBwYW5lbCwgY2hhbmdlIHRoZSBjdXJyZW50UGFuZWwsIHdoZW4gdGhlIHJlbmRlck1vZGUgZG9lc24ndCBlcXVhbCB0byBcImxpc3RcIi5cbiAgICAgKiBAc2VlIGN1cnJlbnRQYW5lbFxuICAgICAqIEBzZWUgY3VycmVudEluZGV4XG4gICAgICogQHNlZSByZW5kZXJNb2RlXG4gICAgICovXG4gICAgcHVibGljIGdldCBwYW5lbE5leHRUZXh0KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBhbmVsTmV4dFRleHRcIiwgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInBhZ2VOZXh0VGV4dFwiKSk7IH1cbiAgICBwdWJsaWMgc2V0IHBhbmVsTmV4dFRleHQodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwYW5lbE5leHRUZXh0XCIsIHZhbCk7IH1cbiAgICBnZXQgbG9jUGFuZWxOZXh0VGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxOZXh0VGV4dFwiKTt9XG4gICAgLyoqXG4gICAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGFkZCBwYW5lbCBidXR0b24gdGV4dC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhbmVsQWRkVGV4dCgpIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFuZWxBZGRUZXh0XCIsIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJhZGRQYW5lbFwiKSk7IH0gXG4gICAgcHVibGljIHNldCBwYW5lbEFkZFRleHQodmFsdWU6IHN0cmluZykgeyB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBhbmVsQWRkVGV4dFwiLCB2YWx1ZSk7IH1cbiAgICBnZXQgbG9jUGFuZWxBZGRUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbEFkZFRleHRcIik7OyB9XG4gICAgLyoqXG4gICAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHJlbW92ZSBwYW5lbCBidXR0b24gdGV4dC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhbmVsUmVtb3ZlVGV4dCgpIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFuZWxSZW1vdmVUZXh0XCIsIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZW1vdmVQYW5lbFwiKSk7IH0gXG4gICAgcHVibGljIHNldCBwYW5lbFJlbW92ZVRleHQodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwYW5lbFJlbW92ZVRleHRcIiwgdmFsKTsgfVxuICAgIGdldCBsb2NQYW5lbFJlbW92ZVRleHQoKTogTG9jYWxpemFibGVTdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsUmVtb3ZlVGV4dFwiKTsgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSByZW5kZXJNb2RlIGVxdWFscyB0byBcInByb2dyZXNzVG9wXCIgb3IgXCJwcm9ncmVzc1RvcEJvdHRvbVwiXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1Byb2dyZXNzVG9wU2hvd2luZygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucmVuZGVyTW9kZSA9PSBcInByb2dyZXNzVG9wXCIgfHwgdGhpcy5yZW5kZXJNb2RlID09IFwicHJvZ3Jlc3NUb3BCb3R0b21cIjsgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSByZW5kZXJNb2RlIGVxdWFscyB0byBcInByb2dyZXNzQm90dG9tXCIgb3IgXCJwcm9ncmVzc1RvcEJvdHRvbVwiXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1Byb2dyZXNzQm90dG9tU2hvd2luZygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucmVuZGVyTW9kZSA9PSBcInByb2dyZXNzQm90dG9tXCIgfHwgdGhpcy5yZW5kZXJNb2RlID09IFwicHJvZ3Jlc3NUb3BCb3R0b21cIjsgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSB3aGVuIGN1cnJlbnRJbmRleCBpcyBtb3JlIHRoYW4gMC5cbiAgICAgKiBAc2VlIGN1cnJlbkluZGV4XG4gICAgICogQHNlZSBjdXJyZW5QYW5lbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNQcmV2QnV0dG9uU2hvd2luZygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuY3VycmVudEluZGV4ID4gMDsgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSB3aGVuIGN1cnJlbnRJbmRleCBpcyBtb3JlIHRoYW4gb3IgZXF1YWwgMCBhbmQgbGVzcyB0aGVuIHBhbmVsQ291bnQgLSAxLlxuICAgICAqIEBzZWUgY3VycmVuSW5kZXhcbiAgICAgKiBAc2VlIGN1cnJlblBhbmVsXG4gICAgICogQHNlZSBwYW5lbENvdW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBpc05leHRCdXR0b25TaG93aW5nKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5jdXJyZW50SW5kZXggPj0gMCAmJiB0aGlzLmN1cnJlbnRJbmRleCA8IHRoaXMucGFuZWxDb3VudCAtIDE7IH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgd2hlbiBzaG93UmFuZ2VJblByb2dyZXNzIGVxdWFscyB0byB0cnVlLCByZW5kZXJNb2RlIGRvZXNuJ3QgZXF1YWwgdG8gXCJsaXN0XCIgYW5kIHBhbmVsQ291bnQgaXMgPj0gMi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzUmFuZ2VTaG93aW5nKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5zaG93UmFuZ2VJblByb2dyZXNzICYmICh0aGlzLmN1cnJlbnRJbmRleCA+PSAwICYmIHRoaXMucGFuZWxDb3VudCA+IDEpOyB9XG4gICAgcHVibGljIGdldEVsZW1lbnRzSW5EZXNpZ24oaW5jbHVkZUhpZGRlbjogYm9vbGVhbiA9IGZhbHNlKTogQXJyYXk8SUVsZW1lbnQ+IHsgcmV0dXJuIGluY2x1ZGVIaWRkZW4gPyBbdGhpcy50ZW1wbGF0ZV0gOiB0aGlzLnRlbXBsYXRlRWxlbWVudHM7IH1cbiAgICAvKipcbiAgICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBnZXQvc2V0IHRoZSBudW1iZXIgb2YgZHluYW1pYyBwYW5lbHMuXG4gICAgICogQHNlZSB0ZW1wbGF0ZVxuICAgICAqIEBzZWUgbWluUGFuZWxDb3VudFxuICAgICAqIEBzZWUgbWF4UGFuZWxDb3VudFxuICAgICAqIEBzZWUgYWRkUGFuZWxcbiAgICAgKiBAc2VlIHJlbW92ZVBhbmVsXG4gICAgICogQHNlZSByZW1vdmVQYW5lbFVJXG4gICAgICovXG4gICAgcHVibGljIGdldCBwYW5lbENvdW50KCk6IG51bWJlciB7IHJldHVybiB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uID8gdGhpcy5sb2FkaW5nUGFuZWxDb3VudCA6IHRoaXMuaXRlbXMubGVuZ3RoOyB9XG4gICAgcHVibGljIHNldCBwYW5lbENvdW50KHZhbDogbnVtYmVyKSB7XG4gICAgICAgIGlmKHZhbCA8IDApIHJldHVybjtcbiAgICAgICAgaWYodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nUGFuZWxDb3VudCA9IHZhbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZih2YWwgPT0gdGhpcy5pdGVtcy5sZW5ndGggfHwgdGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcbiAgICAgICAgZm9yKGxldCBpID0gdGhpcy5wYW5lbENvdW50OyBpIDwgdmFsOyBpICsrKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2godGhpcy5jcmVhdGVOZXdJdGVtKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHZhbCA8IHRoaXMucGFuZWxDb3VudCkgdGhpcy5pdGVtcy5zcGxpY2UodmFsLCB0aGlzLnBhbmVsQ291bnQgLSB2YWwpO1xuICAgICAgICB0aGlzLnNldFZhbHVlQmFzZWRPblBhbmVsQ291bnQoKTtcbiAgICAgICAgdGhpcy5yZVJ1bkNvbmRpdGlvbigpO1xuICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnBhbmVsQ291bnRDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH1cbiAgICBwcml2YXRlIHNldFZhbHVlQmFzZWRPblBhbmVsQ291bnQoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIGlmKCF2YWx1ZSB8fCAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHZhbHVlID0gW107XG4gICAgICAgIGlmKHZhbHVlLmxlbmd0aCA9PSB0aGlzLnBhbmVsQ291bnQpIHJldHVybjtcbiAgICAgICAgZm9yKHZhciBpID0gdmFsdWUubGVuZ3RoOyBpIDwgdGhpcy5wYW5lbENvdW50OyBpICsrKSB2YWx1ZS5wdXNoKHt9KTtcbiAgICAgICAgaWYodmFsdWUubGVuZ3RoID4gdGhpcy5wYW5lbENvdW50KSB2YWx1ZS5zcGxpY2UodGhpcy5wYW5lbENvdW50LCB2YWx1ZS5sZW5ndGggLSB0aGlzLnBhbmVsQ291bnQpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIHBhbmVsIGNvdW50LiBBIHVzZXIgY291bGQgbm90IGRlbGV0ZSBhIHBhbmVsIGlmIHRoZSBwYW5lbENvdW50IGVxdWFscyB0byBtaW5QYW5lbENvdW50XG4gICAgICogQHNlZSBwYW5lbENvdW50XG4gICAgICogQHNlZSBtYXhQYW5lbENvdW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBtaW5QYW5lbENvdW50KCkgOiBudW1iZXIgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWluUGFuZWxDb3VudFwiLCAwKTsgfVxuICAgIHB1YmxpYyBzZXQgbWluUGFuZWxDb3VudCh2YWwgOiBudW1iZXIpIHtcbiAgICAgICAgaWYodmFsIDwgMCkgdmFsID0gMDtcbiAgICAgICAgaWYodmFsID09IHRoaXMubWluUGFuZWxDb3VudCB8fCB2YWwgPiB0aGlzLm1heFBhbmVsQ291bnQpIHJldHVybjtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWluUGFuZWxDb3VudFwiLCB2YWwpO1xuICAgICAgICBpZih0aGlzLnBhbmVsQ291bnQgPCB2YWwpIHRoaXMucGFuZWxDb3VudCA9IHZhbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gcGFuZWwgY291bnQuIEEgdXNlciBjb3VsZCBub3QgYWRkIGEgcGFuZWwgaWYgdGhlIHBhbmVsQ291bnQgZXF1YWxzIHRvIG1heFBhbmVsQ291bnRcbiAgICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICAgKiBAc2VlIG1pblBhbmVsQ291bnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1heFBhbmVsQ291bnQoKSA6IG51bWJlciB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhQYW5lbENvdW50XCIsIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwuTWF4UGFuZWxDb3VudCk7IH1cbiAgICBwdWJsaWMgc2V0IG1heFBhbmVsQ291bnQodmFsIDogbnVtYmVyKSB7XG4gICAgICAgIGlmKHZhbCA8PSAwKSByZXR1cm47XG4gICAgICAgIGlmKHZhbCA+IFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwuTWF4UGFuZWxDb3VudCkgdmFsID0gUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbC5NYXhQYW5lbENvdW50O1xuICAgICAgICBpZih2YWwgPT0gdGhpcy5tYXhQYW5lbENvdW50IHx8IHZhbCA8IHRoaXMubWluUGFuZWxDb3VudCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhQYW5lbENvdW50XCIsIHZhbCk7XG4gICAgICAgIGlmKHRoaXMucGFuZWxDb3VudCA+IHZhbCkgdGhpcy5wYW5lbENvdW50ID0gdmFsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzaG93L2hpZGUgdGhlIG51bWJlcnMgaW4gdGl0bGVzIGluIHF1ZXN0aW9ucyBpbnNpZGUgYSBkeW5hbWljIHBhbmVsLlxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIGlzIFwib2ZmXCIuIFlvdSBtYXkgc2V0IGl0IHRvIFwib25QYW5lbFwiIGFuZCB0aGUgZmlyc3QgcXVlc3Rpb24gaW5zaWRlIGEgZHluYW1pYyBwYW5lbCB3aWxsIHN0YXJ0IHdpdGggMSBvciBcIm9uU3VydmV5XCIgdG8gaW5jbHVkZSBuZXN0ZWQgcXVlc3Rpb25zIGluIGR5bWFtaWMgcGFuZWxzIGludG8gZ2xvYmFsIHN1cnZleSBxdWVzdGlvbiBudW1iZXJpbmcuXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG93UXVlc3Rpb25OdW1iZXJzKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIsIFwib2ZmXCIpOyB9XG4gICAgcHVibGljIHNldCBzaG93UXVlc3Rpb25OdW1iZXJzKHZhbDogc3RyaW5nKSB7IFxuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIsIHZhbCk7XG4gICAgICAgIGlmKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmIHRoaXMuc3VydmV5KSB7XG4gICAgICAgICAgICB0aGlzLnN1cnZleS5xdWVzdGlvblZpc2liaWxpdHlDaGFuZ2VkKHRoaXMsIHRoaXMudmlzaWJsZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvd3MgdGhlIHJhbmdlIGZyb20gMSB0byBwYW5lbENvdW50IHdoZW4gcmVuZGVyTW9kZSBkb2Vzbid0IGVxdWFsIHRvIFwibGlzdFwiLiBTZXQgdG8gZmFsc2UgdG8gaGlkZSB0aGlzIGVsZW1lbnQuXG4gICAgICogQHNlZSBwYW5lbENvdW50XG4gICAgICogQHNlZSByZW5kZXJNb2RlXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG93UmFuZ2VJblByb2dyZXNzKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1JhbmdlSW5Qcm9ncmVzc1wiLCB0cnVlKTsgfVxuICAgIHB1YmxpYyBzZXQgc2hvd1JhbmdlSW5Qcm9ncmVzcyh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1JhbmdlSW5Qcm9ncmVzc1wiLCB2YWwpO1xuICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmN1cnJlbnRJbmRleENoYW5nZWRDYWxsYmFjayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIHByb3BlcnR5IGVxdWFscyB0byBcImxpc3RcIiBhbmQgYWxsIGR5bmFtaWMgcGFuZWxzIGFyZSByZW5kZXJlZCBvbmUgYnkgb25lIG9uIHRoZSBwYWdlLiBZb3UgbWF5IGNoYW5nZSBpdCB0bzogXCJwcm9ncmVzc1RvcFwiLCBcInByb2dyZXNzQm90dG9tXCIgb3IgXCJwcm9ncmVzc1RvcEJvdHRvbVwiIHRvIHJlbmRlciBvbmx5IG9uZSBkeW5hbWljIHBhbmVsIGF0IG9uY2UuIFRoZSBwcm9ncmVzcyBhbmQgbmF2aWdhdGlvbiBlbGVtZW50cyBjYW4gYmUgcmVuZHJlZCBvbiB0b3AsIGJvdHRvbSBvciBib3RoLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVuZGVyTW9kZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyTW9kZVwiLCBcImxpc3RcIik7IH1cbiAgICBwdWJsaWMgc2V0IHJlbmRlck1vZGUodmFsOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyTW9kZVwiLCB2YWwpO1xuICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnJlbmRlck1vZGVDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgd2hlbiByZW5kZXJNb2RlIGVxdWFscyB0byBcImxpc3RcIi5cbiAgICAgKiBAcmVuZGVyTW9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNSZW5kZXJNb2RlTGlzdCgpIHsgcmV0dXJuIHRoaXMucmVuZGVyTW9kZSA9PSBcImxpc3RcIjsgfVxuICAgIHB1YmxpYyBzZXRWaXNpYmxlSW5kZXgodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHZhciBzdGFydEluZGV4ID0gdGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzID09IFwib25TdXJ2ZXlcIiA/IHZhbHVlOiAwO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIHZhciBjb3VudGVyID0gdGhpcy5pdGVtc1tpXS5zZXRWaXNpYmxlSW5kZXgoc3RhcnRJbmRleCwgdGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzICE9IFwib2ZmXCIpO1xuICAgICAgICAgICAgaWYodGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzID09IFwib25TdXJ2ZXlcIikge1xuICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggKz0gY291bnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdXBlci5zZXRWaXNpYmxlSW5kZXgodGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzICE9IFwib25TdXJ2ZXlcIiA/IHZhbHVlOiAtMSk7XG4gICAgICAgIHJldHVybiB0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgIT0gXCJvblN1cnZleVwiID8gMSA6IHN0YXJ0SW5kZXggLSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIHdoZW4gYW4gZW5kIHVzZXIgbWF5IGFkZCBhIG5ldyBwYW5lbC4gVGhlIHF1ZXN0aW9uIGlzIG5vdCByZWFkIG9ubHkgYW5kIHBhbmVsQ291bnQgbGVzcyB0aGFuIG1heFBhbmVsQ291bnRcbiAgICAgKiBAc2VlIGlzUmVhZE9ubHlcbiAgICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICAgKiBAc2VlIG1heFBhbmVsQ291bnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNhbkFkZFBhbmVsKCkgOiBib29sZWFuIHsgcmV0dXJuICF0aGlzLmlzUmVhZE9ubHkgJiYgKHRoaXMucGFuZWxDb3VudCA8IHRoaXMubWF4UGFuZWxDb3VudCk7IH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgd2hlbiBhbiBlbmQgdXNlciBtYXkgcmVtb3ZlIGEgcGFuZWwuIFRoZSBxdWVzdGlvbiBpcyBub3QgcmVhZCBvbmx5IGFuZCBwYW5lbENvdW50IGlzIG1vcmUgdGhhbiBtaW5QYW5lbENvdW50XG4gICAgICogQHNlZSBpc1JlYWRPbmx5XG4gICAgICogQHNlZSBwYW5lbENvdW50XG4gICAgICogQHNlZSBtaW5QYW5lbENvdW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBjYW5SZW1vdmVQYW5lbCgpIDogYm9vbGVhbiB7IHJldHVybiAhdGhpcy5pc1JlYWRPbmx5ICYmICh0aGlzLnBhbmVsQ291bnQgPiB0aGlzLm1pblBhbmVsQ291bnQpOyB9XG4gICAgcHJvdGVjdGVkIHJlYnVpbGRQYW5lbHMoKSB7XG4gICAgICAgIHZhciBpdGVtcyA9IG5ldyBBcnJheTxRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0+KCk7XG4gICAgICAgIGlmKHRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKG5ldyBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0odGhpcywgdGhpcy50ZW1wbGF0ZSkpO1xuICAgICAgICAgICAgaWYodGhpcy5vbGRUZW1wbGF0ZVJvd3NDaGFuZ2VkQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9sZFRlbXBsYXRlUm93c0NoYW5nZWRDYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgaSAgPCB0aGlzLnBhbmVsQ291bnQ7IGkgKyspIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHRoaXMuY3JlYXRlTmV3SXRlbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLml0ZW1zVmFsdWUgPSBpdGVtcztcbiAgICAgICAgdGhpcy5yZVJ1bkNvbmRpdGlvbigpO1xuICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnBhbmVsQ291bnRDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBuZXcgZHluYW1pYyBwYW5lbCBiYXNlZCBvbiB0aGUgdGVtcGxhdGUgUGFuZWwuXG4gICAgICogQHNlZSB0ZW1wbGF0ZVxuICAgICAqIEBzZWUgcGFuZWxDb3VudFxuICAgICAqIEBzZWUgcGFuZWxzXG4gICAgICovXG4gICAgcHVibGljIGFkZFBhbmVsKCk6IFBhbmVsTW9kZWwge1xuICAgICAgICBpZighdGhpcy5jYW5BZGRQYW5lbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHRoaXMucGFuZWxDb3VudCArKztcbiAgICAgICAgaWYoIXRoaXMuaXNSZW5kZXJNb2RlTGlzdCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSB0aGlzLnBhbmVsQ291bnQgLSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1zW3RoaXMucGFuZWxDb3VudCAtIDFdLnBhbmVsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIHJlbW92ZVBhbmVsIGZ1bmN0aW9uLiBJZiBjb25maXJtRGVsZXRlIHNldCB0byB0cnVlLCBpdCBzaG93cyB0aGUgY29uZmlybWF0aW9uIGRpYWxvZyBmaXJzdC5cbiAgICAgKiBAcGFyYW0gdmFsdWUgYSBwYW5lbCBvciBwYW5lbCBpbmRleFxuICAgICAqIEBzZWUgcmVtb3ZlUGFuZWxcbiAgICAgKiBAc2VlIGNvbmZpcm1EZWxldGVcbiAgICAgKiBAc2VlIGNvbmZpcm1EZWxldGVUZXh0XG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVBhbmVsVUkodmFsdWU6IGFueSkge1xuICAgICAgICBpZighdGhpcy5jb25maXJtRGVsZXRlIHx8IGNvbmZpcm0odGhpcy5jb25maXJtRGVsZXRlVGV4dCkpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlUGFuZWwodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBkeW5hbWljIHBhbmVsIGZyb20gdGhlIHBhbmVscyBhcnJheS4gRG8gbm90aGluZyBpcyBjYVJlbW92ZVBhbmVsIHJldHVybnMgZmFsc2UuXG4gICAgICogQHBhcmFtIHZhbHVlIGEgcGFuZWwgb3IgcGFuZWwgaW5kZXhcbiAgICAgKiBAc2VlIHBhbmVsc1xuICAgICAqIEBzZWUgY2FuUmVtb3ZlUGFuZWxcbiAgICAgKiBAc2VlIHRlbXBsYXRlXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVBhbmVsKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYoIXRoaXMuY2FuUmVtb3ZlUGFuZWwpIHJldHVybjtcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5nZXRQYW5lbEluZGV4KHZhbHVlKTtcbiAgICAgICAgaWYoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucGFuZWxDb3VudCkgcmV0dXJuO1xuICAgICAgICB0aGlzLml0ZW1zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIGlmKCF2YWx1ZSB8fCAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaW5kZXggPj0gdmFsdWUubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHZhbHVlLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5wYW5lbENvdW50Q2hhbmdlZENhbGxiYWNrKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRQYW5lbEluZGV4KHZhbDogYW55KTogbnVtYmVyIHtcbiAgICAgICAgaWYoIWlzTmFOKHBhcnNlRmxvYXQodmFsKSkgJiYgaXNGaW5pdGUodmFsKSkgcmV0dXJuIHZhbDtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgICAgICBpZih0aGlzLml0ZW1zW2ldID09PSB2YWwgfHwgdGhpcy5pdGVtc1tpXS5wYW5lbCA9PT0gdmFsKSByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgICAgIGlmKHRoaXMubG9hZGluZ1BhbmVsQ291bnQgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnBhbmVsQ291bnQgPSB0aGlzLmxvYWRpbmdQYW5lbENvdW50O1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRQYW5lbHMoKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5vblN1cnZleUxvYWQoKTtcbiAgICB9XG4gICAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMpO1xuICAgICAgICB0aGlzLnJ1blBhbmVsc0NvbmRpdGlvbih2YWx1ZXMpO1xuICAgIH1cbiAgICBwcml2YXRlIHJlUnVuQ29uZGl0aW9uKCkge1xuICAgICAgICBpZighdGhpcy5kYXRhKSByZXR1cm47XG4gICAgICAgIHRoaXMucnVuQ29uZGl0aW9uKHRoaXMuZGF0YS5nZXRBbGxWYWx1ZXMoKSk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBydW5QYW5lbHNDb25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgICAgICB2YXIgbmV3VmFsdWVzID0ge307XG4gICAgICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgICAgICBuZXdWYWx1ZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlcykpO1xuICAgICAgICB9XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgbmV3VmFsdWVzW1F1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbS5JdGVtVmFyaWFibGVOYW1lXSA9IHRoaXMuZ2V0UGFuZWxJdGVtRGF0YSh0aGlzLml0ZW1zW2ldKTtcbiAgICAgICAgICAgIHRoaXMuaXRlbXNbaV0ucnVuQ29uZGl0aW9uKG5ld1ZhbHVlcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXNbaV0ub25BbnlWYWx1ZUNoYW5nZWQobmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGhhc0Vycm9ycyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgICAgIHZhciBlcnJvc0luUGFuZWxzID0gdGhpcy5oYXNFcnJvckluUGFuZWxzKGZpcmVDYWxsYmFjayk7XG4gICAgICAgIHJldHVybiBzdXBlci5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrKSB8fCBlcnJvc0luUGFuZWxzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0QWxsRXJyb3JzKCk6IEFycmF5PFN1cnZleUVycm9yPiB7IFxuICAgICAgICB2YXIgcmVzdWx0ID0gc3VwZXIuZ2V0QWxsRXJyb3JzKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnBhbmVsc1tpXS5xdWVzdGlvbnM7XG4gICAgICAgICAgICBmb3IodmFyIGogPSAwOyBqIDwgcXVlc3Rpb25zLmxlbmd0aDsgaiArKykge1xuICAgICAgICAgICAgICAgIHZhciBlcnJvcnMgPSBxdWVzdGlvbnNbal0uZ2V0QWxsRXJyb3JzKCk7XG4gICAgICAgICAgICAgICAgaWYoZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZXJyb3JzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDsgXG4gICAgfVxuICAgIHByaXZhdGUgaGFzRXJyb3JJblBhbmVscyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgdmFyIHJlcyA9IGZhbHNlO1xuICAgICAgICB2YXIgcGFuZWxzID0gdGhpcy5wYW5lbHM7XG4gICAgICAgIHZhciBrZXlWYWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBwbmxFcnJvciA9IHBhbmVsc1tpXS5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrKTtcbiAgICAgICAgICAgIHBubEVycm9yID0gdGhpcy5pc1ZhbHVlRHVwbGljYXRlZChwYW5lbHNbaV0sIGtleVZhbHVlcykgfHwgcG5sRXJyb3I7XG4gICAgICAgICAgICBpZighdGhpcy5pc1JlbmRlck1vZGVMaXN0ICYmIHBubEVycm9yICYmICFyZXMpIHsgXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzID0gcG5sRXJyb3IgfHwgcmVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHByaXZhdGUgaXNWYWx1ZUR1cGxpY2F0ZWQocGFuZWw6IFBhbmVsTW9kZWwsIGtleVZhbHVlczogQXJyYXk8YW55Pik6IGJvb2xlYW4ge1xuICAgICAgICBpZighdGhpcy5rZXlOYW1lKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IDxRdWVzdGlvbj5wYW5lbC5nZXRRdWVzdGlvbkJ5TmFtZSh0aGlzLmtleU5hbWUpO1xuICAgICAgICBpZighcXVlc3Rpb24gfHwgcXVlc3Rpb24uaXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciB2YWx1ZSA9IHF1ZXN0aW9uLnZhbHVlO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwga2V5VmFsdWVzLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgaWYodmFsdWUgPT0ga2V5VmFsdWVzW2ldKSB7XG4gICAgICAgICAgICAgICAgcXVlc3Rpb24uYWRkRXJyb3IobmV3IEN1c3RvbUVycm9yKHRoaXMua2V5RHVwbGljYXRpb25FcnJvcikpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGtleVZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgY3JlYXRlTmV3SXRlbSgpOiBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0ge1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSh0aGlzLCB0aGlzLmNyZWF0ZU5ld1BhbmVsKCkpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgY3JlYXRlTmV3UGFuZWwoKTogUGFuZWxNb2RlbCB7XG4gICAgICAgIHZhciBwYW5lbCA9IHRoaXMuY3JlYXRlTmV3UGFuZWxPYmplY3QoKTtcbiAgICAgICAgdmFyIGpPYmogPSBuZXcgSnNvbk9iamVjdCgpO1xuICAgICAgICB2YXIganNvbiA9IGpPYmoudG9Kc29uT2JqZWN0KHRoaXMudGVtcGxhdGUpO1xuICAgICAgICBqT2JqLnRvT2JqZWN0KGpzb24sIHBhbmVsKTtcbiAgICAgICAgcGFuZWwucmVuZGVyV2lkdGggPSBcIjEwMCVcIjtcbiAgICAgICAgcmV0dXJuIHBhbmVsO1xuICAgIH0gICBcbiAgICBwcm90ZWN0ZWQgY3JlYXRlTmV3UGFuZWxPYmplY3QoKTogUGFuZWxNb2RlbCB7XG4gICAgICAgIHJldHVybiBuZXcgUGFuZWxNb2RlbCgpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQoKSB7XG4gICAgICAgIGlmKHRoaXMuaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseSkgcmV0dXJuO1xuICAgICAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICAgICAgdmFyIG5ld1BhbmVsQ291bnQgPSB2YWwgJiYgQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsLmxlbmd0aCA6IDA7XG4gICAgICAgIGlmIChuZXdQYW5lbENvdW50IDw9IHRoaXMucGFuZWxDb3VudCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnBhbmVsQ291bnQgPSBuZXdQYW5lbENvdW50O1xuICAgIH1cbiAgICBwdWJsaWMgb25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWU6IGFueSkge1xuICAgICAgICBzdXBlci5vblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZSk7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgdGhpcy5pdGVtc1tpXS5vblN1cnZleVZhbHVlQ2hhbmdlZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb3RlY3RlZCBvblNldERhdGEoKSB7IFxuICAgICAgICBzdXBlci5vblNldERhdGEoKTtcbiAgICAgICAgaWYodGhpcy5pc0Rlc2lnbk1vZGUpIHtcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGUuc2V0U3VydmV5SW1wbCh0aGlzLnN1cnZleUltcGwpO1xuICAgICAgICAgICAgaWYoIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYnVpbGRQYW5lbHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvL0lRdWVzdGlvblBhbmVsRHluYW1pY0RhdGEgXG4gICAgZ2V0SXRlbUluZGV4KGl0ZW06IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSk7XG4gICAgfVxuICAgIGdldFBhbmVsSXRlbURhdGEoaXRlbTogUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtKTogYW55IHtcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5pdGVtcy5pbmRleE9mKGl0ZW0pO1xuICAgICAgICBpZihpbmRleCA8IDApIHJldHVybiB7fTtcbiAgICAgICAgdmFyIHFWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIGlmKCFxVmFsdWUgfHwgIUFycmF5LmlzQXJyYXkocVZhbHVlKSB8fCBxVmFsdWUubGVuZ3RoIDw9IGluZGV4KSByZXR1cm4ge307XG4gICAgICAgIHJldHVybiBxVmFsdWVbaW5kZXhdO1xuICAgIH1cbiAgICBzZXRQYW5lbEl0ZW1EYXRhKGl0ZW06IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSwgbmFtZTogc3RyaW5nLCB2YWw6IGFueSkge1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSk7XG4gICAgICAgIGlmKGluZGV4IDwgMCkgcmV0dXJuO1xuICAgICAgICB2YXIgcVZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgaWYoIXFWYWx1ZSkge1xuICAgICAgICAgICAgIHFWYWx1ZSA9IFtdO1xuICAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgICAgICBxVmFsdWUucHVzaCh7fSk7XG4gICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmKCFBcnJheS5pc0FycmF5KHFWYWx1ZSkgfHwgcVZhbHVlLmxlbmd0aCA8PSBpbmRleCkgcmV0dXJuO1xuICAgICAgICBpZighcVZhbHVlW2luZGV4XSkgcVZhbHVlW2luZGV4XSA9IHt9O1xuICAgICAgICBxVmFsdWVbaW5kZXhdW25hbWVdID0gdmFsO1xuICAgICAgICB0aGlzLmlzVmFsdWVDaGFuZ2luZ0ludGVybmFsbHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnZhbHVlID0gcVZhbHVlO1xuICAgICAgICB0aGlzLmlzVmFsdWVDaGFuZ2luZ0ludGVybmFsbHkgPSBmYWxzZTtcbiAgICB9XG4gICAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkgeyByZXR1cm4gdGhpcy5zdXJ2ZXk7IH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcInBhbmVsZHluYW1pY1wiLCBbe25hbWU6IFwidGVtcGxhdGVFbGVtZW50c1wiLCBhbHRlcm5hdGl2ZU5hbWU6IFwicXVlc3Rpb25zXCIsIHZpc2libGU6IGZhbHNlfSwgXG4gICAge25hbWU6IFwidGVtcGxhdGVUaXRsZTp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUZW1wbGF0ZVRpdGxlXCJ9LCB7bmFtZTogXCJ0ZW1wbGF0ZURlc2NyaXB0aW9uOnRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RlbXBsYXRlRGVzY3JpcHRpb25cIn0sXG4gICAge25hbWU6IFwicGFuZWxDb3VudDpudW1iZXJcIiwgZGVmYXVsdDogMCwgY2hvaWNlczogWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXX0sXG4gICAgeyBuYW1lOiBcIm1pblBhbmVsQ291bnQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDAgfSwgeyBuYW1lOiBcIm1heFBhbmVsQ291bnQ6bnVtYmVyXCIsIGRlZmF1bHQ6IFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwuTWF4UGFuZWxDb3VudCB9LFxuICAgIHtuYW1lOiBcImtleU5hbWVcIn0sIHsgbmFtZTogXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NLZXlEdXBsaWNhdGlvbkVycm9yXCIgfSxcbiAgICB7bmFtZTogXCJjb25maXJtRGVsZXRlOmJvb2xlYW5cIn0sIHsgbmFtZTogXCJjb25maXJtRGVsZXRlVGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29uZmlybURlbGV0ZVRleHRcIiB9LFxuICAgIHsgbmFtZTogXCJwYW5lbEFkZFRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BhbmVsQWRkVGV4dFwiIH0sIHsgbmFtZTogXCJwYW5lbFJlbW92ZVRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BhbmVsUmVtb3ZlVGV4dFwiIH0sXG4gICAgeyBuYW1lOiBcInBhbmVsUHJldlRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BhbmVsUHJldlRleHRcIiB9LCB7IG5hbWU6IFwicGFuZWxOZXh0VGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGFuZWxOZXh0VGV4dFwiIH0sXG4gICAgeyBuYW1lOiBcInNob3dRdWVzdGlvbk51bWJlcnNcIiwgZGVmYXVsdDogXCJvZmZcIiwgY2hvaWNlczogW1wib2ZmXCIsIFwib25QYW5lbFwiLCBcIm9uU3VydmV5XCJdIH0sIHsgbmFtZTogXCJzaG93UmFuZ2VJblByb2dyZXNzXCIsIGRlZmF1bHQ6IHRydWV9LFxuICAgIHsgbmFtZTogXCJyZW5kZXJNb2RlXCIsIGRlZmF1bHQ6IFwibGlzdFwiLCBjaG9pY2VzOiBbXCJsaXN0XCIsIFwicHJvZ3Jlc3NUb3BcIiwgXCJwcm9ncmVzc0JvdHRvbVwiLCBcInByb2dyZXNzVG9wQm90dG9tXCJdfV0sXG4gICAgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwoXCJcIik7IH0sIFwicXVlc3Rpb25cIik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInBhbmVsZHluYW1pY1wiLCAobmFtZSkgPT4geyByZXR1cm4gbmV3IFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwobmFtZSk7ICB9KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fcGFuZWxkeW5hbWljLnRzIiwiaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQge1F1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQge1F1ZXN0aW9uQ2hlY2tib3hCYXNlfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSByYWRpb2dyb3VwIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbkNoZWNrYm94QmFzZSB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihuYW1lKTtcbiAgICB9XG4gICAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwicmFkaW9ncm91cFwiO1xuICAgIH1cbiAgICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHsgcmV0dXJuIHRydWU7IH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcInJhZGlvZ3JvdXBcIiwgW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbChcIlwiKTsgfSwgXCJjaGVja2JveGJhc2VcIik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicmFkaW9ncm91cFwiLCAobmFtZSkgPT4geyB2YXIgcSA9IG5ldyBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbChuYW1lKTsgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzOyByZXR1cm4gcTt9KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9yYWRpb2dyb3VwLnRzIiwiaW1wb3J0IHtJdGVtVmFsdWV9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHtRdWVzdGlvbn0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7SnNvbk9iamVjdH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHtRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHtMb2NhbGl6YWJsZVN0cmluZ30gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIHJhdGluZyBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUmF0aW5nTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gICAgcHVibGljIHN0YXRpYyBNYXhpbXVtUmF0ZVZhbHVlQ291bnQ6IG51bWJlciA9IDIwO1xuICAgIHByaXZhdGUgcmF0ZXM6IEFycmF5PEl0ZW1WYWx1ZT47XG5cbiAgICByYXRlVmFsdWVzQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihuYW1lKTtcbiAgICAgICAgdGhpcy5yYXRlcyA9IHRoaXMuY3JlYXRlSXRlbVZhbHVlcyhcInJhdGVzXCIpO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJyYXRlc1wiLCBmdW5jdGlvbigpIHtzZWxmLmZpcmVDYWxsYmFjayhzZWxmLnJhdGVWYWx1ZXNDaGFuZ2VkQ2FsbGJhY2spO30pO1xuICAgICAgICB0aGlzLm9uUHJvcGVydHlDaGFuZ2VkLmFkZChmdW5jdGlvbihzZW5kZXIsIG9wdGlvbnMpe1xuICAgICAgICAgICAgaWYob3B0aW9ucy5uYW1lID09IFwicmF0ZU1pblwiIHx8IG9wdGlvbnMubmFtZSA9PSBcInJhdGVNYXhcIiB8fCBvcHRpb25zLm5hbWUgPT0gXCJyYXRlU3RlcFwiKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soc2VsZi5yYXRlVmFsdWVzQ2hhbmdlZENhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICB2YXIgbG9jTWluUmF0ZURlc2NyaXB0aW9uVmFsdWUgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwibWluUmF0ZURlc2NyaXB0aW9uXCIsIHRoaXMsIHRydWUpO1xuICAgICAgICB2YXIgbG9jTWF4UmF0ZURlc2NyaXB0aW9uVmFsdWUgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwibWF4UmF0ZURlc2NyaXB0aW9uXCIsIHRoaXMsIHRydWUpO1xuICAgICAgICBsb2NNaW5SYXRlRGVzY3JpcHRpb25WYWx1ZS5vbkdldFRleHRDYWxsYmFjayA9IGZ1bmN0aW9uKHRleHQpIHsgcmV0dXJuIHRleHQgPyB0ZXh0ICsgXCIgXCIgOiB0ZXh0OyB9XG4gICAgICAgIGxvY01heFJhdGVEZXNjcmlwdGlvblZhbHVlLm9uR2V0VGV4dENhbGxiYWNrID0gZnVuY3Rpb24odGV4dCkgeyByZXR1cm4gdGV4dCA/IFwiIFwiICsgdGV4dCA6IHRleHQ7IH1cbiAgICB9XG4gICAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICAgICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucmF0ZVZhbHVlc0NoYW5nZWRDYWxsYmFjayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIHJhdGUgaXRlbXMuIEV2ZXJ5IGl0ZW0gaGFzIHZhbHVlIGFuZCB0ZXh0LiBJZiB0ZXh0IGlzIGVtcHR5LCB0aGUgdmFsdWUgaXMgcmVuZGVyZWQuIFRoZSBpdGVtIHRleHQgc3VwcG9ydHMgbWFya2Rvd24uIElmIGl0IGlzIGVtcHR5IHRoZSBhcnJheSBpcyBnZW5lcmF0ZWQgYnkgdXNpbmcgcmF0ZU1pbiwgcmF0ZU1heCBhbmQgcmF0ZVN0ZXAgcHJvcGVydGllcy5cbiAgICAgKiBAc2VlIHJhdGVNaW5cbiAgICAgKiBAc2VlIHJhdGVNYXhcbiAgICAgKiBAc2VlIHJhdGVTdGVwXG4gICAgICovXG4gICAgcHVibGljIGdldCByYXRlVmFsdWVzKCk6IEFycmF5PGFueT4geyByZXR1cm4gdGhpcy5yYXRlczsgfVxuICAgIHB1YmxpYyBzZXQgcmF0ZVZhbHVlcyh2YWw6IEFycmF5PGFueT4pIHtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZXNcIiwgdmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGdlbmVyYXRlIHJhdGUgdmFsdWVzIGlmIHJhdGVWYWx1ZXMgYXJyYXkgaXMgZW1wdHkuIEl0IGlzIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgcmF0aW5nLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxLlxuICAgICAqIEBzZWUgcmF0ZVZhbHVlc1xuICAgICAqIEBzZWUgcmF0ZU1heFxuICAgICAqIEBzZWUgcmF0ZVN0ZXBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJhdGVNaW4oKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJhdGVNaW5cIiwgMSk7IH1cbiAgICBwdWJsaWMgc2V0IHJhdGVNaW4odmFsOiBudW1iZXIpIHsgXG4gICAgICAgIGlmKHZhbCA+IHRoaXMucmF0ZU1heCAtIHRoaXMucmF0ZVN0ZXApIHZhbCA9IHRoaXMucmF0ZU1heCAtIHRoaXMucmF0ZVN0ZXA7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJhdGVNaW5cIiwgdmFsKTsgXG4gICAgfVxuICAgIC8qKlxuICAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGdlbmVyYXRlIHJhdGUgdmFsdWVzIGlmIHJhdGVWYWx1ZXMgYXJyYXkgaXMgZW1wdHkuIEl0IGlzIHRoZSBsYXN0IHZhbHVlIGluIHRoZSByYXRpbmcuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDUuXG4gICAgKiBAc2VlIHJhdGVWYWx1ZXNcbiAgICAqIEBzZWUgcmF0ZU1pblxuICAgICogQHNlZSByYXRlU3RlcFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmF0ZU1heCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZU1heFwiLCA1KTsgfVxuICAgIHB1YmxpYyBzZXQgcmF0ZU1heCh2YWw6IG51bWJlcikgeyBcbiAgICAgICAgaWYodmFsIDwgdGhpcy5yYXRlTWluICsgdGhpcy5yYXRlU3RlcCkgdmFsID0gdGhpcy5yYXRlTWluICsgdGhpcy5yYXRlU3RlcDtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZU1heFwiLCB2YWwpOyBcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGdlbmVyYXRlIHJhdGUgdmFsdWVzIGlmIHJhdGVWYWx1ZXMgYXJyYXkgaXMgZW1wdHkuIEl0IGlzIHRoZSBzdGVwIHZhbHVlLiBUaGUgbnVtYmVyIG9mIHJhdGUgdmFsdWVzIGFyZSAocmF0ZU1heCAtIHJhdGVNaW4pIC8gcmF0ZVN0ZXAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuXG4gICAgKiBAc2VlIHJhdGVWYWx1ZXNcbiAgICAqIEBzZWUgcmF0ZU1pblxuICAgICogQHNlZSByYXRlTWF4XG4gICAgICovXG4gICAgcHVibGljIGdldCByYXRlU3RlcCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZVN0ZXBcIiwgMSk7IH1cbiAgICBwdWJsaWMgc2V0IHJhdGVTdGVwKHZhbDogbnVtYmVyKSB7IFxuICAgICAgICBpZih2YWwgPD0gMCkgdmFsID0gMTtcbiAgICAgICAgaWYodmFsID4gdGhpcy5yYXRlTWF4IC0gdGhpcy5yYXRlTWluKSB2YWwgPSB0aGlzLnJhdGVNYXggLSB0aGlzLnJhdGVNaW47XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJhdGVTdGVwXCIsIHZhbCk7IFxuICAgIH1cbiAgICBnZXQgdmlzaWJsZVJhdGVWYWx1ZXMoKTogSXRlbVZhbHVlW10ge1xuICAgICAgICBpZiAodGhpcy5yYXRlVmFsdWVzLmxlbmd0aCA+IDApIHJldHVybiB0aGlzLnJhdGVWYWx1ZXM7XG4gICAgICAgIHZhciByZXMgPSBbXTtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5yYXRlTWluO1xuICAgICAgICB3aGlsZSh2YWx1ZSA8PSB0aGlzLnJhdGVNYXggJiYgcmVzLmxlbmd0aCA8IFF1ZXN0aW9uUmF0aW5nTW9kZWwuTWF4aW11bVJhdGVWYWx1ZUNvdW50KSB7XG4gICAgICAgICAgICByZXMucHVzaChuZXcgSXRlbVZhbHVlKHZhbHVlKSk7XG4gICAgICAgICAgICB2YWx1ZSArPSB0aGlzLnJhdGVTdGVwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcInJhdGluZ1wiO1xuICAgIH1cbiAgICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBwdWJsaWMgc3VwcG9ydENvbW1lbnQoKTogYm9vbGVhbiB7IHJldHVybiB0cnVlOyB9XG4gICAgcHVibGljIHN1cHBvcnRPdGhlcigpOiBib29sZWFuIHsgcmV0dXJuIHRydWU7IH1cbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgbWluaW11bSAoZmlyc3QpIGl0ZW0uXG4gICAgICovXG4gICAgcHVibGljIGdldCBtaW5SYXRlRGVzY3JpcHRpb24oKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibWluUmF0ZURlc2NyaXB0aW9uXCIpOyB9XG4gICAgcHVibGljIHNldCBtaW5SYXRlRGVzY3JpcHRpb24odmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJtaW5SYXRlRGVzY3JpcHRpb25cIiwgdmFsKTsgfVxuICAgIGdldCBsb2NNaW5SYXRlRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge3JldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibWluUmF0ZURlc2NyaXB0aW9uXCIpOyB9XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIG1heGltdW0gKGxhc3QpIGl0ZW0uXG4gICAgICovXG4gICAgcHVibGljIGdldCBtYXhSYXRlRGVzY3JpcHRpb24oKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibWF4UmF0ZURlc2NyaXB0aW9uXCIpO31cbiAgICBwdWJsaWMgc2V0IG1heFJhdGVEZXNjcmlwdGlvbih2YWw6IHN0cmluZykgeyB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm1heFJhdGVEZXNjcmlwdGlvblwiLCB2YWwpOyB9XG4gICAgZ2V0IGxvY01heFJhdGVEZXNjcmlwdGlvbigpOiBMb2NhbGl6YWJsZVN0cmluZyB7cmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJtYXhSYXRlRGVzY3JpcHRpb25cIik7IH07XG59XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwicmF0aW5nXCIsIFtcImhhc0NvbW1lbnQ6Ym9vbGVhblwiLCB7IG5hbWU6IFwicmF0ZVZhbHVlczppdGVtdmFsdWVzXCIsIG9uR2V0VmFsdWU6IGZ1bmN0aW9uIChvYmo6IGFueSkgeyByZXR1cm4gSXRlbVZhbHVlLmdldERhdGEob2JqLnJhdGVWYWx1ZXMpOyB9LCBvblNldFZhbHVlOiBmdW5jdGlvbiAob2JqOiBhbnksIHZhbHVlOiBhbnkpIHsgb2JqLnJhdGVWYWx1ZXMgPSB2YWx1ZTsgfX0sXG4gICAge25hbWU6IFwicmF0ZU1pbjpudW1iZXJcIiwgZGVmYXVsdDogMX0sIHtuYW1lOiBcInJhdGVNYXg6bnVtYmVyXCIsIGRlZmF1bHQ6IDV9LCB7bmFtZTogXCJyYXRlU3RlcDpudW1iZXJcIiwgZGVmYXVsdDogMX0sXG4gICAge25hbWU6IFwibWluUmF0ZURlc2NyaXB0aW9uXCIsIGFsdGVybmF0aXZlTmFtZTogXCJtaW5pbnVtUmF0ZURlc2NyaXB0aW9uXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NNaW5SYXRlRGVzY3JpcHRpb25cIn0sXG4gICAge25hbWU6IFwibWF4UmF0ZURlc2NyaXB0aW9uXCIsIGFsdGVybmF0aXZlTmFtZTogXCJtYXhpbXVtUmF0ZURlc2NyaXB0aW9uXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NNYXhSYXRlRGVzY3JpcHRpb25cIn1dLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgUXVlc3Rpb25SYXRpbmdNb2RlbChcIlwiKTsgfSwgXCJxdWVzdGlvblwiKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicmF0aW5nXCIsIChuYW1lKSA9PiB7IHJldHVybiBuZXcgUXVlc3Rpb25SYXRpbmdNb2RlbChuYW1lKTsgfSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fcmF0aW5nLnRzIiwiaW1wb3J0IHtRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQge1F1ZXN0aW9ufSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHtMb2NhbGl6YWJsZVN0cmluZ30gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhbiBpbnB1dCB0ZXh0IHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25UZXh0TW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihuYW1lKTtcbiAgICAgICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInBsYWNlSG9sZGVyXCIsIHRoaXMpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBpbnB1dCB0eXBlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW5wdXRUeXBlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbnB1dFR5cGVcIiwgXCJ0ZXh0XCIpOyB9XG4gICAgcHVibGljIHNldCBpbnB1dFR5cGUodmFsOiBzdHJpbmcpIHtcbiAgICAgICAgdmFsID0gdmFsLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmKHZhbCA9PSBcImRhdGV0aW1lX2xvY2FsXCIpIHZhbCA9IFwiZGF0ZXRpbWUtbG9jYWxcIjtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW5wdXRUeXBlXCIsIHZhbC50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHRleHQgaW5wdXQgc2l6ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2l6ZVwiLCAyNSk7IH1cbiAgICBwdWJsaWMgc2V0IHNpemUodmFsOiBudW1iZXIpIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2l6ZVwiLCB2YWwpOyB9XG4gICAgaXNFbXB0eSgpOiBib29sZWFuIHsgIHJldHVybiBzdXBlci5pc0VtcHR5KCkgfHwgdGhpcy52YWx1ZSA9PT0gXCJcIjsgfVxuICAgIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIC8qKlxuICAgICAqIFRoZSBpbnB1dCBwbGFjZSBob2xkZXIuXG4gICAgICovXG4gICAgcHVibGljIGdldCBwbGFjZUhvbGRlcigpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwbGFjZUhvbGRlclwiKTsgfVxuICAgIHB1YmxpYyBzZXQgcGxhY2VIb2xkZXIodmFsOiBzdHJpbmcpIHsgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwbGFjZUhvbGRlclwiLCB2YWwpOyB9XG4gICAgZ2V0IGxvY1BsYWNlSG9sZGVyKCk6IExvY2FsaXphYmxlU3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwbGFjZUhvbGRlclwiKTsgfVxuICAgIHByb3RlY3RlZCBzZXROZXdWYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgICAgIG5ld1ZhbHVlID0gdGhpcy5jb3JyZWN0VmFsdWVUeXBlKG5ld1ZhbHVlKTtcbiAgICAgICAgc3VwZXIuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgY29ycmVjdFZhbHVlVHlwZShuZXdWYWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgaWYgKCFuZXdWYWx1ZSkgcmV0dXJuIG5ld1ZhbHVlO1xuICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT0gXCJudW1iZXJcIiB8fCB0aGlzLmlucHV0VHlwZSA9PSBcInJhbmdlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzTnVtYmVyKG5ld1ZhbHVlKSA/IHBhcnNlRmxvYXQobmV3VmFsdWUpIDogXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgfVxuICAgIHByaXZhdGUgaXNOdW1iZXIodmFsdWUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KHZhbHVlKSkgJiYgaXNGaW5pdGUodmFsdWUpO1xuICAgIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcInRleHRcIiwgW3sgbmFtZTogXCJpbnB1dFR5cGVcIiwgZGVmYXVsdDogXCJ0ZXh0XCIsIGNob2ljZXM6IFtcImNvbG9yXCIsIFwiZGF0ZVwiLCBcImRhdGV0aW1lXCIsIFwiZGF0ZXRpbWUtbG9jYWxcIiwgXCJlbWFpbFwiLCBcIm1vbnRoXCIsIFwibnVtYmVyXCIsIFwicGFzc3dvcmRcIiwgXCJyYW5nZVwiLCBcInRlbFwiLCBcInRleHRcIiwgXCJ0aW1lXCIsIFwidXJsXCIsIFwid2Vla1wiXSB9LFxuICAgIHsgbmFtZTogXCJzaXplOm51bWJlclwiLCBkZWZhdWx0OiAyNSB9LCB7bmFtZTogXCJwbGFjZUhvbGRlclwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGxhY2VIb2xkZXJcIn1dLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgUXVlc3Rpb25UZXh0TW9kZWwoXCJcIik7IH0sIFwicXVlc3Rpb25cIik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwidGV4dFwiLCAobmFtZSkgPT4geyByZXR1cm4gbmV3IFF1ZXN0aW9uVGV4dE1vZGVsKG5hbWUpOyB9KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl90ZXh0LnRzIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtSZWFjdFN1cnZleUVsZW1lbnQsIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2V9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQge1F1ZXN0aW9uQm9vbGVhbk1vZGVsfSBmcm9tIFwiLi4vcXVlc3Rpb25fYm9vbGVhblwiO1xuaW1wb3J0IHtSZWFjdFF1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmZhY3RvcnlcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uQm9vbGVhbiBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRlID0geyB2YWx1ZTogdGhpcy5xdWVzdGlvbi5jaGVja2VkVmFsdWUgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVPbkNoYW5nZSA9IHRoaXMuaGFuZGxlT25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB9XG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlci5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3ZhbHVlIDogIHRoaXMucXVlc3Rpb24uY2hlY2tlZFZhbHVlfSk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25Cb29sZWFuTW9kZWwgeyByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25Cb29sZWFuTW9kZWw7IH1cbiAgICBoYW5kbGVPbkNoYW5nZShldmVudCkge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLmNoZWNrZWRWYWx1ZSA9IGV2ZW50LnRhcmdldC5jaGVja2VkO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmFsdWU6IHRoaXMucXVlc3Rpb24uY2hlY2tlZFZhbHVlIH0pO1xuICAgIH1cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVJbmRldGVybWluYXRlKCk7XG4gICAgfVxuICAgIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVJbmRldGVybWluYXRlKCk7XG4gICAgfVxuICAgIHByaXZhdGUgdXBkYXRlSW5kZXRlcm1pbmF0ZSgpIHtcbiAgICAgICAgaWYoIXRoaXMucXVlc3Rpb24pIHJldHVybjtcbiAgICAgICAgdmFyIGVsID0gdGhpcy5yZWZzW1wiY2hlY2tcIl07XG4gICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgZWxbXCJpbmRldGVybWluYXRlXCJdID0gdGhpcy5xdWVzdGlvbi5pc0luZGV0ZXJtaW5hdGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGNzc0NsYXNzZXMgPSB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgICAgIHZhciB0ZXh0ID0gdGhpcy5yZW5kZXJMb2NTdHJpbmcodGhpcy5xdWVzdGlvbi5sb2NEaXNwbGF5TGFiZWwpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGZvcm0gY2xhc3NOYW1lPXtjc3NDbGFzc2VzLml0ZW19PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9e2Nzc0NsYXNzZXMuaXRlbX0+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCByZWY9XCJjaGVja1wiIHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPXt0aGlzLnF1ZXN0aW9uLmNoZWNrZWRWYWx1ZX0gaWQ9e3RoaXMucXVlc3Rpb24uaW5wdXRJZH0gIGRpc2FibGVkPXt0aGlzLmlzRGlzcGxheU1vZGV9IGNoZWNrZWQ9e3RoaXMucXVlc3Rpb24uY2hlY2tlZFZhbHVlfSBvbkNoYW5nZT17dGhpcy5oYW5kbGVPbkNoYW5nZX0gYXJpYS1sYWJlbD17dGhpcy5xdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9Lz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiY2hlY2tib3gtbWF0ZXJpYWxcIj48c3BhbiBjbGFzc05hbWU9XCJjaGVja1wiPjwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt0ZXh0fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9mb3JtPik7XG4gICAgfVxufVxuXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiYm9vbGVhblwiLCAocHJvcHMpID0+IHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbkJvb2xlYW4sIHByb3BzKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25ib29sZWFuLnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7UmVhY3RTdXJ2ZXlFbGVtZW50LCBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHtTdXJ2ZXlRdWVzdGlvbkNvbW1lbnRJdGVtfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uY29tbWVudFwiO1xuaW1wb3J0IHtRdWVzdGlvbkNoZWNrYm94TW9kZWx9IGZyb20gXCIuLi9xdWVzdGlvbl9jaGVja2JveFwiO1xuaW1wb3J0IHtJdGVtVmFsdWV9IGZyb20gXCIuLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7UmVhY3RRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkNoZWNrYm94IGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7IGNob2ljZXNDaGFuZ2VkOiAwIH07XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy5xdWVzdGlvbi5jaG9pY2VzQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5zdGF0ZS5jaG9pY2VzQ2hhbmdlZCA9IHNlbGYuc3RhdGUuY2hvaWNlc0NoYW5nZWQgKyAxO1xuICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZShzZWxmLnN0YXRlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCB7IHJldHVybiB0aGlzLnF1ZXN0aW9uQmFzZSBhcyBRdWVzdGlvbkNoZWNrYm94TW9kZWw7IH1cbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICBpZiAoIXRoaXMucXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgY3NzQ2xhc3NlcyA9IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxmb3JtIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5yb290fT5cbiAgICAgICAgICAgICAgICB7dGhpcy5nZXRJdGVtcyhjc3NDbGFzc2VzKSB9XG4gICAgICAgICAgICA8L2Zvcm0+KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldEl0ZW1zKGNzc0NsYXNzZXM6IGFueSk6IEFycmF5PGFueT4ge1xuICAgICAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXNbaV07XG4gICAgICAgICAgICB2YXIga2V5ID0gXCJpdGVtXCIgKyBpO1xuICAgICAgICAgICAgaXRlbXMucHVzaCh0aGlzLnJlbmRlckl0ZW0oa2V5LCBpdGVtLCBpID09IDAsIGNzc0NsYXNzZXMpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXQgdGV4dFN0eWxlKCk6IGFueSB7IHJldHVybiBudWxsOyB9XG4gICAgcHJvdGVjdGVkIHJlbmRlckl0ZW0oa2V5OiBzdHJpbmcsIGl0ZW06IGFueSwgaXNGaXJzdDogYm9vbGVhbiwgY3NzQ2xhc3NlczogYW55KTogSlNYLkVsZW1lbnQge1xuICAgICAgICByZXR1cm4gPFN1cnZleVF1ZXN0aW9uQ2hlY2tib3hJdGVtIGtleT17a2V5fSBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn0gY3NzQ2xhc3Nlcz17Y3NzQ2xhc3Nlc30gaXNEaXNwbGF5TW9kZT17dGhpcy5pc0Rpc3BsYXlNb2RlfSBpdGVtPXtpdGVtfSB0ZXh0U3R5bGU9e3RoaXMudGV4dFN0eWxlfSBpc0ZpcnN0PXtpc0ZpcnN0fSAvPjtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25DaGVja2JveEl0ZW0gZXh0ZW5kcyBSZWFjdFN1cnZleUVsZW1lbnQge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25DaGVja2JveE1vZGVsO1xuICAgIHByb3RlY3RlZCBpdGVtOiBJdGVtVmFsdWU7XG4gICAgcHJvdGVjdGVkIHRleHRTdHlsZTogYW55O1xuICAgIHByb3RlY3RlZCBpc0ZpcnN0OiBhbnk7XG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuaXRlbSA9IHByb3BzLml0ZW07XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSBwcm9wcy5xdWVzdGlvbjtcbiAgICAgICAgdGhpcy50ZXh0U3R5bGUgPSBwcm9wcy50ZXh0U3R5bGU7XG4gICAgICAgIHRoaXMuaXNGaXJzdCA9IHByb3BzLmlzRmlyc3Q7XG4gICAgICAgIHRoaXMuaGFuZGxlT25DaGFuZ2UgPSB0aGlzLmhhbmRsZU9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIHB1YmxpYyBzaG91bGRDb21wb25lbnRVcGRhdGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5xdWVzdGlvbi5jdXN0b21XaWRnZXQgfHwgISF0aGlzLnF1ZXN0aW9uLmN1c3RvbVdpZGdldERhdGEuaXNOZWVkUmVuZGVyIHx8ICEhdGhpcy5xdWVzdGlvbi5jdXN0b21XaWRnZXQud2lkZ2V0SnNvbi5yZW5kZXI7XG4gICAgfVxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzOiBhbnkpIHtcbiAgICAgICAgc3VwZXIuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpO1xuICAgICAgICB0aGlzLml0ZW0gPSBuZXh0UHJvcHMuaXRlbTtcbiAgICAgICAgdGhpcy50ZXh0U3R5bGUgPSBuZXh0UHJvcHMudGV4dFN0eWxlO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gbmV4dFByb3BzLnF1ZXN0aW9uO1xuICAgICAgICB0aGlzLmlzRmlyc3QgPSBuZXh0UHJvcHMuaXNGaXJzdDtcbiAgICB9XG4gICAgaGFuZGxlT25DaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy5xdWVzdGlvbi52YWx1ZTtcbiAgICAgICAgaWYgKCFuZXdWYWx1ZSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaW5kZXggPSBuZXdWYWx1ZS5pbmRleE9mKHRoaXMuaXRlbS52YWx1ZSk7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgICAgICAgIG5ld1ZhbHVlLnB1c2godGhpcy5pdGVtLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgbmV3VmFsdWUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnF1ZXN0aW9uLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdGhpcy5xdWVzdGlvbi52YWx1ZSB9KTtcbiAgICB9XG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgaWYgKCF0aGlzLml0ZW0gfHwgIXRoaXMucXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgaXRlbVdpZHRoID0gdGhpcy5xdWVzdGlvbi5jb2xDb3VudCA+IDAgPyAoMTAwIC8gdGhpcy5xdWVzdGlvbi5jb2xDb3VudCkgKyBcIiVcIiA6IFwiXCI7XG4gICAgICAgIHZhciBtYXJnaW5SaWdodCA9IHRoaXMucXVlc3Rpb24uY29sQ291bnQgPT0gMCA/IFwiNXB4XCIgOiBcIjBweFwiO1xuICAgICAgICB2YXIgZGl2U3R5bGUgPSB7IG1hcmdpblJpZ2h0OiBtYXJnaW5SaWdodCwgZGlzcGxheTogJ2lubGluZS1ibG9jaycgfTtcbiAgICAgICAgaWYgKGl0ZW1XaWR0aCkge1xuICAgICAgICAgICAgZGl2U3R5bGVbXCJ3aWR0aFwiXSA9IGl0ZW1XaWR0aDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaXNDaGVja2VkID0gKHRoaXMucXVlc3Rpb24udmFsdWUgJiYgdGhpcy5xdWVzdGlvbi52YWx1ZS5pbmRleE9mKHRoaXMuaXRlbS52YWx1ZSkgPiAtMSkgfHwgZmFsc2U7XG4gICAgICAgIHZhciBvdGhlckl0ZW0gPSAodGhpcy5pdGVtLnZhbHVlID09PSB0aGlzLnF1ZXN0aW9uLm90aGVySXRlbS52YWx1ZSAmJiBpc0NoZWNrZWQpID8gdGhpcy5yZW5kZXJPdGhlcigpIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQ2hlY2tib3goaXNDaGVja2VkLCBkaXZTdHlsZSwgb3RoZXJJdGVtKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldCBpbnB1dFN0eWxlKCk6IGFueSB7IHJldHVybiB7IG1hcmdpblJpZ2h0OiBcIjNweFwiIH07IH1cbiAgICBwcm90ZWN0ZWQgcmVuZGVyQ2hlY2tib3goaXNDaGVja2VkOiBib29sZWFuLCBkaXZTdHlsZTogYW55LCBvdGhlckl0ZW06IEpTWC5FbGVtZW50KTogSlNYLkVsZW1lbnQge1xuICAgICAgICB2YXIgaWQgPSB0aGlzLmlzRmlyc3QgPyB0aGlzLnF1ZXN0aW9uLmlucHV0SWQgOiBudWxsO1xuICAgICAgICB2YXIgdGV4dCA9IHRoaXMucmVuZGVyTG9jU3RyaW5nKHRoaXMuaXRlbS5sb2NUZXh0KTtcbiAgICAgICAgbGV0IGl0ZW1DbGFzcyA9IHRoaXMuY3NzQ2xhc3Nlcy5pdGVtICsgKHRoaXMucXVlc3Rpb24uY29sQ291bnQgPT09IDAgPyBcIiBzdl9xX2NoZWNrYm94X2lubGluZVwiOiBcIlwiKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtpdGVtQ2xhc3N9IHN0eWxlPXtkaXZTdHlsZX0+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT17dGhpcy5jc3NDbGFzc2VzLmxhYmVsfT5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPXt0aGlzLml0ZW0udmFsdWV9IGlkPXtpZH0gc3R5bGU9e3RoaXMuaW5wdXRTdHlsZX0gZGlzYWJsZWQ9e3RoaXMuaXNEaXNwbGF5TW9kZX0gY2hlY2tlZD17aXNDaGVja2VkfSBvbkNoYW5nZT17dGhpcy5oYW5kbGVPbkNoYW5nZX0gYXJpYS1sYWJlbD17dGhpcy5xdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9Lz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiY2hlY2tib3gtbWF0ZXJpYWxcIj48c3BhbiBjbGFzc05hbWU9XCJjaGVja1wiPjwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt0ZXh0fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIHtvdGhlckl0ZW19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHJlbmRlck90aGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17dGhpcy5jc3NDbGFzc2VzLm90aGVyfT48U3VydmV5UXVlc3Rpb25Db21tZW50SXRlbSAgcXVlc3Rpb249e3RoaXMucXVlc3Rpb259IG90aGVyQ3NzPXt0aGlzLmNzc0NsYXNzZXMub3RoZXJ9IGNzc0NsYXNzZXM9e3RoaXMuY3NzQ2xhc3Nlc30gaXNEaXNwbGF5TW9kZT17dGhpcy5pc0Rpc3BsYXlNb2RlfS8+PC9kaXY+KTtcbiAgICB9XG59XG5cblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJjaGVja2JveFwiLCAocHJvcHMpID0+IHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbkNoZWNrYm94LCBwcm9wcyk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uY2hlY2tib3gudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHtRdWVzdGlvbkRyb3Bkb3duTW9kZWx9IGZyb20gXCIuLi9xdWVzdGlvbl9kcm9wZG93blwiO1xuaW1wb3J0IHtTdXJ2ZXlRdWVzdGlvbkNvbW1lbnRJdGVtfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uY29tbWVudFwiO1xuaW1wb3J0IHtSZWFjdFF1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7YnJvd3NlciwgY29tcGFyZVZlcnNpb25zLCBpc01vYmlsZX0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkRyb3Bkb3duIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7IHZhbHVlOiB0aGlzLmdldFN0YXRlVmFsdWUoKSwgY2hvaWNlc0NoYW5nZWQ6IDAgfTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLmNob2ljZXNDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnN0YXRlLmNob2ljZXNDaGFuZ2VkID0gc2VsZi5zdGF0ZS5jaG9pY2VzQ2hhbmdlZCArIDE7XG4gICAgICAgICAgICBzZWxmLnN0YXRlLnZhbHVlID0gc2VsZi5xdWVzdGlvbi52YWx1ZTtcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoc2VsZi5zdGF0ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlT25DaGFuZ2UgPSB0aGlzLmhhbmRsZU9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25Ecm9wZG93bk1vZGVsIHsgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFF1ZXN0aW9uRHJvcGRvd25Nb2RlbDsgfVxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzOiBhbnkpIHtcbiAgICAgICAgc3VwZXIuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHt2YWx1ZTogdGhpcy5nZXRTdGF0ZVZhbHVlKCl9KTtcbiAgICB9XG4gICAgaGFuZGxlT25DaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbi52YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHZhbHVlOiB0aGlzLmdldFN0YXRlVmFsdWUoKSB9KTtcbiAgICB9XG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGNzc0NsYXNzZXMgPSB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgICAgIHZhciBjb21tZW50ID0gdGhpcy5xdWVzdGlvbi52YWx1ZSA9PT0gdGhpcy5xdWVzdGlvbi5vdGhlckl0ZW0udmFsdWUgPyB0aGlzLnJlbmRlck90aGVyKGNzc0NsYXNzZXMpIDogbnVsbDtcbiAgICAgICAgdmFyIHNlbGVjdCA9IHRoaXMucmVuZGVyU2VsZWN0KGNzc0NsYXNzZXMpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMucm9vdH0+XG4gICAgICAgICAgICB7c2VsZWN0fVxuICAgICAgICAgICAge2NvbW1lbnR9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHJlbmRlclNlbGVjdChjc3NDbGFzc2VzOiBhbnkpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIGlmICh0aGlzLmlzRGlzcGxheU1vZGUpIHsgXG4gICAgICAgICAgICByZXR1cm4gKDxkaXYgaWQ9e3RoaXMucXVlc3Rpb24uaW5wdXRJZH0gY2xhc3NOYW1lPXtjc3NDbGFzc2VzLmNvbnRyb2x9Pnt0aGlzLnF1ZXN0aW9uLmRpc3BsYXlWYWx1ZX08L2Rpdj4pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvcHRpb25zID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzW2ldO1xuICAgICAgICAgICAgdmFyIGtleSA9IFwiaXRlbVwiICsgaTtcbiAgICAgICAgICAgIHZhciBvcHRpb24gPSA8b3B0aW9uIGtleT17a2V5fSB2YWx1ZT17aXRlbS52YWx1ZX0+e2l0ZW0udGV4dH08L29wdGlvbj47XG4gICAgICAgICAgICBvcHRpb25zLnB1c2gob3B0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvbkNoYW5nZSA9IG51bGw7XG4gICAgICAgIGlmIChicm93c2VyLm1zaWUgfHwgKGJyb3dzZXIuZmlyZWZveCAmJiBjb21wYXJlVmVyc2lvbnMoYnJvd3Nlci52ZXJzaW9uLCAnNTEnKSA8IDApIHx8IChicm93c2VyLmZpcmVmb3ggJiYgaXNNb2JpbGUoKSkpIHtcbiAgICAgICAgICAgIG9uQ2hhbmdlID0gdGhpcy5oYW5kbGVPbkNoYW5nZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHNlbGVjdCBpZD17dGhpcy5xdWVzdGlvbi5pbnB1dElkfSBjbGFzc05hbWU9e2Nzc0NsYXNzZXMuY29udHJvbH0gdmFsdWU9e3RoaXMuc3RhdGUudmFsdWV9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gb25JbnB1dD17dGhpcy5oYW5kbGVPbkNoYW5nZX0gYXJpYS1sYWJlbD17dGhpcy5xdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9PlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPnt0aGlzLnF1ZXN0aW9uLm9wdGlvbnNDYXB0aW9ufTwvb3B0aW9uPlxuICAgICAgICAgICAge29wdGlvbnN9XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHJlbmRlck90aGVyKGNzc0NsYXNzZXM6IGFueSk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgdmFyIHN0eWxlID0geyBtYXJnaW5Ub3A6IFwiM3B4XCIgfTtcbiAgICAgICAgcmV0dXJuIDxkaXYgc3R5bGU9e3N0eWxlfT48U3VydmV5UXVlc3Rpb25Db21tZW50SXRlbSBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn0gb3RoZXJDc3M9e2Nzc0NsYXNzZXMub3RoZXJ9IGNzc0NsYXNzZXM9e2Nzc0NsYXNzZXN9IGlzRGlzcGxheU1vZGU9e3RoaXMuaXNEaXNwbGF5TW9kZX0vPjwvZGl2PjtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRTdGF0ZVZhbHVlKCk6IGFueSB7IHJldHVybiAhdGhpcy5xdWVzdGlvbi5pc0VtcHR5KCkgPyB0aGlzLnF1ZXN0aW9uLnZhbHVlOiAnJzsgfVxufVxuXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiZHJvcGRvd25cIiwgKHByb3BzKSA9PiB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3VydmV5UXVlc3Rpb25Ecm9wZG93biwgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmRyb3Bkb3duLnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7SGVscGVyc30gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB7QmFzZX0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7U3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcbmltcG9ydCB7UXVlc3Rpb25FbXB0eU1vZGVsfSBmcm9tIFwiLi4vcXVlc3Rpb25fZW1wdHlcIjtcbmltcG9ydCB7UmVhY3RRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5cblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uRW1wdHkgZXh0ZW5kcyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHsgdmFsdWU6IHRoaXMucXVlc3Rpb24udmFsdWUgfTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbkVtcHR5TW9kZWwgeyByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25FbXB0eU1vZGVsOyB9XG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIDxkaXY+PC9kaXY+O1xuICAgIH1cbn1cblxuUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImVtcHR5XCIsIChwcm9wcykgPT4ge1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uRW1wdHksIHByb3BzKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25lbXB0eS50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0hlbHBlcnN9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQge0Jhc2V9IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQge1N1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2V9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQge1F1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsfSBmcm9tIFwiLi4vcXVlc3Rpb25fZXhwcmVzc2lvblwiO1xuaW1wb3J0IHtSZWFjdFF1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmZhY3RvcnlcIjtcblxuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25FeHByZXNzaW9uIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7IHZhbHVlOiB0aGlzLnF1ZXN0aW9uLnZhbHVlIH07XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25FeHByZXNzaW9uTW9kZWwgeyByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25FeHByZXNzaW9uTW9kZWw7IH1cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wczogYW55KSB7XG4gICAgICAgIHN1cGVyLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHZhbHVlOiB0aGlzLnF1ZXN0aW9uLnZhbHVlfSk7XG4gICAgfVxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIGlmICghdGhpcy5xdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBjc3NDbGFzc2VzID0gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgICAgICByZXR1cm4gKDxkaXYgaWQ9e3RoaXMucXVlc3Rpb24uaW5wdXRJZH0gY2xhc3NOYW1lPXtjc3NDbGFzc2VzLnJvb3R9Pnt0aGlzLnF1ZXN0aW9uLmRpc3BsYXlWYWx1ZX08L2Rpdj4pO1xuICAgIH1cbn1cblxuUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImV4cHJlc3Npb25cIiwgKHByb3BzKSA9PiB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3VydmV5UXVlc3Rpb25FeHByZXNzaW9uLCBwcm9wcyk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uZXhwcmVzc2lvbi50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1N1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2V9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQge1F1ZXN0aW9uRmlsZU1vZGVsfSBmcm9tIFwiLi4vcXVlc3Rpb25fZmlsZVwiO1xuaW1wb3J0IHtSZWFjdFF1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmZhY3RvcnlcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uRmlsZSBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRlID0geyBmaWxlTG9hZGVkOiAwIH07XG4gICAgICAgIHRoaXMuaGFuZGxlT25DaGFuZ2UgPSB0aGlzLmhhbmRsZU9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25GaWxlTW9kZWwgeyByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25GaWxlTW9kZWw7IH1cbiAgICBoYW5kbGVPbkNoYW5nZShldmVudCkge1xuICAgICAgICB2YXIgc3JjID0gZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnNyY0VsZW1lbnQ7XG4gICAgICAgIGlmICghd2luZG93W1wiRmlsZVJlYWRlclwiXSkgcmV0dXJuO1xuICAgICAgICBpZiAoIXNyYyB8fCAhc3JjLmZpbGVzIHx8IHNyYy5maWxlcy5sZW5ndGggPCAxKSByZXR1cm47XG4gICAgICAgIHRoaXMucXVlc3Rpb24ubG9hZEZpbGUoc3JjLmZpbGVzWzBdKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGZpbGVMb2FkZWQ6IHRoaXMuc3RhdGUuZmlsZUxvYWRlZCArIDEgfSk7XG4gICAgfVxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIGlmICghdGhpcy5xdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBpbWcgPSB0aGlzLnJlbmRlckltYWdlKCk7XG4gICAgICAgIHZhciBmaWxlSW5wdXQgPSBudWxsO1xuICAgICAgICBpZiAoIXRoaXMuaXNEaXNwbGF5TW9kZSkge1xuICAgICAgICAgICAgZmlsZUlucHV0ID0gPGlucHV0IGlkPXt0aGlzLnF1ZXN0aW9uLmlucHV0SWR9IHR5cGU9XCJmaWxlXCIgb25DaGFuZ2U9e3RoaXMuaGFuZGxlT25DaGFuZ2V9IGFyaWEtbGFiZWw9e3RoaXMucXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sfS8+O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIHtmaWxlSW5wdXR9XG4gICAgICAgICAgICAgICAge2ltZ31cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgcmVuZGVySW1hZ2UoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICBpZiAoIXRoaXMucXVlc3Rpb24ucHJldmlld1ZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuICg8ZGl2PiAgPGltZyBzcmM9e3RoaXMucXVlc3Rpb24ucHJldmlld1ZhbHVlfSBoZWlnaHQ9e3RoaXMucXVlc3Rpb24uaW1hZ2VIZWlnaHR9IHdpZHRoPXt0aGlzLnF1ZXN0aW9uLmltYWdlV2lkdGh9IC8+PC9kaXY+KTtcbiAgICB9XG59XG5cblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJmaWxlXCIsIChwcm9wcykgPT4ge1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uRmlsZSwgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmZpbGUudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHtRdWVzdGlvbkh0bWxNb2RlbH0gZnJvbSBcIi4uL3F1ZXN0aW9uX2h0bWxcIjtcbmltcG9ydCB7UmVhY3RRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkh0bWwgZXh0ZW5kcyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbkh0bWxNb2RlbCB7IHJldHVybiB0aGlzLnF1ZXN0aW9uQmFzZSBhcyBRdWVzdGlvbkh0bWxNb2RlbDsgfVxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIGlmICghdGhpcy5xdWVzdGlvbiB8fCAhdGhpcy5xdWVzdGlvbi5odG1sKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGh0bWxWYWx1ZSA9IHsgX19odG1sOiB0aGlzLnF1ZXN0aW9uLnByb2Nlc3NlZEh0bWwgfTtcbiAgICAgICAgcmV0dXJuICg8ZGl2IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXtodG1sVmFsdWV9IC8+ICk7XG4gICAgfVxufVxuXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiaHRtbFwiLCAocHJvcHMpID0+IHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbkh0bWwsIHByb3BzKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25odG1sLnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7UmVhY3RTdXJ2ZXlFbGVtZW50LCBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHtRdWVzdGlvbk1hdHJpeE1vZGVsfSBmcm9tIFwiLi4vcXVlc3Rpb25fbWF0cml4XCI7XG5pbXBvcnQge01hdHJpeFJvd01vZGVsfSBmcm9tIFwiLi4vcXVlc3Rpb25fbWF0cml4XCI7XG5pbXBvcnQge1JlYWN0UXVlc3Rpb25GYWN0b3J5fSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHtJdGVtVmFsdWV9IGZyb20gXCIuLi9pdGVtdmFsdWVcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uTWF0cml4IGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25NYXRyaXhNb2RlbCB7IHJldHVybiB0aGlzLnF1ZXN0aW9uQmFzZSBhcyBRdWVzdGlvbk1hdHJpeE1vZGVsOyB9XG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGNzc0NsYXNzZXMgPSB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgICAgIHZhciBmaXJzdFRIID0gdGhpcy5xdWVzdGlvbi5oYXNSb3dzID8gPHRkPjwvdGQ+IDogbnVsbDtcbiAgICAgICAgdmFyIGhlYWRlcnMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLnF1ZXN0aW9uLmNvbHVtbnNbaV07XG4gICAgICAgICAgICB2YXIga2V5ID0gXCJjb2x1bW5cIiArIGk7XG4gICAgICAgICAgICB2YXIgY29sdW1UZXh0ID0gdGhpcy5yZW5kZXJMb2NTdHJpbmcoY29sdW1uLmxvY1RleHQpO1xuICAgICAgICAgICAgaGVhZGVycy5wdXNoKDx0aCBrZXk9e2tleX0+e2NvbHVtVGV4dH08L3RoPik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJvd3MgPSBbXTtcbiAgICAgICAgdmFyIHZpc2libGVSb3dzID0gdGhpcy5xdWVzdGlvbi52aXNpYmxlUm93cztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHJvdyA9IHZpc2libGVSb3dzW2ldO1xuICAgICAgICAgICAgdmFyIGtleSA9IFwicm93XCIgKyBpO1xuICAgICAgICAgICAgcm93cy5wdXNoKDxTdXJ2ZXlRdWVzdGlvbk1hdHJpeFJvdyBrZXk9e2tleX0gcXVlc3Rpb249e3RoaXMucXVlc3Rpb259IGNzc0NsYXNzZXM9e2Nzc0NsYXNzZXN9IGlzRGlzcGxheU1vZGU9e3RoaXMuaXNEaXNwbGF5TW9kZX0gcm93PXtyb3d9IGlzRmlyc3Q9e2kgPT0gMH0gLz4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8dGFibGUgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLnJvb3R9PlxuICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAge2ZpcnN0VEh9XG4gICAgICAgICAgICAgICAgICAgICAgICB7aGVhZGVyc31cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAge3Jvd3N9XG4gICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbk1hdHJpeFJvdyBleHRlbmRzIFJlYWN0U3VydmV5RWxlbWVudCB7XG4gICAgcHJpdmF0ZSBxdWVzdGlvbjogUXVlc3Rpb25NYXRyaXhNb2RlbDtcbiAgICBwcml2YXRlIHJvdzogTWF0cml4Um93TW9kZWw7XG4gICAgcHJpdmF0ZSBpc0ZpcnN0OiBib29sZWFuO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gcHJvcHMucXVlc3Rpb247XG4gICAgICAgIHRoaXMucm93ID0gcHJvcHMucm93O1xuICAgICAgICB0aGlzLmlzRmlyc3QgPSBwcm9wcy5pc0ZpcnN0O1xuICAgICAgICB0aGlzLmhhbmRsZU9uQ2hhbmdlID0gdGhpcy5oYW5kbGVPbkNoYW5nZS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICBoYW5kbGVPbkNoYW5nZShldmVudCkge1xuICAgICAgICB0aGlzLnJvdy52YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHZhbHVlOiB0aGlzLnJvdy52YWx1ZSB9KTtcbiAgICB9XG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlci5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyk7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSBuZXh0UHJvcHMucXVlc3Rpb247XG4gICAgICAgIHRoaXMucm93ID0gbmV4dFByb3BzLnJvdztcbiAgICAgICAgdGhpcy5pc0ZpcnN0ID0gbmV4dFByb3BzLmlzRmlyc3Q7XG4gICAgfVxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIGlmICghdGhpcy5yb3cpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgZmlyc3RURCA9IG51bGw7XG4gICAgICAgIGlmKHRoaXMucXVlc3Rpb24uaGFzUm93cykge1xuICAgICAgICAgICAgdmFyIHJvd1RleHQgPSB0aGlzLnJlbmRlckxvY1N0cmluZyh0aGlzLnJvdy5sb2NUZXh0KTtcbiAgICAgICAgICAgIGZpcnN0VEQgPSA8dGQ+e3Jvd1RleHR9PC90ZD47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRkcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucXVlc3Rpb24uY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMucXVlc3Rpb24uY29sdW1uc1tpXTtcbiAgICAgICAgICAgIHZhciBrZXkgPSBcInZhbHVlXCIgKyBpO1xuICAgICAgICAgICAgdmFyIGlzQ2hlY2tlZCA9IHRoaXMucm93LnZhbHVlID09IGNvbHVtbi52YWx1ZTtcbiAgICAgICAgICAgIHZhciBpbnB1dElkID0gdGhpcy5pc0ZpcnN0ICYmIGkgPT0gMCA/IHRoaXMucXVlc3Rpb24uaW5wdXRJZCA6IG51bGw7XG4gICAgICAgICAgICB2YXIgdGQgPVxuICAgICAgICAgICAgICAgIDx0ZCBrZXk9e2tleX0+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9e3RoaXMuY3NzQ2xhc3Nlcy5sYWJlbH0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9e2lucHV0SWR9IHR5cGU9XCJyYWRpb1wiIGNsYXNzTmFtZT17dGhpcy5jc3NDbGFzc2VzLml0ZW1WYWx1ZX0gbmFtZT17dGhpcy5yb3cuZnVsbE5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvbHVtbi52YWx1ZX0gZGlzYWJsZWQ9e3RoaXMuaXNEaXNwbGF5TW9kZX0gY2hlY2tlZD17aXNDaGVja2VkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmhhbmRsZU9uQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e3RoaXMucXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sfS8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJjaXJjbGVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJjaGVja1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPXt7ICdkaXNwbGF5JzogJ25vbmUnIH19Pnt0aGlzLnF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC90ZD47XG4gICAgICAgICAgICB0ZHMucHVzaCh0ZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICg8dHI+e2ZpcnN0VER9e3Rkc308L3RyPik7XG4gICAgfVxufVxuXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibWF0cml4XCIsIChwcm9wcykgPT4ge1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uTWF0cml4LCBwcm9wcyk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ubWF0cml4LnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7UmVhY3RTdXJ2ZXlFbGVtZW50LCBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHtRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbH0gZnJvbSBcIi4uL3F1ZXN0aW9uX21hdHJpeGR5bmFtaWNcIjtcbmltcG9ydCB7SVN1cnZleUNyZWF0b3IsIFN1cnZleVF1ZXN0aW9uRXJyb3JzfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uXCI7XG5pbXBvcnQge01hdHJpeER5bmFtaWNSb3dNb2RlbH0gZnJvbSBcIi4uL3F1ZXN0aW9uX21hdHJpeGR5bmFtaWNcIjtcbmltcG9ydCB7TWF0cml4RHJvcGRvd25DZWxsfSBmcm9tIFwiLi4vcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25iYXNlXCI7XG5pbXBvcnQge1JlYWN0UXVlc3Rpb25GYWN0b3J5fSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHtTdXJ2ZXlDdXN0b21XaWRnZXR9IGZyb20gXCIuL2N1c3RvbS13aWRnZXRcIjtcbmltcG9ydCB7U3VydmV5UXVlc3Rpb25NYXRyaXhEcm9wZG93bkNlbGx9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25tYXRyaXhkcm9wZG93blwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25NYXRyaXhEeW5hbWljIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydGllcyhwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLmdldFN0YXRlKClcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbCB7IHJldHVybiB0aGlzLnF1ZXN0aW9uQmFzZSBhcyBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbDsgfVxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzOiBhbnkpIHtcbiAgICAgICAgc3VwZXIuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpO1xuICAgICAgICB0aGlzLnNldFByb3BlcnRpZXMobmV4dFByb3BzKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzZXRQcm9wZXJ0aWVzKG5leHRQcm9wczogYW55KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyByb3dDb3VudGVyOiAwIH0pO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLnJvd0NvdW50Q2hhbmdlZENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh0aGlzLmdldFN0YXRlKHRoaXMuc3RhdGUpKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVPblJvd0FkZENsaWNrID0gdGhpcy5oYW5kbGVPblJvd0FkZENsaWNrLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0U3RhdGUocHJldlN0YXRlID0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge3Jvd0NvdW50ZXI6ICFwcmV2U3RhdGUgPyAwIDogcHJldlN0YXRlLnJvd0NvdW50ZXIgKyAxfTtcbiAgICB9XG4gICAgaGFuZGxlT25Sb3dBZGRDbGljayhldmVudCkge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLmFkZFJvdygpO1xuICAgIH1cbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICBpZiAoIXRoaXMucXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgY3NzQ2xhc3NlcyA9IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICAgICAgdmFyIGhlYWRlcnMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLnF1ZXN0aW9uLmNvbHVtbnNbaV07XG4gICAgICAgICAgICB2YXIga2V5ID0gXCJjb2x1bW5cIiArIGk7XG4gICAgICAgICAgICB2YXIgbWluV2lkdGggPSB0aGlzLnF1ZXN0aW9uLmdldENvbHVtbldpZHRoKGNvbHVtbik7XG4gICAgICAgICAgICB2YXIgY29sdW1uU3R5bGUgPSBtaW5XaWR0aCA/IHsgbWluV2lkdGg6IG1pbldpZHRoIH0gOiB7fTtcbiAgICAgICAgICAgIHZhciBjb2x1bW5UaXRsZSA9IHRoaXMucmVuZGVyTG9jU3RyaW5nKGNvbHVtbi5sb2NUaXRsZSk7XG4gICAgICAgICAgICBoZWFkZXJzLnB1c2goPHRoIGtleT17a2V5fSBzdHlsZT17Y29sdW1uU3R5bGV9Pntjb2x1bW5UaXRsZX08L3RoPik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJvd3MgPSBbXTtcbiAgICAgICAgdmFyIHZpc2libGVSb3dzID0gdGhpcy5xdWVzdGlvbi52aXNpYmxlUm93cztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHJvdyA9IHZpc2libGVSb3dzW2ldO1xuICAgICAgICAgICAgcm93cy5wdXNoKDxTdXJ2ZXlRdWVzdGlvbk1hdHJpeER5bmFtaWNSb3cga2V5PXtyb3cuaWR9IHJvdz17cm93fSBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn0gaW5kZXg9e2l9IGNzc0NsYXNzZXM9e2Nzc0NsYXNzZXN9IGlzRGlzcGxheU1vZGU9e3RoaXMuaXNEaXNwbGF5TW9kZX0gY3JlYXRvcj17dGhpcy5jcmVhdG9yfSAvPik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRpdlN0eWxlID0gdGhpcy5xdWVzdGlvbi5ob3Jpem9udGFsU2Nyb2xsID8geyBvdmVyZmxvd1g6ICdzY3JvbGwnIH0gOiB7fTtcbiAgICAgICAgdmFyIGJ0bkRlbGV0ZVREID0gIXRoaXMuaXNEaXNwbGF5TW9kZSA/IDx0ZD48L3RkPiA6IG51bGw7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgIHN0eWxlPXtkaXZTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzc05hbWU9e2Nzc0NsYXNzZXMucm9vdH0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aGVhZGVyc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2J0bkRlbGV0ZVREfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cm93c31cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAge3RoaXMucmVuZGVyQWRkUm93QnV0dG9uKGNzc0NsYXNzZXMpIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgcmVuZGVyQWRkUm93QnV0dG9uKGNzc0NsYXNzZXM6IGFueSk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5TW9kZSB8fCAhdGhpcy5xdWVzdGlvbi5jYW5BZGRSb3cpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gPGlucHV0IGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5idXR0b259IHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXt0aGlzLmhhbmRsZU9uUm93QWRkQ2xpY2t9IHZhbHVlPXt0aGlzLnF1ZXN0aW9uLmFkZFJvd1RleHR9IC8+O1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uTWF0cml4RHluYW1pY1JvdyBleHRlbmRzIFJlYWN0U3VydmV5RWxlbWVudCB7XG4gICAgcHJpdmF0ZSByb3c6IE1hdHJpeER5bmFtaWNSb3dNb2RlbDtcbiAgICBwcml2YXRlIHF1ZXN0aW9uOiBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbDtcbiAgICBwcml2YXRlIGluZGV4OiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIGNyZWF0b3I6IElTdXJ2ZXlDcmVhdG9yO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnNldFByb3BlcnRpZXMocHJvcHMpO1xuICAgIH1cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wczogYW55KSB7XG4gICAgICAgIHN1cGVyLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKTtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0aWVzKG5leHRQcm9wcyk7XG4gICAgfVxuICAgIHByaXZhdGUgc2V0UHJvcGVydGllcyhuZXh0UHJvcHM6IGFueSkge1xuICAgICAgICB0aGlzLnJvdyA9IG5leHRQcm9wcy5yb3c7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSBuZXh0UHJvcHMucXVlc3Rpb247XG4gICAgICAgIHRoaXMuaW5kZXggPSBuZXh0UHJvcHMuaW5kZXg7XG4gICAgICAgIHRoaXMuY3JlYXRvciA9IG5leHRQcm9wcy5jcmVhdG9yO1xuICAgICAgICB0aGlzLmhhbmRsZU9uUm93UmVtb3ZlQ2xpY2sgPSB0aGlzLmhhbmRsZU9uUm93UmVtb3ZlQ2xpY2suYmluZCh0aGlzKTtcbiAgICB9XG4gICAgaGFuZGxlT25Sb3dSZW1vdmVDbGljayhldmVudCkge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLnJlbW92ZVJvd1VJKHRoaXMuaW5kZXgpO1xuICAgIH1cbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICBpZiAoIXRoaXMucm93KSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIHRkcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2VsbCA9IHRoaXMucm93LmNlbGxzW2ldO1xuICAgICAgICAgICAgdmFyIGNlbGxFbGVtZW50ID0gPFN1cnZleVF1ZXN0aW9uTWF0cml4RHJvcGRvd25DZWxsIGtleT17XCJyb3dcIiArIGl9IGNzc0NsYXNzZXM9e3RoaXMuY3NzQ2xhc3Nlc30gY2VsbD17Y2VsbH0gY3JlYXRvcj17dGhpcy5jcmVhdG9yfSAvPlxuICAgICAgICAgICAgdGRzLnB1c2goY2VsbEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5pc0Rpc3BsYXlNb2RlICYmIHRoaXMucXVlc3Rpb24uY2FuUmVtb3ZlUm93KSB7XG4gICAgICAgICAgICB2YXIgcmVtb3ZlQnV0dG9uID0gdGhpcy5yZW5kZXJCdXR0b24oKTtcbiAgICAgICAgICAgIHRkcy5wdXNoKDx0ZCBrZXk9e1wicm93XCIgKyB0aGlzLnJvdy5jZWxscy5sZW5ndGggKyAxfT57cmVtb3ZlQnV0dG9ufTwvdGQ+KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKDx0cj57dGRzfTwvdHI+KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHJlbmRlckJ1dHRvbigpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIHJldHVybiA8aW5wdXQgY2xhc3NOYW1lPXt0aGlzLmNzc0NsYXNzZXMuYnV0dG9ufSB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17dGhpcy5oYW5kbGVPblJvd1JlbW92ZUNsaWNrfSB2YWx1ZT17dGhpcy5xdWVzdGlvbi5yZW1vdmVSb3dUZXh0fSAvPjtcbiAgICB9XG59XG5cblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtYXRyaXhkeW5hbWljXCIsIChwcm9wcykgPT4ge1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uTWF0cml4RHluYW1pYywgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbm1hdHJpeGR5bmFtaWMudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtSZWFjdFN1cnZleUVsZW1lbnQsIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2V9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQge0hlbHBlcnN9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQge1F1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWx9IGZyb20gXCIuLi9xdWVzdGlvbl9tdWx0aXBsZXRleHRcIjtcbmltcG9ydCB7TXVsdGlwbGVUZXh0SXRlbU1vZGVsfSBmcm9tIFwiLi4vcXVlc3Rpb25fbXVsdGlwbGV0ZXh0XCI7XG5pbXBvcnQge1JlYWN0UXVlc3Rpb25GYWN0b3J5fSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25NdWx0aXBsZVRleHQgZXh0ZW5kcyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtjb2xDb3VudENoYW5nZWQ6IDB9O1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMucXVlc3Rpb24uY29sQ291bnRDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnN0YXRlLmNvbENvdW50Q2hhbmdlZCA9IHNlbGYuc3RhdGUuY29sQ291bnRDaGFuZ2VkICsgMTtcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoc2VsZi5zdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsIHsgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWw7IH1cbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICBpZiAoIXRoaXMucXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgY3NzQ2xhc3NlcyA9IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICAgICAgdmFyIHRhYmxlUm93cyA9IHRoaXMucXVlc3Rpb24uZ2V0Um93cygpO1xuICAgICAgICB2YXIgcm93cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcm93cy5wdXNoKHRoaXMucmVuZGVyUm93KGksIHRhYmxlUm93c1tpXSwgY3NzQ2xhc3NlcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8dGFibGUgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLnJvb3R9PlxuICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICB7cm93c31cbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHJlbmRlclJvdyhyb3dJbmRleCwgaXRlbXM6IEFycmF5PE11bHRpcGxlVGV4dEl0ZW1Nb2RlbD4sIGNzc0NsYXNzZXM6IGFueSkge1xuICAgICAgICB2YXIga2V5OiBzdHJpbmcgPSAnaXRlbScgKyByb3dJbmRleDtcbiAgICAgICAgdmFyIHRkcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICAgICAgdmFyIGl0ZW1UaXRsZSA9IHRoaXMucmVuZGVyTG9jU3RyaW5nKGl0ZW0ubG9jVGl0bGUpO1xuICAgICAgICAgICAgdGRzLnB1c2goPHRkIGtleT17J2xhYmVsJyArIGl9PjxzcGFuIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5pdGVtVGl0bGV9PntpdGVtVGl0bGV9PC9zcGFuPjwvdGQ+KTtcbiAgICAgICAgICAgIHRkcy5wdXNoKDx0ZCBrZXk9eyd2YWx1ZScgKyBpfT57dGhpcy5yZW5kZXJJdGVtKGl0ZW0sIHJvd0luZGV4ID09PSAwICYmIGkgPT09IDAsIGNzc0NsYXNzZXMpfTwvdGQ+KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gPHRyIGtleT17a2V5fSBjbGFzc05hbWU9e2Nzc0NsYXNzZXMucm93fT57dGRzfTwvdHI+O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgcmVuZGVySXRlbShpdGVtOiBNdWx0aXBsZVRleHRJdGVtTW9kZWwsIGlzRmlyc3Q6IGJvb2xlYW4sIGNzc0NsYXNzZXM6IGFueSk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgbGV0IGlucHV0SWQgPSBpc0ZpcnN0ID8gdGhpcy5xdWVzdGlvbi5pbnB1dElkIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIDxTdXJ2ZXlRdWVzdGlvbk11bHRpcGxlVGV4dEl0ZW0gaXRlbT17aXRlbX0gIGNzc0NsYXNzZXM9e2Nzc0NsYXNzZXN9IGlzRGlzcGxheU1vZGU9e3RoaXMuaXNEaXNwbGF5TW9kZX0gLz47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25NdWx0aXBsZVRleHRJdGVtIGV4dGVuZHMgUmVhY3RTdXJ2ZXlFbGVtZW50IHtcbiAgICBwcml2YXRlIGl0ZW06IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbDtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5pdGVtID0gcHJvcHMuaXRlbTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHsgdmFsdWU6IHRoaXMuZ2V0VmFsdWUodGhpcy5pdGVtLnZhbHVlKSB9O1xuICAgICAgICB0aGlzLmhhbmRsZU9uQ2hhbmdlID0gdGhpcy5oYW5kbGVPbkNoYW5nZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmhhbmRsZU9uQmx1ciA9IHRoaXMuaGFuZGxlT25CbHVyLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIGhhbmRsZU9uQ2hhbmdlKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlIH0pO1xuICAgIH1cbiAgICBoYW5kbGVPbkJsdXIoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5pdGVtLnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmFsdWU6IHRoaXMuaXRlbS52YWx1ZSB9KTtcbiAgICB9XG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xuICAgICAgICB0aGlzLml0ZW0gPSBuZXh0UHJvcHMuaXRlbTtcbiAgICB9XG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIGlmKHRoaXMuaXRlbSkge1xuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5pdGVtLnZhbHVlQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24obmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzZWxmLnNldFN0YXRlKHsgdmFsdWU6IHRoaXMuZ2V0VmFsdWUobmV3VmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICBpZih0aGlzLml0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbS52YWx1ZUNoYW5nZWRDYWxsYmFjayA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgaWYgKCF0aGlzLml0ZW0pIHJldHVybiBudWxsO1xuICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlNb2RlKSByZXR1cm4gKDxkaXYgaWQ9e3RoaXMuaXRlbS5pZH0gY2xhc3NOYW1lPXt0aGlzLmNzc0NsYXNzZXMuaXRlbVZhbHVlfT57dGhpcy5pdGVtLnZhbHVlfTwvZGl2Pik7XG4gICAgICAgIHJldHVybiAoPGlucHV0IGlkPXt0aGlzLml0ZW0uaWR9IGNsYXNzTmFtZT17dGhpcy5jc3NDbGFzc2VzLml0ZW1WYWx1ZX0gIHR5cGU9e3RoaXMuaXRlbS5pbnB1dFR5cGV9IHZhbHVlPXt0aGlzLnN0YXRlLnZhbHVlfSBwbGFjZWhvbGRlcj17dGhpcy5pdGVtLnBsYWNlSG9sZGVyfSBvbkJsdXI9e3RoaXMuaGFuZGxlT25CbHVyfSBvbkNoYW5nZT17dGhpcy5oYW5kbGVPbkNoYW5nZX0gYXJpYS1sYWJlbD17dGhpcy5pdGVtLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH0vPik7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXQgbWFpbkNsYXNzTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gXCJcIjsgfVxuICAgIHByaXZhdGUgZ2V0VmFsdWUodmFsOiBhbnkpOiBhbnkge1xuICAgICAgICBpZihIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWwpKSByZXR1cm4gXCJcIjtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG59XG5cblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtdWx0aXBsZXRleHRcIiwgKHByb3BzKSA9PiB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3VydmV5UXVlc3Rpb25NdWx0aXBsZVRleHQsIHByb3BzKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25tdWx0aXBsZXRleHQudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtSZWFjdFN1cnZleUVsZW1lbnQsIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2V9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQge1F1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwsIFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbX0gZnJvbSBcIi4uL3F1ZXN0aW9uX3BhbmVsZHluYW1pY1wiO1xuaW1wb3J0IHtQYW5lbE1vZGVsfSBmcm9tIFwiLi4vcGFuZWxcIjtcbmltcG9ydCB7U3VydmV5UGFuZWx9IGZyb20gXCIuL3JlYWN0cGFnZVwiO1xuaW1wb3J0IHtJU3VydmV5Q3JlYXRvciwgU3VydmV5UXVlc3Rpb25FcnJvcnN9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25cIjtcbmltcG9ydCB7c3VydmV5Q3NzfSBmcm9tIFwiLi4vZGVmYXVsdENzcy9jc3NzdGFuZGFyZFwiO1xuaW1wb3J0IHtSZWFjdFF1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmZhY3RvcnlcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uUGFuZWxEeW5hbWljIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydGllcyhwcm9wcyk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCB7IHJldHVybiB0aGlzLnF1ZXN0aW9uQmFzZSBhcyBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsOyB9XG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlci5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyk7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydGllcyhuZXh0UHJvcHMpO1xuICAgIH1cbiAgICBwcml2YXRlIHNldFByb3BlcnRpZXMobmV4dFByb3BzOiBhbnkpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgcGFuZWxDb3VudGVyOiAwIH0pO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLnBhbmVsQ291bnRDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7IHNlbGYudXBkYXRlUXVlc3Rpb25SZW5kZXJpbmcoKTsgfTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbi5jdXJyZW50SW5kZXhDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7IHNlbGYudXBkYXRlUXVlc3Rpb25SZW5kZXJpbmcoKTsgfTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbi5yZW5kZXJNb2RlQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkgeyBzZWxmLnVwZGF0ZVF1ZXN0aW9uUmVuZGVyaW5nKCk7IH07XG4gICAgICAgIHRoaXMuaGFuZGxlT25QYW5lbEFkZENsaWNrID0gdGhpcy5oYW5kbGVPblBhbmVsQWRkQ2xpY2suYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVPblBhbmVsUHJldkNsaWNrID0gdGhpcy5oYW5kbGVPblBhbmVsUHJldkNsaWNrLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuaGFuZGxlT25QYW5lbE5leHRDbGljayA9IHRoaXMuaGFuZGxlT25QYW5lbE5leHRDbGljay5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmhhbmRsZU9uUmFuZ2VDaGFuZ2UgPSB0aGlzLmhhbmRsZU9uUmFuZ2VDaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB9XG4gICAgcHJpdmF0ZSB1cGRhdGVRdWVzdGlvblJlbmRlcmluZygpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5wYW5lbENvdW50ZXIgPSB0aGlzLnN0YXRlLnBhbmVsQ291bnRlciArIDE7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUodGhpcy5zdGF0ZSk7XG4gICAgfVxuICAgIGhhbmRsZU9uUGFuZWxBZGRDbGljayhldmVudCkge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLmFkZFBhbmVsKCk7XG4gICAgfVxuICAgIGhhbmRsZU9uUGFuZWxQcmV2Q2xpY2soZXZlbnQpIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbi5jdXJyZW50SW5kZXggLS07XG4gICAgfVxuICAgIGhhbmRsZU9uUGFuZWxOZXh0Q2xpY2soZXZlbnQpIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbi5jdXJyZW50SW5kZXggKys7XG4gICAgfVxuICAgIGhhbmRsZU9uUmFuZ2VDaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbi5jdXJyZW50SW5kZXggPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgfVxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIGlmICghdGhpcy5xdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBjc3NDbGFzc2VzID0gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgICAgICB2YXIgcGFuZWxzID0gW107XG4gICAgICAgIGlmKHRoaXMucXVlc3Rpb24uaXNSZW5kZXJNb2RlTGlzdCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBwYW5lbCA9IHRoaXMucXVlc3Rpb24ucGFuZWxzW2ldO1xuICAgICAgICAgICAgICAgIHBhbmVscy5wdXNoKDxTdXJ2ZXlRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0ga2V5PXtpfSBwYW5lbD17cGFuZWx9IHF1ZXN0aW9uPXt0aGlzLnF1ZXN0aW9ufSBpbmRleD17aX0gY3NzQ2xhc3Nlcz17Y3NzQ2xhc3Nlc30gaXNEaXNwbGF5TW9kZT17dGhpcy5pc0Rpc3BsYXlNb2RlfSBjcmVhdG9yPXt0aGlzLmNyZWF0b3J9IC8+KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmKHRoaXMucXVlc3Rpb24uY3VycmVudFBhbmVsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGFuZWwgPSB0aGlzLnF1ZXN0aW9uLmN1cnJlbnRQYW5lbDtcbiAgICAgICAgICAgICAgICBwYW5lbHMucHVzaCg8U3VydmV5UXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtIGtleT17dGhpcy5xdWVzdGlvbi5jdXJyZW50SW5kZXh9IHBhbmVsPXtwYW5lbH0gcXVlc3Rpb249e3RoaXMucXVlc3Rpb259IGluZGV4PXt0aGlzLnF1ZXN0aW9uLmN1cnJlbnRJbmRleH0gY3NzQ2xhc3Nlcz17Y3NzQ2xhc3Nlc30gaXNEaXNwbGF5TW9kZT17dGhpcy5pc0Rpc3BsYXlNb2RlfSBjcmVhdG9yPXt0aGlzLmNyZWF0b3J9IC8+KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgYnRuRGVsZXRlVEQgPSAhdGhpcy5pc0Rpc3BsYXlNb2RlID8gPHRkPjwvdGQ+IDogbnVsbDtcbiAgICAgICAgdmFyIGJ0bkFkZCA9IHRoaXMucXVlc3Rpb24uaXNSZW5kZXJNb2RlTGlzdCA/IHRoaXMucmVuZGVyQWRkUm93QnV0dG9uKGNzc0NsYXNzZXMsIHttYXJnaW5Ub3A6IFwiNXB4XCJ9KSA6IG51bGw7XG4gICAgICAgIHZhciBuYXZUb3AgPSB0aGlzLnF1ZXN0aW9uLmlzUHJvZ3Jlc3NUb3BTaG93aW5nID8gdGhpcy5yZW5kZXJOYXZpZ2F0b3IoY3NzQ2xhc3NlcykgOiBudWxsO1xuICAgICAgICB2YXIgbmF2Qm90dG9tID0gdGhpcy5xdWVzdGlvbi5pc1Byb2dyZXNzQm90dG9tU2hvd2luZyA/IHRoaXMucmVuZGVyTmF2aWdhdG9yKGNzc0NsYXNzZXMpIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAge25hdlRvcH1cbiAgICAgICAgICAgICAgICB7cGFuZWxzfVxuICAgICAgICAgICAgICAgIHtuYXZCb3R0b219XG4gICAgICAgICAgICAgICAge2J0bkFkZH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgcmVuZGVyTmF2aWdhdG9yKGNzc0NsYXNzZXM6IGFueSk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgdmFyIHN0eWxlID0geyBmbG9hdDogXCJsZWZ0XCIsIG1hcmdpbjogXCI1cHhcIiB9O1xuICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLnF1ZXN0aW9uLmlzUmFuZ2VTaG93aW5nID8gdGhpcy5yZW5kZXJSYW5nZShzdHlsZSk6IG51bGw7XG4gICAgICAgIHZhciBidG5QcmV2ID0gdGhpcy5xdWVzdGlvbi5pc1ByZXZCdXR0b25TaG93aW5nID8gdGhpcy5yZW5kZXJCdXR0b24odGhpcy5xdWVzdGlvbi5wYW5lbFByZXZUZXh0LCBjc3NDbGFzc2VzLCBzdHlsZSwgdGhpcy5oYW5kbGVPblBhbmVsUHJldkNsaWNrKTogbnVsbDtcbiAgICAgICAgdmFyIGJ0bk5leHQgPSB0aGlzLnF1ZXN0aW9uLmlzTmV4dEJ1dHRvblNob3dpbmcgPyB0aGlzLnJlbmRlckJ1dHRvbih0aGlzLnF1ZXN0aW9uLnBhbmVsTmV4dFRleHQsIGNzc0NsYXNzZXMsIHN0eWxlLCB0aGlzLmhhbmRsZU9uUGFuZWxOZXh0Q2xpY2spOiBudWxsO1xuICAgICAgICB2YXIgYnRuQWRkID0gdGhpcy5yZW5kZXJBZGRSb3dCdXR0b24oY3NzQ2xhc3Nlcywgc3R5bGUpO1xuICAgICAgICByZXR1cm4gPGRpdj57cmFuZ2V9e2J0blByZXZ9e2J0bk5leHR9e2J0bkFkZH08L2Rpdj47XG4gICAgfVxuICAgIHByb3RlY3RlZCByZW5kZXJSYW5nZShzdHlsZTogYW55KTogSlNYLkVsZW1lbnQge1xuICAgICAgICB2YXIgdXBkYXRlZFN0eWxlID0ge3dpZHRoOiBcIjI1JVwifTsgLy9UT0RPIDI1JS5cbiAgICAgICAgZm9yICh2YXIgYXR0ciBpbiBzdHlsZSkgdXBkYXRlZFN0eWxlW2F0dHJdID0gc3R5bGVbYXR0cl07XG4gICAgICAgIHJldHVybiA8aW5wdXQgc3R5bGU9e3VwZGF0ZWRTdHlsZX0gdHlwZT1cInJhbmdlXCIgb25DaGFuZ2U9e3RoaXMuaGFuZGxlT25SYW5nZUNoYW5nZX0gbWluPXswfSBtYXg9e3RoaXMucXVlc3Rpb24ucGFuZWxDb3VudCAtIDF9IHZhbHVlPXt0aGlzLnF1ZXN0aW9uLmN1cnJlbnRJbmRleH0gLz47O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgcmVuZGVyQWRkUm93QnV0dG9uKGNzc0NsYXNzZXM6IGFueSwgc3R5bGU6IGFueSk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXN0aW9uLmNhbkFkZFBhbmVsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQnV0dG9uKHRoaXMucXVlc3Rpb24ucGFuZWxBZGRUZXh0LCBjc3NDbGFzc2VzLCBzdHlsZSwgdGhpcy5oYW5kbGVPblBhbmVsQWRkQ2xpY2spO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgcmVuZGVyQnV0dG9uKHRleHQ6IHN0cmluZywgY3NzQ2xhc3NlczogYW55LCBzdHlsZTogYW55LCBvbkNsaWNrOiBhbnkpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIHJldHVybiA8aW5wdXQgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLmJ1dHRvbn0gc3R5bGU9e3N0eWxlfSB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17b25DbGlja30gdmFsdWU9e3RleHR9IC8+O1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSBleHRlbmRzIFJlYWN0U3VydmV5RWxlbWVudCB7XG4gICAgcHJpdmF0ZSBwYW5lbDogUGFuZWxNb2RlbDtcbiAgICBwcml2YXRlIHF1ZXN0aW9uOiBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsO1xuICAgIHByaXZhdGUgaW5kZXg6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgY3JlYXRvcjogSVN1cnZleUNyZWF0b3I7XG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydGllcyhwcm9wcyk7XG4gICAgfVxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzOiBhbnkpIHtcbiAgICAgICAgc3VwZXIuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpO1xuICAgICAgICB0aGlzLnNldFByb3BlcnRpZXMobmV4dFByb3BzKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzZXRQcm9wZXJ0aWVzKG5leHRQcm9wczogYW55KSB7XG4gICAgICAgIHRoaXMucGFuZWwgPSBuZXh0UHJvcHMucGFuZWw7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSBuZXh0UHJvcHMucXVlc3Rpb247XG4gICAgICAgIHRoaXMuaW5kZXggPSBuZXh0UHJvcHMuaW5kZXg7XG4gICAgICAgIHRoaXMuY3JlYXRvciA9IG5leHRQcm9wcy5jcmVhdG9yO1xuICAgICAgICB0aGlzLmhhbmRsZU9uUGFuZWxSZW1vdmVDbGljayA9IHRoaXMuaGFuZGxlT25QYW5lbFJlbW92ZUNsaWNrLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIGhhbmRsZU9uUGFuZWxSZW1vdmVDbGljayhldmVudCkge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLnJlbW92ZVBhbmVsVUkodGhpcy5pbmRleCk7XG4gICAgfVxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIGlmICghdGhpcy5wYW5lbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHRoaXMucXVlc3Rpb24uc3VydmV5XG4gICAgICAgIHZhciBwYW5lbCA9IDxTdXJ2ZXlQYW5lbCBrZXk9e3RoaXMuaW5kZXh9IHBhbmVsPXt0aGlzLnBhbmVsfSBjc3M9e3N1cnZleUNzcy5nZXRDc3MoKX0gc3VydmV5PXt0aGlzLnF1ZXN0aW9uLnN1cnZleX0gY3JlYXRvcj17dGhpcy5jcmVhdG9yfSAvPjtcbiAgICAgICAgdmFyIGhyID0gdGhpcy5xdWVzdGlvbi5pc1JlbmRlck1vZGVMaXN0ICYmICh0aGlzLmluZGV4IDwgdGhpcy5xdWVzdGlvbi5wYW5lbENvdW50IC0gMSkgID8gPGhyLz4gOiBudWxsO1xuICAgICAgICB2YXIgcmVtb3ZlQnV0dG9uID0gdGhpcy5yZW5kZXJCdXR0b24oKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICB7cGFuZWx9XG4gICAgICAgICAgICB7cmVtb3ZlQnV0dG9ufVxuICAgICAgICAgICAge2hyfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxuICAgIHByb3RlY3RlZCByZW5kZXJCdXR0b24oKTogSlNYLkVsZW1lbnQge1xuICAgICAgICBpZighdGhpcy5xdWVzdGlvbi5jYW5SZW1vdmVQYW5lbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBzdHlsZSA9IHttYXJnaW5Ub3A6IFwiNXB4XCJ9O1xuICAgICAgICByZXR1cm4gPGlucHV0IGNsYXNzTmFtZT17dGhpcy5jc3NDbGFzc2VzLmJ1dHRvbn0gc3R5bGU9e3N0eWxlfSB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17dGhpcy5oYW5kbGVPblBhbmVsUmVtb3ZlQ2xpY2t9IHZhbHVlPXt0aGlzLnF1ZXN0aW9uLnBhbmVsUmVtb3ZlVGV4dH0gLz47XG4gICAgfVxufVxuXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicGFuZWxkeW5hbWljXCIsIChwcm9wcykgPT4ge1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uUGFuZWxEeW5hbWljLCBwcm9wcyk7XG59KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbnBhbmVsZHluYW1pYy50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1N1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2V9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQge1F1ZXN0aW9uUmFkaW9ncm91cE1vZGVsfSBmcm9tIFwiLi4vcXVlc3Rpb25fcmFkaW9ncm91cFwiO1xuaW1wb3J0IHtJdGVtVmFsdWV9IGZyb20gXCIuLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7U3VydmV5UXVlc3Rpb25Db21tZW50SXRlbX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmNvbW1lbnRcIjtcbmltcG9ydCB7UmVhY3RRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvblJhZGlvZ3JvdXAgZXh0ZW5kcyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHsgY2hvaWNlc0NoYW5nZWQ6IDAgfTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLmNob2ljZXNDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnN0YXRlLmNob2ljZXNDaGFuZ2VkID0gc2VsZi5zdGF0ZS5jaG9pY2VzQ2hhbmdlZCArIDE7XG4gICAgICAgICAgICBzZWxmLnNldFN0YXRlKHNlbGYuc3RhdGUpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZU9uQ2hhbmdlID0gdGhpcy5oYW5kbGVPbkNoYW5nZS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsIHsgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsOyB9XG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlci5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyk7XG4gICAgICAgIHRoaXMuaGFuZGxlT25DaGFuZ2UgPSB0aGlzLmhhbmRsZU9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIGhhbmRsZU9uQ2hhbmdlKGV2ZW50KSB7XG4gICAgICAgIHRoaXMucXVlc3Rpb24udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdGhpcy5xdWVzdGlvbi52YWx1ZSB9KTtcbiAgICB9XG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGNzc0NsYXNzZXMgPSB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8Zm9ybSBjbGFzc05hbWU9e2Nzc0NsYXNzZXMucm9vdH0+XG4gICAgICAgICAgICAgICAge3RoaXMuZ2V0SXRlbXMoY3NzQ2xhc3NlcykgfVxuICAgICAgICAgICAgPC9mb3JtPik7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRJdGVtcyhjc3NDbGFzc2VzOiBhbnkpOiBBcnJheTxhbnk+IHtcbiAgICAgICAgdmFyIGl0ZW1zID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzW2ldO1xuICAgICAgICAgICAgdmFyIGtleSA9IFwiaXRlbVwiICsgaTtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2godGhpcy5yZW5kZXJJdGVtKGtleSwgaXRlbSwgaSA9PSAwLCBjc3NDbGFzc2VzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0IHRleHRTdHlsZSgpOiBhbnkgeyByZXR1cm4geyBtYXJnaW5MZWZ0OiBcIjNweFwiLCBkaXNwbGF5OiBcImlubGluZVwiLCBwb3NpdGlvbjogJ3N0YXRpYycgfTsgfVxuICAgIHByaXZhdGUgcmVuZGVySXRlbShrZXk6IHN0cmluZywgaXRlbTogSXRlbVZhbHVlLCBpc0ZpcnN0OiBib29sZWFuLCBjc3NDbGFzc2VzOiBhbnkpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIHZhciBpdGVtV2lkdGggPSB0aGlzLnF1ZXN0aW9uLmNvbENvdW50ID4gMCA/ICgxMDAgLyB0aGlzLnF1ZXN0aW9uLmNvbENvdW50KSArIFwiJVwiIDogXCJcIjtcbiAgICAgICAgdmFyIG1hcmdpblJpZ2h0ID0gdGhpcy5xdWVzdGlvbi5jb2xDb3VudCA9PSAwID8gXCI1cHhcIiA6IFwiMHB4XCI7XG4gICAgICAgIHZhciBkaXZTdHlsZSA9IHsgbWFyZ2luUmlnaHQ6IG1hcmdpblJpZ2h0LCBtYXJnaW5MZWZ0OiAnMHB4JywgZGlzcGxheTogJ2lubGluZS1ibG9jayd9O1xuICAgICAgICBpZiAoaXRlbVdpZHRoKSB7XG4gICAgICAgICAgICBkaXZTdHlsZVtcIndpZHRoXCJdID0gaXRlbVdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpc0NoZWNrZWQgPSB0aGlzLnF1ZXN0aW9uLnZhbHVlID09IGl0ZW0udmFsdWU7XG4gICAgICAgIHZhciBvdGhlckl0ZW0gPSAoaXNDaGVja2VkICYmIGl0ZW0udmFsdWUgPT09IHRoaXMucXVlc3Rpb24ub3RoZXJJdGVtLnZhbHVlKSA/IHRoaXMucmVuZGVyT3RoZXIoY3NzQ2xhc3NlcykgOiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJSYWRpbyhrZXksIGl0ZW0sIGlzQ2hlY2tlZCwgZGl2U3R5bGUsIG90aGVySXRlbSwgaXNGaXJzdCwgY3NzQ2xhc3Nlcyk7XG4gICAgfVxuICAgIHByb3RlY3RlZCByZW5kZXJSYWRpbyhrZXk6IHN0cmluZywgaXRlbTogSXRlbVZhbHVlLCBpc0NoZWNrZWQ6IGJvb2xlYW4sIGRpdlN0eWxlOiBhbnksIG90aGVySXRlbTogSlNYLkVsZW1lbnQsIGlzRmlyc3Q6IGJvb2xlYW4sIGNzc0NsYXNzZXM6IGFueSk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgdmFyIGlkID0gaXNGaXJzdCA/IHRoaXMucXVlc3Rpb24uaW5wdXRJZCA6IG51bGw7XG4gICAgICAgIHZhciBpdGVtVGV4dCA9IHRoaXMucmVuZGVyTG9jU3RyaW5nKGl0ZW0ubG9jVGV4dCwgdGhpcy50ZXh0U3R5bGUpO1xuICAgICAgICBsZXQgaXRlbUNsYXNzID0gY3NzQ2xhc3Nlcy5pdGVtICsgKHRoaXMucXVlc3Rpb24uY29sQ291bnQgPT09IDAgPyBcIiBzdl9xX3JhZGlvZ3JvdXBfaW5saW5lXCI6IFwiXCIpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBrZXk9e2tleX0gY2xhc3NOYW1lPXtpdGVtQ2xhc3N9IHN0eWxlPXtkaXZTdHlsZX0+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5sYWJlbH0+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD17aWR9IHR5cGU9XCJyYWRpb1wiIG5hbWU9e3RoaXMucXVlc3Rpb24ubmFtZSArIFwiX1wiICsgdGhpcy5xdWVzdGlvbkJhc2UuaWR9IGNoZWNrZWQ9e2lzQ2hlY2tlZH0gdmFsdWU9e2l0ZW0udmFsdWV9IGRpc2FibGVkPXt0aGlzLmlzRGlzcGxheU1vZGV9IG9uQ2hhbmdlPXt0aGlzLmhhbmRsZU9uQ2hhbmdlfSBhcmlhLWxhYmVsPXt0aGlzLnF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH0vPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJjaXJjbGVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNoZWNrXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB7aXRlbVRleHR9XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICB7b3RoZXJJdGVtfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxuICAgIHByb3RlY3RlZCByZW5kZXJPdGhlcihjc3NDbGFzc2VzOiBhbnkpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMub3RoZXJ9PjxTdXJ2ZXlRdWVzdGlvbkNvbW1lbnRJdGVtICBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn0gb3RoZXJDc3M9e2Nzc0NsYXNzZXMub3RoZXJ9IGNzc0NsYXNzZXM9e2Nzc0NsYXNzZXN9IGlzRGlzcGxheU1vZGU9e3RoaXMuaXNEaXNwbGF5TW9kZX0vPjwvZGl2Pik7XG4gICAgfVxufVxuXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicmFkaW9ncm91cFwiLCAocHJvcHMpID0+IHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvblJhZGlvZ3JvdXAsIHByb3BzKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25yYWRpb2dyb3VwLnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7U3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcbmltcG9ydCB7U3VydmV5UXVlc3Rpb25Db21tZW50SXRlbX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmNvbW1lbnRcIjtcbmltcG9ydCB7UXVlc3Rpb25SYXRpbmdNb2RlbH0gZnJvbSBcIi4uL3F1ZXN0aW9uX3JhdGluZ1wiO1xuaW1wb3J0IHtJdGVtVmFsdWV9IGZyb20gXCIuLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7UmVhY3RRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvblJhdGluZyBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLmhhbmRsZU9uQ2hhbmdlID0gdGhpcy5oYW5kbGVPbkNoYW5nZS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uUmF0aW5nTW9kZWwgeyByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25SYXRpbmdNb2RlbDsgfVxuICAgIGhhbmRsZU9uQ2hhbmdlKGV2ZW50KSB7XG4gICAgICAgIHRoaXMucXVlc3Rpb24udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdGhpcy5xdWVzdGlvbi52YWx1ZSB9KTtcbiAgICB9XG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGNzc0NsYXNzZXMgPSB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgICAgdmFyIG1pblRleHQgPSB0aGlzLnF1ZXN0aW9uLm1pblJhdGVEZXNjcmlwdGlvbiA/IHRoaXMucmVuZGVyTG9jU3RyaW5nKHRoaXMucXVlc3Rpb24ubG9jTWluUmF0ZURlc2NyaXB0aW9uKSA6IG51bGw7XG4gICAgICAgIHZhciBtYXhUZXh0ID0gdGhpcy5xdWVzdGlvbi5tYXhSYXRlRGVzY3JpcHRpb24gPyB0aGlzLnJlbmRlckxvY1N0cmluZyh0aGlzLnF1ZXN0aW9uLmxvY01heFJhdGVEZXNjcmlwdGlvbikgOiBudWxsO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucXVlc3Rpb24udmlzaWJsZVJhdGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBtaW5UZXh0VmFsdWUgPSBpID09IDAgPyBtaW5UZXh0IDogbnVsbDtcbiAgICAgICAgICAgIHZhciBtYXhUZXh0VmFsdWUgPSBpID09IHRoaXMucXVlc3Rpb24udmlzaWJsZVJhdGVWYWx1ZXMubGVuZ3RoIC0gMSA/IG1heFRleHQgOiBudWxsO1xuICAgICAgICAgICAgdmFsdWVzLnB1c2godGhpcy5yZW5kZXJJdGVtKFwidmFsdWVcIiArIGksIHRoaXMucXVlc3Rpb24udmlzaWJsZVJhdGVWYWx1ZXNbaV0sIG1pblRleHRWYWx1ZSwgbWF4VGV4dFZhbHVlLCBjc3NDbGFzc2VzKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbW1lbnQgPSB0aGlzLnF1ZXN0aW9uLmhhc090aGVyID8gdGhpcy5yZW5kZXJPdGhlcihjc3NDbGFzc2VzKSA6IG51bGw7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5yb290fT5cbiAgICAgICAgICAgICAgICB7dmFsdWVzfVxuICAgICAgICAgICAgICAgIHtjb21tZW50fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxuICAgIHByb3RlY3RlZCByZW5kZXJJdGVtKGtleTogc3RyaW5nLCBpdGVtOiBJdGVtVmFsdWUsIG1pblRleHQ6IEpTWC5FbGVtZW50LCBtYXhUZXh0OiBKU1guRWxlbWVudCwgY3NzQ2xhc3NlczogYW55KTogSlNYLkVsZW1lbnQge1xuICAgICAgICB2YXIgaXNDaGVja2VkID0gdGhpcy5xdWVzdGlvbi52YWx1ZSA9PSBpdGVtLnZhbHVlO1xuICAgICAgICB2YXIgY2xhc3NOYW1lID0gY3NzQ2xhc3Nlcy5pdGVtO1xuICAgICAgICBpZiAoaXNDaGVja2VkKSBjbGFzc05hbWUgKz0gXCIgXCIgKyBjc3NDbGFzc2VzLnNlbGVjdGVkO1xuICAgICAgICB2YXIgaXRlbVRleHQgPSB0aGlzLnJlbmRlckxvY1N0cmluZyhpdGVtLmxvY1RleHQpO1xuICAgICAgICByZXR1cm4gPGxhYmVsIGtleT17a2V5fSBjbGFzc05hbWU9e2NsYXNzTmFtZX0+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgc3R5bGU9e3sgZGlzcGxheTogXCJub25lXCIgfX0gbmFtZT17dGhpcy5xdWVzdGlvbi5uYW1lfSB2YWx1ZT17aXRlbS52YWx1ZX0gZGlzYWJsZWQ9e3RoaXMuaXNEaXNwbGF5TW9kZX0gY2hlY2tlZD17dGhpcy5xdWVzdGlvbi52YWx1ZSA9PSBpdGVtLnZhbHVlfSBvbkNoYW5nZT17dGhpcy5oYW5kbGVPbkNoYW5nZX0gYXJpYS1sYWJlbD17aXRlbS5sb2NUZXh0LnRleHR9Lz5cbiAgICAgICAgICAgIHttaW5UZXh0fVxuICAgICAgICAgICAge2l0ZW1UZXh0fVxuICAgICAgICAgICAge21heFRleHR9XG4gICAgICAgICAgICA8L2xhYmVsPjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHJlbmRlck90aGVyKGNzc0NsYXNzZXMpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMub3RoZXJ9PjxTdXJ2ZXlRdWVzdGlvbkNvbW1lbnRJdGVtICBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn0gY3NzQ2xhc3Nlcz17Y3NzQ2xhc3Nlc30gaXNEaXNwbGF5TW9kZT17dGhpcy5pc0Rpc3BsYXlNb2RlfS8+PC9kaXY+KTtcbiAgICB9XG59XG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicmF0aW5nXCIsIChwcm9wcykgPT4ge1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uUmF0aW5nLCBwcm9wcyk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ucmF0aW5nLnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7SGVscGVyc30gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB7QmFzZX0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7U3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcbmltcG9ydCB7UXVlc3Rpb25UZXh0TW9kZWx9IGZyb20gXCIuLi9xdWVzdGlvbl90ZXh0XCI7XG5pbXBvcnQge1JlYWN0UXVlc3Rpb25GYWN0b3J5fSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuXG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvblRleHQgZXh0ZW5kcyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHsgdmFsdWU6IHRoaXMuZ2V0VmFsdWUodGhpcy5xdWVzdGlvbi52YWx1ZSkgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVPbkNoYW5nZSA9IHRoaXMuaGFuZGxlT25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVPbkJsdXIgPSB0aGlzLmhhbmRsZU9uQmx1ci5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uVGV4dE1vZGVsIHsgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFF1ZXN0aW9uVGV4dE1vZGVsOyB9XG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlci5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdGhpcy5nZXRWYWx1ZSh0aGlzLnF1ZXN0aW9uLnZhbHVlKX0pO1xuICAgIH1cbiAgICBoYW5kbGVPbkNoYW5nZShldmVudCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmFsdWU6IHRoaXMuZ2V0VmFsdWUoZXZlbnQudGFyZ2V0LnZhbHVlKSB9KTtcbiAgICB9XG4gICAgaGFuZGxlT25CbHVyKGV2ZW50KSB7XG4gICAgICAgIHRoaXMucXVlc3Rpb24udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdGhpcy5nZXRWYWx1ZSh0aGlzLnF1ZXN0aW9uLnZhbHVlKSB9KTtcbiAgICB9XG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGNzc0NsYXNzZXMgPSB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgICAgIGlmICh0aGlzLmlzRGlzcGxheU1vZGUpXG4gICAgICAgICAgICByZXR1cm4gKDxkaXYgaWQ9e3RoaXMucXVlc3Rpb24uaW5wdXRJZH0gY2xhc3NOYW1lPXtjc3NDbGFzc2VzLnJvb3R9Pnt0aGlzLnF1ZXN0aW9uLnZhbHVlfTwvZGl2PilcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxpbnB1dCBpZD17dGhpcy5xdWVzdGlvbi5pbnB1dElkfSBjbGFzc05hbWU9e2Nzc0NsYXNzZXMucm9vdH0gdHlwZT17dGhpcy5xdWVzdGlvbi5pbnB1dFR5cGV9IHZhbHVlPXt0aGlzLnN0YXRlLnZhbHVlfSBzaXplPXt0aGlzLnF1ZXN0aW9uLnNpemV9IHBsYWNlaG9sZGVyPXt0aGlzLnF1ZXN0aW9uLnBsYWNlSG9sZGVyfSBvbkJsdXI9e3RoaXMuaGFuZGxlT25CbHVyfSBvbkNoYW5nZT17dGhpcy5oYW5kbGVPbkNoYW5nZX0gYXJpYS1sYWJlbD17dGhpcy5xdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9Lz5cbiAgICAgICAgKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRWYWx1ZSh2YWw6IGFueSkgOiBhbnkge1xuICAgICAgICBpZihIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWwpKSByZXR1cm4gXCJcIjtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG59XG5cblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJ0ZXh0XCIsIChwcm9wcykgPT4ge1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uVGV4dCwgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbnRleHQudHN4IiwiXG5leHBvcnQgY2xhc3MgU3R5bGVzTWFuYWdlciB7XG4gICAgcHJpdmF0ZSBzaGVldDogQ1NTU3R5bGVTaGVldCA9IG51bGw7XG4gICAgcHJpdmF0ZSBzdGF0aWMgU3VydmV5SlNTdHlsZXNTaGVldElkID0gXCJzdXJ2ZXlqc1wiO1xuICAgIHB1YmxpYyBzdGF0aWMgU3R5bGVzOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSA9IHtcbiAgICAgICAgJy5zdl9xc3RuJzogJ2Rpc3BsYXk6IGlubGluZS1ibG9jazsgdmVydGljYWwtYWxpZ246IHRvcDsnLFxuICAgICAgICAnLnN2X3BfY29udGFpbmVyJzogJ2Rpc3BsYXk6IGlubGluZS1ibG9jazsgdmVydGljYWwtYWxpZ246IHRvcDsnLFxuICAgICAgICAnLnN2X3FibG4gLmNoZWNrYm94LW1hdGVyaWFsJzogJ21hcmdpbi1yaWdodDogM3B4OycsXG4gICAgICAgICcuc3ZfcWNieCAuY2hlY2tib3gtbWF0ZXJpYWwnOiAnbWFyZ2luLXJpZ2h0OiA1cHg7JyxcbiAgICAgICAgJy5zdl9xY2J4IC5jaGVja2JveCBsYWJlbCc6ICdqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7JyxcbiAgICAgICAgJy5zdl9xc3RuIC5yYWRpbyBsYWJlbCc6ICdqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7JyxcbiAgICAgICAgJy5zdl9xc3RuIGxhYmVsLnN2X3FfbV9sYWJlbCc6ICdwb3NpdGlvbjogYWJzb2x1dGU7IG1hcmdpbjogMDsnLFxuICAgICAgICAnLnN2X3FfbXRfaXRlbV92YWx1ZSc6ICdmbG9hdDogbGVmdDsnLFxuICAgICAgICAnLnN2X3FzdG4gLnRpdGxlLWxlZnQnOiAnZmxvYXQ6IGxlZnQ7IG1hcmdpbi1yaWdodDogMTVweDsnLFxuICAgICAgICAnLnN2X3FzdG4gLnRpdGxlLWxlZnQgaDUnOiAnbWFyZ2luLXRvcDogNHB4OycsXG4gICAgICAgICcuc3ZfcXN0biAuY29udGVudC1sZWZ0JzogJ292ZXJmbG93OiBoaWRkZW4nLFxuICAgICAgICAnLnN2X3FfcmFkaW9ncm91cF9pbmxpbmUgLnN2X3FfcmFkaW9ncm91cF9vdGhlcic6ICdkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGhlaWdodDogMjBweDsgbWFyZ2luLXRvcDogLTVweDsnLFxuICAgICAgICAnLnN2X3FfY2hlY2tib3hfaW5saW5lIC5zdl9xX2NoZWNrYm94X290aGVyJzogJ2Rpc3BsYXk6IGlubGluZS1ibG9jazsgaGVpZ2h0OiAyMHB4OyBtYXJnaW4tdG9wOiAtNXB4OydcbiAgICB9O1xuXG4gICAgZmluZFNoZWV0KCkge1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgZG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmKGRvY3VtZW50LnN0eWxlU2hlZXRzW2ldLm93bmVyTm9kZVsnaWQnXSA9PT0gU3R5bGVzTWFuYWdlci5TdXJ2ZXlKU1N0eWxlc1NoZWV0SWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gPENTU1N0eWxlU2hlZXQ+ZG9jdW1lbnQuc3R5bGVTaGVldHNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNyZWF0ZVNoZWV0KCkge1xuICAgICAgICBsZXQgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICBzdHlsZS5pZCA9IFN0eWxlc01hbmFnZXIuU3VydmV5SlNTdHlsZXNTaGVldElkO1xuICAgICAgICAvLyBBZGQgYSBtZWRpYSAoYW5kL29yIG1lZGlhIHF1ZXJ5KSBoZXJlIGlmIHlvdSdkIGxpa2UhXG4gICAgICAgIC8vIHN0eWxlLnNldEF0dHJpYnV0ZShcIm1lZGlhXCIsIFwic2NyZWVuXCIpXG4gICAgICAgIC8vIHN0eWxlLnNldEF0dHJpYnV0ZShcIm1lZGlhXCIsIFwib25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGggOiAxMDI0cHgpXCIpXG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKSk7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgICAgICByZXR1cm4gPENTU1N0eWxlU2hlZXQ+c3R5bGUuc2hlZXQ7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc2hlZXQgPSB0aGlzLmZpbmRTaGVldCgpO1xuICAgICAgICBpZighdGhpcy5zaGVldCkge1xuICAgICAgICAgICAgdGhpcy5zaGVldCA9IHRoaXMuY3JlYXRlU2hlZXQoKTtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVN0eWxlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGluaXRpYWxpemVTdHlsZXMoKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKFN0eWxlc01hbmFnZXIuU3R5bGVzKS5mb3JFYWNoKHNlbGVjdG9yID0+XG4gICAgICAgICAgICB0aGlzLnNoZWV0Lmluc2VydFJ1bGUoc2VsZWN0b3IgKyAneyAnICsgU3R5bGVzTWFuYWdlci5TdHlsZXNbc2VsZWN0b3JdICsgJyB9JywgMFxuICAgICAgICApKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc3R5bGVzbWFuYWdlci50cyIsImltcG9ydCB7SGFzaFRhYmxlfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQge0Jhc2V9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7SnNvbk9iamVjdH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyBmb3IgYWxsIHRyaWdnZXJzLiBcbiAqIEEgdHJpZ2dlciBjYWxscyBhIG1ldGhvZCB3aGVuIHRoZSBleHByZXNzaW9uIGNoYW5nZSB0aGUgcmVzdWx0OiBmcm9tIGZhbHNlIHRvIHRydWUgb3IgZnJvbSB0cnVlIHRvIGZhbHNlLlxuICogUGxlYXNlIG5vdGUsIGl0IHJ1bnMgb25seSBvbmUgY2hhbmdpbmcgdGhlIGV4cHJlc3Npb24gcmVzdWx0LlxuICovXG5leHBvcnQgY2xhc3MgVHJpZ2dlciBleHRlbmRzIEJhc2Uge1xuICAgIHN0YXRpYyBvcGVyYXRvcnNWYWx1ZTogSGFzaFRhYmxlPEZ1bmN0aW9uPiA9IG51bGw7XG4gICAgc3RhdGljIGdldCBvcGVyYXRvcnMoKSB7XG4gICAgICAgIGlmIChUcmlnZ2VyLm9wZXJhdG9yc1ZhbHVlICE9IG51bGwpIHJldHVybiBUcmlnZ2VyLm9wZXJhdG9yc1ZhbHVlO1xuICAgICAgICBUcmlnZ2VyLm9wZXJhdG9yc1ZhbHVlID0ge1xuICAgICAgICAgICAgZW1wdHk6IGZ1bmN0aW9uICh2YWx1ZSwgZXhwZWN0ZWRWYWx1ZSkgeyByZXR1cm4gIXZhbHVlOyB9LFxuICAgICAgICAgICAgbm90ZW1wdHk6IGZ1bmN0aW9uICh2YWx1ZSwgZXhwZWN0ZWRWYWx1ZSkgeyByZXR1cm4gISghdmFsdWUpOyB9LFxuICAgICAgICAgICAgZXF1YWw6IGZ1bmN0aW9uICh2YWx1ZSwgZXhwZWN0ZWRWYWx1ZSkgeyByZXR1cm4gdmFsdWUgPT0gZXhwZWN0ZWRWYWx1ZTsgfSxcbiAgICAgICAgICAgIG5vdGVxdWFsOiBmdW5jdGlvbiAodmFsdWUsIGV4cGVjdGVkVmFsdWUpIHsgcmV0dXJuIHZhbHVlICE9IGV4cGVjdGVkVmFsdWU7IH0sXG4gICAgICAgICAgICBjb250YWluczogZnVuY3Rpb24gKHZhbHVlLCBleHBlY3RlZFZhbHVlKSB7IHJldHVybiB2YWx1ZSAmJiB2YWx1ZVtcImluZGV4T2ZcIl0gJiYgdmFsdWUuaW5kZXhPZihleHBlY3RlZFZhbHVlKSA+IC0xOyB9LFxuICAgICAgICAgICAgbm90Y29udGFpbnM6IGZ1bmN0aW9uICh2YWx1ZSwgZXhwZWN0ZWRWYWx1ZSkgeyByZXR1cm4gIXZhbHVlIHx8ICF2YWx1ZVtcImluZGV4T2ZcIl0gfHwgdmFsdWUuaW5kZXhPZihleHBlY3RlZFZhbHVlKSA9PSAtMTsgfSxcbiAgICAgICAgICAgIGdyZWF0ZXI6IGZ1bmN0aW9uICh2YWx1ZSwgZXhwZWN0ZWRWYWx1ZSkgeyByZXR1cm4gdmFsdWUgPiBleHBlY3RlZFZhbHVlOyB9LFxuICAgICAgICAgICAgbGVzczogZnVuY3Rpb24gKHZhbHVlLCBleHBlY3RlZFZhbHVlKSB7IHJldHVybiB2YWx1ZSA8IGV4cGVjdGVkVmFsdWU7IH0sXG4gICAgICAgICAgICBncmVhdGVyb3JlcXVhbDogZnVuY3Rpb24gKHZhbHVlLCBleHBlY3RlZFZhbHVlKSB7IHJldHVybiB2YWx1ZSA+PSBleHBlY3RlZFZhbHVlOyB9LFxuICAgICAgICAgICAgbGVzc29yZXF1YWw6IGZ1bmN0aW9uICh2YWx1ZSwgZXhwZWN0ZWRWYWx1ZSkgeyByZXR1cm4gdmFsdWUgPD0gZXhwZWN0ZWRWYWx1ZTsgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gVHJpZ2dlci5vcGVyYXRvcnNWYWx1ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBvcFZhbHVlOiBzdHJpbmcgPSBcImVxdWFsXCI7XG4gICAgcHVibGljIHZhbHVlOiBhbnk7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7IHJldHVybiBcInRyaWdnZXJiYXNlXCI7IH1cbiAgICBwdWJsaWMgZ2V0IG9wZXJhdG9yKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLm9wVmFsdWU7IH1cbiAgICBwdWJsaWMgc2V0IG9wZXJhdG9yKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghVHJpZ2dlci5vcGVyYXRvcnNbdmFsdWVdKSByZXR1cm47XG4gICAgICAgIHRoaXMub3BWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBwdWJsaWMgY2hlY2sodmFsdWU6IGFueSkge1xuICAgICAgICBpZiAoVHJpZ2dlci5vcGVyYXRvcnNbdGhpcy5vcGVyYXRvcl0odmFsdWUsIHRoaXMudmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLm9uU3VjY2VzcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vbkZhaWx1cmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgb25TdWNjZXNzKCkgeyB9XG4gICAgcHJvdGVjdGVkIG9uRmFpbHVyZSgpIHsgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTdXJ2ZXlUcmlnZ2VyT3duZXIge1xuICAgIGdldE9iamVjdHMocGFnZXM6IHN0cmluZ1tdLCBxdWVzdGlvbnM6IHN0cmluZ1tdKTogYW55W107XG4gICAgZG9Db21wbGV0ZSgpO1xuICAgIHNldFRyaWdnZXJWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGlzVmFyaWFibGU6IGJvb2xlYW4pO1xufVxuXG4vKipcbiAqIEl0IGV4dGVuZHMgdGhlIFRyaWdnZXIgYmFzZSBjbGFzcyBhbmQgYWRkIHByb3BlcnRpZXMgcmVxdWlyZWQgZm9yIFN1cnZleUpTIGNsYXNzZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyIGV4dGVuZHMgVHJpZ2dlciB7XG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgb3duZXI6IElTdXJ2ZXlUcmlnZ2VyT3duZXIgPSBudWxsO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0T3duZXIob3duZXI6IElTdXJ2ZXlUcmlnZ2VyT3duZXIpIHtcbiAgICAgICAgdGhpcy5vd25lciA9IG93bmVyO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGlzT25OZXh0UGFnZSgpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG4vKipcbiAqIElmIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlLCBpdCBtYWtlcyBxdWVzdGlvbnMvcGFnZXMgdmlzaWJsZS5cbiAqIE9odGVyd2lzZSBpdCBtYWtlcyB0aGVtIGludmlzaWJsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVRyaWdnZXJWaXNpYmxlIGV4dGVuZHMgU3VydmV5VHJpZ2dlciB7XG4gICAgcHVibGljIHBhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHB1YmxpYyBxdWVzdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7IHJldHVybiBcInZpc2libGV0cmlnZ2VyXCI7IH1cbiAgICBwcm90ZWN0ZWQgb25TdWNjZXNzKCkgeyB0aGlzLm9uVHJpZ2dlcih0aGlzLm9uSXRlbVN1Y2Nlc3MpOyB9XG4gICAgcHJvdGVjdGVkIG9uRmFpbHVyZSgpIHsgdGhpcy5vblRyaWdnZXIodGhpcy5vbkl0ZW1GYWlsdXJlKTsgfVxuICAgIHByaXZhdGUgb25UcmlnZ2VyKGZ1bmM6IEZ1bmN0aW9uKSB7XG4gICAgICAgIGlmICghdGhpcy5vd25lcikgcmV0dXJuO1xuICAgICAgICB2YXIgb2JqZWN0cyA9IHRoaXMub3duZXIuZ2V0T2JqZWN0cyh0aGlzLnBhZ2VzLCB0aGlzLnF1ZXN0aW9ucyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZnVuYyhvYmplY3RzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgb25JdGVtU3VjY2VzcyhpdGVtOiBhbnkpIHsgaXRlbS52aXNpYmxlID0gdHJ1ZTsgfVxuICAgIHByb3RlY3RlZCBvbkl0ZW1GYWlsdXJlKGl0ZW06IGFueSkgeyBpdGVtLnZpc2libGUgPSBmYWxzZTsgfVxufVxuLyoqXG4gKiBJZiBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSwgaXQgY29tcGxldGVzIHRoZSBzdXJ2ZXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyQ29tcGxldGUgZXh0ZW5kcyBTdXJ2ZXlUcmlnZ2VyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHsgcmV0dXJuIFwiY29tcGxldGV0cmlnZ2VyXCI7IH1cbiAgICBwdWJsaWMgZ2V0IGlzT25OZXh0UGFnZSgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBwcm90ZWN0ZWQgb25TdWNjZXNzKCkgeyBpZiAodGhpcy5vd25lcikgdGhpcy5vd25lci5kb0NvbXBsZXRlKCk7IH1cbn1cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyU2V0VmFsdWUgZXh0ZW5kcyBTdXJ2ZXlUcmlnZ2VyIHtcbiAgICBwdWJsaWMgc2V0VG9OYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIHNldFZhbHVlOiBhbnk7XG4gICAgcHVibGljIGlzVmFyaWFibGU6IGJvb2xlYW47XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7IHJldHVybiBcInNldHZhbHVldHJpZ2dlclwiOyB9XG4gICAgcHJvdGVjdGVkIG9uU3VjY2VzcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNldFRvTmFtZSB8fCAhdGhpcy5vd25lcikgcmV0dXJuO1xuICAgICAgICB0aGlzLm93bmVyLnNldFRyaWdnZXJWYWx1ZSh0aGlzLnNldFRvTmFtZSwgdGhpcy5zZXRWYWx1ZSwgdGhpcy5pc1ZhcmlhYmxlKTtcbiAgICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJ0cmlnZ2VyXCIsIFtcIm9wZXJhdG9yXCIsIFwiIXZhbHVlXCJdKTtcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJzdXJ2ZXl0cmlnZ2VyXCIsIFtcIiFuYW1lXCJdLCBudWxsLCBcInRyaWdnZXJcIik7XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwidmlzaWJsZXRyaWdnZXJcIiwgW1wicGFnZXNcIiwgXCJxdWVzdGlvbnNcIl0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBTdXJ2ZXlUcmlnZ2VyVmlzaWJsZSgpOyB9LCBcInN1cnZleXRyaWdnZXJcIik7XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwiY29tcGxldGV0cmlnZ2VyXCIsIFtdLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgU3VydmV5VHJpZ2dlckNvbXBsZXRlKCk7IH0sIFwic3VydmV5dHJpZ2dlclwiKTtcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJzZXR2YWx1ZXRyaWdnZXJcIiwgW1wiIXNldFRvTmFtZVwiLCBcInNldFZhbHVlXCIsIFwiaXNWYXJpYWJsZTpib29sZWFuXCJdLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgU3VydmV5VHJpZ2dlclNldFZhbHVlKCk7IH0sIFwic3VydmV5dHJpZ2dlclwiKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy90cmlnZ2VyLnRzIiwidmFyIHdlYmtpdFJlZ0V4cCA9IC8od2Via2l0KVsgXFwvXShbXFx3Ll0rKS8sXG4gICAgaWVSZWdFeHAgPSAvKG1zaWUpIChcXGR7MSwyfVxcLlxcZCkvLFxuICAgIGllMTFSZWdFeHAgPSAvKHRyaWRlbnQpLipydjooXFxkezEsMn1cXC5cXGQpLyxcbiAgICBtc0VkZ2UgPSAvKGVkZ2UpXFwvKChcXGQrKT9bXFx3XFwuXSspLyxcbiAgICBtb3ppbGxhUmVnRXhwID0gLyhtb3ppbGxhKSg/Oi4qPyBydjooW1xcdy5dKykpLztcbnZhciBicm93c2VyRnJvbVVBID0gZnVuY3Rpb24odWEpIHtcbiAgICB1YSA9IHVhLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHJlc3VsdDogeyBtc2llPzogYm9vbGVhbiwgZmlyZWZveD86IGJvb2xlYW4sIHZlcnNpb24/OiBzdHJpbmcgfSA9IHt9LFxuICAgICAgICBtYXRjaGVzID0gaWVSZWdFeHAuZXhlYyh1YSkgfHwgaWUxMVJlZ0V4cC5leGVjKHVhKSB8fCBtc0VkZ2UuZXhlYyh1YSkgfHwgdWEuaW5kZXhPZihcImNvbXBhdGlibGVcIikgPCAwICYmIG1vemlsbGFSZWdFeHAuZXhlYyh1YSkgfHwgd2Via2l0UmVnRXhwLmV4ZWModWEpIHx8IFtdLFxuICAgICAgICBicm93c2VyTmFtZSA9IG1hdGNoZXNbMV0sXG4gICAgICAgIGJyb3dzZXJWZXJzaW9uID0gbWF0Y2hlc1syXTtcbiAgICBpZiAoYnJvd3Nlck5hbWUgPT09IFwidHJpZGVudFwiIHx8IGJyb3dzZXJOYW1lID09PSBcImVkZ2VcIikge1xuICAgICAgICBicm93c2VyTmFtZSA9IFwibXNpZVwiO1xuICAgIH1cbiAgICBlbHNlIGlmIChicm93c2VyTmFtZSA9PT0gXCJtb3ppbGxhXCIpIHtcbiAgICAgICAgYnJvd3Nlck5hbWUgPSBcImZpcmVmb3hcIjtcbiAgICB9XG4gICAgaWYgKGJyb3dzZXJOYW1lKSB7XG4gICAgICAgIHJlc3VsdFticm93c2VyTmFtZV0gPSB0cnVlO1xuICAgICAgICByZXN1bHQudmVyc2lvbiA9IGJyb3dzZXJWZXJzaW9uXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbn07XG5cbmxldCBicm93c2VyID0gYnJvd3NlckZyb21VQShuYXZpZ2F0b3IudXNlckFnZW50KTtcblxuZnVuY3Rpb24gY29tcGFyZVZlcnNpb25zKGEsIGIpIHtcbiAgICB2YXIgaSwgZGlmZjtcbiAgICB2YXIgcmVnRXhTdHJpcDAgPSAvKFxcLjArKSskLztcbiAgICB2YXIgc2VnbWVudHNBID0gYS5yZXBsYWNlKHJlZ0V4U3RyaXAwLCAnJykuc3BsaXQoJy4nKTtcbiAgICB2YXIgc2VnbWVudHNCID0gYi5yZXBsYWNlKHJlZ0V4U3RyaXAwLCAnJykuc3BsaXQoJy4nKTtcbiAgICB2YXIgbCA9IE1hdGgubWluKHNlZ21lbnRzQS5sZW5ndGgsIHNlZ21lbnRzQi5sZW5ndGgpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICBkaWZmID0gcGFyc2VJbnQoc2VnbWVudHNBW2ldLCAxMCkgLSBwYXJzZUludChzZWdtZW50c0JbaV0sIDEwKTtcbiAgICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgICAgIHJldHVybiBkaWZmO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZWdtZW50c0EubGVuZ3RoIC0gc2VnbWVudHNCLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gaXNNb2JpbGUoKSB7XG4gICAgcmV0dXJuICh0eXBlb2Ygd2luZG93Lm9yaWVudGF0aW9uICE9PSAndW5kZWZpbmVkJylcbn1cblxuZXhwb3J0IHtcbiAgICBicm93c2VyLFxuICAgIGNvbXBhcmVWZXJzaW9ucyxcbiAgICBpc01vYmlsZVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3V0aWxzLnRzIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCB7U3VydmV5TW9kZWx9IGZyb20gXCIuLi9zdXJ2ZXlcIjtcbmltcG9ydCB7U3VydmV5fSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RTdXJ2ZXlcIjtcbmltcG9ydCB7U3VydmV5V2luZG93fSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RTdXJ2ZXlXaW5kb3dcIjtcbmltcG9ydCBqUXVlcnkgZnJvbSAnanF1ZXJ5JztcblxualF1ZXJ5W1wiZm5cIl0uZXh0ZW5kKHtcbiAgICBTdXJ2ZXk6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgIHRoaXMuZWFjaChcbiAgICAgICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIFJlYWN0RE9NLnJlbmRlcigoXG4gICAgICAgICAgICAgICAgICAgIDxTdXJ2ZXkgey4uLnByb3BzfS8+XG4gICAgICAgICAgICAgICAgKSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIFN1cnZleVdpbmRvdzogZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgdGhpcy5lYWNoKFxuICAgICAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgUmVhY3RET00ucmVuZGVyKChcbiAgICAgICAgICAgICAgICAgICAgPFN1cnZleVdpbmRvdyB7Li4ucHJvcHN9Lz5cbiAgICAgICAgICAgICAgICApLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG59KTtcblxuU3VydmV5TW9kZWwucGxhdGZvcm0gPSBcImpxdWVyeVwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9yZWFjdFwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2VudHJpZXMvanF1ZXJ5LnRzeCJdLCJzb3VyY2VSb290IjoiIn0=