(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 1) { return Math.min(w, nextW); } return w; } function weekOfGivenYear(marker, year, dow, doy) { var firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]); var dayStart = startOfDay(marker); var days = Math.round(diffDays(firstWeekStart, dayStart)); return Math.floor(days / 7) + 1; // zero-indexed } // start-of-first-week - start-of-year function firstWeekOffset(year, dow, doy) { // first-week day -- which january is always in the first week (4 for iso, 1 for other) var fwd = 7 + dow - doy; // first-week day local weekday -- which local weekday is fwd var fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7; return -fwdlw + fwd - 1; } // Array Conversion function dateToLocalArray(date) { return [date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()]; } function arrayToLocalDate(a) { return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of month a[3] || 0, a[4] || 0, a[5] || 0); } function dateToUtcArray(date) { return [date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.getUTCMilliseconds()]; } function arrayToUtcDate(a) { // according to web standards (and Safari), a month index is required. // massage if only given a year. if (a.length === 1) { a = a.concat([0]); } return new Date(Date.UTC.apply(Date, a)); } // Other Utils function isValidDate(m) { return !isNaN(m.valueOf()); } function timeAsMs(m) { return m.getUTCHours() * 1000 * 60 * 60 + m.getUTCMinutes() * 1000 * 60 + m.getUTCSeconds() * 1000 + m.getUTCMilliseconds(); } function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) { return { instanceId: guid(), defId: defId, range: range, forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo, forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo }; } var hasOwnProperty = Object.prototype.hasOwnProperty; // Merges an array of objects into a single object. // The second argument allows for an array of property names who's object values will be merged together. function mergeProps(propObjs, complexPropsMap) { var dest = {}; if (complexPropsMap) { for (var name_1 in complexPropsMap) { var complexObjs = []; // collect the trailing object values, stopping when a non-object is discovered for (var i = propObjs.length - 1; i >= 0; i -= 1) { var val = propObjs[i][name_1]; if (_typeof(val) === 'object' && val) { // non-null object complexObjs.unshift(val); } else if (val !== undefined) { dest[name_1] = val; // if there were no objects, this value will be used break; } } // if the trailing values were objects, use the merged value if (complexObjs.length) { dest[name_1] = mergeProps(complexObjs); } } } // copy values into the destination, going from last to first for (var i = propObjs.length - 1; i >= 0; i -= 1) { var props = propObjs[i]; for (var name_2 in props) { if (!(name_2 in dest)) { // if already assigned by previous props or complex props, don't reassign dest[name_2] = props[name_2]; } } } return dest; } function filterHash(hash, func) { var filtered = {}; for (var key in hash) { if (func(hash[key], key)) { filtered[key] = hash[key]; } } return filtered; } function mapHash(hash, func) { var newHash = {}; for (var key in hash) { newHash[key] = func(hash[key], key); } return newHash; } function arrayToHash(a) { var hash = {}; for (var _i = 0, a_1 = a; _i < a_1.length; _i++) { var item = a_1[_i]; hash[item] = true; } return hash; } function buildHashFromArray(a, func) { var hash = {}; for (var i = 0; i < a.length; i += 1) { var tuple = func(a[i], i); hash[tuple[0]] = tuple[1]; } return hash; } function hashValuesToArray(obj) { var a = []; for (var key in obj) { a.push(obj[key]); } return a; } function isPropsEqual(obj0, obj1) { if (obj0 === obj1) { return true; } for (var key in obj0) { if (hasOwnProperty.call(obj0, key)) { if (!(key in obj1)) { return false; } } } for (var key in obj1) { if (hasOwnProperty.call(obj1, key)) { if (obj0[key] !== obj1[key]) { return false; } } } return true; } function getUnequalProps(obj0, obj1) { var keys = []; for (var key in obj0) { if (hasOwnProperty.call(obj0, key)) { if (!(key in obj1)) { keys.push(key); } } } for (var key in obj1) { if (hasOwnProperty.call(obj1, key)) { if (obj0[key] !== obj1[key]) { keys.push(key); } } } return keys; } function compareObjs(oldProps, newProps, equalityFuncs) { if (equalityFuncs === void 0) { equalityFuncs = {}; } if (oldProps === newProps) { return true; } for (var key in newProps) { if (key in oldProps && isObjValsEqual(oldProps[key], newProps[key], equalityFuncs[key])) ;else { return false; } } // check for props that were omitted in the new for (var key in oldProps) { if (!(key in newProps)) { return false; } } return true; } /* assumed "true" equality for handler names like "onReceiveSomething" */ function isObjValsEqual(val0, val1, comparator) { if (val0 === val1 || comparator === true) { return true; } if (comparator) { return comparator(val0, val1); } return false; } function collectFromHash(hash, startIndex, endIndex, step) { if (startIndex === void 0) { startIndex = 0; } if (step === void 0) { step = 1; } var res = []; if (endIndex == null) { endIndex = Object.keys(hash).length; } for (var i = startIndex; i < endIndex; i += step) { var val = hash[i]; if (val !== undefined) { // will disregard undefined for sparse arrays res.push(val); } } return res; } function parseRecurring(refined, defaultAllDay, dateEnv, recurringTypes) { for (var i = 0; i < recurringTypes.length; i += 1) { var parsed = recurringTypes[i].parse(refined, dateEnv); if (parsed) { var allDay = refined.allDay; if (allDay == null) { allDay = defaultAllDay; if (allDay == null) { allDay = parsed.allDayGuess; if (allDay == null) { allDay = false; } } } return { allDay: allDay, duration: parsed.duration, typeData: parsed.typeData, typeId: i }; } } return null; } function expandRecurring(eventStore, framingRange, context) { var dateEnv = context.dateEnv, pluginHooks = context.pluginHooks, options = context.options; var defs = eventStore.defs, instances = eventStore.instances; // remove existing recurring instances // TODO: bad. always expand events as a second step instances = filterHash(instances, function (instance) { return !defs[instance.defId].recurringDef; }); for (var defId in defs) { var def = defs[defId]; if (def.recurringDef) { var duration = def.recurringDef.duration; if (!duration) { duration = def.allDay ? options.defaultAllDayEventDuration : options.defaultTimedEventDuration; } var starts = expandRecurringRanges(def, duration, framingRange, dateEnv, pluginHooks.recurringTypes); for (var _i = 0, starts_1 = starts; _i < starts_1.length; _i++) { var start = starts_1[_i]; var instance = createEventInstance(defId, { start: start, end: dateEnv.add(start, duration) }); instances[instance.instanceId] = instance; } } } return { defs: defs, instances: instances }; } /* Event MUST have a recurringDef */ function expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) { var typeDef = recurringTypes[eventDef.recurringDef.typeId]; var markers = typeDef.expand(eventDef.recurringDef.typeData, { start: dateEnv.subtract(framingRange.start, duration), end: framingRange.end }, dateEnv); // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to if (eventDef.allDay) { markers = markers.map(startOfDay); } return markers; } var INTERNAL_UNITS = ['years', 'months', 'days', 'milliseconds']; var PARSE_RE = /^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/; // Parsing and Creation function createDuration(input, unit) { var _a; if (typeof input === 'string') { return parseString(input); } if (_typeof(input) === 'object' && input) { // non-null object return parseObject(input); } if (typeof input === 'number') { return parseObject((_a = {}, _a[unit || 'milliseconds'] = input, _a)); } return null; } function parseString(s) { var m = PARSE_RE.exec(s); if (m) { var sign = m[1] ? -1 : 1; return { years: 0, months: 0, days: sign * (m[2] ? parseInt(m[2], 10) : 0), milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60 * 60 * 1000 + // hours (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + // minutes (m[5] ? parseInt(m[5], 10) : 0) * 1000 + ( // seconds m[6] ? parseInt(m[6], 10) : 0) // ms ) }; } return null; } function parseObject(obj) { var duration = { years: obj.years || obj.year || 0, months: obj.months || obj.month || 0, days: obj.days || obj.day || 0, milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 + // hours (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes (obj.seconds || obj.second || 0) * 1000 + ( // seconds obj.milliseconds || obj.millisecond || obj.ms || 0) // ms }; var weeks = obj.weeks || obj.week; if (weeks) { duration.days += weeks * 7; duration.specifiedWeeks = true; } return duration; } // Equality function durationsEqual(d0, d1) { return d0.years === d1.years && d0.months === d1.months && d0.days === d1.days && d0.milliseconds === d1.milliseconds; } function asCleanDays(dur) { if (!dur.years && !dur.months && !dur.milliseconds) { return dur.days; } return 0; } // Simple Math function addDurations(d0, d1) { return { years: d0.years + d1.years, months: d0.months + d1.months, days: d0.days + d1.days, milliseconds: d0.milliseconds + d1.milliseconds }; } function subtractDurations(d1, d0) { return { years: d1.years - d0.years, months: d1.months - d0.months, days: d1.days - d0.days, milliseconds: d1.milliseconds - d0.milliseconds }; } function multiplyDuration(d, n) { return { years: d.years * n, months: d.months * n, days: d.days * n, milliseconds: d.milliseconds * n }; } // Conversions // "Rough" because they are based on average-case Gregorian months/years function asRoughYears(dur) { return asRoughDays(dur) / 365; } function asRoughMonths(dur) { return asRoughDays(dur) / 30; } function asRoughDays(dur) { return asRoughMs(dur) / 864e5; } function asRoughMinutes(dur) { return asRoughMs(dur) / (1000 * 60); } function asRoughSeconds(dur) { return asRoughMs(dur) / 1000; } function asRoughMs(dur) { return dur.years * (365 * 864e5) + dur.months * (30 * 864e5) + dur.days * 864e5 + dur.milliseconds; } // Advanced Math function wholeDivideDurations(numerator, denominator) { var res = null; for (var i = 0; i < INTERNAL_UNITS.length; i += 1) { var unit = INTERNAL_UNITS[i]; if (denominator[unit]) { var localRes = numerator[unit] / denominator[unit]; if (!isInt(localRes) || res !== null && res !== localRes) { return null; } res = localRes; } else if (numerator[unit]) { // needs to divide by something but can't! return null; } } return res; } function greatestDurationDenominator(dur) { var ms = dur.milliseconds; if (ms) { if (ms % 1000 !== 0) { return { unit: 'millisecond', value: ms }; } if (ms % (1000 * 60) !== 0) { return { unit: 'second', value: ms / 1000 }; } if (ms % (1000 * 60 * 60) !== 0) { return { unit: 'minute', value: ms / (1000 * 60) }; } if (ms) { return { unit: 'hour', value: ms / (1000 * 60 * 60) }; } } if (dur.days) { if (dur.specifiedWeeks && dur.days % 7 === 0) { return { unit: 'week', value: dur.days / 7 }; } return { unit: 'day', value: dur.days }; } if (dur.months) { return { unit: 'month', value: dur.months }; } if (dur.years) { return { unit: 'year', value: dur.years }; } return { unit: 'millisecond', value: 0 }; } // timeZoneOffset is in minutes function buildIsoString(marker, timeZoneOffset, stripZeroTime) { if (stripZeroTime === void 0) { stripZeroTime = false; } var s = marker.toISOString(); s = s.replace('.000', ''); if (stripZeroTime) { s = s.replace('T00:00:00Z', ''); } if (s.length > 10) { // time part wasn't stripped, can add timezone info if (timeZoneOffset == null) { s = s.replace('Z', ''); } else if (timeZoneOffset !== 0) { s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true)); } // otherwise, its UTC-0 and we want to keep the Z } return s; } // formats the date, but with no time part // TODO: somehow merge with buildIsoString and stripZeroTime // TODO: rename. omit "string" function formatDayString(marker) { return marker.toISOString().replace(/T.*$/, ''); } // TODO: use Date::toISOString and use everything after the T? function formatIsoTimeString(marker) { return padStart(marker.getUTCHours(), 2) + ':' + padStart(marker.getUTCMinutes(), 2) + ':' + padStart(marker.getUTCSeconds(), 2); } function formatTimeZoneOffset(minutes, doIso) { if (doIso === void 0) { doIso = false; } var sign = minutes < 0 ? '-' : '+'; var abs = Math.abs(minutes); var hours = Math.floor(abs / 60); var mins = Math.round(abs % 60); if (doIso) { return sign + padStart(hours, 2) + ":" + padStart(mins, 2); } return "GMT" + sign + hours + (mins ? ":" + padStart(mins, 2) : ''); } // TODO: new util arrayify? function removeExact(array, exactVal) { var removeCnt = 0; var i = 0; while (i < array.length) { if (array[i] === exactVal) { array.splice(i, 1); removeCnt += 1; } else { i += 1; } } return removeCnt; } function isArraysEqual(a0, a1, equalityFunc) { if (a0 === a1) { return true; } var len = a0.length; var i; if (len !== a1.length) { // not array? or not same length? return false; } for (i = 0; i < len; i += 1) { if (!(equalityFunc ? equalityFunc(a0[i], a1[i]) : a0[i] === a1[i])) { return false; } } return true; } function memoize(workerFunc, resEquality, teardownFunc) { var currentArgs; var currentRes; return function () { var newArgs = []; for (var _i = 0; _i < arguments.length; _i++) { newArgs[_i] = arguments[_i]; } if (!currentArgs) { currentRes = workerFunc.apply(this, newArgs); } else if (!isArraysEqual(currentArgs, newArgs)) { if (teardownFunc) { teardownFunc(currentRes); } var res = workerFunc.apply(this, newArgs); if (!resEquality || !resEquality(res, currentRes)) { currentRes = res; } } currentArgs = newArgs; return currentRes; }; } function memoizeObjArg(workerFunc, resEquality, teardownFunc) { var _this = this; var currentArg; var currentRes; return function (newArg) { if (!currentArg) { currentRes = workerFunc.call(_this, newArg); } else if (!isPropsEqual(currentArg, newArg)) { if (teardownFunc) { teardownFunc(currentRes); } var res = workerFunc.call(_this, newArg); if (!resEquality || !resEquality(res, currentRes)) { currentRes = res; } } currentArg = newArg; return currentRes; }; } function memoizeArraylike( // used at all? workerFunc, resEquality, teardownFunc) { var _this = this; var currentArgSets = []; var currentResults = []; return function (newArgSets) { var currentLen = currentArgSets.length; var newLen = newArgSets.length; var i = 0; for (; i < currentLen; i += 1) { if (!newArgSets[i]) { // one of the old sets no longer exists if (teardownFunc) { teardownFunc(currentResults[i]); } } else if (!isArraysEqual(currentArgSets[i], newArgSets[i])) { if (teardownFunc) { teardownFunc(currentResults[i]); } var res = workerFunc.apply(_this, newArgSets[i]); if (!resEquality || !resEquality(res, currentResults[i])) { currentResults[i] = res; } } } for (; i < newLen; i += 1) { currentResults[i] = workerFunc.apply(_this, newArgSets[i]); } currentArgSets = newArgSets; currentResults.splice(newLen); // remove excess return currentResults; }; } function memoizeHashlike(workerFunc, resEquality, teardownFunc) { var _this = this; var currentArgHash = {}; var currentResHash = {}; return function (newArgHash) { var newResHash = {}; for (var key in newArgHash) { if (!currentResHash[key]) { newResHash[key] = workerFunc.apply(_this, newArgHash[key]); } else if (!isArraysEqual(currentArgHash[key], newArgHash[key])) { if (teardownFunc) { teardownFunc(currentResHash[key]); } var res = workerFunc.apply(_this, newArgHash[key]); newResHash[key] = resEquality && resEquality(res, currentResHash[key]) ? currentResHash[key] : res; } else { newResHash[key] = currentResHash[key]; } } currentArgHash = newArgHash; currentResHash = newResHash; return newResHash; }; } var EXTENDED_SETTINGS_AND_SEVERITIES = { week: 3, separator: 0, omitZeroMinute: 0, meridiem: 0, omitCommas: 0 }; var STANDARD_DATE_PROP_SEVERITIES = { timeZoneName: 7, era: 6, year: 5, month: 4, day: 2, weekday: 2, hour: 1, minute: 1, second: 1 }; var MERIDIEM_RE = /\s*([ap])\.?m\.?/i; // eats up leading spaces too var COMMA_RE = /,/g; // we need re for globalness var MULTI_SPACE_RE = /\s+/g; var LTR_RE = /\u200e/g; // control character var UTC_RE = /UTC|GMT/; var NativeFormatter = /** @class */ function () { function NativeFormatter(formatSettings) { var standardDateProps = {}; var extendedSettings = {}; var severity = 0; for (var name_1 in formatSettings) { if (name_1 in EXTENDED_SETTINGS_AND_SEVERITIES) { extendedSettings[name_1] = formatSettings[name_1]; severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name_1], severity); } else { standardDateProps[name_1] = formatSettings[name_1]; if (name_1 in STANDARD_DATE_PROP_SEVERITIES) { // TODO: what about hour12? no severity severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name_1], severity); } } } this.standardDateProps = standardDateProps; this.extendedSettings = extendedSettings; this.severity = severity; this.buildFormattingFunc = memoize(buildFormattingFunc); } NativeFormatter.prototype.format = function (date, context) { return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date); }; NativeFormatter.prototype.formatRange = function (start, end, context, betterDefaultSeparator) { var _a = this, standardDateProps = _a.standardDateProps, extendedSettings = _a.extendedSettings; var diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem); if (!diffSeverity) { return this.format(start, context); } var biggestUnitForPartial = diffSeverity; if (biggestUnitForPartial > 1 && ( // the two dates are different in a way that's larger scale than time standardDateProps.year === 'numeric' || standardDateProps.year === '2-digit') && (standardDateProps.month === 'numeric' || standardDateProps.month === '2-digit') && (standardDateProps.day === 'numeric' || standardDateProps.day === '2-digit')) { biggestUnitForPartial = 1; // make it look like the dates are only different in terms of time } var full0 = this.format(start, context); var full1 = this.format(end, context); if (full0 === full1) { return full0; } var partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial); var partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context); var partial0 = partialFormattingFunc(start); var partial1 = partialFormattingFunc(end); var insertion = findCommonInsertion(full0, partial0, full1, partial1); var separator = extendedSettings.separator || betterDefaultSeparator || context.defaultSeparator || ''; if (insertion) { return insertion.before + partial0 + separator + partial1 + insertion.after; } return full0 + separator + full1; }; NativeFormatter.prototype.getLargestUnit = function () { switch (this.severity) { case 7: case 6: case 5: return 'year'; case 4: return 'month'; case 3: return 'week'; case 2: return 'day'; default: return 'time'; // really? } }; return NativeFormatter; }(); function buildFormattingFunc(standardDateProps, extendedSettings, context) { var standardDatePropCnt = Object.keys(standardDateProps).length; if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === 'short') { return function (date) { return formatTimeZoneOffset(date.timeZoneOffset); }; } if (standardDatePropCnt === 0 && extendedSettings.week) { return function (date) { return formatWeekNumber(context.computeWeekNumber(date.marker), context.weekText, context.weekTextLong, context.locale, extendedSettings.week); }; } return buildNativeFormattingFunc(standardDateProps, extendedSettings, context); } function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) { standardDateProps = tslib.__assign({}, standardDateProps); // copy extendedSettings = tslib.__assign({}, extendedSettings); // copy sanitizeSettings(standardDateProps, extendedSettings); standardDateProps.timeZone = 'UTC'; // we leverage the only guaranteed timeZone for our UTC markers var normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps); var zeroFormat; // needed? if (extendedSettings.omitZeroMinute) { var zeroProps = tslib.__assign({}, standardDateProps); delete zeroProps.minute; // seconds and ms were already considered in sanitizeSettings zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps); } return function (date) { var marker = date.marker; var format; if (zeroFormat && !marker.getUTCMinutes()) { format = zeroFormat; } else { format = normalFormat; } var s = format.format(marker); return postProcess(s, date, standardDateProps, extendedSettings, context); }; } function sanitizeSettings(standardDateProps, extendedSettings) { // deal with a browser inconsistency where formatting the timezone // requires that the hour/minute be present. if (standardDateProps.timeZoneName) { if (!standardDateProps.hour) { standardDateProps.hour = '2-digit'; } if (!standardDateProps.minute) { standardDateProps.minute = '2-digit'; } } // only support short timezone names if (standardDateProps.timeZoneName === 'long') { standardDateProps.timeZoneName = 'short'; } // if requesting to display seconds, MUST display minutes if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) { delete extendedSettings.omitZeroMinute; } } function postProcess(s, date, standardDateProps, extendedSettings, context) { s = s.replace(LTR_RE, ''); // remove left-to-right control chars. do first. good for other regexes if (standardDateProps.timeZoneName === 'short') { s = injectTzoStr(s, context.timeZone === 'UTC' || date.timeZoneOffset == null ? 'UTC' : // important to normalize for IE, which does "GMT" formatTimeZoneOffset(date.timeZoneOffset)); } if (extendedSettings.omitCommas) { s = s.replace(COMMA_RE, '').trim(); } if (extendedSettings.omitZeroMinute) { s = s.replace(':00', ''); // zeroFormat doesn't always achieve this } // ^ do anything that might create adjacent spaces before this point, // because MERIDIEM_RE likes to eat up loading spaces if (extendedSettings.meridiem === false) { s = s.replace(MERIDIEM_RE, '').trim(); } else if (extendedSettings.meridiem === 'narrow') { // a/p s = s.replace(MERIDIEM_RE, function (m0, m1) { return m1.toLocaleLowerCase(); }); } else if (extendedSettings.meridiem === 'short') { // am/pm s = s.replace(MERIDIEM_RE, function (m0, m1) { return m1.toLocaleLowerCase() + "m"; }); } else if (extendedSettings.meridiem === 'lowercase') { // other meridiem transformers already converted to lowercase s = s.replace(MERIDIEM_RE, function (m0) { return m0.toLocaleLowerCase(); }); } s = s.replace(MULTI_SPACE_RE, ' '); s = s.trim(); return s; } function injectTzoStr(s, tzoStr) { var replaced = false; s = s.replace(UTC_RE, function () { replaced = true; return tzoStr; }); // IE11 doesn't include UTC/GMT in the original string, so append to end if (!replaced) { s += " " + tzoStr; } return s; } function formatWeekNumber(num, weekText, weekTextLong, locale, display) { var parts = []; if (display === 'long') { parts.push(weekTextLong); } else if (display === 'short' || display === 'narrow') { parts.push(weekText); } if (display === 'long' || display === 'short') { parts.push(' '); } parts.push(locale.simpleNumberFormat.format(num)); if (locale.options.direction === 'rtl') { // TODO: use control characters instead? parts.reverse(); } return parts.join(''); } // Range Formatting Utils // 0 = exactly the same // 1 = different by time // and bigger function computeMarkerDiffSeverity(d0, d1, ca) { if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) { return 5; } if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) { return 4; } if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) { return 2; } if (timeAsMs(d0) !== timeAsMs(d1)) { return 1; } return 0; } function computePartialFormattingOptions(options, biggestUnit) { var partialOptions = {}; for (var name_2 in options) { if (!(name_2 in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone) STANDARD_DATE_PROP_SEVERITIES[name_2] <= biggestUnit) { partialOptions[name_2] = options[name_2]; } } return partialOptions; } function findCommonInsertion(full0, partial0, full1, partial1) { var i0 = 0; while (i0 < full0.length) { var found0 = full0.indexOf(partial0, i0); if (found0 === -1) { break; } var before0 = full0.substr(0, found0); i0 = found0 + partial0.length; var after0 = full0.substr(i0); var i1 = 0; while (i1 < full1.length) { var found1 = full1.indexOf(partial1, i1); if (found1 === -1) { break; } var before1 = full1.substr(0, found1); i1 = found1 + partial1.length; var after1 = full1.substr(i1); if (before0 === before1 && after0 === after1) { return { before: before0, after: after0 }; } } } return null; } function expandZonedMarker(dateInfo, calendarSystem) { var a = calendarSystem.markerToArray(dateInfo.marker); return { marker: dateInfo.marker, timeZoneOffset: dateInfo.timeZoneOffset, array: a, year: a[0], month: a[1], day: a[2], hour: a[3], minute: a[4], second: a[5], millisecond: a[6] }; } function createVerboseFormattingArg(start, end, context, betterDefaultSeparator) { var startInfo = expandZonedMarker(start, context.calendarSystem); var endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null; return { date: startInfo, start: startInfo, end: endInfo, timeZone: context.timeZone, localeCodes: context.locale.codes, defaultSeparator: betterDefaultSeparator || context.defaultSeparator }; } /* TODO: fix the terminology of "formatter" vs "formatting func" */ /* At the time of instantiation, this object does not know which cmd-formatting system it will use. It receives this at the time of formatting, as a setting. */ var CmdFormatter = /** @class */ function () { function CmdFormatter(cmdStr) { this.cmdStr = cmdStr; } CmdFormatter.prototype.format = function (date, context, betterDefaultSeparator) { return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, betterDefaultSeparator)); }; CmdFormatter.prototype.formatRange = function (start, end, context, betterDefaultSeparator) { return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, betterDefaultSeparator)); }; return CmdFormatter; }(); var FuncFormatter = /** @class */ function () { function FuncFormatter(func) { this.func = func; } FuncFormatter.prototype.format = function (date, context, betterDefaultSeparator) { return this.func(createVerboseFormattingArg(date, null, context, betterDefaultSeparator)); }; FuncFormatter.prototype.formatRange = function (start, end, context, betterDefaultSeparator) { return this.func(createVerboseFormattingArg(start, end, context, betterDefaultSeparator)); }; return FuncFormatter; }(); function createFormatter(input) { if (_typeof(input) === 'object' && input) { // non-null object return new NativeFormatter(input); } if (typeof input === 'string') { return new CmdFormatter(input); } if (typeof input === 'function') { return new FuncFormatter(input); } return null; } // base options // ------------ var BASE_OPTION_REFINERS = { navLinkDayClick: identity, navLinkWeekClick: identity, duration: createDuration, bootstrapFontAwesome: identity, buttonIcons: identity, customButtons: identity, defaultAllDayEventDuration: createDuration, defaultTimedEventDuration: createDuration, nextDayThreshold: createDuration, scrollTime: createDuration, scrollTimeReset: Boolean, slotMinTime: createDuration, slotMaxTime: createDuration, dayPopoverFormat: createFormatter, slotDuration: createDuration, snapDuration: createDuration, headerToolbar: identity, footerToolbar: identity, defaultRangeSeparator: String, titleRangeSeparator: String, forceEventDuration: Boolean, dayHeaders: Boolean, dayHeaderFormat: createFormatter, dayHeaderClassNames: identity, dayHeaderContent: identity, dayHeaderDidMount: identity, dayHeaderWillUnmount: identity, dayCellClassNames: identity, dayCellContent: identity, dayCellDidMount: identity, dayCellWillUnmount: identity, initialView: String, aspectRatio: Number, weekends: Boolean, weekNumberCalculation: identity, weekNumbers: Boolean, weekNumberClassNames: identity, weekNumberContent: identity, weekNumberDidMount: identity, weekNumberWillUnmount: identity, editable: Boolean, viewClassNames: identity, viewDidMount: identity, viewWillUnmount: identity, nowIndicator: Boolean, nowIndicatorClassNames: identity, nowIndicatorContent: identity, nowIndicatorDidMount: identity, nowIndicatorWillUnmount: identity, showNonCurrentDates: Boolean, lazyFetching: Boolean, startParam: String, endParam: String, timeZoneParam: String, timeZone: String, locales: identity, locale: identity, themeSystem: String, dragRevertDuration: Number, dragScroll: Boolean, allDayMaintainDuration: Boolean, unselectAuto: Boolean, dropAccept: identity, eventOrder: parseFieldSpecs, eventOrderStrict: Boolean, handleWindowResize: Boolean, windowResizeDelay: Number, longPressDelay: Number, eventDragMinDistance: Number, expandRows: Boolean, height: identity, contentHeight: identity, direction: String, weekNumberFormat: createFormatter, eventResizableFromStart: Boolean, displayEventTime: Boolean, displayEventEnd: Boolean, weekText: String, weekTextLong: String, progressiveEventRendering: Boolean, businessHours: identity, initialDate: identity, now: identity, eventDataTransform: identity, stickyHeaderDates: identity, stickyFooterScrollbar: identity, viewHeight: identity, defaultAllDay: Boolean, eventSourceFailure: identity, eventSourceSuccess: identity, eventDisplay: String, eventStartEditable: Boolean, eventDurationEditable: Boolean, eventOverlap: identity, eventConstraint: identity, eventAllow: identity, eventBackgroundColor: String, eventBorderColor: String, eventTextColor: String, eventColor: String, eventClassNames: identity, eventContent: identity, eventDidMount: identity, eventWillUnmount: identity, selectConstraint: identity, selectOverlap: identity, selectAllow: identity, droppable: Boolean, unselectCancel: String, slotLabelFormat: identity, slotLaneClassNames: identity, slotLaneContent: identity, slotLaneDidMount: identity, slotLaneWillUnmount: identity, slotLabelClassNames: identity, slotLabelContent: identity, slotLabelDidMount: identity, slotLabelWillUnmount: identity, dayMaxEvents: identity, dayMaxEventRows: identity, dayMinWidth: Number, slotLabelInterval: createDuration, allDayText: String, allDayClassNames: identity, allDayContent: identity, allDayDidMount: identity, allDayWillUnmount: identity, slotMinWidth: Number, navLinks: Boolean, eventTimeFormat: createFormatter, rerenderDelay: Number, moreLinkText: identity, moreLinkHint: identity, selectMinDistance: Number, selectable: Boolean, selectLongPressDelay: Number, eventLongPressDelay: Number, selectMirror: Boolean, eventMaxStack: Number, eventMinHeight: Number, eventMinWidth: Number, eventShortHeight: Number, slotEventOverlap: Boolean, plugins: identity, firstDay: Number, dayCount: Number, dateAlignment: String, dateIncrement: createDuration, hiddenDays: identity, monthMode: Boolean, fixedWeekCount: Boolean, validRange: identity, visibleRange: identity, titleFormat: identity, eventInteractive: Boolean, // only used by list-view, but languages define the value, so we need it in base options noEventsText: String, viewHint: identity, navLinkHint: identity, closeHint: String, timeHint: String, eventHint: String, moreLinkClick: identity, moreLinkClassNames: identity, moreLinkContent: identity, moreLinkDidMount: identity, moreLinkWillUnmount: identity }; // do NOT give a type here. need `typeof BASE_OPTION_DEFAULTS` to give real results. // raw values. var BASE_OPTION_DEFAULTS = { eventDisplay: 'auto', defaultRangeSeparator: ' - ', titleRangeSeparator: " \u2013 ", defaultTimedEventDuration: '01:00:00', defaultAllDayEventDuration: { day: 1 }, forceEventDuration: false, nextDayThreshold: '00:00:00', dayHeaders: true, initialView: '', aspectRatio: 1.35, headerToolbar: { start: 'title', center: '', end: 'today prev,next' }, weekends: true, weekNumbers: false, weekNumberCalculation: 'local', editable: false, nowIndicator: false, scrollTime: '06:00:00', scrollTimeReset: true, slotMinTime: '00:00:00', slotMaxTime: '24:00:00', showNonCurrentDates: true, lazyFetching: true, startParam: 'start', endParam: 'end', timeZoneParam: 'timeZone', timeZone: 'local', locales: [], locale: '', themeSystem: 'standard', dragRevertDuration: 500, dragScroll: true, allDayMaintainDuration: false, unselectAuto: true, dropAccept: '*', eventOrder: 'start,-duration,allDay,title', dayPopoverFormat: { month: 'long', day: 'numeric', year: 'numeric' }, handleWindowResize: true, windowResizeDelay: 100, longPressDelay: 1000, eventDragMinDistance: 5, expandRows: false, navLinks: false, selectable: false, eventMinHeight: 15, eventMinWidth: 30, eventShortHeight: 30 }; // calendar listeners // ------------------ var CALENDAR_LISTENER_REFINERS = { datesSet: identity, eventsSet: identity, eventAdd: identity, eventChange: identity, eventRemove: identity, windowResize: identity, eventClick: identity, eventMouseEnter: identity, eventMouseLeave: identity, select: identity, unselect: identity, loading: identity, // internal _unmount: identity, _beforeprint: identity, _afterprint: identity, _noEventDrop: identity, _noEventResize: identity, _resize: identity, _scrollRequest: identity }; // calendar-specific options // ------------------------- var CALENDAR_OPTION_REFINERS = { buttonText: identity, buttonHints: identity, views: identity, plugins: identity, initialEvents: identity, events: identity, eventSources: identity }; var COMPLEX_OPTION_COMPARATORS = { headerToolbar: isMaybeObjectsEqual, footerToolbar: isMaybeObjectsEqual, buttonText: isMaybeObjectsEqual, buttonHints: isMaybeObjectsEqual, buttonIcons: isMaybeObjectsEqual, dateIncrement: isMaybeObjectsEqual }; function isMaybeObjectsEqual(a, b) { if (_typeof(a) === 'object' && _typeof(b) === 'object' && a && b) { // both non-null objects return isPropsEqual(a, b); } return a === b; } // view-specific options // --------------------- var VIEW_OPTION_REFINERS = { type: String, component: identity, buttonText: String, buttonTextKey: String, dateProfileGeneratorClass: identity, usesMinMaxTime: Boolean, classNames: identity, content: identity, didMount: identity, willUnmount: identity }; // util funcs // ---------------------------------------------------------------------------------------------------- function mergeRawOptions(optionSets) { return mergeProps(optionSets, COMPLEX_OPTION_COMPARATORS); } function refineProps(input, refiners) { var refined = {}; var extra = {}; for (var propName in refiners) { if (propName in input) { refined[propName] = refiners[propName](input[propName]); } } for (var propName in input) { if (!(propName in refiners)) { extra[propName] = input[propName]; } } return { refined: refined, extra: extra }; } function identity(raw) { return raw; } function parseEvents(rawEvents, eventSource, context, allowOpenRange) { var eventStore = createEmptyEventStore(); var eventRefiners = buildEventRefiners(context); for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) { var rawEvent = rawEvents_1[_i]; var tuple = parseEvent(rawEvent, eventSource, context, allowOpenRange, eventRefiners); if (tuple) { eventTupleToStore(tuple, eventStore); } } return eventStore; } function eventTupleToStore(tuple, eventStore) { if (eventStore === void 0) { eventStore = createEmptyEventStore(); } eventStore.defs[tuple.def.defId] = tuple.def; if (tuple.instance) { eventStore.instances[tuple.instance.instanceId] = tuple.instance; } return eventStore; } // retrieves events that have the same groupId as the instance specified by `instanceId` // or they are the same as the instance. // why might instanceId not be in the store? an event from another calendar? function getRelevantEvents(eventStore, instanceId) { var instance = eventStore.instances[instanceId]; if (instance) { var def_1 = eventStore.defs[instance.defId]; // get events/instances with same group var newStore = filterEventStoreDefs(eventStore, function (lookDef) { return isEventDefsGrouped(def_1, lookDef); }); // add the original // TODO: wish we could use eventTupleToStore or something like it newStore.defs[def_1.defId] = def_1; newStore.instances[instance.instanceId] = instance; return newStore; } return createEmptyEventStore(); } function isEventDefsGrouped(def0, def1) { return Boolean(def0.groupId && def0.groupId === def1.groupId); } function createEmptyEventStore() { return { defs: {}, instances: {} }; } function mergeEventStores(store0, store1) { return { defs: tslib.__assign(tslib.__assign({}, store0.defs), store1.defs), instances: tslib.__assign(tslib.__assign({}, store0.instances), store1.instances) }; } function filterEventStoreDefs(eventStore, filterFunc) { var defs = filterHash(eventStore.defs, filterFunc); var instances = filterHash(eventStore.instances, function (instance) { return defs[instance.defId] // still exists? ; }); return { defs: defs, instances: instances }; } function excludeSubEventStore(master, sub) { var defs = master.defs, instances = master.instances; var filteredDefs = {}; var filteredInstances = {}; for (var defId in defs) { if (!sub.defs[defId]) { // not explicitly excluded filteredDefs[defId] = defs[defId]; } } for (var instanceId in instances) { if (!sub.instances[instanceId] && // not explicitly excluded filteredDefs[instances[instanceId].defId] // def wasn't filtered away ) { filteredInstances[instanceId] = instances[instanceId]; } } return { defs: filteredDefs, instances: filteredInstances }; } function normalizeConstraint(input, context) { if (Array.isArray(input)) { return parseEvents(input, null, context, true); // allowOpenRange=true } if (_typeof(input) === 'object' && input) { // non-null object return parseEvents([input], null, context, true); // allowOpenRange=true } if (input != null) { return String(input); } return null; } function parseClassNames(raw) { if (Array.isArray(raw)) { return raw; } if (typeof raw === 'string') { return raw.split(/\s+/); } return []; } // TODO: better called "EventSettings" or "EventConfig" // TODO: move this file into structs // TODO: separate constraint/overlap/allow, because selection uses only that, not other props var EVENT_UI_REFINERS = { display: String, editable: Boolean, startEditable: Boolean, durationEditable: Boolean, constraint: identity, overlap: identity, allow: identity, className: parseClassNames, classNames: parseClassNames, color: String, backgroundColor: String, borderColor: String, textColor: String }; var EMPTY_EVENT_UI = { display: null, startEditable: null, durationEditable: null, constraints: [], overlap: null, allows: [], backgroundColor: '', borderColor: '', textColor: '', classNames: [] }; function createEventUi(refined, context) { var constraint = normalizeConstraint(refined.constraint, context); return { display: refined.display || null, startEditable: refined.startEditable != null ? refined.startEditable : refined.editable, durationEditable: refined.durationEditable != null ? refined.durationEditable : refined.editable, constraints: constraint != null ? [constraint] : [], overlap: refined.overlap != null ? refined.overlap : null, allows: refined.allow != null ? [refined.allow] : [], backgroundColor: refined.backgroundColor || refined.color || '', borderColor: refined.borderColor || refined.color || '', textColor: refined.textColor || '', classNames: (refined.className || []).concat(refined.classNames || []) // join singular and plural }; } // TODO: prevent against problems with <2 args! function combineEventUis(uis) { return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI); } function combineTwoEventUis(item0, item1) { return { display: item1.display != null ? item1.display : item0.display, startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable, durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable, constraints: item0.constraints.concat(item1.constraints), overlap: typeof item1.overlap === 'boolean' ? item1.overlap : item0.overlap, allows: item0.allows.concat(item1.allows), backgroundColor: item1.backgroundColor || item0.backgroundColor, borderColor: item1.borderColor || item0.borderColor, textColor: item1.textColor || item0.textColor, classNames: item0.classNames.concat(item1.classNames) }; } var EVENT_NON_DATE_REFINERS = { id: String, groupId: String, title: String, url: String, interactive: Boolean }; var EVENT_DATE_REFINERS = { start: identity, end: identity, date: identity, allDay: Boolean }; var EVENT_REFINERS = tslib.__assign(tslib.__assign(tslib.__assign({}, EVENT_NON_DATE_REFINERS), EVENT_DATE_REFINERS), { extendedProps: identity }); function parseEvent(raw, eventSource, context, allowOpenRange, refiners) { if (refiners === void 0) { refiners = buildEventRefiners(context); } var _a = refineEventDef(raw, context, refiners), refined = _a.refined, extra = _a.extra; var defaultAllDay = computeIsDefaultAllDay(eventSource, context); var recurringRes = parseRecurring(refined, defaultAllDay, context.dateEnv, context.pluginHooks.recurringTypes); if (recurringRes) { var def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', recurringRes.allDay, Boolean(recurringRes.duration), context); def.recurringDef = { typeId: recurringRes.typeId, typeData: recurringRes.typeData, duration: recurringRes.duration }; return { def: def, instance: null }; } var singleRes = parseSingle(refined, defaultAllDay, context, allowOpenRange); if (singleRes) { var def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', singleRes.allDay, singleRes.hasEnd, context); var instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo); return { def: def, instance: instance }; } return null; } function refineEventDef(raw, context, refiners) { if (refiners === void 0) { refiners = buildEventRefiners(context); } return refineProps(raw, refiners); } function buildEventRefiners(context) { return tslib.__assign(tslib.__assign(tslib.__assign({}, EVENT_UI_REFINERS), EVENT_REFINERS), context.pluginHooks.eventRefiners); } /* Will NOT populate extendedProps with the leftover properties. Will NOT populate date-related props. */ function parseEventDef(refined, extra, sourceId, allDay, hasEnd, context) { var def = { title: refined.title || '', groupId: refined.groupId || '', publicId: refined.id || '', url: refined.url || '', recurringDef: null, defId: guid(), sourceId: sourceId, allDay: allDay, hasEnd: hasEnd, interactive: refined.interactive, ui: createEventUi(refined, context), extendedProps: tslib.__assign(tslib.__assign({}, refined.extendedProps || {}), extra) }; for (var _i = 0, _a = context.pluginHooks.eventDefMemberAdders; _i < _a.length; _i++) { var memberAdder = _a[_i]; tslib.__assign(def, memberAdder(refined)); } // help out EventApi from having user modify props Object.freeze(def.ui.classNames); Object.freeze(def.extendedProps); return def; } function parseSingle(refined, defaultAllDay, context, allowOpenRange) { var allDay = refined.allDay; var startMeta; var startMarker = null; var hasEnd = false; var endMeta; var endMarker = null; var startInput = refined.start != null ? refined.start : refined.date; startMeta = context.dateEnv.createMarkerMeta(startInput); if (startMeta) { startMarker = startMeta.marker; } else if (!allowOpenRange) { return null; } if (refined.end != null) { endMeta = context.dateEnv.createMarkerMeta(refined.end); } if (allDay == null) { if (defaultAllDay != null) { allDay = defaultAllDay; } else { // fall back to the date props LAST allDay = (!startMeta || startMeta.isTimeUnspecified) && (!endMeta || endMeta.isTimeUnspecified); } } if (allDay && startMarker) { startMarker = startOfDay(startMarker); } if (endMeta) { endMarker = endMeta.marker; if (allDay) { endMarker = startOfDay(endMarker); } if (startMarker && endMarker <= startMarker) { endMarker = null; } } if (endMarker) { hasEnd = true; } else if (!allowOpenRange) { hasEnd = context.options.forceEventDuration || false; endMarker = context.dateEnv.add(startMarker, allDay ? context.options.defaultAllDayEventDuration : context.options.defaultTimedEventDuration); } return { allDay: allDay, hasEnd: hasEnd, range: { start: startMarker, end: endMarker }, forcedStartTzo: startMeta ? startMeta.forcedTzo : null, forcedEndTzo: endMeta ? endMeta.forcedTzo : null }; } function computeIsDefaultAllDay(eventSource, context) { var res = null; if (eventSource) { res = eventSource.defaultAllDay; } if (res == null) { res = context.options.defaultAllDay; } return res; } /* Date stuff that doesn't belong in datelib core ----------------------------------------------------------------------------------------------------------------------*/ // given a timed range, computes an all-day range that has the same exact duration, // but whose start time is aligned with the start of the day. function computeAlignedDayRange(timedRange) { var dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1; var start = startOfDay(timedRange.start); var end = addDays(start, dayCnt); return { start: start, end: end }; } // given a timed range, computes an all-day range based on how for the end date bleeds into the next day // TODO: give nextDayThreshold a default arg function computeVisibleDayRange(timedRange, nextDayThreshold) { if (nextDayThreshold === void 0) { nextDayThreshold = createDuration(0); } var startDay = null; var endDay = null; if (timedRange.end) { endDay = startOfDay(timedRange.end); var endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); // # of milliseconds into `endDay` // If the end time is actually inclusively part of the next day and is equal to or // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`. // Otherwise, leaving it as inclusive will cause it to exclude `endDay`. if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) { endDay = addDays(endDay, 1); } } if (timedRange.start) { startDay = startOfDay(timedRange.start); // the beginning of the day the range starts // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day. if (endDay && endDay <= startDay) { endDay = addDays(startDay, 1); } } return { start: startDay, end: endDay }; } // spans from one day into another? function isMultiDayRange(range) { var visibleRange = computeVisibleDayRange(range); return diffDays(visibleRange.start, visibleRange.end) > 1; } function diffDates(date0, date1, dateEnv, largeUnit) { if (largeUnit === 'year') { return createDuration(dateEnv.diffWholeYears(date0, date1), 'year'); } if (largeUnit === 'month') { return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month'); } return diffDayAndTime(date0, date1); // returns a duration } function parseRange(input, dateEnv) { var start = null; var end = null; if (input.start) { start = dateEnv.createMarker(input.start); } if (input.end) { end = dateEnv.createMarker(input.end); } if (!start && !end) { return null; } if (start && end && end < start) { return null; } return { start: start, end: end }; } // SIDE-EFFECT: will mutate ranges. // Will return a new array result. function invertRanges(ranges, constraintRange) { var invertedRanges = []; var start = constraintRange.start; // the end of the previous range. the start of the new range var i; var dateRange; // ranges need to be in order. required for our date-walking algorithm ranges.sort(compareRanges); for (i = 0; i < ranges.length; i += 1) { dateRange = ranges[i]; // add the span of time before the event (if there is any) if (dateRange.start > start) { // compare millisecond time (skip any ambig logic) invertedRanges.push({ start: start, end: dateRange.start }); } if (dateRange.end > start) { start = dateRange.end; } } // add the span of time after the last event (if there is any) if (start < constraintRange.end) { // compare millisecond time (skip any ambig logic) invertedRanges.push({ start: start, end: constraintRange.end }); } return invertedRanges; } function compareRanges(range0, range1) { return range0.start.valueOf() - range1.start.valueOf(); // earlier ranges go first } function intersectRanges(range0, range1) { var start = range0.start, end = range0.end; var newRange = null; if (range1.start !== null) { if (start === null) { start = range1.start; } else { start = new Date(Math.max(start.valueOf(), range1.start.valueOf())); } } if (range1.end != null) { if (end === null) { end = range1.end; } else { end = new Date(Math.min(end.valueOf(), range1.end.valueOf())); } } if (start === null || end === null || start < end) { newRange = { start: start, end: end }; } return newRange; } function rangesEqual(range0, range1) { return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) && (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf()); } function rangesIntersect(range0, range1) { return (range0.end === null || range1.start === null || range0.end > range1.start) && (range0.start === null || range1.end === null || range0.start < range1.end); } function rangeContainsRange(outerRange, innerRange) { return (outerRange.start === null || innerRange.start !== null && innerRange.start >= outerRange.start) && (outerRange.end === null || innerRange.end !== null && innerRange.end <= outerRange.end); } function rangeContainsMarker(range, date) { return (range.start === null || date >= range.start) && (range.end === null || date < range.end); } // If the given date is not within the given range, move it inside. // (If it's past the end, make it one millisecond before the end). function constrainMarkerToRange(date, range) { if (range.start != null && date < range.start) { return range.start; } if (range.end != null && date >= range.end) { return new Date(range.end.valueOf() - 1); } return date; } /* Specifying nextDayThreshold signals that all-day ranges should be sliced. */ function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) { var inverseBgByGroupId = {}; var inverseBgByDefId = {}; var defByGroupId = {}; var bgRanges = []; var fgRanges = []; var eventUis = compileEventUis(eventStore.defs, eventUiBases); for (var defId in eventStore.defs) { var def = eventStore.defs[defId]; var ui = eventUis[def.defId]; if (ui.display === 'inverse-background') { if (def.groupId) { inverseBgByGroupId[def.groupId] = []; if (!defByGroupId[def.groupId]) { defByGroupId[def.groupId] = def; } } else { inverseBgByDefId[defId] = []; } } } for (var instanceId in eventStore.instances) { var instance = eventStore.instances[instanceId]; var def = eventStore.defs[instance.defId]; var ui = eventUis[def.defId]; var origRange = instance.range; var normalRange = !def.allDay && nextDayThreshold ? computeVisibleDayRange(origRange, nextDayThreshold) : origRange; var slicedRange = intersectRanges(normalRange, framingRange); if (slicedRange) { if (ui.display === 'inverse-background') { if (def.groupId) { inverseBgByGroupId[def.groupId].push(slicedRange); } else { inverseBgByDefId[instance.defId].push(slicedRange); } } else if (ui.display !== 'none') { (ui.display === 'background' ? bgRanges : fgRanges).push({ def: def, ui: ui, instance: instance, range: slicedRange, isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(), isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf() }); } } } for (var groupId in inverseBgByGroupId) { // BY GROUP var ranges = inverseBgByGroupId[groupId]; var invertedRanges = invertRanges(ranges, framingRange); for (var _i = 0, invertedRanges_1 = invertedRanges; _i < invertedRanges_1.length; _i++) { var invertedRange = invertedRanges_1[_i]; var def = defByGroupId[groupId]; var ui = eventUis[def.defId]; bgRanges.push({ def: def, ui: ui, instance: null, range: invertedRange, isStart: false, isEnd: false }); } } for (var defId in inverseBgByDefId) { var ranges = inverseBgByDefId[defId]; var invertedRanges = invertRanges(ranges, framingRange); for (var _a = 0, invertedRanges_2 = invertedRanges; _a < invertedRanges_2.length; _a++) { var invertedRange = invertedRanges_2[_a]; bgRanges.push({ def: eventStore.defs[defId], ui: eventUis[defId], instance: null, range: invertedRange, isStart: false, isEnd: false }); } } return { bg: bgRanges, fg: fgRanges }; } function hasBgRendering(def) { return def.ui.display === 'background' || def.ui.display === 'inverse-background'; } function setElSeg(el, seg) { el.fcSeg = seg; } function getElSeg(el) { return el.fcSeg || el.parentNode.fcSeg || // for the harness null; } // event ui computation function compileEventUis(eventDefs, eventUiBases) { return mapHash(eventDefs, function (eventDef) { return compileEventUi(eventDef, eventUiBases); }); } function compileEventUi(eventDef, eventUiBases) { var uis = []; if (eventUiBases['']) { uis.push(eventUiBases['']); } if (eventUiBases[eventDef.defId]) { uis.push(eventUiBases[eventDef.defId]); } uis.push(eventDef.ui); return combineEventUis(uis); } function sortEventSegs(segs, eventOrderSpecs) { var objs = segs.map(buildSegCompareObj); objs.sort(function (obj0, obj1) { return compareByFieldSpecs(obj0, obj1, eventOrderSpecs); }); return objs.map(function (c) { return c._seg; }); } // returns a object with all primitive props that can be compared function buildSegCompareObj(seg) { var eventRange = seg.eventRange; var eventDef = eventRange.def; var range = eventRange.instance ? eventRange.instance.range : eventRange.range; var start = range.start ? range.start.valueOf() : 0; // TODO: better support for open-range events var end = range.end ? range.end.valueOf() : 0; // " return tslib.__assign(tslib.__assign(tslib.__assign({}, eventDef.extendedProps), eventDef), { id: eventDef.publicId, start: start, end: end, duration: end - start, allDay: Number(eventDef.allDay), _seg: seg }); } function computeSegDraggable(seg, context) { var pluginHooks = context.pluginHooks; var transformers = pluginHooks.isDraggableTransformers; var _a = seg.eventRange, def = _a.def, ui = _a.ui; var val = ui.startEditable; for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) { var transformer = transformers_1[_i]; val = transformer(val, def, ui, context); } return val; } function computeSegStartResizable(seg, context) { return seg.isStart && seg.eventRange.ui.durationEditable && context.options.eventResizableFromStart; } function computeSegEndResizable(seg, context) { return seg.isEnd && seg.eventRange.ui.durationEditable; } function buildSegTimeText(seg, timeFormat, context, defaultDisplayEventTime, // defaults to true defaultDisplayEventEnd, // defaults to true startOverride, endOverride) { var dateEnv = context.dateEnv, options = context.options; var displayEventTime = options.displayEventTime, displayEventEnd = options.displayEventEnd; var eventDef = seg.eventRange.def; var eventInstance = seg.eventRange.instance; if (displayEventTime == null) { displayEventTime = defaultDisplayEventTime !== false; } if (displayEventEnd == null) { displayEventEnd = defaultDisplayEventEnd !== false; } var wholeEventStart = eventInstance.range.start; var wholeEventEnd = eventInstance.range.end; var segStart = startOverride || seg.start || seg.eventRange.range.start; var segEnd = endOverride || seg.end || seg.eventRange.range.end; var isStartDay = startOfDay(wholeEventStart).valueOf() === startOfDay(segStart).valueOf(); var isEndDay = startOfDay(addMs(wholeEventEnd, -1)).valueOf() === startOfDay(addMs(segEnd, -1)).valueOf(); if (displayEventTime && !eventDef.allDay && (isStartDay || isEndDay)) { segStart = isStartDay ? wholeEventStart : segStart; segEnd = isEndDay ? wholeEventEnd : segEnd; if (displayEventEnd && eventDef.hasEnd) { return dateEnv.formatRange(segStart, segEnd, timeFormat, { forcedStartTzo: startOverride ? null : eventInstance.forcedStartTzo, forcedEndTzo: endOverride ? null : eventInstance.forcedEndTzo }); } return dateEnv.format(segStart, timeFormat, { forcedTzo: startOverride ? null : eventInstance.forcedStartTzo // nooooo, same }); } return ''; } function getSegMeta(seg, todayRange, nowDate) { var segRange = seg.eventRange.range; return { isPast: segRange.end < (nowDate || todayRange.start), isFuture: segRange.start >= (nowDate || todayRange.end), isToday: todayRange && rangeContainsMarker(todayRange, segRange.start) }; } function getEventClassNames(props) { var classNames = ['fc-event']; if (props.isMirror) { classNames.push('fc-event-mirror'); } if (props.isDraggable) { classNames.push('fc-event-draggable'); } if (props.isStartResizable || props.isEndResizable) { classNames.push('fc-event-resizable'); } if (props.isDragging) { classNames.push('fc-event-dragging'); } if (props.isResizing) { classNames.push('fc-event-resizing'); } if (props.isSelected) { classNames.push('fc-event-selected'); } if (props.isStart) { classNames.push('fc-event-start'); } if (props.isEnd) { classNames.push('fc-event-end'); } if (props.isPast) { classNames.push('fc-event-past'); } if (props.isToday) { classNames.push('fc-event-today'); } if (props.isFuture) { classNames.push('fc-event-future'); } return classNames; } function buildEventRangeKey(eventRange) { return eventRange.instance ? eventRange.instance.instanceId : eventRange.def.defId + ":" + eventRange.range.start.toISOString(); // inverse-background events don't have specific instances. TODO: better solution } function getSegAnchorAttrs(seg, context) { var _a = seg.eventRange, def = _a.def, instance = _a.instance; var url = def.url; if (url) { return { href: url }; } var emitter = context.emitter, options = context.options; var eventInteractive = options.eventInteractive; if (eventInteractive == null) { eventInteractive = def.interactive; if (eventInteractive == null) { eventInteractive = Boolean(emitter.hasHandlers('eventClick')); } } // mock what happens in EventClicking if (eventInteractive) { // only attach keyboard-related handlers because click handler is already done in EventClicking return createAriaKeyboardAttrs(function (ev) { emitter.trigger('eventClick', { el: ev.target, event: new EventApi(context, def, instance), jsEvent: ev, view: context.viewApi }); }); } return {}; } var STANDARD_PROPS = { start: identity, end: identity, allDay: Boolean }; function parseDateSpan(raw, dateEnv, defaultDuration) { var span = parseOpenDateSpan(raw, dateEnv); var range = span.range; if (!range.start) { return null; } if (!range.end) { if (defaultDuration == null) { return null; } range.end = dateEnv.add(range.start, defaultDuration); } return span; } /* TODO: somehow combine with parseRange? Will return null if the start/end props were present but parsed invalidly. */ function parseOpenDateSpan(raw, dateEnv) { var _a = refineProps(raw, STANDARD_PROPS), standardProps = _a.refined, extra = _a.extra; var startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null; var endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null; var allDay = standardProps.allDay; if (allDay == null) { allDay = startMeta && startMeta.isTimeUnspecified && (!endMeta || endMeta.isTimeUnspecified); } return tslib.__assign({ range: { start: startMeta ? startMeta.marker : null, end: endMeta ? endMeta.marker : null }, allDay: allDay }, extra); } function isDateSpansEqual(span0, span1) { return rangesEqual(span0.range, span1.range) && span0.allDay === span1.allDay && isSpanPropsEqual(span0, span1); } // the NON-DATE-RELATED props function isSpanPropsEqual(span0, span1) { for (var propName in span1) { if (propName !== 'range' && propName !== 'allDay') { if (span0[propName] !== span1[propName]) { return false; } } } // are there any props that span0 has that span1 DOESN'T have? // both have range/allDay, so no need to special-case. for (var propName in span0) { if (!(propName in span1)) { return false; } } return true; } function buildDateSpanApi(span, dateEnv) { return tslib.__assign(tslib.__assign({}, buildRangeApi(span.range, dateEnv, span.allDay)), { allDay: span.allDay }); } function buildRangeApiWithTimeZone(range, dateEnv, omitTime) { return tslib.__assign(tslib.__assign({}, buildRangeApi(range, dateEnv, omitTime)), { timeZone: dateEnv.timeZone }); } function buildRangeApi(range, dateEnv, omitTime) { return { start: dateEnv.toDate(range.start), end: dateEnv.toDate(range.end), startStr: dateEnv.formatIso(range.start, { omitTime: omitTime }), endStr: dateEnv.formatIso(range.end, { omitTime: omitTime }) }; } function fabricateEventRange(dateSpan, eventUiBases, context) { var res = refineEventDef({ editable: false }, context); var def = parseEventDef(res.refined, res.extra, '', // sourceId dateSpan.allDay, true, // hasEnd context); return { def: def, ui: compileEventUi(def, eventUiBases), instance: createEventInstance(def.defId, dateSpan.range), range: dateSpan.range, isStart: true, isEnd: true }; } function triggerDateSelect(selection, pev, context) { context.emitter.trigger('select', tslib.__assign(tslib.__assign({}, buildDateSpanApiWithContext(selection, context)), { jsEvent: pev ? pev.origEvent : null, view: context.viewApi || context.calendarApi.view })); } function triggerDateUnselect(pev, context) { context.emitter.trigger('unselect', { jsEvent: pev ? pev.origEvent : null, view: context.viewApi || context.calendarApi.view }); } function buildDateSpanApiWithContext(dateSpan, context) { var props = {}; for (var _i = 0, _a = context.pluginHooks.dateSpanTransforms; _i < _a.length; _i++) { var transform = _a[_i]; tslib.__assign(props, transform(dateSpan, context)); } tslib.__assign(props, buildDateSpanApi(dateSpan, context.dateEnv)); return props; } // Given an event's allDay status and start date, return what its fallback end date should be. // TODO: rename to computeDefaultEventEnd function getDefaultEventEnd(allDay, marker, context) { var dateEnv = context.dateEnv, options = context.options; var end = marker; if (allDay) { end = startOfDay(end); end = dateEnv.add(end, options.defaultAllDayEventDuration); } else { end = dateEnv.add(end, options.defaultTimedEventDuration); } return end; } // applies the mutation to ALL defs/instances within the event store function applyMutationToEventStore(eventStore, eventConfigBase, mutation, context) { var eventConfigs = compileEventUis(eventStore.defs, eventConfigBase); var dest = createEmptyEventStore(); for (var defId in eventStore.defs) { var def = eventStore.defs[defId]; dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, context); } for (var instanceId in eventStore.instances) { var instance = eventStore.instances[instanceId]; var def = dest.defs[instance.defId]; // important to grab the newly modified def dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, context); } return dest; } function applyMutationToEventDef(eventDef, eventConfig, mutation, context) { var standardProps = mutation.standardProps || {}; // if hasEnd has not been specified, guess a good value based on deltas. // if duration will change, there's no way the default duration will persist, // and thus, we need to mark the event as having a real end if (standardProps.hasEnd == null && eventConfig.durationEditable && (mutation.startDelta || mutation.endDelta)) { standardProps.hasEnd = true; // TODO: is this mutation okay? } var copy = tslib.__assign(tslib.__assign(tslib.__assign({}, eventDef), standardProps), { ui: tslib.__assign(tslib.__assign({}, eventDef.ui), standardProps.ui) }); if (mutation.extendedProps) { copy.extendedProps = tslib.__assign(tslib.__assign({}, copy.extendedProps), mutation.extendedProps); } for (var _i = 0, _a = context.pluginHooks.eventDefMutationAppliers; _i < _a.length; _i++) { var applier = _a[_i]; applier(copy, mutation, context); } if (!copy.hasEnd && context.options.forceEventDuration) { copy.hasEnd = true; } return copy; } function applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef eventConfig, mutation, context) { var dateEnv = context.dateEnv; var forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true; var clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false; var copy = tslib.__assign({}, eventInstance); if (forceAllDay) { copy.range = computeAlignedDayRange(copy.range); } if (mutation.datesDelta && eventConfig.startEditable) { copy.range = { start: dateEnv.add(copy.range.start, mutation.datesDelta), end: dateEnv.add(copy.range.end, mutation.datesDelta) }; } if (mutation.startDelta && eventConfig.durationEditable) { copy.range = { start: dateEnv.add(copy.range.start, mutation.startDelta), end: copy.range.end }; } if (mutation.endDelta && eventConfig.durationEditable) { copy.range = { start: copy.range.start, end: dateEnv.add(copy.range.end, mutation.endDelta) }; } if (clearEnd) { copy.range = { start: copy.range.start, end: getDefaultEventEnd(eventDef.allDay, copy.range.start, context) }; } // in case event was all-day but the supplied deltas were not // better util for this? if (eventDef.allDay) { copy.range = { start: startOfDay(copy.range.start), end: startOfDay(copy.range.end) }; } // handle invalid durations if (copy.range.end < copy.range.start) { copy.range.end = getDefaultEventEnd(eventDef.allDay, copy.range.start, context); } return copy; } // no public types yet. when there are, export from: // import {} from './api-type-deps' var ViewApi = /** @class */ function () { function ViewApi(type, getCurrentData, dateEnv) { this.type = type; this.getCurrentData = getCurrentData; this.dateEnv = dateEnv; } Object.defineProperty(ViewApi.prototype, "calendar", { get: function get() { return this.getCurrentData().calendarApi; }, enumerable: false, configurable: true }); Object.defineProperty(ViewApi.prototype, "title", { get: function get() { return this.getCurrentData().viewTitle; }, enumerable: false, configurable: true }); Object.defineProperty(ViewApi.prototype, "activeStart", { get: function get() { return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start); }, enumerable: false, configurable: true }); Object.defineProperty(ViewApi.prototype, "activeEnd", { get: function get() { return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end); }, enumerable: false, configurable: true }); Object.defineProperty(ViewApi.prototype, "currentStart", { get: function get() { return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start); }, enumerable: false, configurable: true }); Object.defineProperty(ViewApi.prototype, "currentEnd", { get: function get() { return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end); }, enumerable: false, configurable: true }); ViewApi.prototype.getOption = function (name) { return this.getCurrentData().options[name]; // are the view-specific options }; return ViewApi; }(); var EVENT_SOURCE_REFINERS = { id: String, defaultAllDay: Boolean, url: String, format: String, events: identity, eventDataTransform: identity, // for any network-related sources success: identity, failure: identity }; function parseEventSource(raw, context, refiners) { if (refiners === void 0) { refiners = buildEventSourceRefiners(context); } var rawObj; if (typeof raw === 'string') { rawObj = { url: raw }; } else if (typeof raw === 'function' || Array.isArray(raw)) { rawObj = { events: raw }; } else if (_typeof(raw) === 'object' && raw) { // not null rawObj = raw; } if (rawObj) { var _a = refineProps(rawObj, refiners), refined = _a.refined, extra = _a.extra; var metaRes = buildEventSourceMeta(refined, context); if (metaRes) { return { _raw: raw, isFetching: false, latestFetchId: '', fetchRange: null, defaultAllDay: refined.defaultAllDay, eventDataTransform: refined.eventDataTransform, success: refined.success, failure: refined.failure, publicId: refined.id || '', sourceId: guid(), sourceDefId: metaRes.sourceDefId, meta: metaRes.meta, ui: createEventUi(refined, context), extendedProps: extra }; } } return null; } function buildEventSourceRefiners(context) { return tslib.__assign(tslib.__assign(tslib.__assign({}, EVENT_UI_REFINERS), EVENT_SOURCE_REFINERS), context.pluginHooks.eventSourceRefiners); } function buildEventSourceMeta(raw, context) { var defs = context.pluginHooks.eventSourceDefs; for (var i = defs.length - 1; i >= 0; i -= 1) { // later-added plugins take precedence var def = defs[i]; var meta = def.parseMeta(raw); if (meta) { return { sourceDefId: i, meta: meta }; } } return null; } function reduceCurrentDate(currentDate, action) { switch (action.type) { case 'CHANGE_DATE': return action.dateMarker; default: return currentDate; } } function getInitialDate(options, dateEnv) { var initialDateInput = options.initialDate; // compute the initial ambig-timezone date if (initialDateInput != null) { return dateEnv.createMarker(initialDateInput); } return getNow(options.now, dateEnv); // getNow already returns unzoned } function getNow(nowInput, dateEnv) { if (typeof nowInput === 'function') { nowInput = nowInput(); } if (nowInput == null) { return dateEnv.createNowMarker(); } return dateEnv.createMarker(nowInput); } var CalendarApi = /** @class */ function () { function CalendarApi() {} CalendarApi.prototype.getCurrentData = function () { return this.currentDataManager.getCurrentData(); }; CalendarApi.prototype.dispatch = function (action) { return this.currentDataManager.dispatch(action); }; Object.defineProperty(CalendarApi.prototype, "view", { get: function get() { return this.getCurrentData().viewApi; } // for public API , enumerable: false, configurable: true }); CalendarApi.prototype.batchRendering = function (callback) { callback(); }; CalendarApi.prototype.updateSize = function () { this.trigger('_resize', true); }; // Options // ----------------------------------------------------------------------------------------------------------------- CalendarApi.prototype.setOption = function (name, val) { this.dispatch({ type: 'SET_OPTION', optionName: name, rawOptionValue: val }); }; CalendarApi.prototype.getOption = function (name) { return this.currentDataManager.currentCalendarOptionsInput[name]; }; CalendarApi.prototype.getAvailableLocaleCodes = function () { return Object.keys(this.getCurrentData().availableRawLocales); }; // Trigger // ----------------------------------------------------------------------------------------------------------------- CalendarApi.prototype.on = function (handlerName, handler) { var currentDataManager = this.currentDataManager; if (currentDataManager.currentCalendarOptionsRefiners[handlerName]) { currentDataManager.emitter.on(handlerName, handler); } else { console.warn("Unknown listener name '" + handlerName + "'"); } }; CalendarApi.prototype.off = function (handlerName, handler) { this.currentDataManager.emitter.off(handlerName, handler); }; // not meant for public use CalendarApi.prototype.trigger = function (handlerName) { var _a; var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } (_a = this.currentDataManager.emitter).trigger.apply(_a, tslib.__spreadArray([handlerName], args)); }; // View // ----------------------------------------------------------------------------------------------------------------- CalendarApi.prototype.changeView = function (viewType, dateOrRange) { var _this = this; this.batchRendering(function () { _this.unselect(); if (dateOrRange) { if (dateOrRange.start && dateOrRange.end) { // a range _this.dispatch({ type: 'CHANGE_VIEW_TYPE', viewType: viewType }); _this.dispatch({ type: 'SET_OPTION', optionName: 'visibleRange', rawOptionValue: dateOrRange }); } else { var dateEnv = _this.getCurrentData().dateEnv; _this.dispatch({ type: 'CHANGE_VIEW_TYPE', viewType: viewType, dateMarker: dateEnv.createMarker(dateOrRange) }); } } else { _this.dispatch({ type: 'CHANGE_VIEW_TYPE', viewType: viewType }); } }); }; // Forces navigation to a view for the given date. // `viewType` can be a specific view name or a generic one like "week" or "day". // needs to change CalendarApi.prototype.zoomTo = function (dateMarker, viewType) { var state = this.getCurrentData(); var spec; viewType = viewType || 'day'; // day is default zoom spec = state.viewSpecs[viewType] || this.getUnitViewSpec(viewType); this.unselect(); if (spec) { this.dispatch({ type: 'CHANGE_VIEW_TYPE', viewType: spec.type, dateMarker: dateMarker }); } else { this.dispatch({ type: 'CHANGE_DATE', dateMarker: dateMarker }); } }; // Given a duration singular unit, like "week" or "day", finds a matching view spec. // Preference is given to views that have corresponding buttons. CalendarApi.prototype.getUnitViewSpec = function (unit) { var _a = this.getCurrentData(), viewSpecs = _a.viewSpecs, toolbarConfig = _a.toolbarConfig; var viewTypes = [].concat(toolbarConfig.header ? toolbarConfig.header.viewsWithButtons : [], toolbarConfig.footer ? toolbarConfig.footer.viewsWithButtons : []); var i; var spec; for (var viewType in viewSpecs) { viewTypes.push(viewType); } for (i = 0; i < viewTypes.length; i += 1) { spec = viewSpecs[viewTypes[i]]; if (spec) { if (spec.singleUnit === unit) { return spec; } } } return null; }; // Current Date // ----------------------------------------------------------------------------------------------------------------- CalendarApi.prototype.prev = function () { this.unselect(); this.dispatch({ type: 'PREV' }); }; CalendarApi.prototype.next = function () { this.unselect(); this.dispatch({ type: 'NEXT' }); }; CalendarApi.prototype.prevYear = function () { var state = this.getCurrentData(); this.unselect(); this.dispatch({ type: 'CHANGE_DATE', dateMarker: state.dateEnv.addYears(state.currentDate, -1) }); }; CalendarApi.prototype.nextYear = function () { var state = this.getCurrentData(); this.unselect(); this.dispatch({ type: 'CHANGE_DATE', dateMarker: state.dateEnv.addYears(state.currentDate, 1) }); }; CalendarApi.prototype.today = function () { var state = this.getCurrentData(); this.unselect(); this.dispatch({ type: 'CHANGE_DATE', dateMarker: getNow(state.calendarOptions.now, state.dateEnv) }); }; CalendarApi.prototype.gotoDate = function (zonedDateInput) { var state = this.getCurrentData(); this.unselect(); this.dispatch({ type: 'CHANGE_DATE', dateMarker: state.dateEnv.createMarker(zonedDateInput) }); }; CalendarApi.prototype.incrementDate = function (deltaInput) { var state = this.getCurrentData(); var delta = createDuration(deltaInput); if (delta) { // else, warn about invalid input? this.unselect(); this.dispatch({ type: 'CHANGE_DATE', dateMarker: state.dateEnv.add(state.currentDate, delta) }); } }; // for external API CalendarApi.prototype.getDate = function () { var state = this.getCurrentData(); return state.dateEnv.toDate(state.currentDate); }; // Date Formatting Utils // ----------------------------------------------------------------------------------------------------------------- CalendarApi.prototype.formatDate = function (d, formatter) { var dateEnv = this.getCurrentData().dateEnv; return dateEnv.format(dateEnv.createMarker(d), createFormatter(formatter)); }; // `settings` is for formatter AND isEndExclusive CalendarApi.prototype.formatRange = function (d0, d1, settings) { var dateEnv = this.getCurrentData().dateEnv; return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings), settings); }; CalendarApi.prototype.formatIso = function (d, omitTime) { var dateEnv = this.getCurrentData().dateEnv; return dateEnv.formatIso(dateEnv.createMarker(d), { omitTime: omitTime }); }; // Date Selection / Event Selection / DayClick // ----------------------------------------------------------------------------------------------------------------- // this public method receives start/end dates in any format, with any timezone // NOTE: args were changed from v3 CalendarApi.prototype.select = function (dateOrObj, endDate) { var selectionInput; if (endDate == null) { if (dateOrObj.start != null) { selectionInput = dateOrObj; } else { selectionInput = { start: dateOrObj, end: null }; } } else { selectionInput = { start: dateOrObj, end: endDate }; } var state = this.getCurrentData(); var selection = parseDateSpan(selectionInput, state.dateEnv, createDuration({ days: 1 })); if (selection) { // throw parse error otherwise? this.dispatch({ type: 'SELECT_DATES', selection: selection }); triggerDateSelect(selection, null, state); } }; // public method CalendarApi.prototype.unselect = function (pev) { var state = this.getCurrentData(); if (state.dateSelection) { this.dispatch({ type: 'UNSELECT_DATES' }); triggerDateUnselect(pev, state); } }; // Public Events API // ----------------------------------------------------------------------------------------------------------------- CalendarApi.prototype.addEvent = function (eventInput, sourceInput) { if (eventInput instanceof EventApi) { var def = eventInput._def; var instance = eventInput._instance; var currentData = this.getCurrentData(); // not already present? don't want to add an old snapshot if (!currentData.eventStore.defs[def.defId]) { this.dispatch({ type: 'ADD_EVENTS', eventStore: eventTupleToStore({ def: def, instance: instance }) // TODO: better util for two args? }); this.triggerEventAdd(eventInput); } return eventInput; } var state = this.getCurrentData(); var eventSource; if (sourceInput instanceof EventSourceApi) { eventSource = sourceInput.internalEventSource; } else if (typeof sourceInput === 'boolean') { if (sourceInput) { // true. part of the first event source eventSource = hashValuesToArray(state.eventSources)[0]; } } else if (sourceInput != null) { // an ID. accepts a number too var sourceApi = this.getEventSourceById(sourceInput); // TODO: use an internal function if (!sourceApi) { console.warn("Could not find an event source with ID \"" + sourceInput + "\""); // TODO: test return null; } eventSource = sourceApi.internalEventSource; } var tuple = parseEvent(eventInput, eventSource, state, false); if (tuple) { var newEventApi = new EventApi(state, tuple.def, tuple.def.recurringDef ? null : tuple.instance); this.dispatch({ type: 'ADD_EVENTS', eventStore: eventTupleToStore(tuple) }); this.triggerEventAdd(newEventApi); return newEventApi; } return null; }; CalendarApi.prototype.triggerEventAdd = function (eventApi) { var _this = this; var emitter = this.getCurrentData().emitter; emitter.trigger('eventAdd', { event: eventApi, relatedEvents: [], revert: function revert() { _this.dispatch({ type: 'REMOVE_EVENTS', eventStore: eventApiToStore(eventApi) }); } }); }; // TODO: optimize CalendarApi.prototype.getEventById = function (id) { var state = this.getCurrentData(); var _a = state.eventStore, defs = _a.defs, instances = _a.instances; id = String(id); for (var defId in defs) { var def = defs[defId]; if (def.publicId === id) { if (def.recurringDef) { return new EventApi(state, def, null); } for (var instanceId in instances) { var instance = instances[instanceId]; if (instance.defId === def.defId) { return new EventApi(state, def, instance); } } } } return null; }; CalendarApi.prototype.getEvents = function () { var currentData = this.getCurrentData(); return buildEventApis(currentData.eventStore, currentData); }; CalendarApi.prototype.removeAllEvents = function () { this.dispatch({ type: 'REMOVE_ALL_EVENTS' }); }; // Public Event Sources API // ----------------------------------------------------------------------------------------------------------------- CalendarApi.prototype.getEventSources = function () { var state = this.getCurrentData(); var sourceHash = state.eventSources; var sourceApis = []; for (var internalId in sourceHash) { sourceApis.push(new EventSourceApi(state, sourceHash[internalId])); } return sourceApis; }; CalendarApi.prototype.getEventSourceById = function (id) { var state = this.getCurrentData(); var sourceHash = state.eventSources; id = String(id); for (var sourceId in sourceHash) { if (sourceHash[sourceId].publicId === id) { return new EventSourceApi(state, sourceHash[sourceId]); } } return null; }; CalendarApi.prototype.addEventSource = function (sourceInput) { var state = this.getCurrentData(); if (sourceInput instanceof EventSourceApi) { // not already present? don't want to add an old snapshot if (!state.eventSources[sourceInput.internalEventSource.sourceId]) { this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [sourceInput.internalEventSource] }); } return sourceInput; } var eventSource = parseEventSource(sourceInput, state); if (eventSource) { // TODO: error otherwise? this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [eventSource] }); return new EventSourceApi(state, eventSource); } return null; }; CalendarApi.prototype.removeAllEventSources = function () { this.dispatch({ type: 'REMOVE_ALL_EVENT_SOURCES' }); }; CalendarApi.prototype.refetchEvents = function () { this.dispatch({ type: 'FETCH_EVENT_SOURCES', isRefetch: true }); }; // Scroll // ----------------------------------------------------------------------------------------------------------------- CalendarApi.prototype.scrollToTime = function (timeInput) { var time = createDuration(timeInput); if (time) { this.trigger('_scrollRequest', { time: time }); } }; return CalendarApi; }(); var EventApi = /** @class */ function () { // instance will be null if expressing a recurring event that has no current instances, // OR if trying to validate an incoming external event that has no dates assigned function EventApi(context, def, instance) { this._context = context; this._def = def; this._instance = instance || null; } /* TODO: make event struct more responsible for this */ EventApi.prototype.setProp = function (name, val) { var _a, _b; if (name in EVENT_DATE_REFINERS) { console.warn('Could not set date-related prop \'name\'. Use one of the date-related methods instead.'); // TODO: make proper aliasing system? } else if (name === 'id') { val = EVENT_NON_DATE_REFINERS[name](val); this.mutate({ standardProps: { publicId: val } // hardcoded internal name }); } else if (name in EVENT_NON_DATE_REFINERS) { val = EVENT_NON_DATE_REFINERS[name](val); this.mutate({ standardProps: (_a = {}, _a[name] = val, _a) }); } else if (name in EVENT_UI_REFINERS) { var ui = EVENT_UI_REFINERS[name](val); if (name === 'color') { ui = { backgroundColor: val, borderColor: val }; } else if (name === 'editable') { ui = { startEditable: val, durationEditable: val }; } else { ui = (_b = {}, _b[name] = val, _b); } this.mutate({ standardProps: { ui: ui } }); } else { console.warn("Could not set prop '" + name + "'. Use setExtendedProp instead."); } }; EventApi.prototype.setExtendedProp = function (name, val) { var _a; this.mutate({ extendedProps: (_a = {}, _a[name] = val, _a) }); }; EventApi.prototype.setStart = function (startInput, options) { if (options === void 0) { options = {}; } var dateEnv = this._context.dateEnv; var start = dateEnv.createMarker(startInput); if (start && this._instance) { // TODO: warning if parsed bad var instanceRange = this._instance.range; var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!? if (options.maintainDuration) { this.mutate({ datesDelta: startDelta }); } else { this.mutate({ startDelta: startDelta }); } } }; EventApi.prototype.setEnd = function (endInput, options) { if (options === void 0) { options = {}; } var dateEnv = this._context.dateEnv; var end; if (endInput != null) { end = dateEnv.createMarker(endInput); if (!end) { return; // TODO: warning if parsed bad } } if (this._instance) { if (end) { var endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity); this.mutate({ endDelta: endDelta }); } else { this.mutate({ standardProps: { hasEnd: false } }); } } }; EventApi.prototype.setDates = function (startInput, endInput, options) { if (options === void 0) { options = {}; } var dateEnv = this._context.dateEnv; var standardProps = { allDay: options.allDay }; var start = dateEnv.createMarker(startInput); var end; if (!start) { return; // TODO: warning if parsed bad } if (endInput != null) { end = dateEnv.createMarker(endInput); if (!end) { // TODO: warning if parsed bad return; } } if (this._instance) { var instanceRange = this._instance.range; // when computing the diff for an event being converted to all-day, // compute diff off of the all-day values the way event-mutation does. if (options.allDay === true) { instanceRange = computeAlignedDayRange(instanceRange); } var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); if (end) { var endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity); if (durationsEqual(startDelta, endDelta)) { this.mutate({ datesDelta: startDelta, standardProps: standardProps }); } else { this.mutate({ startDelta: startDelta, endDelta: endDelta, standardProps: standardProps }); } } else { // means "clear the end" standardProps.hasEnd = false; this.mutate({ datesDelta: startDelta, standardProps: standardProps }); } } }; EventApi.prototype.moveStart = function (deltaInput) { var delta = createDuration(deltaInput); if (delta) { // TODO: warning if parsed bad this.mutate({ startDelta: delta }); } }; EventApi.prototype.moveEnd = function (deltaInput) { var delta = createDuration(deltaInput); if (delta) { // TODO: warning if parsed bad this.mutate({ endDelta: delta }); } }; EventApi.prototype.moveDates = function (deltaInput) { var delta = createDuration(deltaInput); if (delta) { // TODO: warning if parsed bad this.mutate({ datesDelta: delta }); } }; EventApi.prototype.setAllDay = function (allDay, options) { if (options === void 0) { options = {}; } var standardProps = { allDay: allDay }; var maintainDuration = options.maintainDuration; if (maintainDuration == null) { maintainDuration = this._context.options.allDayMaintainDuration; } if (this._def.allDay !== allDay) { standardProps.hasEnd = maintainDuration; } this.mutate({ standardProps: standardProps }); }; EventApi.prototype.formatRange = function (formatInput) { var dateEnv = this._context.dateEnv; var instance = this._instance; var formatter = createFormatter(formatInput); if (this._def.hasEnd) { return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, { forcedStartTzo: instance.forcedStartTzo, forcedEndTzo: instance.forcedEndTzo }); } return dateEnv.format(instance.range.start, formatter, { forcedTzo: instance.forcedStartTzo }); }; EventApi.prototype.mutate = function (mutation) { var instance = this._instance; if (instance) { var def = this._def; var context_1 = this._context; var eventStore_1 = context_1.getCurrentData().eventStore; var relevantEvents = getRelevantEvents(eventStore_1, instance.instanceId); var eventConfigBase = { '': { display: '', startEditable: true, durationEditable: true, constraints: [], overlap: null, allows: [], backgroundColor: '', borderColor: '', textColor: '', classNames: [] } }; relevantEvents = applyMutationToEventStore(relevantEvents, eventConfigBase, mutation, context_1); var oldEvent = new EventApi(context_1, def, instance); // snapshot this._def = relevantEvents.defs[def.defId]; this._instance = relevantEvents.instances[instance.instanceId]; context_1.dispatch({ type: 'MERGE_EVENTS', eventStore: relevantEvents }); context_1.emitter.trigger('eventChange', { oldEvent: oldEvent, event: this, relatedEvents: buildEventApis(relevantEvents, context_1, instance), revert: function revert() { context_1.dispatch({ type: 'RESET_EVENTS', eventStore: eventStore_1 }); } }); } }; EventApi.prototype.remove = function () { var context = this._context; var asStore = eventApiToStore(this); context.dispatch({ type: 'REMOVE_EVENTS', eventStore: asStore }); context.emitter.trigger('eventRemove', { event: this, relatedEvents: [], revert: function revert() { context.dispatch({ type: 'MERGE_EVENTS', eventStore: asStore }); } }); }; Object.defineProperty(EventApi.prototype, "source", { get: function get() { var sourceId = this._def.sourceId; if (sourceId) { return new EventSourceApi(this._context, this._context.getCurrentData().eventSources[sourceId]); } return null; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "start", { get: function get() { return this._instance ? this._context.dateEnv.toDate(this._instance.range.start) : null; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "end", { get: function get() { return this._instance && this._def.hasEnd ? this._context.dateEnv.toDate(this._instance.range.end) : null; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "startStr", { get: function get() { var instance = this._instance; if (instance) { return this._context.dateEnv.formatIso(instance.range.start, { omitTime: this._def.allDay, forcedTzo: instance.forcedStartTzo }); } return ''; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "endStr", { get: function get() { var instance = this._instance; if (instance && this._def.hasEnd) { return this._context.dateEnv.formatIso(instance.range.end, { omitTime: this._def.allDay, forcedTzo: instance.forcedEndTzo }); } return ''; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "id", { // computable props that all access the def // TODO: find a TypeScript-compatible way to do this at scale get: function get() { return this._def.publicId; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "groupId", { get: function get() { return this._def.groupId; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "allDay", { get: function get() { return this._def.allDay; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "title", { get: function get() { return this._def.title; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "url", { get: function get() { return this._def.url; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "display", { get: function get() { return this._def.ui.display || 'auto'; } // bad. just normalize the type earlier , enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "startEditable", { get: function get() { return this._def.ui.startEditable; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "durationEditable", { get: function get() { return this._def.ui.durationEditable; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "constraint", { get: function get() { return this._def.ui.constraints[0] || null; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "overlap", { get: function get() { return this._def.ui.overlap; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "allow", { get: function get() { return this._def.ui.allows[0] || null; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "backgroundColor", { get: function get() { return this._def.ui.backgroundColor; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "borderColor", { get: function get() { return this._def.ui.borderColor; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "textColor", { get: function get() { return this._def.ui.textColor; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "classNames", { // NOTE: user can't modify these because Object.freeze was called in event-def parsing get: function get() { return this._def.ui.classNames; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "extendedProps", { get: function get() { return this._def.extendedProps; }, enumerable: false, configurable: true }); EventApi.prototype.toPlainObject = function (settings) { if (settings === void 0) { settings = {}; } var def = this._def; var ui = def.ui; var _a = this, startStr = _a.startStr, endStr = _a.endStr; var res = {}; if (def.title) { res.title = def.title; } if (startStr) { res.start = startStr; } if (endStr) { res.end = endStr; } if (def.publicId) { res.id = def.publicId; } if (def.groupId) { res.groupId = def.groupId; } if (def.url) { res.url = def.url; } if (ui.display && ui.display !== 'auto') { res.display = ui.display; } // TODO: what about recurring-event properties??? // TODO: include startEditable/durationEditable/constraint/overlap/allow if (settings.collapseColor && ui.backgroundColor && ui.backgroundColor === ui.borderColor) { res.color = ui.backgroundColor; } else { if (ui.backgroundColor) { res.backgroundColor = ui.backgroundColor; } if (ui.borderColor) { res.borderColor = ui.borderColor; } } if (ui.textColor) { res.textColor = ui.textColor; } if (ui.classNames.length) { res.classNames = ui.classNames; } if (Object.keys(def.extendedProps).length) { if (settings.collapseExtendedProps) { tslib.__assign(res, def.extendedProps); } else { res.extendedProps = def.extendedProps; } } return res; }; EventApi.prototype.toJSON = function () { return this.toPlainObject(); }; return EventApi; }(); function eventApiToStore(eventApi) { var _a, _b; var def = eventApi._def; var instance = eventApi._instance; return { defs: (_a = {}, _a[def.defId] = def, _a), instances: instance ? (_b = {}, _b[instance.instanceId] = instance, _b) : {} }; } function buildEventApis(eventStore, context, excludeInstance) { var defs = eventStore.defs, instances = eventStore.instances; var eventApis = []; var excludeInstanceId = excludeInstance ? excludeInstance.instanceId : ''; for (var id in instances) { var instance = instances[id]; var def = defs[instance.defId]; if (instance.instanceId !== excludeInstanceId) { eventApis.push(new EventApi(context, def, instance)); } } return eventApis; } var calendarSystemClassMap = {}; function registerCalendarSystem(name, theClass) { calendarSystemClassMap[name] = theClass; } function createCalendarSystem(name) { return new calendarSystemClassMap[name](); } var GregorianCalendarSystem = /** @class */ function () { function GregorianCalendarSystem() {} GregorianCalendarSystem.prototype.getMarkerYear = function (d) { return d.getUTCFullYear(); }; GregorianCalendarSystem.prototype.getMarkerMonth = function (d) { return d.getUTCMonth(); }; GregorianCalendarSystem.prototype.getMarkerDay = function (d) { return d.getUTCDate(); }; GregorianCalendarSystem.prototype.arrayToMarker = function (arr) { return arrayToUtcDate(arr); }; GregorianCalendarSystem.prototype.markerToArray = function (marker) { return dateToUtcArray(marker); }; return GregorianCalendarSystem; }(); registerCalendarSystem('gregory', GregorianCalendarSystem); var ISO_RE = /^\s*(\d{4})(-?(\d{2})(-?(\d{2})([T ](\d{2}):?(\d{2})(:?(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/; function parse(str) { var m = ISO_RE.exec(str); if (m) { var marker = new Date(Date.UTC(Number(m[1]), m[3] ? Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] || 0), Number(m[10] || 0), m[12] ? Number("0." + m[12]) * 1000 : 0)); if (isValidDate(marker)) { var timeZoneOffset = null; if (m[13]) { timeZoneOffset = (m[15] === '-' ? -1 : 1) * (Number(m[16] || 0) * 60 + Number(m[18] || 0)); } return { marker: marker, isTimeUnspecified: !m[6], timeZoneOffset: timeZoneOffset }; } } return null; } var DateEnv = /** @class */ function () { function DateEnv(settings) { var timeZone = this.timeZone = settings.timeZone; var isNamedTimeZone = timeZone !== 'local' && timeZone !== 'UTC'; if (settings.namedTimeZoneImpl && isNamedTimeZone) { this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone); } this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl); this.calendarSystem = createCalendarSystem(settings.calendarSystem); this.locale = settings.locale; this.weekDow = settings.locale.week.dow; this.weekDoy = settings.locale.week.doy; if (settings.weekNumberCalculation === 'ISO') { this.weekDow = 1; this.weekDoy = 4; } if (typeof settings.firstDay === 'number') { this.weekDow = settings.firstDay; } if (typeof settings.weekNumberCalculation === 'function') { this.weekNumberFunc = settings.weekNumberCalculation; } this.weekText = settings.weekText != null ? settings.weekText : settings.locale.options.weekText; this.weekTextLong = (settings.weekTextLong != null ? settings.weekTextLong : settings.locale.options.weekTextLong) || this.weekText; this.cmdFormatter = settings.cmdFormatter; this.defaultSeparator = settings.defaultSeparator; } // Creating / Parsing DateEnv.prototype.createMarker = function (input) { var meta = this.createMarkerMeta(input); if (meta === null) { return null; } return meta.marker; }; DateEnv.prototype.createNowMarker = function () { if (this.canComputeOffset) { return this.timestampToMarker(new Date().valueOf()); } // if we can't compute the current date val for a timezone, // better to give the current local date vals than UTC return arrayToUtcDate(dateToLocalArray(new Date())); }; DateEnv.prototype.createMarkerMeta = function (input) { if (typeof input === 'string') { return this.parse(input); } var marker = null; if (typeof input === 'number') { marker = this.timestampToMarker(input); } else if (input instanceof Date) { input = input.valueOf(); if (!isNaN(input)) { marker = this.timestampToMarker(input); } } else if (Array.isArray(input)) { marker = arrayToUtcDate(input); } if (marker === null || !isValidDate(marker)) { return null; } return { marker: marker, isTimeUnspecified: false, forcedTzo: null }; }; DateEnv.prototype.parse = function (s) { var parts = parse(s); if (parts === null) { return null; } var marker = parts.marker; var forcedTzo = null; if (parts.timeZoneOffset !== null) { if (this.canComputeOffset) { marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000); } else { forcedTzo = parts.timeZoneOffset; } } return { marker: marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo: forcedTzo }; }; // Accessors DateEnv.prototype.getYear = function (marker) { return this.calendarSystem.getMarkerYear(marker); }; DateEnv.prototype.getMonth = function (marker) { return this.calendarSystem.getMarkerMonth(marker); }; // Adding / Subtracting DateEnv.prototype.add = function (marker, dur) { var a = this.calendarSystem.markerToArray(marker); a[0] += dur.years; a[1] += dur.months; a[2] += dur.days; a[6] += dur.milliseconds; return this.calendarSystem.arrayToMarker(a); }; DateEnv.prototype.subtract = function (marker, dur) { var a = this.calendarSystem.markerToArray(marker); a[0] -= dur.years; a[1] -= dur.months; a[2] -= dur.days; a[6] -= dur.milliseconds; return this.calendarSystem.arrayToMarker(a); }; DateEnv.prototype.addYears = function (marker, n) { var a = this.calendarSystem.markerToArray(marker); a[0] += n; return this.calendarSystem.arrayToMarker(a); }; DateEnv.prototype.addMonths = function (marker, n) { var a = this.calendarSystem.markerToArray(marker); a[1] += n; return this.calendarSystem.arrayToMarker(a); }; // Diffing Whole Units DateEnv.prototype.diffWholeYears = function (m0, m1) { var calendarSystem = this.calendarSystem; if (timeAsMs(m0) === timeAsMs(m1) && calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) && calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) { return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0); } return null; }; DateEnv.prototype.diffWholeMonths = function (m0, m1) { var calendarSystem = this.calendarSystem; if (timeAsMs(m0) === timeAsMs(m1) && calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) { return calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0) + (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12; } return null; }; // Range / Duration DateEnv.prototype.greatestWholeUnit = function (m0, m1) { var n = this.diffWholeYears(m0, m1); if (n !== null) { return { unit: 'year', value: n }; } n = this.diffWholeMonths(m0, m1); if (n !== null) { return { unit: 'month', value: n }; } n = diffWholeWeeks(m0, m1); if (n !== null) { return { unit: 'week', value: n }; } n = diffWholeDays(m0, m1); if (n !== null) { return { unit: 'day', value: n }; } n = diffHours(m0, m1); if (isInt(n)) { return { unit: 'hour', value: n }; } n = diffMinutes(m0, m1); if (isInt(n)) { return { unit: 'minute', value: n }; } n = diffSeconds(m0, m1); if (isInt(n)) { return { unit: 'second', value: n }; } return { unit: 'millisecond', value: m1.valueOf() - m0.valueOf() }; }; DateEnv.prototype.countDurationsBetween = function (m0, m1, d) { // TODO: can use greatestWholeUnit var diff; if (d.years) { diff = this.diffWholeYears(m0, m1); if (diff !== null) { return diff / asRoughYears(d); } } if (d.months) { diff = this.diffWholeMonths(m0, m1); if (diff !== null) { return diff / asRoughMonths(d); } } if (d.days) { diff = diffWholeDays(m0, m1); if (diff !== null) { return diff / asRoughDays(d); } } return (m1.valueOf() - m0.valueOf()) / asRoughMs(d); }; // Start-Of // these DON'T return zoned-dates. only UTC start-of dates DateEnv.prototype.startOf = function (m, unit) { if (unit === 'year') { return this.startOfYear(m); } if (unit === 'month') { return this.startOfMonth(m); } if (unit === 'week') { return this.startOfWeek(m); } if (unit === 'day') { return startOfDay(m); } if (unit === 'hour') { return startOfHour(m); } if (unit === 'minute') { return startOfMinute(m); } if (unit === 'second') { return startOfSecond(m); } return null; }; DateEnv.prototype.startOfYear = function (m) { return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(m)]); }; DateEnv.prototype.startOfMonth = function (m) { return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(m), this.calendarSystem.getMarkerMonth(m)]); }; DateEnv.prototype.startOfWeek = function (m) { return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(m), this.calendarSystem.getMarkerMonth(m), m.getUTCDate() - (m.getUTCDay() - this.weekDow + 7) % 7]); }; // Week Number DateEnv.prototype.computeWeekNumber = function (marker) { if (this.weekNumberFunc) { return this.weekNumberFunc(this.toDate(marker)); } return weekOfYear(marker, this.weekDow, this.weekDoy); }; // TODO: choke on timeZoneName: long DateEnv.prototype.format = function (marker, formatter, dateOptions) { if (dateOptions === void 0) { dateOptions = {}; } return formatter.format({ marker: marker, timeZoneOffset: dateOptions.forcedTzo != null ? dateOptions.forcedTzo : this.offsetForMarker(marker) }, this); }; DateEnv.prototype.formatRange = function (start, end, formatter, dateOptions) { if (dateOptions === void 0) { dateOptions = {}; } if (dateOptions.isEndExclusive) { end = addMs(end, -1); } return formatter.formatRange({ marker: start, timeZoneOffset: dateOptions.forcedStartTzo != null ? dateOptions.forcedStartTzo : this.offsetForMarker(start) }, { marker: end, timeZoneOffset: dateOptions.forcedEndTzo != null ? dateOptions.forcedEndTzo : this.offsetForMarker(end) }, this, dateOptions.defaultSeparator); }; /* DUMB: the omitTime arg is dumb. if we omit the time, we want to omit the timezone offset. and if we do that, might as well use buildIsoString or some other util directly */ DateEnv.prototype.formatIso = function (marker, extraOptions) { if (extraOptions === void 0) { extraOptions = {}; } var timeZoneOffset = null; if (!extraOptions.omitTimeZoneOffset) { if (extraOptions.forcedTzo != null) { timeZoneOffset = extraOptions.forcedTzo; } else { timeZoneOffset = this.offsetForMarker(marker); } } return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime); }; // TimeZone DateEnv.prototype.timestampToMarker = function (ms) { if (this.timeZone === 'local') { return arrayToUtcDate(dateToLocalArray(new Date(ms))); } if (this.timeZone === 'UTC' || !this.namedTimeZoneImpl) { return new Date(ms); } return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms)); }; DateEnv.prototype.offsetForMarker = function (m) { if (this.timeZone === 'local') { return -arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert "inverse" offset to "normal" offset } if (this.timeZone === 'UTC') { return 0; } if (this.namedTimeZoneImpl) { return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)); } return null; }; // Conversion DateEnv.prototype.toDate = function (m, forcedTzo) { if (this.timeZone === 'local') { return arrayToLocalDate(dateToUtcArray(m)); } if (this.timeZone === 'UTC') { return new Date(m.valueOf()); // make sure it's a copy } if (!this.namedTimeZoneImpl) { return new Date(m.valueOf() - (forcedTzo || 0)); } return new Date(m.valueOf() - this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) * 1000 * 60); }; return DateEnv; }(); var globalLocales = []; var MINIMAL_RAW_EN_LOCALE = { code: 'en', week: { dow: 0, doy: 4 // 4 days need to be within the year to be considered the first week }, direction: 'ltr', buttonText: { prev: 'prev', next: 'next', prevYear: 'prev year', nextYear: 'next year', year: 'year', today: 'today', month: 'month', week: 'week', day: 'day', list: 'list' }, weekText: 'W', weekTextLong: 'Week', closeHint: 'Close', timeHint: 'Time', eventHint: 'Event', allDayText: 'all-day', moreLinkText: 'more', noEventsText: 'No events to display' }; var RAW_EN_LOCALE = tslib.__assign(tslib.__assign({}, MINIMAL_RAW_EN_LOCALE), { // Includes things we don't want other locales to inherit, // things that derive from other translatable strings. buttonHints: { prev: 'Previous $0', next: 'Next $0', today: function today(buttonText, unit) { return unit === 'day' ? 'Today' : "This " + buttonText; } }, viewHint: '$0 view', navLinkHint: 'Go to $0', moreLinkHint: function moreLinkHint(eventCnt) { return "Show " + eventCnt + " more event" + (eventCnt === 1 ? '' : 's'); } }); function organizeRawLocales(explicitRawLocales) { var defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : 'en'; var allRawLocales = globalLocales.concat(explicitRawLocales); var rawLocaleMap = { en: RAW_EN_LOCALE }; for (var _i = 0, allRawLocales_1 = allRawLocales; _i < allRawLocales_1.length; _i++) { var rawLocale = allRawLocales_1[_i]; rawLocaleMap[rawLocale.code] = rawLocale; } return { map: rawLocaleMap, defaultCode: defaultCode }; } function buildLocale(inputSingular, available) { if (_typeof(inputSingular) === 'object' && !Array.isArray(inputSingular)) { return parseLocale(inputSingular.code, [inputSingular.code], inputSingular); } return queryLocale(inputSingular, available); } function queryLocale(codeArg, available) { var codes = [].concat(codeArg || []); // will convert to array var raw = queryRawLocale(codes, available) || RAW_EN_LOCALE; return parseLocale(codeArg, codes, raw); } function queryRawLocale(codes, available) { for (var i = 0; i < codes.length; i += 1) { var parts = codes[i].toLocaleLowerCase().split('-'); for (var j = parts.length; j > 0; j -= 1) { var simpleId = parts.slice(0, j).join('-'); if (available[simpleId]) { return available[simpleId]; } } } return null; } function parseLocale(codeArg, codes, raw) { var merged = mergeProps([MINIMAL_RAW_EN_LOCALE, raw], ['buttonText']); delete merged.code; // don't want this part of the options var week = merged.week; delete merged.week; return { codeArg: codeArg, codes: codes, week: week, simpleNumberFormat: new Intl.NumberFormat(codeArg), options: merged }; } function formatDate(dateInput, options) { if (options === void 0) { options = {}; } var dateEnv = buildDateEnv$1(options); var formatter = createFormatter(options); var dateMeta = dateEnv.createMarkerMeta(dateInput); if (!dateMeta) { // TODO: warning? return ''; } return dateEnv.format(dateMeta.marker, formatter, { forcedTzo: dateMeta.forcedTzo }); } function formatRange(startInput, endInput, options) { var dateEnv = buildDateEnv$1(_typeof(options) === 'object' && options ? options : {}); // pass in if non-null object var formatter = createFormatter(options); var startMeta = dateEnv.createMarkerMeta(startInput); var endMeta = dateEnv.createMarkerMeta(endInput); if (!startMeta || !endMeta) { // TODO: warning? return ''; } return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, { forcedStartTzo: startMeta.forcedTzo, forcedEndTzo: endMeta.forcedTzo, isEndExclusive: options.isEndExclusive, defaultSeparator: BASE_OPTION_DEFAULTS.defaultRangeSeparator }); } // TODO: more DRY and optimized function buildDateEnv$1(settings) { var locale = buildLocale(settings.locale || 'en', organizeRawLocales([]).map); // TODO: don't hardcode 'en' everywhere return new DateEnv(tslib.__assign(tslib.__assign({ timeZone: BASE_OPTION_DEFAULTS.timeZone, calendarSystem: 'gregory' }, settings), { locale: locale })); } var DEF_DEFAULTS = { startTime: '09:00', endTime: '17:00', daysOfWeek: [1, 2, 3, 4, 5], display: 'inverse-background', classNames: 'fc-non-business', groupId: '_businessHours' // so multiple defs get grouped }; /* TODO: pass around as EventDefHash!!! */ function parseBusinessHours(input, context) { return parseEvents(refineInputs(input), null, context); } function refineInputs(input) { var rawDefs; if (input === true) { rawDefs = [{}]; // will get DEF_DEFAULTS verbatim } else if (Array.isArray(input)) { // if specifying an array, every sub-definition NEEDS a day-of-week rawDefs = input.filter(function (rawDef) { return rawDef.daysOfWeek; }); } else if (_typeof(input) === 'object' && input) { // non-null object rawDefs = [input]; } else { // is probably false rawDefs = []; } rawDefs = rawDefs.map(function (rawDef) { return tslib.__assign(tslib.__assign({}, DEF_DEFAULTS), rawDef); }); return rawDefs; } function pointInsideRect(point, rect) { return point.left >= rect.left && point.left < rect.right && point.top >= rect.top && point.top < rect.bottom; } // Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false function intersectRects(rect1, rect2) { var res = { left: Math.max(rect1.left, rect2.left), right: Math.min(rect1.right, rect2.right), top: Math.max(rect1.top, rect2.top), bottom: Math.min(rect1.bottom, rect2.bottom) }; if (res.left < res.right && res.top < res.bottom) { return res; } return false; } function translateRect(rect, deltaX, deltaY) { return { left: rect.left + deltaX, right: rect.right + deltaX, top: rect.top + deltaY, bottom: rect.bottom + deltaY }; } // Returns a new point that will have been moved to reside within the given rectangle function constrainPoint(point, rect) { return { left: Math.min(Math.max(point.left, rect.left), rect.right), top: Math.min(Math.max(point.top, rect.top), rect.bottom) }; } // Returns a point that is the center of the given rectangle function getRectCenter(rect) { return { left: (rect.left + rect.right) / 2, top: (rect.top + rect.bottom) / 2 }; } // Subtracts point2's coordinates from point1's coordinates, returning a delta function diffPoints(point1, point2) { return { left: point1.left - point2.left, top: point1.top - point2.top }; } var canVGrowWithinCell; function getCanVGrowWithinCell() { if (canVGrowWithinCell == null) { canVGrowWithinCell = computeCanVGrowWithinCell(); } return canVGrowWithinCell; } function computeCanVGrowWithinCell() { // for SSR, because this function is call immediately at top-level // TODO: just make this logic execute top-level, immediately, instead of doing lazily if (typeof document === 'undefined') { return true; } var el = document.createElement('div'); el.style.position = 'absolute'; el.style.top = '0px'; el.style.left = '0px'; el.innerHTML = '
'; el.querySelector('table').style.height = '100px'; el.querySelector('div').style.height = '100%'; document.body.appendChild(el); var div = el.querySelector('div'); var possible = div.offsetHeight > 0; document.body.removeChild(el); return possible; } var EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents. TODO: keep elsewhere var Splitter = /** @class */ function () { function Splitter() { this.getKeysForEventDefs = memoize(this._getKeysForEventDefs); this.splitDateSelection = memoize(this._splitDateSpan); this.splitEventStore = memoize(this._splitEventStore); this.splitIndividualUi = memoize(this._splitIndividualUi); this.splitEventDrag = memoize(this._splitInteraction); this.splitEventResize = memoize(this._splitInteraction); this.eventUiBuilders = {}; // TODO: typescript protection } Splitter.prototype.splitProps = function (props) { var _this = this; var keyInfos = this.getKeyInfo(props); var defKeys = this.getKeysForEventDefs(props.eventStore); var dateSelections = this.splitDateSelection(props.dateSelection); var individualUi = this.splitIndividualUi(props.eventUiBases, defKeys); // the individual *bases* var eventStores = this.splitEventStore(props.eventStore, defKeys); var eventDrags = this.splitEventDrag(props.eventDrag); var eventResizes = this.splitEventResize(props.eventResize); var splitProps = {}; this.eventUiBuilders = mapHash(keyInfos, function (info, key) { return _this.eventUiBuilders[key] || memoize(buildEventUiForKey); }); for (var key in keyInfos) { var keyInfo = keyInfos[key]; var eventStore = eventStores[key] || EMPTY_EVENT_STORE; var buildEventUi = this.eventUiBuilders[key]; splitProps[key] = { businessHours: keyInfo.businessHours || props.businessHours, dateSelection: dateSelections[key] || null, eventStore: eventStore, eventUiBases: buildEventUi(props.eventUiBases[''], keyInfo.ui, individualUi[key]), eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '', eventDrag: eventDrags[key] || null, eventResize: eventResizes[key] || null }; } return splitProps; }; Splitter.prototype._splitDateSpan = function (dateSpan) { var dateSpans = {}; if (dateSpan) { var keys = this.getKeysForDateSpan(dateSpan); for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) { var key = keys_1[_i]; dateSpans[key] = dateSpan; } } return dateSpans; }; Splitter.prototype._getKeysForEventDefs = function (eventStore) { var _this = this; return mapHash(eventStore.defs, function (eventDef) { return _this.getKeysForEventDef(eventDef); }); }; Splitter.prototype._splitEventStore = function (eventStore, defKeys) { var defs = eventStore.defs, instances = eventStore.instances; var splitStores = {}; for (var defId in defs) { for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) { var key = _a[_i]; if (!splitStores[key]) { splitStores[key] = createEmptyEventStore(); } splitStores[key].defs[defId] = defs[defId]; } } for (var instanceId in instances) { var instance = instances[instanceId]; for (var _b = 0, _c = defKeys[instance.defId]; _b < _c.length; _b++) { var key = _c[_b]; if (splitStores[key]) { // must have already been created splitStores[key].instances[instanceId] = instance; } } } return splitStores; }; Splitter.prototype._splitIndividualUi = function (eventUiBases, defKeys) { var splitHashes = {}; for (var defId in eventUiBases) { if (defId) { // not the '' key for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) { var key = _a[_i]; if (!splitHashes[key]) { splitHashes[key] = {}; } splitHashes[key][defId] = eventUiBases[defId]; } } } return splitHashes; }; Splitter.prototype._splitInteraction = function (interaction) { var splitStates = {}; if (interaction) { var affectedStores_1 = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents)); // can't rely on defKeys because event data is mutated var mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents); var mutatedStores_1 = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId); var populate = function populate(key) { if (!splitStates[key]) { splitStates[key] = { affectedEvents: affectedStores_1[key] || EMPTY_EVENT_STORE, mutatedEvents: mutatedStores_1[key] || EMPTY_EVENT_STORE, isEvent: interaction.isEvent }; } }; for (var key in affectedStores_1) { populate(key); } for (var key in mutatedStores_1) { populate(key); } } return splitStates; }; return Splitter; }(); function buildEventUiForKey(allUi, eventUiForKey, individualUi) { var baseParts = []; if (allUi) { baseParts.push(allUi); } if (eventUiForKey) { baseParts.push(eventUiForKey); } var stuff = { '': combineEventUis(baseParts) }; if (individualUi) { tslib.__assign(stuff, individualUi); } return stuff; } function getDateMeta(date, todayRange, nowDate, dateProfile) { return { dow: date.getUTCDay(), isDisabled: Boolean(dateProfile && !rangeContainsMarker(dateProfile.activeRange, date)), isOther: Boolean(dateProfile && !rangeContainsMarker(dateProfile.currentRange, date)), isToday: Boolean(todayRange && rangeContainsMarker(todayRange, date)), isPast: Boolean(nowDate ? date < nowDate : todayRange ? date < todayRange.start : false), isFuture: Boolean(nowDate ? date > nowDate : todayRange ? date >= todayRange.end : false) }; } function getDayClassNames(meta, theme) { var classNames = ['fc-day', "fc-day-" + DAY_IDS[meta.dow]]; if (meta.isDisabled) { classNames.push('fc-day-disabled'); } else { if (meta.isToday) { classNames.push('fc-day-today'); classNames.push(theme.getClass('today')); } if (meta.isPast) { classNames.push('fc-day-past'); } if (meta.isFuture) { classNames.push('fc-day-future'); } if (meta.isOther) { classNames.push('fc-day-other'); } } return classNames; } function getSlotClassNames(meta, theme) { var classNames = ['fc-slot', "fc-slot-" + DAY_IDS[meta.dow]]; if (meta.isDisabled) { classNames.push('fc-slot-disabled'); } else { if (meta.isToday) { classNames.push('fc-slot-today'); classNames.push(theme.getClass('today')); } if (meta.isPast) { classNames.push('fc-slot-past'); } if (meta.isFuture) { classNames.push('fc-slot-future'); } } return classNames; } var DAY_FORMAT = createFormatter({ year: 'numeric', month: 'long', day: 'numeric' }); var WEEK_FORMAT = createFormatter({ week: 'long' }); function buildNavLinkAttrs(context, dateMarker, viewType, isTabbable) { if (viewType === void 0) { viewType = 'day'; } if (isTabbable === void 0) { isTabbable = true; } var dateEnv = context.dateEnv, options = context.options, calendarApi = context.calendarApi; var dateStr = dateEnv.format(dateMarker, viewType === 'week' ? WEEK_FORMAT : DAY_FORMAT); if (options.navLinks) { var zonedDate = dateEnv.toDate(dateMarker); var handleInteraction = function handleInteraction(ev) { var customAction = viewType === 'day' ? options.navLinkDayClick : viewType === 'week' ? options.navLinkWeekClick : null; if (typeof customAction === 'function') { customAction.call(calendarApi, dateEnv.toDate(dateMarker), ev); } else { if (typeof customAction === 'string') { viewType = customAction; } calendarApi.zoomTo(dateMarker, viewType); } }; return tslib.__assign({ title: formatWithOrdinals(options.navLinkHint, [dateStr, zonedDate], dateStr), 'data-navlink': '' }, isTabbable ? createAriaClickAttrs(handleInteraction) : { onClick: handleInteraction }); } return { 'aria-label': dateStr }; } var _isRtlScrollbarOnLeft = null; function getIsRtlScrollbarOnLeft() { if (_isRtlScrollbarOnLeft === null) { _isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft(); } return _isRtlScrollbarOnLeft; } function computeIsRtlScrollbarOnLeft() { var outerEl = document.createElement('div'); applyStyle(outerEl, { position: 'absolute', top: -1000, left: 0, border: 0, padding: 0, overflow: 'scroll', direction: 'rtl' }); outerEl.innerHTML = '
'; document.body.appendChild(outerEl); var innerEl = outerEl.firstChild; var res = innerEl.getBoundingClientRect().left > outerEl.getBoundingClientRect().left; removeElement(outerEl); return res; } var _scrollbarWidths; function getScrollbarWidths() { if (!_scrollbarWidths) { _scrollbarWidths = computeScrollbarWidths(); } return _scrollbarWidths; } function computeScrollbarWidths() { var el = document.createElement('div'); el.style.overflow = 'scroll'; el.style.position = 'absolute'; el.style.top = '-9999px'; el.style.left = '-9999px'; document.body.appendChild(el); var res = computeScrollbarWidthsForEl(el); document.body.removeChild(el); return res; } // WARNING: will include border function computeScrollbarWidthsForEl(el) { return { x: el.offsetHeight - el.clientHeight, y: el.offsetWidth - el.clientWidth }; } function computeEdges(el, getPadding) { if (getPadding === void 0) { getPadding = false; } var computedStyle = window.getComputedStyle(el); var borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0; var borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0; var borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0; var borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0; var badScrollbarWidths = computeScrollbarWidthsForEl(el); // includes border! var scrollbarLeftRight = badScrollbarWidths.y - borderLeft - borderRight; var scrollbarBottom = badScrollbarWidths.x - borderTop - borderBottom; var res = { borderLeft: borderLeft, borderRight: borderRight, borderTop: borderTop, borderBottom: borderBottom, scrollbarBottom: scrollbarBottom, scrollbarLeft: 0, scrollbarRight: 0 }; if (getIsRtlScrollbarOnLeft() && computedStyle.direction === 'rtl') { // is the scrollbar on the left side? res.scrollbarLeft = scrollbarLeftRight; } else { res.scrollbarRight = scrollbarLeftRight; } if (getPadding) { res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0; res.paddingRight = parseInt(computedStyle.paddingRight, 10) || 0; res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0; res.paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0; } return res; } function computeInnerRect(el, goWithinPadding, doFromWindowViewport) { if (goWithinPadding === void 0) { goWithinPadding = false; } var outerRect = doFromWindowViewport ? el.getBoundingClientRect() : computeRect(el); var edges = computeEdges(el, goWithinPadding); var res = { left: outerRect.left + edges.borderLeft + edges.scrollbarLeft, right: outerRect.right - edges.borderRight - edges.scrollbarRight, top: outerRect.top + edges.borderTop, bottom: outerRect.bottom - edges.borderBottom - edges.scrollbarBottom }; if (goWithinPadding) { res.left += edges.paddingLeft; res.right -= edges.paddingRight; res.top += edges.paddingTop; res.bottom -= edges.paddingBottom; } return res; } function computeRect(el) { var rect = el.getBoundingClientRect(); return { left: rect.left + window.pageXOffset, top: rect.top + window.pageYOffset, right: rect.right + window.pageXOffset, bottom: rect.bottom + window.pageYOffset }; } function computeClippedClientRect(el) { var clippingParents = getClippingParents(el); var rect = el.getBoundingClientRect(); for (var _i = 0, clippingParents_1 = clippingParents; _i < clippingParents_1.length; _i++) { var clippingParent = clippingParents_1[_i]; var intersection = intersectRects(rect, clippingParent.getBoundingClientRect()); if (intersection) { rect = intersection; } else { return null; } } return rect; } function computeHeightAndMargins(el) { return el.getBoundingClientRect().height + computeVMargins(el); } function computeVMargins(el) { var computed = window.getComputedStyle(el); return parseInt(computed.marginTop, 10) + parseInt(computed.marginBottom, 10); } // does not return window function getClippingParents(el) { var parents = []; while (el instanceof HTMLElement) { // will stop when gets to document or null var computedStyle = window.getComputedStyle(el); if (computedStyle.position === 'fixed') { break; } if (/(auto|scroll)/.test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) { parents.push(el); } el = el.parentNode; } return parents; } // given a function that resolves a result asynchronously. // the function can either call passed-in success and failure callbacks, // or it can return a promise. // if you need to pass additional params to func, bind them first. function unpromisify(func, success, failure) { // guard against success/failure callbacks being called more than once // and guard against a promise AND callback being used together. var isResolved = false; var wrappedSuccess = function wrappedSuccess() { if (!isResolved) { isResolved = true; success.apply(this, arguments); // eslint-disable-line prefer-rest-params } }; var wrappedFailure = function wrappedFailure() { if (!isResolved) { isResolved = true; if (failure) { failure.apply(this, arguments); // eslint-disable-line prefer-rest-params } } }; var res = func(wrappedSuccess, wrappedFailure); if (res && typeof res.then === 'function') { res.then(wrappedSuccess, wrappedFailure); } } var Emitter = /** @class */ function () { function Emitter() { this.handlers = {}; this.thisContext = null; } Emitter.prototype.setThisContext = function (thisContext) { this.thisContext = thisContext; }; Emitter.prototype.setOptions = function (options) { this.options = options; }; Emitter.prototype.on = function (type, handler) { addToHash(this.handlers, type, handler); }; Emitter.prototype.off = function (type, handler) { removeFromHash(this.handlers, type, handler); }; Emitter.prototype.trigger = function (type) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } var attachedHandlers = this.handlers[type] || []; var optionHandler = this.options && this.options[type]; var handlers = [].concat(optionHandler || [], attachedHandlers); for (var _a = 0, handlers_1 = handlers; _a < handlers_1.length; _a++) { var handler = handlers_1[_a]; handler.apply(this.thisContext, args); } }; Emitter.prototype.hasHandlers = function (type) { return Boolean(this.handlers[type] && this.handlers[type].length || this.options && this.options[type]); }; return Emitter; }(); function addToHash(hash, type, handler) { (hash[type] || (hash[type] = [])).push(handler); } function removeFromHash(hash, type, handler) { if (handler) { if (hash[type]) { hash[type] = hash[type].filter(function (func) { return func !== handler; }); } } else { delete hash[type]; // remove all handler funcs for this type } } /* Records offset information for a set of elements, relative to an origin element. Can record the left/right OR the top/bottom OR both. Provides methods for querying the cache by position. */ var PositionCache = /** @class */ function () { function PositionCache(originEl, els, isHorizontal, isVertical) { this.els = els; var originClientRect = this.originClientRect = originEl.getBoundingClientRect(); // relative to viewport top-left if (isHorizontal) { this.buildElHorizontals(originClientRect.left); } if (isVertical) { this.buildElVerticals(originClientRect.top); } } // Populates the left/right internal coordinate arrays PositionCache.prototype.buildElHorizontals = function (originClientLeft) { var lefts = []; var rights = []; for (var _i = 0, _a = this.els; _i < _a.length; _i++) { var el = _a[_i]; var rect = el.getBoundingClientRect(); lefts.push(rect.left - originClientLeft); rights.push(rect.right - originClientLeft); } this.lefts = lefts; this.rights = rights; }; // Populates the top/bottom internal coordinate arrays PositionCache.prototype.buildElVerticals = function (originClientTop) { var tops = []; var bottoms = []; for (var _i = 0, _a = this.els; _i < _a.length; _i++) { var el = _a[_i]; var rect = el.getBoundingClientRect(); tops.push(rect.top - originClientTop); bottoms.push(rect.bottom - originClientTop); } this.tops = tops; this.bottoms = bottoms; }; // Given a left offset (from document left), returns the index of the el that it horizontally intersects. // If no intersection is made, returns undefined. PositionCache.prototype.leftToIndex = function (leftPosition) { var _a = this, lefts = _a.lefts, rights = _a.rights; var len = lefts.length; var i; for (i = 0; i < len; i += 1) { if (leftPosition >= lefts[i] && leftPosition < rights[i]) { return i; } } return undefined; // TODO: better }; // Given a top offset (from document top), returns the index of the el that it vertically intersects. // If no intersection is made, returns undefined. PositionCache.prototype.topToIndex = function (topPosition) { var _a = this, tops = _a.tops, bottoms = _a.bottoms; var len = tops.length; var i; for (i = 0; i < len; i += 1) { if (topPosition >= tops[i] && topPosition < bottoms[i]) { return i; } } return undefined; // TODO: better }; // Gets the width of the element at the given index PositionCache.prototype.getWidth = function (leftIndex) { return this.rights[leftIndex] - this.lefts[leftIndex]; }; // Gets the height of the element at the given index PositionCache.prototype.getHeight = function (topIndex) { return this.bottoms[topIndex] - this.tops[topIndex]; }; return PositionCache; }(); /* eslint max-classes-per-file: "off" */ /* An object for getting/setting scroll-related information for an element. Internally, this is done very differently for window versus DOM element, so this object serves as a common interface. */ var ScrollController = /** @class */ function () { function ScrollController() {} ScrollController.prototype.getMaxScrollTop = function () { return this.getScrollHeight() - this.getClientHeight(); }; ScrollController.prototype.getMaxScrollLeft = function () { return this.getScrollWidth() - this.getClientWidth(); }; ScrollController.prototype.canScrollVertically = function () { return this.getMaxScrollTop() > 0; }; ScrollController.prototype.canScrollHorizontally = function () { return this.getMaxScrollLeft() > 0; }; ScrollController.prototype.canScrollUp = function () { return this.getScrollTop() > 0; }; ScrollController.prototype.canScrollDown = function () { return this.getScrollTop() < this.getMaxScrollTop(); }; ScrollController.prototype.canScrollLeft = function () { return this.getScrollLeft() > 0; }; ScrollController.prototype.canScrollRight = function () { return this.getScrollLeft() < this.getMaxScrollLeft(); }; return ScrollController; }(); var ElementScrollController = /** @class */ function (_super) { tslib.__extends(ElementScrollController, _super); function ElementScrollController(el) { var _this = _super.call(this) || this; _this.el = el; return _this; } ElementScrollController.prototype.getScrollTop = function () { return this.el.scrollTop; }; ElementScrollController.prototype.getScrollLeft = function () { return this.el.scrollLeft; }; ElementScrollController.prototype.setScrollTop = function (top) { this.el.scrollTop = top; }; ElementScrollController.prototype.setScrollLeft = function (left) { this.el.scrollLeft = left; }; ElementScrollController.prototype.getScrollWidth = function () { return this.el.scrollWidth; }; ElementScrollController.prototype.getScrollHeight = function () { return this.el.scrollHeight; }; ElementScrollController.prototype.getClientHeight = function () { return this.el.clientHeight; }; ElementScrollController.prototype.getClientWidth = function () { return this.el.clientWidth; }; return ElementScrollController; }(ScrollController); var WindowScrollController = /** @class */ function (_super) { tslib.__extends(WindowScrollController, _super); function WindowScrollController() { return _super !== null && _super.apply(this, arguments) || this; } WindowScrollController.prototype.getScrollTop = function () { return window.pageYOffset; }; WindowScrollController.prototype.getScrollLeft = function () { return window.pageXOffset; }; WindowScrollController.prototype.setScrollTop = function (n) { window.scroll(window.pageXOffset, n); }; WindowScrollController.prototype.setScrollLeft = function (n) { window.scroll(n, window.pageYOffset); }; WindowScrollController.prototype.getScrollWidth = function () { return document.documentElement.scrollWidth; }; WindowScrollController.prototype.getScrollHeight = function () { return document.documentElement.scrollHeight; }; WindowScrollController.prototype.getClientHeight = function () { return document.documentElement.clientHeight; }; WindowScrollController.prototype.getClientWidth = function () { return document.documentElement.clientWidth; }; return WindowScrollController; }(ScrollController); var Theme = /** @class */ function () { function Theme(calendarOptions) { if (this.iconOverrideOption) { this.setIconOverride(calendarOptions[this.iconOverrideOption]); } } Theme.prototype.setIconOverride = function (iconOverrideHash) { var iconClassesCopy; var buttonName; if (_typeof(iconOverrideHash) === 'object' && iconOverrideHash) { // non-null object iconClassesCopy = tslib.__assign({}, this.iconClasses); for (buttonName in iconOverrideHash) { iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]); } this.iconClasses = iconClassesCopy; } else if (iconOverrideHash === false) { this.iconClasses = {}; } }; Theme.prototype.applyIconOverridePrefix = function (className) { var prefix = this.iconOverridePrefix; if (prefix && className.indexOf(prefix) !== 0) { // if not already present className = prefix + className; } return className; }; Theme.prototype.getClass = function (key) { return this.classes[key] || ''; }; Theme.prototype.getIconClass = function (buttonName, isRtl) { var className; if (isRtl && this.rtlIconClasses) { className = this.rtlIconClasses[buttonName] || this.iconClasses[buttonName]; } else { className = this.iconClasses[buttonName]; } if (className) { return this.baseIconClass + " " + className; } return ''; }; Theme.prototype.getCustomButtonIconClass = function (customButtonProps) { var className; if (this.iconOverrideCustomButtonOption) { className = customButtonProps[this.iconOverrideCustomButtonOption]; if (className) { return this.baseIconClass + " " + this.applyIconOverridePrefix(className); } } return ''; }; return Theme; }(); Theme.prototype.classes = {}; Theme.prototype.iconClasses = {}; Theme.prototype.baseIconClass = ''; Theme.prototype.iconOverridePrefix = ''; var ScrollResponder = /** @class */ function () { function ScrollResponder(execFunc, emitter, scrollTime, scrollTimeReset) { var _this = this; this.execFunc = execFunc; this.emitter = emitter; this.scrollTime = scrollTime; this.scrollTimeReset = scrollTimeReset; this.handleScrollRequest = function (request) { _this.queuedRequest = tslib.__assign({}, _this.queuedRequest || {}, request); _this.drain(); }; emitter.on('_scrollRequest', this.handleScrollRequest); this.fireInitialScroll(); } ScrollResponder.prototype.detach = function () { this.emitter.off('_scrollRequest', this.handleScrollRequest); }; ScrollResponder.prototype.update = function (isDatesNew) { if (isDatesNew && this.scrollTimeReset) { this.fireInitialScroll(); // will drain } else { this.drain(); } }; ScrollResponder.prototype.fireInitialScroll = function () { this.handleScrollRequest({ time: this.scrollTime }); }; ScrollResponder.prototype.drain = function () { if (this.queuedRequest && this.execFunc(this.queuedRequest)) { this.queuedRequest = null; } }; return ScrollResponder; }(); var ViewContextType = vdom_cjs.createContext({}); // for Components function buildViewContext(viewSpec, viewApi, viewOptions, dateProfileGenerator, dateEnv, theme, pluginHooks, dispatch, getCurrentData, emitter, calendarApi, registerInteractiveComponent, unregisterInteractiveComponent) { return { dateEnv: dateEnv, options: viewOptions, pluginHooks: pluginHooks, emitter: emitter, dispatch: dispatch, getCurrentData: getCurrentData, calendarApi: calendarApi, viewSpec: viewSpec, viewApi: viewApi, dateProfileGenerator: dateProfileGenerator, theme: theme, isRtl: viewOptions.direction === 'rtl', addResizeHandler: function addResizeHandler(handler) { emitter.on('_resize', handler); }, removeResizeHandler: function removeResizeHandler(handler) { emitter.off('_resize', handler); }, createScrollResponder: function createScrollResponder(execFunc) { return new ScrollResponder(execFunc, emitter, createDuration(viewOptions.scrollTime), viewOptions.scrollTimeReset); }, registerInteractiveComponent: registerInteractiveComponent, unregisterInteractiveComponent: unregisterInteractiveComponent }; } /* eslint max-classes-per-file: off */ var PureComponent = /** @class */ function (_super) { tslib.__extends(PureComponent, _super); function PureComponent() { return _super !== null && _super.apply(this, arguments) || this; } PureComponent.prototype.shouldComponentUpdate = function (nextProps, nextState) { if (this.debug) { // eslint-disable-next-line no-console console.log(getUnequalProps(nextProps, this.props), getUnequalProps(nextState, this.state)); } return !compareObjs(this.props, nextProps, this.propEquality) || !compareObjs(this.state, nextState, this.stateEquality); }; // HACK for freakin' React StrictMode PureComponent.prototype.safeSetState = function (newState) { if (!compareObjs(this.state, tslib.__assign(tslib.__assign({}, this.state), newState), this.stateEquality)) { this.setState(newState); } }; PureComponent.addPropsEquality = addPropsEquality; PureComponent.addStateEquality = addStateEquality; PureComponent.contextType = ViewContextType; return PureComponent; }(vdom_cjs.Component); PureComponent.prototype.propEquality = {}; PureComponent.prototype.stateEquality = {}; var BaseComponent = /** @class */ function (_super) { tslib.__extends(BaseComponent, _super); function BaseComponent() { return _super !== null && _super.apply(this, arguments) || this; } BaseComponent.contextType = ViewContextType; return BaseComponent; }(PureComponent); function addPropsEquality(propEquality) { var hash = Object.create(this.prototype.propEquality); tslib.__assign(hash, propEquality); this.prototype.propEquality = hash; } function addStateEquality(stateEquality) { var hash = Object.create(this.prototype.stateEquality); tslib.__assign(hash, stateEquality); this.prototype.stateEquality = hash; } // use other one function setRef(ref, current) { if (typeof ref === 'function') { ref(current); } else if (ref) { // see https://github.com/facebook/react/issues/13029 ref.current = current; } } /* an INTERACTABLE date component PURPOSES: - hook up to fg, fill, and mirror renderers - interface for dragging and hits */ var DateComponent = /** @class */ function (_super) { tslib.__extends(DateComponent, _super); function DateComponent() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.uid = guid(); return _this; } // Hit System // ----------------------------------------------------------------------------------------------------------------- DateComponent.prototype.prepareHits = function () {}; DateComponent.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) { return null; // this should be abstract }; // Pointer Interaction Utils // ----------------------------------------------------------------------------------------------------------------- DateComponent.prototype.isValidSegDownEl = function (el) { return !this.props.eventDrag && // HACK !this.props.eventResize && // HACK !elementClosest(el, '.fc-event-mirror'); }; DateComponent.prototype.isValidDateDownEl = function (el) { return !elementClosest(el, '.fc-event:not(.fc-bg-event)') && !elementClosest(el, '.fc-more-link') && // a "more.." link !elementClosest(el, 'a[data-navlink]') && // a clickable nav link !elementClosest(el, '.fc-popover'); // hack }; return DateComponent; }(BaseComponent); // TODO: easier way to add new hooks? need to update a million things function createPlugin(input) { return { id: guid(), deps: input.deps || [], reducers: input.reducers || [], isLoadingFuncs: input.isLoadingFuncs || [], contextInit: [].concat(input.contextInit || []), eventRefiners: input.eventRefiners || {}, eventDefMemberAdders: input.eventDefMemberAdders || [], eventSourceRefiners: input.eventSourceRefiners || {}, isDraggableTransformers: input.isDraggableTransformers || [], eventDragMutationMassagers: input.eventDragMutationMassagers || [], eventDefMutationAppliers: input.eventDefMutationAppliers || [], dateSelectionTransformers: input.dateSelectionTransformers || [], datePointTransforms: input.datePointTransforms || [], dateSpanTransforms: input.dateSpanTransforms || [], views: input.views || {}, viewPropsTransformers: input.viewPropsTransformers || [], isPropsValid: input.isPropsValid || null, externalDefTransforms: input.externalDefTransforms || [], viewContainerAppends: input.viewContainerAppends || [], eventDropTransformers: input.eventDropTransformers || [], componentInteractions: input.componentInteractions || [], calendarInteractions: input.calendarInteractions || [], themeClasses: input.themeClasses || {}, eventSourceDefs: input.eventSourceDefs || [], cmdFormatter: input.cmdFormatter, recurringTypes: input.recurringTypes || [], namedTimeZonedImpl: input.namedTimeZonedImpl, initialView: input.initialView || '', elementDraggingImpl: input.elementDraggingImpl, optionChangeHandlers: input.optionChangeHandlers || {}, scrollGridImpl: input.scrollGridImpl || null, contentTypeHandlers: input.contentTypeHandlers || {}, listenerRefiners: input.listenerRefiners || {}, optionRefiners: input.optionRefiners || {}, propSetHandlers: input.propSetHandlers || {} }; } function buildPluginHooks(pluginDefs, globalDefs) { var isAdded = {}; var hooks = { reducers: [], isLoadingFuncs: [], contextInit: [], eventRefiners: {}, eventDefMemberAdders: [], eventSourceRefiners: {}, isDraggableTransformers: [], eventDragMutationMassagers: [], eventDefMutationAppliers: [], dateSelectionTransformers: [], datePointTransforms: [], dateSpanTransforms: [], views: {}, viewPropsTransformers: [], isPropsValid: null, externalDefTransforms: [], viewContainerAppends: [], eventDropTransformers: [], componentInteractions: [], calendarInteractions: [], themeClasses: {}, eventSourceDefs: [], cmdFormatter: null, recurringTypes: [], namedTimeZonedImpl: null, initialView: '', elementDraggingImpl: null, optionChangeHandlers: {}, scrollGridImpl: null, contentTypeHandlers: {}, listenerRefiners: {}, optionRefiners: {}, propSetHandlers: {} }; function addDefs(defs) { for (var _i = 0, defs_1 = defs; _i < defs_1.length; _i++) { var def = defs_1[_i]; if (!isAdded[def.id]) { isAdded[def.id] = true; addDefs(def.deps); hooks = combineHooks(hooks, def); } } } if (pluginDefs) { addDefs(pluginDefs); } addDefs(globalDefs); return hooks; } function buildBuildPluginHooks() { var currentOverrideDefs = []; var currentGlobalDefs = []; var currentHooks; return function (overrideDefs, globalDefs) { if (!currentHooks || !isArraysEqual(overrideDefs, currentOverrideDefs) || !isArraysEqual(globalDefs, currentGlobalDefs)) { currentHooks = buildPluginHooks(overrideDefs, globalDefs); } currentOverrideDefs = overrideDefs; currentGlobalDefs = globalDefs; return currentHooks; }; } function combineHooks(hooks0, hooks1) { return { reducers: hooks0.reducers.concat(hooks1.reducers), isLoadingFuncs: hooks0.isLoadingFuncs.concat(hooks1.isLoadingFuncs), contextInit: hooks0.contextInit.concat(hooks1.contextInit), eventRefiners: tslib.__assign(tslib.__assign({}, hooks0.eventRefiners), hooks1.eventRefiners), eventDefMemberAdders: hooks0.eventDefMemberAdders.concat(hooks1.eventDefMemberAdders), eventSourceRefiners: tslib.__assign(tslib.__assign({}, hooks0.eventSourceRefiners), hooks1.eventSourceRefiners), isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers), eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers), eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers), dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers), datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms), dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms), views: tslib.__assign(tslib.__assign({}, hooks0.views), hooks1.views), viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers), isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid, externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms), viewContainerAppends: hooks0.viewContainerAppends.concat(hooks1.viewContainerAppends), eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers), calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions), componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions), themeClasses: tslib.__assign(tslib.__assign({}, hooks0.themeClasses), hooks1.themeClasses), eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs), cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter, recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes), namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl, initialView: hooks0.initialView || hooks1.initialView, elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl, optionChangeHandlers: tslib.__assign(tslib.__assign({}, hooks0.optionChangeHandlers), hooks1.optionChangeHandlers), scrollGridImpl: hooks1.scrollGridImpl || hooks0.scrollGridImpl, contentTypeHandlers: tslib.__assign(tslib.__assign({}, hooks0.contentTypeHandlers), hooks1.contentTypeHandlers), listenerRefiners: tslib.__assign(tslib.__assign({}, hooks0.listenerRefiners), hooks1.listenerRefiners), optionRefiners: tslib.__assign(tslib.__assign({}, hooks0.optionRefiners), hooks1.optionRefiners), propSetHandlers: tslib.__assign(tslib.__assign({}, hooks0.propSetHandlers), hooks1.propSetHandlers) }; } var StandardTheme = /** @class */ function (_super) { tslib.__extends(StandardTheme, _super); function StandardTheme() { return _super !== null && _super.apply(this, arguments) || this; } return StandardTheme; }(Theme); StandardTheme.prototype.classes = { root: 'fc-theme-standard', tableCellShaded: 'fc-cell-shaded', buttonGroup: 'fc-button-group', button: 'fc-button fc-button-primary', buttonActive: 'fc-button-active' }; StandardTheme.prototype.baseIconClass = 'fc-icon'; StandardTheme.prototype.iconClasses = { close: 'fc-icon-x', prev: 'fc-icon-chevron-left', next: 'fc-icon-chevron-right', prevYear: 'fc-icon-chevrons-left', nextYear: 'fc-icon-chevrons-right' }; StandardTheme.prototype.rtlIconClasses = { prev: 'fc-icon-chevron-right', next: 'fc-icon-chevron-left', prevYear: 'fc-icon-chevrons-right', nextYear: 'fc-icon-chevrons-left' }; StandardTheme.prototype.iconOverrideOption = 'buttonIcons'; // TODO: make TS-friendly StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon'; StandardTheme.prototype.iconOverridePrefix = 'fc-icon-'; function compileViewDefs(defaultConfigs, overrideConfigs) { var hash = {}; var viewType; for (viewType in defaultConfigs) { ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs); } for (viewType in overrideConfigs) { ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs); } return hash; } function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) { if (hash[viewType]) { return hash[viewType]; } var viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs); if (viewDef) { hash[viewType] = viewDef; } return viewDef; } function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) { var defaultConfig = defaultConfigs[viewType]; var overrideConfig = overrideConfigs[viewType]; var queryProp = function queryProp(name) { return defaultConfig && defaultConfig[name] !== null ? defaultConfig[name] : overrideConfig && overrideConfig[name] !== null ? overrideConfig[name] : null; }; var theComponent = queryProp('component'); var superType = queryProp('superType'); var superDef = null; if (superType) { if (superType === viewType) { throw new Error('Can\'t have a custom view type that references itself'); } superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs); } if (!theComponent && superDef) { theComponent = superDef.component; } if (!theComponent) { return null; // don't throw a warning, might be settings for a single-unit view } return { type: viewType, component: theComponent, defaults: tslib.__assign(tslib.__assign({}, superDef ? superDef.defaults : {}), defaultConfig ? defaultConfig.rawOptions : {}), overrides: tslib.__assign(tslib.__assign({}, superDef ? superDef.overrides : {}), overrideConfig ? overrideConfig.rawOptions : {}) }; } /* eslint max-classes-per-file: off */ // NOTE: in JSX, you should always use this class with arg. otherwise, will default to any??? var RenderHook = /** @class */ function (_super) { tslib.__extends(RenderHook, _super); function RenderHook() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.rootElRef = vdom_cjs.createRef(); _this.handleRootEl = function (el) { setRef(_this.rootElRef, el); if (_this.props.elRef) { setRef(_this.props.elRef, el); } }; return _this; } RenderHook.prototype.render = function () { var _this = this; var props = this.props; var hookProps = props.hookProps; return vdom_cjs.createElement(MountHook, { hookProps: hookProps, didMount: props.didMount, willUnmount: props.willUnmount, elRef: this.handleRootEl }, function (rootElRef) { return vdom_cjs.createElement(ContentHook, { hookProps: hookProps, content: props.content, defaultContent: props.defaultContent, backupElRef: _this.rootElRef }, function (innerElRef, innerContent) { return props.children(rootElRef, normalizeClassNames(props.classNames, hookProps), innerElRef, innerContent); }); }); }; return RenderHook; }(BaseComponent); // TODO: rename to be about function, not default. use in above type // for forcing rerender of components that use the ContentHook var CustomContentRenderContext = vdom_cjs.createContext(0); function ContentHook(props) { return vdom_cjs.createElement(CustomContentRenderContext.Consumer, null, function (renderId) { return vdom_cjs.createElement(ContentHookInner, tslib.__assign({ renderId: renderId }, props)); }); } var ContentHookInner = /** @class */ function (_super) { tslib.__extends(ContentHookInner, _super); function ContentHookInner() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.innerElRef = vdom_cjs.createRef(); return _this; } ContentHookInner.prototype.render = function () { return this.props.children(this.innerElRef, this.renderInnerContent()); }; ContentHookInner.prototype.componentDidMount = function () { this.updateCustomContent(); }; ContentHookInner.prototype.componentDidUpdate = function () { this.updateCustomContent(); }; ContentHookInner.prototype.componentWillUnmount = function () { if (this.customContentInfo && this.customContentInfo.destroy) { this.customContentInfo.destroy(); } }; ContentHookInner.prototype.renderInnerContent = function () { var customContentInfo = this.customContentInfo; // only populated if using non-[p]react node(s) var innerContent = this.getInnerContent(); var meta = this.getContentMeta(innerContent); // initial run, or content-type changing? (from vue -> react for example) if (!customContentInfo || customContentInfo.contentKey !== meta.contentKey) { // clearing old value if (customContentInfo) { if (customContentInfo.destroy) { customContentInfo.destroy(); } customContentInfo = this.customContentInfo = null; } // assigning new value if (meta.contentKey) { customContentInfo = this.customContentInfo = tslib.__assign({ contentKey: meta.contentKey, contentVal: innerContent[meta.contentKey] }, meta.buildLifecycleFuncs()); } // updating } else if (customContentInfo) { customContentInfo.contentVal = innerContent[meta.contentKey]; } return customContentInfo ? [] // signal that something was specified : innerContent; // assume a [p]react vdom node. use it }; ContentHookInner.prototype.getInnerContent = function () { var props = this.props; var innerContent = normalizeContent(props.content, props.hookProps); if (innerContent === undefined) { // use the default innerContent = normalizeContent(props.defaultContent, props.hookProps); } return innerContent == null ? null : innerContent; // convert undefined to null (better for React) }; ContentHookInner.prototype.getContentMeta = function (innerContent) { var contentTypeHandlers = this.context.pluginHooks.contentTypeHandlers; var contentKey = ''; var buildLifecycleFuncs = null; if (innerContent) { // allowed to be null, for convenience to caller for (var searchKey in contentTypeHandlers) { if (innerContent[searchKey] !== undefined) { contentKey = searchKey; buildLifecycleFuncs = contentTypeHandlers[searchKey]; break; } } } return { contentKey: contentKey, buildLifecycleFuncs: buildLifecycleFuncs }; }; ContentHookInner.prototype.updateCustomContent = function () { if (this.customContentInfo) { // for non-[p]react this.customContentInfo.render(this.innerElRef.current || this.props.backupElRef.current, // the element to render into this.customContentInfo.contentVal); } }; return ContentHookInner; }(BaseComponent); var MountHook = /** @class */ function (_super) { tslib.__extends(MountHook, _super); function MountHook() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.handleRootEl = function (rootEl) { _this.rootEl = rootEl; if (_this.props.elRef) { setRef(_this.props.elRef, rootEl); } }; return _this; } MountHook.prototype.render = function () { return this.props.children(this.handleRootEl); }; MountHook.prototype.componentDidMount = function () { var callback = this.props.didMount; if (callback) { callback(tslib.__assign(tslib.__assign({}, this.props.hookProps), { el: this.rootEl })); } }; MountHook.prototype.componentWillUnmount = function () { var callback = this.props.willUnmount; if (callback) { callback(tslib.__assign(tslib.__assign({}, this.props.hookProps), { el: this.rootEl })); } }; return MountHook; }(BaseComponent); function buildClassNameNormalizer() { var currentGenerator; var currentHookProps; var currentClassNames = []; return function (generator, hookProps) { if (!currentHookProps || !isPropsEqual(currentHookProps, hookProps) || generator !== currentGenerator) { currentGenerator = generator; currentHookProps = hookProps; currentClassNames = normalizeClassNames(generator, hookProps); } return currentClassNames; }; } function normalizeClassNames(classNames, hookProps) { if (typeof classNames === 'function') { classNames = classNames(hookProps); } return parseClassNames(classNames); } function normalizeContent(input, hookProps) { if (typeof input === 'function') { return input(hookProps, vdom_cjs.createElement); // give the function the vdom-creation func } return input; } var ViewRoot = /** @class */ function (_super) { tslib.__extends(ViewRoot, _super); function ViewRoot() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.normalizeClassNames = buildClassNameNormalizer(); return _this; } ViewRoot.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; var options = context.options; var hookProps = { view: context.viewApi }; var customClassNames = this.normalizeClassNames(options.viewClassNames, hookProps); return vdom_cjs.createElement(MountHook, { hookProps: hookProps, didMount: options.viewDidMount, willUnmount: options.viewWillUnmount, elRef: props.elRef }, function (rootElRef) { return props.children(rootElRef, ["fc-" + props.viewSpec.type + "-view", 'fc-view'].concat(customClassNames)); }); }; return ViewRoot; }(BaseComponent); function parseViewConfigs(inputs) { return mapHash(inputs, parseViewConfig); } function parseViewConfig(input) { var rawOptions = typeof input === 'function' ? { component: input } : input; var component = rawOptions.component; if (rawOptions.content) { component = createViewHookComponent(rawOptions); // TODO: remove content/classNames/didMount/etc from options? } return { superType: rawOptions.type, component: component, rawOptions: rawOptions }; } function createViewHookComponent(options) { return function (viewProps) { return vdom_cjs.createElement(ViewContextType.Consumer, null, function (context) { return vdom_cjs.createElement(ViewRoot, { viewSpec: context.viewSpec }, function (viewElRef, viewClassNames) { var hookProps = tslib.__assign(tslib.__assign({}, viewProps), { nextDayThreshold: context.options.nextDayThreshold }); return vdom_cjs.createElement(RenderHook, { hookProps: hookProps, classNames: options.classNames, content: options.content, didMount: options.didMount, willUnmount: options.willUnmount, elRef: viewElRef }, function (rootElRef, customClassNames, innerElRef, innerContent) { return vdom_cjs.createElement("div", { className: viewClassNames.concat(customClassNames).join(' '), ref: rootElRef }, innerContent); }); }); }); }; } function buildViewSpecs(defaultInputs, optionOverrides, dynamicOptionOverrides, localeDefaults) { var defaultConfigs = parseViewConfigs(defaultInputs); var overrideConfigs = parseViewConfigs(optionOverrides.views); var viewDefs = compileViewDefs(defaultConfigs, overrideConfigs); return mapHash(viewDefs, function (viewDef) { return buildViewSpec(viewDef, overrideConfigs, optionOverrides, dynamicOptionOverrides, localeDefaults); }); } function buildViewSpec(viewDef, overrideConfigs, optionOverrides, dynamicOptionOverrides, localeDefaults) { var durationInput = viewDef.overrides.duration || viewDef.defaults.duration || dynamicOptionOverrides.duration || optionOverrides.duration; var duration = null; var durationUnit = ''; var singleUnit = ''; var singleUnitOverrides = {}; if (durationInput) { duration = createDurationCached(durationInput); if (duration) { // valid? var denom = greatestDurationDenominator(duration); durationUnit = denom.unit; if (denom.value === 1) { singleUnit = durationUnit; singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].rawOptions : {}; } } } var queryButtonText = function queryButtonText(optionsSubset) { var buttonTextMap = optionsSubset.buttonText || {}; var buttonTextKey = viewDef.defaults.buttonTextKey; if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) { return buttonTextMap[buttonTextKey]; } if (buttonTextMap[viewDef.type] != null) { return buttonTextMap[viewDef.type]; } if (buttonTextMap[singleUnit] != null) { return buttonTextMap[singleUnit]; } return null; }; var queryButtonTitle = function queryButtonTitle(optionsSubset) { var buttonHints = optionsSubset.buttonHints || {}; var buttonKey = viewDef.defaults.buttonTextKey; // use same key as text if (buttonKey != null && buttonHints[buttonKey] != null) { return buttonHints[buttonKey]; } if (buttonHints[viewDef.type] != null) { return buttonHints[viewDef.type]; } if (buttonHints[singleUnit] != null) { return buttonHints[singleUnit]; } return null; }; return { type: viewDef.type, component: viewDef.component, duration: duration, durationUnit: durationUnit, singleUnit: singleUnit, optionDefaults: viewDef.defaults, optionOverrides: tslib.__assign(tslib.__assign({}, singleUnitOverrides), viewDef.overrides), buttonTextOverride: queryButtonText(dynamicOptionOverrides) || queryButtonText(optionOverrides) || // constructor-specified buttonText lookup hash takes precedence viewDef.overrides.buttonText, buttonTextDefault: queryButtonText(localeDefaults) || viewDef.defaults.buttonText || queryButtonText(BASE_OPTION_DEFAULTS) || viewDef.type, // not DRY buttonTitleOverride: queryButtonTitle(dynamicOptionOverrides) || queryButtonTitle(optionOverrides) || viewDef.overrides.buttonHint, buttonTitleDefault: queryButtonTitle(localeDefaults) || viewDef.defaults.buttonHint || queryButtonTitle(BASE_OPTION_DEFAULTS) // will eventually fall back to buttonText }; } // hack to get memoization working var durationInputMap = {}; function createDurationCached(durationInput) { var json = JSON.stringify(durationInput); var res = durationInputMap[json]; if (res === undefined) { res = createDuration(durationInput); durationInputMap[json] = res; } return res; } var DateProfileGenerator = /** @class */ function () { function DateProfileGenerator(props) { this.props = props; this.nowDate = getNow(props.nowInput, props.dateEnv); this.initHiddenDays(); } /* Date Range Computation ------------------------------------------------------------------------------------------------------------------*/ // Builds a structure with info about what the dates/ranges will be for the "prev" view. DateProfileGenerator.prototype.buildPrev = function (currentDateProfile, currentDate, forceToValid) { var dateEnv = this.props.dateEnv; var prevDate = dateEnv.subtract(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month currentDateProfile.dateIncrement); return this.build(prevDate, -1, forceToValid); }; // Builds a structure with info about what the dates/ranges will be for the "next" view. DateProfileGenerator.prototype.buildNext = function (currentDateProfile, currentDate, forceToValid) { var dateEnv = this.props.dateEnv; var nextDate = dateEnv.add(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month currentDateProfile.dateIncrement); return this.build(nextDate, 1, forceToValid); }; // Builds a structure holding dates/ranges for rendering around the given date. // Optional direction param indicates whether the date is being incremented/decremented // from its previous value. decremented = -1, incremented = 1 (default). DateProfileGenerator.prototype.build = function (currentDate, direction, forceToValid) { if (forceToValid === void 0) { forceToValid = true; } var props = this.props; var validRange; var currentInfo; var isRangeAllDay; var renderRange; var activeRange; var isValid; validRange = this.buildValidRange(); validRange = this.trimHiddenDays(validRange); if (forceToValid) { currentDate = constrainMarkerToRange(currentDate, validRange); } currentInfo = this.buildCurrentRangeInfo(currentDate, direction); isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit); renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay); renderRange = this.trimHiddenDays(renderRange); activeRange = renderRange; if (!props.showNonCurrentDates) { activeRange = intersectRanges(activeRange, currentInfo.range); } activeRange = this.adjustActiveRange(activeRange); activeRange = intersectRanges(activeRange, validRange); // might return null // it's invalid if the originally requested date is not contained, // or if the range is completely outside of the valid range. isValid = rangesIntersect(currentInfo.range, validRange); return { // constraint for where prev/next operations can go and where events can be dragged/resized to. // an object with optional start and end properties. validRange: validRange, // range the view is formally responsible for. // for example, a month view might have 1st-31st, excluding padded dates currentRange: currentInfo.range, // name of largest unit being displayed, like "month" or "week" currentRangeUnit: currentInfo.unit, isRangeAllDay: isRangeAllDay, // dates that display events and accept drag-n-drop // will be `null` if no dates accept events activeRange: activeRange, // date range with a rendered skeleton // includes not-active days that need some sort of DOM renderRange: renderRange, // Duration object that denotes the first visible time of any given day slotMinTime: props.slotMinTime, // Duration object that denotes the exclusive visible end time of any given day slotMaxTime: props.slotMaxTime, isValid: isValid, // how far the current date will move for a prev/next operation dateIncrement: this.buildDateIncrement(currentInfo.duration) // pass a fallback (might be null) ^ }; }; // Builds an object with optional start/end properties. // Indicates the minimum/maximum dates to display. // not responsible for trimming hidden days. DateProfileGenerator.prototype.buildValidRange = function () { var input = this.props.validRangeInput; var simpleInput = typeof input === 'function' ? input.call(this.props.calendarApi, this.nowDate) : input; return this.refineRange(simpleInput) || { start: null, end: null }; // completely open-ended }; // Builds a structure with info about the "current" range, the range that is // highlighted as being the current month for example. // See build() for a description of `direction`. // Guaranteed to have `range` and `unit` properties. `duration` is optional. DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) { var props = this.props; var duration = null; var unit = null; var range = null; var dayCount; if (props.duration) { duration = props.duration; unit = props.durationUnit; range = this.buildRangeFromDuration(date, direction, duration, unit); } else if (dayCount = this.props.dayCount) { unit = 'day'; range = this.buildRangeFromDayCount(date, direction, dayCount); } else if (range = this.buildCustomVisibleRange(date)) { unit = props.dateEnv.greatestWholeUnit(range.start, range.end).unit; } else { duration = this.getFallbackDuration(); unit = greatestDurationDenominator(duration).unit; range = this.buildRangeFromDuration(date, direction, duration, unit); } return { duration: duration, unit: unit, range: range }; }; DateProfileGenerator.prototype.getFallbackDuration = function () { return createDuration({ day: 1 }); }; // Returns a new activeRange to have time values (un-ambiguate) // slotMinTime or slotMaxTime causes the range to expand. DateProfileGenerator.prototype.adjustActiveRange = function (range) { var _a = this.props, dateEnv = _a.dateEnv, usesMinMaxTime = _a.usesMinMaxTime, slotMinTime = _a.slotMinTime, slotMaxTime = _a.slotMaxTime; var start = range.start, end = range.end; if (usesMinMaxTime) { // expand active range if slotMinTime is negative (why not when positive?) if (asRoughDays(slotMinTime) < 0) { start = startOfDay(start); // necessary? start = dateEnv.add(start, slotMinTime); } // expand active range if slotMaxTime is beyond one day (why not when negative?) if (asRoughDays(slotMaxTime) > 1) { end = startOfDay(end); // necessary? end = addDays(end, -1); end = dateEnv.add(end, slotMaxTime); } } return { start: start, end: end }; }; // Builds the "current" range when it is specified as an explicit duration. // `unit` is the already-computed greatestDurationDenominator unit of duration. DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) { var _a = this.props, dateEnv = _a.dateEnv, dateAlignment = _a.dateAlignment; var start; var end; var res; // compute what the alignment should be if (!dateAlignment) { var dateIncrement = this.props.dateIncrement; if (dateIncrement) { // use the smaller of the two units if (asRoughMs(dateIncrement) < asRoughMs(duration)) { dateAlignment = greatestDurationDenominator(dateIncrement).unit; } else { dateAlignment = unit; } } else { dateAlignment = unit; } } // if the view displays a single day or smaller if (asRoughDays(duration) <= 1) { if (this.isHiddenDay(start)) { start = this.skipHiddenDays(start, direction); start = startOfDay(start); } } function computeRes() { start = dateEnv.startOf(date, dateAlignment); end = dateEnv.add(start, duration); res = { start: start, end: end }; } computeRes(); // if range is completely enveloped by hidden days, go past the hidden days if (!this.trimHiddenDays(res)) { date = this.skipHiddenDays(date, direction); computeRes(); } return res; }; // Builds the "current" range when a dayCount is specified. DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) { var _a = this.props, dateEnv = _a.dateEnv, dateAlignment = _a.dateAlignment; var runningCount = 0; var start = date; var end; if (dateAlignment) { start = dateEnv.startOf(start, dateAlignment); } start = startOfDay(start); start = this.skipHiddenDays(start, direction); end = start; do { end = addDays(end, 1); if (!this.isHiddenDay(end)) { runningCount += 1; } } while (runningCount < dayCount); return { start: start, end: end }; }; // Builds a normalized range object for the "visible" range, // which is a way to define the currentRange and activeRange at the same time. DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) { var props = this.props; var input = props.visibleRangeInput; var simpleInput = typeof input === 'function' ? input.call(props.calendarApi, props.dateEnv.toDate(date)) : input; var range = this.refineRange(simpleInput); if (range && (range.start == null || range.end == null)) { return null; } return range; }; // Computes the range that will represent the element/cells for *rendering*, // but which may have voided days/times. // not responsible for trimming hidden days. DateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) { return currentRange; }; // Compute the duration value that should be added/substracted to the current date // when a prev/next operation happens. DateProfileGenerator.prototype.buildDateIncrement = function (fallback) { var dateIncrement = this.props.dateIncrement; var customAlignment; if (dateIncrement) { return dateIncrement; } if (customAlignment = this.props.dateAlignment) { return createDuration(1, customAlignment); } if (fallback) { return fallback; } return createDuration({ days: 1 }); }; DateProfileGenerator.prototype.refineRange = function (rangeInput) { if (rangeInput) { var range = parseRange(rangeInput, this.props.dateEnv); if (range) { range = computeVisibleDayRange(range); } return range; } return null; }; /* Hidden Days ------------------------------------------------------------------------------------------------------------------*/ // Initializes internal variables related to calculating hidden days-of-week DateProfileGenerator.prototype.initHiddenDays = function () { var hiddenDays = this.props.hiddenDays || []; // array of day-of-week indices that are hidden var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool) var dayCnt = 0; var i; if (this.props.weekends === false) { hiddenDays.push(0, 6); // 0=sunday, 6=saturday } for (i = 0; i < 7; i += 1) { if (!(isHiddenDayHash[i] = hiddenDays.indexOf(i) !== -1)) { dayCnt += 1; } } if (!dayCnt) { throw new Error('invalid hiddenDays'); // all days were hidden? bad. } this.isHiddenDayHash = isHiddenDayHash; }; // Remove days from the beginning and end of the range that are computed as hidden. // If the whole range is trimmed off, returns null DateProfileGenerator.prototype.trimHiddenDays = function (range) { var start = range.start, end = range.end; if (start) { start = this.skipHiddenDays(start); } if (end) { end = this.skipHiddenDays(end, -1, true); } if (start == null || end == null || start < end) { return { start: start, end: end }; } return null; }; // Is the current day hidden? // `day` is a day-of-week index (0-6), or a Date (used for UTC) DateProfileGenerator.prototype.isHiddenDay = function (day) { if (day instanceof Date) { day = day.getUTCDay(); } return this.isHiddenDayHash[day]; }; // Incrementing the current day until it is no longer a hidden day, returning a copy. // DOES NOT CONSIDER validRange! // If the initial value of `date` is not a hidden day, don't do anything. // Pass `isExclusive` as `true` if you are dealing with an end date. // `inc` defaults to `1` (increment one day forward each time) DateProfileGenerator.prototype.skipHiddenDays = function (date, inc, isExclusive) { if (inc === void 0) { inc = 1; } if (isExclusive === void 0) { isExclusive = false; } while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) { date = addDays(date, inc); } return date; }; return DateProfileGenerator; }(); function reduceViewType(viewType, action) { switch (action.type) { case 'CHANGE_VIEW_TYPE': viewType = action.viewType; } return viewType; } function reduceDynamicOptionOverrides(dynamicOptionOverrides, action) { var _a; switch (action.type) { case 'SET_OPTION': return tslib.__assign(tslib.__assign({}, dynamicOptionOverrides), (_a = {}, _a[action.optionName] = action.rawOptionValue, _a)); default: return dynamicOptionOverrides; } } function reduceDateProfile(currentDateProfile, action, currentDate, dateProfileGenerator) { var dp; switch (action.type) { case 'CHANGE_VIEW_TYPE': return dateProfileGenerator.build(action.dateMarker || currentDate); case 'CHANGE_DATE': return dateProfileGenerator.build(action.dateMarker); case 'PREV': dp = dateProfileGenerator.buildPrev(currentDateProfile, currentDate); if (dp.isValid) { return dp; } break; case 'NEXT': dp = dateProfileGenerator.buildNext(currentDateProfile, currentDate); if (dp.isValid) { return dp; } break; } return currentDateProfile; } function initEventSources(calendarOptions, dateProfile, context) { var activeRange = dateProfile ? dateProfile.activeRange : null; return addSources({}, parseInitialSources(calendarOptions, context), activeRange, context); } function reduceEventSources(eventSources, action, dateProfile, context) { var activeRange = dateProfile ? dateProfile.activeRange : null; // need this check? switch (action.type) { case 'ADD_EVENT_SOURCES': // already parsed return addSources(eventSources, action.sources, activeRange, context); case 'REMOVE_EVENT_SOURCE': return removeSource(eventSources, action.sourceId); case 'PREV': // TODO: how do we track all actions that affect dateProfile :( case 'NEXT': case 'CHANGE_DATE': case 'CHANGE_VIEW_TYPE': if (dateProfile) { return fetchDirtySources(eventSources, activeRange, context); } return eventSources; case 'FETCH_EVENT_SOURCES': return fetchSourcesByIds(eventSources, action.sourceIds ? // why no type? arrayToHash(action.sourceIds) : excludeStaticSources(eventSources, context), activeRange, action.isRefetch || false, context); case 'RECEIVE_EVENTS': case 'RECEIVE_EVENT_ERROR': return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange); case 'REMOVE_ALL_EVENT_SOURCES': return {}; default: return eventSources; } } function reduceEventSourcesNewTimeZone(eventSources, dateProfile, context) { var activeRange = dateProfile ? dateProfile.activeRange : null; // need this check? return fetchSourcesByIds(eventSources, excludeStaticSources(eventSources, context), activeRange, true, context); } function computeEventSourcesLoading(eventSources) { for (var sourceId in eventSources) { if (eventSources[sourceId].isFetching) { return true; } } return false; } function addSources(eventSourceHash, sources, fetchRange, context) { var hash = {}; for (var _i = 0, sources_1 = sources; _i < sources_1.length; _i++) { var source = sources_1[_i]; hash[source.sourceId] = source; } if (fetchRange) { hash = fetchDirtySources(hash, fetchRange, context); } return tslib.__assign(tslib.__assign({}, eventSourceHash), hash); } function removeSource(eventSourceHash, sourceId) { return filterHash(eventSourceHash, function (eventSource) { return eventSource.sourceId !== sourceId; }); } function fetchDirtySources(sourceHash, fetchRange, context) { return fetchSourcesByIds(sourceHash, filterHash(sourceHash, function (eventSource) { return isSourceDirty(eventSource, fetchRange, context); }), fetchRange, false, context); } function isSourceDirty(eventSource, fetchRange, context) { if (!doesSourceNeedRange(eventSource, context)) { return !eventSource.latestFetchId; } return !context.options.lazyFetching || !eventSource.fetchRange || eventSource.isFetching || // always cancel outdated in-progress fetches fetchRange.start < eventSource.fetchRange.start || fetchRange.end > eventSource.fetchRange.end; } function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, isRefetch, context) { var nextSources = {}; for (var sourceId in prevSources) { var source = prevSources[sourceId]; if (sourceIdHash[sourceId]) { nextSources[sourceId] = fetchSource(source, fetchRange, isRefetch, context); } else { nextSources[sourceId] = source; } } return nextSources; } function fetchSource(eventSource, fetchRange, isRefetch, context) { var options = context.options, calendarApi = context.calendarApi; var sourceDef = context.pluginHooks.eventSourceDefs[eventSource.sourceDefId]; var fetchId = guid(); sourceDef.fetch({ eventSource: eventSource, range: fetchRange, isRefetch: isRefetch, context: context }, function (res) { var rawEvents = res.rawEvents; if (options.eventSourceSuccess) { rawEvents = options.eventSourceSuccess.call(calendarApi, rawEvents, res.xhr) || rawEvents; } if (eventSource.success) { rawEvents = eventSource.success.call(calendarApi, rawEvents, res.xhr) || rawEvents; } context.dispatch({ type: 'RECEIVE_EVENTS', sourceId: eventSource.sourceId, fetchId: fetchId, fetchRange: fetchRange, rawEvents: rawEvents }); }, function (error) { console.warn(error.message, error); if (options.eventSourceFailure) { options.eventSourceFailure.call(calendarApi, error); } if (eventSource.failure) { eventSource.failure(error); } context.dispatch({ type: 'RECEIVE_EVENT_ERROR', sourceId: eventSource.sourceId, fetchId: fetchId, fetchRange: fetchRange, error: error }); }); return tslib.__assign(tslib.__assign({}, eventSource), { isFetching: true, latestFetchId: fetchId }); } function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) { var _a; var eventSource = sourceHash[sourceId]; if (eventSource && // not already removed fetchId === eventSource.latestFetchId) { return tslib.__assign(tslib.__assign({}, sourceHash), (_a = {}, _a[sourceId] = tslib.__assign(tslib.__assign({}, eventSource), { isFetching: false, fetchRange: fetchRange }), _a)); } return sourceHash; } function excludeStaticSources(eventSources, context) { return filterHash(eventSources, function (eventSource) { return doesSourceNeedRange(eventSource, context); }); } function parseInitialSources(rawOptions, context) { var refiners = buildEventSourceRefiners(context); var rawSources = [].concat(rawOptions.eventSources || []); var sources = []; // parsed if (rawOptions.initialEvents) { rawSources.unshift(rawOptions.initialEvents); } if (rawOptions.events) { rawSources.unshift(rawOptions.events); } for (var _i = 0, rawSources_1 = rawSources; _i < rawSources_1.length; _i++) { var rawSource = rawSources_1[_i]; var source = parseEventSource(rawSource, context, refiners); if (source) { sources.push(source); } } return sources; } function doesSourceNeedRange(eventSource, context) { var defs = context.pluginHooks.eventSourceDefs; return !defs[eventSource.sourceDefId].ignoreRange; } function reduceEventStore(eventStore, action, eventSources, dateProfile, context) { switch (action.type) { case 'RECEIVE_EVENTS': // raw return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, context); case 'ADD_EVENTS': // already parsed, but not expanded return addEvent(eventStore, action.eventStore, // new ones dateProfile ? dateProfile.activeRange : null, context); case 'RESET_EVENTS': return action.eventStore; case 'MERGE_EVENTS': // already parsed and expanded return mergeEventStores(eventStore, action.eventStore); case 'PREV': // TODO: how do we track all actions that affect dateProfile :( case 'NEXT': case 'CHANGE_DATE': case 'CHANGE_VIEW_TYPE': if (dateProfile) { return expandRecurring(eventStore, dateProfile.activeRange, context); } return eventStore; case 'REMOVE_EVENTS': return excludeSubEventStore(eventStore, action.eventStore); case 'REMOVE_EVENT_SOURCE': return excludeEventsBySourceId(eventStore, action.sourceId); case 'REMOVE_ALL_EVENT_SOURCES': return filterEventStoreDefs(eventStore, function (eventDef) { return !eventDef.sourceId // only keep events with no source id ; }); case 'REMOVE_ALL_EVENTS': return createEmptyEventStore(); default: return eventStore; } } function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, context) { if (eventSource && // not already removed fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources ) { var subset = parseEvents(transformRawEvents(rawEvents, eventSource, context), eventSource, context); if (fetchRange) { subset = expandRecurring(subset, fetchRange, context); } return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset); } return eventStore; } function transformRawEvents(rawEvents, eventSource, context) { var calEachTransform = context.options.eventDataTransform; var sourceEachTransform = eventSource ? eventSource.eventDataTransform : null; if (sourceEachTransform) { rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform); } if (calEachTransform) { rawEvents = transformEachRawEvent(rawEvents, calEachTransform); } return rawEvents; } function transformEachRawEvent(rawEvents, func) { var refinedEvents; if (!func) { refinedEvents = rawEvents; } else { refinedEvents = []; for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) { var rawEvent = rawEvents_1[_i]; var refinedEvent = func(rawEvent); if (refinedEvent) { refinedEvents.push(refinedEvent); } else if (refinedEvent == null) { refinedEvents.push(rawEvent); } // if a different falsy value, do nothing } } return refinedEvents; } function addEvent(eventStore, subset, expandRange, context) { if (expandRange) { subset = expandRecurring(subset, expandRange, context); } return mergeEventStores(eventStore, subset); } function rezoneEventStoreDates(eventStore, oldDateEnv, newDateEnv) { var defs = eventStore.defs; var instances = mapHash(eventStore.instances, function (instance) { var def = defs[instance.defId]; if (def.allDay || def.recurringDef) { return instance; // isn't dependent on timezone } return tslib.__assign(tslib.__assign({}, instance), { range: { start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)), end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo)) }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo }); }); return { defs: defs, instances: instances }; } function excludeEventsBySourceId(eventStore, sourceId) { return filterEventStoreDefs(eventStore, function (eventDef) { return eventDef.sourceId !== sourceId; }); } // QUESTION: why not just return instances? do a general object-property-exclusion util function excludeInstances(eventStore, removals) { return { defs: eventStore.defs, instances: filterHash(eventStore.instances, function (instance) { return !removals[instance.instanceId]; }) }; } function reduceDateSelection(currentSelection, action) { switch (action.type) { case 'UNSELECT_DATES': return null; case 'SELECT_DATES': return action.selection; default: return currentSelection; } } function reduceSelectedEvent(currentInstanceId, action) { switch (action.type) { case 'UNSELECT_EVENT': return ''; case 'SELECT_EVENT': return action.eventInstanceId; default: return currentInstanceId; } } function reduceEventDrag(currentDrag, action) { var newDrag; switch (action.type) { case 'UNSET_EVENT_DRAG': return null; case 'SET_EVENT_DRAG': newDrag = action.state; return { affectedEvents: newDrag.affectedEvents, mutatedEvents: newDrag.mutatedEvents, isEvent: newDrag.isEvent }; default: return currentDrag; } } function reduceEventResize(currentResize, action) { var newResize; switch (action.type) { case 'UNSET_EVENT_RESIZE': return null; case 'SET_EVENT_RESIZE': newResize = action.state; return { affectedEvents: newResize.affectedEvents, mutatedEvents: newResize.mutatedEvents, isEvent: newResize.isEvent }; default: return currentResize; } } function parseToolbars(calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) { var header = calendarOptions.headerToolbar ? parseToolbar(calendarOptions.headerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) : null; var footer = calendarOptions.footerToolbar ? parseToolbar(calendarOptions.footerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) : null; return { header: header, footer: footer }; } function parseToolbar(sectionStrHash, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) { var sectionWidgets = {}; var viewsWithButtons = []; var hasTitle = false; for (var sectionName in sectionStrHash) { var sectionStr = sectionStrHash[sectionName]; var sectionRes = parseSection(sectionStr, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi); sectionWidgets[sectionName] = sectionRes.widgets; viewsWithButtons.push.apply(viewsWithButtons, sectionRes.viewsWithButtons); hasTitle = hasTitle || sectionRes.hasTitle; } return { sectionWidgets: sectionWidgets, viewsWithButtons: viewsWithButtons, hasTitle: hasTitle }; } /* BAD: querying icons and text here. should be done at render time */ function parseSection(sectionStr, calendarOptions, // defaults+overrides, then refined calendarOptionOverrides, // overrides only!, unrefined :( theme, viewSpecs, calendarApi) { var isRtl = calendarOptions.direction === 'rtl'; var calendarCustomButtons = calendarOptions.customButtons || {}; var calendarButtonTextOverrides = calendarOptionOverrides.buttonText || {}; var calendarButtonText = calendarOptions.buttonText || {}; var calendarButtonHintOverrides = calendarOptionOverrides.buttonHints || {}; var calendarButtonHints = calendarOptions.buttonHints || {}; var sectionSubstrs = sectionStr ? sectionStr.split(' ') : []; var viewsWithButtons = []; var hasTitle = false; var widgets = sectionSubstrs.map(function (buttonGroupStr) { return buttonGroupStr.split(',').map(function (buttonName) { if (buttonName === 'title') { hasTitle = true; return { buttonName: buttonName }; } var customButtonProps; var viewSpec; var buttonClick; var buttonIcon; // only one of these will be set var buttonText; // " var buttonHint; // ^ for the title="" attribute, for accessibility if (customButtonProps = calendarCustomButtons[buttonName]) { buttonClick = function buttonClick(ev) { if (customButtonProps.click) { customButtonProps.click.call(ev.target, ev, ev.target); // TODO: use Calendar this context? } }; (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) || (buttonIcon = theme.getIconClass(buttonName, isRtl)) || (buttonText = customButtonProps.text); buttonHint = customButtonProps.hint || customButtonProps.text; } else if (viewSpec = viewSpecs[buttonName]) { viewsWithButtons.push(buttonName); buttonClick = function buttonClick() { calendarApi.changeView(buttonName); }; (buttonText = viewSpec.buttonTextOverride) || (buttonIcon = theme.getIconClass(buttonName, isRtl)) || (buttonText = viewSpec.buttonTextDefault); var textFallback = viewSpec.buttonTextOverride || viewSpec.buttonTextDefault; buttonHint = formatWithOrdinals(viewSpec.buttonTitleOverride || viewSpec.buttonTitleDefault || calendarOptions.viewHint, [textFallback, buttonName], // view-name = buttonName textFallback); } else if (calendarApi[buttonName]) { // a calendarApi method buttonClick = function buttonClick() { calendarApi[buttonName](); }; (buttonText = calendarButtonTextOverrides[buttonName]) || (buttonIcon = theme.getIconClass(buttonName, isRtl)) || (buttonText = calendarButtonText[buttonName]); // everything else is considered default if (buttonName === 'prevYear' || buttonName === 'nextYear') { var prevOrNext = buttonName === 'prevYear' ? 'prev' : 'next'; buttonHint = formatWithOrdinals(calendarButtonHintOverrides[prevOrNext] || calendarButtonHints[prevOrNext], [calendarButtonText.year || 'year', 'year'], calendarButtonText[buttonName]); } else { buttonHint = function buttonHint(navUnit) { return formatWithOrdinals(calendarButtonHintOverrides[buttonName] || calendarButtonHints[buttonName], [calendarButtonText[navUnit] || navUnit, navUnit], calendarButtonText[buttonName]); }; } } return { buttonName: buttonName, buttonClick: buttonClick, buttonIcon: buttonIcon, buttonText: buttonText, buttonHint: buttonHint }; }); }); return { widgets: widgets, viewsWithButtons: viewsWithButtons, hasTitle: hasTitle }; } var eventSourceDef$2 = { ignoreRange: true, parseMeta: function parseMeta(refined) { if (Array.isArray(refined.events)) { return refined.events; } return null; }, fetch: function fetch(arg, success) { success({ rawEvents: arg.eventSource.meta }); } }; var arrayEventSourcePlugin = createPlugin({ eventSourceDefs: [eventSourceDef$2] }); var eventSourceDef$1 = { parseMeta: function parseMeta(refined) { if (typeof refined.events === 'function') { return refined.events; } return null; }, fetch: function fetch(arg, success, failure) { var dateEnv = arg.context.dateEnv; var func = arg.eventSource.meta; unpromisify(func.bind(null, buildRangeApiWithTimeZone(arg.range, dateEnv)), function (rawEvents) { success({ rawEvents: rawEvents }); // needs an object response }, failure); } }; var funcEventSourcePlugin = createPlugin({ eventSourceDefs: [eventSourceDef$1] }); function requestJson(method, url, params, successCallback, failureCallback) { method = method.toUpperCase(); var body = null; if (method === 'GET') { url = injectQueryStringParams(url, params); } else { body = encodeParams(params); } var xhr = new XMLHttpRequest(); xhr.open(method, url, true); if (method !== 'GET') { xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); } xhr.onload = function () { if (xhr.status >= 200 && xhr.status < 400) { var parsed = false; var res = void 0; try { res = JSON.parse(xhr.responseText); parsed = true; } catch (err) {// will handle parsed=false } if (parsed) { successCallback(res, xhr); } else { failureCallback('Failure parsing JSON', xhr); } } else { failureCallback('Request failed', xhr); } }; xhr.onerror = function () { failureCallback('Request failed', xhr); }; xhr.send(body); } function injectQueryStringParams(url, params) { return url + (url.indexOf('?') === -1 ? '?' : '&') + encodeParams(params); } function encodeParams(params) { var parts = []; for (var key in params) { parts.push(encodeURIComponent(key) + "=" + encodeURIComponent(params[key])); } return parts.join('&'); } var JSON_FEED_EVENT_SOURCE_REFINERS = { method: String, extraParams: identity, startParam: String, endParam: String, timeZoneParam: String }; var eventSourceDef = { parseMeta: function parseMeta(refined) { if (refined.url && (refined.format === 'json' || !refined.format)) { return { url: refined.url, format: 'json', method: (refined.method || 'GET').toUpperCase(), extraParams: refined.extraParams, startParam: refined.startParam, endParam: refined.endParam, timeZoneParam: refined.timeZoneParam }; } return null; }, fetch: function fetch(arg, success, failure) { var meta = arg.eventSource.meta; var requestParams = buildRequestParams(meta, arg.range, arg.context); requestJson(meta.method, meta.url, requestParams, function (rawEvents, xhr) { success({ rawEvents: rawEvents, xhr: xhr }); }, function (errorMessage, xhr) { failure({ message: errorMessage, xhr: xhr }); }); } }; var jsonFeedEventSourcePlugin = createPlugin({ eventSourceRefiners: JSON_FEED_EVENT_SOURCE_REFINERS, eventSourceDefs: [eventSourceDef] }); function buildRequestParams(meta, range, context) { var dateEnv = context.dateEnv, options = context.options; var startParam; var endParam; var timeZoneParam; var customRequestParams; var params = {}; startParam = meta.startParam; if (startParam == null) { startParam = options.startParam; } endParam = meta.endParam; if (endParam == null) { endParam = options.endParam; } timeZoneParam = meta.timeZoneParam; if (timeZoneParam == null) { timeZoneParam = options.timeZoneParam; } // retrieve any outbound GET/POST data from the options if (typeof meta.extraParams === 'function') { // supplied as a function that returns a key/value object customRequestParams = meta.extraParams(); } else { // probably supplied as a straight key/value object customRequestParams = meta.extraParams || {}; } tslib.__assign(params, customRequestParams); params[startParam] = dateEnv.formatIso(range.start); params[endParam] = dateEnv.formatIso(range.end); if (dateEnv.timeZone !== 'local') { params[timeZoneParam] = dateEnv.timeZone; } return params; } var SIMPLE_RECURRING_REFINERS = { daysOfWeek: identity, startTime: createDuration, endTime: createDuration, duration: createDuration, startRecur: identity, endRecur: identity }; var recurring = { parse: function parse(refined, dateEnv) { if (refined.daysOfWeek || refined.startTime || refined.endTime || refined.startRecur || refined.endRecur) { var recurringData = { daysOfWeek: refined.daysOfWeek || null, startTime: refined.startTime || null, endTime: refined.endTime || null, startRecur: refined.startRecur ? dateEnv.createMarker(refined.startRecur) : null, endRecur: refined.endRecur ? dateEnv.createMarker(refined.endRecur) : null }; var duration = void 0; if (refined.duration) { duration = refined.duration; } if (!duration && refined.startTime && refined.endTime) { duration = subtractDurations(refined.endTime, refined.startTime); } return { allDayGuess: Boolean(!refined.startTime && !refined.endTime), duration: duration, typeData: recurringData // doesn't need endTime anymore but oh well }; } return null; }, expand: function expand(typeData, framingRange, dateEnv) { var clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur }); if (clippedFramingRange) { return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv); } return []; } }; var simpleRecurringEventsPlugin = createPlugin({ recurringTypes: [recurring], eventRefiners: SIMPLE_RECURRING_REFINERS }); function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) { var dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null; var dayMarker = startOfDay(framingRange.start); var endMarker = framingRange.end; var instanceStarts = []; while (dayMarker < endMarker) { var instanceStart // if everyday, or this particular day-of-week = void 0; // if everyday, or this particular day-of-week if (!dowHash || dowHash[dayMarker.getUTCDay()]) { if (startTime) { instanceStart = dateEnv.add(dayMarker, startTime); } else { instanceStart = dayMarker; } instanceStarts.push(instanceStart); } dayMarker = addDays(dayMarker, 1); } return instanceStarts; } var changeHandlerPlugin = createPlugin({ optionChangeHandlers: { events: function events(_events, context) { handleEventSources([_events], context); }, eventSources: handleEventSources } }); /* BUG: if `event` was supplied, all previously-given `eventSources` will be wiped out */ function handleEventSources(inputs, context) { var unfoundSources = hashValuesToArray(context.getCurrentData().eventSources); var newInputs = []; for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) { var input = inputs_1[_i]; var inputFound = false; for (var i = 0; i < unfoundSources.length; i += 1) { if (unfoundSources[i]._raw === input) { unfoundSources.splice(i, 1); // delete inputFound = true; break; } } if (!inputFound) { newInputs.push(input); } } for (var _a = 0, unfoundSources_1 = unfoundSources; _a < unfoundSources_1.length; _a++) { var unfoundSource = unfoundSources_1[_a]; context.dispatch({ type: 'REMOVE_EVENT_SOURCE', sourceId: unfoundSource.sourceId }); } for (var _b = 0, newInputs_1 = newInputs; _b < newInputs_1.length; _b++) { var newInput = newInputs_1[_b]; context.calendarApi.addEventSource(newInput); } } function handleDateProfile(dateProfile, context) { context.emitter.trigger('datesSet', tslib.__assign(tslib.__assign({}, buildRangeApiWithTimeZone(dateProfile.activeRange, context.dateEnv)), { view: context.viewApi })); } function handleEventStore(eventStore, context) { var emitter = context.emitter; if (emitter.hasHandlers('eventsSet')) { emitter.trigger('eventsSet', buildEventApis(eventStore, context)); } } /* this array is exposed on the root namespace so that UMD plugins can add to it. see the rollup-bundles script. */ var globalPlugins = [arrayEventSourcePlugin, funcEventSourcePlugin, jsonFeedEventSourcePlugin, simpleRecurringEventsPlugin, changeHandlerPlugin, createPlugin({ isLoadingFuncs: [function (state) { return computeEventSourcesLoading(state.eventSources); }], contentTypeHandlers: { html: buildHtmlRenderer, domNodes: buildDomNodeRenderer }, propSetHandlers: { dateProfile: handleDateProfile, eventStore: handleEventStore } })]; function buildHtmlRenderer() { var currentEl = null; var currentHtml = ''; function render(el, html) { if (el !== currentEl || html !== currentHtml) { el.innerHTML = html; } currentEl = el; currentHtml = html; } function destroy() { currentEl.innerHTML = ''; currentEl = null; currentHtml = ''; } return { render: render, destroy: destroy }; } function buildDomNodeRenderer() { var currentEl = null; var currentDomNodes = []; function render(el, domNodes) { var newDomNodes = Array.prototype.slice.call(domNodes); if (el !== currentEl || !isArraysEqual(currentDomNodes, newDomNodes)) { // append first, remove second (for scroll resetting) for (var _i = 0, newDomNodes_1 = newDomNodes; _i < newDomNodes_1.length; _i++) { var newNode = newDomNodes_1[_i]; el.appendChild(newNode); } destroy(); } currentEl = el; currentDomNodes = newDomNodes; } function destroy() { currentDomNodes.forEach(removeElement); currentDomNodes = []; currentEl = null; } return { render: render, destroy: destroy }; } var DelayedRunner = /** @class */ function () { function DelayedRunner(drainedOption) { this.drainedOption = drainedOption; this.isRunning = false; this.isDirty = false; this.pauseDepths = {}; this.timeoutId = 0; } DelayedRunner.prototype.request = function (delay) { this.isDirty = true; if (!this.isPaused()) { this.clearTimeout(); if (delay == null) { this.tryDrain(); } else { this.timeoutId = setTimeout( // NOT OPTIMAL! TODO: look at debounce this.tryDrain.bind(this), delay); } } }; DelayedRunner.prototype.pause = function (scope) { if (scope === void 0) { scope = ''; } var pauseDepths = this.pauseDepths; pauseDepths[scope] = (pauseDepths[scope] || 0) + 1; this.clearTimeout(); }; DelayedRunner.prototype.resume = function (scope, force) { if (scope === void 0) { scope = ''; } var pauseDepths = this.pauseDepths; if (scope in pauseDepths) { if (force) { delete pauseDepths[scope]; } else { pauseDepths[scope] -= 1; var depth = pauseDepths[scope]; if (depth <= 0) { delete pauseDepths[scope]; } } this.tryDrain(); } }; DelayedRunner.prototype.isPaused = function () { return Object.keys(this.pauseDepths).length; }; DelayedRunner.prototype.tryDrain = function () { if (!this.isRunning && !this.isPaused()) { this.isRunning = true; while (this.isDirty) { this.isDirty = false; this.drained(); // might set isDirty to true again } this.isRunning = false; } }; DelayedRunner.prototype.clear = function () { this.clearTimeout(); this.isDirty = false; this.pauseDepths = {}; }; DelayedRunner.prototype.clearTimeout = function () { if (this.timeoutId) { clearTimeout(this.timeoutId); this.timeoutId = 0; } }; DelayedRunner.prototype.drained = function () { if (this.drainedOption) { this.drainedOption(); } }; return DelayedRunner; }(); var TaskRunner = /** @class */ function () { function TaskRunner(runTaskOption, drainedOption) { this.runTaskOption = runTaskOption; this.drainedOption = drainedOption; this.queue = []; this.delayedRunner = new DelayedRunner(this.drain.bind(this)); } TaskRunner.prototype.request = function (task, delay) { this.queue.push(task); this.delayedRunner.request(delay); }; TaskRunner.prototype.pause = function (scope) { this.delayedRunner.pause(scope); }; TaskRunner.prototype.resume = function (scope, force) { this.delayedRunner.resume(scope, force); }; TaskRunner.prototype.drain = function () { var queue = this.queue; while (queue.length) { var completedTasks = []; var task = void 0; while (task = queue.shift()) { this.runTask(task); completedTasks.push(task); } this.drained(completedTasks); } // keep going, in case new tasks were added in the drained handler }; TaskRunner.prototype.runTask = function (task) { if (this.runTaskOption) { this.runTaskOption(task); } }; TaskRunner.prototype.drained = function (completedTasks) { if (this.drainedOption) { this.drainedOption(completedTasks); } }; return TaskRunner; }(); // Computes what the title at the top of the calendarApi should be for this view function buildTitle(dateProfile, viewOptions, dateEnv) { var range; // for views that span a large unit of time, show the proper interval, ignoring stray days before and after if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) { range = dateProfile.currentRange; } else { // for day units or smaller, use the actual day range range = dateProfile.activeRange; } return dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || buildTitleFormat(dateProfile)), { isEndExclusive: dateProfile.isRangeAllDay, defaultSeparator: viewOptions.titleRangeSeparator }); } // Generates the format string that should be used to generate the title for the current date range. // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`. function buildTitleFormat(dateProfile) { var currentRangeUnit = dateProfile.currentRangeUnit; if (currentRangeUnit === 'year') { return { year: 'numeric' }; } if (currentRangeUnit === 'month') { return { year: 'numeric', month: 'long' }; // like "September 2014" } var days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end); if (days !== null && days > 1) { // multi-day range. shorter, like "Sep 9 - 10 2014" return { year: 'numeric', month: 'short', day: 'numeric' }; } // one day. longer, like "September 9 2014" return { year: 'numeric', month: 'long', day: 'numeric' }; } // in future refactor, do the redux-style function(state=initial) for initial-state // also, whatever is happening in constructor, have it happen in action queue too var CalendarDataManager = /** @class */ function () { function CalendarDataManager(props) { var _this = this; this.computeOptionsData = memoize(this._computeOptionsData); this.computeCurrentViewData = memoize(this._computeCurrentViewData); this.organizeRawLocales = memoize(organizeRawLocales); this.buildLocale = memoize(buildLocale); this.buildPluginHooks = buildBuildPluginHooks(); this.buildDateEnv = memoize(buildDateEnv); this.buildTheme = memoize(buildTheme); this.parseToolbars = memoize(parseToolbars); this.buildViewSpecs = memoize(buildViewSpecs); this.buildDateProfileGenerator = memoizeObjArg(buildDateProfileGenerator); this.buildViewApi = memoize(buildViewApi); this.buildViewUiProps = memoizeObjArg(buildViewUiProps); this.buildEventUiBySource = memoize(buildEventUiBySource, isPropsEqual); this.buildEventUiBases = memoize(buildEventUiBases); this.parseContextBusinessHours = memoizeObjArg(parseContextBusinessHours); this.buildTitle = memoize(buildTitle); this.emitter = new Emitter(); this.actionRunner = new TaskRunner(this._handleAction.bind(this), this.updateData.bind(this)); this.currentCalendarOptionsInput = {}; this.currentCalendarOptionsRefined = {}; this.currentViewOptionsInput = {}; this.currentViewOptionsRefined = {}; this.currentCalendarOptionsRefiners = {}; this.getCurrentData = function () { return _this.data; }; this.dispatch = function (action) { _this.actionRunner.request(action); // protects against recursive calls to _handleAction }; this.props = props; this.actionRunner.pause(); var dynamicOptionOverrides = {}; var optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi); var currentViewType = optionsData.calendarOptions.initialView || optionsData.pluginHooks.initialView; var currentViewData = this.computeCurrentViewData(currentViewType, optionsData, props.optionOverrides, dynamicOptionOverrides); // wire things up // TODO: not DRY props.calendarApi.currentDataManager = this; this.emitter.setThisContext(props.calendarApi); this.emitter.setOptions(currentViewData.options); var currentDate = getInitialDate(optionsData.calendarOptions, optionsData.dateEnv); var dateProfile = currentViewData.dateProfileGenerator.build(currentDate); if (!rangeContainsMarker(dateProfile.activeRange, currentDate)) { currentDate = dateProfile.currentRange.start; } var calendarContext = { dateEnv: optionsData.dateEnv, options: optionsData.calendarOptions, pluginHooks: optionsData.pluginHooks, calendarApi: props.calendarApi, dispatch: this.dispatch, emitter: this.emitter, getCurrentData: this.getCurrentData }; // needs to be after setThisContext for (var _i = 0, _a = optionsData.pluginHooks.contextInit; _i < _a.length; _i++) { var callback = _a[_i]; callback(calendarContext); } // NOT DRY var eventSources = initEventSources(optionsData.calendarOptions, dateProfile, calendarContext); var initialState = { dynamicOptionOverrides: dynamicOptionOverrides, currentViewType: currentViewType, currentDate: currentDate, dateProfile: dateProfile, businessHours: this.parseContextBusinessHours(calendarContext), eventSources: eventSources, eventUiBases: {}, eventStore: createEmptyEventStore(), renderableEventStore: createEmptyEventStore(), dateSelection: null, eventSelection: '', eventDrag: null, eventResize: null, selectionConfig: this.buildViewUiProps(calendarContext).selectionConfig }; var contextAndState = tslib.__assign(tslib.__assign({}, calendarContext), initialState); for (var _b = 0, _c = optionsData.pluginHooks.reducers; _b < _c.length; _b++) { var reducer = _c[_b]; tslib.__assign(initialState, reducer(null, null, contextAndState)); } if (computeIsLoading(initialState, calendarContext)) { this.emitter.trigger('loading', true); // NOT DRY } this.state = initialState; this.updateData(); this.actionRunner.resume(); } CalendarDataManager.prototype.resetOptions = function (optionOverrides, append) { var props = this.props; props.optionOverrides = append ? tslib.__assign(tslib.__assign({}, props.optionOverrides), optionOverrides) : optionOverrides; this.actionRunner.request({ type: 'NOTHING' }); }; CalendarDataManager.prototype._handleAction = function (action) { var _a = this, props = _a.props, state = _a.state, emitter = _a.emitter; var dynamicOptionOverrides = reduceDynamicOptionOverrides(state.dynamicOptionOverrides, action); var optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi); var currentViewType = reduceViewType(state.currentViewType, action); var currentViewData = this.computeCurrentViewData(currentViewType, optionsData, props.optionOverrides, dynamicOptionOverrides); // wire things up // TODO: not DRY props.calendarApi.currentDataManager = this; emitter.setThisContext(props.calendarApi); emitter.setOptions(currentViewData.options); var calendarContext = { dateEnv: optionsData.dateEnv, options: optionsData.calendarOptions, pluginHooks: optionsData.pluginHooks, calendarApi: props.calendarApi, dispatch: this.dispatch, emitter: emitter, getCurrentData: this.getCurrentData }; var currentDate = state.currentDate, dateProfile = state.dateProfile; if (this.data && this.data.dateProfileGenerator !== currentViewData.dateProfileGenerator) { // hack dateProfile = currentViewData.dateProfileGenerator.build(currentDate); } currentDate = reduceCurrentDate(currentDate, action); dateProfile = reduceDateProfile(dateProfile, action, currentDate, currentViewData.dateProfileGenerator); if (action.type === 'PREV' || // TODO: move this logic into DateProfileGenerator action.type === 'NEXT' || // " !rangeContainsMarker(dateProfile.currentRange, currentDate)) { currentDate = dateProfile.currentRange.start; } var eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendarContext); var eventStore = reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendarContext); var isEventsLoading = computeEventSourcesLoading(eventSources); // BAD. also called in this func in computeIsLoading var renderableEventStore = isEventsLoading && !currentViewData.options.progressiveEventRendering ? state.renderableEventStore || eventStore : // try from previous state eventStore; var _b = this.buildViewUiProps(calendarContext), eventUiSingleBase = _b.eventUiSingleBase, selectionConfig = _b.selectionConfig; // will memoize obj var eventUiBySource = this.buildEventUiBySource(eventSources); var eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource); var newState = { dynamicOptionOverrides: dynamicOptionOverrides, currentViewType: currentViewType, currentDate: currentDate, dateProfile: dateProfile, eventSources: eventSources, eventStore: eventStore, renderableEventStore: renderableEventStore, selectionConfig: selectionConfig, eventUiBases: eventUiBases, businessHours: this.parseContextBusinessHours(calendarContext), dateSelection: reduceDateSelection(state.dateSelection, action), eventSelection: reduceSelectedEvent(state.eventSelection, action), eventDrag: reduceEventDrag(state.eventDrag, action), eventResize: reduceEventResize(state.eventResize, action) }; var contextAndState = tslib.__assign(tslib.__assign({}, calendarContext), newState); for (var _i = 0, _c = optionsData.pluginHooks.reducers; _i < _c.length; _i++) { var reducer = _c[_i]; tslib.__assign(newState, reducer(state, action, contextAndState)); // give the OLD state, for old value } var wasLoading = computeIsLoading(state, calendarContext); var isLoading = computeIsLoading(newState, calendarContext); // TODO: use propSetHandlers in plugin system if (!wasLoading && isLoading) { emitter.trigger('loading', true); } else if (wasLoading && !isLoading) { emitter.trigger('loading', false); } this.state = newState; if (props.onAction) { props.onAction(action); } }; CalendarDataManager.prototype.updateData = function () { var _a = this, props = _a.props, state = _a.state; var oldData = this.data; var optionsData = this.computeOptionsData(props.optionOverrides, state.dynamicOptionOverrides, props.calendarApi); var currentViewData = this.computeCurrentViewData(state.currentViewType, optionsData, props.optionOverrides, state.dynamicOptionOverrides); var data = this.data = tslib.__assign(tslib.__assign(tslib.__assign({ viewTitle: this.buildTitle(state.dateProfile, currentViewData.options, optionsData.dateEnv), calendarApi: props.calendarApi, dispatch: this.dispatch, emitter: this.emitter, getCurrentData: this.getCurrentData }, optionsData), currentViewData), state); var changeHandlers = optionsData.pluginHooks.optionChangeHandlers; var oldCalendarOptions = oldData && oldData.calendarOptions; var newCalendarOptions = optionsData.calendarOptions; if (oldCalendarOptions && oldCalendarOptions !== newCalendarOptions) { if (oldCalendarOptions.timeZone !== newCalendarOptions.timeZone) { // hack state.eventSources = data.eventSources = reduceEventSourcesNewTimeZone(data.eventSources, state.dateProfile, data); state.eventStore = data.eventStore = rezoneEventStoreDates(data.eventStore, oldData.dateEnv, data.dateEnv); } for (var optionName in changeHandlers) { if (oldCalendarOptions[optionName] !== newCalendarOptions[optionName]) { changeHandlers[optionName](newCalendarOptions[optionName], data); } } } if (props.onData) { props.onData(data); } }; CalendarDataManager.prototype._computeOptionsData = function (optionOverrides, dynamicOptionOverrides, calendarApi) { // TODO: blacklist options that are handled by optionChangeHandlers var _a = this.processRawCalendarOptions(optionOverrides, dynamicOptionOverrides), refinedOptions = _a.refinedOptions, pluginHooks = _a.pluginHooks, localeDefaults = _a.localeDefaults, availableLocaleData = _a.availableLocaleData, extra = _a.extra; warnUnknownOptions(extra); var dateEnv = this.buildDateEnv(refinedOptions.timeZone, refinedOptions.locale, refinedOptions.weekNumberCalculation, refinedOptions.firstDay, refinedOptions.weekText, pluginHooks, availableLocaleData, refinedOptions.defaultRangeSeparator); var viewSpecs = this.buildViewSpecs(pluginHooks.views, optionOverrides, dynamicOptionOverrides, localeDefaults); var theme = this.buildTheme(refinedOptions, pluginHooks); var toolbarConfig = this.parseToolbars(refinedOptions, optionOverrides, theme, viewSpecs, calendarApi); return { calendarOptions: refinedOptions, pluginHooks: pluginHooks, dateEnv: dateEnv, viewSpecs: viewSpecs, theme: theme, toolbarConfig: toolbarConfig, localeDefaults: localeDefaults, availableRawLocales: availableLocaleData.map }; }; // always called from behind a memoizer CalendarDataManager.prototype.processRawCalendarOptions = function (optionOverrides, dynamicOptionOverrides) { var _a = mergeRawOptions([BASE_OPTION_DEFAULTS, optionOverrides, dynamicOptionOverrides]), locales = _a.locales, locale = _a.locale; var availableLocaleData = this.organizeRawLocales(locales); var availableRawLocales = availableLocaleData.map; var localeDefaults = this.buildLocale(locale || availableLocaleData.defaultCode, availableRawLocales).options; var pluginHooks = this.buildPluginHooks(optionOverrides.plugins || [], globalPlugins); var refiners = this.currentCalendarOptionsRefiners = tslib.__assign(tslib.__assign(tslib.__assign(tslib.__assign(tslib.__assign({}, BASE_OPTION_REFINERS), CALENDAR_LISTENER_REFINERS), CALENDAR_OPTION_REFINERS), pluginHooks.listenerRefiners), pluginHooks.optionRefiners); var extra = {}; var raw = mergeRawOptions([BASE_OPTION_DEFAULTS, localeDefaults, optionOverrides, dynamicOptionOverrides]); var refined = {}; var currentRaw = this.currentCalendarOptionsInput; var currentRefined = this.currentCalendarOptionsRefined; var anyChanges = false; for (var optionName in raw) { if (optionName !== 'plugins') { // because plugins is special-cased if (raw[optionName] === currentRaw[optionName] || COMPLEX_OPTION_COMPARATORS[optionName] && optionName in currentRaw && COMPLEX_OPTION_COMPARATORS[optionName](currentRaw[optionName], raw[optionName])) { refined[optionName] = currentRefined[optionName]; } else if (refiners[optionName]) { refined[optionName] = refiners[optionName](raw[optionName]); anyChanges = true; } else { extra[optionName] = currentRaw[optionName]; } } } if (anyChanges) { this.currentCalendarOptionsInput = raw; this.currentCalendarOptionsRefined = refined; } return { rawOptions: this.currentCalendarOptionsInput, refinedOptions: this.currentCalendarOptionsRefined, pluginHooks: pluginHooks, availableLocaleData: availableLocaleData, localeDefaults: localeDefaults, extra: extra }; }; CalendarDataManager.prototype._computeCurrentViewData = function (viewType, optionsData, optionOverrides, dynamicOptionOverrides) { var viewSpec = optionsData.viewSpecs[viewType]; if (!viewSpec) { throw new Error("viewType \"" + viewType + "\" is not available. Please make sure you've loaded all neccessary plugins"); } var _a = this.processRawViewOptions(viewSpec, optionsData.pluginHooks, optionsData.localeDefaults, optionOverrides, dynamicOptionOverrides), refinedOptions = _a.refinedOptions, extra = _a.extra; warnUnknownOptions(extra); var dateProfileGenerator = this.buildDateProfileGenerator({ dateProfileGeneratorClass: viewSpec.optionDefaults.dateProfileGeneratorClass, duration: viewSpec.duration, durationUnit: viewSpec.durationUnit, usesMinMaxTime: viewSpec.optionDefaults.usesMinMaxTime, dateEnv: optionsData.dateEnv, calendarApi: this.props.calendarApi, slotMinTime: refinedOptions.slotMinTime, slotMaxTime: refinedOptions.slotMaxTime, showNonCurrentDates: refinedOptions.showNonCurrentDates, dayCount: refinedOptions.dayCount, dateAlignment: refinedOptions.dateAlignment, dateIncrement: refinedOptions.dateIncrement, hiddenDays: refinedOptions.hiddenDays, weekends: refinedOptions.weekends, nowInput: refinedOptions.now, validRangeInput: refinedOptions.validRange, visibleRangeInput: refinedOptions.visibleRange, monthMode: refinedOptions.monthMode, fixedWeekCount: refinedOptions.fixedWeekCount }); var viewApi = this.buildViewApi(viewType, this.getCurrentData, optionsData.dateEnv); return { viewSpec: viewSpec, options: refinedOptions, dateProfileGenerator: dateProfileGenerator, viewApi: viewApi }; }; CalendarDataManager.prototype.processRawViewOptions = function (viewSpec, pluginHooks, localeDefaults, optionOverrides, dynamicOptionOverrides) { var raw = mergeRawOptions([BASE_OPTION_DEFAULTS, viewSpec.optionDefaults, localeDefaults, optionOverrides, viewSpec.optionOverrides, dynamicOptionOverrides]); var refiners = tslib.__assign(tslib.__assign(tslib.__assign(tslib.__assign(tslib.__assign(tslib.__assign({}, BASE_OPTION_REFINERS), CALENDAR_LISTENER_REFINERS), CALENDAR_OPTION_REFINERS), VIEW_OPTION_REFINERS), pluginHooks.listenerRefiners), pluginHooks.optionRefiners); var refined = {}; var currentRaw = this.currentViewOptionsInput; var currentRefined = this.currentViewOptionsRefined; var anyChanges = false; var extra = {}; for (var optionName in raw) { if (raw[optionName] === currentRaw[optionName] || COMPLEX_OPTION_COMPARATORS[optionName] && COMPLEX_OPTION_COMPARATORS[optionName](raw[optionName], currentRaw[optionName])) { refined[optionName] = currentRefined[optionName]; } else { if (raw[optionName] === this.currentCalendarOptionsInput[optionName] || COMPLEX_OPTION_COMPARATORS[optionName] && COMPLEX_OPTION_COMPARATORS[optionName](raw[optionName], this.currentCalendarOptionsInput[optionName])) { if (optionName in this.currentCalendarOptionsRefined) { // might be an "extra" prop refined[optionName] = this.currentCalendarOptionsRefined[optionName]; } } else if (refiners[optionName]) { refined[optionName] = refiners[optionName](raw[optionName]); } else { extra[optionName] = raw[optionName]; } anyChanges = true; } } if (anyChanges) { this.currentViewOptionsInput = raw; this.currentViewOptionsRefined = refined; } return { rawOptions: this.currentViewOptionsInput, refinedOptions: this.currentViewOptionsRefined, extra: extra }; }; return CalendarDataManager; }(); function buildDateEnv(timeZone, explicitLocale, weekNumberCalculation, firstDay, weekText, pluginHooks, availableLocaleData, defaultSeparator) { var locale = buildLocale(explicitLocale || availableLocaleData.defaultCode, availableLocaleData.map); return new DateEnv({ calendarSystem: 'gregory', timeZone: timeZone, namedTimeZoneImpl: pluginHooks.namedTimeZonedImpl, locale: locale, weekNumberCalculation: weekNumberCalculation, firstDay: firstDay, weekText: weekText, cmdFormatter: pluginHooks.cmdFormatter, defaultSeparator: defaultSeparator }); } function buildTheme(options, pluginHooks) { var ThemeClass = pluginHooks.themeClasses[options.themeSystem] || StandardTheme; return new ThemeClass(options); } function buildDateProfileGenerator(props) { var DateProfileGeneratorClass = props.dateProfileGeneratorClass || DateProfileGenerator; return new DateProfileGeneratorClass(props); } function buildViewApi(type, getCurrentData, dateEnv) { return new ViewApi(type, getCurrentData, dateEnv); } function buildEventUiBySource(eventSources) { return mapHash(eventSources, function (eventSource) { return eventSource.ui; }); } function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) { var eventUiBases = { '': eventUiSingleBase }; for (var defId in eventDefs) { var def = eventDefs[defId]; if (def.sourceId && eventUiBySource[def.sourceId]) { eventUiBases[defId] = eventUiBySource[def.sourceId]; } } return eventUiBases; } function buildViewUiProps(calendarContext) { var options = calendarContext.options; return { eventUiSingleBase: createEventUi({ display: options.eventDisplay, editable: options.editable, startEditable: options.eventStartEditable, durationEditable: options.eventDurationEditable, constraint: options.eventConstraint, overlap: typeof options.eventOverlap === 'boolean' ? options.eventOverlap : undefined, allow: options.eventAllow, backgroundColor: options.eventBackgroundColor, borderColor: options.eventBorderColor, textColor: options.eventTextColor, color: options.eventColor // classNames: options.eventClassNames // render hook will handle this }, calendarContext), selectionConfig: createEventUi({ constraint: options.selectConstraint, overlap: typeof options.selectOverlap === 'boolean' ? options.selectOverlap : undefined, allow: options.selectAllow }, calendarContext) }; } function computeIsLoading(state, context) { for (var _i = 0, _a = context.pluginHooks.isLoadingFuncs; _i < _a.length; _i++) { var isLoadingFunc = _a[_i]; if (isLoadingFunc(state)) { return true; } } return false; } function parseContextBusinessHours(calendarContext) { return parseBusinessHours(calendarContext.options.businessHours, calendarContext); } function warnUnknownOptions(options, viewName) { for (var optionName in options) { console.warn("Unknown option '" + optionName + "'" + (viewName ? " for view '" + viewName + "'" : '')); } } // TODO: move this to react plugin? var CalendarDataProvider = /** @class */ function (_super) { tslib.__extends(CalendarDataProvider, _super); function CalendarDataProvider(props) { var _this = _super.call(this, props) || this; _this.handleData = function (data) { if (!_this.dataManager) { // still within initial run, before assignment in constructor // eslint-disable-next-line react/no-direct-mutation-state _this.state = data; // can't use setState yet } else { _this.setState(data); } }; _this.dataManager = new CalendarDataManager({ optionOverrides: props.optionOverrides, calendarApi: props.calendarApi, onData: _this.handleData }); return _this; } CalendarDataProvider.prototype.render = function () { return this.props.children(this.state); }; CalendarDataProvider.prototype.componentDidUpdate = function (prevProps) { var newOptionOverrides = this.props.optionOverrides; if (newOptionOverrides !== prevProps.optionOverrides) { // prevent recursive handleData this.dataManager.resetOptions(newOptionOverrides); } }; return CalendarDataProvider; }(vdom_cjs.Component); // HELPERS /* if nextDayThreshold is specified, slicing is done in an all-day fashion. you can get nextDayThreshold from context.nextDayThreshold */ function sliceEvents(props, allDay) { return sliceEventStore(props.eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? props.nextDayThreshold : null).fg; } var NamedTimeZoneImpl = /** @class */ function () { function NamedTimeZoneImpl(timeZoneName) { this.timeZoneName = timeZoneName; } return NamedTimeZoneImpl; }(); var SegHierarchy = /** @class */ function () { function SegHierarchy() { // settings this.strictOrder = false; this.allowReslicing = false; this.maxCoord = -1; // -1 means no max this.maxStackCnt = -1; // -1 means no max this.levelCoords = []; // ordered this.entriesByLevel = []; // parallel with levelCoords this.stackCnts = {}; // TODO: use better technique!? } SegHierarchy.prototype.addSegs = function (inputs) { var hiddenEntries = []; for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) { var input = inputs_1[_i]; this.insertEntry(input, hiddenEntries); } return hiddenEntries; }; SegHierarchy.prototype.insertEntry = function (entry, hiddenEntries) { var insertion = this.findInsertion(entry); if (this.isInsertionValid(insertion, entry)) { this.insertEntryAt(entry, insertion); return 1; } return this.handleInvalidInsertion(insertion, entry, hiddenEntries); }; SegHierarchy.prototype.isInsertionValid = function (insertion, entry) { return (this.maxCoord === -1 || insertion.levelCoord + entry.thickness <= this.maxCoord) && (this.maxStackCnt === -1 || insertion.stackCnt < this.maxStackCnt); }; // returns number of new entries inserted SegHierarchy.prototype.handleInvalidInsertion = function (insertion, entry, hiddenEntries) { if (this.allowReslicing && insertion.touchingEntry) { return this.splitEntry(entry, insertion.touchingEntry, hiddenEntries); } hiddenEntries.push(entry); return 0; }; SegHierarchy.prototype.splitEntry = function (entry, barrier, hiddenEntries) { var partCnt = 0; var splitHiddenEntries = []; var entrySpan = entry.span; var barrierSpan = barrier.span; if (entrySpan.start < barrierSpan.start) { partCnt += this.insertEntry({ index: entry.index, thickness: entry.thickness, span: { start: entrySpan.start, end: barrierSpan.start } }, splitHiddenEntries); } if (entrySpan.end > barrierSpan.end) { partCnt += this.insertEntry({ index: entry.index, thickness: entry.thickness, span: { start: barrierSpan.end, end: entrySpan.end } }, splitHiddenEntries); } if (partCnt) { hiddenEntries.push.apply(hiddenEntries, tslib.__spreadArray([{ index: entry.index, thickness: entry.thickness, span: intersectSpans(barrierSpan, entrySpan) // guaranteed to intersect }], splitHiddenEntries)); return partCnt; } hiddenEntries.push(entry); return 0; }; SegHierarchy.prototype.insertEntryAt = function (entry, insertion) { var _a = this, entriesByLevel = _a.entriesByLevel, levelCoords = _a.levelCoords; if (insertion.lateral === -1) { // create a new level insertAt(levelCoords, insertion.level, insertion.levelCoord); insertAt(entriesByLevel, insertion.level, [entry]); } else { // insert into existing level insertAt(entriesByLevel[insertion.level], insertion.lateral, entry); } this.stackCnts[buildEntryKey(entry)] = insertion.stackCnt; }; SegHierarchy.prototype.findInsertion = function (newEntry) { var _a = this, levelCoords = _a.levelCoords, entriesByLevel = _a.entriesByLevel, strictOrder = _a.strictOrder, stackCnts = _a.stackCnts; var levelCnt = levelCoords.length; var candidateCoord = 0; var touchingLevel = -1; var touchingLateral = -1; var touchingEntry = null; var stackCnt = 0; for (var trackingLevel = 0; trackingLevel < levelCnt; trackingLevel += 1) { var trackingCoord = levelCoords[trackingLevel]; // if the current level is past the placed entry, we have found a good empty space and can stop. // if strictOrder, keep finding more lateral intersections. if (!strictOrder && trackingCoord >= candidateCoord + newEntry.thickness) { break; } var trackingEntries = entriesByLevel[trackingLevel]; var trackingEntry = void 0; var searchRes = binarySearch(trackingEntries, newEntry.span.start, getEntrySpanEnd); // find first entry after newEntry's end var lateralIndex = searchRes[0] + searchRes[1]; // if exact match (which doesn't collide), go to next one while ( // loop through entries that horizontally intersect (trackingEntry = trackingEntries[lateralIndex]) && // but not past the whole entry list trackingEntry.span.start < newEntry.span.end // and not entirely past newEntry ) { var trackingEntryBottom = trackingCoord + trackingEntry.thickness; // intersects into the top of the candidate? if (trackingEntryBottom > candidateCoord) { candidateCoord = trackingEntryBottom; touchingEntry = trackingEntry; touchingLevel = trackingLevel; touchingLateral = lateralIndex; } // butts up against top of candidate? (will happen if just intersected as well) if (trackingEntryBottom === candidateCoord) { // accumulate the highest possible stackCnt of the trackingEntries that butt up stackCnt = Math.max(stackCnt, stackCnts[buildEntryKey(trackingEntry)] + 1); } lateralIndex += 1; } } // the destination level will be after touchingEntry's level. find it var destLevel = 0; if (touchingEntry) { destLevel = touchingLevel + 1; while (destLevel < levelCnt && levelCoords[destLevel] < candidateCoord) { destLevel += 1; } } // if adding to an existing level, find where to insert var destLateral = -1; if (destLevel < levelCnt && levelCoords[destLevel] === candidateCoord) { destLateral = binarySearch(entriesByLevel[destLevel], newEntry.span.end, getEntrySpanEnd)[0]; } return { touchingLevel: touchingLevel, touchingLateral: touchingLateral, touchingEntry: touchingEntry, stackCnt: stackCnt, levelCoord: candidateCoord, level: destLevel, lateral: destLateral }; }; // sorted by levelCoord (lowest to highest) SegHierarchy.prototype.toRects = function () { var _a = this, entriesByLevel = _a.entriesByLevel, levelCoords = _a.levelCoords; var levelCnt = entriesByLevel.length; var rects = []; for (var level = 0; level < levelCnt; level += 1) { var entries = entriesByLevel[level]; var levelCoord = levelCoords[level]; for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) { var entry = entries_1[_i]; rects.push(tslib.__assign(tslib.__assign({}, entry), { levelCoord: levelCoord })); } } return rects; }; return SegHierarchy; }(); function getEntrySpanEnd(entry) { return entry.span.end; } function buildEntryKey(entry) { return entry.index + ':' + entry.span.start; } // returns groups with entries sorted by input order function groupIntersectingEntries(entries) { var merges = []; for (var _i = 0, entries_2 = entries; _i < entries_2.length; _i++) { var entry = entries_2[_i]; var filteredMerges = []; var hungryMerge = { span: entry.span, entries: [entry] }; for (var _a = 0, merges_1 = merges; _a < merges_1.length; _a++) { var merge = merges_1[_a]; if (intersectSpans(merge.span, hungryMerge.span)) { hungryMerge = { entries: merge.entries.concat(hungryMerge.entries), span: joinSpans(merge.span, hungryMerge.span) }; } else { filteredMerges.push(merge); } } filteredMerges.push(hungryMerge); merges = filteredMerges; } return merges; } function joinSpans(span0, span1) { return { start: Math.min(span0.start, span1.start), end: Math.max(span0.end, span1.end) }; } function intersectSpans(span0, span1) { var start = Math.max(span0.start, span1.start); var end = Math.min(span0.end, span1.end); if (start < end) { return { start: start, end: end }; } return null; } // general util // --------------------------------------------------------------------------------------------------------------------- function insertAt(arr, index, item) { arr.splice(index, 0, item); } function binarySearch(a, searchVal, getItemVal) { var startIndex = 0; var endIndex = a.length; // exclusive if (!endIndex || searchVal < getItemVal(a[startIndex])) { // no items OR before first item return [0, 0]; } if (searchVal > getItemVal(a[endIndex - 1])) { // after last item return [endIndex, 0]; } while (startIndex < endIndex) { var middleIndex = Math.floor(startIndex + (endIndex - startIndex) / 2); var middleVal = getItemVal(a[middleIndex]); if (searchVal < middleVal) { endIndex = middleIndex; } else if (searchVal > middleVal) { startIndex = middleIndex + 1; } else { // equal! return [middleIndex, 1]; } } return [startIndex, 0]; } var Interaction = /** @class */ function () { function Interaction(settings) { this.component = settings.component; this.isHitComboAllowed = settings.isHitComboAllowed || null; } Interaction.prototype.destroy = function () {}; return Interaction; }(); function parseInteractionSettings(component, input) { return { component: component, el: input.el, useEventCenter: input.useEventCenter != null ? input.useEventCenter : true, isHitComboAllowed: input.isHitComboAllowed || null }; } function interactionSettingsToStore(settings) { var _a; return _a = {}, _a[settings.component.uid] = settings, _a; } // global state var interactionSettingsStore = {}; /* An abstraction for a dragging interaction originating on an event. Does higher-level things than PointerDragger, such as possibly: - a "mirror" that moves with the pointer - a minimum number of pixels or other criteria for a true drag to begin subclasses must emit: - pointerdown - dragstart - dragmove - pointerup - dragend */ var ElementDragging = /** @class */ function () { function ElementDragging(el, selector) { this.emitter = new Emitter(); } ElementDragging.prototype.destroy = function () {}; ElementDragging.prototype.setMirrorIsVisible = function (bool) {// optional if subclass doesn't want to support a mirror }; ElementDragging.prototype.setMirrorNeedsRevert = function (bool) {// optional if subclass doesn't want to support a mirror }; ElementDragging.prototype.setAutoScrollEnabled = function (bool) {// optional }; return ElementDragging; }(); // TODO: get rid of this in favor of options system, // tho it's really easy to access this globally rather than pass thru options. var config = {}; /* Information about what will happen when an external element is dragged-and-dropped onto a calendar. Contains information for creating an event. */ var DRAG_META_REFINERS = { startTime: createDuration, duration: createDuration, create: Boolean, sourceId: String }; function parseDragMeta(raw) { var _a = refineProps(raw, DRAG_META_REFINERS), refined = _a.refined, extra = _a.extra; return { startTime: refined.startTime || null, duration: refined.duration || null, create: refined.create != null ? refined.create : true, sourceId: refined.sourceId, leftoverProps: extra }; } var ToolbarSection = /** @class */ function (_super) { tslib.__extends(ToolbarSection, _super); function ToolbarSection() { return _super !== null && _super.apply(this, arguments) || this; } ToolbarSection.prototype.render = function () { var _this = this; var children = this.props.widgetGroups.map(function (widgetGroup) { return _this.renderWidgetGroup(widgetGroup); }); return vdom_cjs.createElement.apply(void 0, tslib.__spreadArray(['div', { className: 'fc-toolbar-chunk' }], children)); }; ToolbarSection.prototype.renderWidgetGroup = function (widgetGroup) { var props = this.props; var theme = this.context.theme; var children = []; var isOnlyButtons = true; for (var _i = 0, widgetGroup_1 = widgetGroup; _i < widgetGroup_1.length; _i++) { var widget = widgetGroup_1[_i]; var buttonName = widget.buttonName, buttonClick = widget.buttonClick, buttonText = widget.buttonText, buttonIcon = widget.buttonIcon, buttonHint = widget.buttonHint; if (buttonName === 'title') { isOnlyButtons = false; children.push(vdom_cjs.createElement("h2", { className: "fc-toolbar-title", id: props.titleId }, props.title)); } else { var isPressed = buttonName === props.activeButton; var isDisabled = !props.isTodayEnabled && buttonName === 'today' || !props.isPrevEnabled && buttonName === 'prev' || !props.isNextEnabled && buttonName === 'next'; var buttonClasses = ["fc-" + buttonName + "-button", theme.getClass('button')]; if (isPressed) { buttonClasses.push(theme.getClass('buttonActive')); } children.push(vdom_cjs.createElement("button", { type: "button", title: typeof buttonHint === 'function' ? buttonHint(props.navUnit) : buttonHint, disabled: isDisabled, "aria-pressed": isPressed, className: buttonClasses.join(' '), onClick: buttonClick }, buttonText || (buttonIcon ? vdom_cjs.createElement("span", { className: buttonIcon }) : ''))); } } if (children.length > 1) { var groupClassName = isOnlyButtons && theme.getClass('buttonGroup') || ''; return vdom_cjs.createElement.apply(void 0, tslib.__spreadArray(['div', { className: groupClassName }], children)); } return children[0]; }; return ToolbarSection; }(BaseComponent); var Toolbar = /** @class */ function (_super) { tslib.__extends(Toolbar, _super); function Toolbar() { return _super !== null && _super.apply(this, arguments) || this; } Toolbar.prototype.render = function () { var _a = this.props, model = _a.model, extraClassName = _a.extraClassName; var forceLtr = false; var startContent; var endContent; var sectionWidgets = model.sectionWidgets; var centerContent = sectionWidgets.center; if (sectionWidgets.left) { forceLtr = true; startContent = sectionWidgets.left; } else { startContent = sectionWidgets.start; } if (sectionWidgets.right) { forceLtr = true; endContent = sectionWidgets.right; } else { endContent = sectionWidgets.end; } var classNames = [extraClassName || '', 'fc-toolbar', forceLtr ? 'fc-toolbar-ltr' : '']; return vdom_cjs.createElement("div", { className: classNames.join(' ') }, this.renderSection('start', startContent || []), this.renderSection('center', centerContent || []), this.renderSection('end', endContent || [])); }; Toolbar.prototype.renderSection = function (key, widgetGroups) { var props = this.props; return vdom_cjs.createElement(ToolbarSection, { key: key, widgetGroups: widgetGroups, title: props.title, navUnit: props.navUnit, activeButton: props.activeButton, isTodayEnabled: props.isTodayEnabled, isPrevEnabled: props.isPrevEnabled, isNextEnabled: props.isNextEnabled, titleId: props.titleId }); }; return Toolbar; }(BaseComponent); // TODO: do function component? var ViewContainer = /** @class */ function (_super) { tslib.__extends(ViewContainer, _super); function ViewContainer() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.state = { availableWidth: null }; _this.handleEl = function (el) { _this.el = el; setRef(_this.props.elRef, el); _this.updateAvailableWidth(); }; _this.handleResize = function () { _this.updateAvailableWidth(); }; return _this; } ViewContainer.prototype.render = function () { var _a = this, props = _a.props, state = _a.state; var aspectRatio = props.aspectRatio; var classNames = ['fc-view-harness', aspectRatio || props.liquid || props.height ? 'fc-view-harness-active' // harness controls the height : 'fc-view-harness-passive' // let the view do the height ]; var height = ''; var paddingBottom = ''; if (aspectRatio) { if (state.availableWidth !== null) { height = state.availableWidth / aspectRatio; } else { // while waiting to know availableWidth, we can't set height to *zero* // because will cause lots of unnecessary scrollbars within scrollgrid. // BETTER: don't start rendering ANYTHING yet until we know container width // NOTE: why not always use paddingBottom? Causes height oscillation (issue 5606) paddingBottom = 1 / aspectRatio * 100 + "%"; } } else { height = props.height || ''; } return vdom_cjs.createElement("div", { "aria-labelledby": props.labeledById, ref: this.handleEl, className: classNames.join(' '), style: { height: height, paddingBottom: paddingBottom } }, props.children); }; ViewContainer.prototype.componentDidMount = function () { this.context.addResizeHandler(this.handleResize); }; ViewContainer.prototype.componentWillUnmount = function () { this.context.removeResizeHandler(this.handleResize); }; ViewContainer.prototype.updateAvailableWidth = function () { if (this.el && // needed. but why? this.props.aspectRatio // aspectRatio is the only height setting that needs availableWidth ) { this.setState({ availableWidth: this.el.offsetWidth }); } }; return ViewContainer; }(BaseComponent); /* Detects when the user clicks on an event within a DateComponent */ var EventClicking = /** @class */ function (_super) { tslib.__extends(EventClicking, _super); function EventClicking(settings) { var _this = _super.call(this, settings) || this; _this.handleSegClick = function (ev, segEl) { var component = _this.component; var context = component.context; var seg = getElSeg(segEl); if (seg && // might be the
surrounding the more link component.isValidSegDownEl(ev.target)) { // our way to simulate a link click for elements that can't be tags // grab before trigger fired in case trigger trashes DOM thru rerendering var hasUrlContainer = elementClosest(ev.target, '.fc-event-forced-url'); var url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : ''; context.emitter.trigger('eventClick', { el: segEl, event: new EventApi(component.context, seg.eventRange.def, seg.eventRange.instance), jsEvent: ev, view: context.viewApi }); if (url && !ev.defaultPrevented) { window.location.href = url; } } }; _this.destroy = listenBySelector(settings.el, 'click', '.fc-event', // on both fg and bg events _this.handleSegClick); return _this; } return EventClicking; }(Interaction); /* Triggers events and adds/removes core classNames when the user's pointer enters/leaves event-elements of a component. */ var EventHovering = /** @class */ function (_super) { tslib.__extends(EventHovering, _super); function EventHovering(settings) { var _this = _super.call(this, settings) || this; // for simulating an eventMouseLeave when the event el is destroyed while mouse is over it _this.handleEventElRemove = function (el) { if (el === _this.currentSegEl) { _this.handleSegLeave(null, _this.currentSegEl); } }; _this.handleSegEnter = function (ev, segEl) { if (getElSeg(segEl)) { // TODO: better way to make sure not hovering over more+ link or its wrapper _this.currentSegEl = segEl; _this.triggerEvent('eventMouseEnter', ev, segEl); } }; _this.handleSegLeave = function (ev, segEl) { if (_this.currentSegEl) { _this.currentSegEl = null; _this.triggerEvent('eventMouseLeave', ev, segEl); } }; _this.removeHoverListeners = listenToHoverBySelector(settings.el, '.fc-event', // on both fg and bg events _this.handleSegEnter, _this.handleSegLeave); return _this; } EventHovering.prototype.destroy = function () { this.removeHoverListeners(); }; EventHovering.prototype.triggerEvent = function (publicEvName, ev, segEl) { var component = this.component; var context = component.context; var seg = getElSeg(segEl); if (!ev || component.isValidSegDownEl(ev.target)) { context.emitter.trigger(publicEvName, { el: segEl, event: new EventApi(context, seg.eventRange.def, seg.eventRange.instance), jsEvent: ev, view: context.viewApi }); } }; return EventHovering; }(Interaction); var CalendarContent = /** @class */ function (_super) { tslib.__extends(CalendarContent, _super); function CalendarContent() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.buildViewContext = memoize(buildViewContext); _this.buildViewPropTransformers = memoize(buildViewPropTransformers); _this.buildToolbarProps = memoize(buildToolbarProps); _this.headerRef = vdom_cjs.createRef(); _this.footerRef = vdom_cjs.createRef(); _this.interactionsStore = {}; // eslint-disable-next-line _this.state = { viewLabelId: getUniqueDomId() }; // Component Registration // ----------------------------------------------------------------------------------------------------------------- _this.registerInteractiveComponent = function (component, settingsInput) { var settings = parseInteractionSettings(component, settingsInput); var DEFAULT_INTERACTIONS = [EventClicking, EventHovering]; var interactionClasses = DEFAULT_INTERACTIONS.concat(_this.props.pluginHooks.componentInteractions); var interactions = interactionClasses.map(function (TheInteractionClass) { return new TheInteractionClass(settings); }); _this.interactionsStore[component.uid] = interactions; interactionSettingsStore[component.uid] = settings; }; _this.unregisterInteractiveComponent = function (component) { var listeners = _this.interactionsStore[component.uid]; if (listeners) { for (var _i = 0, listeners_1 = listeners; _i < listeners_1.length; _i++) { var listener = listeners_1[_i]; listener.destroy(); } delete _this.interactionsStore[component.uid]; } delete interactionSettingsStore[component.uid]; }; // Resizing // ----------------------------------------------------------------------------------------------------------------- _this.resizeRunner = new DelayedRunner(function () { _this.props.emitter.trigger('_resize', true); // should window resizes be considered "forced" ? _this.props.emitter.trigger('windowResize', { view: _this.props.viewApi }); }); _this.handleWindowResize = function (ev) { var options = _this.props.options; if (options.handleWindowResize && ev.target === window // avoid jqui events ) { _this.resizeRunner.request(options.windowResizeDelay); } }; return _this; } /* renders INSIDE of an outer div */ CalendarContent.prototype.render = function () { var props = this.props; var toolbarConfig = props.toolbarConfig, options = props.options; var toolbarProps = this.buildToolbarProps(props.viewSpec, props.dateProfile, props.dateProfileGenerator, props.currentDate, getNow(props.options.now, props.dateEnv), // TODO: use NowTimer???? props.viewTitle); var viewVGrow = false; var viewHeight = ''; var viewAspectRatio; if (props.isHeightAuto || props.forPrint) { viewHeight = ''; } else if (options.height != null) { viewVGrow = true; } else if (options.contentHeight != null) { viewHeight = options.contentHeight; } else { viewAspectRatio = Math.max(options.aspectRatio, 0.5); // prevent from getting too tall } var viewContext = this.buildViewContext(props.viewSpec, props.viewApi, props.options, props.dateProfileGenerator, props.dateEnv, props.theme, props.pluginHooks, props.dispatch, props.getCurrentData, props.emitter, props.calendarApi, this.registerInteractiveComponent, this.unregisterInteractiveComponent); var viewLabelId = toolbarConfig.header && toolbarConfig.header.hasTitle ? this.state.viewLabelId : ''; return vdom_cjs.createElement(ViewContextType.Provider, { value: viewContext }, toolbarConfig.header && vdom_cjs.createElement(Toolbar, tslib.__assign({ ref: this.headerRef, extraClassName: "fc-header-toolbar", model: toolbarConfig.header, titleId: viewLabelId }, toolbarProps)), vdom_cjs.createElement(ViewContainer, { liquid: viewVGrow, height: viewHeight, aspectRatio: viewAspectRatio, labeledById: viewLabelId }, this.renderView(props), this.buildAppendContent()), toolbarConfig.footer && vdom_cjs.createElement(Toolbar, tslib.__assign({ ref: this.footerRef, extraClassName: "fc-footer-toolbar", model: toolbarConfig.footer, titleId: "" }, toolbarProps))); }; CalendarContent.prototype.componentDidMount = function () { var props = this.props; this.calendarInteractions = props.pluginHooks.calendarInteractions.map(function (CalendarInteractionClass) { return new CalendarInteractionClass(props); }); window.addEventListener('resize', this.handleWindowResize); var propSetHandlers = props.pluginHooks.propSetHandlers; for (var propName in propSetHandlers) { propSetHandlers[propName](props[propName], props); } }; CalendarContent.prototype.componentDidUpdate = function (prevProps) { var props = this.props; var propSetHandlers = props.pluginHooks.propSetHandlers; for (var propName in propSetHandlers) { if (props[propName] !== prevProps[propName]) { propSetHandlers[propName](props[propName], props); } } }; CalendarContent.prototype.componentWillUnmount = function () { window.removeEventListener('resize', this.handleWindowResize); this.resizeRunner.clear(); for (var _i = 0, _a = this.calendarInteractions; _i < _a.length; _i++) { var interaction = _a[_i]; interaction.destroy(); } this.props.emitter.trigger('_unmount'); }; CalendarContent.prototype.buildAppendContent = function () { var props = this.props; var children = props.pluginHooks.viewContainerAppends.map(function (buildAppendContent) { return buildAppendContent(props); }); return vdom_cjs.createElement.apply(void 0, tslib.__spreadArray([vdom_cjs.Fragment, {}], children)); }; CalendarContent.prototype.renderView = function (props) { var pluginHooks = props.pluginHooks; var viewSpec = props.viewSpec; var viewProps = { dateProfile: props.dateProfile, businessHours: props.businessHours, eventStore: props.renderableEventStore, eventUiBases: props.eventUiBases, dateSelection: props.dateSelection, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, isHeightAuto: props.isHeightAuto, forPrint: props.forPrint }; var transformers = this.buildViewPropTransformers(pluginHooks.viewPropsTransformers); for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) { var transformer = transformers_1[_i]; tslib.__assign(viewProps, transformer.transform(viewProps, props)); } var ViewComponent = viewSpec.component; return vdom_cjs.createElement(ViewComponent, tslib.__assign({}, viewProps)); }; return CalendarContent; }(PureComponent); function buildToolbarProps(viewSpec, dateProfile, dateProfileGenerator, currentDate, now, title) { // don't force any date-profiles to valid date profiles (the `false`) so that we can tell if it's invalid var todayInfo = dateProfileGenerator.build(now, undefined, false); // TODO: need `undefined` or else INFINITE LOOP for some reason var prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate, false); var nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate, false); return { title: title, activeButton: viewSpec.type, navUnit: viewSpec.singleUnit, isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now), isPrevEnabled: prevInfo.isValid, isNextEnabled: nextInfo.isValid }; } // Plugin // ----------------------------------------------------------------------------------------------------------------- function buildViewPropTransformers(theClasses) { return theClasses.map(function (TheClass) { return new TheClass(); }); } var CalendarRoot = /** @class */ function (_super) { tslib.__extends(CalendarRoot, _super); function CalendarRoot() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.state = { forPrint: false }; _this.handleBeforePrint = function () { _this.setState({ forPrint: true }); }; _this.handleAfterPrint = function () { _this.setState({ forPrint: false }); }; return _this; } CalendarRoot.prototype.render = function () { var props = this.props; var options = props.options; var forPrint = this.state.forPrint; var isHeightAuto = forPrint || options.height === 'auto' || options.contentHeight === 'auto'; var height = !isHeightAuto && options.height != null ? options.height : ''; var classNames = ['fc', forPrint ? 'fc-media-print' : 'fc-media-screen', "fc-direction-" + options.direction, props.theme.getClass('root')]; if (!getCanVGrowWithinCell()) { classNames.push('fc-liquid-hack'); } return props.children(classNames, height, isHeightAuto, forPrint); }; CalendarRoot.prototype.componentDidMount = function () { var emitter = this.props.emitter; emitter.on('_beforeprint', this.handleBeforePrint); emitter.on('_afterprint', this.handleAfterPrint); }; CalendarRoot.prototype.componentWillUnmount = function () { var emitter = this.props.emitter; emitter.off('_beforeprint', this.handleBeforePrint); emitter.off('_afterprint', this.handleAfterPrint); }; return CalendarRoot; }(BaseComponent); // Computes a default column header formatting string if `colFormat` is not explicitly defined function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) { // if more than one week row, or if there are a lot of columns with not much space, // put just the day numbers will be in each cell if (!datesRepDistinctDays || dayCnt > 10) { return createFormatter({ weekday: 'short' }); // "Sat" } if (dayCnt > 1) { return createFormatter({ weekday: 'short', month: 'numeric', day: 'numeric', omitCommas: true }); // "Sat 11/12" } return createFormatter({ weekday: 'long' }); // "Saturday" } var CLASS_NAME = 'fc-col-header-cell'; // do the cushion too? no function renderInner$1(hookProps) { return hookProps.text; } var TableDateCell = /** @class */ function (_super) { tslib.__extends(TableDateCell, _super); function TableDateCell() { return _super !== null && _super.apply(this, arguments) || this; } TableDateCell.prototype.render = function () { var _a = this.context, dateEnv = _a.dateEnv, options = _a.options, theme = _a.theme, viewApi = _a.viewApi; var props = this.props; var date = props.date, dateProfile = props.dateProfile; var dayMeta = getDateMeta(date, props.todayRange, null, dateProfile); var classNames = [CLASS_NAME].concat(getDayClassNames(dayMeta, theme)); var text = dateEnv.format(date, props.dayHeaderFormat); // if colCnt is 1, we are already in a day-view and don't need a navlink var navLinkAttrs = !dayMeta.isDisabled && props.colCnt > 1 ? buildNavLinkAttrs(this.context, date) : {}; var hookProps = tslib.__assign(tslib.__assign(tslib.__assign({ date: dateEnv.toDate(date), view: viewApi }, props.extraHookProps), { text: text }), dayMeta); return vdom_cjs.createElement(RenderHook, { hookProps: hookProps, classNames: options.dayHeaderClassNames, content: options.dayHeaderContent, defaultContent: renderInner$1, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return vdom_cjs.createElement("th", tslib.__assign({ ref: rootElRef, role: "columnheader", className: classNames.concat(customClassNames).join(' '), "data-date": !dayMeta.isDisabled ? formatDayString(date) : undefined, colSpan: props.colSpan }, props.extraDataAttrs), vdom_cjs.createElement("div", { className: "fc-scrollgrid-sync-inner" }, !dayMeta.isDisabled && vdom_cjs.createElement("a", tslib.__assign({ ref: innerElRef, className: ['fc-col-header-cell-cushion', props.isSticky ? 'fc-sticky' : ''].join(' ') }, navLinkAttrs), innerContent))); }); }; return TableDateCell; }(BaseComponent); var WEEKDAY_FORMAT = createFormatter({ weekday: 'long' }); var TableDowCell = /** @class */ function (_super) { tslib.__extends(TableDowCell, _super); function TableDowCell() { return _super !== null && _super.apply(this, arguments) || this; } TableDowCell.prototype.render = function () { var props = this.props; var _a = this.context, dateEnv = _a.dateEnv, theme = _a.theme, viewApi = _a.viewApi, options = _a.options; var date = addDays(new Date(259200000), props.dow); // start with Sun, 04 Jan 1970 00:00:00 GMT var dateMeta = { dow: props.dow, isDisabled: false, isFuture: false, isPast: false, isToday: false, isOther: false }; var classNames = [CLASS_NAME].concat(getDayClassNames(dateMeta, theme), props.extraClassNames || []); var text = dateEnv.format(date, props.dayHeaderFormat); var hookProps = tslib.__assign(tslib.__assign(tslib.__assign(tslib.__assign({ // TODO: make this public? date: date }, dateMeta), { view: viewApi }), props.extraHookProps), { text: text }); return vdom_cjs.createElement(RenderHook, { hookProps: hookProps, classNames: options.dayHeaderClassNames, content: options.dayHeaderContent, defaultContent: renderInner$1, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return vdom_cjs.createElement("th", tslib.__assign({ ref: rootElRef, role: "columnheader", className: classNames.concat(customClassNames).join(' '), colSpan: props.colSpan }, props.extraDataAttrs), vdom_cjs.createElement("div", { className: "fc-scrollgrid-sync-inner" }, vdom_cjs.createElement("a", { "aria-label": dateEnv.format(date, WEEKDAY_FORMAT), className: ['fc-col-header-cell-cushion', props.isSticky ? 'fc-sticky' : ''].join(' '), ref: innerElRef }, innerContent))); }); }; return TableDowCell; }(BaseComponent); var NowTimer = /** @class */ function (_super) { tslib.__extends(NowTimer, _super); function NowTimer(props, context) { var _this = _super.call(this, props, context) || this; _this.initialNowDate = getNow(context.options.now, context.dateEnv); _this.initialNowQueriedMs = new Date().valueOf(); _this.state = _this.computeTiming().currentState; return _this; } NowTimer.prototype.render = function () { var _a = this, props = _a.props, state = _a.state; return props.children(state.nowDate, state.todayRange); }; NowTimer.prototype.componentDidMount = function () { this.setTimeout(); }; NowTimer.prototype.componentDidUpdate = function (prevProps) { if (prevProps.unit !== this.props.unit) { this.clearTimeout(); this.setTimeout(); } }; NowTimer.prototype.componentWillUnmount = function () { this.clearTimeout(); }; NowTimer.prototype.computeTiming = function () { var _a = this, props = _a.props, context = _a.context; var unroundedNow = addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs); var currentUnitStart = context.dateEnv.startOf(unroundedNow, props.unit); var nextUnitStart = context.dateEnv.add(currentUnitStart, createDuration(1, props.unit)); var waitMs = nextUnitStart.valueOf() - unroundedNow.valueOf(); // there is a max setTimeout ms value (https://stackoverflow.com/a/3468650/96342) // ensure no longer than a day waitMs = Math.min(1000 * 60 * 60 * 24, waitMs); return { currentState: { nowDate: currentUnitStart, todayRange: buildDayRange(currentUnitStart) }, nextState: { nowDate: nextUnitStart, todayRange: buildDayRange(nextUnitStart) }, waitMs: waitMs }; }; NowTimer.prototype.setTimeout = function () { var _this = this; var _a = this.computeTiming(), nextState = _a.nextState, waitMs = _a.waitMs; this.timeoutId = setTimeout(function () { _this.setState(nextState, function () { _this.setTimeout(); }); }, waitMs); }; NowTimer.prototype.clearTimeout = function () { if (this.timeoutId) { clearTimeout(this.timeoutId); } }; NowTimer.contextType = ViewContextType; return NowTimer; }(vdom_cjs.Component); function buildDayRange(date) { var start = startOfDay(date); var end = addDays(start, 1); return { start: start, end: end }; } var DayHeader = /** @class */ function (_super) { tslib.__extends(DayHeader, _super); function DayHeader() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.createDayHeaderFormatter = memoize(createDayHeaderFormatter); return _this; } DayHeader.prototype.render = function () { var context = this.context; var _a = this.props, dates = _a.dates, dateProfile = _a.dateProfile, datesRepDistinctDays = _a.datesRepDistinctDays, renderIntro = _a.renderIntro; var dayHeaderFormat = this.createDayHeaderFormatter(context.options.dayHeaderFormat, datesRepDistinctDays, dates.length); return vdom_cjs.createElement(NowTimer, { unit: "day" }, function (nowDate, todayRange) { return vdom_cjs.createElement("tr", { role: "row" }, renderIntro && renderIntro('day'), dates.map(function (date) { return datesRepDistinctDays ? vdom_cjs.createElement(TableDateCell, { key: date.toISOString(), date: date, dateProfile: dateProfile, todayRange: todayRange, colCnt: dates.length, dayHeaderFormat: dayHeaderFormat }) : vdom_cjs.createElement(TableDowCell, { key: date.getUTCDay(), dow: date.getUTCDay(), dayHeaderFormat: dayHeaderFormat }); })); }); }; return DayHeader; }(BaseComponent); function createDayHeaderFormatter(explicitFormat, datesRepDistinctDays, dateCnt) { return explicitFormat || computeFallbackHeaderFormat(datesRepDistinctDays, dateCnt); } var DaySeriesModel = /** @class */ function () { function DaySeriesModel(range, dateProfileGenerator) { var date = range.start; var end = range.end; var indices = []; var dates = []; var dayIndex = -1; while (date < end) { // loop each day from start to end if (dateProfileGenerator.isHiddenDay(date)) { indices.push(dayIndex + 0.5); // mark that it's between indices } else { dayIndex += 1; indices.push(dayIndex); dates.push(date); } date = addDays(date, 1); } this.dates = dates; this.indices = indices; this.cnt = dates.length; } DaySeriesModel.prototype.sliceRange = function (range) { var firstIndex = this.getDateDayIndex(range.start); // inclusive first index var lastIndex = this.getDateDayIndex(addDays(range.end, -1)); // inclusive last index var clippedFirstIndex = Math.max(0, firstIndex); var clippedLastIndex = Math.min(this.cnt - 1, lastIndex); // deal with in-between indices clippedFirstIndex = Math.ceil(clippedFirstIndex); // in-between starts round to next cell clippedLastIndex = Math.floor(clippedLastIndex); // in-between ends round to prev cell if (clippedFirstIndex <= clippedLastIndex) { return { firstIndex: clippedFirstIndex, lastIndex: clippedLastIndex, isStart: firstIndex === clippedFirstIndex, isEnd: lastIndex === clippedLastIndex }; } return null; }; // Given a date, returns its chronolocial cell-index from the first cell of the grid. // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets. // If before the first offset, returns a negative number. // If after the last offset, returns an offset past the last cell offset. // Only works for *start* dates of cells. Will not work for exclusive end dates for cells. DaySeriesModel.prototype.getDateDayIndex = function (date) { var indices = this.indices; var dayOffset = Math.floor(diffDays(this.dates[0], date)); if (dayOffset < 0) { return indices[0] - 1; } if (dayOffset >= indices.length) { return indices[indices.length - 1] + 1; } return indices[dayOffset]; }; return DaySeriesModel; }(); var DayTableModel = /** @class */ function () { function DayTableModel(daySeries, breakOnWeeks) { var dates = daySeries.dates; var daysPerRow; var firstDay; var rowCnt; if (breakOnWeeks) { // count columns until the day-of-week repeats firstDay = dates[0].getUTCDay(); for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow += 1) { if (dates[daysPerRow].getUTCDay() === firstDay) { break; } } rowCnt = Math.ceil(dates.length / daysPerRow); } else { rowCnt = 1; daysPerRow = dates.length; } this.rowCnt = rowCnt; this.colCnt = daysPerRow; this.daySeries = daySeries; this.cells = this.buildCells(); this.headerDates = this.buildHeaderDates(); } DayTableModel.prototype.buildCells = function () { var rows = []; for (var row = 0; row < this.rowCnt; row += 1) { var cells = []; for (var col = 0; col < this.colCnt; col += 1) { cells.push(this.buildCell(row, col)); } rows.push(cells); } return rows; }; DayTableModel.prototype.buildCell = function (row, col) { var date = this.daySeries.dates[row * this.colCnt + col]; return { key: date.toISOString(), date: date }; }; DayTableModel.prototype.buildHeaderDates = function () { var dates = []; for (var col = 0; col < this.colCnt; col += 1) { dates.push(this.cells[0][col].date); } return dates; }; DayTableModel.prototype.sliceRange = function (range) { var colCnt = this.colCnt; var seriesSeg = this.daySeries.sliceRange(range); var segs = []; if (seriesSeg) { var firstIndex = seriesSeg.firstIndex, lastIndex = seriesSeg.lastIndex; var index = firstIndex; while (index <= lastIndex) { var row = Math.floor(index / colCnt); var nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1); segs.push({ row: row, firstCol: index % colCnt, lastCol: (nextIndex - 1) % colCnt, isStart: seriesSeg.isStart && index === firstIndex, isEnd: seriesSeg.isEnd && nextIndex - 1 === lastIndex }); index = nextIndex; } } return segs; }; return DayTableModel; }(); var Slicer = /** @class */ function () { function Slicer() { this.sliceBusinessHours = memoize(this._sliceBusinessHours); this.sliceDateSelection = memoize(this._sliceDateSpan); this.sliceEventStore = memoize(this._sliceEventStore); this.sliceEventDrag = memoize(this._sliceInteraction); this.sliceEventResize = memoize(this._sliceInteraction); this.forceDayIfListItem = false; // hack } Slicer.prototype.sliceProps = function (props, dateProfile, nextDayThreshold, context) { var extraArgs = []; for (var _i = 4; _i < arguments.length; _i++) { extraArgs[_i - 4] = arguments[_i]; } var eventUiBases = props.eventUiBases; var eventSegs = this.sliceEventStore.apply(this, tslib.__spreadArray([props.eventStore, eventUiBases, dateProfile, nextDayThreshold], extraArgs)); return { dateSelectionSegs: this.sliceDateSelection.apply(this, tslib.__spreadArray([props.dateSelection, eventUiBases, context], extraArgs)), businessHourSegs: this.sliceBusinessHours.apply(this, tslib.__spreadArray([props.businessHours, dateProfile, nextDayThreshold, context], extraArgs)), fgEventSegs: eventSegs.fg, bgEventSegs: eventSegs.bg, eventDrag: this.sliceEventDrag.apply(this, tslib.__spreadArray([props.eventDrag, eventUiBases, dateProfile, nextDayThreshold], extraArgs)), eventResize: this.sliceEventResize.apply(this, tslib.__spreadArray([props.eventResize, eventUiBases, dateProfile, nextDayThreshold], extraArgs)), eventSelection: props.eventSelection }; // TODO: give interactionSegs? }; Slicer.prototype.sliceNowDate = function ( // does not memoize date, context) { var extraArgs = []; for (var _i = 2; _i < arguments.length; _i++) { extraArgs[_i - 2] = arguments[_i]; } return this._sliceDateSpan.apply(this, tslib.__spreadArray([{ range: { start: date, end: addMs(date, 1) }, allDay: false }, {}, context], extraArgs)); }; Slicer.prototype._sliceBusinessHours = function (businessHours, dateProfile, nextDayThreshold, context) { var extraArgs = []; for (var _i = 4; _i < arguments.length; _i++) { extraArgs[_i - 4] = arguments[_i]; } if (!businessHours) { return []; } return this._sliceEventStore.apply(this, tslib.__spreadArray([expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), context), {}, dateProfile, nextDayThreshold], extraArgs)).bg; }; Slicer.prototype._sliceEventStore = function (eventStore, eventUiBases, dateProfile, nextDayThreshold) { var extraArgs = []; for (var _i = 4; _i < arguments.length; _i++) { extraArgs[_i - 4] = arguments[_i]; } if (eventStore) { var rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold); return { bg: this.sliceEventRanges(rangeRes.bg, extraArgs), fg: this.sliceEventRanges(rangeRes.fg, extraArgs) }; } return { bg: [], fg: [] }; }; Slicer.prototype._sliceInteraction = function (interaction, eventUiBases, dateProfile, nextDayThreshold) { var extraArgs = []; for (var _i = 4; _i < arguments.length; _i++) { extraArgs[_i - 4] = arguments[_i]; } if (!interaction) { return null; } var rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold); return { segs: this.sliceEventRanges(rangeRes.fg, extraArgs), affectedInstances: interaction.affectedEvents.instances, isEvent: interaction.isEvent }; }; Slicer.prototype._sliceDateSpan = function (dateSpan, eventUiBases, context) { var extraArgs = []; for (var _i = 3; _i < arguments.length; _i++) { extraArgs[_i - 3] = arguments[_i]; } if (!dateSpan) { return []; } var eventRange = fabricateEventRange(dateSpan, eventUiBases, context); var segs = this.sliceRange.apply(this, tslib.__spreadArray([dateSpan.range], extraArgs)); for (var _a = 0, segs_1 = segs; _a < segs_1.length; _a++) { var seg = segs_1[_a]; seg.eventRange = eventRange; } return segs; }; /* "complete" seg means it has component and eventRange */ Slicer.prototype.sliceEventRanges = function (eventRanges, extraArgs) { var segs = []; for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) { var eventRange = eventRanges_1[_i]; segs.push.apply(segs, this.sliceEventRange(eventRange, extraArgs)); } return segs; }; /* "complete" seg means it has component and eventRange */ Slicer.prototype.sliceEventRange = function (eventRange, extraArgs) { var dateRange = eventRange.range; // hack to make multi-day events that are being force-displayed as list-items to take up only one day if (this.forceDayIfListItem && eventRange.ui.display === 'list-item') { dateRange = { start: dateRange.start, end: addDays(dateRange.start, 1) }; } var segs = this.sliceRange.apply(this, tslib.__spreadArray([dateRange], extraArgs)); for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) { var seg = segs_2[_i]; seg.eventRange = eventRange; seg.isStart = eventRange.isStart && seg.isStart; seg.isEnd = eventRange.isEnd && seg.isEnd; } return segs; }; return Slicer; }(); /* for incorporating slotMinTime/slotMaxTime if appropriate TODO: should be part of DateProfile! TimelineDateProfile already does this btw */ function computeActiveRange(dateProfile, isComponentAllDay) { var range = dateProfile.activeRange; if (isComponentAllDay) { return range; } return { start: addMs(range.start, dateProfile.slotMinTime.milliseconds), end: addMs(range.end, dateProfile.slotMaxTime.milliseconds - 864e5) // 864e5 = ms in a day }; } // high-level segmenting-aware tester functions // ------------------------------------------------------------------------------------------------------------------------ function isInteractionValid(interaction, dateProfile, context) { var instances = interaction.mutatedEvents.instances; for (var instanceId in instances) { if (!rangeContainsRange(dateProfile.validRange, instances[instanceId].range)) { return false; } } return isNewPropsValid({ eventDrag: interaction }, context); // HACK: the eventDrag props is used for ALL interactions } function isDateSelectionValid(dateSelection, dateProfile, context) { if (!rangeContainsRange(dateProfile.validRange, dateSelection.range)) { return false; } return isNewPropsValid({ dateSelection: dateSelection }, context); } function isNewPropsValid(newProps, context) { var calendarState = context.getCurrentData(); var props = tslib.__assign({ businessHours: calendarState.businessHours, dateSelection: '', eventStore: calendarState.eventStore, eventUiBases: calendarState.eventUiBases, eventSelection: '', eventDrag: null, eventResize: null }, newProps); return (context.pluginHooks.isPropsValid || isPropsValid)(props, context); } function isPropsValid(state, context, dateSpanMeta, filterConfig) { if (dateSpanMeta === void 0) { dateSpanMeta = {}; } if (state.eventDrag && !isInteractionPropsValid(state, context, dateSpanMeta, filterConfig)) { return false; } if (state.dateSelection && !isDateSelectionPropsValid(state, context, dateSpanMeta, filterConfig)) { return false; } return true; } // Moving Event Validation // ------------------------------------------------------------------------------------------------------------------------ function isInteractionPropsValid(state, context, dateSpanMeta, filterConfig) { var currentState = context.getCurrentData(); var interaction = state.eventDrag; // HACK: the eventDrag props is used for ALL interactions var subjectEventStore = interaction.mutatedEvents; var subjectDefs = subjectEventStore.defs; var subjectInstances = subjectEventStore.instances; var subjectConfigs = compileEventUis(subjectDefs, interaction.isEvent ? state.eventUiBases : { '': currentState.selectionConfig }); if (filterConfig) { subjectConfigs = mapHash(subjectConfigs, filterConfig); } // exclude the subject events. TODO: exclude defs too? var otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances); var otherDefs = otherEventStore.defs; var otherInstances = otherEventStore.instances; var otherConfigs = compileEventUis(otherDefs, state.eventUiBases); for (var subjectInstanceId in subjectInstances) { var subjectInstance = subjectInstances[subjectInstanceId]; var subjectRange = subjectInstance.range; var subjectConfig = subjectConfigs[subjectInstance.defId]; var subjectDef = subjectDefs[subjectInstance.defId]; // constraint if (!allConstraintsPass(subjectConfig.constraints, subjectRange, otherEventStore, state.businessHours, context)) { return false; } // overlap var eventOverlap = context.options.eventOverlap; var eventOverlapFunc = typeof eventOverlap === 'function' ? eventOverlap : null; for (var otherInstanceId in otherInstances) { var otherInstance = otherInstances[otherInstanceId]; // intersect! evaluate if (rangesIntersect(subjectRange, otherInstance.range)) { var otherOverlap = otherConfigs[otherInstance.defId].overlap; // consider the other event's overlap. only do this if the subject event is a "real" event if (otherOverlap === false && interaction.isEvent) { return false; } if (subjectConfig.overlap === false) { return false; } if (eventOverlapFunc && !eventOverlapFunc(new EventApi(context, otherDefs[otherInstance.defId], otherInstance), // still event new EventApi(context, subjectDef, subjectInstance))) { return false; } } } // allow (a function) var calendarEventStore = currentState.eventStore; // need global-to-calendar, not local to component (splittable)state for (var _i = 0, _a = subjectConfig.allows; _i < _a.length; _i++) { var subjectAllow = _a[_i]; var subjectDateSpan = tslib.__assign(tslib.__assign({}, dateSpanMeta), { range: subjectInstance.range, allDay: subjectDef.allDay }); var origDef = calendarEventStore.defs[subjectDef.defId]; var origInstance = calendarEventStore.instances[subjectInstanceId]; var eventApi = void 0; if (origDef) { // was previously in the calendar eventApi = new EventApi(context, origDef, origInstance); } else { // was an external event eventApi = new EventApi(context, subjectDef); // no instance, because had no dates } if (!subjectAllow(buildDateSpanApiWithContext(subjectDateSpan, context), eventApi)) { return false; } } } return true; } // Date Selection Validation // ------------------------------------------------------------------------------------------------------------------------ function isDateSelectionPropsValid(state, context, dateSpanMeta, filterConfig) { var relevantEventStore = state.eventStore; var relevantDefs = relevantEventStore.defs; var relevantInstances = relevantEventStore.instances; var selection = state.dateSelection; var selectionRange = selection.range; var selectionConfig = context.getCurrentData().selectionConfig; if (filterConfig) { selectionConfig = filterConfig(selectionConfig); } // constraint if (!allConstraintsPass(selectionConfig.constraints, selectionRange, relevantEventStore, state.businessHours, context)) { return false; } // overlap var selectOverlap = context.options.selectOverlap; var selectOverlapFunc = typeof selectOverlap === 'function' ? selectOverlap : null; for (var relevantInstanceId in relevantInstances) { var relevantInstance = relevantInstances[relevantInstanceId]; // intersect! evaluate if (rangesIntersect(selectionRange, relevantInstance.range)) { if (selectionConfig.overlap === false) { return false; } if (selectOverlapFunc && !selectOverlapFunc(new EventApi(context, relevantDefs[relevantInstance.defId], relevantInstance), null)) { return false; } } } // allow (a function) for (var _i = 0, _a = selectionConfig.allows; _i < _a.length; _i++) { var selectionAllow = _a[_i]; var fullDateSpan = tslib.__assign(tslib.__assign({}, dateSpanMeta), selection); if (!selectionAllow(buildDateSpanApiWithContext(fullDateSpan, context), null)) { return false; } } return true; } // Constraint Utils // ------------------------------------------------------------------------------------------------------------------------ function allConstraintsPass(constraints, subjectRange, otherEventStore, businessHoursUnexpanded, context) { for (var _i = 0, constraints_1 = constraints; _i < constraints_1.length; _i++) { var constraint = constraints_1[_i]; if (!anyRangesContainRange(constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, context), subjectRange)) { return false; } } return true; } function constraintToRanges(constraint, subjectRange, // for expanding a recurring constraint, or expanding business hours otherEventStore, // for if constraint is an even group ID businessHoursUnexpanded, // for if constraint is 'businessHours' context) { if (constraint === 'businessHours') { return eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange, context)); } if (typeof constraint === 'string') { // an group ID return eventStoreToRanges(filterEventStoreDefs(otherEventStore, function (eventDef) { return eventDef.groupId === constraint; })); } if (_typeof(constraint) === 'object' && constraint) { // non-null object return eventStoreToRanges(expandRecurring(constraint, subjectRange, context)); } return []; // if it's false } // TODO: move to event-store file? function eventStoreToRanges(eventStore) { var instances = eventStore.instances; var ranges = []; for (var instanceId in instances) { ranges.push(instances[instanceId].range); } return ranges; } // TODO: move to geom file? function anyRangesContainRange(outerRanges, innerRange) { for (var _i = 0, outerRanges_1 = outerRanges; _i < outerRanges_1.length; _i++) { var outerRange = outerRanges_1[_i]; if (rangeContainsRange(outerRange, innerRange)) { return true; } } return false; } var VISIBLE_HIDDEN_RE = /^(visible|hidden)$/; var Scroller = /** @class */ function (_super) { tslib.__extends(Scroller, _super); function Scroller() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.handleEl = function (el) { _this.el = el; setRef(_this.props.elRef, el); }; return _this; } Scroller.prototype.render = function () { var props = this.props; var liquid = props.liquid, liquidIsAbsolute = props.liquidIsAbsolute; var isAbsolute = liquid && liquidIsAbsolute; var className = ['fc-scroller']; if (liquid) { if (liquidIsAbsolute) { className.push('fc-scroller-liquid-absolute'); } else { className.push('fc-scroller-liquid'); } } return vdom_cjs.createElement("div", { ref: this.handleEl, className: className.join(' '), style: { overflowX: props.overflowX, overflowY: props.overflowY, left: isAbsolute && -(props.overcomeLeft || 0) || '', right: isAbsolute && -(props.overcomeRight || 0) || '', bottom: isAbsolute && -(props.overcomeBottom || 0) || '', marginLeft: !isAbsolute && -(props.overcomeLeft || 0) || '', marginRight: !isAbsolute && -(props.overcomeRight || 0) || '', marginBottom: !isAbsolute && -(props.overcomeBottom || 0) || '', maxHeight: props.maxHeight || '' } }, props.children); }; Scroller.prototype.needsXScrolling = function () { if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) { return false; } // testing scrollWidth>clientWidth is unreliable cross-browser when pixel heights aren't integers. // much more reliable to see if children are taller than the scroller, even tho doesn't account for // inner-child margins and absolute positioning var el = this.el; var realClientWidth = this.el.getBoundingClientRect().width - this.getYScrollbarWidth(); var children = el.children; for (var i = 0; i < children.length; i += 1) { var childEl = children[i]; if (childEl.getBoundingClientRect().width > realClientWidth) { return true; } } return false; }; Scroller.prototype.needsYScrolling = function () { if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) { return false; } // testing scrollHeight>clientHeight is unreliable cross-browser when pixel heights aren't integers. // much more reliable to see if children are taller than the scroller, even tho doesn't account for // inner-child margins and absolute positioning var el = this.el; var realClientHeight = this.el.getBoundingClientRect().height - this.getXScrollbarWidth(); var children = el.children; for (var i = 0; i < children.length; i += 1) { var childEl = children[i]; if (childEl.getBoundingClientRect().height > realClientHeight) { return true; } } return false; }; Scroller.prototype.getXScrollbarWidth = function () { if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) { return 0; } return this.el.offsetHeight - this.el.clientHeight; // only works because we guarantee no borders. TODO: add to CSS with important? }; Scroller.prototype.getYScrollbarWidth = function () { if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) { return 0; } return this.el.offsetWidth - this.el.clientWidth; // only works because we guarantee no borders. TODO: add to CSS with important? }; return Scroller; }(BaseComponent); /* TODO: somehow infer OtherArgs from masterCallback? TODO: infer RefType from masterCallback if provided */ var RefMap = /** @class */ function () { function RefMap(masterCallback) { var _this = this; this.masterCallback = masterCallback; this.currentMap = {}; this.depths = {}; this.callbackMap = {}; this.handleValue = function (val, key) { var _a = _this, depths = _a.depths, currentMap = _a.currentMap; var removed = false; var added = false; if (val !== null) { // for bug... ACTUALLY: can probably do away with this now that callers don't share numeric indices anymore removed = key in currentMap; currentMap[key] = val; depths[key] = (depths[key] || 0) + 1; added = true; } else { depths[key] -= 1; if (!depths[key]) { delete currentMap[key]; delete _this.callbackMap[key]; removed = true; } } if (_this.masterCallback) { if (removed) { _this.masterCallback(null, String(key)); } if (added) { _this.masterCallback(val, String(key)); } } }; } RefMap.prototype.createRef = function (key) { var _this = this; var refCallback = this.callbackMap[key]; if (!refCallback) { refCallback = this.callbackMap[key] = function (val) { _this.handleValue(val, String(key)); }; } return refCallback; }; // TODO: check callers that don't care about order. should use getAll instead // NOTE: this method has become less valuable now that we are encouraged to map order by some other index // TODO: provide ONE array-export function, buildArray, which fails on non-numeric indexes. caller can manipulate and "collect" RefMap.prototype.collect = function (startIndex, endIndex, step) { return collectFromHash(this.currentMap, startIndex, endIndex, step); }; RefMap.prototype.getAll = function () { return hashValuesToArray(this.currentMap); }; return RefMap; }(); function computeShrinkWidth(chunkEls) { var shrinkCells = findElements(chunkEls, '.fc-scrollgrid-shrink'); var largestWidth = 0; for (var _i = 0, shrinkCells_1 = shrinkCells; _i < shrinkCells_1.length; _i++) { var shrinkCell = shrinkCells_1[_i]; largestWidth = Math.max(largestWidth, computeSmallestCellWidth(shrinkCell)); } return Math.ceil(largestWidth); // elements work best with integers. round up to ensure contents fits } function getSectionHasLiquidHeight(props, sectionConfig) { return props.liquid && sectionConfig.liquid; // does the section do liquid-height? (need to have whole scrollgrid liquid-height as well) } function getAllowYScrolling(props, sectionConfig) { return sectionConfig.maxHeight != null || // if its possible for the height to max out, we might need scrollbars getSectionHasLiquidHeight(props, sectionConfig); // if the section is liquid height, it might condense enough to require scrollbars } // TODO: ONLY use `arg`. force out internal function to use same API function renderChunkContent(sectionConfig, chunkConfig, arg, isHeader) { var expandRows = arg.expandRows; var content = typeof chunkConfig.content === 'function' ? chunkConfig.content(arg) : vdom_cjs.createElement('table', { role: 'presentation', className: [chunkConfig.tableClassName, sectionConfig.syncRowHeights ? 'fc-scrollgrid-sync-table' : ''].join(' '), style: { minWidth: arg.tableMinWidth, width: arg.clientWidth, height: expandRows ? arg.clientHeight : '' // css `height` on a
serves as a min-height } }, arg.tableColGroupNode, vdom_cjs.createElement(isHeader ? 'thead' : 'tbody', { role: 'presentation' }, typeof chunkConfig.rowContent === 'function' ? chunkConfig.rowContent(arg) : chunkConfig.rowContent)); return content; } function isColPropsEqual(cols0, cols1) { return isArraysEqual(cols0, cols1, isPropsEqual); } function renderMicroColGroup(cols, shrinkWidth) { var colNodes = []; /* for ColProps with spans, it would have been great to make a single HOWEVER, Chrome was getting messing up distributing the width to elements makes Chrome behave. */ for (var _i = 0, cols_1 = cols; _i < cols_1.length; _i++) { var colProps = cols_1[_i]; var span = colProps.span || 1; for (var i = 0; i < span; i += 1) { colNodes.push(vdom_cjs.createElement("col", { style: { width: colProps.width === 'shrink' ? sanitizeShrinkWidth(shrinkWidth) : colProps.width || '', minWidth: colProps.minWidth || '' } })); } } return vdom_cjs.createElement.apply(void 0, tslib.__spreadArray(['colgroup', {}], colNodes)); } function sanitizeShrinkWidth(shrinkWidth) { /* why 4? if we do 0, it will kill any border, which are needed for computeSmallestCellWidth 4 accounts for 2 2-pixel borders. TODO: better solution? */ return shrinkWidth == null ? 4 : shrinkWidth; } function hasShrinkWidth(cols) { for (var _i = 0, cols_2 = cols; _i < cols_2.length; _i++) { var col = cols_2[_i]; if (col.width === 'shrink') { return true; } } return false; } function getScrollGridClassNames(liquid, context) { var classNames = ['fc-scrollgrid', context.theme.getClass('table')]; if (liquid) { classNames.push('fc-scrollgrid-liquid'); } return classNames; } function getSectionClassNames(sectionConfig, wholeTableVGrow) { var classNames = ['fc-scrollgrid-section', "fc-scrollgrid-section-" + sectionConfig.type, sectionConfig.className // used? ]; if (wholeTableVGrow && sectionConfig.liquid && sectionConfig.maxHeight == null) { classNames.push('fc-scrollgrid-section-liquid'); } if (sectionConfig.isSticky) { classNames.push('fc-scrollgrid-section-sticky'); } return classNames; } function renderScrollShim(arg) { return vdom_cjs.createElement("div", { className: "fc-scrollgrid-sticky-shim", style: { width: arg.clientWidth, minWidth: arg.tableMinWidth } }); } function getStickyHeaderDates(options) { var stickyHeaderDates = options.stickyHeaderDates; if (stickyHeaderDates == null || stickyHeaderDates === 'auto') { stickyHeaderDates = options.height === 'auto' || options.viewHeight === 'auto'; } return stickyHeaderDates; } function getStickyFooterScrollbar(options) { var stickyFooterScrollbar = options.stickyFooterScrollbar; if (stickyFooterScrollbar == null || stickyFooterScrollbar === 'auto') { stickyFooterScrollbar = options.height === 'auto' || options.viewHeight === 'auto'; } return stickyFooterScrollbar; } var SimpleScrollGrid = /** @class */ function (_super) { tslib.__extends(SimpleScrollGrid, _super); function SimpleScrollGrid() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.processCols = memoize(function (a) { return a; }, isColPropsEqual); // so we get same `cols` props every time // yucky to memoize VNodes, but much more efficient for consumers _this.renderMicroColGroup = memoize(renderMicroColGroup); _this.scrollerRefs = new RefMap(); _this.scrollerElRefs = new RefMap(_this._handleScrollerEl.bind(_this)); _this.state = { shrinkWidth: null, forceYScrollbars: false, scrollerClientWidths: {}, scrollerClientHeights: {} }; // TODO: can do a really simple print-view. dont need to join rows _this.handleSizing = function () { _this.safeSetState(tslib.__assign({ shrinkWidth: _this.computeShrinkWidth() }, _this.computeScrollerDims())); }; return _this; } SimpleScrollGrid.prototype.render = function () { var _a = this, props = _a.props, state = _a.state, context = _a.context; var sectionConfigs = props.sections || []; var cols = this.processCols(props.cols); var microColGroupNode = this.renderMicroColGroup(cols, state.shrinkWidth); var classNames = getScrollGridClassNames(props.liquid, context); if (props.collapsibleWidth) { classNames.push('fc-scrollgrid-collapsible'); } // TODO: make DRY var configCnt = sectionConfigs.length; var configI = 0; var currentConfig; var headSectionNodes = []; var bodySectionNodes = []; var footSectionNodes = []; while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'header') { headSectionNodes.push(this.renderSection(currentConfig, microColGroupNode, true)); configI += 1; } while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'body') { bodySectionNodes.push(this.renderSection(currentConfig, microColGroupNode, false)); configI += 1; } while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'footer') { footSectionNodes.push(this.renderSection(currentConfig, microColGroupNode, true)); configI += 1; } // firefox bug: when setting height on table and there is a thead or tfoot, // the necessary height:100% on the liquid-height body section forces the *whole* table to be taller. (bug #5524) // use getCanVGrowWithinCell as a way to detect table-stupid firefox. // if so, use a simpler dom structure, jam everything into a lone tbody. var isBuggy = !getCanVGrowWithinCell(); var roleAttrs = { role: 'rowgroup' }; return vdom_cjs.createElement('table', { role: 'grid', className: classNames.join(' '), style: { height: props.height } }, Boolean(!isBuggy && headSectionNodes.length) && vdom_cjs.createElement.apply(void 0, tslib.__spreadArray(['thead', roleAttrs], headSectionNodes)), Boolean(!isBuggy && bodySectionNodes.length) && vdom_cjs.createElement.apply(void 0, tslib.__spreadArray(['tbody', roleAttrs], bodySectionNodes)), Boolean(!isBuggy && footSectionNodes.length) && vdom_cjs.createElement.apply(void 0, tslib.__spreadArray(['tfoot', roleAttrs], footSectionNodes)), isBuggy && vdom_cjs.createElement.apply(void 0, tslib.__spreadArray(tslib.__spreadArray(tslib.__spreadArray(['tbody', roleAttrs], headSectionNodes), bodySectionNodes), footSectionNodes))); }; SimpleScrollGrid.prototype.renderSection = function (sectionConfig, microColGroupNode, isHeader) { if ('outerContent' in sectionConfig) { return vdom_cjs.createElement(vdom_cjs.Fragment, { key: sectionConfig.key }, sectionConfig.outerContent); } return vdom_cjs.createElement("tr", { key: sectionConfig.key, role: "presentation", className: getSectionClassNames(sectionConfig, this.props.liquid).join(' ') }, this.renderChunkTd(sectionConfig, microColGroupNode, sectionConfig.chunk, isHeader)); }; SimpleScrollGrid.prototype.renderChunkTd = function (sectionConfig, microColGroupNode, chunkConfig, isHeader) { if ('outerContent' in chunkConfig) { return chunkConfig.outerContent; } var props = this.props; var _a = this.state, forceYScrollbars = _a.forceYScrollbars, scrollerClientWidths = _a.scrollerClientWidths, scrollerClientHeights = _a.scrollerClientHeights; var needsYScrolling = getAllowYScrolling(props, sectionConfig); // TODO: do lazily. do in section config? var isLiquid = getSectionHasLiquidHeight(props, sectionConfig); // for `!props.liquid` - is WHOLE scrollgrid natural height? // TODO: do same thing in advanced scrollgrid? prolly not b/c always has horizontal scrollbars var overflowY = !props.liquid ? 'visible' : forceYScrollbars ? 'scroll' : !needsYScrolling ? 'hidden' : 'auto'; var sectionKey = sectionConfig.key; var content = renderChunkContent(sectionConfig, chunkConfig, { tableColGroupNode: microColGroupNode, tableMinWidth: '', clientWidth: !props.collapsibleWidth && scrollerClientWidths[sectionKey] !== undefined ? scrollerClientWidths[sectionKey] : null, clientHeight: scrollerClientHeights[sectionKey] !== undefined ? scrollerClientHeights[sectionKey] : null, expandRows: sectionConfig.expandRows, syncRowHeights: false, rowSyncHeights: [], reportRowHeightChange: function reportRowHeightChange() {} }, isHeader); return vdom_cjs.createElement(isHeader ? 'th' : 'td', { ref: chunkConfig.elRef, role: 'presentation' }, vdom_cjs.createElement("div", { className: "fc-scroller-harness" + (isLiquid ? ' fc-scroller-harness-liquid' : '') }, vdom_cjs.createElement(Scroller, { ref: this.scrollerRefs.createRef(sectionKey), elRef: this.scrollerElRefs.createRef(sectionKey), overflowY: overflowY, overflowX: !props.liquid ? 'visible' : 'hidden' /* natural height? */ , maxHeight: sectionConfig.maxHeight, liquid: isLiquid, liquidIsAbsolute // because its within a harness : true }, content))); }; SimpleScrollGrid.prototype._handleScrollerEl = function (scrollerEl, key) { var section = getSectionByKey(this.props.sections, key); if (section) { setRef(section.chunk.scrollerElRef, scrollerEl); } }; SimpleScrollGrid.prototype.componentDidMount = function () { this.handleSizing(); this.context.addResizeHandler(this.handleSizing); }; SimpleScrollGrid.prototype.componentDidUpdate = function () { // TODO: need better solution when state contains non-sizing things this.handleSizing(); }; SimpleScrollGrid.prototype.componentWillUnmount = function () { this.context.removeResizeHandler(this.handleSizing); }; SimpleScrollGrid.prototype.computeShrinkWidth = function () { return hasShrinkWidth(this.props.cols) ? computeShrinkWidth(this.scrollerElRefs.getAll()) : 0; }; SimpleScrollGrid.prototype.computeScrollerDims = function () { var scrollbarWidth = getScrollbarWidths(); var _a = this, scrollerRefs = _a.scrollerRefs, scrollerElRefs = _a.scrollerElRefs; var forceYScrollbars = false; var scrollerClientWidths = {}; var scrollerClientHeights = {}; for (var sectionKey in scrollerRefs.currentMap) { var scroller = scrollerRefs.currentMap[sectionKey]; if (scroller && scroller.needsYScrolling()) { forceYScrollbars = true; break; } } for (var _i = 0, _b = this.props.sections; _i < _b.length; _i++) { var section = _b[_i]; var sectionKey = section.key; var scrollerEl = scrollerElRefs.currentMap[sectionKey]; if (scrollerEl) { var harnessEl = scrollerEl.parentNode; // TODO: weird way to get this. need harness b/c doesn't include table borders scrollerClientWidths[sectionKey] = Math.floor(harnessEl.getBoundingClientRect().width - (forceYScrollbars ? scrollbarWidth.y // use global because scroller might not have scrollbars yet but will need them in future : 0)); scrollerClientHeights[sectionKey] = Math.floor(harnessEl.getBoundingClientRect().height); } } return { forceYScrollbars: forceYScrollbars, scrollerClientWidths: scrollerClientWidths, scrollerClientHeights: scrollerClientHeights }; }; return SimpleScrollGrid; }(BaseComponent); SimpleScrollGrid.addStateEquality({ scrollerClientWidths: isPropsEqual, scrollerClientHeights: isPropsEqual }); function getSectionByKey(sections, key) { for (var _i = 0, sections_1 = sections; _i < sections_1.length; _i++) { var section = sections_1[_i]; if (section.key === key) { return section; } } return null; } var EventRoot = /** @class */ function (_super) { tslib.__extends(EventRoot, _super); function EventRoot() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.elRef = vdom_cjs.createRef(); return _this; } EventRoot.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; var options = context.options; var seg = props.seg; var eventRange = seg.eventRange; var ui = eventRange.ui; var hookProps = { event: new EventApi(context, eventRange.def, eventRange.instance), view: context.viewApi, timeText: props.timeText, textColor: ui.textColor, backgroundColor: ui.backgroundColor, borderColor: ui.borderColor, isDraggable: !props.disableDragging && computeSegDraggable(seg, context), isStartResizable: !props.disableResizing && computeSegStartResizable(seg, context), isEndResizable: !props.disableResizing && computeSegEndResizable(seg), isMirror: Boolean(props.isDragging || props.isResizing || props.isDateSelecting), isStart: Boolean(seg.isStart), isEnd: Boolean(seg.isEnd), isPast: Boolean(props.isPast), isFuture: Boolean(props.isFuture), isToday: Boolean(props.isToday), isSelected: Boolean(props.isSelected), isDragging: Boolean(props.isDragging), isResizing: Boolean(props.isResizing) }; var standardClassNames = getEventClassNames(hookProps).concat(ui.classNames); return vdom_cjs.createElement(RenderHook, { hookProps: hookProps, classNames: options.eventClassNames, content: options.eventContent, defaultContent: props.defaultContent, didMount: options.eventDidMount, willUnmount: options.eventWillUnmount, elRef: this.elRef }, function (rootElRef, customClassNames, innerElRef, innerContent) { return props.children(rootElRef, standardClassNames.concat(customClassNames), innerElRef, innerContent, hookProps); }); }; EventRoot.prototype.componentDidMount = function () { setElSeg(this.elRef.current, this.props.seg); }; /* need to re-assign seg to the element if seg changes, even if the element is the same */ EventRoot.prototype.componentDidUpdate = function (prevProps) { var seg = this.props.seg; if (seg !== prevProps.seg) { setElSeg(this.elRef.current, seg); } }; return EventRoot; }(BaseComponent); // should not be a purecomponent var StandardEvent = /** @class */ function (_super) { tslib.__extends(StandardEvent, _super); function StandardEvent() { return _super !== null && _super.apply(this, arguments) || this; } StandardEvent.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; var seg = props.seg; var timeFormat = context.options.eventTimeFormat || props.defaultTimeFormat; var timeText = buildSegTimeText(seg, timeFormat, context, props.defaultDisplayEventTime, props.defaultDisplayEventEnd); return vdom_cjs.createElement(EventRoot, { seg: seg, timeText: timeText, disableDragging: props.disableDragging, disableResizing: props.disableResizing, defaultContent: props.defaultContent || renderInnerContent$1, isDragging: props.isDragging, isResizing: props.isResizing, isDateSelecting: props.isDateSelecting, isSelected: props.isSelected, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday }, function (rootElRef, classNames, innerElRef, innerContent, hookProps) { return vdom_cjs.createElement("a", tslib.__assign({ className: props.extraClassNames.concat(classNames).join(' '), style: { borderColor: hookProps.borderColor, backgroundColor: hookProps.backgroundColor }, ref: rootElRef }, getSegAnchorAttrs(seg, context)), vdom_cjs.createElement("div", { className: "fc-event-main", ref: innerElRef, style: { color: hookProps.textColor } }, innerContent), hookProps.isStartResizable && vdom_cjs.createElement("div", { className: "fc-event-resizer fc-event-resizer-start" }), hookProps.isEndResizable && vdom_cjs.createElement("div", { className: "fc-event-resizer fc-event-resizer-end" })); }); }; return StandardEvent; }(BaseComponent); function renderInnerContent$1(innerProps) { return vdom_cjs.createElement("div", { className: "fc-event-main-frame" }, innerProps.timeText && vdom_cjs.createElement("div", { className: "fc-event-time" }, innerProps.timeText), vdom_cjs.createElement("div", { className: "fc-event-title-container" }, vdom_cjs.createElement("div", { className: "fc-event-title fc-sticky" }, innerProps.event.title || vdom_cjs.createElement(vdom_cjs.Fragment, null, "\xA0")))); } var NowIndicatorRoot = function NowIndicatorRoot(props) { return vdom_cjs.createElement(ViewContextType.Consumer, null, function (context) { var options = context.options; var hookProps = { isAxis: props.isAxis, date: context.dateEnv.toDate(props.date), view: context.viewApi }; return vdom_cjs.createElement(RenderHook, { hookProps: hookProps, classNames: options.nowIndicatorClassNames, content: options.nowIndicatorContent, didMount: options.nowIndicatorDidMount, willUnmount: options.nowIndicatorWillUnmount }, props.children); }); }; var DAY_NUM_FORMAT = createFormatter({ day: 'numeric' }); var DayCellContent = /** @class */ function (_super) { tslib.__extends(DayCellContent, _super); function DayCellContent() { return _super !== null && _super.apply(this, arguments) || this; } DayCellContent.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; var options = context.options; var hookProps = refineDayCellHookProps({ date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, extraProps: props.extraHookProps, viewApi: context.viewApi, dateEnv: context.dateEnv }); return vdom_cjs.createElement(ContentHook, { hookProps: hookProps, content: options.dayCellContent, defaultContent: props.defaultContent }, props.children); }; return DayCellContent; }(BaseComponent); function refineDayCellHookProps(raw) { var date = raw.date, dateEnv = raw.dateEnv; var dayMeta = getDateMeta(date, raw.todayRange, null, raw.dateProfile); return tslib.__assign(tslib.__assign(tslib.__assign({ date: dateEnv.toDate(date), view: raw.viewApi }, dayMeta), { dayNumberText: raw.showDayNumber ? dateEnv.format(date, DAY_NUM_FORMAT) : '' }), raw.extraProps); } var DayCellRoot = /** @class */ function (_super) { tslib.__extends(DayCellRoot, _super); function DayCellRoot() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.refineHookProps = memoizeObjArg(refineDayCellHookProps); _this.normalizeClassNames = buildClassNameNormalizer(); return _this; } DayCellRoot.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; var options = context.options; var hookProps = this.refineHookProps({ date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, extraProps: props.extraHookProps, viewApi: context.viewApi, dateEnv: context.dateEnv }); var classNames = getDayClassNames(hookProps, context.theme).concat(hookProps.isDisabled ? [] // don't use custom classNames if disabled : this.normalizeClassNames(options.dayCellClassNames, hookProps)); var dataAttrs = hookProps.isDisabled ? {} : { 'data-date': formatDayString(props.date) }; return vdom_cjs.createElement(MountHook, { hookProps: hookProps, didMount: options.dayCellDidMount, willUnmount: options.dayCellWillUnmount, elRef: props.elRef }, function (rootElRef) { return props.children(rootElRef, classNames, dataAttrs, hookProps.isDisabled); }); }; return DayCellRoot; }(BaseComponent); function renderFill(fillType) { return vdom_cjs.createElement("div", { className: "fc-" + fillType }); } var BgEvent = function BgEvent(props) { return vdom_cjs.createElement(EventRoot, { defaultContent: renderInnerContent, seg: props.seg /* uselesss i think */ , timeText: "", disableDragging: true, disableResizing: true, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday }, function (rootElRef, classNames, innerElRef, innerContent, hookProps) { return vdom_cjs.createElement("div", { ref: rootElRef, className: ['fc-bg-event'].concat(classNames).join(' '), style: { backgroundColor: hookProps.backgroundColor } }, innerContent); }); }; function renderInnerContent(props) { var title = props.event.title; return title && vdom_cjs.createElement("div", { className: "fc-event-title" }, props.event.title); } var WeekNumberRoot = function WeekNumberRoot(props) { return vdom_cjs.createElement(ViewContextType.Consumer, null, function (context) { var dateEnv = context.dateEnv, options = context.options; var date = props.date; var format = options.weekNumberFormat || props.defaultFormat; var num = dateEnv.computeWeekNumber(date); // TODO: somehow use for formatting as well? var text = dateEnv.format(date, format); var hookProps = { num: num, text: text, date: date }; return vdom_cjs.createElement(RenderHook, { hookProps: hookProps, classNames: options.weekNumberClassNames, content: options.weekNumberContent, defaultContent: renderInner, didMount: options.weekNumberDidMount, willUnmount: options.weekNumberWillUnmount }, props.children); }); }; function renderInner(innerProps) { return innerProps.text; } var PADDING_FROM_VIEWPORT = 10; var Popover = /** @class */ function (_super) { tslib.__extends(Popover, _super); function Popover() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.state = { titleId: getUniqueDomId() }; _this.handleRootEl = function (el) { _this.rootEl = el; if (_this.props.elRef) { setRef(_this.props.elRef, el); } }; // Triggered when the user clicks *anywhere* in the document, for the autoHide feature _this.handleDocumentMouseDown = function (ev) { // only hide the popover if the click happened outside the popover var target = getEventTargetViaRoot(ev); if (!_this.rootEl.contains(target)) { _this.handleCloseClick(); } }; _this.handleDocumentKeyDown = function (ev) { if (ev.key === 'Escape') { _this.handleCloseClick(); } }; _this.handleCloseClick = function () { var onClose = _this.props.onClose; if (onClose) { onClose(); } }; return _this; } Popover.prototype.render = function () { var _a = this.context, theme = _a.theme, options = _a.options; var _b = this, props = _b.props, state = _b.state; var classNames = ['fc-popover', theme.getClass('popover')].concat(props.extraClassNames || []); return vdom_cjs.createPortal(vdom_cjs.createElement("div", tslib.__assign({ id: props.id, className: classNames.join(' '), "aria-labelledby": state.titleId }, props.extraAttrs, { ref: this.handleRootEl }), vdom_cjs.createElement("div", { className: 'fc-popover-header ' + theme.getClass('popoverHeader') }, vdom_cjs.createElement("span", { className: "fc-popover-title", id: state.titleId }, props.title), vdom_cjs.createElement("span", { className: 'fc-popover-close ' + theme.getIconClass('close'), title: options.closeHint, onClick: this.handleCloseClick })), vdom_cjs.createElement("div", { className: 'fc-popover-body ' + theme.getClass('popoverContent') }, props.children)), props.parentEl); }; Popover.prototype.componentDidMount = function () { document.addEventListener('mousedown', this.handleDocumentMouseDown); document.addEventListener('keydown', this.handleDocumentKeyDown); this.updateSize(); }; Popover.prototype.componentWillUnmount = function () { document.removeEventListener('mousedown', this.handleDocumentMouseDown); document.removeEventListener('keydown', this.handleDocumentKeyDown); }; Popover.prototype.updateSize = function () { var isRtl = this.context.isRtl; var _a = this.props, alignmentEl = _a.alignmentEl, alignGridTop = _a.alignGridTop; var rootEl = this.rootEl; var alignmentRect = computeClippedClientRect(alignmentEl); if (alignmentRect) { var popoverDims = rootEl.getBoundingClientRect(); // position relative to viewport var popoverTop = alignGridTop ? elementClosest(alignmentEl, '.fc-scrollgrid').getBoundingClientRect().top : alignmentRect.top; var popoverLeft = isRtl ? alignmentRect.right - popoverDims.width : alignmentRect.left; // constrain popoverTop = Math.max(popoverTop, PADDING_FROM_VIEWPORT); popoverLeft = Math.min(popoverLeft, document.documentElement.clientWidth - PADDING_FROM_VIEWPORT - popoverDims.width); popoverLeft = Math.max(popoverLeft, PADDING_FROM_VIEWPORT); var origin_1 = rootEl.offsetParent.getBoundingClientRect(); applyStyle(rootEl, { top: popoverTop - origin_1.top, left: popoverLeft - origin_1.left }); } }; return Popover; }(BaseComponent); var MorePopover = /** @class */ function (_super) { tslib.__extends(MorePopover, _super); function MorePopover() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.handleRootEl = function (rootEl) { _this.rootEl = rootEl; if (rootEl) { _this.context.registerInteractiveComponent(_this, { el: rootEl, useEventCenter: false }); } else { _this.context.unregisterInteractiveComponent(_this); } }; return _this; } MorePopover.prototype.render = function () { var _a = this.context, options = _a.options, dateEnv = _a.dateEnv; var props = this.props; var startDate = props.startDate, todayRange = props.todayRange, dateProfile = props.dateProfile; var title = dateEnv.format(startDate, options.dayPopoverFormat); return vdom_cjs.createElement(DayCellRoot, { date: startDate, dateProfile: dateProfile, todayRange: todayRange, elRef: this.handleRootEl }, function (rootElRef, dayClassNames, dataAttrs) { return vdom_cjs.createElement(Popover, { elRef: rootElRef, id: props.id, title: title, extraClassNames: ['fc-more-popover'].concat(dayClassNames), extraAttrs: dataAttrs /* TODO: make these time-based when not whole-day? */ , parentEl: props.parentEl, alignmentEl: props.alignmentEl, alignGridTop: props.alignGridTop, onClose: props.onClose }, vdom_cjs.createElement(DayCellContent, { date: startDate, dateProfile: dateProfile, todayRange: todayRange }, function (innerElRef, innerContent) { return innerContent && vdom_cjs.createElement("div", { className: "fc-more-popover-misc", ref: innerElRef }, innerContent); }), props.children); }); }; MorePopover.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) { var _a = this, rootEl = _a.rootEl, props = _a.props; if (positionLeft >= 0 && positionLeft < elWidth && positionTop >= 0 && positionTop < elHeight) { return { dateProfile: props.dateProfile, dateSpan: tslib.__assign({ allDay: true, range: { start: props.startDate, end: props.endDate } }, props.extraDateSpan), dayEl: rootEl, rect: { left: 0, top: 0, right: elWidth, bottom: elHeight }, layer: 1 // important when comparing with hits from other components }; } return null; }; return MorePopover; }(DateComponent); var MoreLinkRoot = /** @class */ function (_super) { tslib.__extends(MoreLinkRoot, _super); function MoreLinkRoot() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.linkElRef = vdom_cjs.createRef(); _this.state = { isPopoverOpen: false, popoverId: getUniqueDomId() }; _this.handleClick = function (ev) { var _a = _this, props = _a.props, context = _a.context; var moreLinkClick = context.options.moreLinkClick; var date = computeRange(props).start; function buildPublicSeg(seg) { var _a = seg.eventRange, def = _a.def, instance = _a.instance, range = _a.range; return { event: new EventApi(context, def, instance), start: context.dateEnv.toDate(range.start), end: context.dateEnv.toDate(range.end), isStart: seg.isStart, isEnd: seg.isEnd }; } if (typeof moreLinkClick === 'function') { moreLinkClick = moreLinkClick({ date: date, allDay: Boolean(props.allDayDate), allSegs: props.allSegs.map(buildPublicSeg), hiddenSegs: props.hiddenSegs.map(buildPublicSeg), jsEvent: ev, view: context.viewApi }); } if (!moreLinkClick || moreLinkClick === 'popover') { _this.setState({ isPopoverOpen: true }); } else if (typeof moreLinkClick === 'string') { // a view name context.calendarApi.zoomTo(date, moreLinkClick); } }; _this.handlePopoverClose = function () { _this.setState({ isPopoverOpen: false }); }; return _this; } MoreLinkRoot.prototype.render = function () { var _this = this; var _a = this, props = _a.props, state = _a.state; return vdom_cjs.createElement(ViewContextType.Consumer, null, function (context) { var viewApi = context.viewApi, options = context.options, calendarApi = context.calendarApi; var moreLinkText = options.moreLinkText; var moreCnt = props.moreCnt; var range = computeRange(props); var text = typeof moreLinkText === 'function' // TODO: eventually use formatWithOrdinals ? moreLinkText.call(calendarApi, moreCnt) : "+" + moreCnt + " " + moreLinkText; var title = formatWithOrdinals(options.moreLinkHint, [moreCnt], text); var hookProps = { num: moreCnt, shortText: "+" + moreCnt, text: text, view: viewApi }; return vdom_cjs.createElement(vdom_cjs.Fragment, null, Boolean(props.moreCnt) && vdom_cjs.createElement(RenderHook, { elRef: _this.linkElRef, hookProps: hookProps, classNames: options.moreLinkClassNames, content: options.moreLinkContent, defaultContent: props.defaultContent || renderMoreLinkInner, didMount: options.moreLinkDidMount, willUnmount: options.moreLinkWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return props.children(rootElRef, ['fc-more-link'].concat(customClassNames), innerElRef, innerContent, _this.handleClick, title, state.isPopoverOpen, state.isPopoverOpen ? state.popoverId : ''); }), state.isPopoverOpen && vdom_cjs.createElement(MorePopover, { id: state.popoverId, startDate: range.start, endDate: range.end, dateProfile: props.dateProfile, todayRange: props.todayRange, extraDateSpan: props.extraDateSpan, parentEl: _this.parentEl, alignmentEl: props.alignmentElRef.current, alignGridTop: props.alignGridTop, onClose: _this.handlePopoverClose }, props.popoverContent())); }); }; MoreLinkRoot.prototype.componentDidMount = function () { this.updateParentEl(); }; MoreLinkRoot.prototype.componentDidUpdate = function () { this.updateParentEl(); }; MoreLinkRoot.prototype.updateParentEl = function () { if (this.linkElRef.current) { this.parentEl = elementClosest(this.linkElRef.current, '.fc-view-harness'); } }; return MoreLinkRoot; }(BaseComponent); function renderMoreLinkInner(props) { return props.text; } function computeRange(props) { if (props.allDayDate) { return { start: props.allDayDate, end: addDays(props.allDayDate, 1) }; } var hiddenSegs = props.hiddenSegs; return { start: computeEarliestSegStart(hiddenSegs), end: computeLatestSegEnd(hiddenSegs) }; } function computeEarliestSegStart(segs) { return segs.reduce(pickEarliestStart).eventRange.range.start; } function pickEarliestStart(seg0, seg1) { return seg0.eventRange.range.start < seg1.eventRange.range.start ? seg0 : seg1; } function computeLatestSegEnd(segs) { return segs.reduce(pickLatestEnd).eventRange.range.end; } function pickLatestEnd(seg0, seg1) { return seg0.eventRange.range.end > seg1.eventRange.range.end ? seg0 : seg1; } // exports // -------------------------------------------------------------------------------------------------- var version = '5.11.2'; // important to type it, so .d.ts has generic string exports.BASE_OPTION_DEFAULTS = BASE_OPTION_DEFAULTS; exports.BASE_OPTION_REFINERS = BASE_OPTION_REFINERS; exports.BaseComponent = BaseComponent; exports.BgEvent = BgEvent; exports.CalendarApi = CalendarApi; exports.CalendarContent = CalendarContent; exports.CalendarDataManager = CalendarDataManager; exports.CalendarDataProvider = CalendarDataProvider; exports.CalendarRoot = CalendarRoot; exports.ContentHook = ContentHook; exports.CustomContentRenderContext = CustomContentRenderContext; exports.DateComponent = DateComponent; exports.DateEnv = DateEnv; exports.DateProfileGenerator = DateProfileGenerator; exports.DayCellContent = DayCellContent; exports.DayCellRoot = DayCellRoot; exports.DayHeader = DayHeader; exports.DaySeriesModel = DaySeriesModel; exports.DayTableModel = DayTableModel; exports.DelayedRunner = DelayedRunner; exports.ElementDragging = ElementDragging; exports.ElementScrollController = ElementScrollController; exports.Emitter = Emitter; exports.EventApi = EventApi; exports.EventRoot = EventRoot; exports.EventSourceApi = EventSourceApi; exports.Interaction = Interaction; exports.MoreLinkRoot = MoreLinkRoot; exports.MountHook = MountHook; exports.NamedTimeZoneImpl = NamedTimeZoneImpl; exports.NowIndicatorRoot = NowIndicatorRoot; exports.NowTimer = NowTimer; exports.PositionCache = PositionCache; exports.RefMap = RefMap; exports.RenderHook = RenderHook; exports.ScrollController = ScrollController; exports.ScrollResponder = ScrollResponder; exports.Scroller = Scroller; exports.SegHierarchy = SegHierarchy; exports.SimpleScrollGrid = SimpleScrollGrid; exports.Slicer = Slicer; exports.Splitter = Splitter; exports.StandardEvent = StandardEvent; exports.TableDateCell = TableDateCell; exports.TableDowCell = TableDowCell; exports.Theme = Theme; exports.ViewApi = ViewApi; exports.ViewContextType = ViewContextType; exports.ViewRoot = ViewRoot; exports.WeekNumberRoot = WeekNumberRoot; exports.WindowScrollController = WindowScrollController; exports.addDays = addDays; exports.addDurations = addDurations; exports.addMs = addMs; exports.addWeeks = addWeeks; exports.allowContextMenu = allowContextMenu; exports.allowSelection = allowSelection; exports.applyMutationToEventStore = applyMutationToEventStore; exports.applyStyle = applyStyle; exports.applyStyleProp = applyStyleProp; exports.asCleanDays = asCleanDays; exports.asRoughMinutes = asRoughMinutes; exports.asRoughMs = asRoughMs; exports.asRoughSeconds = asRoughSeconds; exports.binarySearch = binarySearch; exports.buildClassNameNormalizer = buildClassNameNormalizer; exports.buildEntryKey = buildEntryKey; exports.buildEventApis = buildEventApis; exports.buildEventRangeKey = buildEventRangeKey; exports.buildHashFromArray = buildHashFromArray; exports.buildIsoString = buildIsoString; exports.buildNavLinkAttrs = buildNavLinkAttrs; exports.buildSegCompareObj = buildSegCompareObj; exports.buildSegTimeText = buildSegTimeText; exports.collectFromHash = collectFromHash; exports.combineEventUis = combineEventUis; exports.compareByFieldSpec = compareByFieldSpec; exports.compareByFieldSpecs = compareByFieldSpecs; exports.compareNumbers = compareNumbers; exports.compareObjs = compareObjs; exports.computeEarliestSegStart = computeEarliestSegStart; exports.computeEdges = computeEdges; exports.computeFallbackHeaderFormat = computeFallbackHeaderFormat; exports.computeHeightAndMargins = computeHeightAndMargins; exports.computeInnerRect = computeInnerRect; exports.computeRect = computeRect; exports.computeSegDraggable = computeSegDraggable; exports.computeSegEndResizable = computeSegEndResizable; exports.computeSegStartResizable = computeSegStartResizable; exports.computeShrinkWidth = computeShrinkWidth; exports.computeSmallestCellWidth = computeSmallestCellWidth; exports.computeVisibleDayRange = computeVisibleDayRange; exports.config = config; exports.constrainPoint = constrainPoint; exports.createAriaClickAttrs = createAriaClickAttrs; exports.createDuration = createDuration; exports.createEmptyEventStore = createEmptyEventStore; exports.createEventInstance = createEventInstance; exports.createEventUi = createEventUi; exports.createFormatter = createFormatter; exports.createPlugin = createPlugin; exports.diffDates = diffDates; exports.diffDayAndTime = diffDayAndTime; exports.diffDays = diffDays; exports.diffPoints = diffPoints; exports.diffWeeks = diffWeeks; exports.diffWholeDays = diffWholeDays; exports.diffWholeWeeks = diffWholeWeeks; exports.disableCursor = disableCursor; exports.elementClosest = elementClosest; exports.elementMatches = elementMatches; exports.enableCursor = enableCursor; exports.eventTupleToStore = eventTupleToStore; exports.filterEventStoreDefs = filterEventStoreDefs; exports.filterHash = filterHash; exports.findDirectChildren = findDirectChildren; exports.findElements = findElements; exports.flexibleCompare = flexibleCompare; exports.formatDate = formatDate; exports.formatDayString = formatDayString; exports.formatIsoTimeString = formatIsoTimeString; exports.formatRange = formatRange; exports.getAllowYScrolling = getAllowYScrolling; exports.getCanVGrowWithinCell = getCanVGrowWithinCell; exports.getClippingParents = getClippingParents; exports.getDateMeta = getDateMeta; exports.getDayClassNames = getDayClassNames; exports.getDefaultEventEnd = getDefaultEventEnd; exports.getElRoot = getElRoot; exports.getElSeg = getElSeg; exports.getEntrySpanEnd = getEntrySpanEnd; exports.getEventClassNames = getEventClassNames; exports.getEventTargetViaRoot = getEventTargetViaRoot; exports.getIsRtlScrollbarOnLeft = getIsRtlScrollbarOnLeft; exports.getRectCenter = getRectCenter; exports.getRelevantEvents = getRelevantEvents; exports.getScrollGridClassNames = getScrollGridClassNames; exports.getScrollbarWidths = getScrollbarWidths; exports.getSectionClassNames = getSectionClassNames; exports.getSectionHasLiquidHeight = getSectionHasLiquidHeight; exports.getSegAnchorAttrs = getSegAnchorAttrs; exports.getSegMeta = getSegMeta; exports.getSlotClassNames = getSlotClassNames; exports.getStickyFooterScrollbar = getStickyFooterScrollbar; exports.getStickyHeaderDates = getStickyHeaderDates; exports.getUnequalProps = getUnequalProps; exports.getUniqueDomId = getUniqueDomId; exports.globalLocales = globalLocales; exports.globalPlugins = globalPlugins; exports.greatestDurationDenominator = greatestDurationDenominator; exports.groupIntersectingEntries = groupIntersectingEntries; exports.guid = guid; exports.hasBgRendering = hasBgRendering; exports.hasShrinkWidth = hasShrinkWidth; exports.identity = identity; exports.interactionSettingsStore = interactionSettingsStore; exports.interactionSettingsToStore = interactionSettingsToStore; exports.intersectRanges = intersectRanges; exports.intersectRects = intersectRects; exports.intersectSpans = intersectSpans; exports.isArraysEqual = isArraysEqual; exports.isColPropsEqual = isColPropsEqual; exports.isDateSelectionValid = isDateSelectionValid; exports.isDateSpansEqual = isDateSpansEqual; exports.isInt = isInt; exports.isInteractionValid = isInteractionValid; exports.isMultiDayRange = isMultiDayRange; exports.isPropsEqual = isPropsEqual; exports.isPropsValid = isPropsValid; exports.isValidDate = isValidDate; exports.joinSpans = joinSpans; exports.listenBySelector = listenBySelector; exports.mapHash = mapHash; exports.memoize = memoize; exports.memoizeArraylike = memoizeArraylike; exports.memoizeHashlike = memoizeHashlike; exports.memoizeObjArg = memoizeObjArg; exports.mergeEventStores = mergeEventStores; exports.multiplyDuration = multiplyDuration; exports.padStart = padStart; exports.parseBusinessHours = parseBusinessHours; exports.parseClassNames = parseClassNames; exports.parseDragMeta = parseDragMeta; exports.parseEventDef = parseEventDef; exports.parseFieldSpecs = parseFieldSpecs; exports.parseMarker = parse; exports.pointInsideRect = pointInsideRect; exports.preventContextMenu = preventContextMenu; exports.preventDefault = preventDefault; exports.preventSelection = preventSelection; exports.rangeContainsMarker = rangeContainsMarker; exports.rangeContainsRange = rangeContainsRange; exports.rangesEqual = rangesEqual; exports.rangesIntersect = rangesIntersect; exports.refineEventDef = refineEventDef; exports.refineProps = refineProps; exports.removeElement = removeElement; exports.removeExact = removeExact; exports.renderChunkContent = renderChunkContent; exports.renderFill = renderFill; exports.renderMicroColGroup = renderMicroColGroup; exports.renderScrollShim = renderScrollShim; exports.requestJson = requestJson; exports.sanitizeShrinkWidth = sanitizeShrinkWidth; exports.setElSeg = setElSeg; exports.setRef = setRef; exports.sliceEventStore = sliceEventStore; exports.sliceEvents = sliceEvents; exports.sortEventSegs = sortEventSegs; exports.startOfDay = startOfDay; exports.translateRect = translateRect; exports.triggerDateSelect = triggerDateSelect; exports.unpromisify = unpromisify; exports.version = version; exports.whenTransitionDone = whenTransitionDone; exports.wholeDivideDurations = wholeDivideDurations; Object.keys(vdom_cjs).forEach(function (k) { if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { enumerable: true, get: function get() { return vdom_cjs[k]; } }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsInRzbGliIiwicmVxdWlyZSIsInZkb21fY2pzIiwiRXZlbnRTb3VyY2VBcGkiLCJjb250ZXh0IiwiaW50ZXJuYWxFdmVudFNvdXJjZSIsInByb3RvdHlwZSIsInJlbW92ZSIsImRpc3BhdGNoIiwidHlwZSIsInNvdXJjZUlkIiwicmVmZXRjaCIsInNvdXJjZUlkcyIsImlzUmVmZXRjaCIsImdldCIsInB1YmxpY0lkIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIm1ldGEiLCJ1cmwiLCJmb3JtYXQiLCJyZW1vdmVFbGVtZW50IiwiZWwiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJlbGVtZW50Q2xvc2VzdCIsInNlbGVjdG9yIiwiY2xvc2VzdCIsImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50IiwiY29udGFpbnMiLCJlbGVtZW50TWF0Y2hlcyIsInBhcmVudEVsZW1lbnQiLCJub2RlVHlwZSIsIm1ldGhvZCIsIm1hdGNoZXMiLCJtYXRjaGVzU2VsZWN0b3IiLCJtc01hdGNoZXNTZWxlY3RvciIsImNhbGwiLCJmaW5kRWxlbWVudHMiLCJjb250YWluZXIiLCJjb250YWluZXJzIiwiSFRNTEVsZW1lbnQiLCJhbGxNYXRjaGVzIiwiaSIsImxlbmd0aCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJqIiwicHVzaCIsImZpbmREaXJlY3RDaGlsZHJlbiIsInBhcmVudCIsInBhcmVudHMiLCJjaGlsZE5vZGVzIiwiY2hpbGRyZW4iLCJjaGlsZE5vZGUiLCJQSVhFTF9QUk9QX1JFIiwiYXBwbHlTdHlsZSIsInByb3BzIiwicHJvcE5hbWUiLCJhcHBseVN0eWxlUHJvcCIsIm5hbWUiLCJ2YWwiLCJzdHlsZSIsInRlc3QiLCJnZXRFdmVudFRhcmdldFZpYVJvb3QiLCJldiIsIl9hIiwiX2IiLCJjb21wb3NlZFBhdGgiLCJ0YXJnZXQiLCJnZXRFbFJvb3QiLCJnZXRSb290Tm9kZSIsImd1aWQkMSIsImdldFVuaXF1ZURvbUlkIiwicHJldmVudERlZmF1bHQiLCJidWlsZERlbGVnYXRpb25IYW5kbGVyIiwiaGFuZGxlciIsIm1hdGNoZWRDaGlsZCIsImxpc3RlbkJ5U2VsZWN0b3IiLCJldmVudFR5cGUiLCJhdHRhY2hlZEhhbmRsZXIiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImxpc3RlblRvSG92ZXJCeVNlbGVjdG9yIiwib25Nb3VzZUVudGVyIiwib25Nb3VzZUxlYXZlIiwiY3VycmVudE1hdGNoZWRDaGlsZCIsIm1vdXNlT3ZlckV2IiwicmVhbE9uTW91c2VMZWF2ZV8xIiwibW91c2VMZWF2ZUV2IiwidHJhbnNpdGlvbkV2ZW50TmFtZXMiLCJ3aGVuVHJhbnNpdGlvbkRvbmUiLCJjYWxsYmFjayIsInJlYWxDYWxsYmFjayIsImZvckVhY2giLCJldmVudE5hbWUiLCJjcmVhdGVBcmlhQ2xpY2tBdHRycyIsIl9fYXNzaWduIiwib25DbGljayIsImNyZWF0ZUFyaWFLZXlib2FyZEF0dHJzIiwidGFiSW5kZXgiLCJvbktleURvd24iLCJrZXkiLCJndWlkTnVtYmVyIiwiZ3VpZCIsIlN0cmluZyIsImRpc2FibGVDdXJzb3IiLCJib2R5IiwiY2xhc3NMaXN0IiwiYWRkIiwiZW5hYmxlQ3Vyc29yIiwicHJldmVudFNlbGVjdGlvbiIsImFsbG93U2VsZWN0aW9uIiwicHJldmVudENvbnRleHRNZW51IiwiYWxsb3dDb250ZXh0TWVudSIsInBhcnNlRmllbGRTcGVjcyIsImlucHV0Iiwic3BlY3MiLCJ0b2tlbnMiLCJ0b2tlbiIsInNwbGl0IiwiQXJyYXkiLCJpc0FycmF5IiwiY2hhckF0IiwiZmllbGQiLCJzdWJzdHJpbmciLCJvcmRlciIsImZ1bmMiLCJjb21wYXJlQnlGaWVsZFNwZWNzIiwib2JqMCIsIm9iajEiLCJmaWVsZFNwZWNzIiwiY21wIiwiY29tcGFyZUJ5RmllbGRTcGVjIiwiZmllbGRTcGVjIiwiZmxleGlibGVDb21wYXJlIiwiYSIsImIiLCJsb2NhbGVDb21wYXJlIiwicGFkU3RhcnQiLCJsZW4iLCJzIiwic3Vic3RyIiwiZm9ybWF0V2l0aE9yZGluYWxzIiwiZm9ybWF0dGVyIiwiYXJncyIsImZhbGxiYWNrVGV4dCIsImFwcGx5IiwicmVkdWNlIiwic3RyIiwiYXJnIiwiaW5kZXgiLCJyZXBsYWNlIiwiY29tcGFyZU51bWJlcnMiLCJpc0ludCIsIm4iLCJjb21wdXRlU21hbGxlc3RDZWxsV2lkdGgiLCJjZWxsRWwiLCJhbGxXaWR0aEVsIiwicXVlcnlTZWxlY3RvciIsImNvbnRlbnRXaWR0aEVsIiwiRXJyb3IiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ3aWR0aCIsIkRBWV9JRFMiLCJhZGRXZWVrcyIsIm0iLCJkYXRlVG9VdGNBcnJheSIsImFycmF5VG9VdGNEYXRlIiwiYWRkRGF5cyIsImFkZE1zIiwiZGlmZldlZWtzIiwibTAiLCJtMSIsImRpZmZEYXlzIiwidmFsdWVPZiIsImRpZmZIb3VycyIsImRpZmZNaW51dGVzIiwiZGlmZlNlY29uZHMiLCJkaWZmRGF5QW5kVGltZSIsIm0wZGF5Iiwic3RhcnRPZkRheSIsIm0xZGF5IiwieWVhcnMiLCJtb250aHMiLCJkYXlzIiwiTWF0aCIsInJvdW5kIiwibWlsbGlzZWNvbmRzIiwiZGlmZldob2xlV2Vla3MiLCJkIiwiZGlmZldob2xlRGF5cyIsInRpbWVBc01zIiwiZ2V0VVRDRnVsbFllYXIiLCJnZXRVVENNb250aCIsImdldFVUQ0RhdGUiLCJzdGFydE9mSG91ciIsImdldFVUQ0hvdXJzIiwic3RhcnRPZk1pbnV0ZSIsImdldFVUQ01pbnV0ZXMiLCJzdGFydE9mU2Vjb25kIiwiZ2V0VVRDU2Vjb25kcyIsIndlZWtPZlllYXIiLCJtYXJrZXIiLCJkb3ciLCJkb3kiLCJ5IiwidyIsIndlZWtPZkdpdmVuWWVhciIsIm5leHRXIiwibWluIiwieWVhciIsImZpcnN0V2Vla1N0YXJ0IiwiZmlyc3RXZWVrT2Zmc2V0IiwiZGF5U3RhcnQiLCJmbG9vciIsImZ3ZCIsImZ3ZGx3IiwiZ2V0VVRDRGF5IiwiZGF0ZVRvTG9jYWxBcnJheSIsImRhdGUiLCJnZXRGdWxsWWVhciIsImdldE1vbnRoIiwiZ2V0RGF0ZSIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJnZXRNaWxsaXNlY29uZHMiLCJhcnJheVRvTG9jYWxEYXRlIiwiRGF0ZSIsImdldFVUQ01pbGxpc2Vjb25kcyIsImNvbmNhdCIsIlVUQyIsImlzVmFsaWREYXRlIiwiaXNOYU4iLCJjcmVhdGVFdmVudEluc3RhbmNlIiwiZGVmSWQiLCJyYW5nZSIsImZvcmNlZFN0YXJ0VHpvIiwiZm9yY2VkRW5kVHpvIiwiaW5zdGFuY2VJZCIsImhhc093blByb3BlcnR5IiwibWVyZ2VQcm9wcyIsInByb3BPYmpzIiwiY29tcGxleFByb3BzTWFwIiwiZGVzdCIsIm5hbWVfMSIsImNvbXBsZXhPYmpzIiwidW5zaGlmdCIsInVuZGVmaW5lZCIsIm5hbWVfMiIsImZpbHRlckhhc2giLCJoYXNoIiwiZmlsdGVyZWQiLCJtYXBIYXNoIiwibmV3SGFzaCIsImFycmF5VG9IYXNoIiwiX2kiLCJhXzEiLCJpdGVtIiwiYnVpbGRIYXNoRnJvbUFycmF5IiwidHVwbGUiLCJoYXNoVmFsdWVzVG9BcnJheSIsIm9iaiIsImlzUHJvcHNFcXVhbCIsImdldFVuZXF1YWxQcm9wcyIsImtleXMiLCJjb21wYXJlT2JqcyIsIm9sZFByb3BzIiwibmV3UHJvcHMiLCJlcXVhbGl0eUZ1bmNzIiwiaXNPYmpWYWxzRXF1YWwiLCJ2YWwwIiwidmFsMSIsImNvbXBhcmF0b3IiLCJjb2xsZWN0RnJvbUhhc2giLCJzdGFydEluZGV4IiwiZW5kSW5kZXgiLCJzdGVwIiwicmVzIiwicGFyc2VSZWN1cnJpbmciLCJyZWZpbmVkIiwiZGVmYXVsdEFsbERheSIsImRhdGVFbnYiLCJyZWN1cnJpbmdUeXBlcyIsInBhcnNlZCIsInBhcnNlIiwiYWxsRGF5IiwiYWxsRGF5R3Vlc3MiLCJkdXJhdGlvbiIsInR5cGVEYXRhIiwidHlwZUlkIiwiZXhwYW5kUmVjdXJyaW5nIiwiZXZlbnRTdG9yZSIsImZyYW1pbmdSYW5nZSIsInBsdWdpbkhvb2tzIiwib3B0aW9ucyIsImRlZnMiLCJpbnN0YW5jZXMiLCJpbnN0YW5jZSIsInJlY3VycmluZ0RlZiIsImRlZiIsImRlZmF1bHRBbGxEYXlFdmVudER1cmF0aW9uIiwiZGVmYXVsdFRpbWVkRXZlbnREdXJhdGlvbiIsInN0YXJ0cyIsImV4cGFuZFJlY3VycmluZ1JhbmdlcyIsInN0YXJ0c18xIiwic3RhcnQiLCJlbmQiLCJldmVudERlZiIsInR5cGVEZWYiLCJtYXJrZXJzIiwiZXhwYW5kIiwic3VidHJhY3QiLCJtYXAiLCJJTlRFUk5BTF9VTklUUyIsIlBBUlNFX1JFIiwiY3JlYXRlRHVyYXRpb24iLCJ1bml0IiwicGFyc2VTdHJpbmciLCJwYXJzZU9iamVjdCIsImV4ZWMiLCJzaWduIiwicGFyc2VJbnQiLCJtb250aCIsImRheSIsImhvdXJzIiwiaG91ciIsIm1pbnV0ZXMiLCJtaW51dGUiLCJzZWNvbmRzIiwic2Vjb25kIiwibWlsbGlzZWNvbmQiLCJtcyIsIndlZWtzIiwid2VlayIsInNwZWNpZmllZFdlZWtzIiwiZHVyYXRpb25zRXF1YWwiLCJkMCIsImQxIiwiYXNDbGVhbkRheXMiLCJkdXIiLCJhZGREdXJhdGlvbnMiLCJzdWJ0cmFjdER1cmF0aW9ucyIsIm11bHRpcGx5RHVyYXRpb24iLCJhc1JvdWdoWWVhcnMiLCJhc1JvdWdoRGF5cyIsImFzUm91Z2hNb250aHMiLCJhc1JvdWdoTXMiLCJhc1JvdWdoTWludXRlcyIsImFzUm91Z2hTZWNvbmRzIiwid2hvbGVEaXZpZGVEdXJhdGlvbnMiLCJudW1lcmF0b3IiLCJkZW5vbWluYXRvciIsImxvY2FsUmVzIiwiZ3JlYXRlc3REdXJhdGlvbkRlbm9taW5hdG9yIiwiYnVpbGRJc29TdHJpbmciLCJ0aW1lWm9uZU9mZnNldCIsInN0cmlwWmVyb1RpbWUiLCJ0b0lTT1N0cmluZyIsImZvcm1hdFRpbWVab25lT2Zmc2V0IiwiZm9ybWF0RGF5U3RyaW5nIiwiZm9ybWF0SXNvVGltZVN0cmluZyIsImRvSXNvIiwiYWJzIiwibWlucyIsInJlbW92ZUV4YWN0IiwiYXJyYXkiLCJleGFjdFZhbCIsInJlbW92ZUNudCIsInNwbGljZSIsImlzQXJyYXlzRXF1YWwiLCJhMCIsImExIiwiZXF1YWxpdHlGdW5jIiwibWVtb2l6ZSIsIndvcmtlckZ1bmMiLCJyZXNFcXVhbGl0eSIsInRlYXJkb3duRnVuYyIsImN1cnJlbnRBcmdzIiwiY3VycmVudFJlcyIsIm5ld0FyZ3MiLCJhcmd1bWVudHMiLCJtZW1vaXplT2JqQXJnIiwiX3RoaXMiLCJjdXJyZW50QXJnIiwibmV3QXJnIiwibWVtb2l6ZUFycmF5bGlrZSIsImN1cnJlbnRBcmdTZXRzIiwiY3VycmVudFJlc3VsdHMiLCJuZXdBcmdTZXRzIiwiY3VycmVudExlbiIsIm5ld0xlbiIsIm1lbW9pemVIYXNobGlrZSIsImN1cnJlbnRBcmdIYXNoIiwiY3VycmVudFJlc0hhc2giLCJuZXdBcmdIYXNoIiwibmV3UmVzSGFzaCIsIkVYVEVOREVEX1NFVFRJTkdTX0FORF9TRVZFUklUSUVTIiwic2VwYXJhdG9yIiwib21pdFplcm9NaW51dGUiLCJtZXJpZGllbSIsIm9taXRDb21tYXMiLCJTVEFOREFSRF9EQVRFX1BST1BfU0VWRVJJVElFUyIsInRpbWVab25lTmFtZSIsImVyYSIsIndlZWtkYXkiLCJNRVJJRElFTV9SRSIsIkNPTU1BX1JFIiwiTVVMVElfU1BBQ0VfUkUiLCJMVFJfUkUiLCJVVENfUkUiLCJOYXRpdmVGb3JtYXR0ZXIiLCJmb3JtYXRTZXR0aW5ncyIsInN0YW5kYXJkRGF0ZVByb3BzIiwiZXh0ZW5kZWRTZXR0aW5ncyIsInNldmVyaXR5IiwibWF4IiwiYnVpbGRGb3JtYXR0aW5nRnVuYyIsImZvcm1hdFJhbmdlIiwiYmV0dGVyRGVmYXVsdFNlcGFyYXRvciIsImRpZmZTZXZlcml0eSIsImNvbXB1dGVNYXJrZXJEaWZmU2V2ZXJpdHkiLCJjYWxlbmRhclN5c3RlbSIsImJpZ2dlc3RVbml0Rm9yUGFydGlhbCIsImZ1bGwwIiwiZnVsbDEiLCJwYXJ0aWFsRGF0ZVByb3BzIiwiY29tcHV0ZVBhcnRpYWxGb3JtYXR0aW5nT3B0aW9ucyIsInBhcnRpYWxGb3JtYXR0aW5nRnVuYyIsInBhcnRpYWwwIiwicGFydGlhbDEiLCJpbnNlcnRpb24iLCJmaW5kQ29tbW9uSW5zZXJ0aW9uIiwiZGVmYXVsdFNlcGFyYXRvciIsImJlZm9yZSIsImFmdGVyIiwiZ2V0TGFyZ2VzdFVuaXQiLCJzdGFuZGFyZERhdGVQcm9wQ250IiwiZm9ybWF0V2Vla051bWJlciIsImNvbXB1dGVXZWVrTnVtYmVyIiwid2Vla1RleHQiLCJ3ZWVrVGV4dExvbmciLCJsb2NhbGUiLCJidWlsZE5hdGl2ZUZvcm1hdHRpbmdGdW5jIiwic2FuaXRpemVTZXR0aW5ncyIsInRpbWVab25lIiwibm9ybWFsRm9ybWF0IiwiSW50bCIsIkRhdGVUaW1lRm9ybWF0IiwiY29kZXMiLCJ6ZXJvRm9ybWF0IiwiemVyb1Byb3BzIiwicG9zdFByb2Nlc3MiLCJpbmplY3RUem9TdHIiLCJ0cmltIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJ0em9TdHIiLCJyZXBsYWNlZCIsIm51bSIsImRpc3BsYXkiLCJwYXJ0cyIsInNpbXBsZU51bWJlckZvcm1hdCIsImRpcmVjdGlvbiIsInJldmVyc2UiLCJqb2luIiwiY2EiLCJnZXRNYXJrZXJZZWFyIiwiZ2V0TWFya2VyTW9udGgiLCJnZXRNYXJrZXJEYXkiLCJiaWdnZXN0VW5pdCIsInBhcnRpYWxPcHRpb25zIiwiaTAiLCJmb3VuZDAiLCJpbmRleE9mIiwiYmVmb3JlMCIsImFmdGVyMCIsImkxIiwiZm91bmQxIiwiYmVmb3JlMSIsImFmdGVyMSIsImV4cGFuZFpvbmVkTWFya2VyIiwiZGF0ZUluZm8iLCJtYXJrZXJUb0FycmF5IiwiY3JlYXRlVmVyYm9zZUZvcm1hdHRpbmdBcmciLCJzdGFydEluZm8iLCJlbmRJbmZvIiwibG9jYWxlQ29kZXMiLCJDbWRGb3JtYXR0ZXIiLCJjbWRTdHIiLCJjbWRGb3JtYXR0ZXIiLCJGdW5jRm9ybWF0dGVyIiwiY3JlYXRlRm9ybWF0dGVyIiwiQkFTRV9PUFRJT05fUkVGSU5FUlMiLCJuYXZMaW5rRGF5Q2xpY2siLCJpZGVudGl0eSIsIm5hdkxpbmtXZWVrQ2xpY2siLCJib290c3RyYXBGb250QXdlc29tZSIsImJ1dHRvbkljb25zIiwiY3VzdG9tQnV0dG9ucyIsIm5leHREYXlUaHJlc2hvbGQiLCJzY3JvbGxUaW1lIiwic2Nyb2xsVGltZVJlc2V0IiwiQm9vbGVhbiIsInNsb3RNaW5UaW1lIiwic2xvdE1heFRpbWUiLCJkYXlQb3BvdmVyRm9ybWF0Iiwic2xvdER1cmF0aW9uIiwic25hcER1cmF0aW9uIiwiaGVhZGVyVG9vbGJhciIsImZvb3RlclRvb2xiYXIiLCJkZWZhdWx0UmFuZ2VTZXBhcmF0b3IiLCJ0aXRsZVJhbmdlU2VwYXJhdG9yIiwiZm9yY2VFdmVudER1cmF0aW9uIiwiZGF5SGVhZGVycyIsImRheUhlYWRlckZvcm1hdCIsImRheUhlYWRlckNsYXNzTmFtZXMiLCJkYXlIZWFkZXJDb250ZW50IiwiZGF5SGVhZGVyRGlkTW91bnQiLCJkYXlIZWFkZXJXaWxsVW5tb3VudCIsImRheUNlbGxDbGFzc05hbWVzIiwiZGF5Q2VsbENvbnRlbnQiLCJkYXlDZWxsRGlkTW91bnQiLCJkYXlDZWxsV2lsbFVubW91bnQiLCJpbml0aWFsVmlldyIsImFzcGVjdFJhdGlvIiwiTnVtYmVyIiwid2Vla2VuZHMiLCJ3ZWVrTnVtYmVyQ2FsY3VsYXRpb24iLCJ3ZWVrTnVtYmVycyIsIndlZWtOdW1iZXJDbGFzc05hbWVzIiwid2Vla051bWJlckNvbnRlbnQiLCJ3ZWVrTnVtYmVyRGlkTW91bnQiLCJ3ZWVrTnVtYmVyV2lsbFVubW91bnQiLCJlZGl0YWJsZSIsInZpZXdDbGFzc05hbWVzIiwidmlld0RpZE1vdW50Iiwidmlld1dpbGxVbm1vdW50Iiwibm93SW5kaWNhdG9yIiwibm93SW5kaWNhdG9yQ2xhc3NOYW1lcyIsIm5vd0luZGljYXRvckNvbnRlbnQiLCJub3dJbmRpY2F0b3JEaWRNb3VudCIsIm5vd0luZGljYXRvcldpbGxVbm1vdW50Iiwic2hvd05vbkN1cnJlbnREYXRlcyIsImxhenlGZXRjaGluZyIsInN0YXJ0UGFyYW0iLCJlbmRQYXJhbSIsInRpbWVab25lUGFyYW0iLCJsb2NhbGVzIiwidGhlbWVTeXN0ZW0iLCJkcmFnUmV2ZXJ0RHVyYXRpb24iLCJkcmFnU2Nyb2xsIiwiYWxsRGF5TWFpbnRhaW5EdXJhdGlvbiIsInVuc2VsZWN0QXV0byIsImRyb3BBY2NlcHQiLCJldmVudE9yZGVyIiwiZXZlbnRPcmRlclN0cmljdCIsImhhbmRsZVdpbmRvd1Jlc2l6ZSIsIndpbmRvd1Jlc2l6ZURlbGF5IiwibG9uZ1ByZXNzRGVsYXkiLCJldmVudERyYWdNaW5EaXN0YW5jZSIsImV4cGFuZFJvd3MiLCJoZWlnaHQiLCJjb250ZW50SGVpZ2h0Iiwid2Vla051bWJlckZvcm1hdCIsImV2ZW50UmVzaXphYmxlRnJvbVN0YXJ0IiwiZGlzcGxheUV2ZW50VGltZSIsImRpc3BsYXlFdmVudEVuZCIsInByb2dyZXNzaXZlRXZlbnRSZW5kZXJpbmciLCJidXNpbmVzc0hvdXJzIiwiaW5pdGlhbERhdGUiLCJub3ciLCJldmVudERhdGFUcmFuc2Zvcm0iLCJzdGlja3lIZWFkZXJEYXRlcyIsInN0aWNreUZvb3RlclNjcm9sbGJhciIsInZpZXdIZWlnaHQiLCJldmVudFNvdXJjZUZhaWx1cmUiLCJldmVudFNvdXJjZVN1Y2Nlc3MiLCJldmVudERpc3BsYXkiLCJldmVudFN0YXJ0RWRpdGFibGUiLCJldmVudER1cmF0aW9uRWRpdGFibGUiLCJldmVudE92ZXJsYXAiLCJldmVudENvbnN0cmFpbnQiLCJldmVudEFsbG93IiwiZXZlbnRCYWNrZ3JvdW5kQ29sb3IiLCJldmVudEJvcmRlckNvbG9yIiwiZXZlbnRUZXh0Q29sb3IiLCJldmVudENvbG9yIiwiZXZlbnRDbGFzc05hbWVzIiwiZXZlbnRDb250ZW50IiwiZXZlbnREaWRNb3VudCIsImV2ZW50V2lsbFVubW91bnQiLCJzZWxlY3RDb25zdHJhaW50Iiwic2VsZWN0T3ZlcmxhcCIsInNlbGVjdEFsbG93IiwiZHJvcHBhYmxlIiwidW5zZWxlY3RDYW5jZWwiLCJzbG90TGFiZWxGb3JtYXQiLCJzbG90TGFuZUNsYXNzTmFtZXMiLCJzbG90TGFuZUNvbnRlbnQiLCJzbG90TGFuZURpZE1vdW50Iiwic2xvdExhbmVXaWxsVW5tb3VudCIsInNsb3RMYWJlbENsYXNzTmFtZXMiLCJzbG90TGFiZWxDb250ZW50Iiwic2xvdExhYmVsRGlkTW91bnQiLCJzbG90TGFiZWxXaWxsVW5tb3VudCIsImRheU1heEV2ZW50cyIsImRheU1heEV2ZW50Um93cyIsImRheU1pbldpZHRoIiwic2xvdExhYmVsSW50ZXJ2YWwiLCJhbGxEYXlUZXh0IiwiYWxsRGF5Q2xhc3NOYW1lcyIsImFsbERheUNvbnRlbnQiLCJhbGxEYXlEaWRNb3VudCIsImFsbERheVdpbGxVbm1vdW50Iiwic2xvdE1pbldpZHRoIiwibmF2TGlua3MiLCJldmVudFRpbWVGb3JtYXQiLCJyZXJlbmRlckRlbGF5IiwibW9yZUxpbmtUZXh0IiwibW9yZUxpbmtIaW50Iiwic2VsZWN0TWluRGlzdGFuY2UiLCJzZWxlY3RhYmxlIiwic2VsZWN0TG9uZ1ByZXNzRGVsYXkiLCJldmVudExvbmdQcmVzc0RlbGF5Iiwic2VsZWN0TWlycm9yIiwiZXZlbnRNYXhTdGFjayIsImV2ZW50TWluSGVpZ2h0IiwiZXZlbnRNaW5XaWR0aCIsImV2ZW50U2hvcnRIZWlnaHQiLCJzbG90RXZlbnRPdmVybGFwIiwicGx1Z2lucyIsImZpcnN0RGF5IiwiZGF5Q291bnQiLCJkYXRlQWxpZ25tZW50IiwiZGF0ZUluY3JlbWVudCIsImhpZGRlbkRheXMiLCJtb250aE1vZGUiLCJmaXhlZFdlZWtDb3VudCIsInZhbGlkUmFuZ2UiLCJ2aXNpYmxlUmFuZ2UiLCJ0aXRsZUZvcm1hdCIsImV2ZW50SW50ZXJhY3RpdmUiLCJub0V2ZW50c1RleHQiLCJ2aWV3SGludCIsIm5hdkxpbmtIaW50IiwiY2xvc2VIaW50IiwidGltZUhpbnQiLCJldmVudEhpbnQiLCJtb3JlTGlua0NsaWNrIiwibW9yZUxpbmtDbGFzc05hbWVzIiwibW9yZUxpbmtDb250ZW50IiwibW9yZUxpbmtEaWRNb3VudCIsIm1vcmVMaW5rV2lsbFVubW91bnQiLCJCQVNFX09QVElPTl9ERUZBVUxUUyIsImNlbnRlciIsIkNBTEVOREFSX0xJU1RFTkVSX1JFRklORVJTIiwiZGF0ZXNTZXQiLCJldmVudHNTZXQiLCJldmVudEFkZCIsImV2ZW50Q2hhbmdlIiwiZXZlbnRSZW1vdmUiLCJ3aW5kb3dSZXNpemUiLCJldmVudENsaWNrIiwiZXZlbnRNb3VzZUVudGVyIiwiZXZlbnRNb3VzZUxlYXZlIiwic2VsZWN0IiwidW5zZWxlY3QiLCJsb2FkaW5nIiwiX3VubW91bnQiLCJfYmVmb3JlcHJpbnQiLCJfYWZ0ZXJwcmludCIsIl9ub0V2ZW50RHJvcCIsIl9ub0V2ZW50UmVzaXplIiwiX3Jlc2l6ZSIsIl9zY3JvbGxSZXF1ZXN0IiwiQ0FMRU5EQVJfT1BUSU9OX1JFRklORVJTIiwiYnV0dG9uVGV4dCIsImJ1dHRvbkhpbnRzIiwidmlld3MiLCJpbml0aWFsRXZlbnRzIiwiZXZlbnRzIiwiZXZlbnRTb3VyY2VzIiwiQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlMiLCJpc01heWJlT2JqZWN0c0VxdWFsIiwiVklFV19PUFRJT05fUkVGSU5FUlMiLCJjb21wb25lbnQiLCJidXR0b25UZXh0S2V5IiwiZGF0ZVByb2ZpbGVHZW5lcmF0b3JDbGFzcyIsInVzZXNNaW5NYXhUaW1lIiwiY2xhc3NOYW1lcyIsImNvbnRlbnQiLCJkaWRNb3VudCIsIndpbGxVbm1vdW50IiwibWVyZ2VSYXdPcHRpb25zIiwib3B0aW9uU2V0cyIsInJlZmluZVByb3BzIiwicmVmaW5lcnMiLCJleHRyYSIsInJhdyIsInBhcnNlRXZlbnRzIiwicmF3RXZlbnRzIiwiZXZlbnRTb3VyY2UiLCJhbGxvd09wZW5SYW5nZSIsImNyZWF0ZUVtcHR5RXZlbnRTdG9yZSIsImV2ZW50UmVmaW5lcnMiLCJidWlsZEV2ZW50UmVmaW5lcnMiLCJyYXdFdmVudHNfMSIsInJhd0V2ZW50IiwicGFyc2VFdmVudCIsImV2ZW50VHVwbGVUb1N0b3JlIiwiZ2V0UmVsZXZhbnRFdmVudHMiLCJkZWZfMSIsIm5ld1N0b3JlIiwiZmlsdGVyRXZlbnRTdG9yZURlZnMiLCJsb29rRGVmIiwiaXNFdmVudERlZnNHcm91cGVkIiwiZGVmMCIsImRlZjEiLCJncm91cElkIiwibWVyZ2VFdmVudFN0b3JlcyIsInN0b3JlMCIsInN0b3JlMSIsImZpbHRlckZ1bmMiLCJleGNsdWRlU3ViRXZlbnRTdG9yZSIsIm1hc3RlciIsInN1YiIsImZpbHRlcmVkRGVmcyIsImZpbHRlcmVkSW5zdGFuY2VzIiwibm9ybWFsaXplQ29uc3RyYWludCIsInBhcnNlQ2xhc3NOYW1lcyIsIkVWRU5UX1VJX1JFRklORVJTIiwic3RhcnRFZGl0YWJsZSIsImR1cmF0aW9uRWRpdGFibGUiLCJjb25zdHJhaW50Iiwib3ZlcmxhcCIsImFsbG93IiwiY2xhc3NOYW1lIiwiY29sb3IiLCJiYWNrZ3JvdW5kQ29sb3IiLCJib3JkZXJDb2xvciIsInRleHRDb2xvciIsIkVNUFRZX0VWRU5UX1VJIiwiY29uc3RyYWludHMiLCJhbGxvd3MiLCJjcmVhdGVFdmVudFVpIiwiY29tYmluZUV2ZW50VWlzIiwidWlzIiwiY29tYmluZVR3b0V2ZW50VWlzIiwiaXRlbTAiLCJpdGVtMSIsIkVWRU5UX05PTl9EQVRFX1JFRklORVJTIiwiaWQiLCJ0aXRsZSIsImludGVyYWN0aXZlIiwiRVZFTlRfREFURV9SRUZJTkVSUyIsIkVWRU5UX1JFRklORVJTIiwiZXh0ZW5kZWRQcm9wcyIsInJlZmluZUV2ZW50RGVmIiwiY29tcHV0ZUlzRGVmYXVsdEFsbERheSIsInJlY3VycmluZ1JlcyIsInBhcnNlRXZlbnREZWYiLCJzaW5nbGVSZXMiLCJwYXJzZVNpbmdsZSIsImhhc0VuZCIsInVpIiwiZXZlbnREZWZNZW1iZXJBZGRlcnMiLCJtZW1iZXJBZGRlciIsImZyZWV6ZSIsInN0YXJ0TWV0YSIsInN0YXJ0TWFya2VyIiwiZW5kTWV0YSIsImVuZE1hcmtlciIsInN0YXJ0SW5wdXQiLCJjcmVhdGVNYXJrZXJNZXRhIiwiaXNUaW1lVW5zcGVjaWZpZWQiLCJmb3JjZWRUem8iLCJjb21wdXRlQWxpZ25lZERheVJhbmdlIiwidGltZWRSYW5nZSIsImRheUNudCIsImNvbXB1dGVWaXNpYmxlRGF5UmFuZ2UiLCJzdGFydERheSIsImVuZERheSIsImVuZFRpbWVNUyIsImlzTXVsdGlEYXlSYW5nZSIsImRpZmZEYXRlcyIsImRhdGUwIiwiZGF0ZTEiLCJsYXJnZVVuaXQiLCJkaWZmV2hvbGVZZWFycyIsImRpZmZXaG9sZU1vbnRocyIsInBhcnNlUmFuZ2UiLCJjcmVhdGVNYXJrZXIiLCJpbnZlcnRSYW5nZXMiLCJyYW5nZXMiLCJjb25zdHJhaW50UmFuZ2UiLCJpbnZlcnRlZFJhbmdlcyIsImRhdGVSYW5nZSIsInNvcnQiLCJjb21wYXJlUmFuZ2VzIiwicmFuZ2UwIiwicmFuZ2UxIiwiaW50ZXJzZWN0UmFuZ2VzIiwibmV3UmFuZ2UiLCJyYW5nZXNFcXVhbCIsInJhbmdlc0ludGVyc2VjdCIsInJhbmdlQ29udGFpbnNSYW5nZSIsIm91dGVyUmFuZ2UiLCJpbm5lclJhbmdlIiwicmFuZ2VDb250YWluc01hcmtlciIsImNvbnN0cmFpbk1hcmtlclRvUmFuZ2UiLCJzbGljZUV2ZW50U3RvcmUiLCJldmVudFVpQmFzZXMiLCJpbnZlcnNlQmdCeUdyb3VwSWQiLCJpbnZlcnNlQmdCeURlZklkIiwiZGVmQnlHcm91cElkIiwiYmdSYW5nZXMiLCJmZ1JhbmdlcyIsImV2ZW50VWlzIiwiY29tcGlsZUV2ZW50VWlzIiwib3JpZ1JhbmdlIiwibm9ybWFsUmFuZ2UiLCJzbGljZWRSYW5nZSIsImlzU3RhcnQiLCJpc0VuZCIsImludmVydGVkUmFuZ2VzXzEiLCJpbnZlcnRlZFJhbmdlIiwiaW52ZXJ0ZWRSYW5nZXNfMiIsImJnIiwiZmciLCJoYXNCZ1JlbmRlcmluZyIsInNldEVsU2VnIiwic2VnIiwiZmNTZWciLCJnZXRFbFNlZyIsImV2ZW50RGVmcyIsImNvbXBpbGVFdmVudFVpIiwic29ydEV2ZW50U2VncyIsInNlZ3MiLCJldmVudE9yZGVyU3BlY3MiLCJvYmpzIiwiYnVpbGRTZWdDb21wYXJlT2JqIiwiYyIsIl9zZWciLCJldmVudFJhbmdlIiwiY29tcHV0ZVNlZ0RyYWdnYWJsZSIsInRyYW5zZm9ybWVycyIsImlzRHJhZ2dhYmxlVHJhbnNmb3JtZXJzIiwidHJhbnNmb3JtZXJzXzEiLCJ0cmFuc2Zvcm1lciIsImNvbXB1dGVTZWdTdGFydFJlc2l6YWJsZSIsImNvbXB1dGVTZWdFbmRSZXNpemFibGUiLCJidWlsZFNlZ1RpbWVUZXh0IiwidGltZUZvcm1hdCIsImRlZmF1bHREaXNwbGF5RXZlbnRUaW1lIiwiZGVmYXVsdERpc3BsYXlFdmVudEVuZCIsInN0YXJ0T3ZlcnJpZGUiLCJlbmRPdmVycmlkZSIsImV2ZW50SW5zdGFuY2UiLCJ3aG9sZUV2ZW50U3RhcnQiLCJ3aG9sZUV2ZW50RW5kIiwic2VnU3RhcnQiLCJzZWdFbmQiLCJpc1N0YXJ0RGF5IiwiaXNFbmREYXkiLCJnZXRTZWdNZXRhIiwidG9kYXlSYW5nZSIsIm5vd0RhdGUiLCJzZWdSYW5nZSIsImlzUGFzdCIsImlzRnV0dXJlIiwiaXNUb2RheSIsImdldEV2ZW50Q2xhc3NOYW1lcyIsImlzTWlycm9yIiwiaXNEcmFnZ2FibGUiLCJpc1N0YXJ0UmVzaXphYmxlIiwiaXNFbmRSZXNpemFibGUiLCJpc0RyYWdnaW5nIiwiaXNSZXNpemluZyIsImlzU2VsZWN0ZWQiLCJidWlsZEV2ZW50UmFuZ2VLZXkiLCJnZXRTZWdBbmNob3JBdHRycyIsImhyZWYiLCJlbWl0dGVyIiwiaGFzSGFuZGxlcnMiLCJ0cmlnZ2VyIiwiZXZlbnQiLCJFdmVudEFwaSIsImpzRXZlbnQiLCJ2aWV3Iiwidmlld0FwaSIsIlNUQU5EQVJEX1BST1BTIiwicGFyc2VEYXRlU3BhbiIsImRlZmF1bHREdXJhdGlvbiIsInNwYW4iLCJwYXJzZU9wZW5EYXRlU3BhbiIsInN0YW5kYXJkUHJvcHMiLCJpc0RhdGVTcGFuc0VxdWFsIiwic3BhbjAiLCJzcGFuMSIsImlzU3BhblByb3BzRXF1YWwiLCJidWlsZERhdGVTcGFuQXBpIiwiYnVpbGRSYW5nZUFwaSIsImJ1aWxkUmFuZ2VBcGlXaXRoVGltZVpvbmUiLCJvbWl0VGltZSIsInRvRGF0ZSIsInN0YXJ0U3RyIiwiZm9ybWF0SXNvIiwiZW5kU3RyIiwiZmFicmljYXRlRXZlbnRSYW5nZSIsImRhdGVTcGFuIiwidHJpZ2dlckRhdGVTZWxlY3QiLCJzZWxlY3Rpb24iLCJwZXYiLCJidWlsZERhdGVTcGFuQXBpV2l0aENvbnRleHQiLCJvcmlnRXZlbnQiLCJjYWxlbmRhckFwaSIsInRyaWdnZXJEYXRlVW5zZWxlY3QiLCJkYXRlU3BhblRyYW5zZm9ybXMiLCJ0cmFuc2Zvcm0iLCJnZXREZWZhdWx0RXZlbnRFbmQiLCJhcHBseU11dGF0aW9uVG9FdmVudFN0b3JlIiwiZXZlbnRDb25maWdCYXNlIiwibXV0YXRpb24iLCJldmVudENvbmZpZ3MiLCJhcHBseU11dGF0aW9uVG9FdmVudERlZiIsImFwcGx5TXV0YXRpb25Ub0V2ZW50SW5zdGFuY2UiLCJldmVudENvbmZpZyIsInN0YXJ0RGVsdGEiLCJlbmREZWx0YSIsImNvcHkiLCJldmVudERlZk11dGF0aW9uQXBwbGllcnMiLCJhcHBsaWVyIiwiZm9yY2VBbGxEYXkiLCJjbGVhckVuZCIsImRhdGVzRGVsdGEiLCJWaWV3QXBpIiwiZ2V0Q3VycmVudERhdGEiLCJ2aWV3VGl0bGUiLCJkYXRlUHJvZmlsZSIsImFjdGl2ZVJhbmdlIiwiY3VycmVudFJhbmdlIiwiZ2V0T3B0aW9uIiwiRVZFTlRfU09VUkNFX1JFRklORVJTIiwic3VjY2VzcyIsImZhaWx1cmUiLCJwYXJzZUV2ZW50U291cmNlIiwiYnVpbGRFdmVudFNvdXJjZVJlZmluZXJzIiwicmF3T2JqIiwibWV0YVJlcyIsImJ1aWxkRXZlbnRTb3VyY2VNZXRhIiwiX3JhdyIsImlzRmV0Y2hpbmciLCJsYXRlc3RGZXRjaElkIiwiZmV0Y2hSYW5nZSIsInNvdXJjZURlZklkIiwiZXZlbnRTb3VyY2VSZWZpbmVycyIsImV2ZW50U291cmNlRGVmcyIsInBhcnNlTWV0YSIsInJlZHVjZUN1cnJlbnREYXRlIiwiY3VycmVudERhdGUiLCJhY3Rpb24iLCJkYXRlTWFya2VyIiwiZ2V0SW5pdGlhbERhdGUiLCJpbml0aWFsRGF0ZUlucHV0IiwiZ2V0Tm93Iiwibm93SW5wdXQiLCJjcmVhdGVOb3dNYXJrZXIiLCJDYWxlbmRhckFwaSIsImN1cnJlbnREYXRhTWFuYWdlciIsImJhdGNoUmVuZGVyaW5nIiwidXBkYXRlU2l6ZSIsInNldE9wdGlvbiIsIm9wdGlvbk5hbWUiLCJyYXdPcHRpb25WYWx1ZSIsImN1cnJlbnRDYWxlbmRhck9wdGlvbnNJbnB1dCIsImdldEF2YWlsYWJsZUxvY2FsZUNvZGVzIiwiYXZhaWxhYmxlUmF3TG9jYWxlcyIsIm9uIiwiaGFuZGxlck5hbWUiLCJjdXJyZW50Q2FsZW5kYXJPcHRpb25zUmVmaW5lcnMiLCJjb25zb2xlIiwid2FybiIsIm9mZiIsIl9fc3ByZWFkQXJyYXkiLCJjaGFuZ2VWaWV3Iiwidmlld1R5cGUiLCJkYXRlT3JSYW5nZSIsInpvb21UbyIsInN0YXRlIiwic3BlYyIsInZpZXdTcGVjcyIsImdldFVuaXRWaWV3U3BlYyIsInRvb2xiYXJDb25maWciLCJ2aWV3VHlwZXMiLCJoZWFkZXIiLCJ2aWV3c1dpdGhCdXR0b25zIiwiZm9vdGVyIiwic2luZ2xlVW5pdCIsInByZXYiLCJuZXh0IiwicHJldlllYXIiLCJhZGRZZWFycyIsIm5leHRZZWFyIiwidG9kYXkiLCJjYWxlbmRhck9wdGlvbnMiLCJnb3RvRGF0ZSIsInpvbmVkRGF0ZUlucHV0IiwiaW5jcmVtZW50RGF0ZSIsImRlbHRhSW5wdXQiLCJkZWx0YSIsImZvcm1hdERhdGUiLCJzZXR0aW5ncyIsImRhdGVPck9iaiIsImVuZERhdGUiLCJzZWxlY3Rpb25JbnB1dCIsImRhdGVTZWxlY3Rpb24iLCJhZGRFdmVudCIsImV2ZW50SW5wdXQiLCJzb3VyY2VJbnB1dCIsIl9kZWYiLCJfaW5zdGFuY2UiLCJjdXJyZW50RGF0YSIsInRyaWdnZXJFdmVudEFkZCIsInNvdXJjZUFwaSIsImdldEV2ZW50U291cmNlQnlJZCIsIm5ld0V2ZW50QXBpIiwiZXZlbnRBcGkiLCJyZWxhdGVkRXZlbnRzIiwicmV2ZXJ0IiwiZXZlbnRBcGlUb1N0b3JlIiwiZ2V0RXZlbnRCeUlkIiwiZ2V0RXZlbnRzIiwiYnVpbGRFdmVudEFwaXMiLCJyZW1vdmVBbGxFdmVudHMiLCJnZXRFdmVudFNvdXJjZXMiLCJzb3VyY2VIYXNoIiwic291cmNlQXBpcyIsImludGVybmFsSWQiLCJhZGRFdmVudFNvdXJjZSIsInNvdXJjZXMiLCJyZW1vdmVBbGxFdmVudFNvdXJjZXMiLCJyZWZldGNoRXZlbnRzIiwic2Nyb2xsVG9UaW1lIiwidGltZUlucHV0IiwidGltZSIsIl9jb250ZXh0Iiwic2V0UHJvcCIsIm11dGF0ZSIsInNldEV4dGVuZGVkUHJvcCIsInNldFN0YXJ0IiwiaW5zdGFuY2VSYW5nZSIsImdyYW51bGFyaXR5IiwibWFpbnRhaW5EdXJhdGlvbiIsInNldEVuZCIsImVuZElucHV0Iiwic2V0RGF0ZXMiLCJtb3ZlU3RhcnQiLCJtb3ZlRW5kIiwibW92ZURhdGVzIiwic2V0QWxsRGF5IiwiZm9ybWF0SW5wdXQiLCJjb250ZXh0XzEiLCJldmVudFN0b3JlXzEiLCJyZWxldmFudEV2ZW50cyIsIm9sZEV2ZW50IiwiYXNTdG9yZSIsInRvUGxhaW5PYmplY3QiLCJjb2xsYXBzZUNvbG9yIiwiY29sbGFwc2VFeHRlbmRlZFByb3BzIiwidG9KU09OIiwiZXhjbHVkZUluc3RhbmNlIiwiZXZlbnRBcGlzIiwiZXhjbHVkZUluc3RhbmNlSWQiLCJjYWxlbmRhclN5c3RlbUNsYXNzTWFwIiwicmVnaXN0ZXJDYWxlbmRhclN5c3RlbSIsInRoZUNsYXNzIiwiY3JlYXRlQ2FsZW5kYXJTeXN0ZW0iLCJHcmVnb3JpYW5DYWxlbmRhclN5c3RlbSIsImFycmF5VG9NYXJrZXIiLCJhcnIiLCJJU09fUkUiLCJEYXRlRW52IiwiaXNOYW1lZFRpbWVab25lIiwibmFtZWRUaW1lWm9uZUltcGwiLCJjYW5Db21wdXRlT2Zmc2V0Iiwid2Vla0RvdyIsIndlZWtEb3kiLCJ3ZWVrTnVtYmVyRnVuYyIsInRpbWVzdGFtcFRvTWFya2VyIiwiZ2V0WWVhciIsImFkZE1vbnRocyIsImdyZWF0ZXN0V2hvbGVVbml0IiwiY291bnREdXJhdGlvbnNCZXR3ZWVuIiwiZGlmZiIsInN0YXJ0T2YiLCJzdGFydE9mWWVhciIsInN0YXJ0T2ZNb250aCIsInN0YXJ0T2ZXZWVrIiwiZGF0ZU9wdGlvbnMiLCJvZmZzZXRGb3JNYXJrZXIiLCJpc0VuZEV4Y2x1c2l2ZSIsImV4dHJhT3B0aW9ucyIsIm9taXRUaW1lWm9uZU9mZnNldCIsInRpbWVzdGFtcFRvQXJyYXkiLCJnZXRUaW1lem9uZU9mZnNldCIsIm9mZnNldEZvckFycmF5IiwiZ2xvYmFsTG9jYWxlcyIsIk1JTklNQUxfUkFXX0VOX0xPQ0FMRSIsImNvZGUiLCJsaXN0IiwiUkFXX0VOX0xPQ0FMRSIsImV2ZW50Q250Iiwib3JnYW5pemVSYXdMb2NhbGVzIiwiZXhwbGljaXRSYXdMb2NhbGVzIiwiZGVmYXVsdENvZGUiLCJhbGxSYXdMb2NhbGVzIiwicmF3TG9jYWxlTWFwIiwiZW4iLCJhbGxSYXdMb2NhbGVzXzEiLCJyYXdMb2NhbGUiLCJidWlsZExvY2FsZSIsImlucHV0U2luZ3VsYXIiLCJhdmFpbGFibGUiLCJwYXJzZUxvY2FsZSIsInF1ZXJ5TG9jYWxlIiwiY29kZUFyZyIsInF1ZXJ5UmF3TG9jYWxlIiwic2ltcGxlSWQiLCJzbGljZSIsIm1lcmdlZCIsIk51bWJlckZvcm1hdCIsImRhdGVJbnB1dCIsImJ1aWxkRGF0ZUVudiQxIiwiZGF0ZU1ldGEiLCJERUZfREVGQVVMVFMiLCJzdGFydFRpbWUiLCJlbmRUaW1lIiwiZGF5c09mV2VlayIsInBhcnNlQnVzaW5lc3NIb3VycyIsInJlZmluZUlucHV0cyIsInJhd0RlZnMiLCJmaWx0ZXIiLCJyYXdEZWYiLCJwb2ludEluc2lkZVJlY3QiLCJwb2ludCIsInJlY3QiLCJsZWZ0IiwicmlnaHQiLCJ0b3AiLCJib3R0b20iLCJpbnRlcnNlY3RSZWN0cyIsInJlY3QxIiwicmVjdDIiLCJ0cmFuc2xhdGVSZWN0IiwiZGVsdGFYIiwiZGVsdGFZIiwiY29uc3RyYWluUG9pbnQiLCJnZXRSZWN0Q2VudGVyIiwiZGlmZlBvaW50cyIsInBvaW50MSIsInBvaW50MiIsImNhblZHcm93V2l0aGluQ2VsbCIsImdldENhblZHcm93V2l0aGluQ2VsbCIsImNvbXB1dGVDYW5WR3Jvd1dpdGhpbkNlbGwiLCJjcmVhdGVFbGVtZW50IiwicG9zaXRpb24iLCJpbm5lckhUTUwiLCJhcHBlbmRDaGlsZCIsImRpdiIsInBvc3NpYmxlIiwib2Zmc2V0SGVpZ2h0IiwiRU1QVFlfRVZFTlRfU1RPUkUiLCJTcGxpdHRlciIsImdldEtleXNGb3JFdmVudERlZnMiLCJfZ2V0S2V5c0ZvckV2ZW50RGVmcyIsInNwbGl0RGF0ZVNlbGVjdGlvbiIsIl9zcGxpdERhdGVTcGFuIiwic3BsaXRFdmVudFN0b3JlIiwiX3NwbGl0RXZlbnRTdG9yZSIsInNwbGl0SW5kaXZpZHVhbFVpIiwiX3NwbGl0SW5kaXZpZHVhbFVpIiwic3BsaXRFdmVudERyYWciLCJfc3BsaXRJbnRlcmFjdGlvbiIsInNwbGl0RXZlbnRSZXNpemUiLCJldmVudFVpQnVpbGRlcnMiLCJzcGxpdFByb3BzIiwia2V5SW5mb3MiLCJnZXRLZXlJbmZvIiwiZGVmS2V5cyIsImRhdGVTZWxlY3Rpb25zIiwiaW5kaXZpZHVhbFVpIiwiZXZlbnRTdG9yZXMiLCJldmVudERyYWdzIiwiZXZlbnREcmFnIiwiZXZlbnRSZXNpemVzIiwiZXZlbnRSZXNpemUiLCJpbmZvIiwiYnVpbGRFdmVudFVpRm9yS2V5Iiwia2V5SW5mbyIsImJ1aWxkRXZlbnRVaSIsImV2ZW50U2VsZWN0aW9uIiwiZGF0ZVNwYW5zIiwiZ2V0S2V5c0ZvckRhdGVTcGFuIiwia2V5c18xIiwiZ2V0S2V5c0ZvckV2ZW50RGVmIiwic3BsaXRTdG9yZXMiLCJfYyIsInNwbGl0SGFzaGVzIiwiaW50ZXJhY3Rpb24iLCJzcGxpdFN0YXRlcyIsImFmZmVjdGVkU3RvcmVzXzEiLCJhZmZlY3RlZEV2ZW50cyIsIm11dGF0ZWRLZXlzQnlEZWZJZCIsIm11dGF0ZWRFdmVudHMiLCJtdXRhdGVkU3RvcmVzXzEiLCJwb3B1bGF0ZSIsImlzRXZlbnQiLCJhbGxVaSIsImV2ZW50VWlGb3JLZXkiLCJiYXNlUGFydHMiLCJzdHVmZiIsImdldERhdGVNZXRhIiwiaXNEaXNhYmxlZCIsImlzT3RoZXIiLCJnZXREYXlDbGFzc05hbWVzIiwidGhlbWUiLCJnZXRDbGFzcyIsImdldFNsb3RDbGFzc05hbWVzIiwiREFZX0ZPUk1BVCIsIldFRUtfRk9STUFUIiwiYnVpbGROYXZMaW5rQXR0cnMiLCJpc1RhYmJhYmxlIiwiZGF0ZVN0ciIsInpvbmVkRGF0ZSIsImhhbmRsZUludGVyYWN0aW9uIiwiY3VzdG9tQWN0aW9uIiwiX2lzUnRsU2Nyb2xsYmFyT25MZWZ0IiwiZ2V0SXNSdGxTY3JvbGxiYXJPbkxlZnQiLCJjb21wdXRlSXNSdGxTY3JvbGxiYXJPbkxlZnQiLCJvdXRlckVsIiwiYm9yZGVyIiwicGFkZGluZyIsIm92ZXJmbG93IiwiaW5uZXJFbCIsImZpcnN0Q2hpbGQiLCJfc2Nyb2xsYmFyV2lkdGhzIiwiZ2V0U2Nyb2xsYmFyV2lkdGhzIiwiY29tcHV0ZVNjcm9sbGJhcldpZHRocyIsImNvbXB1dGVTY3JvbGxiYXJXaWR0aHNGb3JFbCIsIngiLCJjbGllbnRIZWlnaHQiLCJvZmZzZXRXaWR0aCIsImNsaWVudFdpZHRoIiwiY29tcHV0ZUVkZ2VzIiwiZ2V0UGFkZGluZyIsImNvbXB1dGVkU3R5bGUiLCJ3aW5kb3ciLCJnZXRDb21wdXRlZFN0eWxlIiwiYm9yZGVyTGVmdCIsImJvcmRlckxlZnRXaWR0aCIsImJvcmRlclJpZ2h0IiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlclRvcCIsImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyQm90dG9tIiwiYm9yZGVyQm90dG9tV2lkdGgiLCJiYWRTY3JvbGxiYXJXaWR0aHMiLCJzY3JvbGxiYXJMZWZ0UmlnaHQiLCJzY3JvbGxiYXJCb3R0b20iLCJzY3JvbGxiYXJMZWZ0Iiwic2Nyb2xsYmFyUmlnaHQiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCIsInBhZGRpbmdUb3AiLCJwYWRkaW5nQm90dG9tIiwiY29tcHV0ZUlubmVyUmVjdCIsImdvV2l0aGluUGFkZGluZyIsImRvRnJvbVdpbmRvd1ZpZXdwb3J0Iiwib3V0ZXJSZWN0IiwiY29tcHV0ZVJlY3QiLCJlZGdlcyIsInBhZ2VYT2Zmc2V0IiwicGFnZVlPZmZzZXQiLCJjb21wdXRlQ2xpcHBlZENsaWVudFJlY3QiLCJjbGlwcGluZ1BhcmVudHMiLCJnZXRDbGlwcGluZ1BhcmVudHMiLCJjbGlwcGluZ1BhcmVudHNfMSIsImNsaXBwaW5nUGFyZW50IiwiaW50ZXJzZWN0aW9uIiwiY29tcHV0ZUhlaWdodEFuZE1hcmdpbnMiLCJjb21wdXRlVk1hcmdpbnMiLCJjb21wdXRlZCIsIm1hcmdpblRvcCIsIm1hcmdpbkJvdHRvbSIsIm92ZXJmbG93WSIsIm92ZXJmbG93WCIsInVucHJvbWlzaWZ5IiwiaXNSZXNvbHZlZCIsIndyYXBwZWRTdWNjZXNzIiwid3JhcHBlZEZhaWx1cmUiLCJ0aGVuIiwiRW1pdHRlciIsImhhbmRsZXJzIiwidGhpc0NvbnRleHQiLCJzZXRUaGlzQ29udGV4dCIsInNldE9wdGlvbnMiLCJhZGRUb0hhc2giLCJyZW1vdmVGcm9tSGFzaCIsImF0dGFjaGVkSGFuZGxlcnMiLCJvcHRpb25IYW5kbGVyIiwiaGFuZGxlcnNfMSIsIlBvc2l0aW9uQ2FjaGUiLCJvcmlnaW5FbCIsImVscyIsImlzSG9yaXpvbnRhbCIsImlzVmVydGljYWwiLCJvcmlnaW5DbGllbnRSZWN0IiwiYnVpbGRFbEhvcml6b250YWxzIiwiYnVpbGRFbFZlcnRpY2FscyIsIm9yaWdpbkNsaWVudExlZnQiLCJsZWZ0cyIsInJpZ2h0cyIsIm9yaWdpbkNsaWVudFRvcCIsInRvcHMiLCJib3R0b21zIiwibGVmdFRvSW5kZXgiLCJsZWZ0UG9zaXRpb24iLCJ0b3BUb0luZGV4IiwidG9wUG9zaXRpb24iLCJnZXRXaWR0aCIsImxlZnRJbmRleCIsImdldEhlaWdodCIsInRvcEluZGV4IiwiU2Nyb2xsQ29udHJvbGxlciIsImdldE1heFNjcm9sbFRvcCIsImdldFNjcm9sbEhlaWdodCIsImdldENsaWVudEhlaWdodCIsImdldE1heFNjcm9sbExlZnQiLCJnZXRTY3JvbGxXaWR0aCIsImdldENsaWVudFdpZHRoIiwiY2FuU2Nyb2xsVmVydGljYWxseSIsImNhblNjcm9sbEhvcml6b250YWxseSIsImNhblNjcm9sbFVwIiwiZ2V0U2Nyb2xsVG9wIiwiY2FuU2Nyb2xsRG93biIsImNhblNjcm9sbExlZnQiLCJnZXRTY3JvbGxMZWZ0IiwiY2FuU2Nyb2xsUmlnaHQiLCJFbGVtZW50U2Nyb2xsQ29udHJvbGxlciIsIl9zdXBlciIsIl9fZXh0ZW5kcyIsInNjcm9sbFRvcCIsInNjcm9sbExlZnQiLCJzZXRTY3JvbGxUb3AiLCJzZXRTY3JvbGxMZWZ0Iiwic2Nyb2xsV2lkdGgiLCJzY3JvbGxIZWlnaHQiLCJXaW5kb3dTY3JvbGxDb250cm9sbGVyIiwic2Nyb2xsIiwiVGhlbWUiLCJpY29uT3ZlcnJpZGVPcHRpb24iLCJzZXRJY29uT3ZlcnJpZGUiLCJpY29uT3ZlcnJpZGVIYXNoIiwiaWNvbkNsYXNzZXNDb3B5IiwiYnV0dG9uTmFtZSIsImljb25DbGFzc2VzIiwiYXBwbHlJY29uT3ZlcnJpZGVQcmVmaXgiLCJwcmVmaXgiLCJpY29uT3ZlcnJpZGVQcmVmaXgiLCJjbGFzc2VzIiwiZ2V0SWNvbkNsYXNzIiwiaXNSdGwiLCJydGxJY29uQ2xhc3NlcyIsImJhc2VJY29uQ2xhc3MiLCJnZXRDdXN0b21CdXR0b25JY29uQ2xhc3MiLCJjdXN0b21CdXR0b25Qcm9wcyIsImljb25PdmVycmlkZUN1c3RvbUJ1dHRvbk9wdGlvbiIsIlNjcm9sbFJlc3BvbmRlciIsImV4ZWNGdW5jIiwiaGFuZGxlU2Nyb2xsUmVxdWVzdCIsInJlcXVlc3QiLCJxdWV1ZWRSZXF1ZXN0IiwiZHJhaW4iLCJmaXJlSW5pdGlhbFNjcm9sbCIsImRldGFjaCIsInVwZGF0ZSIsImlzRGF0ZXNOZXciLCJWaWV3Q29udGV4dFR5cGUiLCJjcmVhdGVDb250ZXh0IiwiYnVpbGRWaWV3Q29udGV4dCIsInZpZXdTcGVjIiwidmlld09wdGlvbnMiLCJkYXRlUHJvZmlsZUdlbmVyYXRvciIsInJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQiLCJ1bnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQiLCJhZGRSZXNpemVIYW5kbGVyIiwicmVtb3ZlUmVzaXplSGFuZGxlciIsImNyZWF0ZVNjcm9sbFJlc3BvbmRlciIsIlB1cmVDb21wb25lbnQiLCJzaG91bGRDb21wb25lbnRVcGRhdGUiLCJuZXh0UHJvcHMiLCJuZXh0U3RhdGUiLCJkZWJ1ZyIsImxvZyIsInByb3BFcXVhbGl0eSIsInN0YXRlRXF1YWxpdHkiLCJzYWZlU2V0U3RhdGUiLCJuZXdTdGF0ZSIsInNldFN0YXRlIiwiYWRkUHJvcHNFcXVhbGl0eSIsImFkZFN0YXRlRXF1YWxpdHkiLCJjb250ZXh0VHlwZSIsIkNvbXBvbmVudCIsIkJhc2VDb21wb25lbnQiLCJjcmVhdGUiLCJzZXRSZWYiLCJyZWYiLCJjdXJyZW50IiwiRGF0ZUNvbXBvbmVudCIsInVpZCIsInByZXBhcmVIaXRzIiwicXVlcnlIaXQiLCJwb3NpdGlvbkxlZnQiLCJwb3NpdGlvblRvcCIsImVsV2lkdGgiLCJlbEhlaWdodCIsImlzVmFsaWRTZWdEb3duRWwiLCJpc1ZhbGlkRGF0ZURvd25FbCIsImNyZWF0ZVBsdWdpbiIsImRlcHMiLCJyZWR1Y2VycyIsImlzTG9hZGluZ0Z1bmNzIiwiY29udGV4dEluaXQiLCJldmVudERyYWdNdXRhdGlvbk1hc3NhZ2VycyIsImRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnMiLCJkYXRlUG9pbnRUcmFuc2Zvcm1zIiwidmlld1Byb3BzVHJhbnNmb3JtZXJzIiwiaXNQcm9wc1ZhbGlkIiwiZXh0ZXJuYWxEZWZUcmFuc2Zvcm1zIiwidmlld0NvbnRhaW5lckFwcGVuZHMiLCJldmVudERyb3BUcmFuc2Zvcm1lcnMiLCJjb21wb25lbnRJbnRlcmFjdGlvbnMiLCJjYWxlbmRhckludGVyYWN0aW9ucyIsInRoZW1lQ2xhc3NlcyIsIm5hbWVkVGltZVpvbmVkSW1wbCIsImVsZW1lbnREcmFnZ2luZ0ltcGwiLCJvcHRpb25DaGFuZ2VIYW5kbGVycyIsInNjcm9sbEdyaWRJbXBsIiwiY29udGVudFR5cGVIYW5kbGVycyIsImxpc3RlbmVyUmVmaW5lcnMiLCJvcHRpb25SZWZpbmVycyIsInByb3BTZXRIYW5kbGVycyIsImJ1aWxkUGx1Z2luSG9va3MiLCJwbHVnaW5EZWZzIiwiZ2xvYmFsRGVmcyIsImlzQWRkZWQiLCJob29rcyIsImFkZERlZnMiLCJkZWZzXzEiLCJjb21iaW5lSG9va3MiLCJidWlsZEJ1aWxkUGx1Z2luSG9va3MiLCJjdXJyZW50T3ZlcnJpZGVEZWZzIiwiY3VycmVudEdsb2JhbERlZnMiLCJjdXJyZW50SG9va3MiLCJvdmVycmlkZURlZnMiLCJob29rczAiLCJob29rczEiLCJTdGFuZGFyZFRoZW1lIiwicm9vdCIsInRhYmxlQ2VsbFNoYWRlZCIsImJ1dHRvbkdyb3VwIiwiYnV0dG9uIiwiYnV0dG9uQWN0aXZlIiwiY2xvc2UiLCJjb21waWxlVmlld0RlZnMiLCJkZWZhdWx0Q29uZmlncyIsIm92ZXJyaWRlQ29uZmlncyIsImVuc3VyZVZpZXdEZWYiLCJ2aWV3RGVmIiwiYnVpbGRWaWV3RGVmIiwiZGVmYXVsdENvbmZpZyIsIm92ZXJyaWRlQ29uZmlnIiwicXVlcnlQcm9wIiwidGhlQ29tcG9uZW50Iiwic3VwZXJUeXBlIiwic3VwZXJEZWYiLCJkZWZhdWx0cyIsInJhd09wdGlvbnMiLCJvdmVycmlkZXMiLCJSZW5kZXJIb29rIiwicm9vdEVsUmVmIiwiY3JlYXRlUmVmIiwiaGFuZGxlUm9vdEVsIiwiZWxSZWYiLCJyZW5kZXIiLCJob29rUHJvcHMiLCJNb3VudEhvb2siLCJDb250ZW50SG9vayIsImRlZmF1bHRDb250ZW50IiwiYmFja3VwRWxSZWYiLCJpbm5lckVsUmVmIiwiaW5uZXJDb250ZW50Iiwibm9ybWFsaXplQ2xhc3NOYW1lcyIsIkN1c3RvbUNvbnRlbnRSZW5kZXJDb250ZXh0IiwiQ29uc3VtZXIiLCJyZW5kZXJJZCIsIkNvbnRlbnRIb29rSW5uZXIiLCJyZW5kZXJJbm5lckNvbnRlbnQiLCJjb21wb25lbnREaWRNb3VudCIsInVwZGF0ZUN1c3RvbUNvbnRlbnQiLCJjb21wb25lbnREaWRVcGRhdGUiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsImN1c3RvbUNvbnRlbnRJbmZvIiwiZGVzdHJveSIsImdldElubmVyQ29udGVudCIsImdldENvbnRlbnRNZXRhIiwiY29udGVudEtleSIsImNvbnRlbnRWYWwiLCJidWlsZExpZmVjeWNsZUZ1bmNzIiwibm9ybWFsaXplQ29udGVudCIsInNlYXJjaEtleSIsInJvb3RFbCIsImJ1aWxkQ2xhc3NOYW1lTm9ybWFsaXplciIsImN1cnJlbnRHZW5lcmF0b3IiLCJjdXJyZW50SG9va1Byb3BzIiwiY3VycmVudENsYXNzTmFtZXMiLCJnZW5lcmF0b3IiLCJWaWV3Um9vdCIsImN1c3RvbUNsYXNzTmFtZXMiLCJwYXJzZVZpZXdDb25maWdzIiwiaW5wdXRzIiwicGFyc2VWaWV3Q29uZmlnIiwiY3JlYXRlVmlld0hvb2tDb21wb25lbnQiLCJ2aWV3UHJvcHMiLCJ2aWV3RWxSZWYiLCJidWlsZFZpZXdTcGVjcyIsImRlZmF1bHRJbnB1dHMiLCJvcHRpb25PdmVycmlkZXMiLCJkeW5hbWljT3B0aW9uT3ZlcnJpZGVzIiwibG9jYWxlRGVmYXVsdHMiLCJ2aWV3RGVmcyIsImJ1aWxkVmlld1NwZWMiLCJkdXJhdGlvbklucHV0IiwiZHVyYXRpb25Vbml0Iiwic2luZ2xlVW5pdE92ZXJyaWRlcyIsImNyZWF0ZUR1cmF0aW9uQ2FjaGVkIiwiZGVub20iLCJxdWVyeUJ1dHRvblRleHQiLCJvcHRpb25zU3Vic2V0IiwiYnV0dG9uVGV4dE1hcCIsInF1ZXJ5QnV0dG9uVGl0bGUiLCJidXR0b25LZXkiLCJvcHRpb25EZWZhdWx0cyIsImJ1dHRvblRleHRPdmVycmlkZSIsImJ1dHRvblRleHREZWZhdWx0IiwiYnV0dG9uVGl0bGVPdmVycmlkZSIsImJ1dHRvbkhpbnQiLCJidXR0b25UaXRsZURlZmF1bHQiLCJkdXJhdGlvbklucHV0TWFwIiwianNvbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJEYXRlUHJvZmlsZUdlbmVyYXRvciIsImluaXRIaWRkZW5EYXlzIiwiYnVpbGRQcmV2IiwiY3VycmVudERhdGVQcm9maWxlIiwiZm9yY2VUb1ZhbGlkIiwicHJldkRhdGUiLCJjdXJyZW50UmFuZ2VVbml0IiwiYnVpbGQiLCJidWlsZE5leHQiLCJuZXh0RGF0ZSIsImN1cnJlbnRJbmZvIiwiaXNSYW5nZUFsbERheSIsInJlbmRlclJhbmdlIiwiaXNWYWxpZCIsImJ1aWxkVmFsaWRSYW5nZSIsInRyaW1IaWRkZW5EYXlzIiwiYnVpbGRDdXJyZW50UmFuZ2VJbmZvIiwiYnVpbGRSZW5kZXJSYW5nZSIsImFkanVzdEFjdGl2ZVJhbmdlIiwiYnVpbGREYXRlSW5jcmVtZW50IiwidmFsaWRSYW5nZUlucHV0Iiwic2ltcGxlSW5wdXQiLCJyZWZpbmVSYW5nZSIsImJ1aWxkUmFuZ2VGcm9tRHVyYXRpb24iLCJidWlsZFJhbmdlRnJvbURheUNvdW50IiwiYnVpbGRDdXN0b21WaXNpYmxlUmFuZ2UiLCJnZXRGYWxsYmFja0R1cmF0aW9uIiwiaXNIaWRkZW5EYXkiLCJza2lwSGlkZGVuRGF5cyIsImNvbXB1dGVSZXMiLCJydW5uaW5nQ291bnQiLCJ2aXNpYmxlUmFuZ2VJbnB1dCIsImZhbGxiYWNrIiwiY3VzdG9tQWxpZ25tZW50IiwicmFuZ2VJbnB1dCIsImlzSGlkZGVuRGF5SGFzaCIsImluYyIsImlzRXhjbHVzaXZlIiwicmVkdWNlVmlld1R5cGUiLCJyZWR1Y2VEeW5hbWljT3B0aW9uT3ZlcnJpZGVzIiwicmVkdWNlRGF0ZVByb2ZpbGUiLCJkcCIsImluaXRFdmVudFNvdXJjZXMiLCJhZGRTb3VyY2VzIiwicGFyc2VJbml0aWFsU291cmNlcyIsInJlZHVjZUV2ZW50U291cmNlcyIsInJlbW92ZVNvdXJjZSIsImZldGNoRGlydHlTb3VyY2VzIiwiZmV0Y2hTb3VyY2VzQnlJZHMiLCJleGNsdWRlU3RhdGljU291cmNlcyIsInJlY2VpdmVSZXNwb25zZSIsImZldGNoSWQiLCJyZWR1Y2VFdmVudFNvdXJjZXNOZXdUaW1lWm9uZSIsImNvbXB1dGVFdmVudFNvdXJjZXNMb2FkaW5nIiwiZXZlbnRTb3VyY2VIYXNoIiwic291cmNlc18xIiwic291cmNlIiwiaXNTb3VyY2VEaXJ0eSIsImRvZXNTb3VyY2VOZWVkUmFuZ2UiLCJwcmV2U291cmNlcyIsInNvdXJjZUlkSGFzaCIsIm5leHRTb3VyY2VzIiwiZmV0Y2hTb3VyY2UiLCJzb3VyY2VEZWYiLCJmZXRjaCIsInhociIsImVycm9yIiwibWVzc2FnZSIsInJhd1NvdXJjZXMiLCJyYXdTb3VyY2VzXzEiLCJyYXdTb3VyY2UiLCJpZ25vcmVSYW5nZSIsInJlZHVjZUV2ZW50U3RvcmUiLCJyZWNlaXZlUmF3RXZlbnRzIiwiZXhjbHVkZUV2ZW50c0J5U291cmNlSWQiLCJzdWJzZXQiLCJ0cmFuc2Zvcm1SYXdFdmVudHMiLCJjYWxFYWNoVHJhbnNmb3JtIiwic291cmNlRWFjaFRyYW5zZm9ybSIsInRyYW5zZm9ybUVhY2hSYXdFdmVudCIsInJlZmluZWRFdmVudHMiLCJyZWZpbmVkRXZlbnQiLCJleHBhbmRSYW5nZSIsInJlem9uZUV2ZW50U3RvcmVEYXRlcyIsIm9sZERhdGVFbnYiLCJuZXdEYXRlRW52IiwiZXhjbHVkZUluc3RhbmNlcyIsInJlbW92YWxzIiwicmVkdWNlRGF0ZVNlbGVjdGlvbiIsImN1cnJlbnRTZWxlY3Rpb24iLCJyZWR1Y2VTZWxlY3RlZEV2ZW50IiwiY3VycmVudEluc3RhbmNlSWQiLCJldmVudEluc3RhbmNlSWQiLCJyZWR1Y2VFdmVudERyYWciLCJjdXJyZW50RHJhZyIsIm5ld0RyYWciLCJyZWR1Y2VFdmVudFJlc2l6ZSIsImN1cnJlbnRSZXNpemUiLCJuZXdSZXNpemUiLCJwYXJzZVRvb2xiYXJzIiwiY2FsZW5kYXJPcHRpb25PdmVycmlkZXMiLCJwYXJzZVRvb2xiYXIiLCJzZWN0aW9uU3RySGFzaCIsInNlY3Rpb25XaWRnZXRzIiwiaGFzVGl0bGUiLCJzZWN0aW9uTmFtZSIsInNlY3Rpb25TdHIiLCJzZWN0aW9uUmVzIiwicGFyc2VTZWN0aW9uIiwid2lkZ2V0cyIsImNhbGVuZGFyQ3VzdG9tQnV0dG9ucyIsImNhbGVuZGFyQnV0dG9uVGV4dE92ZXJyaWRlcyIsImNhbGVuZGFyQnV0dG9uVGV4dCIsImNhbGVuZGFyQnV0dG9uSGludE92ZXJyaWRlcyIsImNhbGVuZGFyQnV0dG9uSGludHMiLCJzZWN0aW9uU3Vic3RycyIsImJ1dHRvbkdyb3VwU3RyIiwiYnV0dG9uQ2xpY2siLCJidXR0b25JY29uIiwiY2xpY2siLCJ0ZXh0IiwiaGludCIsInRleHRGYWxsYmFjayIsInByZXZPck5leHQiLCJuYXZVbml0IiwiZXZlbnRTb3VyY2VEZWYkMiIsImFycmF5RXZlbnRTb3VyY2VQbHVnaW4iLCJldmVudFNvdXJjZURlZiQxIiwiYmluZCIsImZ1bmNFdmVudFNvdXJjZVBsdWdpbiIsInJlcXVlc3RKc29uIiwicGFyYW1zIiwic3VjY2Vzc0NhbGxiYWNrIiwiZmFpbHVyZUNhbGxiYWNrIiwidG9VcHBlckNhc2UiLCJpbmplY3RRdWVyeVN0cmluZ1BhcmFtcyIsImVuY29kZVBhcmFtcyIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsInNldFJlcXVlc3RIZWFkZXIiLCJvbmxvYWQiLCJzdGF0dXMiLCJyZXNwb25zZVRleHQiLCJlcnIiLCJvbmVycm9yIiwic2VuZCIsImVuY29kZVVSSUNvbXBvbmVudCIsIkpTT05fRkVFRF9FVkVOVF9TT1VSQ0VfUkVGSU5FUlMiLCJleHRyYVBhcmFtcyIsImV2ZW50U291cmNlRGVmIiwicmVxdWVzdFBhcmFtcyIsImJ1aWxkUmVxdWVzdFBhcmFtcyIsImVycm9yTWVzc2FnZSIsImpzb25GZWVkRXZlbnRTb3VyY2VQbHVnaW4iLCJjdXN0b21SZXF1ZXN0UGFyYW1zIiwiU0lNUExFX1JFQ1VSUklOR19SRUZJTkVSUyIsInN0YXJ0UmVjdXIiLCJlbmRSZWN1ciIsInJlY3VycmluZyIsInJlY3VycmluZ0RhdGEiLCJjbGlwcGVkRnJhbWluZ1JhbmdlIiwiZXhwYW5kUmFuZ2VzIiwic2ltcGxlUmVjdXJyaW5nRXZlbnRzUGx1Z2luIiwiZG93SGFzaCIsImRheU1hcmtlciIsImluc3RhbmNlU3RhcnRzIiwiaW5zdGFuY2VTdGFydCIsImNoYW5nZUhhbmRsZXJQbHVnaW4iLCJoYW5kbGVFdmVudFNvdXJjZXMiLCJ1bmZvdW5kU291cmNlcyIsIm5ld0lucHV0cyIsImlucHV0c18xIiwiaW5wdXRGb3VuZCIsInVuZm91bmRTb3VyY2VzXzEiLCJ1bmZvdW5kU291cmNlIiwibmV3SW5wdXRzXzEiLCJuZXdJbnB1dCIsImhhbmRsZURhdGVQcm9maWxlIiwiaGFuZGxlRXZlbnRTdG9yZSIsImdsb2JhbFBsdWdpbnMiLCJodG1sIiwiYnVpbGRIdG1sUmVuZGVyZXIiLCJkb21Ob2RlcyIsImJ1aWxkRG9tTm9kZVJlbmRlcmVyIiwiY3VycmVudEVsIiwiY3VycmVudEh0bWwiLCJjdXJyZW50RG9tTm9kZXMiLCJuZXdEb21Ob2RlcyIsIm5ld0RvbU5vZGVzXzEiLCJuZXdOb2RlIiwiRGVsYXllZFJ1bm5lciIsImRyYWluZWRPcHRpb24iLCJpc1J1bm5pbmciLCJpc0RpcnR5IiwicGF1c2VEZXB0aHMiLCJ0aW1lb3V0SWQiLCJkZWxheSIsImlzUGF1c2VkIiwiY2xlYXJUaW1lb3V0IiwidHJ5RHJhaW4iLCJzZXRUaW1lb3V0IiwicGF1c2UiLCJzY29wZSIsInJlc3VtZSIsImZvcmNlIiwiZGVwdGgiLCJkcmFpbmVkIiwiY2xlYXIiLCJUYXNrUnVubmVyIiwicnVuVGFza09wdGlvbiIsInF1ZXVlIiwiZGVsYXllZFJ1bm5lciIsInRhc2siLCJjb21wbGV0ZWRUYXNrcyIsInNoaWZ0IiwicnVuVGFzayIsImJ1aWxkVGl0bGUiLCJidWlsZFRpdGxlRm9ybWF0IiwiQ2FsZW5kYXJEYXRhTWFuYWdlciIsImNvbXB1dGVPcHRpb25zRGF0YSIsIl9jb21wdXRlT3B0aW9uc0RhdGEiLCJjb21wdXRlQ3VycmVudFZpZXdEYXRhIiwiX2NvbXB1dGVDdXJyZW50Vmlld0RhdGEiLCJidWlsZERhdGVFbnYiLCJidWlsZFRoZW1lIiwiYnVpbGREYXRlUHJvZmlsZUdlbmVyYXRvciIsImJ1aWxkVmlld0FwaSIsImJ1aWxkVmlld1VpUHJvcHMiLCJidWlsZEV2ZW50VWlCeVNvdXJjZSIsImJ1aWxkRXZlbnRVaUJhc2VzIiwicGFyc2VDb250ZXh0QnVzaW5lc3NIb3VycyIsImFjdGlvblJ1bm5lciIsIl9oYW5kbGVBY3Rpb24iLCJ1cGRhdGVEYXRhIiwiY3VycmVudENhbGVuZGFyT3B0aW9uc1JlZmluZWQiLCJjdXJyZW50Vmlld09wdGlvbnNJbnB1dCIsImN1cnJlbnRWaWV3T3B0aW9uc1JlZmluZWQiLCJkYXRhIiwib3B0aW9uc0RhdGEiLCJjdXJyZW50Vmlld1R5cGUiLCJjdXJyZW50Vmlld0RhdGEiLCJjYWxlbmRhckNvbnRleHQiLCJpbml0aWFsU3RhdGUiLCJyZW5kZXJhYmxlRXZlbnRTdG9yZSIsInNlbGVjdGlvbkNvbmZpZyIsImNvbnRleHRBbmRTdGF0ZSIsInJlZHVjZXIiLCJjb21wdXRlSXNMb2FkaW5nIiwicmVzZXRPcHRpb25zIiwiYXBwZW5kIiwiaXNFdmVudHNMb2FkaW5nIiwiZXZlbnRVaVNpbmdsZUJhc2UiLCJldmVudFVpQnlTb3VyY2UiLCJ3YXNMb2FkaW5nIiwiaXNMb2FkaW5nIiwib25BY3Rpb24iLCJvbGREYXRhIiwiY2hhbmdlSGFuZGxlcnMiLCJvbGRDYWxlbmRhck9wdGlvbnMiLCJuZXdDYWxlbmRhck9wdGlvbnMiLCJvbkRhdGEiLCJwcm9jZXNzUmF3Q2FsZW5kYXJPcHRpb25zIiwicmVmaW5lZE9wdGlvbnMiLCJhdmFpbGFibGVMb2NhbGVEYXRhIiwid2FyblVua25vd25PcHRpb25zIiwiY3VycmVudFJhdyIsImN1cnJlbnRSZWZpbmVkIiwiYW55Q2hhbmdlcyIsInByb2Nlc3NSYXdWaWV3T3B0aW9ucyIsImV4cGxpY2l0TG9jYWxlIiwiVGhlbWVDbGFzcyIsIkRhdGVQcm9maWxlR2VuZXJhdG9yQ2xhc3MiLCJpc0xvYWRpbmdGdW5jIiwidmlld05hbWUiLCJDYWxlbmRhckRhdGFQcm92aWRlciIsImhhbmRsZURhdGEiLCJkYXRhTWFuYWdlciIsInByZXZQcm9wcyIsIm5ld09wdGlvbk92ZXJyaWRlcyIsInNsaWNlRXZlbnRzIiwiTmFtZWRUaW1lWm9uZUltcGwiLCJTZWdIaWVyYXJjaHkiLCJzdHJpY3RPcmRlciIsImFsbG93UmVzbGljaW5nIiwibWF4Q29vcmQiLCJtYXhTdGFja0NudCIsImxldmVsQ29vcmRzIiwiZW50cmllc0J5TGV2ZWwiLCJzdGFja0NudHMiLCJhZGRTZWdzIiwiaGlkZGVuRW50cmllcyIsImluc2VydEVudHJ5IiwiZW50cnkiLCJmaW5kSW5zZXJ0aW9uIiwiaXNJbnNlcnRpb25WYWxpZCIsImluc2VydEVudHJ5QXQiLCJoYW5kbGVJbnZhbGlkSW5zZXJ0aW9uIiwibGV2ZWxDb29yZCIsInRoaWNrbmVzcyIsInN0YWNrQ250IiwidG91Y2hpbmdFbnRyeSIsInNwbGl0RW50cnkiLCJiYXJyaWVyIiwicGFydENudCIsInNwbGl0SGlkZGVuRW50cmllcyIsImVudHJ5U3BhbiIsImJhcnJpZXJTcGFuIiwiaW50ZXJzZWN0U3BhbnMiLCJsYXRlcmFsIiwiaW5zZXJ0QXQiLCJsZXZlbCIsImJ1aWxkRW50cnlLZXkiLCJuZXdFbnRyeSIsImxldmVsQ250IiwiY2FuZGlkYXRlQ29vcmQiLCJ0b3VjaGluZ0xldmVsIiwidG91Y2hpbmdMYXRlcmFsIiwidHJhY2tpbmdMZXZlbCIsInRyYWNraW5nQ29vcmQiLCJ0cmFja2luZ0VudHJpZXMiLCJ0cmFja2luZ0VudHJ5Iiwic2VhcmNoUmVzIiwiYmluYXJ5U2VhcmNoIiwiZ2V0RW50cnlTcGFuRW5kIiwibGF0ZXJhbEluZGV4IiwidHJhY2tpbmdFbnRyeUJvdHRvbSIsImRlc3RMZXZlbCIsImRlc3RMYXRlcmFsIiwidG9SZWN0cyIsInJlY3RzIiwiZW50cmllcyIsImVudHJpZXNfMSIsImdyb3VwSW50ZXJzZWN0aW5nRW50cmllcyIsIm1lcmdlcyIsImVudHJpZXNfMiIsImZpbHRlcmVkTWVyZ2VzIiwiaHVuZ3J5TWVyZ2UiLCJtZXJnZXNfMSIsIm1lcmdlIiwiam9pblNwYW5zIiwic2VhcmNoVmFsIiwiZ2V0SXRlbVZhbCIsIm1pZGRsZUluZGV4IiwibWlkZGxlVmFsIiwiSW50ZXJhY3Rpb24iLCJpc0hpdENvbWJvQWxsb3dlZCIsInBhcnNlSW50ZXJhY3Rpb25TZXR0aW5ncyIsInVzZUV2ZW50Q2VudGVyIiwiaW50ZXJhY3Rpb25TZXR0aW5nc1RvU3RvcmUiLCJpbnRlcmFjdGlvblNldHRpbmdzU3RvcmUiLCJFbGVtZW50RHJhZ2dpbmciLCJzZXRNaXJyb3JJc1Zpc2libGUiLCJib29sIiwic2V0TWlycm9yTmVlZHNSZXZlcnQiLCJzZXRBdXRvU2Nyb2xsRW5hYmxlZCIsImNvbmZpZyIsIkRSQUdfTUVUQV9SRUZJTkVSUyIsInBhcnNlRHJhZ01ldGEiLCJsZWZ0b3ZlclByb3BzIiwiVG9vbGJhclNlY3Rpb24iLCJ3aWRnZXRHcm91cHMiLCJ3aWRnZXRHcm91cCIsInJlbmRlcldpZGdldEdyb3VwIiwiaXNPbmx5QnV0dG9ucyIsIndpZGdldEdyb3VwXzEiLCJ3aWRnZXQiLCJ0aXRsZUlkIiwiaXNQcmVzc2VkIiwiYWN0aXZlQnV0dG9uIiwiaXNUb2RheUVuYWJsZWQiLCJpc1ByZXZFbmFibGVkIiwiaXNOZXh0RW5hYmxlZCIsImJ1dHRvbkNsYXNzZXMiLCJkaXNhYmxlZCIsImdyb3VwQ2xhc3NOYW1lIiwiVG9vbGJhciIsIm1vZGVsIiwiZXh0cmFDbGFzc05hbWUiLCJmb3JjZUx0ciIsInN0YXJ0Q29udGVudCIsImVuZENvbnRlbnQiLCJjZW50ZXJDb250ZW50IiwicmVuZGVyU2VjdGlvbiIsIlZpZXdDb250YWluZXIiLCJhdmFpbGFibGVXaWR0aCIsImhhbmRsZUVsIiwidXBkYXRlQXZhaWxhYmxlV2lkdGgiLCJoYW5kbGVSZXNpemUiLCJsaXF1aWQiLCJsYWJlbGVkQnlJZCIsIkV2ZW50Q2xpY2tpbmciLCJoYW5kbGVTZWdDbGljayIsInNlZ0VsIiwiaGFzVXJsQ29udGFpbmVyIiwiZGVmYXVsdFByZXZlbnRlZCIsImxvY2F0aW9uIiwiRXZlbnRIb3ZlcmluZyIsImhhbmRsZUV2ZW50RWxSZW1vdmUiLCJjdXJyZW50U2VnRWwiLCJoYW5kbGVTZWdMZWF2ZSIsImhhbmRsZVNlZ0VudGVyIiwidHJpZ2dlckV2ZW50IiwicmVtb3ZlSG92ZXJMaXN0ZW5lcnMiLCJwdWJsaWNFdk5hbWUiLCJDYWxlbmRhckNvbnRlbnQiLCJidWlsZFZpZXdQcm9wVHJhbnNmb3JtZXJzIiwiYnVpbGRUb29sYmFyUHJvcHMiLCJoZWFkZXJSZWYiLCJmb290ZXJSZWYiLCJpbnRlcmFjdGlvbnNTdG9yZSIsInZpZXdMYWJlbElkIiwic2V0dGluZ3NJbnB1dCIsIkRFRkFVTFRfSU5URVJBQ1RJT05TIiwiaW50ZXJhY3Rpb25DbGFzc2VzIiwiaW50ZXJhY3Rpb25zIiwiVGhlSW50ZXJhY3Rpb25DbGFzcyIsImxpc3RlbmVycyIsImxpc3RlbmVyc18xIiwibGlzdGVuZXIiLCJyZXNpemVSdW5uZXIiLCJ0b29sYmFyUHJvcHMiLCJ2aWV3Vkdyb3ciLCJ2aWV3QXNwZWN0UmF0aW8iLCJpc0hlaWdodEF1dG8iLCJmb3JQcmludCIsInZpZXdDb250ZXh0IiwiUHJvdmlkZXIiLCJyZW5kZXJWaWV3IiwiYnVpbGRBcHBlbmRDb250ZW50IiwiQ2FsZW5kYXJJbnRlcmFjdGlvbkNsYXNzIiwiRnJhZ21lbnQiLCJWaWV3Q29tcG9uZW50IiwidG9kYXlJbmZvIiwicHJldkluZm8iLCJuZXh0SW5mbyIsInRoZUNsYXNzZXMiLCJUaGVDbGFzcyIsIkNhbGVuZGFyUm9vdCIsImhhbmRsZUJlZm9yZVByaW50IiwiaGFuZGxlQWZ0ZXJQcmludCIsImNvbXB1dGVGYWxsYmFja0hlYWRlckZvcm1hdCIsImRhdGVzUmVwRGlzdGluY3REYXlzIiwiQ0xBU1NfTkFNRSIsInJlbmRlcklubmVyJDEiLCJUYWJsZURhdGVDZWxsIiwiZGF5TWV0YSIsIm5hdkxpbmtBdHRycyIsImNvbENudCIsImV4dHJhSG9va1Byb3BzIiwicm9sZSIsImNvbFNwYW4iLCJleHRyYURhdGFBdHRycyIsImlzU3RpY2t5IiwiV0VFS0RBWV9GT1JNQVQiLCJUYWJsZURvd0NlbGwiLCJleHRyYUNsYXNzTmFtZXMiLCJOb3dUaW1lciIsImluaXRpYWxOb3dEYXRlIiwiaW5pdGlhbE5vd1F1ZXJpZWRNcyIsImNvbXB1dGVUaW1pbmciLCJjdXJyZW50U3RhdGUiLCJ1bnJvdW5kZWROb3ciLCJjdXJyZW50VW5pdFN0YXJ0IiwibmV4dFVuaXRTdGFydCIsIndhaXRNcyIsImJ1aWxkRGF5UmFuZ2UiLCJEYXlIZWFkZXIiLCJjcmVhdGVEYXlIZWFkZXJGb3JtYXR0ZXIiLCJkYXRlcyIsInJlbmRlckludHJvIiwiZXhwbGljaXRGb3JtYXQiLCJkYXRlQ250IiwiRGF5U2VyaWVzTW9kZWwiLCJpbmRpY2VzIiwiZGF5SW5kZXgiLCJjbnQiLCJzbGljZVJhbmdlIiwiZmlyc3RJbmRleCIsImdldERhdGVEYXlJbmRleCIsImxhc3RJbmRleCIsImNsaXBwZWRGaXJzdEluZGV4IiwiY2xpcHBlZExhc3RJbmRleCIsImNlaWwiLCJkYXlPZmZzZXQiLCJEYXlUYWJsZU1vZGVsIiwiZGF5U2VyaWVzIiwiYnJlYWtPbldlZWtzIiwiZGF5c1BlclJvdyIsInJvd0NudCIsImNlbGxzIiwiYnVpbGRDZWxscyIsImhlYWRlckRhdGVzIiwiYnVpbGRIZWFkZXJEYXRlcyIsInJvd3MiLCJyb3ciLCJjb2wiLCJidWlsZENlbGwiLCJzZXJpZXNTZWciLCJuZXh0SW5kZXgiLCJmaXJzdENvbCIsImxhc3RDb2wiLCJTbGljZXIiLCJzbGljZUJ1c2luZXNzSG91cnMiLCJfc2xpY2VCdXNpbmVzc0hvdXJzIiwic2xpY2VEYXRlU2VsZWN0aW9uIiwiX3NsaWNlRGF0ZVNwYW4iLCJfc2xpY2VFdmVudFN0b3JlIiwic2xpY2VFdmVudERyYWciLCJfc2xpY2VJbnRlcmFjdGlvbiIsInNsaWNlRXZlbnRSZXNpemUiLCJmb3JjZURheUlmTGlzdEl0ZW0iLCJzbGljZVByb3BzIiwiZXh0cmFBcmdzIiwiZXZlbnRTZWdzIiwiZGF0ZVNlbGVjdGlvblNlZ3MiLCJidXNpbmVzc0hvdXJTZWdzIiwiZmdFdmVudFNlZ3MiLCJiZ0V2ZW50U2VncyIsInNsaWNlTm93RGF0ZSIsImNvbXB1dGVBY3RpdmVSYW5nZSIsInJhbmdlUmVzIiwic2xpY2VFdmVudFJhbmdlcyIsImFmZmVjdGVkSW5zdGFuY2VzIiwic2Vnc18xIiwiZXZlbnRSYW5nZXMiLCJldmVudFJhbmdlc18xIiwic2xpY2VFdmVudFJhbmdlIiwic2Vnc18yIiwiaXNDb21wb25lbnRBbGxEYXkiLCJpc0ludGVyYWN0aW9uVmFsaWQiLCJpc05ld1Byb3BzVmFsaWQiLCJpc0RhdGVTZWxlY3Rpb25WYWxpZCIsImNhbGVuZGFyU3RhdGUiLCJkYXRlU3Bhbk1ldGEiLCJmaWx0ZXJDb25maWciLCJpc0ludGVyYWN0aW9uUHJvcHNWYWxpZCIsImlzRGF0ZVNlbGVjdGlvblByb3BzVmFsaWQiLCJzdWJqZWN0RXZlbnRTdG9yZSIsInN1YmplY3REZWZzIiwic3ViamVjdEluc3RhbmNlcyIsInN1YmplY3RDb25maWdzIiwib3RoZXJFdmVudFN0b3JlIiwib3RoZXJEZWZzIiwib3RoZXJJbnN0YW5jZXMiLCJvdGhlckNvbmZpZ3MiLCJzdWJqZWN0SW5zdGFuY2VJZCIsInN1YmplY3RJbnN0YW5jZSIsInN1YmplY3RSYW5nZSIsInN1YmplY3RDb25maWciLCJzdWJqZWN0RGVmIiwiYWxsQ29uc3RyYWludHNQYXNzIiwiZXZlbnRPdmVybGFwRnVuYyIsIm90aGVySW5zdGFuY2VJZCIsIm90aGVySW5zdGFuY2UiLCJvdGhlck92ZXJsYXAiLCJjYWxlbmRhckV2ZW50U3RvcmUiLCJzdWJqZWN0QWxsb3ciLCJzdWJqZWN0RGF0ZVNwYW4iLCJvcmlnRGVmIiwib3JpZ0luc3RhbmNlIiwicmVsZXZhbnRFdmVudFN0b3JlIiwicmVsZXZhbnREZWZzIiwicmVsZXZhbnRJbnN0YW5jZXMiLCJzZWxlY3Rpb25SYW5nZSIsInNlbGVjdE92ZXJsYXBGdW5jIiwicmVsZXZhbnRJbnN0YW5jZUlkIiwicmVsZXZhbnRJbnN0YW5jZSIsInNlbGVjdGlvbkFsbG93IiwiZnVsbERhdGVTcGFuIiwiYnVzaW5lc3NIb3Vyc1VuZXhwYW5kZWQiLCJjb25zdHJhaW50c18xIiwiYW55UmFuZ2VzQ29udGFpblJhbmdlIiwiY29uc3RyYWludFRvUmFuZ2VzIiwiZXZlbnRTdG9yZVRvUmFuZ2VzIiwib3V0ZXJSYW5nZXMiLCJvdXRlclJhbmdlc18xIiwiVklTSUJMRV9ISURERU5fUkUiLCJTY3JvbGxlciIsImxpcXVpZElzQWJzb2x1dGUiLCJpc0Fic29sdXRlIiwib3ZlcmNvbWVMZWZ0Iiwib3ZlcmNvbWVSaWdodCIsIm92ZXJjb21lQm90dG9tIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwibWF4SGVpZ2h0IiwibmVlZHNYU2Nyb2xsaW5nIiwicmVhbENsaWVudFdpZHRoIiwiZ2V0WVNjcm9sbGJhcldpZHRoIiwiY2hpbGRFbCIsIm5lZWRzWVNjcm9sbGluZyIsInJlYWxDbGllbnRIZWlnaHQiLCJnZXRYU2Nyb2xsYmFyV2lkdGgiLCJSZWZNYXAiLCJtYXN0ZXJDYWxsYmFjayIsImN1cnJlbnRNYXAiLCJkZXB0aHMiLCJjYWxsYmFja01hcCIsImhhbmRsZVZhbHVlIiwicmVtb3ZlZCIsImFkZGVkIiwicmVmQ2FsbGJhY2siLCJjb2xsZWN0IiwiZ2V0QWxsIiwiY29tcHV0ZVNocmlua1dpZHRoIiwiY2h1bmtFbHMiLCJzaHJpbmtDZWxscyIsImxhcmdlc3RXaWR0aCIsInNocmlua0NlbGxzXzEiLCJzaHJpbmtDZWxsIiwiZ2V0U2VjdGlvbkhhc0xpcXVpZEhlaWdodCIsInNlY3Rpb25Db25maWciLCJnZXRBbGxvd1lTY3JvbGxpbmciLCJyZW5kZXJDaHVua0NvbnRlbnQiLCJjaHVua0NvbmZpZyIsImlzSGVhZGVyIiwidGFibGVDbGFzc05hbWUiLCJzeW5jUm93SGVpZ2h0cyIsIm1pbldpZHRoIiwidGFibGVNaW5XaWR0aCIsInRhYmxlQ29sR3JvdXBOb2RlIiwicm93Q29udGVudCIsImlzQ29sUHJvcHNFcXVhbCIsImNvbHMwIiwiY29sczEiLCJyZW5kZXJNaWNyb0NvbEdyb3VwIiwiY29scyIsInNocmlua1dpZHRoIiwiY29sTm9kZXMiLCJjb2xzXzEiLCJjb2xQcm9wcyIsInNhbml0aXplU2hyaW5rV2lkdGgiLCJoYXNTaHJpbmtXaWR0aCIsImNvbHNfMiIsImdldFNjcm9sbEdyaWRDbGFzc05hbWVzIiwiZ2V0U2VjdGlvbkNsYXNzTmFtZXMiLCJ3aG9sZVRhYmxlVkdyb3ciLCJyZW5kZXJTY3JvbGxTaGltIiwiZ2V0U3RpY2t5SGVhZGVyRGF0ZXMiLCJnZXRTdGlja3lGb290ZXJTY3JvbGxiYXIiLCJTaW1wbGVTY3JvbGxHcmlkIiwicHJvY2Vzc0NvbHMiLCJzY3JvbGxlclJlZnMiLCJzY3JvbGxlckVsUmVmcyIsIl9oYW5kbGVTY3JvbGxlckVsIiwiZm9yY2VZU2Nyb2xsYmFycyIsInNjcm9sbGVyQ2xpZW50V2lkdGhzIiwic2Nyb2xsZXJDbGllbnRIZWlnaHRzIiwiaGFuZGxlU2l6aW5nIiwiY29tcHV0ZVNjcm9sbGVyRGltcyIsInNlY3Rpb25Db25maWdzIiwic2VjdGlvbnMiLCJtaWNyb0NvbEdyb3VwTm9kZSIsImNvbGxhcHNpYmxlV2lkdGgiLCJjb25maWdDbnQiLCJjb25maWdJIiwiY3VycmVudENvbmZpZyIsImhlYWRTZWN0aW9uTm9kZXMiLCJib2R5U2VjdGlvbk5vZGVzIiwiZm9vdFNlY3Rpb25Ob2RlcyIsImlzQnVnZ3kiLCJyb2xlQXR0cnMiLCJvdXRlckNvbnRlbnQiLCJyZW5kZXJDaHVua1RkIiwiY2h1bmsiLCJpc0xpcXVpZCIsInNlY3Rpb25LZXkiLCJyb3dTeW5jSGVpZ2h0cyIsInJlcG9ydFJvd0hlaWdodENoYW5nZSIsInNjcm9sbGVyRWwiLCJzZWN0aW9uIiwiZ2V0U2VjdGlvbkJ5S2V5Iiwic2Nyb2xsZXJFbFJlZiIsInNjcm9sbGJhcldpZHRoIiwic2Nyb2xsZXIiLCJoYXJuZXNzRWwiLCJzZWN0aW9uc18xIiwiRXZlbnRSb290IiwidGltZVRleHQiLCJkaXNhYmxlRHJhZ2dpbmciLCJkaXNhYmxlUmVzaXppbmciLCJpc0RhdGVTZWxlY3RpbmciLCJzdGFuZGFyZENsYXNzTmFtZXMiLCJTdGFuZGFyZEV2ZW50IiwiZGVmYXVsdFRpbWVGb3JtYXQiLCJyZW5kZXJJbm5lckNvbnRlbnQkMSIsImlubmVyUHJvcHMiLCJOb3dJbmRpY2F0b3JSb290IiwiaXNBeGlzIiwiREFZX05VTV9GT1JNQVQiLCJEYXlDZWxsQ29udGVudCIsInJlZmluZURheUNlbGxIb29rUHJvcHMiLCJzaG93RGF5TnVtYmVyIiwiZXh0cmFQcm9wcyIsImRheU51bWJlclRleHQiLCJEYXlDZWxsUm9vdCIsInJlZmluZUhvb2tQcm9wcyIsImRhdGFBdHRycyIsInJlbmRlckZpbGwiLCJmaWxsVHlwZSIsIkJnRXZlbnQiLCJXZWVrTnVtYmVyUm9vdCIsImRlZmF1bHRGb3JtYXQiLCJyZW5kZXJJbm5lciIsIlBBRERJTkdfRlJPTV9WSUVXUE9SVCIsIlBvcG92ZXIiLCJoYW5kbGVEb2N1bWVudE1vdXNlRG93biIsImhhbmRsZUNsb3NlQ2xpY2siLCJoYW5kbGVEb2N1bWVudEtleURvd24iLCJvbkNsb3NlIiwiY3JlYXRlUG9ydGFsIiwiZXh0cmFBdHRycyIsInBhcmVudEVsIiwiYWxpZ25tZW50RWwiLCJhbGlnbkdyaWRUb3AiLCJhbGlnbm1lbnRSZWN0IiwicG9wb3ZlckRpbXMiLCJwb3BvdmVyVG9wIiwicG9wb3ZlckxlZnQiLCJvcmlnaW5fMSIsIm9mZnNldFBhcmVudCIsIk1vcmVQb3BvdmVyIiwic3RhcnREYXRlIiwiZGF5Q2xhc3NOYW1lcyIsImV4dHJhRGF0ZVNwYW4iLCJkYXlFbCIsImxheWVyIiwiTW9yZUxpbmtSb290IiwibGlua0VsUmVmIiwiaXNQb3BvdmVyT3BlbiIsInBvcG92ZXJJZCIsImhhbmRsZUNsaWNrIiwiY29tcHV0ZVJhbmdlIiwiYnVpbGRQdWJsaWNTZWciLCJhbGxEYXlEYXRlIiwiYWxsU2VncyIsImhpZGRlblNlZ3MiLCJoYW5kbGVQb3BvdmVyQ2xvc2UiLCJtb3JlQ250Iiwic2hvcnRUZXh0IiwicmVuZGVyTW9yZUxpbmtJbm5lciIsImFsaWdubWVudEVsUmVmIiwicG9wb3ZlckNvbnRlbnQiLCJ1cGRhdGVQYXJlbnRFbCIsImNvbXB1dGVFYXJsaWVzdFNlZ1N0YXJ0IiwiY29tcHV0ZUxhdGVzdFNlZ0VuZCIsInBpY2tFYXJsaWVzdFN0YXJ0Iiwic2VnMCIsInNlZzEiLCJwaWNrTGF0ZXN0RW5kIiwidmVyc2lvbiIsInBhcnNlTWFya2VyIiwiayJdLCJzb3VyY2VzIjpbIm1haW4uY2pzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuRnVsbENhbGVuZGFyIHY1LjExLjJcbkRvY3MgJiBMaWNlbnNlOiBodHRwczovL2Z1bGxjYWxlbmRhci5pby9cbihjKSAyMDIyIEFkYW0gU2hhd1xuKi9cbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuO1xudmFyIHRzbGliID0gcmVxdWlyZSgndHNsaWInKTtcbnZhciB2ZG9tX2NqcyA9IHJlcXVpcmUoJy4vdmRvbS5janMnKTtcblxuLy8gbm8gcHVibGljIHR5cGVzIHlldC4gd2hlbiB0aGVyZSBhcmUsIGV4cG9ydCBmcm9tOlxuLy8gaW1wb3J0IHt9IGZyb20gJy4vYXBpLXR5cGUtZGVwcydcbnZhciBFdmVudFNvdXJjZUFwaSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFdmVudFNvdXJjZUFwaShjb250ZXh0LCBpbnRlcm5hbEV2ZW50U291cmNlKSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxFdmVudFNvdXJjZSA9IGludGVybmFsRXZlbnRTb3VyY2U7XG4gICAgfVxuICAgIEV2ZW50U291cmNlQXBpLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiAnUkVNT1ZFX0VWRU5UX1NPVVJDRScsXG4gICAgICAgICAgICBzb3VyY2VJZDogdGhpcy5pbnRlcm5hbEV2ZW50U291cmNlLnNvdXJjZUlkLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEV2ZW50U291cmNlQXBpLnByb3RvdHlwZS5yZWZldGNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ0ZFVENIX0VWRU5UX1NPVVJDRVMnLFxuICAgICAgICAgICAgc291cmNlSWRzOiBbdGhpcy5pbnRlcm5hbEV2ZW50U291cmNlLnNvdXJjZUlkXSxcbiAgICAgICAgICAgIGlzUmVmZXRjaDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRTb3VyY2VBcGkucHJvdG90eXBlLCBcImlkXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEV2ZW50U291cmNlLnB1YmxpY0lkO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50U291cmNlQXBpLnByb3RvdHlwZSwgXCJ1cmxcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmludGVybmFsRXZlbnRTb3VyY2UubWV0YS51cmw7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRTb3VyY2VBcGkucHJvdG90eXBlLCBcImZvcm1hdFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxFdmVudFNvdXJjZS5tZXRhLmZvcm1hdDsgLy8gVE9ETzogYmFkLiBub3QgZ3VhcmFudGVlZFxuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIEV2ZW50U291cmNlQXBpO1xufSgpKTtcblxuZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbCkge1xuICAgIGlmIChlbC5wYXJlbnROb2RlKSB7XG4gICAgICAgIGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIH1cbn1cbi8vIFF1ZXJ5aW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBlbGVtZW50Q2xvc2VzdChlbCwgc2VsZWN0b3IpIHtcbiAgICBpZiAoZWwuY2xvc2VzdCkge1xuICAgICAgICByZXR1cm4gZWwuY2xvc2VzdChzZWxlY3Rvcik7XG4gICAgICAgIC8vIHJlYWxseSBiYWQgZmFsbGJhY2sgZm9yIElFXG4gICAgICAgIC8vIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvY2xvc2VzdFxuICAgIH1cbiAgICBpZiAoIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyhlbCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGRvIHtcbiAgICAgICAgaWYgKGVsZW1lbnRNYXRjaGVzKGVsLCBzZWxlY3RvcikpIHtcbiAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgfVxuICAgICAgICBlbCA9IChlbC5wYXJlbnRFbGVtZW50IHx8IGVsLnBhcmVudE5vZGUpO1xuICAgIH0gd2hpbGUgKGVsICE9PSBudWxsICYmIGVsLm5vZGVUeXBlID09PSAxKTtcbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVzKGVsLCBzZWxlY3Rvcikge1xuICAgIHZhciBtZXRob2QgPSBlbC5tYXRjaGVzIHx8IGVsLm1hdGNoZXNTZWxlY3RvciB8fCBlbC5tc01hdGNoZXNTZWxlY3RvcjtcbiAgICByZXR1cm4gbWV0aG9kLmNhbGwoZWwsIHNlbGVjdG9yKTtcbn1cbi8vIGFjY2VwdHMgbXVsdGlwbGUgc3ViamVjdCBlbHNcbi8vIHJldHVybnMgYSByZWFsIGFycmF5LiBnb29kIGZvciBtZXRob2RzIGxpa2UgZm9yRWFjaFxuLy8gVE9ETzogYWNjZXB0IHRoZSBkb2N1bWVudFxuZnVuY3Rpb24gZmluZEVsZW1lbnRzKGNvbnRhaW5lciwgc2VsZWN0b3IpIHtcbiAgICB2YXIgY29udGFpbmVycyA9IGNvbnRhaW5lciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gW2NvbnRhaW5lcl0gOiBjb250YWluZXI7XG4gICAgdmFyIGFsbE1hdGNoZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRhaW5lcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIG1hdGNoZXMgPSBjb250YWluZXJzW2ldLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1hdGNoZXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICAgIGFsbE1hdGNoZXMucHVzaChtYXRjaGVzW2pdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWxsTWF0Y2hlcztcbn1cbi8vIGFjY2VwdHMgbXVsdGlwbGUgc3ViamVjdCBlbHNcbi8vIG9ubHkgcXVlcmllcyBkaXJlY3QgY2hpbGQgZWxlbWVudHMgLy8gVE9ETzogcmVuYW1lIHRvIGZpbmREaXJlY3RDaGlsZHJlbiFcbmZ1bmN0aW9uIGZpbmREaXJlY3RDaGlsZHJlbihwYXJlbnQsIHNlbGVjdG9yKSB7XG4gICAgdmFyIHBhcmVudHMgPSBwYXJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IFtwYXJlbnRdIDogcGFyZW50O1xuICAgIHZhciBhbGxNYXRjaGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBjaGlsZE5vZGVzID0gcGFyZW50c1tpXS5jaGlsZHJlbjsgLy8gb25seSBldmVyIGVsZW1lbnRzXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICAgICAgdmFyIGNoaWxkTm9kZSA9IGNoaWxkTm9kZXNbal07XG4gICAgICAgICAgICBpZiAoIXNlbGVjdG9yIHx8IGVsZW1lbnRNYXRjaGVzKGNoaWxkTm9kZSwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgICAgICAgYWxsTWF0Y2hlcy5wdXNoKGNoaWxkTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFsbE1hdGNoZXM7XG59XG4vLyBTdHlsZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIFBJWEVMX1BST1BfUkUgPSAvKHRvcHxsZWZ0fHJpZ2h0fGJvdHRvbXx3aWR0aHxoZWlnaHQpJC9pO1xuZnVuY3Rpb24gYXBwbHlTdHlsZShlbCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBwcm9wcykge1xuICAgICAgICBhcHBseVN0eWxlUHJvcChlbCwgcHJvcE5hbWUsIHByb3BzW3Byb3BOYW1lXSk7XG4gICAgfVxufVxuZnVuY3Rpb24gYXBwbHlTdHlsZVByb3AoZWwsIG5hbWUsIHZhbCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICBlbC5zdHlsZVtuYW1lXSA9ICcnO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiBQSVhFTF9QUk9QX1JFLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZWwuc3R5bGVbbmFtZV0gPSB2YWwgKyBcInB4XCI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBlbC5zdHlsZVtuYW1lXSA9IHZhbDtcbiAgICB9XG59XG4vLyBFdmVudCBIYW5kbGluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gaWYgaW50ZXJjZXB0aW5nIGJ1YmJsZWQgZXZlbnRzIGF0IHRoZSBkb2N1bWVudC93aW5kb3cvYm9keSBsZXZlbCxcbi8vIGFuZCB3YW50IHRvIHNlZSBvcmlnaW5hdGluZyBlbGVtZW50ICh0aGUgJ3RhcmdldCcpLCB1c2UgdGhpcyB1dGlsIGluc3RlYWRcbi8vIG9mIGBldi50YXJnZXRgIGJlY2F1c2UgaXQgZ29lcyB3aXRoaW4gd2ViLWNvbXBvbmVudCBib3VuZGFyaWVzLlxuZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXRWaWFSb290KGV2KSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gKF9iID0gKF9hID0gZXYuY29tcG9zZWRQYXRoKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChldilbMF0pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGV2LnRhcmdldDtcbn1cbi8vIFNoYWRvdyBET00gY29uc3VkZXJhdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGdldEVsUm9vdChlbCkge1xuICAgIHJldHVybiBlbC5nZXRSb290Tm9kZSA/IGVsLmdldFJvb3ROb2RlKCkgOiBkb2N1bWVudDtcbn1cbi8vIFVuaXF1ZSBJRCBmb3IgRE9NIGF0dHJpYnV0ZVxudmFyIGd1aWQkMSA9IDA7XG5mdW5jdGlvbiBnZXRVbmlxdWVEb21JZCgpIHtcbiAgICBndWlkJDEgKz0gMTtcbiAgICByZXR1cm4gJ2ZjLWRvbS0nICsgZ3VpZCQxO1xufVxuXG4vLyBTdG9wcyBhIG1vdXNlL3RvdWNoIGV2ZW50IGZyb20gZG9pbmcgaXQncyBuYXRpdmUgYnJvd3NlciBhY3Rpb25cbmZ1bmN0aW9uIHByZXZlbnREZWZhdWx0KGV2KSB7XG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcbn1cbi8vIEV2ZW50IERlbGVnYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGJ1aWxkRGVsZWdhdGlvbkhhbmRsZXIoc2VsZWN0b3IsIGhhbmRsZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIHZhciBtYXRjaGVkQ2hpbGQgPSBlbGVtZW50Q2xvc2VzdChldi50YXJnZXQsIHNlbGVjdG9yKTtcbiAgICAgICAgaWYgKG1hdGNoZWRDaGlsZCkge1xuICAgICAgICAgICAgaGFuZGxlci5jYWxsKG1hdGNoZWRDaGlsZCwgZXYsIG1hdGNoZWRDaGlsZCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gbGlzdGVuQnlTZWxlY3Rvcihjb250YWluZXIsIGV2ZW50VHlwZSwgc2VsZWN0b3IsIGhhbmRsZXIpIHtcbiAgICB2YXIgYXR0YWNoZWRIYW5kbGVyID0gYnVpbGREZWxlZ2F0aW9uSGFuZGxlcihzZWxlY3RvciwgaGFuZGxlcik7XG4gICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBhdHRhY2hlZEhhbmRsZXIpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgYXR0YWNoZWRIYW5kbGVyKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gbGlzdGVuVG9Ib3ZlckJ5U2VsZWN0b3IoY29udGFpbmVyLCBzZWxlY3Rvciwgb25Nb3VzZUVudGVyLCBvbk1vdXNlTGVhdmUpIHtcbiAgICB2YXIgY3VycmVudE1hdGNoZWRDaGlsZDtcbiAgICByZXR1cm4gbGlzdGVuQnlTZWxlY3Rvcihjb250YWluZXIsICdtb3VzZW92ZXInLCBzZWxlY3RvciwgZnVuY3Rpb24gKG1vdXNlT3ZlckV2LCBtYXRjaGVkQ2hpbGQpIHtcbiAgICAgICAgaWYgKG1hdGNoZWRDaGlsZCAhPT0gY3VycmVudE1hdGNoZWRDaGlsZCkge1xuICAgICAgICAgICAgY3VycmVudE1hdGNoZWRDaGlsZCA9IG1hdGNoZWRDaGlsZDtcbiAgICAgICAgICAgIG9uTW91c2VFbnRlcihtb3VzZU92ZXJFdiwgbWF0Y2hlZENoaWxkKTtcbiAgICAgICAgICAgIHZhciByZWFsT25Nb3VzZUxlYXZlXzEgPSBmdW5jdGlvbiAobW91c2VMZWF2ZUV2KSB7XG4gICAgICAgICAgICAgICAgY3VycmVudE1hdGNoZWRDaGlsZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgb25Nb3VzZUxlYXZlKG1vdXNlTGVhdmVFdiwgbWF0Y2hlZENoaWxkKTtcbiAgICAgICAgICAgICAgICBtYXRjaGVkQ2hpbGQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHJlYWxPbk1vdXNlTGVhdmVfMSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gbGlzdGVuIHRvIHRoZSBuZXh0IG1vdXNlbGVhdmUsIGFuZCB0aGVuIHVuYXR0YWNoXG4gICAgICAgICAgICBtYXRjaGVkQ2hpbGQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHJlYWxPbk1vdXNlTGVhdmVfMSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIEFuaW1hdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIHRyYW5zaXRpb25FdmVudE5hbWVzID0gW1xuICAgICd3ZWJraXRUcmFuc2l0aW9uRW5kJyxcbiAgICAnb3RyYW5zaXRpb25lbmQnLFxuICAgICdvVHJhbnNpdGlvbkVuZCcsXG4gICAgJ21zVHJhbnNpdGlvbkVuZCcsXG4gICAgJ3RyYW5zaXRpb25lbmQnLFxuXTtcbi8vIHRyaWdnZXJlZCBvbmx5IHdoZW4gdGhlIG5leHQgc2luZ2xlIHN1YnNlcXVlbnQgdHJhbnNpdGlvbiBmaW5pc2hlc1xuZnVuY3Rpb24gd2hlblRyYW5zaXRpb25Eb25lKGVsLCBjYWxsYmFjaykge1xuICAgIHZhciByZWFsQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgY2FsbGJhY2soZXYpO1xuICAgICAgICB0cmFuc2l0aW9uRXZlbnROYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCByZWFsQ2FsbGJhY2spO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHRyYW5zaXRpb25FdmVudE5hbWVzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgcmVhbENhbGxiYWNrKTsgLy8gY3Jvc3MtYnJvd3NlciB3YXkgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIHRyYW5zaXRpb24gZmluaXNoZXNcbiAgICB9KTtcbn1cbi8vIEFSSUEgd29ya2Fyb3VuZHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGNyZWF0ZUFyaWFDbGlja0F0dHJzKGhhbmRsZXIpIHtcbiAgICByZXR1cm4gdHNsaWIuX19hc3NpZ24oeyBvbkNsaWNrOiBoYW5kbGVyIH0sIGNyZWF0ZUFyaWFLZXlib2FyZEF0dHJzKGhhbmRsZXIpKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUFyaWFLZXlib2FyZEF0dHJzKGhhbmRsZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0YWJJbmRleDogMCxcbiAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIGlmIChldi5rZXkgPT09ICdFbnRlcicgfHwgZXYua2V5ID09PSAnICcpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGV2KTtcbiAgICAgICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpOyAvLyBpZiBzcGFjZSwgZG9uJ3Qgc2Nyb2xsIGRvd24gcGFnZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH07XG59XG5cbnZhciBndWlkTnVtYmVyID0gMDtcbmZ1bmN0aW9uIGd1aWQoKSB7XG4gICAgZ3VpZE51bWJlciArPSAxO1xuICAgIHJldHVybiBTdHJpbmcoZ3VpZE51bWJlcik7XG59XG4vKiBGdWxsQ2FsZW5kYXItc3BlY2lmaWMgRE9NIFV0aWxpdGllc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4vLyBNYWtlIHRoZSBtb3VzZSBjdXJzb3IgZXhwcmVzcyB0aGF0IGFuIGV2ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRoZSBjdXJyZW50IGFyZWFcbmZ1bmN0aW9uIGRpc2FibGVDdXJzb3IoKSB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdmYy1ub3QtYWxsb3dlZCcpO1xufVxuLy8gUmV0dXJucyB0aGUgbW91c2UgY3Vyc29yIHRvIGl0cyBvcmlnaW5hbCBsb29rXG5mdW5jdGlvbiBlbmFibGVDdXJzb3IoKSB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdmYy1ub3QtYWxsb3dlZCcpO1xufVxuLyogU2VsZWN0aW9uXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmZ1bmN0aW9uIHByZXZlbnRTZWxlY3Rpb24oZWwpIHtcbiAgICBlbC5jbGFzc0xpc3QuYWRkKCdmYy11bnNlbGVjdGFibGUnKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3RzdGFydCcsIHByZXZlbnREZWZhdWx0KTtcbn1cbmZ1bmN0aW9uIGFsbG93U2VsZWN0aW9uKGVsKSB7XG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnZmMtdW5zZWxlY3RhYmxlJyk7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2VsZWN0c3RhcnQnLCBwcmV2ZW50RGVmYXVsdCk7XG59XG4vKiBDb250ZXh0IE1lbnVcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuZnVuY3Rpb24gcHJldmVudENvbnRleHRNZW51KGVsKSB7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBwcmV2ZW50RGVmYXVsdCk7XG59XG5mdW5jdGlvbiBhbGxvd0NvbnRleHRNZW51KGVsKSB7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBwcmV2ZW50RGVmYXVsdCk7XG59XG5mdW5jdGlvbiBwYXJzZUZpZWxkU3BlY3MoaW5wdXQpIHtcbiAgICB2YXIgc3BlY3MgPSBbXTtcbiAgICB2YXIgdG9rZW5zID0gW107XG4gICAgdmFyIGk7XG4gICAgdmFyIHRva2VuO1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRva2VucyA9IGlucHV0LnNwbGl0KC9cXHMqLFxccyovKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRva2VucyA9IFtpbnB1dF07XG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIHRva2VucyA9IGlucHV0O1xuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc3BlY3MucHVzaCh0b2tlbi5jaGFyQXQoMCkgPT09ICctJyA/XG4gICAgICAgICAgICAgICAgeyBmaWVsZDogdG9rZW4uc3Vic3RyaW5nKDEpLCBvcmRlcjogLTEgfSA6XG4gICAgICAgICAgICAgICAgeyBmaWVsZDogdG9rZW4sIG9yZGVyOiAxIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3BlY3MucHVzaCh7IGZ1bmM6IHRva2VuIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcGVjcztcbn1cbmZ1bmN0aW9uIGNvbXBhcmVCeUZpZWxkU3BlY3Mob2JqMCwgb2JqMSwgZmllbGRTcGVjcykge1xuICAgIHZhciBpO1xuICAgIHZhciBjbXA7XG4gICAgZm9yIChpID0gMDsgaSA8IGZpZWxkU3BlY3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY21wID0gY29tcGFyZUJ5RmllbGRTcGVjKG9iajAsIG9iajEsIGZpZWxkU3BlY3NbaV0pO1xuICAgICAgICBpZiAoY21wKSB7XG4gICAgICAgICAgICByZXR1cm4gY21wO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwO1xufVxuZnVuY3Rpb24gY29tcGFyZUJ5RmllbGRTcGVjKG9iajAsIG9iajEsIGZpZWxkU3BlYykge1xuICAgIGlmIChmaWVsZFNwZWMuZnVuYykge1xuICAgICAgICByZXR1cm4gZmllbGRTcGVjLmZ1bmMob2JqMCwgb2JqMSk7XG4gICAgfVxuICAgIHJldHVybiBmbGV4aWJsZUNvbXBhcmUob2JqMFtmaWVsZFNwZWMuZmllbGRdLCBvYmoxW2ZpZWxkU3BlYy5maWVsZF0pXG4gICAgICAgICogKGZpZWxkU3BlYy5vcmRlciB8fCAxKTtcbn1cbmZ1bmN0aW9uIGZsZXhpYmxlQ29tcGFyZShhLCBiKSB7XG4gICAgaWYgKCFhICYmICFiKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAoYiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgaWYgKGEgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhhKS5sb2NhbGVDb21wYXJlKFN0cmluZyhiKSk7XG4gICAgfVxuICAgIHJldHVybiBhIC0gYjtcbn1cbi8qIFN0cmluZyBVdGlsaXRpZXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuZnVuY3Rpb24gcGFkU3RhcnQodmFsLCBsZW4pIHtcbiAgICB2YXIgcyA9IFN0cmluZyh2YWwpO1xuICAgIHJldHVybiAnMDAwJy5zdWJzdHIoMCwgbGVuIC0gcy5sZW5ndGgpICsgcztcbn1cbmZ1bmN0aW9uIGZvcm1hdFdpdGhPcmRpbmFscyhmb3JtYXR0ZXIsIGFyZ3MsIGZhbGxiYWNrVGV4dCkge1xuICAgIGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXR0ZXIuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmb3JtYXR0ZXIgPT09ICdzdHJpbmcnKSB7IC8vIG5vbi1ibGFuayBzdHJpbmdcbiAgICAgICAgcmV0dXJuIGFyZ3MucmVkdWNlKGZ1bmN0aW9uIChzdHIsIGFyZywgaW5kZXgpIHsgcmV0dXJuIChzdHIucmVwbGFjZSgnJCcgKyBpbmRleCwgYXJnIHx8ICcnKSk7IH0sIGZvcm1hdHRlcik7XG4gICAgfVxuICAgIHJldHVybiBmYWxsYmFja1RleHQ7XG59XG4vKiBOdW1iZXIgVXRpbGl0aWVzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmZ1bmN0aW9uIGNvbXBhcmVOdW1iZXJzKGEsIGIpIHtcbiAgICByZXR1cm4gYSAtIGI7XG59XG5mdW5jdGlvbiBpc0ludChuKSB7XG4gICAgcmV0dXJuIG4gJSAxID09PSAwO1xufVxuLyogRkMtc3BlY2lmaWMgRE9NIGRpbWVuc2lvbiBzdHVmZlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5mdW5jdGlvbiBjb21wdXRlU21hbGxlc3RDZWxsV2lkdGgoY2VsbEVsKSB7XG4gICAgdmFyIGFsbFdpZHRoRWwgPSBjZWxsRWwucXVlcnlTZWxlY3RvcignLmZjLXNjcm9sbGdyaWQtc2hyaW5rLWZyYW1lJyk7XG4gICAgdmFyIGNvbnRlbnRXaWR0aEVsID0gY2VsbEVsLnF1ZXJ5U2VsZWN0b3IoJy5mYy1zY3JvbGxncmlkLXNocmluay1jdXNoaW9uJyk7XG4gICAgaWYgKCFhbGxXaWR0aEVsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbmVlZHMgZmMtc2Nyb2xsZ3JpZC1zaHJpbmstZnJhbWUgY2xhc3NOYW1lJyk7IC8vIFRPRE86IHVzZSBjb25zdFxuICAgIH1cbiAgICBpZiAoIWNvbnRlbnRXaWR0aEVsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbmVlZHMgZmMtc2Nyb2xsZ3JpZC1zaHJpbmstY3VzaGlvbiBjbGFzc05hbWUnKTtcbiAgICB9XG4gICAgcmV0dXJuIGNlbGxFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIGFsbFdpZHRoRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggKyAvLyB0aGUgY2VsbCBwYWRkaW5nK2JvcmRlclxuICAgICAgICBjb250ZW50V2lkdGhFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbn1cblxudmFyIERBWV9JRFMgPSBbJ3N1bicsICdtb24nLCAndHVlJywgJ3dlZCcsICd0aHUnLCAnZnJpJywgJ3NhdCddO1xuLy8gQWRkaW5nXG5mdW5jdGlvbiBhZGRXZWVrcyhtLCBuKSB7XG4gICAgdmFyIGEgPSBkYXRlVG9VdGNBcnJheShtKTtcbiAgICBhWzJdICs9IG4gKiA3O1xuICAgIHJldHVybiBhcnJheVRvVXRjRGF0ZShhKTtcbn1cbmZ1bmN0aW9uIGFkZERheXMobSwgbikge1xuICAgIHZhciBhID0gZGF0ZVRvVXRjQXJyYXkobSk7XG4gICAgYVsyXSArPSBuO1xuICAgIHJldHVybiBhcnJheVRvVXRjRGF0ZShhKTtcbn1cbmZ1bmN0aW9uIGFkZE1zKG0sIG4pIHtcbiAgICB2YXIgYSA9IGRhdGVUb1V0Y0FycmF5KG0pO1xuICAgIGFbNl0gKz0gbjtcbiAgICByZXR1cm4gYXJyYXlUb1V0Y0RhdGUoYSk7XG59XG4vLyBEaWZmaW5nIChhbGwgcmV0dXJuIGZsb2F0cylcbi8vIFRPRE86IHdoeSBub3QgdXNlIHJhbmdlcz9cbmZ1bmN0aW9uIGRpZmZXZWVrcyhtMCwgbTEpIHtcbiAgICByZXR1cm4gZGlmZkRheXMobTAsIG0xKSAvIDc7XG59XG5mdW5jdGlvbiBkaWZmRGF5cyhtMCwgbTEpIHtcbiAgICByZXR1cm4gKG0xLnZhbHVlT2YoKSAtIG0wLnZhbHVlT2YoKSkgLyAoMTAwMCAqIDYwICogNjAgKiAyNCk7XG59XG5mdW5jdGlvbiBkaWZmSG91cnMobTAsIG0xKSB7XG4gICAgcmV0dXJuIChtMS52YWx1ZU9mKCkgLSBtMC52YWx1ZU9mKCkpIC8gKDEwMDAgKiA2MCAqIDYwKTtcbn1cbmZ1bmN0aW9uIGRpZmZNaW51dGVzKG0wLCBtMSkge1xuICAgIHJldHVybiAobTEudmFsdWVPZigpIC0gbTAudmFsdWVPZigpKSAvICgxMDAwICogNjApO1xufVxuZnVuY3Rpb24gZGlmZlNlY29uZHMobTAsIG0xKSB7XG4gICAgcmV0dXJuIChtMS52YWx1ZU9mKCkgLSBtMC52YWx1ZU9mKCkpIC8gMTAwMDtcbn1cbmZ1bmN0aW9uIGRpZmZEYXlBbmRUaW1lKG0wLCBtMSkge1xuICAgIHZhciBtMGRheSA9IHN0YXJ0T2ZEYXkobTApO1xuICAgIHZhciBtMWRheSA9IHN0YXJ0T2ZEYXkobTEpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHllYXJzOiAwLFxuICAgICAgICBtb250aHM6IDAsXG4gICAgICAgIGRheXM6IE1hdGgucm91bmQoZGlmZkRheXMobTBkYXksIG0xZGF5KSksXG4gICAgICAgIG1pbGxpc2Vjb25kczogKG0xLnZhbHVlT2YoKSAtIG0xZGF5LnZhbHVlT2YoKSkgLSAobTAudmFsdWVPZigpIC0gbTBkYXkudmFsdWVPZigpKSxcbiAgICB9O1xufVxuLy8gRGlmZmluZyBXaG9sZSBVbml0c1xuZnVuY3Rpb24gZGlmZldob2xlV2Vla3MobTAsIG0xKSB7XG4gICAgdmFyIGQgPSBkaWZmV2hvbGVEYXlzKG0wLCBtMSk7XG4gICAgaWYgKGQgIT09IG51bGwgJiYgZCAlIDcgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGQgLyA3O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGRpZmZXaG9sZURheXMobTAsIG0xKSB7XG4gICAgaWYgKHRpbWVBc01zKG0wKSA9PT0gdGltZUFzTXMobTEpKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGRpZmZEYXlzKG0wLCBtMSkpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8vIFN0YXJ0LU9mXG5mdW5jdGlvbiBzdGFydE9mRGF5KG0pIHtcbiAgICByZXR1cm4gYXJyYXlUb1V0Y0RhdGUoW1xuICAgICAgICBtLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgICAgIG0uZ2V0VVRDTW9udGgoKSxcbiAgICAgICAgbS5nZXRVVENEYXRlKCksXG4gICAgXSk7XG59XG5mdW5jdGlvbiBzdGFydE9mSG91cihtKSB7XG4gICAgcmV0dXJuIGFycmF5VG9VdGNEYXRlKFtcbiAgICAgICAgbS5nZXRVVENGdWxsWWVhcigpLFxuICAgICAgICBtLmdldFVUQ01vbnRoKCksXG4gICAgICAgIG0uZ2V0VVRDRGF0ZSgpLFxuICAgICAgICBtLmdldFVUQ0hvdXJzKCksXG4gICAgXSk7XG59XG5mdW5jdGlvbiBzdGFydE9mTWludXRlKG0pIHtcbiAgICByZXR1cm4gYXJyYXlUb1V0Y0RhdGUoW1xuICAgICAgICBtLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgICAgIG0uZ2V0VVRDTW9udGgoKSxcbiAgICAgICAgbS5nZXRVVENEYXRlKCksXG4gICAgICAgIG0uZ2V0VVRDSG91cnMoKSxcbiAgICAgICAgbS5nZXRVVENNaW51dGVzKCksXG4gICAgXSk7XG59XG5mdW5jdGlvbiBzdGFydE9mU2Vjb25kKG0pIHtcbiAgICByZXR1cm4gYXJyYXlUb1V0Y0RhdGUoW1xuICAgICAgICBtLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgICAgIG0uZ2V0VVRDTW9udGgoKSxcbiAgICAgICAgbS5nZXRVVENEYXRlKCksXG4gICAgICAgIG0uZ2V0VVRDSG91cnMoKSxcbiAgICAgICAgbS5nZXRVVENNaW51dGVzKCksXG4gICAgICAgIG0uZ2V0VVRDU2Vjb25kcygpLFxuICAgIF0pO1xufVxuLy8gV2VlayBDb21wdXRhdGlvblxuZnVuY3Rpb24gd2Vla09mWWVhcihtYXJrZXIsIGRvdywgZG95KSB7XG4gICAgdmFyIHkgPSBtYXJrZXIuZ2V0VVRDRnVsbFllYXIoKTtcbiAgICB2YXIgdyA9IHdlZWtPZkdpdmVuWWVhcihtYXJrZXIsIHksIGRvdywgZG95KTtcbiAgICBpZiAodyA8IDEpIHtcbiAgICAgICAgcmV0dXJuIHdlZWtPZkdpdmVuWWVhcihtYXJrZXIsIHkgLSAxLCBkb3csIGRveSk7XG4gICAgfVxuICAgIHZhciBuZXh0VyA9IHdlZWtPZkdpdmVuWWVhcihtYXJrZXIsIHkgKyAxLCBkb3csIGRveSk7XG4gICAgaWYgKG5leHRXID49IDEpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKHcsIG5leHRXKTtcbiAgICB9XG4gICAgcmV0dXJuIHc7XG59XG5mdW5jdGlvbiB3ZWVrT2ZHaXZlblllYXIobWFya2VyLCB5ZWFyLCBkb3csIGRveSkge1xuICAgIHZhciBmaXJzdFdlZWtTdGFydCA9IGFycmF5VG9VdGNEYXRlKFt5ZWFyLCAwLCAxICsgZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KV0pO1xuICAgIHZhciBkYXlTdGFydCA9IHN0YXJ0T2ZEYXkobWFya2VyKTtcbiAgICB2YXIgZGF5cyA9IE1hdGgucm91bmQoZGlmZkRheXMoZmlyc3RXZWVrU3RhcnQsIGRheVN0YXJ0KSk7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoZGF5cyAvIDcpICsgMTsgLy8gemVyby1pbmRleGVkXG59XG4vLyBzdGFydC1vZi1maXJzdC13ZWVrIC0gc3RhcnQtb2YteWVhclxuZnVuY3Rpb24gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSB7XG4gICAgLy8gZmlyc3Qtd2VlayBkYXkgLS0gd2hpY2ggamFudWFyeSBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IHdlZWsgKDQgZm9yIGlzbywgMSBmb3Igb3RoZXIpXG4gICAgdmFyIGZ3ZCA9IDcgKyBkb3cgLSBkb3k7XG4gICAgLy8gZmlyc3Qtd2VlayBkYXkgbG9jYWwgd2Vla2RheSAtLSB3aGljaCBsb2NhbCB3ZWVrZGF5IGlzIGZ3ZFxuICAgIHZhciBmd2RsdyA9ICg3ICsgYXJyYXlUb1V0Y0RhdGUoW3llYXIsIDAsIGZ3ZF0pLmdldFVUQ0RheSgpIC0gZG93KSAlIDc7XG4gICAgcmV0dXJuIC1md2RsdyArIGZ3ZCAtIDE7XG59XG4vLyBBcnJheSBDb252ZXJzaW9uXG5mdW5jdGlvbiBkYXRlVG9Mb2NhbEFycmF5KGRhdGUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIGRhdGUuZ2V0TW9udGgoKSxcbiAgICAgICAgZGF0ZS5nZXREYXRlKCksXG4gICAgICAgIGRhdGUuZ2V0SG91cnMoKSxcbiAgICAgICAgZGF0ZS5nZXRNaW51dGVzKCksXG4gICAgICAgIGRhdGUuZ2V0U2Vjb25kcygpLFxuICAgICAgICBkYXRlLmdldE1pbGxpc2Vjb25kcygpLFxuICAgIF07XG59XG5mdW5jdGlvbiBhcnJheVRvTG9jYWxEYXRlKGEpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoYVswXSwgYVsxXSB8fCAwLCBhWzJdID09IG51bGwgPyAxIDogYVsyXSwgLy8gZGF5IG9mIG1vbnRoXG4gICAgYVszXSB8fCAwLCBhWzRdIHx8IDAsIGFbNV0gfHwgMCk7XG59XG5mdW5jdGlvbiBkYXRlVG9VdGNBcnJheShkYXRlKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgZGF0ZS5nZXRVVENGdWxsWWVhcigpLFxuICAgICAgICBkYXRlLmdldFVUQ01vbnRoKCksXG4gICAgICAgIGRhdGUuZ2V0VVRDRGF0ZSgpLFxuICAgICAgICBkYXRlLmdldFVUQ0hvdXJzKCksXG4gICAgICAgIGRhdGUuZ2V0VVRDTWludXRlcygpLFxuICAgICAgICBkYXRlLmdldFVUQ1NlY29uZHMoKSxcbiAgICAgICAgZGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKSxcbiAgICBdO1xufVxuZnVuY3Rpb24gYXJyYXlUb1V0Y0RhdGUoYSkge1xuICAgIC8vIGFjY29yZGluZyB0byB3ZWIgc3RhbmRhcmRzIChhbmQgU2FmYXJpKSwgYSBtb250aCBpbmRleCBpcyByZXF1aXJlZC5cbiAgICAvLyBtYXNzYWdlIGlmIG9ubHkgZ2l2ZW4gYSB5ZWFyLlxuICAgIGlmIChhLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBhID0gYS5jb25jYXQoWzBdKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDLmFwcGx5KERhdGUsIGEpKTtcbn1cbi8vIE90aGVyIFV0aWxzXG5mdW5jdGlvbiBpc1ZhbGlkRGF0ZShtKSB7XG4gICAgcmV0dXJuICFpc05hTihtLnZhbHVlT2YoKSk7XG59XG5mdW5jdGlvbiB0aW1lQXNNcyhtKSB7XG4gICAgcmV0dXJuIG0uZ2V0VVRDSG91cnMoKSAqIDEwMDAgKiA2MCAqIDYwICtcbiAgICAgICAgbS5nZXRVVENNaW51dGVzKCkgKiAxMDAwICogNjAgK1xuICAgICAgICBtLmdldFVUQ1NlY29uZHMoKSAqIDEwMDAgK1xuICAgICAgICBtLmdldFVUQ01pbGxpc2Vjb25kcygpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVFdmVudEluc3RhbmNlKGRlZklkLCByYW5nZSwgZm9yY2VkU3RhcnRUem8sIGZvcmNlZEVuZFR6bykge1xuICAgIHJldHVybiB7XG4gICAgICAgIGluc3RhbmNlSWQ6IGd1aWQoKSxcbiAgICAgICAgZGVmSWQ6IGRlZklkLFxuICAgICAgICByYW5nZTogcmFuZ2UsXG4gICAgICAgIGZvcmNlZFN0YXJ0VHpvOiBmb3JjZWRTdGFydFR6byA9PSBudWxsID8gbnVsbCA6IGZvcmNlZFN0YXJ0VHpvLFxuICAgICAgICBmb3JjZWRFbmRUem86IGZvcmNlZEVuZFR6byA9PSBudWxsID8gbnVsbCA6IGZvcmNlZEVuZFR6byxcbiAgICB9O1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuLy8gTWVyZ2VzIGFuIGFycmF5IG9mIG9iamVjdHMgaW50byBhIHNpbmdsZSBvYmplY3QuXG4vLyBUaGUgc2Vjb25kIGFyZ3VtZW50IGFsbG93cyBmb3IgYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgd2hvJ3Mgb2JqZWN0IHZhbHVlcyB3aWxsIGJlIG1lcmdlZCB0b2dldGhlci5cbmZ1bmN0aW9uIG1lcmdlUHJvcHMocHJvcE9ianMsIGNvbXBsZXhQcm9wc01hcCkge1xuICAgIHZhciBkZXN0ID0ge307XG4gICAgaWYgKGNvbXBsZXhQcm9wc01hcCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lXzEgaW4gY29tcGxleFByb3BzTWFwKSB7XG4gICAgICAgICAgICB2YXIgY29tcGxleE9ianMgPSBbXTtcbiAgICAgICAgICAgIC8vIGNvbGxlY3QgdGhlIHRyYWlsaW5nIG9iamVjdCB2YWx1ZXMsIHN0b3BwaW5nIHdoZW4gYSBub24tb2JqZWN0IGlzIGRpc2NvdmVyZWRcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBwcm9wT2Jqcy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgICAgICAgICAgIHZhciB2YWwgPSBwcm9wT2Jqc1tpXVtuYW1lXzFdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwpIHsgLy8gbm9uLW51bGwgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXhPYmpzLnVuc2hpZnQodmFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzdFtuYW1lXzFdID0gdmFsOyAvLyBpZiB0aGVyZSB3ZXJlIG5vIG9iamVjdHMsIHRoaXMgdmFsdWUgd2lsbCBiZSB1c2VkXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIHRoZSB0cmFpbGluZyB2YWx1ZXMgd2VyZSBvYmplY3RzLCB1c2UgdGhlIG1lcmdlZCB2YWx1ZVxuICAgICAgICAgICAgaWYgKGNvbXBsZXhPYmpzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGRlc3RbbmFtZV8xXSA9IG1lcmdlUHJvcHMoY29tcGxleE9ianMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGNvcHkgdmFsdWVzIGludG8gdGhlIGRlc3RpbmF0aW9uLCBnb2luZyBmcm9tIGxhc3QgdG8gZmlyc3RcbiAgICBmb3IgKHZhciBpID0gcHJvcE9ianMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgICAgdmFyIHByb3BzID0gcHJvcE9ianNbaV07XG4gICAgICAgIGZvciAodmFyIG5hbWVfMiBpbiBwcm9wcykge1xuICAgICAgICAgICAgaWYgKCEobmFtZV8yIGluIGRlc3QpKSB7IC8vIGlmIGFscmVhZHkgYXNzaWduZWQgYnkgcHJldmlvdXMgcHJvcHMgb3IgY29tcGxleCBwcm9wcywgZG9uJ3QgcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBkZXN0W25hbWVfMl0gPSBwcm9wc1tuYW1lXzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZXN0O1xufVxuZnVuY3Rpb24gZmlsdGVySGFzaChoYXNoLCBmdW5jKSB7XG4gICAgdmFyIGZpbHRlcmVkID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIGhhc2gpIHtcbiAgICAgICAgaWYgKGZ1bmMoaGFzaFtrZXldLCBrZXkpKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZFtrZXldID0gaGFzaFtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaWx0ZXJlZDtcbn1cbmZ1bmN0aW9uIG1hcEhhc2goaGFzaCwgZnVuYykge1xuICAgIHZhciBuZXdIYXNoID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIGhhc2gpIHtcbiAgICAgICAgbmV3SGFzaFtrZXldID0gZnVuYyhoYXNoW2tleV0sIGtleSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdIYXNoO1xufVxuZnVuY3Rpb24gYXJyYXlUb0hhc2goYSkge1xuICAgIHZhciBoYXNoID0ge307XG4gICAgZm9yICh2YXIgX2kgPSAwLCBhXzEgPSBhOyBfaSA8IGFfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBhXzFbX2ldO1xuICAgICAgICBoYXNoW2l0ZW1dID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc2g7XG59XG5mdW5jdGlvbiBidWlsZEhhc2hGcm9tQXJyYXkoYSwgZnVuYykge1xuICAgIHZhciBoYXNoID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciB0dXBsZSA9IGZ1bmMoYVtpXSwgaSk7XG4gICAgICAgIGhhc2hbdHVwbGVbMF1dID0gdHVwbGVbMV07XG4gICAgfVxuICAgIHJldHVybiBoYXNoO1xufVxuZnVuY3Rpb24gaGFzaFZhbHVlc1RvQXJyYXkob2JqKSB7XG4gICAgdmFyIGEgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGEucHVzaChvYmpba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiBhO1xufVxuZnVuY3Rpb24gaXNQcm9wc0VxdWFsKG9iajAsIG9iajEpIHtcbiAgICBpZiAob2JqMCA9PT0gb2JqMSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZm9yICh2YXIga2V5IGluIG9iajApIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqMCwga2V5KSkge1xuICAgICAgICAgICAgaWYgKCEoa2V5IGluIG9iajEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGtleSBpbiBvYmoxKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iajEsIGtleSkpIHtcbiAgICAgICAgICAgIGlmIChvYmowW2tleV0gIT09IG9iajFba2V5XSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGdldFVuZXF1YWxQcm9wcyhvYmowLCBvYmoxKSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqMCkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmowLCBrZXkpKSB7XG4gICAgICAgICAgICBpZiAoIShrZXkgaW4gb2JqMSkpIHtcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqMSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmoxLCBrZXkpKSB7XG4gICAgICAgICAgICBpZiAob2JqMFtrZXldICE9PSBvYmoxW2tleV0pIHtcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5cztcbn1cbmZ1bmN0aW9uIGNvbXBhcmVPYmpzKG9sZFByb3BzLCBuZXdQcm9wcywgZXF1YWxpdHlGdW5jcykge1xuICAgIGlmIChlcXVhbGl0eUZ1bmNzID09PSB2b2lkIDApIHsgZXF1YWxpdHlGdW5jcyA9IHt9OyB9XG4gICAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZm9yICh2YXIga2V5IGluIG5ld1Byb3BzKSB7XG4gICAgICAgIGlmIChrZXkgaW4gb2xkUHJvcHMgJiYgaXNPYmpWYWxzRXF1YWwob2xkUHJvcHNba2V5XSwgbmV3UHJvcHNba2V5XSwgZXF1YWxpdHlGdW5jc1trZXldKSkgO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBjaGVjayBmb3IgcHJvcHMgdGhhdCB3ZXJlIG9taXR0ZWQgaW4gdGhlIG5ld1xuICAgIGZvciAodmFyIGtleSBpbiBvbGRQcm9wcykge1xuICAgICAgICBpZiAoIShrZXkgaW4gbmV3UHJvcHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vKlxuYXNzdW1lZCBcInRydWVcIiBlcXVhbGl0eSBmb3IgaGFuZGxlciBuYW1lcyBsaWtlIFwib25SZWNlaXZlU29tZXRoaW5nXCJcbiovXG5mdW5jdGlvbiBpc09ialZhbHNFcXVhbCh2YWwwLCB2YWwxLCBjb21wYXJhdG9yKSB7XG4gICAgaWYgKHZhbDAgPT09IHZhbDEgfHwgY29tcGFyYXRvciA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IodmFsMCwgdmFsMSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNvbGxlY3RGcm9tSGFzaChoYXNoLCBzdGFydEluZGV4LCBlbmRJbmRleCwgc3RlcCkge1xuICAgIGlmIChzdGFydEluZGV4ID09PSB2b2lkIDApIHsgc3RhcnRJbmRleCA9IDA7IH1cbiAgICBpZiAoc3RlcCA9PT0gdm9pZCAwKSB7IHN0ZXAgPSAxOyB9XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGlmIChlbmRJbmRleCA9PSBudWxsKSB7XG4gICAgICAgIGVuZEluZGV4ID0gT2JqZWN0LmtleXMoaGFzaCkubGVuZ3RoO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IGVuZEluZGV4OyBpICs9IHN0ZXApIHtcbiAgICAgICAgdmFyIHZhbCA9IGhhc2hbaV07XG4gICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkgeyAvLyB3aWxsIGRpc3JlZ2FyZCB1bmRlZmluZWQgZm9yIHNwYXJzZSBhcnJheXNcbiAgICAgICAgICAgIHJlcy5wdXNoKHZhbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gcGFyc2VSZWN1cnJpbmcocmVmaW5lZCwgZGVmYXVsdEFsbERheSwgZGF0ZUVudiwgcmVjdXJyaW5nVHlwZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlY3VycmluZ1R5cGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBwYXJzZWQgPSByZWN1cnJpbmdUeXBlc1tpXS5wYXJzZShyZWZpbmVkLCBkYXRlRW52KTtcbiAgICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICAgICAgdmFyIGFsbERheSA9IHJlZmluZWQuYWxsRGF5O1xuICAgICAgICAgICAgaWYgKGFsbERheSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYWxsRGF5ID0gZGVmYXVsdEFsbERheTtcbiAgICAgICAgICAgICAgICBpZiAoYWxsRGF5ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsRGF5ID0gcGFyc2VkLmFsbERheUd1ZXNzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsRGF5ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbERheSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhbGxEYXk6IGFsbERheSxcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogcGFyc2VkLmR1cmF0aW9uLFxuICAgICAgICAgICAgICAgIHR5cGVEYXRhOiBwYXJzZWQudHlwZURhdGEsXG4gICAgICAgICAgICAgICAgdHlwZUlkOiBpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGV4cGFuZFJlY3VycmluZyhldmVudFN0b3JlLCBmcmFtaW5nUmFuZ2UsIGNvbnRleHQpIHtcbiAgICB2YXIgZGF0ZUVudiA9IGNvbnRleHQuZGF0ZUVudiwgcGx1Z2luSG9va3MgPSBjb250ZXh0LnBsdWdpbkhvb2tzLCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zO1xuICAgIHZhciBkZWZzID0gZXZlbnRTdG9yZS5kZWZzLCBpbnN0YW5jZXMgPSBldmVudFN0b3JlLmluc3RhbmNlcztcbiAgICAvLyByZW1vdmUgZXhpc3RpbmcgcmVjdXJyaW5nIGluc3RhbmNlc1xuICAgIC8vIFRPRE86IGJhZC4gYWx3YXlzIGV4cGFuZCBldmVudHMgYXMgYSBzZWNvbmQgc3RlcFxuICAgIGluc3RhbmNlcyA9IGZpbHRlckhhc2goaW5zdGFuY2VzLCBmdW5jdGlvbiAoaW5zdGFuY2UpIHsgcmV0dXJuICFkZWZzW2luc3RhbmNlLmRlZklkXS5yZWN1cnJpbmdEZWY7IH0pO1xuICAgIGZvciAodmFyIGRlZklkIGluIGRlZnMpIHtcbiAgICAgICAgdmFyIGRlZiA9IGRlZnNbZGVmSWRdO1xuICAgICAgICBpZiAoZGVmLnJlY3VycmluZ0RlZikge1xuICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gZGVmLnJlY3VycmluZ0RlZi5kdXJhdGlvbjtcbiAgICAgICAgICAgIGlmICghZHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGRlZi5hbGxEYXkgP1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmRlZmF1bHRBbGxEYXlFdmVudER1cmF0aW9uIDpcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kZWZhdWx0VGltZWRFdmVudER1cmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHN0YXJ0cyA9IGV4cGFuZFJlY3VycmluZ1JhbmdlcyhkZWYsIGR1cmF0aW9uLCBmcmFtaW5nUmFuZ2UsIGRhdGVFbnYsIHBsdWdpbkhvb2tzLnJlY3VycmluZ1R5cGVzKTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgc3RhcnRzXzEgPSBzdGFydHM7IF9pIDwgc3RhcnRzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc3RhcnRzXzFbX2ldO1xuICAgICAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGNyZWF0ZUV2ZW50SW5zdGFuY2UoZGVmSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IGRhdGVFbnYuYWRkKHN0YXJ0LCBkdXJhdGlvbiksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VzW2luc3RhbmNlLmluc3RhbmNlSWRdID0gaW5zdGFuY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgZGVmczogZGVmcywgaW5zdGFuY2VzOiBpbnN0YW5jZXMgfTtcbn1cbi8qXG5FdmVudCBNVVNUIGhhdmUgYSByZWN1cnJpbmdEZWZcbiovXG5mdW5jdGlvbiBleHBhbmRSZWN1cnJpbmdSYW5nZXMoZXZlbnREZWYsIGR1cmF0aW9uLCBmcmFtaW5nUmFuZ2UsIGRhdGVFbnYsIHJlY3VycmluZ1R5cGVzKSB7XG4gICAgdmFyIHR5cGVEZWYgPSByZWN1cnJpbmdUeXBlc1tldmVudERlZi5yZWN1cnJpbmdEZWYudHlwZUlkXTtcbiAgICB2YXIgbWFya2VycyA9IHR5cGVEZWYuZXhwYW5kKGV2ZW50RGVmLnJlY3VycmluZ0RlZi50eXBlRGF0YSwge1xuICAgICAgICBzdGFydDogZGF0ZUVudi5zdWJ0cmFjdChmcmFtaW5nUmFuZ2Uuc3RhcnQsIGR1cmF0aW9uKSxcbiAgICAgICAgZW5kOiBmcmFtaW5nUmFuZ2UuZW5kLFxuICAgIH0sIGRhdGVFbnYpO1xuICAgIC8vIHRoZSByZWN1cnJlbmNlIHBsdWdpbnMgZG9uJ3QgZ3VhcmFudGVlIHRoYXQgYWxsLWRheSBldmVudHMgYXJlIHN0YXJ0LW9mLWRheSwgc28gd2UgaGF2ZSB0b1xuICAgIGlmIChldmVudERlZi5hbGxEYXkpIHtcbiAgICAgICAgbWFya2VycyA9IG1hcmtlcnMubWFwKHN0YXJ0T2ZEYXkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFya2Vycztcbn1cblxudmFyIElOVEVSTkFMX1VOSVRTID0gWyd5ZWFycycsICdtb250aHMnLCAnZGF5cycsICdtaWxsaXNlY29uZHMnXTtcbnZhciBQQVJTRV9SRSA9IC9eKC0/KSg/OihcXGQrKVxcLik/KFxcZCspOihcXGRcXGQpKD86OihcXGRcXGQpKD86XFwuKFxcZFxcZFxcZCkpPyk/Lztcbi8vIFBhcnNpbmcgYW5kIENyZWF0aW9uXG5mdW5jdGlvbiBjcmVhdGVEdXJhdGlvbihpbnB1dCwgdW5pdCkge1xuICAgIHZhciBfYTtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gcGFyc2VTdHJpbmcoaW5wdXQpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJiBpbnB1dCkgeyAvLyBub24tbnVsbCBvYmplY3RcbiAgICAgICAgcmV0dXJuIHBhcnNlT2JqZWN0KGlucHV0KTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlT2JqZWN0KChfYSA9IHt9LCBfYVt1bml0IHx8ICdtaWxsaXNlY29uZHMnXSA9IGlucHV0LCBfYSkpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHBhcnNlU3RyaW5nKHMpIHtcbiAgICB2YXIgbSA9IFBBUlNFX1JFLmV4ZWMocyk7XG4gICAgaWYgKG0pIHtcbiAgICAgICAgdmFyIHNpZ24gPSBtWzFdID8gLTEgOiAxO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeWVhcnM6IDAsXG4gICAgICAgICAgICBtb250aHM6IDAsXG4gICAgICAgICAgICBkYXlzOiBzaWduICogKG1bMl0gPyBwYXJzZUludChtWzJdLCAxMCkgOiAwKSxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kczogc2lnbiAqICgobVszXSA/IHBhcnNlSW50KG1bM10sIDEwKSA6IDApICogNjAgKiA2MCAqIDEwMDAgKyAvLyBob3Vyc1xuICAgICAgICAgICAgICAgIChtWzRdID8gcGFyc2VJbnQobVs0XSwgMTApIDogMCkgKiA2MCAqIDEwMDAgKyAvLyBtaW51dGVzXG4gICAgICAgICAgICAgICAgKG1bNV0gPyBwYXJzZUludChtWzVdLCAxMCkgOiAwKSAqIDEwMDAgKyAvLyBzZWNvbmRzXG4gICAgICAgICAgICAgICAgKG1bNl0gPyBwYXJzZUludChtWzZdLCAxMCkgOiAwKSAvLyBtc1xuICAgICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBwYXJzZU9iamVjdChvYmopIHtcbiAgICB2YXIgZHVyYXRpb24gPSB7XG4gICAgICAgIHllYXJzOiBvYmoueWVhcnMgfHwgb2JqLnllYXIgfHwgMCxcbiAgICAgICAgbW9udGhzOiBvYmoubW9udGhzIHx8IG9iai5tb250aCB8fCAwLFxuICAgICAgICBkYXlzOiBvYmouZGF5cyB8fCBvYmouZGF5IHx8IDAsXG4gICAgICAgIG1pbGxpc2Vjb25kczogKG9iai5ob3VycyB8fCBvYmouaG91ciB8fCAwKSAqIDYwICogNjAgKiAxMDAwICsgLy8gaG91cnNcbiAgICAgICAgICAgIChvYmoubWludXRlcyB8fCBvYmoubWludXRlIHx8IDApICogNjAgKiAxMDAwICsgLy8gbWludXRlc1xuICAgICAgICAgICAgKG9iai5zZWNvbmRzIHx8IG9iai5zZWNvbmQgfHwgMCkgKiAxMDAwICsgLy8gc2Vjb25kc1xuICAgICAgICAgICAgKG9iai5taWxsaXNlY29uZHMgfHwgb2JqLm1pbGxpc2Vjb25kIHx8IG9iai5tcyB8fCAwKSwgLy8gbXNcbiAgICB9O1xuICAgIHZhciB3ZWVrcyA9IG9iai53ZWVrcyB8fCBvYmoud2VlaztcbiAgICBpZiAod2Vla3MpIHtcbiAgICAgICAgZHVyYXRpb24uZGF5cyArPSB3ZWVrcyAqIDc7XG4gICAgICAgIGR1cmF0aW9uLnNwZWNpZmllZFdlZWtzID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGR1cmF0aW9uO1xufVxuLy8gRXF1YWxpdHlcbmZ1bmN0aW9uIGR1cmF0aW9uc0VxdWFsKGQwLCBkMSkge1xuICAgIHJldHVybiBkMC55ZWFycyA9PT0gZDEueWVhcnMgJiZcbiAgICAgICAgZDAubW9udGhzID09PSBkMS5tb250aHMgJiZcbiAgICAgICAgZDAuZGF5cyA9PT0gZDEuZGF5cyAmJlxuICAgICAgICBkMC5taWxsaXNlY29uZHMgPT09IGQxLm1pbGxpc2Vjb25kcztcbn1cbmZ1bmN0aW9uIGFzQ2xlYW5EYXlzKGR1cikge1xuICAgIGlmICghZHVyLnllYXJzICYmICFkdXIubW9udGhzICYmICFkdXIubWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHJldHVybiBkdXIuZGF5cztcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59XG4vLyBTaW1wbGUgTWF0aFxuZnVuY3Rpb24gYWRkRHVyYXRpb25zKGQwLCBkMSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHllYXJzOiBkMC55ZWFycyArIGQxLnllYXJzLFxuICAgICAgICBtb250aHM6IGQwLm1vbnRocyArIGQxLm1vbnRocyxcbiAgICAgICAgZGF5czogZDAuZGF5cyArIGQxLmRheXMsXG4gICAgICAgIG1pbGxpc2Vjb25kczogZDAubWlsbGlzZWNvbmRzICsgZDEubWlsbGlzZWNvbmRzLFxuICAgIH07XG59XG5mdW5jdGlvbiBzdWJ0cmFjdER1cmF0aW9ucyhkMSwgZDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB5ZWFyczogZDEueWVhcnMgLSBkMC55ZWFycyxcbiAgICAgICAgbW9udGhzOiBkMS5tb250aHMgLSBkMC5tb250aHMsXG4gICAgICAgIGRheXM6IGQxLmRheXMgLSBkMC5kYXlzLFxuICAgICAgICBtaWxsaXNlY29uZHM6IGQxLm1pbGxpc2Vjb25kcyAtIGQwLm1pbGxpc2Vjb25kcyxcbiAgICB9O1xufVxuZnVuY3Rpb24gbXVsdGlwbHlEdXJhdGlvbihkLCBuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeWVhcnM6IGQueWVhcnMgKiBuLFxuICAgICAgICBtb250aHM6IGQubW9udGhzICogbixcbiAgICAgICAgZGF5czogZC5kYXlzICogbixcbiAgICAgICAgbWlsbGlzZWNvbmRzOiBkLm1pbGxpc2Vjb25kcyAqIG4sXG4gICAgfTtcbn1cbi8vIENvbnZlcnNpb25zXG4vLyBcIlJvdWdoXCIgYmVjYXVzZSB0aGV5IGFyZSBiYXNlZCBvbiBhdmVyYWdlLWNhc2UgR3JlZ29yaWFuIG1vbnRocy95ZWFyc1xuZnVuY3Rpb24gYXNSb3VnaFllYXJzKGR1cikge1xuICAgIHJldHVybiBhc1JvdWdoRGF5cyhkdXIpIC8gMzY1O1xufVxuZnVuY3Rpb24gYXNSb3VnaE1vbnRocyhkdXIpIHtcbiAgICByZXR1cm4gYXNSb3VnaERheXMoZHVyKSAvIDMwO1xufVxuZnVuY3Rpb24gYXNSb3VnaERheXMoZHVyKSB7XG4gICAgcmV0dXJuIGFzUm91Z2hNcyhkdXIpIC8gODY0ZTU7XG59XG5mdW5jdGlvbiBhc1JvdWdoTWludXRlcyhkdXIpIHtcbiAgICByZXR1cm4gYXNSb3VnaE1zKGR1cikgLyAoMTAwMCAqIDYwKTtcbn1cbmZ1bmN0aW9uIGFzUm91Z2hTZWNvbmRzKGR1cikge1xuICAgIHJldHVybiBhc1JvdWdoTXMoZHVyKSAvIDEwMDA7XG59XG5mdW5jdGlvbiBhc1JvdWdoTXMoZHVyKSB7XG4gICAgcmV0dXJuIGR1ci55ZWFycyAqICgzNjUgKiA4NjRlNSkgK1xuICAgICAgICBkdXIubW9udGhzICogKDMwICogODY0ZTUpICtcbiAgICAgICAgZHVyLmRheXMgKiA4NjRlNSArXG4gICAgICAgIGR1ci5taWxsaXNlY29uZHM7XG59XG4vLyBBZHZhbmNlZCBNYXRoXG5mdW5jdGlvbiB3aG9sZURpdmlkZUR1cmF0aW9ucyhudW1lcmF0b3IsIGRlbm9taW5hdG9yKSB7XG4gICAgdmFyIHJlcyA9IG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBJTlRFUk5BTF9VTklUUy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgdW5pdCA9IElOVEVSTkFMX1VOSVRTW2ldO1xuICAgICAgICBpZiAoZGVub21pbmF0b3JbdW5pdF0pIHtcbiAgICAgICAgICAgIHZhciBsb2NhbFJlcyA9IG51bWVyYXRvclt1bml0XSAvIGRlbm9taW5hdG9yW3VuaXRdO1xuICAgICAgICAgICAgaWYgKCFpc0ludChsb2NhbFJlcykgfHwgKHJlcyAhPT0gbnVsbCAmJiByZXMgIT09IGxvY2FsUmVzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzID0gbG9jYWxSZXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobnVtZXJhdG9yW3VuaXRdKSB7XG4gICAgICAgICAgICAvLyBuZWVkcyB0byBkaXZpZGUgYnkgc29tZXRoaW5nIGJ1dCBjYW4ndCFcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBncmVhdGVzdER1cmF0aW9uRGVub21pbmF0b3IoZHVyKSB7XG4gICAgdmFyIG1zID0gZHVyLm1pbGxpc2Vjb25kcztcbiAgICBpZiAobXMpIHtcbiAgICAgICAgaWYgKG1zICUgMTAwMCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdW5pdDogJ21pbGxpc2Vjb25kJywgdmFsdWU6IG1zIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1zICUgKDEwMDAgKiA2MCkgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVuaXQ6ICdzZWNvbmQnLCB2YWx1ZTogbXMgLyAxMDAwIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1zICUgKDEwMDAgKiA2MCAqIDYwKSAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdW5pdDogJ21pbnV0ZScsIHZhbHVlOiBtcyAvICgxMDAwICogNjApIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1zKSB7XG4gICAgICAgICAgICByZXR1cm4geyB1bml0OiAnaG91cicsIHZhbHVlOiBtcyAvICgxMDAwICogNjAgKiA2MCkgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZHVyLmRheXMpIHtcbiAgICAgICAgaWYgKGR1ci5zcGVjaWZpZWRXZWVrcyAmJiBkdXIuZGF5cyAlIDcgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVuaXQ6ICd3ZWVrJywgdmFsdWU6IGR1ci5kYXlzIC8gNyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHVuaXQ6ICdkYXknLCB2YWx1ZTogZHVyLmRheXMgfTtcbiAgICB9XG4gICAgaWYgKGR1ci5tb250aHMpIHtcbiAgICAgICAgcmV0dXJuIHsgdW5pdDogJ21vbnRoJywgdmFsdWU6IGR1ci5tb250aHMgfTtcbiAgICB9XG4gICAgaWYgKGR1ci55ZWFycykge1xuICAgICAgICByZXR1cm4geyB1bml0OiAneWVhcicsIHZhbHVlOiBkdXIueWVhcnMgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdW5pdDogJ21pbGxpc2Vjb25kJywgdmFsdWU6IDAgfTtcbn1cblxuLy8gdGltZVpvbmVPZmZzZXQgaXMgaW4gbWludXRlc1xuZnVuY3Rpb24gYnVpbGRJc29TdHJpbmcobWFya2VyLCB0aW1lWm9uZU9mZnNldCwgc3RyaXBaZXJvVGltZSkge1xuICAgIGlmIChzdHJpcFplcm9UaW1lID09PSB2b2lkIDApIHsgc3RyaXBaZXJvVGltZSA9IGZhbHNlOyB9XG4gICAgdmFyIHMgPSBtYXJrZXIudG9JU09TdHJpbmcoKTtcbiAgICBzID0gcy5yZXBsYWNlKCcuMDAwJywgJycpO1xuICAgIGlmIChzdHJpcFplcm9UaW1lKSB7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoJ1QwMDowMDowMFonLCAnJyk7XG4gICAgfVxuICAgIGlmIChzLmxlbmd0aCA+IDEwKSB7IC8vIHRpbWUgcGFydCB3YXNuJ3Qgc3RyaXBwZWQsIGNhbiBhZGQgdGltZXpvbmUgaW5mb1xuICAgICAgICBpZiAodGltZVpvbmVPZmZzZXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgnWicsICcnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aW1lWm9uZU9mZnNldCAhPT0gMCkge1xuICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgnWicsIGZvcm1hdFRpbWVab25lT2Zmc2V0KHRpbWVab25lT2Zmc2V0LCB0cnVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBpdHMgVVRDLTAgYW5kIHdlIHdhbnQgdG8ga2VlcCB0aGUgWlxuICAgIH1cbiAgICByZXR1cm4gcztcbn1cbi8vIGZvcm1hdHMgdGhlIGRhdGUsIGJ1dCB3aXRoIG5vIHRpbWUgcGFydFxuLy8gVE9ETzogc29tZWhvdyBtZXJnZSB3aXRoIGJ1aWxkSXNvU3RyaW5nIGFuZCBzdHJpcFplcm9UaW1lXG4vLyBUT0RPOiByZW5hbWUuIG9taXQgXCJzdHJpbmdcIlxuZnVuY3Rpb24gZm9ybWF0RGF5U3RyaW5nKG1hcmtlcikge1xuICAgIHJldHVybiBtYXJrZXIudG9JU09TdHJpbmcoKS5yZXBsYWNlKC9ULiokLywgJycpO1xufVxuLy8gVE9ETzogdXNlIERhdGU6OnRvSVNPU3RyaW5nIGFuZCB1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgVD9cbmZ1bmN0aW9uIGZvcm1hdElzb1RpbWVTdHJpbmcobWFya2VyKSB7XG4gICAgcmV0dXJuIHBhZFN0YXJ0KG1hcmtlci5nZXRVVENIb3VycygpLCAyKSArICc6JyArXG4gICAgICAgIHBhZFN0YXJ0KG1hcmtlci5nZXRVVENNaW51dGVzKCksIDIpICsgJzonICtcbiAgICAgICAgcGFkU3RhcnQobWFya2VyLmdldFVUQ1NlY29uZHMoKSwgMik7XG59XG5mdW5jdGlvbiBmb3JtYXRUaW1lWm9uZU9mZnNldChtaW51dGVzLCBkb0lzbykge1xuICAgIGlmIChkb0lzbyA9PT0gdm9pZCAwKSB7IGRvSXNvID0gZmFsc2U7IH1cbiAgICB2YXIgc2lnbiA9IG1pbnV0ZXMgPCAwID8gJy0nIDogJysnO1xuICAgIHZhciBhYnMgPSBNYXRoLmFicyhtaW51dGVzKTtcbiAgICB2YXIgaG91cnMgPSBNYXRoLmZsb29yKGFicyAvIDYwKTtcbiAgICB2YXIgbWlucyA9IE1hdGgucm91bmQoYWJzICUgNjApO1xuICAgIGlmIChkb0lzbykge1xuICAgICAgICByZXR1cm4gc2lnbiArIHBhZFN0YXJ0KGhvdXJzLCAyKSArIFwiOlwiICsgcGFkU3RhcnQobWlucywgMik7XG4gICAgfVxuICAgIHJldHVybiBcIkdNVFwiICsgc2lnbiArIGhvdXJzICsgKG1pbnMgPyBcIjpcIiArIHBhZFN0YXJ0KG1pbnMsIDIpIDogJycpO1xufVxuXG4vLyBUT0RPOiBuZXcgdXRpbCBhcnJheWlmeT9cbmZ1bmN0aW9uIHJlbW92ZUV4YWN0KGFycmF5LCBleGFjdFZhbCkge1xuICAgIHZhciByZW1vdmVDbnQgPSAwO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGFycmF5Lmxlbmd0aCkge1xuICAgICAgICBpZiAoYXJyYXlbaV0gPT09IGV4YWN0VmFsKSB7XG4gICAgICAgICAgICBhcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICByZW1vdmVDbnQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVtb3ZlQ250O1xufVxuZnVuY3Rpb24gaXNBcnJheXNFcXVhbChhMCwgYTEsIGVxdWFsaXR5RnVuYykge1xuICAgIGlmIChhMCA9PT0gYTEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBsZW4gPSBhMC5sZW5ndGg7XG4gICAgdmFyIGk7XG4gICAgaWYgKGxlbiAhPT0gYTEubGVuZ3RoKSB7IC8vIG5vdCBhcnJheT8gb3Igbm90IHNhbWUgbGVuZ3RoP1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICBpZiAoIShlcXVhbGl0eUZ1bmMgPyBlcXVhbGl0eUZ1bmMoYTBbaV0sIGExW2ldKSA6IGEwW2ldID09PSBhMVtpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbWVtb2l6ZSh3b3JrZXJGdW5jLCByZXNFcXVhbGl0eSwgdGVhcmRvd25GdW5jKSB7XG4gICAgdmFyIGN1cnJlbnRBcmdzO1xuICAgIHZhciBjdXJyZW50UmVzO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBuZXdBcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBuZXdBcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjdXJyZW50QXJncykge1xuICAgICAgICAgICAgY3VycmVudFJlcyA9IHdvcmtlckZ1bmMuYXBwbHkodGhpcywgbmV3QXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWlzQXJyYXlzRXF1YWwoY3VycmVudEFyZ3MsIG5ld0FyZ3MpKSB7XG4gICAgICAgICAgICBpZiAodGVhcmRvd25GdW5jKSB7XG4gICAgICAgICAgICAgICAgdGVhcmRvd25GdW5jKGN1cnJlbnRSZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlcyA9IHdvcmtlckZ1bmMuYXBwbHkodGhpcywgbmV3QXJncyk7XG4gICAgICAgICAgICBpZiAoIXJlc0VxdWFsaXR5IHx8ICFyZXNFcXVhbGl0eShyZXMsIGN1cnJlbnRSZXMpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFJlcyA9IHJlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50QXJncyA9IG5ld0FyZ3M7XG4gICAgICAgIHJldHVybiBjdXJyZW50UmVzO1xuICAgIH07XG59XG5mdW5jdGlvbiBtZW1vaXplT2JqQXJnKHdvcmtlckZ1bmMsIHJlc0VxdWFsaXR5LCB0ZWFyZG93bkZ1bmMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBjdXJyZW50QXJnO1xuICAgIHZhciBjdXJyZW50UmVzO1xuICAgIHJldHVybiBmdW5jdGlvbiAobmV3QXJnKSB7XG4gICAgICAgIGlmICghY3VycmVudEFyZykge1xuICAgICAgICAgICAgY3VycmVudFJlcyA9IHdvcmtlckZ1bmMuY2FsbChfdGhpcywgbmV3QXJnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaXNQcm9wc0VxdWFsKGN1cnJlbnRBcmcsIG5ld0FyZykpIHtcbiAgICAgICAgICAgIGlmICh0ZWFyZG93bkZ1bmMpIHtcbiAgICAgICAgICAgICAgICB0ZWFyZG93bkZ1bmMoY3VycmVudFJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcmVzID0gd29ya2VyRnVuYy5jYWxsKF90aGlzLCBuZXdBcmcpO1xuICAgICAgICAgICAgaWYgKCFyZXNFcXVhbGl0eSB8fCAhcmVzRXF1YWxpdHkocmVzLCBjdXJyZW50UmVzKSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRSZXMgPSByZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudEFyZyA9IG5ld0FyZztcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXM7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG1lbW9pemVBcnJheWxpa2UoLy8gdXNlZCBhdCBhbGw/XG53b3JrZXJGdW5jLCByZXNFcXVhbGl0eSwgdGVhcmRvd25GdW5jKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICB2YXIgY3VycmVudEFyZ1NldHMgPSBbXTtcbiAgICB2YXIgY3VycmVudFJlc3VsdHMgPSBbXTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG5ld0FyZ1NldHMpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRMZW4gPSBjdXJyZW50QXJnU2V0cy5sZW5ndGg7XG4gICAgICAgIHZhciBuZXdMZW4gPSBuZXdBcmdTZXRzLmxlbmd0aDtcbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICBmb3IgKDsgaSA8IGN1cnJlbnRMZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKCFuZXdBcmdTZXRzW2ldKSB7IC8vIG9uZSBvZiB0aGUgb2xkIHNldHMgbm8gbG9uZ2VyIGV4aXN0c1xuICAgICAgICAgICAgICAgIGlmICh0ZWFyZG93bkZ1bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVhcmRvd25GdW5jKGN1cnJlbnRSZXN1bHRzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghaXNBcnJheXNFcXVhbChjdXJyZW50QXJnU2V0c1tpXSwgbmV3QXJnU2V0c1tpXSkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGVhcmRvd25GdW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlYXJkb3duRnVuYyhjdXJyZW50UmVzdWx0c1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciByZXMgPSB3b3JrZXJGdW5jLmFwcGx5KF90aGlzLCBuZXdBcmdTZXRzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc0VxdWFsaXR5IHx8ICFyZXNFcXVhbGl0eShyZXMsIGN1cnJlbnRSZXN1bHRzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVzdWx0c1tpXSA9IHJlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7IGkgPCBuZXdMZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgY3VycmVudFJlc3VsdHNbaV0gPSB3b3JrZXJGdW5jLmFwcGx5KF90aGlzLCBuZXdBcmdTZXRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50QXJnU2V0cyA9IG5ld0FyZ1NldHM7XG4gICAgICAgIGN1cnJlbnRSZXN1bHRzLnNwbGljZShuZXdMZW4pOyAvLyByZW1vdmUgZXhjZXNzXG4gICAgICAgIHJldHVybiBjdXJyZW50UmVzdWx0cztcbiAgICB9O1xufVxuZnVuY3Rpb24gbWVtb2l6ZUhhc2hsaWtlKHdvcmtlckZ1bmMsIHJlc0VxdWFsaXR5LCB0ZWFyZG93bkZ1bmMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBjdXJyZW50QXJnSGFzaCA9IHt9O1xuICAgIHZhciBjdXJyZW50UmVzSGFzaCA9IHt9O1xuICAgIHJldHVybiBmdW5jdGlvbiAobmV3QXJnSGFzaCkge1xuICAgICAgICB2YXIgbmV3UmVzSGFzaCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gbmV3QXJnSGFzaCkge1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50UmVzSGFzaFtrZXldKSB7XG4gICAgICAgICAgICAgICAgbmV3UmVzSGFzaFtrZXldID0gd29ya2VyRnVuYy5hcHBseShfdGhpcywgbmV3QXJnSGFzaFtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFpc0FycmF5c0VxdWFsKGN1cnJlbnRBcmdIYXNoW2tleV0sIG5ld0FyZ0hhc2hba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGVhcmRvd25GdW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlYXJkb3duRnVuYyhjdXJyZW50UmVzSGFzaFtrZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHJlcyA9IHdvcmtlckZ1bmMuYXBwbHkoX3RoaXMsIG5ld0FyZ0hhc2hba2V5XSk7XG4gICAgICAgICAgICAgICAgbmV3UmVzSGFzaFtrZXldID0gKHJlc0VxdWFsaXR5ICYmIHJlc0VxdWFsaXR5KHJlcywgY3VycmVudFJlc0hhc2hba2V5XSkpXG4gICAgICAgICAgICAgICAgICAgID8gY3VycmVudFJlc0hhc2hba2V5XVxuICAgICAgICAgICAgICAgICAgICA6IHJlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1Jlc0hhc2hba2V5XSA9IGN1cnJlbnRSZXNIYXNoW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudEFyZ0hhc2ggPSBuZXdBcmdIYXNoO1xuICAgICAgICBjdXJyZW50UmVzSGFzaCA9IG5ld1Jlc0hhc2g7XG4gICAgICAgIHJldHVybiBuZXdSZXNIYXNoO1xuICAgIH07XG59XG5cbnZhciBFWFRFTkRFRF9TRVRUSU5HU19BTkRfU0VWRVJJVElFUyA9IHtcbiAgICB3ZWVrOiAzLFxuICAgIHNlcGFyYXRvcjogMCxcbiAgICBvbWl0WmVyb01pbnV0ZTogMCxcbiAgICBtZXJpZGllbTogMCxcbiAgICBvbWl0Q29tbWFzOiAwLFxufTtcbnZhciBTVEFOREFSRF9EQVRFX1BST1BfU0VWRVJJVElFUyA9IHtcbiAgICB0aW1lWm9uZU5hbWU6IDcsXG4gICAgZXJhOiA2LFxuICAgIHllYXI6IDUsXG4gICAgbW9udGg6IDQsXG4gICAgZGF5OiAyLFxuICAgIHdlZWtkYXk6IDIsXG4gICAgaG91cjogMSxcbiAgICBtaW51dGU6IDEsXG4gICAgc2Vjb25kOiAxLFxufTtcbnZhciBNRVJJRElFTV9SRSA9IC9cXHMqKFthcF0pXFwuP21cXC4/L2k7IC8vIGVhdHMgdXAgbGVhZGluZyBzcGFjZXMgdG9vXG52YXIgQ09NTUFfUkUgPSAvLC9nOyAvLyB3ZSBuZWVkIHJlIGZvciBnbG9iYWxuZXNzXG52YXIgTVVMVElfU1BBQ0VfUkUgPSAvXFxzKy9nO1xudmFyIExUUl9SRSA9IC9cXHUyMDBlL2c7IC8vIGNvbnRyb2wgY2hhcmFjdGVyXG52YXIgVVRDX1JFID0gL1VUQ3xHTVQvO1xudmFyIE5hdGl2ZUZvcm1hdHRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOYXRpdmVGb3JtYXR0ZXIoZm9ybWF0U2V0dGluZ3MpIHtcbiAgICAgICAgdmFyIHN0YW5kYXJkRGF0ZVByb3BzID0ge307XG4gICAgICAgIHZhciBleHRlbmRlZFNldHRpbmdzID0ge307XG4gICAgICAgIHZhciBzZXZlcml0eSA9IDA7XG4gICAgICAgIGZvciAodmFyIG5hbWVfMSBpbiBmb3JtYXRTZXR0aW5ncykge1xuICAgICAgICAgICAgaWYgKG5hbWVfMSBpbiBFWFRFTkRFRF9TRVRUSU5HU19BTkRfU0VWRVJJVElFUykge1xuICAgICAgICAgICAgICAgIGV4dGVuZGVkU2V0dGluZ3NbbmFtZV8xXSA9IGZvcm1hdFNldHRpbmdzW25hbWVfMV07XG4gICAgICAgICAgICAgICAgc2V2ZXJpdHkgPSBNYXRoLm1heChFWFRFTkRFRF9TRVRUSU5HU19BTkRfU0VWRVJJVElFU1tuYW1lXzFdLCBzZXZlcml0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGFuZGFyZERhdGVQcm9wc1tuYW1lXzFdID0gZm9ybWF0U2V0dGluZ3NbbmFtZV8xXTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZV8xIGluIFNUQU5EQVJEX0RBVEVfUFJPUF9TRVZFUklUSUVTKSB7IC8vIFRPRE86IHdoYXQgYWJvdXQgaG91cjEyPyBubyBzZXZlcml0eVxuICAgICAgICAgICAgICAgICAgICBzZXZlcml0eSA9IE1hdGgubWF4KFNUQU5EQVJEX0RBVEVfUFJPUF9TRVZFUklUSUVTW25hbWVfMV0sIHNldmVyaXR5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGFuZGFyZERhdGVQcm9wcyA9IHN0YW5kYXJkRGF0ZVByb3BzO1xuICAgICAgICB0aGlzLmV4dGVuZGVkU2V0dGluZ3MgPSBleHRlbmRlZFNldHRpbmdzO1xuICAgICAgICB0aGlzLnNldmVyaXR5ID0gc2V2ZXJpdHk7XG4gICAgICAgIHRoaXMuYnVpbGRGb3JtYXR0aW5nRnVuYyA9IG1lbW9pemUoYnVpbGRGb3JtYXR0aW5nRnVuYyk7XG4gICAgfVxuICAgIE5hdGl2ZUZvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gKGRhdGUsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRGb3JtYXR0aW5nRnVuYyh0aGlzLnN0YW5kYXJkRGF0ZVByb3BzLCB0aGlzLmV4dGVuZGVkU2V0dGluZ3MsIGNvbnRleHQpKGRhdGUpO1xuICAgIH07XG4gICAgTmF0aXZlRm9ybWF0dGVyLnByb3RvdHlwZS5mb3JtYXRSYW5nZSA9IGZ1bmN0aW9uIChzdGFydCwgZW5kLCBjb250ZXh0LCBiZXR0ZXJEZWZhdWx0U2VwYXJhdG9yKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHN0YW5kYXJkRGF0ZVByb3BzID0gX2Euc3RhbmRhcmREYXRlUHJvcHMsIGV4dGVuZGVkU2V0dGluZ3MgPSBfYS5leHRlbmRlZFNldHRpbmdzO1xuICAgICAgICB2YXIgZGlmZlNldmVyaXR5ID0gY29tcHV0ZU1hcmtlckRpZmZTZXZlcml0eShzdGFydC5tYXJrZXIsIGVuZC5tYXJrZXIsIGNvbnRleHQuY2FsZW5kYXJTeXN0ZW0pO1xuICAgICAgICBpZiAoIWRpZmZTZXZlcml0eSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KHN0YXJ0LCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYmlnZ2VzdFVuaXRGb3JQYXJ0aWFsID0gZGlmZlNldmVyaXR5O1xuICAgICAgICBpZiAoYmlnZ2VzdFVuaXRGb3JQYXJ0aWFsID4gMSAmJiAvLyB0aGUgdHdvIGRhdGVzIGFyZSBkaWZmZXJlbnQgaW4gYSB3YXkgdGhhdCdzIGxhcmdlciBzY2FsZSB0aGFuIHRpbWVcbiAgICAgICAgICAgIChzdGFuZGFyZERhdGVQcm9wcy55ZWFyID09PSAnbnVtZXJpYycgfHwgc3RhbmRhcmREYXRlUHJvcHMueWVhciA9PT0gJzItZGlnaXQnKSAmJlxuICAgICAgICAgICAgKHN0YW5kYXJkRGF0ZVByb3BzLm1vbnRoID09PSAnbnVtZXJpYycgfHwgc3RhbmRhcmREYXRlUHJvcHMubW9udGggPT09ICcyLWRpZ2l0JykgJiZcbiAgICAgICAgICAgIChzdGFuZGFyZERhdGVQcm9wcy5kYXkgPT09ICdudW1lcmljJyB8fCBzdGFuZGFyZERhdGVQcm9wcy5kYXkgPT09ICcyLWRpZ2l0JykpIHtcbiAgICAgICAgICAgIGJpZ2dlc3RVbml0Rm9yUGFydGlhbCA9IDE7IC8vIG1ha2UgaXQgbG9vayBsaWtlIHRoZSBkYXRlcyBhcmUgb25seSBkaWZmZXJlbnQgaW4gdGVybXMgb2YgdGltZVxuICAgICAgICB9XG4gICAgICAgIHZhciBmdWxsMCA9IHRoaXMuZm9ybWF0KHN0YXJ0LCBjb250ZXh0KTtcbiAgICAgICAgdmFyIGZ1bGwxID0gdGhpcy5mb3JtYXQoZW5kLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGZ1bGwwID09PSBmdWxsMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bGwwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJ0aWFsRGF0ZVByb3BzID0gY29tcHV0ZVBhcnRpYWxGb3JtYXR0aW5nT3B0aW9ucyhzdGFuZGFyZERhdGVQcm9wcywgYmlnZ2VzdFVuaXRGb3JQYXJ0aWFsKTtcbiAgICAgICAgdmFyIHBhcnRpYWxGb3JtYXR0aW5nRnVuYyA9IGJ1aWxkRm9ybWF0dGluZ0Z1bmMocGFydGlhbERhdGVQcm9wcywgZXh0ZW5kZWRTZXR0aW5ncywgY29udGV4dCk7XG4gICAgICAgIHZhciBwYXJ0aWFsMCA9IHBhcnRpYWxGb3JtYXR0aW5nRnVuYyhzdGFydCk7XG4gICAgICAgIHZhciBwYXJ0aWFsMSA9IHBhcnRpYWxGb3JtYXR0aW5nRnVuYyhlbmQpO1xuICAgICAgICB2YXIgaW5zZXJ0aW9uID0gZmluZENvbW1vbkluc2VydGlvbihmdWxsMCwgcGFydGlhbDAsIGZ1bGwxLCBwYXJ0aWFsMSk7XG4gICAgICAgIHZhciBzZXBhcmF0b3IgPSBleHRlbmRlZFNldHRpbmdzLnNlcGFyYXRvciB8fCBiZXR0ZXJEZWZhdWx0U2VwYXJhdG9yIHx8IGNvbnRleHQuZGVmYXVsdFNlcGFyYXRvciB8fCAnJztcbiAgICAgICAgaWYgKGluc2VydGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGluc2VydGlvbi5iZWZvcmUgKyBwYXJ0aWFsMCArIHNlcGFyYXRvciArIHBhcnRpYWwxICsgaW5zZXJ0aW9uLmFmdGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdWxsMCArIHNlcGFyYXRvciArIGZ1bGwxO1xuICAgIH07XG4gICAgTmF0aXZlRm9ybWF0dGVyLnByb3RvdHlwZS5nZXRMYXJnZXN0VW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnNldmVyaXR5KSB7XG4gICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICd5ZWFyJztcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21vbnRoJztcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3dlZWsnO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZGF5JztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICd0aW1lJzsgLy8gcmVhbGx5P1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gTmF0aXZlRm9ybWF0dGVyO1xufSgpKTtcbmZ1bmN0aW9uIGJ1aWxkRm9ybWF0dGluZ0Z1bmMoc3RhbmRhcmREYXRlUHJvcHMsIGV4dGVuZGVkU2V0dGluZ3MsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhbmRhcmREYXRlUHJvcENudCA9IE9iamVjdC5rZXlzKHN0YW5kYXJkRGF0ZVByb3BzKS5sZW5ndGg7XG4gICAgaWYgKHN0YW5kYXJkRGF0ZVByb3BDbnQgPT09IDEgJiYgc3RhbmRhcmREYXRlUHJvcHMudGltZVpvbmVOYW1lID09PSAnc2hvcnQnKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZGF0ZSkgeyByZXR1cm4gKGZvcm1hdFRpbWVab25lT2Zmc2V0KGRhdGUudGltZVpvbmVPZmZzZXQpKTsgfTtcbiAgICB9XG4gICAgaWYgKHN0YW5kYXJkRGF0ZVByb3BDbnQgPT09IDAgJiYgZXh0ZW5kZWRTZXR0aW5ncy53ZWVrKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZGF0ZSkgeyByZXR1cm4gKGZvcm1hdFdlZWtOdW1iZXIoY29udGV4dC5jb21wdXRlV2Vla051bWJlcihkYXRlLm1hcmtlciksIGNvbnRleHQud2Vla1RleHQsIGNvbnRleHQud2Vla1RleHRMb25nLCBjb250ZXh0LmxvY2FsZSwgZXh0ZW5kZWRTZXR0aW5ncy53ZWVrKSk7IH07XG4gICAgfVxuICAgIHJldHVybiBidWlsZE5hdGl2ZUZvcm1hdHRpbmdGdW5jKHN0YW5kYXJkRGF0ZVByb3BzLCBleHRlbmRlZFNldHRpbmdzLCBjb250ZXh0KTtcbn1cbmZ1bmN0aW9uIGJ1aWxkTmF0aXZlRm9ybWF0dGluZ0Z1bmMoc3RhbmRhcmREYXRlUHJvcHMsIGV4dGVuZGVkU2V0dGluZ3MsIGNvbnRleHQpIHtcbiAgICBzdGFuZGFyZERhdGVQcm9wcyA9IHRzbGliLl9fYXNzaWduKHt9LCBzdGFuZGFyZERhdGVQcm9wcyk7IC8vIGNvcHlcbiAgICBleHRlbmRlZFNldHRpbmdzID0gdHNsaWIuX19hc3NpZ24oe30sIGV4dGVuZGVkU2V0dGluZ3MpOyAvLyBjb3B5XG4gICAgc2FuaXRpemVTZXR0aW5ncyhzdGFuZGFyZERhdGVQcm9wcywgZXh0ZW5kZWRTZXR0aW5ncyk7XG4gICAgc3RhbmRhcmREYXRlUHJvcHMudGltZVpvbmUgPSAnVVRDJzsgLy8gd2UgbGV2ZXJhZ2UgdGhlIG9ubHkgZ3VhcmFudGVlZCB0aW1lWm9uZSBmb3Igb3VyIFVUQyBtYXJrZXJzXG4gICAgdmFyIG5vcm1hbEZvcm1hdCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGNvbnRleHQubG9jYWxlLmNvZGVzLCBzdGFuZGFyZERhdGVQcm9wcyk7XG4gICAgdmFyIHplcm9Gb3JtYXQ7IC8vIG5lZWRlZD9cbiAgICBpZiAoZXh0ZW5kZWRTZXR0aW5ncy5vbWl0WmVyb01pbnV0ZSkge1xuICAgICAgICB2YXIgemVyb1Byb3BzID0gdHNsaWIuX19hc3NpZ24oe30sIHN0YW5kYXJkRGF0ZVByb3BzKTtcbiAgICAgICAgZGVsZXRlIHplcm9Qcm9wcy5taW51dGU7IC8vIHNlY29uZHMgYW5kIG1zIHdlcmUgYWxyZWFkeSBjb25zaWRlcmVkIGluIHNhbml0aXplU2V0dGluZ3NcbiAgICAgICAgemVyb0Zvcm1hdCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGNvbnRleHQubG9jYWxlLmNvZGVzLCB6ZXJvUHJvcHMpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgdmFyIG1hcmtlciA9IGRhdGUubWFya2VyO1xuICAgICAgICB2YXIgZm9ybWF0O1xuICAgICAgICBpZiAoemVyb0Zvcm1hdCAmJiAhbWFya2VyLmdldFVUQ01pbnV0ZXMoKSkge1xuICAgICAgICAgICAgZm9ybWF0ID0gemVyb0Zvcm1hdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IG5vcm1hbEZvcm1hdDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcyA9IGZvcm1hdC5mb3JtYXQobWFya2VyKTtcbiAgICAgICAgcmV0dXJuIHBvc3RQcm9jZXNzKHMsIGRhdGUsIHN0YW5kYXJkRGF0ZVByb3BzLCBleHRlbmRlZFNldHRpbmdzLCBjb250ZXh0KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gc2FuaXRpemVTZXR0aW5ncyhzdGFuZGFyZERhdGVQcm9wcywgZXh0ZW5kZWRTZXR0aW5ncykge1xuICAgIC8vIGRlYWwgd2l0aCBhIGJyb3dzZXIgaW5jb25zaXN0ZW5jeSB3aGVyZSBmb3JtYXR0aW5nIHRoZSB0aW1lem9uZVxuICAgIC8vIHJlcXVpcmVzIHRoYXQgdGhlIGhvdXIvbWludXRlIGJlIHByZXNlbnQuXG4gICAgaWYgKHN0YW5kYXJkRGF0ZVByb3BzLnRpbWVab25lTmFtZSkge1xuICAgICAgICBpZiAoIXN0YW5kYXJkRGF0ZVByb3BzLmhvdXIpIHtcbiAgICAgICAgICAgIHN0YW5kYXJkRGF0ZVByb3BzLmhvdXIgPSAnMi1kaWdpdCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdGFuZGFyZERhdGVQcm9wcy5taW51dGUpIHtcbiAgICAgICAgICAgIHN0YW5kYXJkRGF0ZVByb3BzLm1pbnV0ZSA9ICcyLWRpZ2l0JztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBvbmx5IHN1cHBvcnQgc2hvcnQgdGltZXpvbmUgbmFtZXNcbiAgICBpZiAoc3RhbmRhcmREYXRlUHJvcHMudGltZVpvbmVOYW1lID09PSAnbG9uZycpIHtcbiAgICAgICAgc3RhbmRhcmREYXRlUHJvcHMudGltZVpvbmVOYW1lID0gJ3Nob3J0JztcbiAgICB9XG4gICAgLy8gaWYgcmVxdWVzdGluZyB0byBkaXNwbGF5IHNlY29uZHMsIE1VU1QgZGlzcGxheSBtaW51dGVzXG4gICAgaWYgKGV4dGVuZGVkU2V0dGluZ3Mub21pdFplcm9NaW51dGUgJiYgKHN0YW5kYXJkRGF0ZVByb3BzLnNlY29uZCB8fCBzdGFuZGFyZERhdGVQcm9wcy5taWxsaXNlY29uZCkpIHtcbiAgICAgICAgZGVsZXRlIGV4dGVuZGVkU2V0dGluZ3Mub21pdFplcm9NaW51dGU7XG4gICAgfVxufVxuZnVuY3Rpb24gcG9zdFByb2Nlc3MocywgZGF0ZSwgc3RhbmRhcmREYXRlUHJvcHMsIGV4dGVuZGVkU2V0dGluZ3MsIGNvbnRleHQpIHtcbiAgICBzID0gcy5yZXBsYWNlKExUUl9SRSwgJycpOyAvLyByZW1vdmUgbGVmdC10by1yaWdodCBjb250cm9sIGNoYXJzLiBkbyBmaXJzdC4gZ29vZCBmb3Igb3RoZXIgcmVnZXhlc1xuICAgIGlmIChzdGFuZGFyZERhdGVQcm9wcy50aW1lWm9uZU5hbWUgPT09ICdzaG9ydCcpIHtcbiAgICAgICAgcyA9IGluamVjdFR6b1N0cihzLCAoY29udGV4dC50aW1lWm9uZSA9PT0gJ1VUQycgfHwgZGF0ZS50aW1lWm9uZU9mZnNldCA9PSBudWxsKSA/XG4gICAgICAgICAgICAnVVRDJyA6IC8vIGltcG9ydGFudCB0byBub3JtYWxpemUgZm9yIElFLCB3aGljaCBkb2VzIFwiR01UXCJcbiAgICAgICAgICAgIGZvcm1hdFRpbWVab25lT2Zmc2V0KGRhdGUudGltZVpvbmVPZmZzZXQpKTtcbiAgICB9XG4gICAgaWYgKGV4dGVuZGVkU2V0dGluZ3Mub21pdENvbW1hcykge1xuICAgICAgICBzID0gcy5yZXBsYWNlKENPTU1BX1JFLCAnJykudHJpbSgpO1xuICAgIH1cbiAgICBpZiAoZXh0ZW5kZWRTZXR0aW5ncy5vbWl0WmVyb01pbnV0ZSkge1xuICAgICAgICBzID0gcy5yZXBsYWNlKCc6MDAnLCAnJyk7IC8vIHplcm9Gb3JtYXQgZG9lc24ndCBhbHdheXMgYWNoaWV2ZSB0aGlzXG4gICAgfVxuICAgIC8vIF4gZG8gYW55dGhpbmcgdGhhdCBtaWdodCBjcmVhdGUgYWRqYWNlbnQgc3BhY2VzIGJlZm9yZSB0aGlzIHBvaW50LFxuICAgIC8vIGJlY2F1c2UgTUVSSURJRU1fUkUgbGlrZXMgdG8gZWF0IHVwIGxvYWRpbmcgc3BhY2VzXG4gICAgaWYgKGV4dGVuZGVkU2V0dGluZ3MubWVyaWRpZW0gPT09IGZhbHNlKSB7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoTUVSSURJRU1fUkUsICcnKS50cmltKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV4dGVuZGVkU2V0dGluZ3MubWVyaWRpZW0gPT09ICduYXJyb3cnKSB7IC8vIGEvcFxuICAgICAgICBzID0gcy5yZXBsYWNlKE1FUklESUVNX1JFLCBmdW5jdGlvbiAobTAsIG0xKSB7IHJldHVybiBtMS50b0xvY2FsZUxvd2VyQ2FzZSgpOyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXh0ZW5kZWRTZXR0aW5ncy5tZXJpZGllbSA9PT0gJ3Nob3J0JykgeyAvLyBhbS9wbVxuICAgICAgICBzID0gcy5yZXBsYWNlKE1FUklESUVNX1JFLCBmdW5jdGlvbiAobTAsIG0xKSB7IHJldHVybiBtMS50b0xvY2FsZUxvd2VyQ2FzZSgpICsgXCJtXCI7IH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChleHRlbmRlZFNldHRpbmdzLm1lcmlkaWVtID09PSAnbG93ZXJjYXNlJykgeyAvLyBvdGhlciBtZXJpZGllbSB0cmFuc2Zvcm1lcnMgYWxyZWFkeSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlXG4gICAgICAgIHMgPSBzLnJlcGxhY2UoTUVSSURJRU1fUkUsIGZ1bmN0aW9uIChtMCkgeyByZXR1cm4gbTAudG9Mb2NhbGVMb3dlckNhc2UoKTsgfSk7XG4gICAgfVxuICAgIHMgPSBzLnJlcGxhY2UoTVVMVElfU1BBQ0VfUkUsICcgJyk7XG4gICAgcyA9IHMudHJpbSgpO1xuICAgIHJldHVybiBzO1xufVxuZnVuY3Rpb24gaW5qZWN0VHpvU3RyKHMsIHR6b1N0cikge1xuICAgIHZhciByZXBsYWNlZCA9IGZhbHNlO1xuICAgIHMgPSBzLnJlcGxhY2UoVVRDX1JFLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJlcGxhY2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHR6b1N0cjtcbiAgICB9KTtcbiAgICAvLyBJRTExIGRvZXNuJ3QgaW5jbHVkZSBVVEMvR01UIGluIHRoZSBvcmlnaW5hbCBzdHJpbmcsIHNvIGFwcGVuZCB0byBlbmRcbiAgICBpZiAoIXJlcGxhY2VkKSB7XG4gICAgICAgIHMgKz0gXCIgXCIgKyB0em9TdHI7XG4gICAgfVxuICAgIHJldHVybiBzO1xufVxuZnVuY3Rpb24gZm9ybWF0V2Vla051bWJlcihudW0sIHdlZWtUZXh0LCB3ZWVrVGV4dExvbmcsIGxvY2FsZSwgZGlzcGxheSkge1xuICAgIHZhciBwYXJ0cyA9IFtdO1xuICAgIGlmIChkaXNwbGF5ID09PSAnbG9uZycpIHtcbiAgICAgICAgcGFydHMucHVzaCh3ZWVrVGV4dExvbmcpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkaXNwbGF5ID09PSAnc2hvcnQnIHx8IGRpc3BsYXkgPT09ICduYXJyb3cnKSB7XG4gICAgICAgIHBhcnRzLnB1c2god2Vla1RleHQpO1xuICAgIH1cbiAgICBpZiAoZGlzcGxheSA9PT0gJ2xvbmcnIHx8IGRpc3BsYXkgPT09ICdzaG9ydCcpIHtcbiAgICAgICAgcGFydHMucHVzaCgnICcpO1xuICAgIH1cbiAgICBwYXJ0cy5wdXNoKGxvY2FsZS5zaW1wbGVOdW1iZXJGb3JtYXQuZm9ybWF0KG51bSkpO1xuICAgIGlmIChsb2NhbGUub3B0aW9ucy5kaXJlY3Rpb24gPT09ICdydGwnKSB7IC8vIFRPRE86IHVzZSBjb250cm9sIGNoYXJhY3RlcnMgaW5zdGVhZD9cbiAgICAgICAgcGFydHMucmV2ZXJzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcGFydHMuam9pbignJyk7XG59XG4vLyBSYW5nZSBGb3JtYXR0aW5nIFV0aWxzXG4vLyAwID0gZXhhY3RseSB0aGUgc2FtZVxuLy8gMSA9IGRpZmZlcmVudCBieSB0aW1lXG4vLyBhbmQgYmlnZ2VyXG5mdW5jdGlvbiBjb21wdXRlTWFya2VyRGlmZlNldmVyaXR5KGQwLCBkMSwgY2EpIHtcbiAgICBpZiAoY2EuZ2V0TWFya2VyWWVhcihkMCkgIT09IGNhLmdldE1hcmtlclllYXIoZDEpKSB7XG4gICAgICAgIHJldHVybiA1O1xuICAgIH1cbiAgICBpZiAoY2EuZ2V0TWFya2VyTW9udGgoZDApICE9PSBjYS5nZXRNYXJrZXJNb250aChkMSkpIHtcbiAgICAgICAgcmV0dXJuIDQ7XG4gICAgfVxuICAgIGlmIChjYS5nZXRNYXJrZXJEYXkoZDApICE9PSBjYS5nZXRNYXJrZXJEYXkoZDEpKSB7XG4gICAgICAgIHJldHVybiAyO1xuICAgIH1cbiAgICBpZiAodGltZUFzTXMoZDApICE9PSB0aW1lQXNNcyhkMSkpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xufVxuZnVuY3Rpb24gY29tcHV0ZVBhcnRpYWxGb3JtYXR0aW5nT3B0aW9ucyhvcHRpb25zLCBiaWdnZXN0VW5pdCkge1xuICAgIHZhciBwYXJ0aWFsT3B0aW9ucyA9IHt9O1xuICAgIGZvciAodmFyIG5hbWVfMiBpbiBvcHRpb25zKSB7XG4gICAgICAgIGlmICghKG5hbWVfMiBpbiBTVEFOREFSRF9EQVRFX1BST1BfU0VWRVJJVElFUykgfHwgLy8gbm90IGEgZGF0ZSBwYXJ0IHByb3AgKGxpa2UgdGltZVpvbmUpXG4gICAgICAgICAgICBTVEFOREFSRF9EQVRFX1BST1BfU0VWRVJJVElFU1tuYW1lXzJdIDw9IGJpZ2dlc3RVbml0KSB7XG4gICAgICAgICAgICBwYXJ0aWFsT3B0aW9uc1tuYW1lXzJdID0gb3B0aW9uc1tuYW1lXzJdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJ0aWFsT3B0aW9ucztcbn1cbmZ1bmN0aW9uIGZpbmRDb21tb25JbnNlcnRpb24oZnVsbDAsIHBhcnRpYWwwLCBmdWxsMSwgcGFydGlhbDEpIHtcbiAgICB2YXIgaTAgPSAwO1xuICAgIHdoaWxlIChpMCA8IGZ1bGwwLmxlbmd0aCkge1xuICAgICAgICB2YXIgZm91bmQwID0gZnVsbDAuaW5kZXhPZihwYXJ0aWFsMCwgaTApO1xuICAgICAgICBpZiAoZm91bmQwID09PSAtMSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJlZm9yZTAgPSBmdWxsMC5zdWJzdHIoMCwgZm91bmQwKTtcbiAgICAgICAgaTAgPSBmb3VuZDAgKyBwYXJ0aWFsMC5sZW5ndGg7XG4gICAgICAgIHZhciBhZnRlcjAgPSBmdWxsMC5zdWJzdHIoaTApO1xuICAgICAgICB2YXIgaTEgPSAwO1xuICAgICAgICB3aGlsZSAoaTEgPCBmdWxsMS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBmb3VuZDEgPSBmdWxsMS5pbmRleE9mKHBhcnRpYWwxLCBpMSk7XG4gICAgICAgICAgICBpZiAoZm91bmQxID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGJlZm9yZTEgPSBmdWxsMS5zdWJzdHIoMCwgZm91bmQxKTtcbiAgICAgICAgICAgIGkxID0gZm91bmQxICsgcGFydGlhbDEubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIGFmdGVyMSA9IGZ1bGwxLnN1YnN0cihpMSk7XG4gICAgICAgICAgICBpZiAoYmVmb3JlMCA9PT0gYmVmb3JlMSAmJiBhZnRlcjAgPT09IGFmdGVyMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZTogYmVmb3JlMCxcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXI6IGFmdGVyMCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBleHBhbmRab25lZE1hcmtlcihkYXRlSW5mbywgY2FsZW5kYXJTeXN0ZW0pIHtcbiAgICB2YXIgYSA9IGNhbGVuZGFyU3lzdGVtLm1hcmtlclRvQXJyYXkoZGF0ZUluZm8ubWFya2VyKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBtYXJrZXI6IGRhdGVJbmZvLm1hcmtlcixcbiAgICAgICAgdGltZVpvbmVPZmZzZXQ6IGRhdGVJbmZvLnRpbWVab25lT2Zmc2V0LFxuICAgICAgICBhcnJheTogYSxcbiAgICAgICAgeWVhcjogYVswXSxcbiAgICAgICAgbW9udGg6IGFbMV0sXG4gICAgICAgIGRheTogYVsyXSxcbiAgICAgICAgaG91cjogYVszXSxcbiAgICAgICAgbWludXRlOiBhWzRdLFxuICAgICAgICBzZWNvbmQ6IGFbNV0sXG4gICAgICAgIG1pbGxpc2Vjb25kOiBhWzZdLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZlcmJvc2VGb3JtYXR0aW5nQXJnKHN0YXJ0LCBlbmQsIGNvbnRleHQsIGJldHRlckRlZmF1bHRTZXBhcmF0b3IpIHtcbiAgICB2YXIgc3RhcnRJbmZvID0gZXhwYW5kWm9uZWRNYXJrZXIoc3RhcnQsIGNvbnRleHQuY2FsZW5kYXJTeXN0ZW0pO1xuICAgIHZhciBlbmRJbmZvID0gZW5kID8gZXhwYW5kWm9uZWRNYXJrZXIoZW5kLCBjb250ZXh0LmNhbGVuZGFyU3lzdGVtKSA6IG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGF0ZTogc3RhcnRJbmZvLFxuICAgICAgICBzdGFydDogc3RhcnRJbmZvLFxuICAgICAgICBlbmQ6IGVuZEluZm8sXG4gICAgICAgIHRpbWVab25lOiBjb250ZXh0LnRpbWVab25lLFxuICAgICAgICBsb2NhbGVDb2RlczogY29udGV4dC5sb2NhbGUuY29kZXMsXG4gICAgICAgIGRlZmF1bHRTZXBhcmF0b3I6IGJldHRlckRlZmF1bHRTZXBhcmF0b3IgfHwgY29udGV4dC5kZWZhdWx0U2VwYXJhdG9yLFxuICAgIH07XG59XG5cbi8qXG5UT0RPOiBmaXggdGhlIHRlcm1pbm9sb2d5IG9mIFwiZm9ybWF0dGVyXCIgdnMgXCJmb3JtYXR0aW5nIGZ1bmNcIlxuKi9cbi8qXG5BdCB0aGUgdGltZSBvZiBpbnN0YW50aWF0aW9uLCB0aGlzIG9iamVjdCBkb2VzIG5vdCBrbm93IHdoaWNoIGNtZC1mb3JtYXR0aW5nIHN5c3RlbSBpdCB3aWxsIHVzZS5cbkl0IHJlY2VpdmVzIHRoaXMgYXQgdGhlIHRpbWUgb2YgZm9ybWF0dGluZywgYXMgYSBzZXR0aW5nLlxuKi9cbnZhciBDbWRGb3JtYXR0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ21kRm9ybWF0dGVyKGNtZFN0cikge1xuICAgICAgICB0aGlzLmNtZFN0ciA9IGNtZFN0cjtcbiAgICB9XG4gICAgQ21kRm9ybWF0dGVyLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbiAoZGF0ZSwgY29udGV4dCwgYmV0dGVyRGVmYXVsdFNlcGFyYXRvcikge1xuICAgICAgICByZXR1cm4gY29udGV4dC5jbWRGb3JtYXR0ZXIodGhpcy5jbWRTdHIsIGNyZWF0ZVZlcmJvc2VGb3JtYXR0aW5nQXJnKGRhdGUsIG51bGwsIGNvbnRleHQsIGJldHRlckRlZmF1bHRTZXBhcmF0b3IpKTtcbiAgICB9O1xuICAgIENtZEZvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0UmFuZ2UgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCwgY29udGV4dCwgYmV0dGVyRGVmYXVsdFNlcGFyYXRvcikge1xuICAgICAgICByZXR1cm4gY29udGV4dC5jbWRGb3JtYXR0ZXIodGhpcy5jbWRTdHIsIGNyZWF0ZVZlcmJvc2VGb3JtYXR0aW5nQXJnKHN0YXJ0LCBlbmQsIGNvbnRleHQsIGJldHRlckRlZmF1bHRTZXBhcmF0b3IpKTtcbiAgICB9O1xuICAgIHJldHVybiBDbWRGb3JtYXR0ZXI7XG59KCkpO1xuXG52YXIgRnVuY0Zvcm1hdHRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGdW5jRm9ybWF0dGVyKGZ1bmMpIHtcbiAgICAgICAgdGhpcy5mdW5jID0gZnVuYztcbiAgICB9XG4gICAgRnVuY0Zvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gKGRhdGUsIGNvbnRleHQsIGJldHRlckRlZmF1bHRTZXBhcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnVuYyhjcmVhdGVWZXJib3NlRm9ybWF0dGluZ0FyZyhkYXRlLCBudWxsLCBjb250ZXh0LCBiZXR0ZXJEZWZhdWx0U2VwYXJhdG9yKSk7XG4gICAgfTtcbiAgICBGdW5jRm9ybWF0dGVyLnByb3RvdHlwZS5mb3JtYXRSYW5nZSA9IGZ1bmN0aW9uIChzdGFydCwgZW5kLCBjb250ZXh0LCBiZXR0ZXJEZWZhdWx0U2VwYXJhdG9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bmMoY3JlYXRlVmVyYm9zZUZvcm1hdHRpbmdBcmcoc3RhcnQsIGVuZCwgY29udGV4dCwgYmV0dGVyRGVmYXVsdFNlcGFyYXRvcikpO1xuICAgIH07XG4gICAgcmV0dXJuIEZ1bmNGb3JtYXR0ZXI7XG59KCkpO1xuXG5mdW5jdGlvbiBjcmVhdGVGb3JtYXR0ZXIoaW5wdXQpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJiBpbnB1dCkgeyAvLyBub24tbnVsbCBvYmplY3RcbiAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVGb3JtYXR0ZXIoaW5wdXQpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gbmV3IENtZEZvcm1hdHRlcihpbnB1dCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGdW5jRm9ybWF0dGVyKGlucHV0KTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbi8vIGJhc2Ugb3B0aW9uc1xuLy8gLS0tLS0tLS0tLS0tXG52YXIgQkFTRV9PUFRJT05fUkVGSU5FUlMgPSB7XG4gICAgbmF2TGlua0RheUNsaWNrOiBpZGVudGl0eSxcbiAgICBuYXZMaW5rV2Vla0NsaWNrOiBpZGVudGl0eSxcbiAgICBkdXJhdGlvbjogY3JlYXRlRHVyYXRpb24sXG4gICAgYm9vdHN0cmFwRm9udEF3ZXNvbWU6IGlkZW50aXR5LFxuICAgIGJ1dHRvbkljb25zOiBpZGVudGl0eSxcbiAgICBjdXN0b21CdXR0b25zOiBpZGVudGl0eSxcbiAgICBkZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbjogY3JlYXRlRHVyYXRpb24sXG4gICAgZGVmYXVsdFRpbWVkRXZlbnREdXJhdGlvbjogY3JlYXRlRHVyYXRpb24sXG4gICAgbmV4dERheVRocmVzaG9sZDogY3JlYXRlRHVyYXRpb24sXG4gICAgc2Nyb2xsVGltZTogY3JlYXRlRHVyYXRpb24sXG4gICAgc2Nyb2xsVGltZVJlc2V0OiBCb29sZWFuLFxuICAgIHNsb3RNaW5UaW1lOiBjcmVhdGVEdXJhdGlvbixcbiAgICBzbG90TWF4VGltZTogY3JlYXRlRHVyYXRpb24sXG4gICAgZGF5UG9wb3ZlckZvcm1hdDogY3JlYXRlRm9ybWF0dGVyLFxuICAgIHNsb3REdXJhdGlvbjogY3JlYXRlRHVyYXRpb24sXG4gICAgc25hcER1cmF0aW9uOiBjcmVhdGVEdXJhdGlvbixcbiAgICBoZWFkZXJUb29sYmFyOiBpZGVudGl0eSxcbiAgICBmb290ZXJUb29sYmFyOiBpZGVudGl0eSxcbiAgICBkZWZhdWx0UmFuZ2VTZXBhcmF0b3I6IFN0cmluZyxcbiAgICB0aXRsZVJhbmdlU2VwYXJhdG9yOiBTdHJpbmcsXG4gICAgZm9yY2VFdmVudER1cmF0aW9uOiBCb29sZWFuLFxuICAgIGRheUhlYWRlcnM6IEJvb2xlYW4sXG4gICAgZGF5SGVhZGVyRm9ybWF0OiBjcmVhdGVGb3JtYXR0ZXIsXG4gICAgZGF5SGVhZGVyQ2xhc3NOYW1lczogaWRlbnRpdHksXG4gICAgZGF5SGVhZGVyQ29udGVudDogaWRlbnRpdHksXG4gICAgZGF5SGVhZGVyRGlkTW91bnQ6IGlkZW50aXR5LFxuICAgIGRheUhlYWRlcldpbGxVbm1vdW50OiBpZGVudGl0eSxcbiAgICBkYXlDZWxsQ2xhc3NOYW1lczogaWRlbnRpdHksXG4gICAgZGF5Q2VsbENvbnRlbnQ6IGlkZW50aXR5LFxuICAgIGRheUNlbGxEaWRNb3VudDogaWRlbnRpdHksXG4gICAgZGF5Q2VsbFdpbGxVbm1vdW50OiBpZGVudGl0eSxcbiAgICBpbml0aWFsVmlldzogU3RyaW5nLFxuICAgIGFzcGVjdFJhdGlvOiBOdW1iZXIsXG4gICAgd2Vla2VuZHM6IEJvb2xlYW4sXG4gICAgd2Vla051bWJlckNhbGN1bGF0aW9uOiBpZGVudGl0eSxcbiAgICB3ZWVrTnVtYmVyczogQm9vbGVhbixcbiAgICB3ZWVrTnVtYmVyQ2xhc3NOYW1lczogaWRlbnRpdHksXG4gICAgd2Vla051bWJlckNvbnRlbnQ6IGlkZW50aXR5LFxuICAgIHdlZWtOdW1iZXJEaWRNb3VudDogaWRlbnRpdHksXG4gICAgd2Vla051bWJlcldpbGxVbm1vdW50OiBpZGVudGl0eSxcbiAgICBlZGl0YWJsZTogQm9vbGVhbixcbiAgICB2aWV3Q2xhc3NOYW1lczogaWRlbnRpdHksXG4gICAgdmlld0RpZE1vdW50OiBpZGVudGl0eSxcbiAgICB2aWV3V2lsbFVubW91bnQ6IGlkZW50aXR5LFxuICAgIG5vd0luZGljYXRvcjogQm9vbGVhbixcbiAgICBub3dJbmRpY2F0b3JDbGFzc05hbWVzOiBpZGVudGl0eSxcbiAgICBub3dJbmRpY2F0b3JDb250ZW50OiBpZGVudGl0eSxcbiAgICBub3dJbmRpY2F0b3JEaWRNb3VudDogaWRlbnRpdHksXG4gICAgbm93SW5kaWNhdG9yV2lsbFVubW91bnQ6IGlkZW50aXR5LFxuICAgIHNob3dOb25DdXJyZW50RGF0ZXM6IEJvb2xlYW4sXG4gICAgbGF6eUZldGNoaW5nOiBCb29sZWFuLFxuICAgIHN0YXJ0UGFyYW06IFN0cmluZyxcbiAgICBlbmRQYXJhbTogU3RyaW5nLFxuICAgIHRpbWVab25lUGFyYW06IFN0cmluZyxcbiAgICB0aW1lWm9uZTogU3RyaW5nLFxuICAgIGxvY2FsZXM6IGlkZW50aXR5LFxuICAgIGxvY2FsZTogaWRlbnRpdHksXG4gICAgdGhlbWVTeXN0ZW06IFN0cmluZyxcbiAgICBkcmFnUmV2ZXJ0RHVyYXRpb246IE51bWJlcixcbiAgICBkcmFnU2Nyb2xsOiBCb29sZWFuLFxuICAgIGFsbERheU1haW50YWluRHVyYXRpb246IEJvb2xlYW4sXG4gICAgdW5zZWxlY3RBdXRvOiBCb29sZWFuLFxuICAgIGRyb3BBY2NlcHQ6IGlkZW50aXR5LFxuICAgIGV2ZW50T3JkZXI6IHBhcnNlRmllbGRTcGVjcyxcbiAgICBldmVudE9yZGVyU3RyaWN0OiBCb29sZWFuLFxuICAgIGhhbmRsZVdpbmRvd1Jlc2l6ZTogQm9vbGVhbixcbiAgICB3aW5kb3dSZXNpemVEZWxheTogTnVtYmVyLFxuICAgIGxvbmdQcmVzc0RlbGF5OiBOdW1iZXIsXG4gICAgZXZlbnREcmFnTWluRGlzdGFuY2U6IE51bWJlcixcbiAgICBleHBhbmRSb3dzOiBCb29sZWFuLFxuICAgIGhlaWdodDogaWRlbnRpdHksXG4gICAgY29udGVudEhlaWdodDogaWRlbnRpdHksXG4gICAgZGlyZWN0aW9uOiBTdHJpbmcsXG4gICAgd2Vla051bWJlckZvcm1hdDogY3JlYXRlRm9ybWF0dGVyLFxuICAgIGV2ZW50UmVzaXphYmxlRnJvbVN0YXJ0OiBCb29sZWFuLFxuICAgIGRpc3BsYXlFdmVudFRpbWU6IEJvb2xlYW4sXG4gICAgZGlzcGxheUV2ZW50RW5kOiBCb29sZWFuLFxuICAgIHdlZWtUZXh0OiBTdHJpbmcsXG4gICAgd2Vla1RleHRMb25nOiBTdHJpbmcsXG4gICAgcHJvZ3Jlc3NpdmVFdmVudFJlbmRlcmluZzogQm9vbGVhbixcbiAgICBidXNpbmVzc0hvdXJzOiBpZGVudGl0eSxcbiAgICBpbml0aWFsRGF0ZTogaWRlbnRpdHksXG4gICAgbm93OiBpZGVudGl0eSxcbiAgICBldmVudERhdGFUcmFuc2Zvcm06IGlkZW50aXR5LFxuICAgIHN0aWNreUhlYWRlckRhdGVzOiBpZGVudGl0eSxcbiAgICBzdGlja3lGb290ZXJTY3JvbGxiYXI6IGlkZW50aXR5LFxuICAgIHZpZXdIZWlnaHQ6IGlkZW50aXR5LFxuICAgIGRlZmF1bHRBbGxEYXk6IEJvb2xlYW4sXG4gICAgZXZlbnRTb3VyY2VGYWlsdXJlOiBpZGVudGl0eSxcbiAgICBldmVudFNvdXJjZVN1Y2Nlc3M6IGlkZW50aXR5LFxuICAgIGV2ZW50RGlzcGxheTogU3RyaW5nLFxuICAgIGV2ZW50U3RhcnRFZGl0YWJsZTogQm9vbGVhbixcbiAgICBldmVudER1cmF0aW9uRWRpdGFibGU6IEJvb2xlYW4sXG4gICAgZXZlbnRPdmVybGFwOiBpZGVudGl0eSxcbiAgICBldmVudENvbnN0cmFpbnQ6IGlkZW50aXR5LFxuICAgIGV2ZW50QWxsb3c6IGlkZW50aXR5LFxuICAgIGV2ZW50QmFja2dyb3VuZENvbG9yOiBTdHJpbmcsXG4gICAgZXZlbnRCb3JkZXJDb2xvcjogU3RyaW5nLFxuICAgIGV2ZW50VGV4dENvbG9yOiBTdHJpbmcsXG4gICAgZXZlbnRDb2xvcjogU3RyaW5nLFxuICAgIGV2ZW50Q2xhc3NOYW1lczogaWRlbnRpdHksXG4gICAgZXZlbnRDb250ZW50OiBpZGVudGl0eSxcbiAgICBldmVudERpZE1vdW50OiBpZGVudGl0eSxcbiAgICBldmVudFdpbGxVbm1vdW50OiBpZGVudGl0eSxcbiAgICBzZWxlY3RDb25zdHJhaW50OiBpZGVudGl0eSxcbiAgICBzZWxlY3RPdmVybGFwOiBpZGVudGl0eSxcbiAgICBzZWxlY3RBbGxvdzogaWRlbnRpdHksXG4gICAgZHJvcHBhYmxlOiBCb29sZWFuLFxuICAgIHVuc2VsZWN0Q2FuY2VsOiBTdHJpbmcsXG4gICAgc2xvdExhYmVsRm9ybWF0OiBpZGVudGl0eSxcbiAgICBzbG90TGFuZUNsYXNzTmFtZXM6IGlkZW50aXR5LFxuICAgIHNsb3RMYW5lQ29udGVudDogaWRlbnRpdHksXG4gICAgc2xvdExhbmVEaWRNb3VudDogaWRlbnRpdHksXG4gICAgc2xvdExhbmVXaWxsVW5tb3VudDogaWRlbnRpdHksXG4gICAgc2xvdExhYmVsQ2xhc3NOYW1lczogaWRlbnRpdHksXG4gICAgc2xvdExhYmVsQ29udGVudDogaWRlbnRpdHksXG4gICAgc2xvdExhYmVsRGlkTW91bnQ6IGlkZW50aXR5LFxuICAgIHNsb3RMYWJlbFdpbGxVbm1vdW50OiBpZGVudGl0eSxcbiAgICBkYXlNYXhFdmVudHM6IGlkZW50aXR5LFxuICAgIGRheU1heEV2ZW50Um93czogaWRlbnRpdHksXG4gICAgZGF5TWluV2lkdGg6IE51bWJlcixcbiAgICBzbG90TGFiZWxJbnRlcnZhbDogY3JlYXRlRHVyYXRpb24sXG4gICAgYWxsRGF5VGV4dDogU3RyaW5nLFxuICAgIGFsbERheUNsYXNzTmFtZXM6IGlkZW50aXR5LFxuICAgIGFsbERheUNvbnRlbnQ6IGlkZW50aXR5LFxuICAgIGFsbERheURpZE1vdW50OiBpZGVudGl0eSxcbiAgICBhbGxEYXlXaWxsVW5tb3VudDogaWRlbnRpdHksXG4gICAgc2xvdE1pbldpZHRoOiBOdW1iZXIsXG4gICAgbmF2TGlua3M6IEJvb2xlYW4sXG4gICAgZXZlbnRUaW1lRm9ybWF0OiBjcmVhdGVGb3JtYXR0ZXIsXG4gICAgcmVyZW5kZXJEZWxheTogTnVtYmVyLFxuICAgIG1vcmVMaW5rVGV4dDogaWRlbnRpdHksXG4gICAgbW9yZUxpbmtIaW50OiBpZGVudGl0eSxcbiAgICBzZWxlY3RNaW5EaXN0YW5jZTogTnVtYmVyLFxuICAgIHNlbGVjdGFibGU6IEJvb2xlYW4sXG4gICAgc2VsZWN0TG9uZ1ByZXNzRGVsYXk6IE51bWJlcixcbiAgICBldmVudExvbmdQcmVzc0RlbGF5OiBOdW1iZXIsXG4gICAgc2VsZWN0TWlycm9yOiBCb29sZWFuLFxuICAgIGV2ZW50TWF4U3RhY2s6IE51bWJlcixcbiAgICBldmVudE1pbkhlaWdodDogTnVtYmVyLFxuICAgIGV2ZW50TWluV2lkdGg6IE51bWJlcixcbiAgICBldmVudFNob3J0SGVpZ2h0OiBOdW1iZXIsXG4gICAgc2xvdEV2ZW50T3ZlcmxhcDogQm9vbGVhbixcbiAgICBwbHVnaW5zOiBpZGVudGl0eSxcbiAgICBmaXJzdERheTogTnVtYmVyLFxuICAgIGRheUNvdW50OiBOdW1iZXIsXG4gICAgZGF0ZUFsaWdubWVudDogU3RyaW5nLFxuICAgIGRhdGVJbmNyZW1lbnQ6IGNyZWF0ZUR1cmF0aW9uLFxuICAgIGhpZGRlbkRheXM6IGlkZW50aXR5LFxuICAgIG1vbnRoTW9kZTogQm9vbGVhbixcbiAgICBmaXhlZFdlZWtDb3VudDogQm9vbGVhbixcbiAgICB2YWxpZFJhbmdlOiBpZGVudGl0eSxcbiAgICB2aXNpYmxlUmFuZ2U6IGlkZW50aXR5LFxuICAgIHRpdGxlRm9ybWF0OiBpZGVudGl0eSxcbiAgICBldmVudEludGVyYWN0aXZlOiBCb29sZWFuLFxuICAgIC8vIG9ubHkgdXNlZCBieSBsaXN0LXZpZXcsIGJ1dCBsYW5ndWFnZXMgZGVmaW5lIHRoZSB2YWx1ZSwgc28gd2UgbmVlZCBpdCBpbiBiYXNlIG9wdGlvbnNcbiAgICBub0V2ZW50c1RleHQ6IFN0cmluZyxcbiAgICB2aWV3SGludDogaWRlbnRpdHksXG4gICAgbmF2TGlua0hpbnQ6IGlkZW50aXR5LFxuICAgIGNsb3NlSGludDogU3RyaW5nLFxuICAgIHRpbWVIaW50OiBTdHJpbmcsXG4gICAgZXZlbnRIaW50OiBTdHJpbmcsXG4gICAgbW9yZUxpbmtDbGljazogaWRlbnRpdHksXG4gICAgbW9yZUxpbmtDbGFzc05hbWVzOiBpZGVudGl0eSxcbiAgICBtb3JlTGlua0NvbnRlbnQ6IGlkZW50aXR5LFxuICAgIG1vcmVMaW5rRGlkTW91bnQ6IGlkZW50aXR5LFxuICAgIG1vcmVMaW5rV2lsbFVubW91bnQ6IGlkZW50aXR5LFxufTtcbi8vIGRvIE5PVCBnaXZlIGEgdHlwZSBoZXJlLiBuZWVkIGB0eXBlb2YgQkFTRV9PUFRJT05fREVGQVVMVFNgIHRvIGdpdmUgcmVhbCByZXN1bHRzLlxuLy8gcmF3IHZhbHVlcy5cbnZhciBCQVNFX09QVElPTl9ERUZBVUxUUyA9IHtcbiAgICBldmVudERpc3BsYXk6ICdhdXRvJyxcbiAgICBkZWZhdWx0UmFuZ2VTZXBhcmF0b3I6ICcgLSAnLFxuICAgIHRpdGxlUmFuZ2VTZXBhcmF0b3I6ICcgXFx1MjAxMyAnLFxuICAgIGRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb246ICcwMTowMDowMCcsXG4gICAgZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb246IHsgZGF5OiAxIH0sXG4gICAgZm9yY2VFdmVudER1cmF0aW9uOiBmYWxzZSxcbiAgICBuZXh0RGF5VGhyZXNob2xkOiAnMDA6MDA6MDAnLFxuICAgIGRheUhlYWRlcnM6IHRydWUsXG4gICAgaW5pdGlhbFZpZXc6ICcnLFxuICAgIGFzcGVjdFJhdGlvOiAxLjM1LFxuICAgIGhlYWRlclRvb2xiYXI6IHtcbiAgICAgICAgc3RhcnQ6ICd0aXRsZScsXG4gICAgICAgIGNlbnRlcjogJycsXG4gICAgICAgIGVuZDogJ3RvZGF5IHByZXYsbmV4dCcsXG4gICAgfSxcbiAgICB3ZWVrZW5kczogdHJ1ZSxcbiAgICB3ZWVrTnVtYmVyczogZmFsc2UsXG4gICAgd2Vla051bWJlckNhbGN1bGF0aW9uOiAnbG9jYWwnLFxuICAgIGVkaXRhYmxlOiBmYWxzZSxcbiAgICBub3dJbmRpY2F0b3I6IGZhbHNlLFxuICAgIHNjcm9sbFRpbWU6ICcwNjowMDowMCcsXG4gICAgc2Nyb2xsVGltZVJlc2V0OiB0cnVlLFxuICAgIHNsb3RNaW5UaW1lOiAnMDA6MDA6MDAnLFxuICAgIHNsb3RNYXhUaW1lOiAnMjQ6MDA6MDAnLFxuICAgIHNob3dOb25DdXJyZW50RGF0ZXM6IHRydWUsXG4gICAgbGF6eUZldGNoaW5nOiB0cnVlLFxuICAgIHN0YXJ0UGFyYW06ICdzdGFydCcsXG4gICAgZW5kUGFyYW06ICdlbmQnLFxuICAgIHRpbWVab25lUGFyYW06ICd0aW1lWm9uZScsXG4gICAgdGltZVpvbmU6ICdsb2NhbCcsXG4gICAgbG9jYWxlczogW10sXG4gICAgbG9jYWxlOiAnJyxcbiAgICB0aGVtZVN5c3RlbTogJ3N0YW5kYXJkJyxcbiAgICBkcmFnUmV2ZXJ0RHVyYXRpb246IDUwMCxcbiAgICBkcmFnU2Nyb2xsOiB0cnVlLFxuICAgIGFsbERheU1haW50YWluRHVyYXRpb246IGZhbHNlLFxuICAgIHVuc2VsZWN0QXV0bzogdHJ1ZSxcbiAgICBkcm9wQWNjZXB0OiAnKicsXG4gICAgZXZlbnRPcmRlcjogJ3N0YXJ0LC1kdXJhdGlvbixhbGxEYXksdGl0bGUnLFxuICAgIGRheVBvcG92ZXJGb3JtYXQ6IHsgbW9udGg6ICdsb25nJywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICdudW1lcmljJyB9LFxuICAgIGhhbmRsZVdpbmRvd1Jlc2l6ZTogdHJ1ZSxcbiAgICB3aW5kb3dSZXNpemVEZWxheTogMTAwLFxuICAgIGxvbmdQcmVzc0RlbGF5OiAxMDAwLFxuICAgIGV2ZW50RHJhZ01pbkRpc3RhbmNlOiA1LFxuICAgIGV4cGFuZFJvd3M6IGZhbHNlLFxuICAgIG5hdkxpbmtzOiBmYWxzZSxcbiAgICBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICBldmVudE1pbkhlaWdodDogMTUsXG4gICAgZXZlbnRNaW5XaWR0aDogMzAsXG4gICAgZXZlbnRTaG9ydEhlaWdodDogMzAsXG59O1xuLy8gY2FsZW5kYXIgbGlzdGVuZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBDQUxFTkRBUl9MSVNURU5FUl9SRUZJTkVSUyA9IHtcbiAgICBkYXRlc1NldDogaWRlbnRpdHksXG4gICAgZXZlbnRzU2V0OiBpZGVudGl0eSxcbiAgICBldmVudEFkZDogaWRlbnRpdHksXG4gICAgZXZlbnRDaGFuZ2U6IGlkZW50aXR5LFxuICAgIGV2ZW50UmVtb3ZlOiBpZGVudGl0eSxcbiAgICB3aW5kb3dSZXNpemU6IGlkZW50aXR5LFxuICAgIGV2ZW50Q2xpY2s6IGlkZW50aXR5LFxuICAgIGV2ZW50TW91c2VFbnRlcjogaWRlbnRpdHksXG4gICAgZXZlbnRNb3VzZUxlYXZlOiBpZGVudGl0eSxcbiAgICBzZWxlY3Q6IGlkZW50aXR5LFxuICAgIHVuc2VsZWN0OiBpZGVudGl0eSxcbiAgICBsb2FkaW5nOiBpZGVudGl0eSxcbiAgICAvLyBpbnRlcm5hbFxuICAgIF91bm1vdW50OiBpZGVudGl0eSxcbiAgICBfYmVmb3JlcHJpbnQ6IGlkZW50aXR5LFxuICAgIF9hZnRlcnByaW50OiBpZGVudGl0eSxcbiAgICBfbm9FdmVudERyb3A6IGlkZW50aXR5LFxuICAgIF9ub0V2ZW50UmVzaXplOiBpZGVudGl0eSxcbiAgICBfcmVzaXplOiBpZGVudGl0eSxcbiAgICBfc2Nyb2xsUmVxdWVzdDogaWRlbnRpdHksXG59O1xuLy8gY2FsZW5kYXItc3BlY2lmaWMgb3B0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIENBTEVOREFSX09QVElPTl9SRUZJTkVSUyA9IHtcbiAgICBidXR0b25UZXh0OiBpZGVudGl0eSxcbiAgICBidXR0b25IaW50czogaWRlbnRpdHksXG4gICAgdmlld3M6IGlkZW50aXR5LFxuICAgIHBsdWdpbnM6IGlkZW50aXR5LFxuICAgIGluaXRpYWxFdmVudHM6IGlkZW50aXR5LFxuICAgIGV2ZW50czogaWRlbnRpdHksXG4gICAgZXZlbnRTb3VyY2VzOiBpZGVudGl0eSxcbn07XG52YXIgQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlMgPSB7XG4gICAgaGVhZGVyVG9vbGJhcjogaXNNYXliZU9iamVjdHNFcXVhbCxcbiAgICBmb290ZXJUb29sYmFyOiBpc01heWJlT2JqZWN0c0VxdWFsLFxuICAgIGJ1dHRvblRleHQ6IGlzTWF5YmVPYmplY3RzRXF1YWwsXG4gICAgYnV0dG9uSGludHM6IGlzTWF5YmVPYmplY3RzRXF1YWwsXG4gICAgYnV0dG9uSWNvbnM6IGlzTWF5YmVPYmplY3RzRXF1YWwsXG4gICAgZGF0ZUluY3JlbWVudDogaXNNYXliZU9iamVjdHNFcXVhbCxcbn07XG5mdW5jdGlvbiBpc01heWJlT2JqZWN0c0VxdWFsKGEsIGIpIHtcbiAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnICYmIHR5cGVvZiBiID09PSAnb2JqZWN0JyAmJiBhICYmIGIpIHsgLy8gYm90aCBub24tbnVsbCBvYmplY3RzXG4gICAgICAgIHJldHVybiBpc1Byb3BzRXF1YWwoYSwgYik7XG4gICAgfVxuICAgIHJldHVybiBhID09PSBiO1xufVxuLy8gdmlldy1zcGVjaWZpYyBvcHRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBWSUVXX09QVElPTl9SRUZJTkVSUyA9IHtcbiAgICB0eXBlOiBTdHJpbmcsXG4gICAgY29tcG9uZW50OiBpZGVudGl0eSxcbiAgICBidXR0b25UZXh0OiBTdHJpbmcsXG4gICAgYnV0dG9uVGV4dEtleTogU3RyaW5nLFxuICAgIGRhdGVQcm9maWxlR2VuZXJhdG9yQ2xhc3M6IGlkZW50aXR5LFxuICAgIHVzZXNNaW5NYXhUaW1lOiBCb29sZWFuLFxuICAgIGNsYXNzTmFtZXM6IGlkZW50aXR5LFxuICAgIGNvbnRlbnQ6IGlkZW50aXR5LFxuICAgIGRpZE1vdW50OiBpZGVudGl0eSxcbiAgICB3aWxsVW5tb3VudDogaWRlbnRpdHksXG59O1xuLy8gdXRpbCBmdW5jc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gbWVyZ2VSYXdPcHRpb25zKG9wdGlvblNldHMpIHtcbiAgICByZXR1cm4gbWVyZ2VQcm9wcyhvcHRpb25TZXRzLCBDT01QTEVYX09QVElPTl9DT01QQVJBVE9SUyk7XG59XG5mdW5jdGlvbiByZWZpbmVQcm9wcyhpbnB1dCwgcmVmaW5lcnMpIHtcbiAgICB2YXIgcmVmaW5lZCA9IHt9O1xuICAgIHZhciBleHRyYSA9IHt9O1xuICAgIGZvciAodmFyIHByb3BOYW1lIGluIHJlZmluZXJzKSB7XG4gICAgICAgIGlmIChwcm9wTmFtZSBpbiBpbnB1dCkge1xuICAgICAgICAgICAgcmVmaW5lZFtwcm9wTmFtZV0gPSByZWZpbmVyc1twcm9wTmFtZV0oaW5wdXRbcHJvcE5hbWVdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBpbnB1dCkge1xuICAgICAgICBpZiAoIShwcm9wTmFtZSBpbiByZWZpbmVycykpIHtcbiAgICAgICAgICAgIGV4dHJhW3Byb3BOYW1lXSA9IGlucHV0W3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyByZWZpbmVkOiByZWZpbmVkLCBleHRyYTogZXh0cmEgfTtcbn1cbmZ1bmN0aW9uIGlkZW50aXR5KHJhdykge1xuICAgIHJldHVybiByYXc7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXZlbnRzKHJhd0V2ZW50cywgZXZlbnRTb3VyY2UsIGNvbnRleHQsIGFsbG93T3BlblJhbmdlKSB7XG4gICAgdmFyIGV2ZW50U3RvcmUgPSBjcmVhdGVFbXB0eUV2ZW50U3RvcmUoKTtcbiAgICB2YXIgZXZlbnRSZWZpbmVycyA9IGJ1aWxkRXZlbnRSZWZpbmVycyhjb250ZXh0KTtcbiAgICBmb3IgKHZhciBfaSA9IDAsIHJhd0V2ZW50c18xID0gcmF3RXZlbnRzOyBfaSA8IHJhd0V2ZW50c18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgcmF3RXZlbnQgPSByYXdFdmVudHNfMVtfaV07XG4gICAgICAgIHZhciB0dXBsZSA9IHBhcnNlRXZlbnQocmF3RXZlbnQsIGV2ZW50U291cmNlLCBjb250ZXh0LCBhbGxvd09wZW5SYW5nZSwgZXZlbnRSZWZpbmVycyk7XG4gICAgICAgIGlmICh0dXBsZSkge1xuICAgICAgICAgICAgZXZlbnRUdXBsZVRvU3RvcmUodHVwbGUsIGV2ZW50U3RvcmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBldmVudFN0b3JlO1xufVxuZnVuY3Rpb24gZXZlbnRUdXBsZVRvU3RvcmUodHVwbGUsIGV2ZW50U3RvcmUpIHtcbiAgICBpZiAoZXZlbnRTdG9yZSA9PT0gdm9pZCAwKSB7IGV2ZW50U3RvcmUgPSBjcmVhdGVFbXB0eUV2ZW50U3RvcmUoKTsgfVxuICAgIGV2ZW50U3RvcmUuZGVmc1t0dXBsZS5kZWYuZGVmSWRdID0gdHVwbGUuZGVmO1xuICAgIGlmICh0dXBsZS5pbnN0YW5jZSkge1xuICAgICAgICBldmVudFN0b3JlLmluc3RhbmNlc1t0dXBsZS5pbnN0YW5jZS5pbnN0YW5jZUlkXSA9IHR1cGxlLmluc3RhbmNlO1xuICAgIH1cbiAgICByZXR1cm4gZXZlbnRTdG9yZTtcbn1cbi8vIHJldHJpZXZlcyBldmVudHMgdGhhdCBoYXZlIHRoZSBzYW1lIGdyb3VwSWQgYXMgdGhlIGluc3RhbmNlIHNwZWNpZmllZCBieSBgaW5zdGFuY2VJZGBcbi8vIG9yIHRoZXkgYXJlIHRoZSBzYW1lIGFzIHRoZSBpbnN0YW5jZS5cbi8vIHdoeSBtaWdodCBpbnN0YW5jZUlkIG5vdCBiZSBpbiB0aGUgc3RvcmU/IGFuIGV2ZW50IGZyb20gYW5vdGhlciBjYWxlbmRhcj9cbmZ1bmN0aW9uIGdldFJlbGV2YW50RXZlbnRzKGV2ZW50U3RvcmUsIGluc3RhbmNlSWQpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBldmVudFN0b3JlLmluc3RhbmNlc1tpbnN0YW5jZUlkXTtcbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgdmFyIGRlZl8xID0gZXZlbnRTdG9yZS5kZWZzW2luc3RhbmNlLmRlZklkXTtcbiAgICAgICAgLy8gZ2V0IGV2ZW50cy9pbnN0YW5jZXMgd2l0aCBzYW1lIGdyb3VwXG4gICAgICAgIHZhciBuZXdTdG9yZSA9IGZpbHRlckV2ZW50U3RvcmVEZWZzKGV2ZW50U3RvcmUsIGZ1bmN0aW9uIChsb29rRGVmKSB7IHJldHVybiBpc0V2ZW50RGVmc0dyb3VwZWQoZGVmXzEsIGxvb2tEZWYpOyB9KTtcbiAgICAgICAgLy8gYWRkIHRoZSBvcmlnaW5hbFxuICAgICAgICAvLyBUT0RPOiB3aXNoIHdlIGNvdWxkIHVzZSBldmVudFR1cGxlVG9TdG9yZSBvciBzb21ldGhpbmcgbGlrZSBpdFxuICAgICAgICBuZXdTdG9yZS5kZWZzW2RlZl8xLmRlZklkXSA9IGRlZl8xO1xuICAgICAgICBuZXdTdG9yZS5pbnN0YW5jZXNbaW5zdGFuY2UuaW5zdGFuY2VJZF0gPSBpbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIG5ld1N0b3JlO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlRW1wdHlFdmVudFN0b3JlKCk7XG59XG5mdW5jdGlvbiBpc0V2ZW50RGVmc0dyb3VwZWQoZGVmMCwgZGVmMSkge1xuICAgIHJldHVybiBCb29sZWFuKGRlZjAuZ3JvdXBJZCAmJiBkZWYwLmdyb3VwSWQgPT09IGRlZjEuZ3JvdXBJZCk7XG59XG5mdW5jdGlvbiBjcmVhdGVFbXB0eUV2ZW50U3RvcmUoKSB7XG4gICAgcmV0dXJuIHsgZGVmczoge30sIGluc3RhbmNlczoge30gfTtcbn1cbmZ1bmN0aW9uIG1lcmdlRXZlbnRTdG9yZXMoc3RvcmUwLCBzdG9yZTEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkZWZzOiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgc3RvcmUwLmRlZnMpLCBzdG9yZTEuZGVmcyksXG4gICAgICAgIGluc3RhbmNlczogdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIHN0b3JlMC5pbnN0YW5jZXMpLCBzdG9yZTEuaW5zdGFuY2VzKSxcbiAgICB9O1xufVxuZnVuY3Rpb24gZmlsdGVyRXZlbnRTdG9yZURlZnMoZXZlbnRTdG9yZSwgZmlsdGVyRnVuYykge1xuICAgIHZhciBkZWZzID0gZmlsdGVySGFzaChldmVudFN0b3JlLmRlZnMsIGZpbHRlckZ1bmMpO1xuICAgIHZhciBpbnN0YW5jZXMgPSBmaWx0ZXJIYXNoKGV2ZW50U3RvcmUuaW5zdGFuY2VzLCBmdW5jdGlvbiAoaW5zdGFuY2UpIHsgcmV0dXJuIChkZWZzW2luc3RhbmNlLmRlZklkXSAvLyBzdGlsbCBleGlzdHM/XG4gICAgKTsgfSk7XG4gICAgcmV0dXJuIHsgZGVmczogZGVmcywgaW5zdGFuY2VzOiBpbnN0YW5jZXMgfTtcbn1cbmZ1bmN0aW9uIGV4Y2x1ZGVTdWJFdmVudFN0b3JlKG1hc3Rlciwgc3ViKSB7XG4gICAgdmFyIGRlZnMgPSBtYXN0ZXIuZGVmcywgaW5zdGFuY2VzID0gbWFzdGVyLmluc3RhbmNlcztcbiAgICB2YXIgZmlsdGVyZWREZWZzID0ge307XG4gICAgdmFyIGZpbHRlcmVkSW5zdGFuY2VzID0ge307XG4gICAgZm9yICh2YXIgZGVmSWQgaW4gZGVmcykge1xuICAgICAgICBpZiAoIXN1Yi5kZWZzW2RlZklkXSkgeyAvLyBub3QgZXhwbGljaXRseSBleGNsdWRlZFxuICAgICAgICAgICAgZmlsdGVyZWREZWZzW2RlZklkXSA9IGRlZnNbZGVmSWRdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGluc3RhbmNlSWQgaW4gaW5zdGFuY2VzKSB7XG4gICAgICAgIGlmICghc3ViLmluc3RhbmNlc1tpbnN0YW5jZUlkXSAmJiAvLyBub3QgZXhwbGljaXRseSBleGNsdWRlZFxuICAgICAgICAgICAgZmlsdGVyZWREZWZzW2luc3RhbmNlc1tpbnN0YW5jZUlkXS5kZWZJZF0gLy8gZGVmIHdhc24ndCBmaWx0ZXJlZCBhd2F5XG4gICAgICAgICkge1xuICAgICAgICAgICAgZmlsdGVyZWRJbnN0YW5jZXNbaW5zdGFuY2VJZF0gPSBpbnN0YW5jZXNbaW5zdGFuY2VJZF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVmczogZmlsdGVyZWREZWZzLFxuICAgICAgICBpbnN0YW5jZXM6IGZpbHRlcmVkSW5zdGFuY2VzLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbnN0cmFpbnQoaW5wdXQsIGNvbnRleHQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRXZlbnRzKGlucHV0LCBudWxsLCBjb250ZXh0LCB0cnVlKTsgLy8gYWxsb3dPcGVuUmFuZ2U9dHJ1ZVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJiBpbnB1dCkgeyAvLyBub24tbnVsbCBvYmplY3RcbiAgICAgICAgcmV0dXJuIHBhcnNlRXZlbnRzKFtpbnB1dF0sIG51bGwsIGNvbnRleHQsIHRydWUpOyAvLyBhbGxvd09wZW5SYW5nZT10cnVlXG4gICAgfVxuICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoaW5wdXQpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcGFyc2VDbGFzc05hbWVzKHJhdykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJhdykpIHtcbiAgICAgICAgcmV0dXJuIHJhdztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByYXcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiByYXcuc3BsaXQoL1xccysvKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xufVxuXG4vLyBUT0RPOiBiZXR0ZXIgY2FsbGVkIFwiRXZlbnRTZXR0aW5nc1wiIG9yIFwiRXZlbnRDb25maWdcIlxuLy8gVE9ETzogbW92ZSB0aGlzIGZpbGUgaW50byBzdHJ1Y3RzXG4vLyBUT0RPOiBzZXBhcmF0ZSBjb25zdHJhaW50L292ZXJsYXAvYWxsb3csIGJlY2F1c2Ugc2VsZWN0aW9uIHVzZXMgb25seSB0aGF0LCBub3Qgb3RoZXIgcHJvcHNcbnZhciBFVkVOVF9VSV9SRUZJTkVSUyA9IHtcbiAgICBkaXNwbGF5OiBTdHJpbmcsXG4gICAgZWRpdGFibGU6IEJvb2xlYW4sXG4gICAgc3RhcnRFZGl0YWJsZTogQm9vbGVhbixcbiAgICBkdXJhdGlvbkVkaXRhYmxlOiBCb29sZWFuLFxuICAgIGNvbnN0cmFpbnQ6IGlkZW50aXR5LFxuICAgIG92ZXJsYXA6IGlkZW50aXR5LFxuICAgIGFsbG93OiBpZGVudGl0eSxcbiAgICBjbGFzc05hbWU6IHBhcnNlQ2xhc3NOYW1lcyxcbiAgICBjbGFzc05hbWVzOiBwYXJzZUNsYXNzTmFtZXMsXG4gICAgY29sb3I6IFN0cmluZyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IFN0cmluZyxcbiAgICBib3JkZXJDb2xvcjogU3RyaW5nLFxuICAgIHRleHRDb2xvcjogU3RyaW5nLFxufTtcbnZhciBFTVBUWV9FVkVOVF9VSSA9IHtcbiAgICBkaXNwbGF5OiBudWxsLFxuICAgIHN0YXJ0RWRpdGFibGU6IG51bGwsXG4gICAgZHVyYXRpb25FZGl0YWJsZTogbnVsbCxcbiAgICBjb25zdHJhaW50czogW10sXG4gICAgb3ZlcmxhcDogbnVsbCxcbiAgICBhbGxvd3M6IFtdLFxuICAgIGJhY2tncm91bmRDb2xvcjogJycsXG4gICAgYm9yZGVyQ29sb3I6ICcnLFxuICAgIHRleHRDb2xvcjogJycsXG4gICAgY2xhc3NOYW1lczogW10sXG59O1xuZnVuY3Rpb24gY3JlYXRlRXZlbnRVaShyZWZpbmVkLCBjb250ZXh0KSB7XG4gICAgdmFyIGNvbnN0cmFpbnQgPSBub3JtYWxpemVDb25zdHJhaW50KHJlZmluZWQuY29uc3RyYWludCwgY29udGV4dCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGlzcGxheTogcmVmaW5lZC5kaXNwbGF5IHx8IG51bGwsXG4gICAgICAgIHN0YXJ0RWRpdGFibGU6IHJlZmluZWQuc3RhcnRFZGl0YWJsZSAhPSBudWxsID8gcmVmaW5lZC5zdGFydEVkaXRhYmxlIDogcmVmaW5lZC5lZGl0YWJsZSxcbiAgICAgICAgZHVyYXRpb25FZGl0YWJsZTogcmVmaW5lZC5kdXJhdGlvbkVkaXRhYmxlICE9IG51bGwgPyByZWZpbmVkLmR1cmF0aW9uRWRpdGFibGUgOiByZWZpbmVkLmVkaXRhYmxlLFxuICAgICAgICBjb25zdHJhaW50czogY29uc3RyYWludCAhPSBudWxsID8gW2NvbnN0cmFpbnRdIDogW10sXG4gICAgICAgIG92ZXJsYXA6IHJlZmluZWQub3ZlcmxhcCAhPSBudWxsID8gcmVmaW5lZC5vdmVybGFwIDogbnVsbCxcbiAgICAgICAgYWxsb3dzOiByZWZpbmVkLmFsbG93ICE9IG51bGwgPyBbcmVmaW5lZC5hbGxvd10gOiBbXSxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiByZWZpbmVkLmJhY2tncm91bmRDb2xvciB8fCByZWZpbmVkLmNvbG9yIHx8ICcnLFxuICAgICAgICBib3JkZXJDb2xvcjogcmVmaW5lZC5ib3JkZXJDb2xvciB8fCByZWZpbmVkLmNvbG9yIHx8ICcnLFxuICAgICAgICB0ZXh0Q29sb3I6IHJlZmluZWQudGV4dENvbG9yIHx8ICcnLFxuICAgICAgICBjbGFzc05hbWVzOiAocmVmaW5lZC5jbGFzc05hbWUgfHwgW10pLmNvbmNhdChyZWZpbmVkLmNsYXNzTmFtZXMgfHwgW10pLCAvLyBqb2luIHNpbmd1bGFyIGFuZCBwbHVyYWxcbiAgICB9O1xufVxuLy8gVE9ETzogcHJldmVudCBhZ2FpbnN0IHByb2JsZW1zIHdpdGggPDIgYXJncyFcbmZ1bmN0aW9uIGNvbWJpbmVFdmVudFVpcyh1aXMpIHtcbiAgICByZXR1cm4gdWlzLnJlZHVjZShjb21iaW5lVHdvRXZlbnRVaXMsIEVNUFRZX0VWRU5UX1VJKTtcbn1cbmZ1bmN0aW9uIGNvbWJpbmVUd29FdmVudFVpcyhpdGVtMCwgaXRlbTEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkaXNwbGF5OiBpdGVtMS5kaXNwbGF5ICE9IG51bGwgPyBpdGVtMS5kaXNwbGF5IDogaXRlbTAuZGlzcGxheSxcbiAgICAgICAgc3RhcnRFZGl0YWJsZTogaXRlbTEuc3RhcnRFZGl0YWJsZSAhPSBudWxsID8gaXRlbTEuc3RhcnRFZGl0YWJsZSA6IGl0ZW0wLnN0YXJ0RWRpdGFibGUsXG4gICAgICAgIGR1cmF0aW9uRWRpdGFibGU6IGl0ZW0xLmR1cmF0aW9uRWRpdGFibGUgIT0gbnVsbCA/IGl0ZW0xLmR1cmF0aW9uRWRpdGFibGUgOiBpdGVtMC5kdXJhdGlvbkVkaXRhYmxlLFxuICAgICAgICBjb25zdHJhaW50czogaXRlbTAuY29uc3RyYWludHMuY29uY2F0KGl0ZW0xLmNvbnN0cmFpbnRzKSxcbiAgICAgICAgb3ZlcmxhcDogdHlwZW9mIGl0ZW0xLm92ZXJsYXAgPT09ICdib29sZWFuJyA/IGl0ZW0xLm92ZXJsYXAgOiBpdGVtMC5vdmVybGFwLFxuICAgICAgICBhbGxvd3M6IGl0ZW0wLmFsbG93cy5jb25jYXQoaXRlbTEuYWxsb3dzKSxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBpdGVtMS5iYWNrZ3JvdW5kQ29sb3IgfHwgaXRlbTAuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICBib3JkZXJDb2xvcjogaXRlbTEuYm9yZGVyQ29sb3IgfHwgaXRlbTAuYm9yZGVyQ29sb3IsXG4gICAgICAgIHRleHRDb2xvcjogaXRlbTEudGV4dENvbG9yIHx8IGl0ZW0wLnRleHRDb2xvcixcbiAgICAgICAgY2xhc3NOYW1lczogaXRlbTAuY2xhc3NOYW1lcy5jb25jYXQoaXRlbTEuY2xhc3NOYW1lcyksXG4gICAgfTtcbn1cblxudmFyIEVWRU5UX05PTl9EQVRFX1JFRklORVJTID0ge1xuICAgIGlkOiBTdHJpbmcsXG4gICAgZ3JvdXBJZDogU3RyaW5nLFxuICAgIHRpdGxlOiBTdHJpbmcsXG4gICAgdXJsOiBTdHJpbmcsXG4gICAgaW50ZXJhY3RpdmU6IEJvb2xlYW4sXG59O1xudmFyIEVWRU5UX0RBVEVfUkVGSU5FUlMgPSB7XG4gICAgc3RhcnQ6IGlkZW50aXR5LFxuICAgIGVuZDogaWRlbnRpdHksXG4gICAgZGF0ZTogaWRlbnRpdHksXG4gICAgYWxsRGF5OiBCb29sZWFuLFxufTtcbnZhciBFVkVOVF9SRUZJTkVSUyA9IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBFVkVOVF9OT05fREFURV9SRUZJTkVSUyksIEVWRU5UX0RBVEVfUkVGSU5FUlMpLCB7IGV4dGVuZGVkUHJvcHM6IGlkZW50aXR5IH0pO1xuZnVuY3Rpb24gcGFyc2VFdmVudChyYXcsIGV2ZW50U291cmNlLCBjb250ZXh0LCBhbGxvd09wZW5SYW5nZSwgcmVmaW5lcnMpIHtcbiAgICBpZiAocmVmaW5lcnMgPT09IHZvaWQgMCkgeyByZWZpbmVycyA9IGJ1aWxkRXZlbnRSZWZpbmVycyhjb250ZXh0KTsgfVxuICAgIHZhciBfYSA9IHJlZmluZUV2ZW50RGVmKHJhdywgY29udGV4dCwgcmVmaW5lcnMpLCByZWZpbmVkID0gX2EucmVmaW5lZCwgZXh0cmEgPSBfYS5leHRyYTtcbiAgICB2YXIgZGVmYXVsdEFsbERheSA9IGNvbXB1dGVJc0RlZmF1bHRBbGxEYXkoZXZlbnRTb3VyY2UsIGNvbnRleHQpO1xuICAgIHZhciByZWN1cnJpbmdSZXMgPSBwYXJzZVJlY3VycmluZyhyZWZpbmVkLCBkZWZhdWx0QWxsRGF5LCBjb250ZXh0LmRhdGVFbnYsIGNvbnRleHQucGx1Z2luSG9va3MucmVjdXJyaW5nVHlwZXMpO1xuICAgIGlmIChyZWN1cnJpbmdSZXMpIHtcbiAgICAgICAgdmFyIGRlZiA9IHBhcnNlRXZlbnREZWYocmVmaW5lZCwgZXh0cmEsIGV2ZW50U291cmNlID8gZXZlbnRTb3VyY2Uuc291cmNlSWQgOiAnJywgcmVjdXJyaW5nUmVzLmFsbERheSwgQm9vbGVhbihyZWN1cnJpbmdSZXMuZHVyYXRpb24pLCBjb250ZXh0KTtcbiAgICAgICAgZGVmLnJlY3VycmluZ0RlZiA9IHtcbiAgICAgICAgICAgIHR5cGVJZDogcmVjdXJyaW5nUmVzLnR5cGVJZCxcbiAgICAgICAgICAgIHR5cGVEYXRhOiByZWN1cnJpbmdSZXMudHlwZURhdGEsXG4gICAgICAgICAgICBkdXJhdGlvbjogcmVjdXJyaW5nUmVzLmR1cmF0aW9uLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4geyBkZWY6IGRlZiwgaW5zdGFuY2U6IG51bGwgfTtcbiAgICB9XG4gICAgdmFyIHNpbmdsZVJlcyA9IHBhcnNlU2luZ2xlKHJlZmluZWQsIGRlZmF1bHRBbGxEYXksIGNvbnRleHQsIGFsbG93T3BlblJhbmdlKTtcbiAgICBpZiAoc2luZ2xlUmVzKSB7XG4gICAgICAgIHZhciBkZWYgPSBwYXJzZUV2ZW50RGVmKHJlZmluZWQsIGV4dHJhLCBldmVudFNvdXJjZSA/IGV2ZW50U291cmNlLnNvdXJjZUlkIDogJycsIHNpbmdsZVJlcy5hbGxEYXksIHNpbmdsZVJlcy5oYXNFbmQsIGNvbnRleHQpO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBjcmVhdGVFdmVudEluc3RhbmNlKGRlZi5kZWZJZCwgc2luZ2xlUmVzLnJhbmdlLCBzaW5nbGVSZXMuZm9yY2VkU3RhcnRUem8sIHNpbmdsZVJlcy5mb3JjZWRFbmRUem8pO1xuICAgICAgICByZXR1cm4geyBkZWY6IGRlZiwgaW5zdGFuY2U6IGluc3RhbmNlIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gcmVmaW5lRXZlbnREZWYocmF3LCBjb250ZXh0LCByZWZpbmVycykge1xuICAgIGlmIChyZWZpbmVycyA9PT0gdm9pZCAwKSB7IHJlZmluZXJzID0gYnVpbGRFdmVudFJlZmluZXJzKGNvbnRleHQpOyB9XG4gICAgcmV0dXJuIHJlZmluZVByb3BzKHJhdywgcmVmaW5lcnMpO1xufVxuZnVuY3Rpb24gYnVpbGRFdmVudFJlZmluZXJzKGNvbnRleHQpIHtcbiAgICByZXR1cm4gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIEVWRU5UX1VJX1JFRklORVJTKSwgRVZFTlRfUkVGSU5FUlMpLCBjb250ZXh0LnBsdWdpbkhvb2tzLmV2ZW50UmVmaW5lcnMpO1xufVxuLypcbldpbGwgTk9UIHBvcHVsYXRlIGV4dGVuZGVkUHJvcHMgd2l0aCB0aGUgbGVmdG92ZXIgcHJvcGVydGllcy5cbldpbGwgTk9UIHBvcHVsYXRlIGRhdGUtcmVsYXRlZCBwcm9wcy5cbiovXG5mdW5jdGlvbiBwYXJzZUV2ZW50RGVmKHJlZmluZWQsIGV4dHJhLCBzb3VyY2VJZCwgYWxsRGF5LCBoYXNFbmQsIGNvbnRleHQpIHtcbiAgICB2YXIgZGVmID0ge1xuICAgICAgICB0aXRsZTogcmVmaW5lZC50aXRsZSB8fCAnJyxcbiAgICAgICAgZ3JvdXBJZDogcmVmaW5lZC5ncm91cElkIHx8ICcnLFxuICAgICAgICBwdWJsaWNJZDogcmVmaW5lZC5pZCB8fCAnJyxcbiAgICAgICAgdXJsOiByZWZpbmVkLnVybCB8fCAnJyxcbiAgICAgICAgcmVjdXJyaW5nRGVmOiBudWxsLFxuICAgICAgICBkZWZJZDogZ3VpZCgpLFxuICAgICAgICBzb3VyY2VJZDogc291cmNlSWQsXG4gICAgICAgIGFsbERheTogYWxsRGF5LFxuICAgICAgICBoYXNFbmQ6IGhhc0VuZCxcbiAgICAgICAgaW50ZXJhY3RpdmU6IHJlZmluZWQuaW50ZXJhY3RpdmUsXG4gICAgICAgIHVpOiBjcmVhdGVFdmVudFVpKHJlZmluZWQsIGNvbnRleHQpLFxuICAgICAgICBleHRlbmRlZFByb3BzOiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgKHJlZmluZWQuZXh0ZW5kZWRQcm9wcyB8fCB7fSkpLCBleHRyYSksXG4gICAgfTtcbiAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gY29udGV4dC5wbHVnaW5Ib29rcy5ldmVudERlZk1lbWJlckFkZGVyczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIG1lbWJlckFkZGVyID0gX2FbX2ldO1xuICAgICAgICB0c2xpYi5fX2Fzc2lnbihkZWYsIG1lbWJlckFkZGVyKHJlZmluZWQpKTtcbiAgICB9XG4gICAgLy8gaGVscCBvdXQgRXZlbnRBcGkgZnJvbSBoYXZpbmcgdXNlciBtb2RpZnkgcHJvcHNcbiAgICBPYmplY3QuZnJlZXplKGRlZi51aS5jbGFzc05hbWVzKTtcbiAgICBPYmplY3QuZnJlZXplKGRlZi5leHRlbmRlZFByb3BzKTtcbiAgICByZXR1cm4gZGVmO1xufVxuZnVuY3Rpb24gcGFyc2VTaW5nbGUocmVmaW5lZCwgZGVmYXVsdEFsbERheSwgY29udGV4dCwgYWxsb3dPcGVuUmFuZ2UpIHtcbiAgICB2YXIgYWxsRGF5ID0gcmVmaW5lZC5hbGxEYXk7XG4gICAgdmFyIHN0YXJ0TWV0YTtcbiAgICB2YXIgc3RhcnRNYXJrZXIgPSBudWxsO1xuICAgIHZhciBoYXNFbmQgPSBmYWxzZTtcbiAgICB2YXIgZW5kTWV0YTtcbiAgICB2YXIgZW5kTWFya2VyID0gbnVsbDtcbiAgICB2YXIgc3RhcnRJbnB1dCA9IHJlZmluZWQuc3RhcnQgIT0gbnVsbCA/IHJlZmluZWQuc3RhcnQgOiByZWZpbmVkLmRhdGU7XG4gICAgc3RhcnRNZXRhID0gY29udGV4dC5kYXRlRW52LmNyZWF0ZU1hcmtlck1ldGEoc3RhcnRJbnB1dCk7XG4gICAgaWYgKHN0YXJ0TWV0YSkge1xuICAgICAgICBzdGFydE1hcmtlciA9IHN0YXJ0TWV0YS5tYXJrZXI7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFhbGxvd09wZW5SYW5nZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHJlZmluZWQuZW5kICE9IG51bGwpIHtcbiAgICAgICAgZW5kTWV0YSA9IGNvbnRleHQuZGF0ZUVudi5jcmVhdGVNYXJrZXJNZXRhKHJlZmluZWQuZW5kKTtcbiAgICB9XG4gICAgaWYgKGFsbERheSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChkZWZhdWx0QWxsRGF5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGFsbERheSA9IGRlZmF1bHRBbGxEYXk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBmYWxsIGJhY2sgdG8gdGhlIGRhdGUgcHJvcHMgTEFTVFxuICAgICAgICAgICAgYWxsRGF5ID0gKCFzdGFydE1ldGEgfHwgc3RhcnRNZXRhLmlzVGltZVVuc3BlY2lmaWVkKSAmJlxuICAgICAgICAgICAgICAgICghZW5kTWV0YSB8fCBlbmRNZXRhLmlzVGltZVVuc3BlY2lmaWVkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWxsRGF5ICYmIHN0YXJ0TWFya2VyKSB7XG4gICAgICAgIHN0YXJ0TWFya2VyID0gc3RhcnRPZkRheShzdGFydE1hcmtlcik7XG4gICAgfVxuICAgIGlmIChlbmRNZXRhKSB7XG4gICAgICAgIGVuZE1hcmtlciA9IGVuZE1ldGEubWFya2VyO1xuICAgICAgICBpZiAoYWxsRGF5KSB7XG4gICAgICAgICAgICBlbmRNYXJrZXIgPSBzdGFydE9mRGF5KGVuZE1hcmtlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0TWFya2VyICYmIGVuZE1hcmtlciA8PSBzdGFydE1hcmtlcikge1xuICAgICAgICAgICAgZW5kTWFya2VyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5kTWFya2VyKSB7XG4gICAgICAgIGhhc0VuZCA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFhbGxvd09wZW5SYW5nZSkge1xuICAgICAgICBoYXNFbmQgPSBjb250ZXh0Lm9wdGlvbnMuZm9yY2VFdmVudER1cmF0aW9uIHx8IGZhbHNlO1xuICAgICAgICBlbmRNYXJrZXIgPSBjb250ZXh0LmRhdGVFbnYuYWRkKHN0YXJ0TWFya2VyLCBhbGxEYXkgP1xuICAgICAgICAgICAgY29udGV4dC5vcHRpb25zLmRlZmF1bHRBbGxEYXlFdmVudER1cmF0aW9uIDpcbiAgICAgICAgICAgIGNvbnRleHQub3B0aW9ucy5kZWZhdWx0VGltZWRFdmVudER1cmF0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWxsRGF5OiBhbGxEYXksXG4gICAgICAgIGhhc0VuZDogaGFzRW5kLFxuICAgICAgICByYW5nZTogeyBzdGFydDogc3RhcnRNYXJrZXIsIGVuZDogZW5kTWFya2VyIH0sXG4gICAgICAgIGZvcmNlZFN0YXJ0VHpvOiBzdGFydE1ldGEgPyBzdGFydE1ldGEuZm9yY2VkVHpvIDogbnVsbCxcbiAgICAgICAgZm9yY2VkRW5kVHpvOiBlbmRNZXRhID8gZW5kTWV0YS5mb3JjZWRUem8gOiBudWxsLFxuICAgIH07XG59XG5mdW5jdGlvbiBjb21wdXRlSXNEZWZhdWx0QWxsRGF5KGV2ZW50U291cmNlLCBjb250ZXh0KSB7XG4gICAgdmFyIHJlcyA9IG51bGw7XG4gICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgIHJlcyA9IGV2ZW50U291cmNlLmRlZmF1bHRBbGxEYXk7XG4gICAgfVxuICAgIGlmIChyZXMgPT0gbnVsbCkge1xuICAgICAgICByZXMgPSBjb250ZXh0Lm9wdGlvbnMuZGVmYXVsdEFsbERheTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cblxuLyogRGF0ZSBzdHVmZiB0aGF0IGRvZXNuJ3QgYmVsb25nIGluIGRhdGVsaWIgY29yZVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4vLyBnaXZlbiBhIHRpbWVkIHJhbmdlLCBjb21wdXRlcyBhbiBhbGwtZGF5IHJhbmdlIHRoYXQgaGFzIHRoZSBzYW1lIGV4YWN0IGR1cmF0aW9uLFxuLy8gYnV0IHdob3NlIHN0YXJ0IHRpbWUgaXMgYWxpZ25lZCB3aXRoIHRoZSBzdGFydCBvZiB0aGUgZGF5LlxuZnVuY3Rpb24gY29tcHV0ZUFsaWduZWREYXlSYW5nZSh0aW1lZFJhbmdlKSB7XG4gICAgdmFyIGRheUNudCA9IE1hdGguZmxvb3IoZGlmZkRheXModGltZWRSYW5nZS5zdGFydCwgdGltZWRSYW5nZS5lbmQpKSB8fCAxO1xuICAgIHZhciBzdGFydCA9IHN0YXJ0T2ZEYXkodGltZWRSYW5nZS5zdGFydCk7XG4gICAgdmFyIGVuZCA9IGFkZERheXMoc3RhcnQsIGRheUNudCk7XG4gICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9O1xufVxuLy8gZ2l2ZW4gYSB0aW1lZCByYW5nZSwgY29tcHV0ZXMgYW4gYWxsLWRheSByYW5nZSBiYXNlZCBvbiBob3cgZm9yIHRoZSBlbmQgZGF0ZSBibGVlZHMgaW50byB0aGUgbmV4dCBkYXlcbi8vIFRPRE86IGdpdmUgbmV4dERheVRocmVzaG9sZCBhIGRlZmF1bHQgYXJnXG5mdW5jdGlvbiBjb21wdXRlVmlzaWJsZURheVJhbmdlKHRpbWVkUmFuZ2UsIG5leHREYXlUaHJlc2hvbGQpIHtcbiAgICBpZiAobmV4dERheVRocmVzaG9sZCA9PT0gdm9pZCAwKSB7IG5leHREYXlUaHJlc2hvbGQgPSBjcmVhdGVEdXJhdGlvbigwKTsgfVxuICAgIHZhciBzdGFydERheSA9IG51bGw7XG4gICAgdmFyIGVuZERheSA9IG51bGw7XG4gICAgaWYgKHRpbWVkUmFuZ2UuZW5kKSB7XG4gICAgICAgIGVuZERheSA9IHN0YXJ0T2ZEYXkodGltZWRSYW5nZS5lbmQpO1xuICAgICAgICB2YXIgZW5kVGltZU1TID0gdGltZWRSYW5nZS5lbmQudmFsdWVPZigpIC0gZW5kRGF5LnZhbHVlT2YoKTsgLy8gIyBvZiBtaWxsaXNlY29uZHMgaW50byBgZW5kRGF5YFxuICAgICAgICAvLyBJZiB0aGUgZW5kIHRpbWUgaXMgYWN0dWFsbHkgaW5jbHVzaXZlbHkgcGFydCBvZiB0aGUgbmV4dCBkYXkgYW5kIGlzIGVxdWFsIHRvIG9yXG4gICAgICAgIC8vIGJleW9uZCB0aGUgbmV4dCBkYXkgdGhyZXNob2xkLCBhZGp1c3QgdGhlIGVuZCB0byBiZSB0aGUgZXhjbHVzaXZlIGVuZCBvZiBgZW5kRGF5YC5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBsZWF2aW5nIGl0IGFzIGluY2x1c2l2ZSB3aWxsIGNhdXNlIGl0IHRvIGV4Y2x1ZGUgYGVuZERheWAuXG4gICAgICAgIGlmIChlbmRUaW1lTVMgJiYgZW5kVGltZU1TID49IGFzUm91Z2hNcyhuZXh0RGF5VGhyZXNob2xkKSkge1xuICAgICAgICAgICAgZW5kRGF5ID0gYWRkRGF5cyhlbmREYXksIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0aW1lZFJhbmdlLnN0YXJ0KSB7XG4gICAgICAgIHN0YXJ0RGF5ID0gc3RhcnRPZkRheSh0aW1lZFJhbmdlLnN0YXJ0KTsgLy8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF5IHRoZSByYW5nZSBzdGFydHNcbiAgICAgICAgLy8gSWYgZW5kIGlzIHdpdGhpbiBgc3RhcnREYXlgIGJ1dCBub3QgcGFzdCBuZXh0RGF5VGhyZXNob2xkLCBhc3NpZ24gdGhlIGRlZmF1bHQgZHVyYXRpb24gb2Ygb25lIGRheS5cbiAgICAgICAgaWYgKGVuZERheSAmJiBlbmREYXkgPD0gc3RhcnREYXkpIHtcbiAgICAgICAgICAgIGVuZERheSA9IGFkZERheXMoc3RhcnREYXksIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydERheSwgZW5kOiBlbmREYXkgfTtcbn1cbi8vIHNwYW5zIGZyb20gb25lIGRheSBpbnRvIGFub3RoZXI/XG5mdW5jdGlvbiBpc011bHRpRGF5UmFuZ2UocmFuZ2UpIHtcbiAgICB2YXIgdmlzaWJsZVJhbmdlID0gY29tcHV0ZVZpc2libGVEYXlSYW5nZShyYW5nZSk7XG4gICAgcmV0dXJuIGRpZmZEYXlzKHZpc2libGVSYW5nZS5zdGFydCwgdmlzaWJsZVJhbmdlLmVuZCkgPiAxO1xufVxuZnVuY3Rpb24gZGlmZkRhdGVzKGRhdGUwLCBkYXRlMSwgZGF0ZUVudiwgbGFyZ2VVbml0KSB7XG4gICAgaWYgKGxhcmdlVW5pdCA9PT0gJ3llYXInKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbihkYXRlRW52LmRpZmZXaG9sZVllYXJzKGRhdGUwLCBkYXRlMSksICd5ZWFyJyk7XG4gICAgfVxuICAgIGlmIChsYXJnZVVuaXQgPT09ICdtb250aCcpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKGRhdGVFbnYuZGlmZldob2xlTW9udGhzKGRhdGUwLCBkYXRlMSksICdtb250aCcpO1xuICAgIH1cbiAgICByZXR1cm4gZGlmZkRheUFuZFRpbWUoZGF0ZTAsIGRhdGUxKTsgLy8gcmV0dXJucyBhIGR1cmF0aW9uXG59XG5cbmZ1bmN0aW9uIHBhcnNlUmFuZ2UoaW5wdXQsIGRhdGVFbnYpIHtcbiAgICB2YXIgc3RhcnQgPSBudWxsO1xuICAgIHZhciBlbmQgPSBudWxsO1xuICAgIGlmIChpbnB1dC5zdGFydCkge1xuICAgICAgICBzdGFydCA9IGRhdGVFbnYuY3JlYXRlTWFya2VyKGlucHV0LnN0YXJ0KTtcbiAgICB9XG4gICAgaWYgKGlucHV0LmVuZCkge1xuICAgICAgICBlbmQgPSBkYXRlRW52LmNyZWF0ZU1hcmtlcihpbnB1dC5lbmQpO1xuICAgIH1cbiAgICBpZiAoIXN0YXJ0ICYmICFlbmQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChzdGFydCAmJiBlbmQgJiYgZW5kIDwgc3RhcnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQgfTtcbn1cbi8vIFNJREUtRUZGRUNUOiB3aWxsIG11dGF0ZSByYW5nZXMuXG4vLyBXaWxsIHJldHVybiBhIG5ldyBhcnJheSByZXN1bHQuXG5mdW5jdGlvbiBpbnZlcnRSYW5nZXMocmFuZ2VzLCBjb25zdHJhaW50UmFuZ2UpIHtcbiAgICB2YXIgaW52ZXJ0ZWRSYW5nZXMgPSBbXTtcbiAgICB2YXIgc3RhcnQgPSBjb25zdHJhaW50UmFuZ2Uuc3RhcnQ7IC8vIHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIHJhbmdlLiB0aGUgc3RhcnQgb2YgdGhlIG5ldyByYW5nZVxuICAgIHZhciBpO1xuICAgIHZhciBkYXRlUmFuZ2U7XG4gICAgLy8gcmFuZ2VzIG5lZWQgdG8gYmUgaW4gb3JkZXIuIHJlcXVpcmVkIGZvciBvdXIgZGF0ZS13YWxraW5nIGFsZ29yaXRobVxuICAgIHJhbmdlcy5zb3J0KGNvbXBhcmVSYW5nZXMpO1xuICAgIGZvciAoaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgZGF0ZVJhbmdlID0gcmFuZ2VzW2ldO1xuICAgICAgICAvLyBhZGQgdGhlIHNwYW4gb2YgdGltZSBiZWZvcmUgdGhlIGV2ZW50IChpZiB0aGVyZSBpcyBhbnkpXG4gICAgICAgIGlmIChkYXRlUmFuZ2Uuc3RhcnQgPiBzdGFydCkgeyAvLyBjb21wYXJlIG1pbGxpc2Vjb25kIHRpbWUgKHNraXAgYW55IGFtYmlnIGxvZ2ljKVxuICAgICAgICAgICAgaW52ZXJ0ZWRSYW5nZXMucHVzaCh7IHN0YXJ0OiBzdGFydCwgZW5kOiBkYXRlUmFuZ2Uuc3RhcnQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGVSYW5nZS5lbmQgPiBzdGFydCkge1xuICAgICAgICAgICAgc3RhcnQgPSBkYXRlUmFuZ2UuZW5kO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGFkZCB0aGUgc3BhbiBvZiB0aW1lIGFmdGVyIHRoZSBsYXN0IGV2ZW50IChpZiB0aGVyZSBpcyBhbnkpXG4gICAgaWYgKHN0YXJ0IDwgY29uc3RyYWludFJhbmdlLmVuZCkgeyAvLyBjb21wYXJlIG1pbGxpc2Vjb25kIHRpbWUgKHNraXAgYW55IGFtYmlnIGxvZ2ljKVxuICAgICAgICBpbnZlcnRlZFJhbmdlcy5wdXNoKHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGNvbnN0cmFpbnRSYW5nZS5lbmQgfSk7XG4gICAgfVxuICAgIHJldHVybiBpbnZlcnRlZFJhbmdlcztcbn1cbmZ1bmN0aW9uIGNvbXBhcmVSYW5nZXMocmFuZ2UwLCByYW5nZTEpIHtcbiAgICByZXR1cm4gcmFuZ2UwLnN0YXJ0LnZhbHVlT2YoKSAtIHJhbmdlMS5zdGFydC52YWx1ZU9mKCk7IC8vIGVhcmxpZXIgcmFuZ2VzIGdvIGZpcnN0XG59XG5mdW5jdGlvbiBpbnRlcnNlY3RSYW5nZXMocmFuZ2UwLCByYW5nZTEpIHtcbiAgICB2YXIgc3RhcnQgPSByYW5nZTAuc3RhcnQsIGVuZCA9IHJhbmdlMC5lbmQ7XG4gICAgdmFyIG5ld1JhbmdlID0gbnVsbDtcbiAgICBpZiAocmFuZ2UxLnN0YXJ0ICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzdGFydCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgc3RhcnQgPSByYW5nZTEuc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGFydCA9IG5ldyBEYXRlKE1hdGgubWF4KHN0YXJ0LnZhbHVlT2YoKSwgcmFuZ2UxLnN0YXJ0LnZhbHVlT2YoKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyYW5nZTEuZW5kICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGVuZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgZW5kID0gcmFuZ2UxLmVuZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVuZCA9IG5ldyBEYXRlKE1hdGgubWluKGVuZC52YWx1ZU9mKCksIHJhbmdlMS5lbmQudmFsdWVPZigpKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0YXJ0ID09PSBudWxsIHx8IGVuZCA9PT0gbnVsbCB8fCBzdGFydCA8IGVuZCkge1xuICAgICAgICBuZXdSYW5nZSA9IHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9O1xuICAgIH1cbiAgICByZXR1cm4gbmV3UmFuZ2U7XG59XG5mdW5jdGlvbiByYW5nZXNFcXVhbChyYW5nZTAsIHJhbmdlMSkge1xuICAgIHJldHVybiAocmFuZ2UwLnN0YXJ0ID09PSBudWxsID8gbnVsbCA6IHJhbmdlMC5zdGFydC52YWx1ZU9mKCkpID09PSAocmFuZ2UxLnN0YXJ0ID09PSBudWxsID8gbnVsbCA6IHJhbmdlMS5zdGFydC52YWx1ZU9mKCkpICYmXG4gICAgICAgIChyYW5nZTAuZW5kID09PSBudWxsID8gbnVsbCA6IHJhbmdlMC5lbmQudmFsdWVPZigpKSA9PT0gKHJhbmdlMS5lbmQgPT09IG51bGwgPyBudWxsIDogcmFuZ2UxLmVuZC52YWx1ZU9mKCkpO1xufVxuZnVuY3Rpb24gcmFuZ2VzSW50ZXJzZWN0KHJhbmdlMCwgcmFuZ2UxKSB7XG4gICAgcmV0dXJuIChyYW5nZTAuZW5kID09PSBudWxsIHx8IHJhbmdlMS5zdGFydCA9PT0gbnVsbCB8fCByYW5nZTAuZW5kID4gcmFuZ2UxLnN0YXJ0KSAmJlxuICAgICAgICAocmFuZ2UwLnN0YXJ0ID09PSBudWxsIHx8IHJhbmdlMS5lbmQgPT09IG51bGwgfHwgcmFuZ2UwLnN0YXJ0IDwgcmFuZ2UxLmVuZCk7XG59XG5mdW5jdGlvbiByYW5nZUNvbnRhaW5zUmFuZ2Uob3V0ZXJSYW5nZSwgaW5uZXJSYW5nZSkge1xuICAgIHJldHVybiAob3V0ZXJSYW5nZS5zdGFydCA9PT0gbnVsbCB8fCAoaW5uZXJSYW5nZS5zdGFydCAhPT0gbnVsbCAmJiBpbm5lclJhbmdlLnN0YXJ0ID49IG91dGVyUmFuZ2Uuc3RhcnQpKSAmJlxuICAgICAgICAob3V0ZXJSYW5nZS5lbmQgPT09IG51bGwgfHwgKGlubmVyUmFuZ2UuZW5kICE9PSBudWxsICYmIGlubmVyUmFuZ2UuZW5kIDw9IG91dGVyUmFuZ2UuZW5kKSk7XG59XG5mdW5jdGlvbiByYW5nZUNvbnRhaW5zTWFya2VyKHJhbmdlLCBkYXRlKSB7XG4gICAgcmV0dXJuIChyYW5nZS5zdGFydCA9PT0gbnVsbCB8fCBkYXRlID49IHJhbmdlLnN0YXJ0KSAmJlxuICAgICAgICAocmFuZ2UuZW5kID09PSBudWxsIHx8IGRhdGUgPCByYW5nZS5lbmQpO1xufVxuLy8gSWYgdGhlIGdpdmVuIGRhdGUgaXMgbm90IHdpdGhpbiB0aGUgZ2l2ZW4gcmFuZ2UsIG1vdmUgaXQgaW5zaWRlLlxuLy8gKElmIGl0J3MgcGFzdCB0aGUgZW5kLCBtYWtlIGl0IG9uZSBtaWxsaXNlY29uZCBiZWZvcmUgdGhlIGVuZCkuXG5mdW5jdGlvbiBjb25zdHJhaW5NYXJrZXJUb1JhbmdlKGRhdGUsIHJhbmdlKSB7XG4gICAgaWYgKHJhbmdlLnN0YXJ0ICE9IG51bGwgJiYgZGF0ZSA8IHJhbmdlLnN0YXJ0KSB7XG4gICAgICAgIHJldHVybiByYW5nZS5zdGFydDtcbiAgICB9XG4gICAgaWYgKHJhbmdlLmVuZCAhPSBudWxsICYmIGRhdGUgPj0gcmFuZ2UuZW5kKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShyYW5nZS5lbmQudmFsdWVPZigpIC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlO1xufVxuXG4vKlxuU3BlY2lmeWluZyBuZXh0RGF5VGhyZXNob2xkIHNpZ25hbHMgdGhhdCBhbGwtZGF5IHJhbmdlcyBzaG91bGQgYmUgc2xpY2VkLlxuKi9cbmZ1bmN0aW9uIHNsaWNlRXZlbnRTdG9yZShldmVudFN0b3JlLCBldmVudFVpQmFzZXMsIGZyYW1pbmdSYW5nZSwgbmV4dERheVRocmVzaG9sZCkge1xuICAgIHZhciBpbnZlcnNlQmdCeUdyb3VwSWQgPSB7fTtcbiAgICB2YXIgaW52ZXJzZUJnQnlEZWZJZCA9IHt9O1xuICAgIHZhciBkZWZCeUdyb3VwSWQgPSB7fTtcbiAgICB2YXIgYmdSYW5nZXMgPSBbXTtcbiAgICB2YXIgZmdSYW5nZXMgPSBbXTtcbiAgICB2YXIgZXZlbnRVaXMgPSBjb21waWxlRXZlbnRVaXMoZXZlbnRTdG9yZS5kZWZzLCBldmVudFVpQmFzZXMpO1xuICAgIGZvciAodmFyIGRlZklkIGluIGV2ZW50U3RvcmUuZGVmcykge1xuICAgICAgICB2YXIgZGVmID0gZXZlbnRTdG9yZS5kZWZzW2RlZklkXTtcbiAgICAgICAgdmFyIHVpID0gZXZlbnRVaXNbZGVmLmRlZklkXTtcbiAgICAgICAgaWYgKHVpLmRpc3BsYXkgPT09ICdpbnZlcnNlLWJhY2tncm91bmQnKSB7XG4gICAgICAgICAgICBpZiAoZGVmLmdyb3VwSWQpIHtcbiAgICAgICAgICAgICAgICBpbnZlcnNlQmdCeUdyb3VwSWRbZGVmLmdyb3VwSWRdID0gW107XG4gICAgICAgICAgICAgICAgaWYgKCFkZWZCeUdyb3VwSWRbZGVmLmdyb3VwSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZkJ5R3JvdXBJZFtkZWYuZ3JvdXBJZF0gPSBkZWY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW52ZXJzZUJnQnlEZWZJZFtkZWZJZF0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBpbnN0YW5jZUlkIGluIGV2ZW50U3RvcmUuaW5zdGFuY2VzKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGV2ZW50U3RvcmUuaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICAgICAgICB2YXIgZGVmID0gZXZlbnRTdG9yZS5kZWZzW2luc3RhbmNlLmRlZklkXTtcbiAgICAgICAgdmFyIHVpID0gZXZlbnRVaXNbZGVmLmRlZklkXTtcbiAgICAgICAgdmFyIG9yaWdSYW5nZSA9IGluc3RhbmNlLnJhbmdlO1xuICAgICAgICB2YXIgbm9ybWFsUmFuZ2UgPSAoIWRlZi5hbGxEYXkgJiYgbmV4dERheVRocmVzaG9sZCkgP1xuICAgICAgICAgICAgY29tcHV0ZVZpc2libGVEYXlSYW5nZShvcmlnUmFuZ2UsIG5leHREYXlUaHJlc2hvbGQpIDpcbiAgICAgICAgICAgIG9yaWdSYW5nZTtcbiAgICAgICAgdmFyIHNsaWNlZFJhbmdlID0gaW50ZXJzZWN0UmFuZ2VzKG5vcm1hbFJhbmdlLCBmcmFtaW5nUmFuZ2UpO1xuICAgICAgICBpZiAoc2xpY2VkUmFuZ2UpIHtcbiAgICAgICAgICAgIGlmICh1aS5kaXNwbGF5ID09PSAnaW52ZXJzZS1iYWNrZ3JvdW5kJykge1xuICAgICAgICAgICAgICAgIGlmIChkZWYuZ3JvdXBJZCkge1xuICAgICAgICAgICAgICAgICAgICBpbnZlcnNlQmdCeUdyb3VwSWRbZGVmLmdyb3VwSWRdLnB1c2goc2xpY2VkUmFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW52ZXJzZUJnQnlEZWZJZFtpbnN0YW5jZS5kZWZJZF0ucHVzaChzbGljZWRSYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodWkuZGlzcGxheSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgKHVpLmRpc3BsYXkgPT09ICdiYWNrZ3JvdW5kJyA/IGJnUmFuZ2VzIDogZmdSYW5nZXMpLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBkZWY6IGRlZixcbiAgICAgICAgICAgICAgICAgICAgdWk6IHVpLFxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlOiBzbGljZWRSYW5nZSxcbiAgICAgICAgICAgICAgICAgICAgaXNTdGFydDogbm9ybWFsUmFuZ2Uuc3RhcnQgJiYgbm9ybWFsUmFuZ2Uuc3RhcnQudmFsdWVPZigpID09PSBzbGljZWRSYW5nZS5zdGFydC52YWx1ZU9mKCksXG4gICAgICAgICAgICAgICAgICAgIGlzRW5kOiBub3JtYWxSYW5nZS5lbmQgJiYgbm9ybWFsUmFuZ2UuZW5kLnZhbHVlT2YoKSA9PT0gc2xpY2VkUmFuZ2UuZW5kLnZhbHVlT2YoKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBncm91cElkIGluIGludmVyc2VCZ0J5R3JvdXBJZCkgeyAvLyBCWSBHUk9VUFxuICAgICAgICB2YXIgcmFuZ2VzID0gaW52ZXJzZUJnQnlHcm91cElkW2dyb3VwSWRdO1xuICAgICAgICB2YXIgaW52ZXJ0ZWRSYW5nZXMgPSBpbnZlcnRSYW5nZXMocmFuZ2VzLCBmcmFtaW5nUmFuZ2UpO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGludmVydGVkUmFuZ2VzXzEgPSBpbnZlcnRlZFJhbmdlczsgX2kgPCBpbnZlcnRlZFJhbmdlc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIGludmVydGVkUmFuZ2UgPSBpbnZlcnRlZFJhbmdlc18xW19pXTtcbiAgICAgICAgICAgIHZhciBkZWYgPSBkZWZCeUdyb3VwSWRbZ3JvdXBJZF07XG4gICAgICAgICAgICB2YXIgdWkgPSBldmVudFVpc1tkZWYuZGVmSWRdO1xuICAgICAgICAgICAgYmdSYW5nZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgZGVmOiBkZWYsXG4gICAgICAgICAgICAgICAgdWk6IHVpLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlOiBudWxsLFxuICAgICAgICAgICAgICAgIHJhbmdlOiBpbnZlcnRlZFJhbmdlLFxuICAgICAgICAgICAgICAgIGlzU3RhcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzRW5kOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGRlZklkIGluIGludmVyc2VCZ0J5RGVmSWQpIHtcbiAgICAgICAgdmFyIHJhbmdlcyA9IGludmVyc2VCZ0J5RGVmSWRbZGVmSWRdO1xuICAgICAgICB2YXIgaW52ZXJ0ZWRSYW5nZXMgPSBpbnZlcnRSYW5nZXMocmFuZ2VzLCBmcmFtaW5nUmFuZ2UpO1xuICAgICAgICBmb3IgKHZhciBfYSA9IDAsIGludmVydGVkUmFuZ2VzXzIgPSBpbnZlcnRlZFJhbmdlczsgX2EgPCBpbnZlcnRlZFJhbmdlc18yLmxlbmd0aDsgX2ErKykge1xuICAgICAgICAgICAgdmFyIGludmVydGVkUmFuZ2UgPSBpbnZlcnRlZFJhbmdlc18yW19hXTtcbiAgICAgICAgICAgIGJnUmFuZ2VzLnB1c2goe1xuICAgICAgICAgICAgICAgIGRlZjogZXZlbnRTdG9yZS5kZWZzW2RlZklkXSxcbiAgICAgICAgICAgICAgICB1aTogZXZlbnRVaXNbZGVmSWRdLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlOiBudWxsLFxuICAgICAgICAgICAgICAgIHJhbmdlOiBpbnZlcnRlZFJhbmdlLFxuICAgICAgICAgICAgICAgIGlzU3RhcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzRW5kOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGJnOiBiZ1JhbmdlcywgZmc6IGZnUmFuZ2VzIH07XG59XG5mdW5jdGlvbiBoYXNCZ1JlbmRlcmluZyhkZWYpIHtcbiAgICByZXR1cm4gZGVmLnVpLmRpc3BsYXkgPT09ICdiYWNrZ3JvdW5kJyB8fCBkZWYudWkuZGlzcGxheSA9PT0gJ2ludmVyc2UtYmFja2dyb3VuZCc7XG59XG5mdW5jdGlvbiBzZXRFbFNlZyhlbCwgc2VnKSB7XG4gICAgZWwuZmNTZWcgPSBzZWc7XG59XG5mdW5jdGlvbiBnZXRFbFNlZyhlbCkge1xuICAgIHJldHVybiBlbC5mY1NlZyB8fFxuICAgICAgICBlbC5wYXJlbnROb2RlLmZjU2VnIHx8IC8vIGZvciB0aGUgaGFybmVzc1xuICAgICAgICBudWxsO1xufVxuLy8gZXZlbnQgdWkgY29tcHV0YXRpb25cbmZ1bmN0aW9uIGNvbXBpbGVFdmVudFVpcyhldmVudERlZnMsIGV2ZW50VWlCYXNlcykge1xuICAgIHJldHVybiBtYXBIYXNoKGV2ZW50RGVmcywgZnVuY3Rpb24gKGV2ZW50RGVmKSB7IHJldHVybiBjb21waWxlRXZlbnRVaShldmVudERlZiwgZXZlbnRVaUJhc2VzKTsgfSk7XG59XG5mdW5jdGlvbiBjb21waWxlRXZlbnRVaShldmVudERlZiwgZXZlbnRVaUJhc2VzKSB7XG4gICAgdmFyIHVpcyA9IFtdO1xuICAgIGlmIChldmVudFVpQmFzZXNbJyddKSB7XG4gICAgICAgIHVpcy5wdXNoKGV2ZW50VWlCYXNlc1snJ10pO1xuICAgIH1cbiAgICBpZiAoZXZlbnRVaUJhc2VzW2V2ZW50RGVmLmRlZklkXSkge1xuICAgICAgICB1aXMucHVzaChldmVudFVpQmFzZXNbZXZlbnREZWYuZGVmSWRdKTtcbiAgICB9XG4gICAgdWlzLnB1c2goZXZlbnREZWYudWkpO1xuICAgIHJldHVybiBjb21iaW5lRXZlbnRVaXModWlzKTtcbn1cbmZ1bmN0aW9uIHNvcnRFdmVudFNlZ3Moc2VncywgZXZlbnRPcmRlclNwZWNzKSB7XG4gICAgdmFyIG9ianMgPSBzZWdzLm1hcChidWlsZFNlZ0NvbXBhcmVPYmopO1xuICAgIG9ianMuc29ydChmdW5jdGlvbiAob2JqMCwgb2JqMSkgeyByZXR1cm4gY29tcGFyZUJ5RmllbGRTcGVjcyhvYmowLCBvYmoxLCBldmVudE9yZGVyU3BlY3MpOyB9KTtcbiAgICByZXR1cm4gb2Jqcy5tYXAoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMuX3NlZzsgfSk7XG59XG4vLyByZXR1cm5zIGEgb2JqZWN0IHdpdGggYWxsIHByaW1pdGl2ZSBwcm9wcyB0aGF0IGNhbiBiZSBjb21wYXJlZFxuZnVuY3Rpb24gYnVpbGRTZWdDb21wYXJlT2JqKHNlZykge1xuICAgIHZhciBldmVudFJhbmdlID0gc2VnLmV2ZW50UmFuZ2U7XG4gICAgdmFyIGV2ZW50RGVmID0gZXZlbnRSYW5nZS5kZWY7XG4gICAgdmFyIHJhbmdlID0gZXZlbnRSYW5nZS5pbnN0YW5jZSA/IGV2ZW50UmFuZ2UuaW5zdGFuY2UucmFuZ2UgOiBldmVudFJhbmdlLnJhbmdlO1xuICAgIHZhciBzdGFydCA9IHJhbmdlLnN0YXJ0ID8gcmFuZ2Uuc3RhcnQudmFsdWVPZigpIDogMDsgLy8gVE9ETzogYmV0dGVyIHN1cHBvcnQgZm9yIG9wZW4tcmFuZ2UgZXZlbnRzXG4gICAgdmFyIGVuZCA9IHJhbmdlLmVuZCA/IHJhbmdlLmVuZC52YWx1ZU9mKCkgOiAwOyAvLyBcIlxuICAgIHJldHVybiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgZXZlbnREZWYuZXh0ZW5kZWRQcm9wcyksIGV2ZW50RGVmKSwgeyBpZDogZXZlbnREZWYucHVibGljSWQsIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgZW5kOiBlbmQsIGR1cmF0aW9uOiBlbmQgLSBzdGFydCwgYWxsRGF5OiBOdW1iZXIoZXZlbnREZWYuYWxsRGF5KSwgX3NlZzogc2VnIH0pO1xufVxuZnVuY3Rpb24gY29tcHV0ZVNlZ0RyYWdnYWJsZShzZWcsIGNvbnRleHQpIHtcbiAgICB2YXIgcGx1Z2luSG9va3MgPSBjb250ZXh0LnBsdWdpbkhvb2tzO1xuICAgIHZhciB0cmFuc2Zvcm1lcnMgPSBwbHVnaW5Ib29rcy5pc0RyYWdnYWJsZVRyYW5zZm9ybWVycztcbiAgICB2YXIgX2EgPSBzZWcuZXZlbnRSYW5nZSwgZGVmID0gX2EuZGVmLCB1aSA9IF9hLnVpO1xuICAgIHZhciB2YWwgPSB1aS5zdGFydEVkaXRhYmxlO1xuICAgIGZvciAodmFyIF9pID0gMCwgdHJhbnNmb3JtZXJzXzEgPSB0cmFuc2Zvcm1lcnM7IF9pIDwgdHJhbnNmb3JtZXJzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyc18xW19pXTtcbiAgICAgICAgdmFsID0gdHJhbnNmb3JtZXIodmFsLCBkZWYsIHVpLCBjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVTZWdTdGFydFJlc2l6YWJsZShzZWcsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gc2VnLmlzU3RhcnQgJiYgc2VnLmV2ZW50UmFuZ2UudWkuZHVyYXRpb25FZGl0YWJsZSAmJiBjb250ZXh0Lm9wdGlvbnMuZXZlbnRSZXNpemFibGVGcm9tU3RhcnQ7XG59XG5mdW5jdGlvbiBjb21wdXRlU2VnRW5kUmVzaXphYmxlKHNlZywgY29udGV4dCkge1xuICAgIHJldHVybiBzZWcuaXNFbmQgJiYgc2VnLmV2ZW50UmFuZ2UudWkuZHVyYXRpb25FZGl0YWJsZTtcbn1cbmZ1bmN0aW9uIGJ1aWxkU2VnVGltZVRleHQoc2VnLCB0aW1lRm9ybWF0LCBjb250ZXh0LCBkZWZhdWx0RGlzcGxheUV2ZW50VGltZSwgLy8gZGVmYXVsdHMgdG8gdHJ1ZVxuZGVmYXVsdERpc3BsYXlFdmVudEVuZCwgLy8gZGVmYXVsdHMgdG8gdHJ1ZVxuc3RhcnRPdmVycmlkZSwgZW5kT3ZlcnJpZGUpIHtcbiAgICB2YXIgZGF0ZUVudiA9IGNvbnRleHQuZGF0ZUVudiwgb3B0aW9ucyA9IGNvbnRleHQub3B0aW9ucztcbiAgICB2YXIgZGlzcGxheUV2ZW50VGltZSA9IG9wdGlvbnMuZGlzcGxheUV2ZW50VGltZSwgZGlzcGxheUV2ZW50RW5kID0gb3B0aW9ucy5kaXNwbGF5RXZlbnRFbmQ7XG4gICAgdmFyIGV2ZW50RGVmID0gc2VnLmV2ZW50UmFuZ2UuZGVmO1xuICAgIHZhciBldmVudEluc3RhbmNlID0gc2VnLmV2ZW50UmFuZ2UuaW5zdGFuY2U7XG4gICAgaWYgKGRpc3BsYXlFdmVudFRpbWUgPT0gbnVsbCkge1xuICAgICAgICBkaXNwbGF5RXZlbnRUaW1lID0gZGVmYXVsdERpc3BsYXlFdmVudFRpbWUgIT09IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZGlzcGxheUV2ZW50RW5kID09IG51bGwpIHtcbiAgICAgICAgZGlzcGxheUV2ZW50RW5kID0gZGVmYXVsdERpc3BsYXlFdmVudEVuZCAhPT0gZmFsc2U7XG4gICAgfVxuICAgIHZhciB3aG9sZUV2ZW50U3RhcnQgPSBldmVudEluc3RhbmNlLnJhbmdlLnN0YXJ0O1xuICAgIHZhciB3aG9sZUV2ZW50RW5kID0gZXZlbnRJbnN0YW5jZS5yYW5nZS5lbmQ7XG4gICAgdmFyIHNlZ1N0YXJ0ID0gc3RhcnRPdmVycmlkZSB8fCBzZWcuc3RhcnQgfHwgc2VnLmV2ZW50UmFuZ2UucmFuZ2Uuc3RhcnQ7XG4gICAgdmFyIHNlZ0VuZCA9IGVuZE92ZXJyaWRlIHx8IHNlZy5lbmQgfHwgc2VnLmV2ZW50UmFuZ2UucmFuZ2UuZW5kO1xuICAgIHZhciBpc1N0YXJ0RGF5ID0gc3RhcnRPZkRheSh3aG9sZUV2ZW50U3RhcnQpLnZhbHVlT2YoKSA9PT0gc3RhcnRPZkRheShzZWdTdGFydCkudmFsdWVPZigpO1xuICAgIHZhciBpc0VuZERheSA9IHN0YXJ0T2ZEYXkoYWRkTXMod2hvbGVFdmVudEVuZCwgLTEpKS52YWx1ZU9mKCkgPT09IHN0YXJ0T2ZEYXkoYWRkTXMoc2VnRW5kLCAtMSkpLnZhbHVlT2YoKTtcbiAgICBpZiAoZGlzcGxheUV2ZW50VGltZSAmJiAhZXZlbnREZWYuYWxsRGF5ICYmIChpc1N0YXJ0RGF5IHx8IGlzRW5kRGF5KSkge1xuICAgICAgICBzZWdTdGFydCA9IGlzU3RhcnREYXkgPyB3aG9sZUV2ZW50U3RhcnQgOiBzZWdTdGFydDtcbiAgICAgICAgc2VnRW5kID0gaXNFbmREYXkgPyB3aG9sZUV2ZW50RW5kIDogc2VnRW5kO1xuICAgICAgICBpZiAoZGlzcGxheUV2ZW50RW5kICYmIGV2ZW50RGVmLmhhc0VuZCkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGVFbnYuZm9ybWF0UmFuZ2Uoc2VnU3RhcnQsIHNlZ0VuZCwgdGltZUZvcm1hdCwge1xuICAgICAgICAgICAgICAgIGZvcmNlZFN0YXJ0VHpvOiBzdGFydE92ZXJyaWRlID8gbnVsbCA6IGV2ZW50SW5zdGFuY2UuZm9yY2VkU3RhcnRUem8sXG4gICAgICAgICAgICAgICAgZm9yY2VkRW5kVHpvOiBlbmRPdmVycmlkZSA/IG51bGwgOiBldmVudEluc3RhbmNlLmZvcmNlZEVuZFR6byxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlRW52LmZvcm1hdChzZWdTdGFydCwgdGltZUZvcm1hdCwge1xuICAgICAgICAgICAgZm9yY2VkVHpvOiBzdGFydE92ZXJyaWRlID8gbnVsbCA6IGV2ZW50SW5zdGFuY2UuZm9yY2VkU3RhcnRUem8sIC8vIG5vb29vbywgc2FtZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuZnVuY3Rpb24gZ2V0U2VnTWV0YShzZWcsIHRvZGF5UmFuZ2UsIG5vd0RhdGUpIHtcbiAgICB2YXIgc2VnUmFuZ2UgPSBzZWcuZXZlbnRSYW5nZS5yYW5nZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpc1Bhc3Q6IHNlZ1JhbmdlLmVuZCA8IChub3dEYXRlIHx8IHRvZGF5UmFuZ2Uuc3RhcnQpLFxuICAgICAgICBpc0Z1dHVyZTogc2VnUmFuZ2Uuc3RhcnQgPj0gKG5vd0RhdGUgfHwgdG9kYXlSYW5nZS5lbmQpLFxuICAgICAgICBpc1RvZGF5OiB0b2RheVJhbmdlICYmIHJhbmdlQ29udGFpbnNNYXJrZXIodG9kYXlSYW5nZSwgc2VnUmFuZ2Uuc3RhcnQpLFxuICAgIH07XG59XG5mdW5jdGlvbiBnZXRFdmVudENsYXNzTmFtZXMocHJvcHMpIHtcbiAgICB2YXIgY2xhc3NOYW1lcyA9IFsnZmMtZXZlbnQnXTtcbiAgICBpZiAocHJvcHMuaXNNaXJyb3IpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1ldmVudC1taXJyb3InKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmlzRHJhZ2dhYmxlKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtZHJhZ2dhYmxlJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5pc1N0YXJ0UmVzaXphYmxlIHx8IHByb3BzLmlzRW5kUmVzaXphYmxlKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtcmVzaXphYmxlJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtZHJhZ2dpbmcnKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmlzUmVzaXppbmcpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1ldmVudC1yZXNpemluZycpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuaXNTZWxlY3RlZCkge1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLWV2ZW50LXNlbGVjdGVkJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5pc1N0YXJ0KSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtc3RhcnQnKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmlzRW5kKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtZW5kJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5pc1Bhc3QpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1ldmVudC1wYXN0Jyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5pc1RvZGF5KSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtdG9kYXknKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmlzRnV0dXJlKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtZnV0dXJlJyk7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWVzO1xufVxuZnVuY3Rpb24gYnVpbGRFdmVudFJhbmdlS2V5KGV2ZW50UmFuZ2UpIHtcbiAgICByZXR1cm4gZXZlbnRSYW5nZS5pbnN0YW5jZVxuICAgICAgICA/IGV2ZW50UmFuZ2UuaW5zdGFuY2UuaW5zdGFuY2VJZFxuICAgICAgICA6IGV2ZW50UmFuZ2UuZGVmLmRlZklkICsgXCI6XCIgKyBldmVudFJhbmdlLnJhbmdlLnN0YXJ0LnRvSVNPU3RyaW5nKCk7XG4gICAgLy8gaW52ZXJzZS1iYWNrZ3JvdW5kIGV2ZW50cyBkb24ndCBoYXZlIHNwZWNpZmljIGluc3RhbmNlcy4gVE9ETzogYmV0dGVyIHNvbHV0aW9uXG59XG5mdW5jdGlvbiBnZXRTZWdBbmNob3JBdHRycyhzZWcsIGNvbnRleHQpIHtcbiAgICB2YXIgX2EgPSBzZWcuZXZlbnRSYW5nZSwgZGVmID0gX2EuZGVmLCBpbnN0YW5jZSA9IF9hLmluc3RhbmNlO1xuICAgIHZhciB1cmwgPSBkZWYudXJsO1xuICAgIGlmICh1cmwpIHtcbiAgICAgICAgcmV0dXJuIHsgaHJlZjogdXJsIH07XG4gICAgfVxuICAgIHZhciBlbWl0dGVyID0gY29udGV4dC5lbWl0dGVyLCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zO1xuICAgIHZhciBldmVudEludGVyYWN0aXZlID0gb3B0aW9ucy5ldmVudEludGVyYWN0aXZlO1xuICAgIGlmIChldmVudEludGVyYWN0aXZlID09IG51bGwpIHtcbiAgICAgICAgZXZlbnRJbnRlcmFjdGl2ZSA9IGRlZi5pbnRlcmFjdGl2ZTtcbiAgICAgICAgaWYgKGV2ZW50SW50ZXJhY3RpdmUgPT0gbnVsbCkge1xuICAgICAgICAgICAgZXZlbnRJbnRlcmFjdGl2ZSA9IEJvb2xlYW4oZW1pdHRlci5oYXNIYW5kbGVycygnZXZlbnRDbGljaycpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBtb2NrIHdoYXQgaGFwcGVucyBpbiBFdmVudENsaWNraW5nXG4gICAgaWYgKGV2ZW50SW50ZXJhY3RpdmUpIHtcbiAgICAgICAgLy8gb25seSBhdHRhY2gga2V5Ym9hcmQtcmVsYXRlZCBoYW5kbGVycyBiZWNhdXNlIGNsaWNrIGhhbmRsZXIgaXMgYWxyZWFkeSBkb25lIGluIEV2ZW50Q2xpY2tpbmdcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFyaWFLZXlib2FyZEF0dHJzKGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgZW1pdHRlci50cmlnZ2VyKCdldmVudENsaWNrJywge1xuICAgICAgICAgICAgICAgIGVsOiBldi50YXJnZXQsXG4gICAgICAgICAgICAgICAgZXZlbnQ6IG5ldyBFdmVudEFwaShjb250ZXh0LCBkZWYsIGluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICBqc0V2ZW50OiBldixcbiAgICAgICAgICAgICAgICB2aWV3OiBjb250ZXh0LnZpZXdBcGksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7fTtcbn1cblxudmFyIFNUQU5EQVJEX1BST1BTID0ge1xuICAgIHN0YXJ0OiBpZGVudGl0eSxcbiAgICBlbmQ6IGlkZW50aXR5LFxuICAgIGFsbERheTogQm9vbGVhbixcbn07XG5mdW5jdGlvbiBwYXJzZURhdGVTcGFuKHJhdywgZGF0ZUVudiwgZGVmYXVsdER1cmF0aW9uKSB7XG4gICAgdmFyIHNwYW4gPSBwYXJzZU9wZW5EYXRlU3BhbihyYXcsIGRhdGVFbnYpO1xuICAgIHZhciByYW5nZSA9IHNwYW4ucmFuZ2U7XG4gICAgaWYgKCFyYW5nZS5zdGFydCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKCFyYW5nZS5lbmQpIHtcbiAgICAgICAgaWYgKGRlZmF1bHREdXJhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByYW5nZS5lbmQgPSBkYXRlRW52LmFkZChyYW5nZS5zdGFydCwgZGVmYXVsdER1cmF0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHNwYW47XG59XG4vKlxuVE9ETzogc29tZWhvdyBjb21iaW5lIHdpdGggcGFyc2VSYW5nZT9cbldpbGwgcmV0dXJuIG51bGwgaWYgdGhlIHN0YXJ0L2VuZCBwcm9wcyB3ZXJlIHByZXNlbnQgYnV0IHBhcnNlZCBpbnZhbGlkbHkuXG4qL1xuZnVuY3Rpb24gcGFyc2VPcGVuRGF0ZVNwYW4ocmF3LCBkYXRlRW52KSB7XG4gICAgdmFyIF9hID0gcmVmaW5lUHJvcHMocmF3LCBTVEFOREFSRF9QUk9QUyksIHN0YW5kYXJkUHJvcHMgPSBfYS5yZWZpbmVkLCBleHRyYSA9IF9hLmV4dHJhO1xuICAgIHZhciBzdGFydE1ldGEgPSBzdGFuZGFyZFByb3BzLnN0YXJ0ID8gZGF0ZUVudi5jcmVhdGVNYXJrZXJNZXRhKHN0YW5kYXJkUHJvcHMuc3RhcnQpIDogbnVsbDtcbiAgICB2YXIgZW5kTWV0YSA9IHN0YW5kYXJkUHJvcHMuZW5kID8gZGF0ZUVudi5jcmVhdGVNYXJrZXJNZXRhKHN0YW5kYXJkUHJvcHMuZW5kKSA6IG51bGw7XG4gICAgdmFyIGFsbERheSA9IHN0YW5kYXJkUHJvcHMuYWxsRGF5O1xuICAgIGlmIChhbGxEYXkgPT0gbnVsbCkge1xuICAgICAgICBhbGxEYXkgPSAoc3RhcnRNZXRhICYmIHN0YXJ0TWV0YS5pc1RpbWVVbnNwZWNpZmllZCkgJiZcbiAgICAgICAgICAgICghZW5kTWV0YSB8fCBlbmRNZXRhLmlzVGltZVVuc3BlY2lmaWVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRzbGliLl9fYXNzaWduKHsgcmFuZ2U6IHtcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydE1ldGEgPyBzdGFydE1ldGEubWFya2VyIDogbnVsbCxcbiAgICAgICAgICAgIGVuZDogZW5kTWV0YSA/IGVuZE1ldGEubWFya2VyIDogbnVsbCxcbiAgICAgICAgfSwgYWxsRGF5OiBhbGxEYXkgfSwgZXh0cmEpO1xufVxuZnVuY3Rpb24gaXNEYXRlU3BhbnNFcXVhbChzcGFuMCwgc3BhbjEpIHtcbiAgICByZXR1cm4gcmFuZ2VzRXF1YWwoc3BhbjAucmFuZ2UsIHNwYW4xLnJhbmdlKSAmJlxuICAgICAgICBzcGFuMC5hbGxEYXkgPT09IHNwYW4xLmFsbERheSAmJlxuICAgICAgICBpc1NwYW5Qcm9wc0VxdWFsKHNwYW4wLCBzcGFuMSk7XG59XG4vLyB0aGUgTk9OLURBVEUtUkVMQVRFRCBwcm9wc1xuZnVuY3Rpb24gaXNTcGFuUHJvcHNFcXVhbChzcGFuMCwgc3BhbjEpIHtcbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBzcGFuMSkge1xuICAgICAgICBpZiAocHJvcE5hbWUgIT09ICdyYW5nZScgJiYgcHJvcE5hbWUgIT09ICdhbGxEYXknKSB7XG4gICAgICAgICAgICBpZiAoc3BhbjBbcHJvcE5hbWVdICE9PSBzcGFuMVtwcm9wTmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYXJlIHRoZXJlIGFueSBwcm9wcyB0aGF0IHNwYW4wIGhhcyB0aGF0IHNwYW4xIERPRVNOJ1QgaGF2ZT9cbiAgICAvLyBib3RoIGhhdmUgcmFuZ2UvYWxsRGF5LCBzbyBubyBuZWVkIHRvIHNwZWNpYWwtY2FzZS5cbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBzcGFuMCkge1xuICAgICAgICBpZiAoIShwcm9wTmFtZSBpbiBzcGFuMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGJ1aWxkRGF0ZVNwYW5BcGkoc3BhbiwgZGF0ZUVudikge1xuICAgIHJldHVybiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgYnVpbGRSYW5nZUFwaShzcGFuLnJhbmdlLCBkYXRlRW52LCBzcGFuLmFsbERheSkpLCB7IGFsbERheTogc3Bhbi5hbGxEYXkgfSk7XG59XG5mdW5jdGlvbiBidWlsZFJhbmdlQXBpV2l0aFRpbWVab25lKHJhbmdlLCBkYXRlRW52LCBvbWl0VGltZSkge1xuICAgIHJldHVybiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgYnVpbGRSYW5nZUFwaShyYW5nZSwgZGF0ZUVudiwgb21pdFRpbWUpKSwgeyB0aW1lWm9uZTogZGF0ZUVudi50aW1lWm9uZSB9KTtcbn1cbmZ1bmN0aW9uIGJ1aWxkUmFuZ2VBcGkocmFuZ2UsIGRhdGVFbnYsIG9taXRUaW1lKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IGRhdGVFbnYudG9EYXRlKHJhbmdlLnN0YXJ0KSxcbiAgICAgICAgZW5kOiBkYXRlRW52LnRvRGF0ZShyYW5nZS5lbmQpLFxuICAgICAgICBzdGFydFN0cjogZGF0ZUVudi5mb3JtYXRJc28ocmFuZ2Uuc3RhcnQsIHsgb21pdFRpbWU6IG9taXRUaW1lIH0pLFxuICAgICAgICBlbmRTdHI6IGRhdGVFbnYuZm9ybWF0SXNvKHJhbmdlLmVuZCwgeyBvbWl0VGltZTogb21pdFRpbWUgfSksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGZhYnJpY2F0ZUV2ZW50UmFuZ2UoZGF0ZVNwYW4sIGV2ZW50VWlCYXNlcywgY29udGV4dCkge1xuICAgIHZhciByZXMgPSByZWZpbmVFdmVudERlZih7IGVkaXRhYmxlOiBmYWxzZSB9LCBjb250ZXh0KTtcbiAgICB2YXIgZGVmID0gcGFyc2VFdmVudERlZihyZXMucmVmaW5lZCwgcmVzLmV4dHJhLCAnJywgLy8gc291cmNlSWRcbiAgICBkYXRlU3Bhbi5hbGxEYXksIHRydWUsIC8vIGhhc0VuZFxuICAgIGNvbnRleHQpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGRlZjogZGVmLFxuICAgICAgICB1aTogY29tcGlsZUV2ZW50VWkoZGVmLCBldmVudFVpQmFzZXMpLFxuICAgICAgICBpbnN0YW5jZTogY3JlYXRlRXZlbnRJbnN0YW5jZShkZWYuZGVmSWQsIGRhdGVTcGFuLnJhbmdlKSxcbiAgICAgICAgcmFuZ2U6IGRhdGVTcGFuLnJhbmdlLFxuICAgICAgICBpc1N0YXJ0OiB0cnVlLFxuICAgICAgICBpc0VuZDogdHJ1ZSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiB0cmlnZ2VyRGF0ZVNlbGVjdChzZWxlY3Rpb24sIHBldiwgY29udGV4dCkge1xuICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdzZWxlY3QnLCB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgYnVpbGREYXRlU3BhbkFwaVdpdGhDb250ZXh0KHNlbGVjdGlvbiwgY29udGV4dCkpLCB7IGpzRXZlbnQ6IHBldiA/IHBldi5vcmlnRXZlbnQgOiBudWxsLCB2aWV3OiBjb250ZXh0LnZpZXdBcGkgfHwgY29udGV4dC5jYWxlbmRhckFwaS52aWV3IH0pKTtcbn1cbmZ1bmN0aW9uIHRyaWdnZXJEYXRlVW5zZWxlY3QocGV2LCBjb250ZXh0KSB7XG4gICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ3Vuc2VsZWN0Jywge1xuICAgICAgICBqc0V2ZW50OiBwZXYgPyBwZXYub3JpZ0V2ZW50IDogbnVsbCxcbiAgICAgICAgdmlldzogY29udGV4dC52aWV3QXBpIHx8IGNvbnRleHQuY2FsZW5kYXJBcGkudmlldyxcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGJ1aWxkRGF0ZVNwYW5BcGlXaXRoQ29udGV4dChkYXRlU3BhbiwgY29udGV4dCkge1xuICAgIHZhciBwcm9wcyA9IHt9O1xuICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBjb250ZXh0LnBsdWdpbkhvb2tzLmRhdGVTcGFuVHJhbnNmb3JtczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IF9hW19pXTtcbiAgICAgICAgdHNsaWIuX19hc3NpZ24ocHJvcHMsIHRyYW5zZm9ybShkYXRlU3BhbiwgY29udGV4dCkpO1xuICAgIH1cbiAgICB0c2xpYi5fX2Fzc2lnbihwcm9wcywgYnVpbGREYXRlU3BhbkFwaShkYXRlU3BhbiwgY29udGV4dC5kYXRlRW52KSk7XG4gICAgcmV0dXJuIHByb3BzO1xufVxuLy8gR2l2ZW4gYW4gZXZlbnQncyBhbGxEYXkgc3RhdHVzIGFuZCBzdGFydCBkYXRlLCByZXR1cm4gd2hhdCBpdHMgZmFsbGJhY2sgZW5kIGRhdGUgc2hvdWxkIGJlLlxuLy8gVE9ETzogcmVuYW1lIHRvIGNvbXB1dGVEZWZhdWx0RXZlbnRFbmRcbmZ1bmN0aW9uIGdldERlZmF1bHRFdmVudEVuZChhbGxEYXksIG1hcmtlciwgY29udGV4dCkge1xuICAgIHZhciBkYXRlRW52ID0gY29udGV4dC5kYXRlRW52LCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zO1xuICAgIHZhciBlbmQgPSBtYXJrZXI7XG4gICAgaWYgKGFsbERheSkge1xuICAgICAgICBlbmQgPSBzdGFydE9mRGF5KGVuZCk7XG4gICAgICAgIGVuZCA9IGRhdGVFbnYuYWRkKGVuZCwgb3B0aW9ucy5kZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBlbmQgPSBkYXRlRW52LmFkZChlbmQsIG9wdGlvbnMuZGVmYXVsdFRpbWVkRXZlbnREdXJhdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBlbmQ7XG59XG5cbi8vIGFwcGxpZXMgdGhlIG11dGF0aW9uIHRvIEFMTCBkZWZzL2luc3RhbmNlcyB3aXRoaW4gdGhlIGV2ZW50IHN0b3JlXG5mdW5jdGlvbiBhcHBseU11dGF0aW9uVG9FdmVudFN0b3JlKGV2ZW50U3RvcmUsIGV2ZW50Q29uZmlnQmFzZSwgbXV0YXRpb24sIGNvbnRleHQpIHtcbiAgICB2YXIgZXZlbnRDb25maWdzID0gY29tcGlsZUV2ZW50VWlzKGV2ZW50U3RvcmUuZGVmcywgZXZlbnRDb25maWdCYXNlKTtcbiAgICB2YXIgZGVzdCA9IGNyZWF0ZUVtcHR5RXZlbnRTdG9yZSgpO1xuICAgIGZvciAodmFyIGRlZklkIGluIGV2ZW50U3RvcmUuZGVmcykge1xuICAgICAgICB2YXIgZGVmID0gZXZlbnRTdG9yZS5kZWZzW2RlZklkXTtcbiAgICAgICAgZGVzdC5kZWZzW2RlZklkXSA9IGFwcGx5TXV0YXRpb25Ub0V2ZW50RGVmKGRlZiwgZXZlbnRDb25maWdzW2RlZklkXSwgbXV0YXRpb24sIGNvbnRleHQpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpbnN0YW5jZUlkIGluIGV2ZW50U3RvcmUuaW5zdGFuY2VzKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGV2ZW50U3RvcmUuaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICAgICAgICB2YXIgZGVmID0gZGVzdC5kZWZzW2luc3RhbmNlLmRlZklkXTsgLy8gaW1wb3J0YW50IHRvIGdyYWIgdGhlIG5ld2x5IG1vZGlmaWVkIGRlZlxuICAgICAgICBkZXN0Lmluc3RhbmNlc1tpbnN0YW5jZUlkXSA9IGFwcGx5TXV0YXRpb25Ub0V2ZW50SW5zdGFuY2UoaW5zdGFuY2UsIGRlZiwgZXZlbnRDb25maWdzW2luc3RhbmNlLmRlZklkXSwgbXV0YXRpb24sIGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbn1cbmZ1bmN0aW9uIGFwcGx5TXV0YXRpb25Ub0V2ZW50RGVmKGV2ZW50RGVmLCBldmVudENvbmZpZywgbXV0YXRpb24sIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhbmRhcmRQcm9wcyA9IG11dGF0aW9uLnN0YW5kYXJkUHJvcHMgfHwge307XG4gICAgLy8gaWYgaGFzRW5kIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQsIGd1ZXNzIGEgZ29vZCB2YWx1ZSBiYXNlZCBvbiBkZWx0YXMuXG4gICAgLy8gaWYgZHVyYXRpb24gd2lsbCBjaGFuZ2UsIHRoZXJlJ3Mgbm8gd2F5IHRoZSBkZWZhdWx0IGR1cmF0aW9uIHdpbGwgcGVyc2lzdCxcbiAgICAvLyBhbmQgdGh1cywgd2UgbmVlZCB0byBtYXJrIHRoZSBldmVudCBhcyBoYXZpbmcgYSByZWFsIGVuZFxuICAgIGlmIChzdGFuZGFyZFByb3BzLmhhc0VuZCA9PSBudWxsICYmXG4gICAgICAgIGV2ZW50Q29uZmlnLmR1cmF0aW9uRWRpdGFibGUgJiZcbiAgICAgICAgKG11dGF0aW9uLnN0YXJ0RGVsdGEgfHwgbXV0YXRpb24uZW5kRGVsdGEpKSB7XG4gICAgICAgIHN0YW5kYXJkUHJvcHMuaGFzRW5kID0gdHJ1ZTsgLy8gVE9ETzogaXMgdGhpcyBtdXRhdGlvbiBva2F5P1xuICAgIH1cbiAgICB2YXIgY29weSA9IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBldmVudERlZiksIHN0YW5kYXJkUHJvcHMpLCB7IHVpOiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgZXZlbnREZWYudWkpLCBzdGFuZGFyZFByb3BzLnVpKSB9KTtcbiAgICBpZiAobXV0YXRpb24uZXh0ZW5kZWRQcm9wcykge1xuICAgICAgICBjb3B5LmV4dGVuZGVkUHJvcHMgPSB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgY29weS5leHRlbmRlZFByb3BzKSwgbXV0YXRpb24uZXh0ZW5kZWRQcm9wcyk7XG4gICAgfVxuICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBjb250ZXh0LnBsdWdpbkhvb2tzLmV2ZW50RGVmTXV0YXRpb25BcHBsaWVyczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGFwcGxpZXIgPSBfYVtfaV07XG4gICAgICAgIGFwcGxpZXIoY29weSwgbXV0YXRpb24sIGNvbnRleHQpO1xuICAgIH1cbiAgICBpZiAoIWNvcHkuaGFzRW5kICYmIGNvbnRleHQub3B0aW9ucy5mb3JjZUV2ZW50RHVyYXRpb24pIHtcbiAgICAgICAgY29weS5oYXNFbmQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gY29weTtcbn1cbmZ1bmN0aW9uIGFwcGx5TXV0YXRpb25Ub0V2ZW50SW5zdGFuY2UoZXZlbnRJbnN0YW5jZSwgZXZlbnREZWYsIC8vIG11c3QgZmlyc3QgYmUgbW9kaWZpZWQgYnkgYXBwbHlNdXRhdGlvblRvRXZlbnREZWZcbmV2ZW50Q29uZmlnLCBtdXRhdGlvbiwgY29udGV4dCkge1xuICAgIHZhciBkYXRlRW52ID0gY29udGV4dC5kYXRlRW52O1xuICAgIHZhciBmb3JjZUFsbERheSA9IG11dGF0aW9uLnN0YW5kYXJkUHJvcHMgJiYgbXV0YXRpb24uc3RhbmRhcmRQcm9wcy5hbGxEYXkgPT09IHRydWU7XG4gICAgdmFyIGNsZWFyRW5kID0gbXV0YXRpb24uc3RhbmRhcmRQcm9wcyAmJiBtdXRhdGlvbi5zdGFuZGFyZFByb3BzLmhhc0VuZCA9PT0gZmFsc2U7XG4gICAgdmFyIGNvcHkgPSB0c2xpYi5fX2Fzc2lnbih7fSwgZXZlbnRJbnN0YW5jZSk7XG4gICAgaWYgKGZvcmNlQWxsRGF5KSB7XG4gICAgICAgIGNvcHkucmFuZ2UgPSBjb21wdXRlQWxpZ25lZERheVJhbmdlKGNvcHkucmFuZ2UpO1xuICAgIH1cbiAgICBpZiAobXV0YXRpb24uZGF0ZXNEZWx0YSAmJiBldmVudENvbmZpZy5zdGFydEVkaXRhYmxlKSB7XG4gICAgICAgIGNvcHkucmFuZ2UgPSB7XG4gICAgICAgICAgICBzdGFydDogZGF0ZUVudi5hZGQoY29weS5yYW5nZS5zdGFydCwgbXV0YXRpb24uZGF0ZXNEZWx0YSksXG4gICAgICAgICAgICBlbmQ6IGRhdGVFbnYuYWRkKGNvcHkucmFuZ2UuZW5kLCBtdXRhdGlvbi5kYXRlc0RlbHRhKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG11dGF0aW9uLnN0YXJ0RGVsdGEgJiYgZXZlbnRDb25maWcuZHVyYXRpb25FZGl0YWJsZSkge1xuICAgICAgICBjb3B5LnJhbmdlID0ge1xuICAgICAgICAgICAgc3RhcnQ6IGRhdGVFbnYuYWRkKGNvcHkucmFuZ2Uuc3RhcnQsIG11dGF0aW9uLnN0YXJ0RGVsdGEpLFxuICAgICAgICAgICAgZW5kOiBjb3B5LnJhbmdlLmVuZCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG11dGF0aW9uLmVuZERlbHRhICYmIGV2ZW50Q29uZmlnLmR1cmF0aW9uRWRpdGFibGUpIHtcbiAgICAgICAgY29weS5yYW5nZSA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBjb3B5LnJhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBkYXRlRW52LmFkZChjb3B5LnJhbmdlLmVuZCwgbXV0YXRpb24uZW5kRGVsdGEpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoY2xlYXJFbmQpIHtcbiAgICAgICAgY29weS5yYW5nZSA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBjb3B5LnJhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBnZXREZWZhdWx0RXZlbnRFbmQoZXZlbnREZWYuYWxsRGF5LCBjb3B5LnJhbmdlLnN0YXJ0LCBjb250ZXh0KSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gaW4gY2FzZSBldmVudCB3YXMgYWxsLWRheSBidXQgdGhlIHN1cHBsaWVkIGRlbHRhcyB3ZXJlIG5vdFxuICAgIC8vIGJldHRlciB1dGlsIGZvciB0aGlzP1xuICAgIGlmIChldmVudERlZi5hbGxEYXkpIHtcbiAgICAgICAgY29weS5yYW5nZSA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydE9mRGF5KGNvcHkucmFuZ2Uuc3RhcnQpLFxuICAgICAgICAgICAgZW5kOiBzdGFydE9mRGF5KGNvcHkucmFuZ2UuZW5kKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gaGFuZGxlIGludmFsaWQgZHVyYXRpb25zXG4gICAgaWYgKGNvcHkucmFuZ2UuZW5kIDwgY29weS5yYW5nZS5zdGFydCkge1xuICAgICAgICBjb3B5LnJhbmdlLmVuZCA9IGdldERlZmF1bHRFdmVudEVuZChldmVudERlZi5hbGxEYXksIGNvcHkucmFuZ2Uuc3RhcnQsIGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gY29weTtcbn1cblxuLy8gbm8gcHVibGljIHR5cGVzIHlldC4gd2hlbiB0aGVyZSBhcmUsIGV4cG9ydCBmcm9tOlxuLy8gaW1wb3J0IHt9IGZyb20gJy4vYXBpLXR5cGUtZGVwcydcbnZhciBWaWV3QXBpID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFZpZXdBcGkodHlwZSwgZ2V0Q3VycmVudERhdGEsIGRhdGVFbnYpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5nZXRDdXJyZW50RGF0YSA9IGdldEN1cnJlbnREYXRhO1xuICAgICAgICB0aGlzLmRhdGVFbnYgPSBkYXRlRW52O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVmlld0FwaS5wcm90b3R5cGUsIFwiY2FsZW5kYXJcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnREYXRhKCkuY2FsZW5kYXJBcGk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVmlld0FwaS5wcm90b3R5cGUsIFwidGl0bGVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnREYXRhKCkudmlld1RpdGxlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpZXdBcGkucHJvdG90eXBlLCBcImFjdGl2ZVN0YXJ0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlRW52LnRvRGF0ZSh0aGlzLmdldEN1cnJlbnREYXRhKCkuZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2Uuc3RhcnQpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpZXdBcGkucHJvdG90eXBlLCBcImFjdGl2ZUVuZFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZUVudi50b0RhdGUodGhpcy5nZXRDdXJyZW50RGF0YSgpLmRhdGVQcm9maWxlLmFjdGl2ZVJhbmdlLmVuZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVmlld0FwaS5wcm90b3R5cGUsIFwiY3VycmVudFN0YXJ0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlRW52LnRvRGF0ZSh0aGlzLmdldEN1cnJlbnREYXRhKCkuZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlLnN0YXJ0KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWV3QXBpLnByb3RvdHlwZSwgXCJjdXJyZW50RW5kXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlRW52LnRvRGF0ZSh0aGlzLmdldEN1cnJlbnREYXRhKCkuZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlLmVuZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBWaWV3QXBpLnByb3RvdHlwZS5nZXRPcHRpb24gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRDdXJyZW50RGF0YSgpLm9wdGlvbnNbbmFtZV07IC8vIGFyZSB0aGUgdmlldy1zcGVjaWZpYyBvcHRpb25zXG4gICAgfTtcbiAgICByZXR1cm4gVmlld0FwaTtcbn0oKSk7XG5cbnZhciBFVkVOVF9TT1VSQ0VfUkVGSU5FUlMgPSB7XG4gICAgaWQ6IFN0cmluZyxcbiAgICBkZWZhdWx0QWxsRGF5OiBCb29sZWFuLFxuICAgIHVybDogU3RyaW5nLFxuICAgIGZvcm1hdDogU3RyaW5nLFxuICAgIGV2ZW50czogaWRlbnRpdHksXG4gICAgZXZlbnREYXRhVHJhbnNmb3JtOiBpZGVudGl0eSxcbiAgICAvLyBmb3IgYW55IG5ldHdvcmstcmVsYXRlZCBzb3VyY2VzXG4gICAgc3VjY2VzczogaWRlbnRpdHksXG4gICAgZmFpbHVyZTogaWRlbnRpdHksXG59O1xuZnVuY3Rpb24gcGFyc2VFdmVudFNvdXJjZShyYXcsIGNvbnRleHQsIHJlZmluZXJzKSB7XG4gICAgaWYgKHJlZmluZXJzID09PSB2b2lkIDApIHsgcmVmaW5lcnMgPSBidWlsZEV2ZW50U291cmNlUmVmaW5lcnMoY29udGV4dCk7IH1cbiAgICB2YXIgcmF3T2JqO1xuICAgIGlmICh0eXBlb2YgcmF3ID09PSAnc3RyaW5nJykge1xuICAgICAgICByYXdPYmogPSB7IHVybDogcmF3IH07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiByYXcgPT09ICdmdW5jdGlvbicgfHwgQXJyYXkuaXNBcnJheShyYXcpKSB7XG4gICAgICAgIHJhd09iaiA9IHsgZXZlbnRzOiByYXcgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHJhdyA9PT0gJ29iamVjdCcgJiYgcmF3KSB7IC8vIG5vdCBudWxsXG4gICAgICAgIHJhd09iaiA9IHJhdztcbiAgICB9XG4gICAgaWYgKHJhd09iaikge1xuICAgICAgICB2YXIgX2EgPSByZWZpbmVQcm9wcyhyYXdPYmosIHJlZmluZXJzKSwgcmVmaW5lZCA9IF9hLnJlZmluZWQsIGV4dHJhID0gX2EuZXh0cmE7XG4gICAgICAgIHZhciBtZXRhUmVzID0gYnVpbGRFdmVudFNvdXJjZU1ldGEocmVmaW5lZCwgY29udGV4dCk7XG4gICAgICAgIGlmIChtZXRhUmVzKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIF9yYXc6IHJhdyxcbiAgICAgICAgICAgICAgICBpc0ZldGNoaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYXRlc3RGZXRjaElkOiAnJyxcbiAgICAgICAgICAgICAgICBmZXRjaFJhbmdlOiBudWxsLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRBbGxEYXk6IHJlZmluZWQuZGVmYXVsdEFsbERheSxcbiAgICAgICAgICAgICAgICBldmVudERhdGFUcmFuc2Zvcm06IHJlZmluZWQuZXZlbnREYXRhVHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHJlZmluZWQuc3VjY2VzcyxcbiAgICAgICAgICAgICAgICBmYWlsdXJlOiByZWZpbmVkLmZhaWx1cmUsXG4gICAgICAgICAgICAgICAgcHVibGljSWQ6IHJlZmluZWQuaWQgfHwgJycsXG4gICAgICAgICAgICAgICAgc291cmNlSWQ6IGd1aWQoKSxcbiAgICAgICAgICAgICAgICBzb3VyY2VEZWZJZDogbWV0YVJlcy5zb3VyY2VEZWZJZCxcbiAgICAgICAgICAgICAgICBtZXRhOiBtZXRhUmVzLm1ldGEsXG4gICAgICAgICAgICAgICAgdWk6IGNyZWF0ZUV2ZW50VWkocmVmaW5lZCwgY29udGV4dCksXG4gICAgICAgICAgICAgICAgZXh0ZW5kZWRQcm9wczogZXh0cmEsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gYnVpbGRFdmVudFNvdXJjZVJlZmluZXJzKGNvbnRleHQpIHtcbiAgICByZXR1cm4gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIEVWRU5UX1VJX1JFRklORVJTKSwgRVZFTlRfU09VUkNFX1JFRklORVJTKSwgY29udGV4dC5wbHVnaW5Ib29rcy5ldmVudFNvdXJjZVJlZmluZXJzKTtcbn1cbmZ1bmN0aW9uIGJ1aWxkRXZlbnRTb3VyY2VNZXRhKHJhdywgY29udGV4dCkge1xuICAgIHZhciBkZWZzID0gY29udGV4dC5wbHVnaW5Ib29rcy5ldmVudFNvdXJjZURlZnM7XG4gICAgZm9yICh2YXIgaSA9IGRlZnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHsgLy8gbGF0ZXItYWRkZWQgcGx1Z2lucyB0YWtlIHByZWNlZGVuY2VcbiAgICAgICAgdmFyIGRlZiA9IGRlZnNbaV07XG4gICAgICAgIHZhciBtZXRhID0gZGVmLnBhcnNlTWV0YShyYXcpO1xuICAgICAgICBpZiAobWV0YSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc291cmNlRGVmSWQ6IGksIG1ldGE6IG1ldGEgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVkdWNlQ3VycmVudERhdGUoY3VycmVudERhdGUsIGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnQ0hBTkdFX0RBVEUnOlxuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5kYXRlTWFya2VyO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEluaXRpYWxEYXRlKG9wdGlvbnMsIGRhdGVFbnYpIHtcbiAgICB2YXIgaW5pdGlhbERhdGVJbnB1dCA9IG9wdGlvbnMuaW5pdGlhbERhdGU7XG4gICAgLy8gY29tcHV0ZSB0aGUgaW5pdGlhbCBhbWJpZy10aW1lem9uZSBkYXRlXG4gICAgaWYgKGluaXRpYWxEYXRlSW5wdXQgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZGF0ZUVudi5jcmVhdGVNYXJrZXIoaW5pdGlhbERhdGVJbnB1dCk7XG4gICAgfVxuICAgIHJldHVybiBnZXROb3cob3B0aW9ucy5ub3csIGRhdGVFbnYpOyAvLyBnZXROb3cgYWxyZWFkeSByZXR1cm5zIHVuem9uZWRcbn1cbmZ1bmN0aW9uIGdldE5vdyhub3dJbnB1dCwgZGF0ZUVudikge1xuICAgIGlmICh0eXBlb2Ygbm93SW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbm93SW5wdXQgPSBub3dJbnB1dCgpO1xuICAgIH1cbiAgICBpZiAobm93SW5wdXQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZGF0ZUVudi5jcmVhdGVOb3dNYXJrZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGVFbnYuY3JlYXRlTWFya2VyKG5vd0lucHV0KTtcbn1cblxudmFyIENhbGVuZGFyQXBpID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENhbGVuZGFyQXBpKCkge1xuICAgIH1cbiAgICBDYWxlbmRhckFwaS5wcm90b3R5cGUuZ2V0Q3VycmVudERhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnREYXRhTWFuYWdlci5nZXRDdXJyZW50RGF0YSgpO1xuICAgIH07XG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLmRpc3BhdGNoID0gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0YU1hbmFnZXIuZGlzcGF0Y2goYWN0aW9uKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDYWxlbmRhckFwaS5wcm90b3R5cGUsIFwidmlld1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5nZXRDdXJyZW50RGF0YSgpLnZpZXdBcGk7IH0gLy8gZm9yIHB1YmxpYyBBUElcbiAgICAgICAgLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLmJhdGNoUmVuZGVyaW5nID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfTtcbiAgICBDYWxlbmRhckFwaS5wcm90b3R5cGUudXBkYXRlU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdfcmVzaXplJywgdHJ1ZSk7XG4gICAgfTtcbiAgICAvLyBPcHRpb25zXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBDYWxlbmRhckFwaS5wcm90b3R5cGUuc2V0T3B0aW9uID0gZnVuY3Rpb24gKG5hbWUsIHZhbCkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdTRVRfT1BUSU9OJyxcbiAgICAgICAgICAgIG9wdGlvbk5hbWU6IG5hbWUsXG4gICAgICAgICAgICByYXdPcHRpb25WYWx1ZTogdmFsLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS5nZXRPcHRpb24gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0YU1hbmFnZXIuY3VycmVudENhbGVuZGFyT3B0aW9uc0lucHV0W25hbWVdO1xuICAgIH07XG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLmdldEF2YWlsYWJsZUxvY2FsZUNvZGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5nZXRDdXJyZW50RGF0YSgpLmF2YWlsYWJsZVJhd0xvY2FsZXMpO1xuICAgIH07XG4gICAgLy8gVHJpZ2dlclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGhhbmRsZXJOYW1lLCBoYW5kbGVyKSB7XG4gICAgICAgIHZhciBjdXJyZW50RGF0YU1hbmFnZXIgPSB0aGlzLmN1cnJlbnREYXRhTWFuYWdlcjtcbiAgICAgICAgaWYgKGN1cnJlbnREYXRhTWFuYWdlci5jdXJyZW50Q2FsZW5kYXJPcHRpb25zUmVmaW5lcnNbaGFuZGxlck5hbWVdKSB7XG4gICAgICAgICAgICBjdXJyZW50RGF0YU1hbmFnZXIuZW1pdHRlci5vbihoYW5kbGVyTmFtZSwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJVbmtub3duIGxpc3RlbmVyIG5hbWUgJ1wiICsgaGFuZGxlck5hbWUgKyBcIidcIik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbiAoaGFuZGxlck5hbWUsIGhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50RGF0YU1hbmFnZXIuZW1pdHRlci5vZmYoaGFuZGxlck5hbWUsIGhhbmRsZXIpO1xuICAgIH07XG4gICAgLy8gbm90IG1lYW50IGZvciBwdWJsaWMgdXNlXG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLnRyaWdnZXIgPSBmdW5jdGlvbiAoaGFuZGxlck5hbWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICAoX2EgPSB0aGlzLmN1cnJlbnREYXRhTWFuYWdlci5lbWl0dGVyKS50cmlnZ2VyLmFwcGx5KF9hLCB0c2xpYi5fX3NwcmVhZEFycmF5KFtoYW5kbGVyTmFtZV0sIGFyZ3MpKTtcbiAgICB9O1xuICAgIC8vIFZpZXdcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS5jaGFuZ2VWaWV3ID0gZnVuY3Rpb24gKHZpZXdUeXBlLCBkYXRlT3JSYW5nZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmJhdGNoUmVuZGVyaW5nKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLnVuc2VsZWN0KCk7XG4gICAgICAgICAgICBpZiAoZGF0ZU9yUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0ZU9yUmFuZ2Uuc3RhcnQgJiYgZGF0ZU9yUmFuZ2UuZW5kKSB7IC8vIGEgcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NIQU5HRV9WSUVXX1RZUEUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld1R5cGU6IHZpZXdUeXBlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1NFVF9PUFRJT04nLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTmFtZTogJ3Zpc2libGVSYW5nZScsXG4gICAgICAgICAgICAgICAgICAgICAgICByYXdPcHRpb25WYWx1ZTogZGF0ZU9yUmFuZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVFbnYgPSBfdGhpcy5nZXRDdXJyZW50RGF0YSgpLmRhdGVFbnY7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdDSEFOR0VfVklFV19UWVBFJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdUeXBlOiB2aWV3VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVNYXJrZXI6IGRhdGVFbnYuY3JlYXRlTWFya2VyKGRhdGVPclJhbmdlKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQ0hBTkdFX1ZJRVdfVFlQRScsXG4gICAgICAgICAgICAgICAgICAgIHZpZXdUeXBlOiB2aWV3VHlwZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBGb3JjZXMgbmF2aWdhdGlvbiB0byBhIHZpZXcgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICAgIC8vIGB2aWV3VHlwZWAgY2FuIGJlIGEgc3BlY2lmaWMgdmlldyBuYW1lIG9yIGEgZ2VuZXJpYyBvbmUgbGlrZSBcIndlZWtcIiBvciBcImRheVwiLlxuICAgIC8vIG5lZWRzIHRvIGNoYW5nZVxuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS56b29tVG8gPSBmdW5jdGlvbiAoZGF0ZU1hcmtlciwgdmlld1R5cGUpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICB2YXIgc3BlYztcbiAgICAgICAgdmlld1R5cGUgPSB2aWV3VHlwZSB8fCAnZGF5JzsgLy8gZGF5IGlzIGRlZmF1bHQgem9vbVxuICAgICAgICBzcGVjID0gc3RhdGUudmlld1NwZWNzW3ZpZXdUeXBlXSB8fCB0aGlzLmdldFVuaXRWaWV3U3BlYyh2aWV3VHlwZSk7XG4gICAgICAgIHRoaXMudW5zZWxlY3QoKTtcbiAgICAgICAgaWYgKHNwZWMpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdDSEFOR0VfVklFV19UWVBFJyxcbiAgICAgICAgICAgICAgICB2aWV3VHlwZTogc3BlYy50eXBlLFxuICAgICAgICAgICAgICAgIGRhdGVNYXJrZXI6IGRhdGVNYXJrZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdDSEFOR0VfREFURScsXG4gICAgICAgICAgICAgICAgZGF0ZU1hcmtlcjogZGF0ZU1hcmtlcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBHaXZlbiBhIGR1cmF0aW9uIHNpbmd1bGFyIHVuaXQsIGxpa2UgXCJ3ZWVrXCIgb3IgXCJkYXlcIiwgZmluZHMgYSBtYXRjaGluZyB2aWV3IHNwZWMuXG4gICAgLy8gUHJlZmVyZW5jZSBpcyBnaXZlbiB0byB2aWV3cyB0aGF0IGhhdmUgY29ycmVzcG9uZGluZyBidXR0b25zLlxuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS5nZXRVbml0Vmlld1NwZWMgPSBmdW5jdGlvbiAodW5pdCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmdldEN1cnJlbnREYXRhKCksIHZpZXdTcGVjcyA9IF9hLnZpZXdTcGVjcywgdG9vbGJhckNvbmZpZyA9IF9hLnRvb2xiYXJDb25maWc7XG4gICAgICAgIHZhciB2aWV3VHlwZXMgPSBbXS5jb25jYXQodG9vbGJhckNvbmZpZy5oZWFkZXIgPyB0b29sYmFyQ29uZmlnLmhlYWRlci52aWV3c1dpdGhCdXR0b25zIDogW10sIHRvb2xiYXJDb25maWcuZm9vdGVyID8gdG9vbGJhckNvbmZpZy5mb290ZXIudmlld3NXaXRoQnV0dG9ucyA6IFtdKTtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIHZhciBzcGVjO1xuICAgICAgICBmb3IgKHZhciB2aWV3VHlwZSBpbiB2aWV3U3BlY3MpIHtcbiAgICAgICAgICAgIHZpZXdUeXBlcy5wdXNoKHZpZXdUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmlld1R5cGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBzcGVjID0gdmlld1NwZWNzW3ZpZXdUeXBlc1tpXV07XG4gICAgICAgICAgICBpZiAoc3BlYykge1xuICAgICAgICAgICAgICAgIGlmIChzcGVjLnNpbmdsZVVuaXQgPT09IHVuaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwZWM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgLy8gQ3VycmVudCBEYXRlXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBDYWxlbmRhckFwaS5wcm90b3R5cGUucHJldiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdCgpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ1BSRVYnIH0pO1xuICAgIH07XG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudW5zZWxlY3QoKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdORVhUJyB9KTtcbiAgICB9O1xuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS5wcmV2WWVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICB0aGlzLnVuc2VsZWN0KCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ0NIQU5HRV9EQVRFJyxcbiAgICAgICAgICAgIGRhdGVNYXJrZXI6IHN0YXRlLmRhdGVFbnYuYWRkWWVhcnMoc3RhdGUuY3VycmVudERhdGUsIC0xKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDYWxlbmRhckFwaS5wcm90b3R5cGUubmV4dFllYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgdGhpcy51bnNlbGVjdCgpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdDSEFOR0VfREFURScsXG4gICAgICAgICAgICBkYXRlTWFya2VyOiBzdGF0ZS5kYXRlRW52LmFkZFllYXJzKHN0YXRlLmN1cnJlbnREYXRlLCAxKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDYWxlbmRhckFwaS5wcm90b3R5cGUudG9kYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgdGhpcy51bnNlbGVjdCgpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdDSEFOR0VfREFURScsXG4gICAgICAgICAgICBkYXRlTWFya2VyOiBnZXROb3coc3RhdGUuY2FsZW5kYXJPcHRpb25zLm5vdywgc3RhdGUuZGF0ZUVudiksXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLmdvdG9EYXRlID0gZnVuY3Rpb24gKHpvbmVkRGF0ZUlucHV0KSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgdGhpcy51bnNlbGVjdCgpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdDSEFOR0VfREFURScsXG4gICAgICAgICAgICBkYXRlTWFya2VyOiBzdGF0ZS5kYXRlRW52LmNyZWF0ZU1hcmtlcih6b25lZERhdGVJbnB1dCksXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLmluY3JlbWVudERhdGUgPSBmdW5jdGlvbiAoZGVsdGFJbnB1dCkge1xuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIHZhciBkZWx0YSA9IGNyZWF0ZUR1cmF0aW9uKGRlbHRhSW5wdXQpO1xuICAgICAgICBpZiAoZGVsdGEpIHsgLy8gZWxzZSwgd2FybiBhYm91dCBpbnZhbGlkIGlucHV0P1xuICAgICAgICAgICAgdGhpcy51bnNlbGVjdCgpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0NIQU5HRV9EQVRFJyxcbiAgICAgICAgICAgICAgICBkYXRlTWFya2VyOiBzdGF0ZS5kYXRlRW52LmFkZChzdGF0ZS5jdXJyZW50RGF0ZSwgZGVsdGEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIGZvciBleHRlcm5hbCBBUElcbiAgICBDYWxlbmRhckFwaS5wcm90b3R5cGUuZ2V0RGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICByZXR1cm4gc3RhdGUuZGF0ZUVudi50b0RhdGUoc3RhdGUuY3VycmVudERhdGUpO1xuICAgIH07XG4gICAgLy8gRGF0ZSBGb3JtYXR0aW5nIFV0aWxzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBDYWxlbmRhckFwaS5wcm90b3R5cGUuZm9ybWF0RGF0ZSA9IGZ1bmN0aW9uIChkLCBmb3JtYXR0ZXIpIHtcbiAgICAgICAgdmFyIGRhdGVFbnYgPSB0aGlzLmdldEN1cnJlbnREYXRhKCkuZGF0ZUVudjtcbiAgICAgICAgcmV0dXJuIGRhdGVFbnYuZm9ybWF0KGRhdGVFbnYuY3JlYXRlTWFya2VyKGQpLCBjcmVhdGVGb3JtYXR0ZXIoZm9ybWF0dGVyKSk7XG4gICAgfTtcbiAgICAvLyBgc2V0dGluZ3NgIGlzIGZvciBmb3JtYXR0ZXIgQU5EIGlzRW5kRXhjbHVzaXZlXG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLmZvcm1hdFJhbmdlID0gZnVuY3Rpb24gKGQwLCBkMSwgc2V0dGluZ3MpIHtcbiAgICAgICAgdmFyIGRhdGVFbnYgPSB0aGlzLmdldEN1cnJlbnREYXRhKCkuZGF0ZUVudjtcbiAgICAgICAgcmV0dXJuIGRhdGVFbnYuZm9ybWF0UmFuZ2UoZGF0ZUVudi5jcmVhdGVNYXJrZXIoZDApLCBkYXRlRW52LmNyZWF0ZU1hcmtlcihkMSksIGNyZWF0ZUZvcm1hdHRlcihzZXR0aW5ncyksIHNldHRpbmdzKTtcbiAgICB9O1xuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS5mb3JtYXRJc28gPSBmdW5jdGlvbiAoZCwgb21pdFRpbWUpIHtcbiAgICAgICAgdmFyIGRhdGVFbnYgPSB0aGlzLmdldEN1cnJlbnREYXRhKCkuZGF0ZUVudjtcbiAgICAgICAgcmV0dXJuIGRhdGVFbnYuZm9ybWF0SXNvKGRhdGVFbnYuY3JlYXRlTWFya2VyKGQpLCB7IG9taXRUaW1lOiBvbWl0VGltZSB9KTtcbiAgICB9O1xuICAgIC8vIERhdGUgU2VsZWN0aW9uIC8gRXZlbnQgU2VsZWN0aW9uIC8gRGF5Q2xpY2tcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIHRoaXMgcHVibGljIG1ldGhvZCByZWNlaXZlcyBzdGFydC9lbmQgZGF0ZXMgaW4gYW55IGZvcm1hdCwgd2l0aCBhbnkgdGltZXpvbmVcbiAgICAvLyBOT1RFOiBhcmdzIHdlcmUgY2hhbmdlZCBmcm9tIHYzXG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uIChkYXRlT3JPYmosIGVuZERhdGUpIHtcbiAgICAgICAgdmFyIHNlbGVjdGlvbklucHV0O1xuICAgICAgICBpZiAoZW5kRGF0ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZGF0ZU9yT2JqLnN0YXJ0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25JbnB1dCA9IGRhdGVPck9iajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbklucHV0ID0ge1xuICAgICAgICAgICAgICAgICAgICBzdGFydDogZGF0ZU9yT2JqLFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IG51bGwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbklucHV0ID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBkYXRlT3JPYmosXG4gICAgICAgICAgICAgICAgZW5kOiBlbmREYXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIHZhciBzZWxlY3Rpb24gPSBwYXJzZURhdGVTcGFuKHNlbGVjdGlvbklucHV0LCBzdGF0ZS5kYXRlRW52LCBjcmVhdGVEdXJhdGlvbih7IGRheXM6IDEgfSkpO1xuICAgICAgICBpZiAoc2VsZWN0aW9uKSB7IC8vIHRocm93IHBhcnNlIGVycm9yIG90aGVyd2lzZT9cbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnU0VMRUNUX0RBVEVTJywgc2VsZWN0aW9uOiBzZWxlY3Rpb24gfSk7XG4gICAgICAgICAgICB0cmlnZ2VyRGF0ZVNlbGVjdChzZWxlY3Rpb24sIG51bGwsIHN0YXRlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gcHVibGljIG1ldGhvZFxuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS51bnNlbGVjdCA9IGZ1bmN0aW9uIChwZXYpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICBpZiAoc3RhdGUuZGF0ZVNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFTEVDVF9EQVRFUycgfSk7XG4gICAgICAgICAgICB0cmlnZ2VyRGF0ZVVuc2VsZWN0KHBldiwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBQdWJsaWMgRXZlbnRzIEFQSVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLmFkZEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50SW5wdXQsIHNvdXJjZUlucHV0KSB7XG4gICAgICAgIGlmIChldmVudElucHV0IGluc3RhbmNlb2YgRXZlbnRBcGkpIHtcbiAgICAgICAgICAgIHZhciBkZWYgPSBldmVudElucHV0Ll9kZWY7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBldmVudElucHV0Ll9pbnN0YW5jZTtcbiAgICAgICAgICAgIHZhciBjdXJyZW50RGF0YSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgICAgIC8vIG5vdCBhbHJlYWR5IHByZXNlbnQ/IGRvbid0IHdhbnQgdG8gYWRkIGFuIG9sZCBzbmFwc2hvdFxuICAgICAgICAgICAgaWYgKCFjdXJyZW50RGF0YS5ldmVudFN0b3JlLmRlZnNbZGVmLmRlZklkXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQUREX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IGV2ZW50VHVwbGVUb1N0b3JlKHsgZGVmOiBkZWYsIGluc3RhbmNlOiBpbnN0YW5jZSB9KSwgLy8gVE9ETzogYmV0dGVyIHV0aWwgZm9yIHR3byBhcmdzP1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50QWRkKGV2ZW50SW5wdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV2ZW50SW5wdXQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICB2YXIgZXZlbnRTb3VyY2U7XG4gICAgICAgIGlmIChzb3VyY2VJbnB1dCBpbnN0YW5jZW9mIEV2ZW50U291cmNlQXBpKSB7XG4gICAgICAgICAgICBldmVudFNvdXJjZSA9IHNvdXJjZUlucHV0LmludGVybmFsRXZlbnRTb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHNvdXJjZUlucHV0ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIGlmIChzb3VyY2VJbnB1dCkgeyAvLyB0cnVlLiBwYXJ0IG9mIHRoZSBmaXJzdCBldmVudCBzb3VyY2VcbiAgICAgICAgICAgICAgICBldmVudFNvdXJjZSA9IGhhc2hWYWx1ZXNUb0FycmF5KHN0YXRlLmV2ZW50U291cmNlcylbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc291cmNlSW5wdXQgIT0gbnVsbCkgeyAvLyBhbiBJRC4gYWNjZXB0cyBhIG51bWJlciB0b29cbiAgICAgICAgICAgIHZhciBzb3VyY2VBcGkgPSB0aGlzLmdldEV2ZW50U291cmNlQnlJZChzb3VyY2VJbnB1dCk7IC8vIFRPRE86IHVzZSBhbiBpbnRlcm5hbCBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKCFzb3VyY2VBcGkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgZmluZCBhbiBldmVudCBzb3VyY2Ugd2l0aCBJRCBcXFwiXCIgKyBzb3VyY2VJbnB1dCArIFwiXFxcIlwiKTsgLy8gVE9ETzogdGVzdFxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXZlbnRTb3VyY2UgPSBzb3VyY2VBcGkuaW50ZXJuYWxFdmVudFNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdHVwbGUgPSBwYXJzZUV2ZW50KGV2ZW50SW5wdXQsIGV2ZW50U291cmNlLCBzdGF0ZSwgZmFsc2UpO1xuICAgICAgICBpZiAodHVwbGUpIHtcbiAgICAgICAgICAgIHZhciBuZXdFdmVudEFwaSA9IG5ldyBFdmVudEFwaShzdGF0ZSwgdHVwbGUuZGVmLCB0dXBsZS5kZWYucmVjdXJyaW5nRGVmID8gbnVsbCA6IHR1cGxlLmluc3RhbmNlKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdBRERfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICBldmVudFN0b3JlOiBldmVudFR1cGxlVG9TdG9yZSh0dXBsZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50QWRkKG5ld0V2ZW50QXBpKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdFdmVudEFwaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS50cmlnZ2VyRXZlbnRBZGQgPSBmdW5jdGlvbiAoZXZlbnRBcGkpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGVtaXR0ZXIgPSB0aGlzLmdldEN1cnJlbnREYXRhKCkuZW1pdHRlcjtcbiAgICAgICAgZW1pdHRlci50cmlnZ2VyKCdldmVudEFkZCcsIHtcbiAgICAgICAgICAgIGV2ZW50OiBldmVudEFwaSxcbiAgICAgICAgICAgIHJlbGF0ZWRFdmVudHM6IFtdLFxuICAgICAgICAgICAgcmV2ZXJ0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUkVNT1ZFX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IGV2ZW50QXBpVG9TdG9yZShldmVudEFwaSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIFRPRE86IG9wdGltaXplXG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLmdldEV2ZW50QnlJZCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIHZhciBfYSA9IHN0YXRlLmV2ZW50U3RvcmUsIGRlZnMgPSBfYS5kZWZzLCBpbnN0YW5jZXMgPSBfYS5pbnN0YW5jZXM7XG4gICAgICAgIGlkID0gU3RyaW5nKGlkKTtcbiAgICAgICAgZm9yICh2YXIgZGVmSWQgaW4gZGVmcykge1xuICAgICAgICAgICAgdmFyIGRlZiA9IGRlZnNbZGVmSWRdO1xuICAgICAgICAgICAgaWYgKGRlZi5wdWJsaWNJZCA9PT0gaWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVmLnJlY3VycmluZ0RlZikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV2ZW50QXBpKHN0YXRlLCBkZWYsIG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpbnN0YW5jZUlkIGluIGluc3RhbmNlcykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBpbnN0YW5jZXNbaW5zdGFuY2VJZF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5kZWZJZCA9PT0gZGVmLmRlZklkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV2ZW50QXBpKHN0YXRlLCBkZWYsIGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS5nZXRFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjdXJyZW50RGF0YSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkRXZlbnRBcGlzKGN1cnJlbnREYXRhLmV2ZW50U3RvcmUsIGN1cnJlbnREYXRhKTtcbiAgICB9O1xuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS5yZW1vdmVBbGxFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnUkVNT1ZFX0FMTF9FVkVOVFMnIH0pO1xuICAgIH07XG4gICAgLy8gUHVibGljIEV2ZW50IFNvdXJjZXMgQVBJXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBDYWxlbmRhckFwaS5wcm90b3R5cGUuZ2V0RXZlbnRTb3VyY2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIHZhciBzb3VyY2VIYXNoID0gc3RhdGUuZXZlbnRTb3VyY2VzO1xuICAgICAgICB2YXIgc291cmNlQXBpcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpbnRlcm5hbElkIGluIHNvdXJjZUhhc2gpIHtcbiAgICAgICAgICAgIHNvdXJjZUFwaXMucHVzaChuZXcgRXZlbnRTb3VyY2VBcGkoc3RhdGUsIHNvdXJjZUhhc2hbaW50ZXJuYWxJZF0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlQXBpcztcbiAgICB9O1xuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS5nZXRFdmVudFNvdXJjZUJ5SWQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICB2YXIgc291cmNlSGFzaCA9IHN0YXRlLmV2ZW50U291cmNlcztcbiAgICAgICAgaWQgPSBTdHJpbmcoaWQpO1xuICAgICAgICBmb3IgKHZhciBzb3VyY2VJZCBpbiBzb3VyY2VIYXNoKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlSGFzaFtzb3VyY2VJZF0ucHVibGljSWQgPT09IGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFdmVudFNvdXJjZUFwaShzdGF0ZSwgc291cmNlSGFzaFtzb3VyY2VJZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLmFkZEV2ZW50U291cmNlID0gZnVuY3Rpb24gKHNvdXJjZUlucHV0KSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgaWYgKHNvdXJjZUlucHV0IGluc3RhbmNlb2YgRXZlbnRTb3VyY2VBcGkpIHtcbiAgICAgICAgICAgIC8vIG5vdCBhbHJlYWR5IHByZXNlbnQ/IGRvbid0IHdhbnQgdG8gYWRkIGFuIG9sZCBzbmFwc2hvdFxuICAgICAgICAgICAgaWYgKCFzdGF0ZS5ldmVudFNvdXJjZXNbc291cmNlSW5wdXQuaW50ZXJuYWxFdmVudFNvdXJjZS5zb3VyY2VJZF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0FERF9FVkVOVF9TT1VSQ0VTJyxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlczogW3NvdXJjZUlucHV0LmludGVybmFsRXZlbnRTb3VyY2VdLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZUlucHV0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBldmVudFNvdXJjZSA9IHBhcnNlRXZlbnRTb3VyY2Uoc291cmNlSW5wdXQsIHN0YXRlKTtcbiAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7IC8vIFRPRE86IGVycm9yIG90aGVyd2lzZT9cbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnQUREX0VWRU5UX1NPVVJDRVMnLCBzb3VyY2VzOiBbZXZlbnRTb3VyY2VdIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFdmVudFNvdXJjZUFwaShzdGF0ZSwgZXZlbnRTb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLnJlbW92ZUFsbEV2ZW50U291cmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdSRU1PVkVfQUxMX0VWRU5UX1NPVVJDRVMnIH0pO1xuICAgIH07XG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLnJlZmV0Y2hFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnRkVUQ0hfRVZFTlRfU09VUkNFUycsIGlzUmVmZXRjaDogdHJ1ZSB9KTtcbiAgICB9O1xuICAgIC8vIFNjcm9sbFxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLnNjcm9sbFRvVGltZSA9IGZ1bmN0aW9uICh0aW1lSW5wdXQpIHtcbiAgICAgICAgdmFyIHRpbWUgPSBjcmVhdGVEdXJhdGlvbih0aW1lSW5wdXQpO1xuICAgICAgICBpZiAodGltZSkge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdfc2Nyb2xsUmVxdWVzdCcsIHsgdGltZTogdGltZSB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIENhbGVuZGFyQXBpO1xufSgpKTtcblxudmFyIEV2ZW50QXBpID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIGluc3RhbmNlIHdpbGwgYmUgbnVsbCBpZiBleHByZXNzaW5nIGEgcmVjdXJyaW5nIGV2ZW50IHRoYXQgaGFzIG5vIGN1cnJlbnQgaW5zdGFuY2VzLFxuICAgIC8vIE9SIGlmIHRyeWluZyB0byB2YWxpZGF0ZSBhbiBpbmNvbWluZyBleHRlcm5hbCBldmVudCB0aGF0IGhhcyBubyBkYXRlcyBhc3NpZ25lZFxuICAgIGZ1bmN0aW9uIEV2ZW50QXBpKGNvbnRleHQsIGRlZiwgaW5zdGFuY2UpIHtcbiAgICAgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuX2RlZiA9IGRlZjtcbiAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBpbnN0YW5jZSB8fCBudWxsO1xuICAgIH1cbiAgICAvKlxuICAgIFRPRE86IG1ha2UgZXZlbnQgc3RydWN0IG1vcmUgcmVzcG9uc2libGUgZm9yIHRoaXNcbiAgICAqL1xuICAgIEV2ZW50QXBpLnByb3RvdHlwZS5zZXRQcm9wID0gZnVuY3Rpb24gKG5hbWUsIHZhbCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBpZiAobmFtZSBpbiBFVkVOVF9EQVRFX1JFRklORVJTKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBzZXQgZGF0ZS1yZWxhdGVkIHByb3AgXFwnbmFtZVxcJy4gVXNlIG9uZSBvZiB0aGUgZGF0ZS1yZWxhdGVkIG1ldGhvZHMgaW5zdGVhZC4nKTtcbiAgICAgICAgICAgIC8vIFRPRE86IG1ha2UgcHJvcGVyIGFsaWFzaW5nIHN5c3RlbT9cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lID09PSAnaWQnKSB7XG4gICAgICAgICAgICB2YWwgPSBFVkVOVF9OT05fREFURV9SRUZJTkVSU1tuYW1lXSh2YWwpO1xuICAgICAgICAgICAgdGhpcy5tdXRhdGUoe1xuICAgICAgICAgICAgICAgIHN0YW5kYXJkUHJvcHM6IHsgcHVibGljSWQ6IHZhbCB9LCAvLyBoYXJkY29kZWQgaW50ZXJuYWwgbmFtZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZSBpbiBFVkVOVF9OT05fREFURV9SRUZJTkVSUykge1xuICAgICAgICAgICAgdmFsID0gRVZFTlRfTk9OX0RBVEVfUkVGSU5FUlNbbmFtZV0odmFsKTtcbiAgICAgICAgICAgIHRoaXMubXV0YXRlKHtcbiAgICAgICAgICAgICAgICBzdGFuZGFyZFByb3BzOiAoX2EgPSB7fSwgX2FbbmFtZV0gPSB2YWwsIF9hKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWUgaW4gRVZFTlRfVUlfUkVGSU5FUlMpIHtcbiAgICAgICAgICAgIHZhciB1aSA9IEVWRU5UX1VJX1JFRklORVJTW25hbWVdKHZhbCk7XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgICAgIHVpID0geyBiYWNrZ3JvdW5kQ29sb3I6IHZhbCwgYm9yZGVyQ29sb3I6IHZhbCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmFtZSA9PT0gJ2VkaXRhYmxlJykge1xuICAgICAgICAgICAgICAgIHVpID0geyBzdGFydEVkaXRhYmxlOiB2YWwsIGR1cmF0aW9uRWRpdGFibGU6IHZhbCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdWkgPSAoX2IgPSB7fSwgX2JbbmFtZV0gPSB2YWwsIF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubXV0YXRlKHtcbiAgICAgICAgICAgICAgICBzdGFuZGFyZFByb3BzOiB7IHVpOiB1aSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3Qgc2V0IHByb3AgJ1wiICsgbmFtZSArIFwiJy4gVXNlIHNldEV4dGVuZGVkUHJvcCBpbnN0ZWFkLlwiKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRXZlbnRBcGkucHJvdG90eXBlLnNldEV4dGVuZGVkUHJvcCA9IGZ1bmN0aW9uIChuYW1lLCB2YWwpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLm11dGF0ZSh7XG4gICAgICAgICAgICBleHRlbmRlZFByb3BzOiAoX2EgPSB7fSwgX2FbbmFtZV0gPSB2YWwsIF9hKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBFdmVudEFwaS5wcm90b3R5cGUuc2V0U3RhcnQgPSBmdW5jdGlvbiAoc3RhcnRJbnB1dCwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICB2YXIgZGF0ZUVudiA9IHRoaXMuX2NvbnRleHQuZGF0ZUVudjtcbiAgICAgICAgdmFyIHN0YXJ0ID0gZGF0ZUVudi5jcmVhdGVNYXJrZXIoc3RhcnRJbnB1dCk7XG4gICAgICAgIGlmIChzdGFydCAmJiB0aGlzLl9pbnN0YW5jZSkgeyAvLyBUT0RPOiB3YXJuaW5nIGlmIHBhcnNlZCBiYWRcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZVJhbmdlID0gdGhpcy5faW5zdGFuY2UucmFuZ2U7XG4gICAgICAgICAgICB2YXIgc3RhcnREZWx0YSA9IGRpZmZEYXRlcyhpbnN0YW5jZVJhbmdlLnN0YXJ0LCBzdGFydCwgZGF0ZUVudiwgb3B0aW9ucy5ncmFudWxhcml0eSk7IC8vIHdoYXQgaWYgcGFyc2VkIGJhZCE/XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5tYWludGFpbkR1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBkYXRlc0RlbHRhOiBzdGFydERlbHRhIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBzdGFydERlbHRhOiBzdGFydERlbHRhIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBFdmVudEFwaS5wcm90b3R5cGUuc2V0RW5kID0gZnVuY3Rpb24gKGVuZElucHV0LCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHZhciBkYXRlRW52ID0gdGhpcy5fY29udGV4dC5kYXRlRW52O1xuICAgICAgICB2YXIgZW5kO1xuICAgICAgICBpZiAoZW5kSW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgZW5kID0gZGF0ZUVudi5jcmVhdGVNYXJrZXIoZW5kSW5wdXQpO1xuICAgICAgICAgICAgaWYgKCFlbmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47IC8vIFRPRE86IHdhcm5pbmcgaWYgcGFyc2VkIGJhZFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgICAgICAgaWYgKGVuZCkge1xuICAgICAgICAgICAgICAgIHZhciBlbmREZWx0YSA9IGRpZmZEYXRlcyh0aGlzLl9pbnN0YW5jZS5yYW5nZS5lbmQsIGVuZCwgZGF0ZUVudiwgb3B0aW9ucy5ncmFudWxhcml0eSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBlbmREZWx0YTogZW5kRGVsdGEgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm11dGF0ZSh7IHN0YW5kYXJkUHJvcHM6IHsgaGFzRW5kOiBmYWxzZSB9IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBFdmVudEFwaS5wcm90b3R5cGUuc2V0RGF0ZXMgPSBmdW5jdGlvbiAoc3RhcnRJbnB1dCwgZW5kSW5wdXQsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIGRhdGVFbnYgPSB0aGlzLl9jb250ZXh0LmRhdGVFbnY7XG4gICAgICAgIHZhciBzdGFuZGFyZFByb3BzID0geyBhbGxEYXk6IG9wdGlvbnMuYWxsRGF5IH07XG4gICAgICAgIHZhciBzdGFydCA9IGRhdGVFbnYuY3JlYXRlTWFya2VyKHN0YXJ0SW5wdXQpO1xuICAgICAgICB2YXIgZW5kO1xuICAgICAgICBpZiAoIXN0YXJ0KSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIFRPRE86IHdhcm5pbmcgaWYgcGFyc2VkIGJhZFxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmRJbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBlbmQgPSBkYXRlRW52LmNyZWF0ZU1hcmtlcihlbmRJbnB1dCk7XG4gICAgICAgICAgICBpZiAoIWVuZCkgeyAvLyBUT0RPOiB3YXJuaW5nIGlmIHBhcnNlZCBiYWRcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2VSYW5nZSA9IHRoaXMuX2luc3RhbmNlLnJhbmdlO1xuICAgICAgICAgICAgLy8gd2hlbiBjb21wdXRpbmcgdGhlIGRpZmYgZm9yIGFuIGV2ZW50IGJlaW5nIGNvbnZlcnRlZCB0byBhbGwtZGF5LFxuICAgICAgICAgICAgLy8gY29tcHV0ZSBkaWZmIG9mZiBvZiB0aGUgYWxsLWRheSB2YWx1ZXMgdGhlIHdheSBldmVudC1tdXRhdGlvbiBkb2VzLlxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWxsRGF5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VSYW5nZSA9IGNvbXB1dGVBbGlnbmVkRGF5UmFuZ2UoaW5zdGFuY2VSYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3RhcnREZWx0YSA9IGRpZmZEYXRlcyhpbnN0YW5jZVJhbmdlLnN0YXJ0LCBzdGFydCwgZGF0ZUVudiwgb3B0aW9ucy5ncmFudWxhcml0eSk7XG4gICAgICAgICAgICBpZiAoZW5kKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVuZERlbHRhID0gZGlmZkRhdGVzKGluc3RhbmNlUmFuZ2UuZW5kLCBlbmQsIGRhdGVFbnYsIG9wdGlvbnMuZ3JhbnVsYXJpdHkpO1xuICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvbnNFcXVhbChzdGFydERlbHRhLCBlbmREZWx0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBkYXRlc0RlbHRhOiBzdGFydERlbHRhLCBzdGFuZGFyZFByb3BzOiBzdGFuZGFyZFByb3BzIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBzdGFydERlbHRhOiBzdGFydERlbHRhLCBlbmREZWx0YTogZW5kRGVsdGEsIHN0YW5kYXJkUHJvcHM6IHN0YW5kYXJkUHJvcHMgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7IC8vIG1lYW5zIFwiY2xlYXIgdGhlIGVuZFwiXG4gICAgICAgICAgICAgICAgc3RhbmRhcmRQcm9wcy5oYXNFbmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLm11dGF0ZSh7IGRhdGVzRGVsdGE6IHN0YXJ0RGVsdGEsIHN0YW5kYXJkUHJvcHM6IHN0YW5kYXJkUHJvcHMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEV2ZW50QXBpLnByb3RvdHlwZS5tb3ZlU3RhcnQgPSBmdW5jdGlvbiAoZGVsdGFJbnB1dCkge1xuICAgICAgICB2YXIgZGVsdGEgPSBjcmVhdGVEdXJhdGlvbihkZWx0YUlucHV0KTtcbiAgICAgICAgaWYgKGRlbHRhKSB7IC8vIFRPRE86IHdhcm5pbmcgaWYgcGFyc2VkIGJhZFxuICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBzdGFydERlbHRhOiBkZWx0YSB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRXZlbnRBcGkucHJvdG90eXBlLm1vdmVFbmQgPSBmdW5jdGlvbiAoZGVsdGFJbnB1dCkge1xuICAgICAgICB2YXIgZGVsdGEgPSBjcmVhdGVEdXJhdGlvbihkZWx0YUlucHV0KTtcbiAgICAgICAgaWYgKGRlbHRhKSB7IC8vIFRPRE86IHdhcm5pbmcgaWYgcGFyc2VkIGJhZFxuICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBlbmREZWx0YTogZGVsdGEgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEV2ZW50QXBpLnByb3RvdHlwZS5tb3ZlRGF0ZXMgPSBmdW5jdGlvbiAoZGVsdGFJbnB1dCkge1xuICAgICAgICB2YXIgZGVsdGEgPSBjcmVhdGVEdXJhdGlvbihkZWx0YUlucHV0KTtcbiAgICAgICAgaWYgKGRlbHRhKSB7IC8vIFRPRE86IHdhcm5pbmcgaWYgcGFyc2VkIGJhZFxuICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBkYXRlc0RlbHRhOiBkZWx0YSB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRXZlbnRBcGkucHJvdG90eXBlLnNldEFsbERheSA9IGZ1bmN0aW9uIChhbGxEYXksIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIHN0YW5kYXJkUHJvcHMgPSB7IGFsbERheTogYWxsRGF5IH07XG4gICAgICAgIHZhciBtYWludGFpbkR1cmF0aW9uID0gb3B0aW9ucy5tYWludGFpbkR1cmF0aW9uO1xuICAgICAgICBpZiAobWFpbnRhaW5EdXJhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICBtYWludGFpbkR1cmF0aW9uID0gdGhpcy5fY29udGV4dC5vcHRpb25zLmFsbERheU1haW50YWluRHVyYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2RlZi5hbGxEYXkgIT09IGFsbERheSkge1xuICAgICAgICAgICAgc3RhbmRhcmRQcm9wcy5oYXNFbmQgPSBtYWludGFpbkR1cmF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubXV0YXRlKHsgc3RhbmRhcmRQcm9wczogc3RhbmRhcmRQcm9wcyB9KTtcbiAgICB9O1xuICAgIEV2ZW50QXBpLnByb3RvdHlwZS5mb3JtYXRSYW5nZSA9IGZ1bmN0aW9uIChmb3JtYXRJbnB1dCkge1xuICAgICAgICB2YXIgZGF0ZUVudiA9IHRoaXMuX2NvbnRleHQuZGF0ZUVudjtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5faW5zdGFuY2U7XG4gICAgICAgIHZhciBmb3JtYXR0ZXIgPSBjcmVhdGVGb3JtYXR0ZXIoZm9ybWF0SW5wdXQpO1xuICAgICAgICBpZiAodGhpcy5fZGVmLmhhc0VuZCkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGVFbnYuZm9ybWF0UmFuZ2UoaW5zdGFuY2UucmFuZ2Uuc3RhcnQsIGluc3RhbmNlLnJhbmdlLmVuZCwgZm9ybWF0dGVyLCB7XG4gICAgICAgICAgICAgICAgZm9yY2VkU3RhcnRUem86IGluc3RhbmNlLmZvcmNlZFN0YXJ0VHpvLFxuICAgICAgICAgICAgICAgIGZvcmNlZEVuZFR6bzogaW5zdGFuY2UuZm9yY2VkRW5kVHpvLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGVFbnYuZm9ybWF0KGluc3RhbmNlLnJhbmdlLnN0YXJ0LCBmb3JtYXR0ZXIsIHtcbiAgICAgICAgICAgIGZvcmNlZFR6bzogaW5zdGFuY2UuZm9yY2VkU3RhcnRUem8sXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRXZlbnRBcGkucHJvdG90eXBlLm11dGF0ZSA9IGZ1bmN0aW9uIChtdXRhdGlvbikge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLl9pbnN0YW5jZTtcbiAgICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgICAgICB2YXIgZGVmID0gdGhpcy5fZGVmO1xuICAgICAgICAgICAgdmFyIGNvbnRleHRfMSA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICAgICAgICB2YXIgZXZlbnRTdG9yZV8xID0gY29udGV4dF8xLmdldEN1cnJlbnREYXRhKCkuZXZlbnRTdG9yZTtcbiAgICAgICAgICAgIHZhciByZWxldmFudEV2ZW50cyA9IGdldFJlbGV2YW50RXZlbnRzKGV2ZW50U3RvcmVfMSwgaW5zdGFuY2UuaW5zdGFuY2VJZCk7XG4gICAgICAgICAgICB2YXIgZXZlbnRDb25maWdCYXNlID0ge1xuICAgICAgICAgICAgICAgICcnOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICcnLFxuICAgICAgICAgICAgICAgICAgICBzdGFydEVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbkVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50czogW10sXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93czogW10sXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJycsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgdGV4dENvbG9yOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lczogW10sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWxldmFudEV2ZW50cyA9IGFwcGx5TXV0YXRpb25Ub0V2ZW50U3RvcmUocmVsZXZhbnRFdmVudHMsIGV2ZW50Q29uZmlnQmFzZSwgbXV0YXRpb24sIGNvbnRleHRfMSk7XG4gICAgICAgICAgICB2YXIgb2xkRXZlbnQgPSBuZXcgRXZlbnRBcGkoY29udGV4dF8xLCBkZWYsIGluc3RhbmNlKTsgLy8gc25hcHNob3RcbiAgICAgICAgICAgIHRoaXMuX2RlZiA9IHJlbGV2YW50RXZlbnRzLmRlZnNbZGVmLmRlZklkXTtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gcmVsZXZhbnRFdmVudHMuaW5zdGFuY2VzW2luc3RhbmNlLmluc3RhbmNlSWRdO1xuICAgICAgICAgICAgY29udGV4dF8xLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnTUVSR0VfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICBldmVudFN0b3JlOiByZWxldmFudEV2ZW50cyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udGV4dF8xLmVtaXR0ZXIudHJpZ2dlcignZXZlbnRDaGFuZ2UnLCB7XG4gICAgICAgICAgICAgICAgb2xkRXZlbnQ6IG9sZEV2ZW50LFxuICAgICAgICAgICAgICAgIGV2ZW50OiB0aGlzLFxuICAgICAgICAgICAgICAgIHJlbGF0ZWRFdmVudHM6IGJ1aWxkRXZlbnRBcGlzKHJlbGV2YW50RXZlbnRzLCBjb250ZXh0XzEsIGluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICByZXZlcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dF8xLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdSRVNFVF9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogZXZlbnRTdG9yZV8xLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEV2ZW50QXBpLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5fY29udGV4dDtcbiAgICAgICAgdmFyIGFzU3RvcmUgPSBldmVudEFwaVRvU3RvcmUodGhpcyk7XG4gICAgICAgIGNvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ1JFTU9WRV9FVkVOVFMnLFxuICAgICAgICAgICAgZXZlbnRTdG9yZTogYXNTdG9yZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdldmVudFJlbW92ZScsIHtcbiAgICAgICAgICAgIGV2ZW50OiB0aGlzLFxuICAgICAgICAgICAgcmVsYXRlZEV2ZW50czogW10sXG4gICAgICAgICAgICByZXZlcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ01FUkdFX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IGFzU3RvcmUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwic291cmNlXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc291cmNlSWQgPSB0aGlzLl9kZWYuc291cmNlSWQ7XG4gICAgICAgICAgICBpZiAoc291cmNlSWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV2ZW50U291cmNlQXBpKHRoaXMuX2NvbnRleHQsIHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudERhdGEoKS5ldmVudFNvdXJjZXNbc291cmNlSWRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50QXBpLnByb3RvdHlwZSwgXCJzdGFydFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlID9cbiAgICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0LmRhdGVFbnYudG9EYXRlKHRoaXMuX2luc3RhbmNlLnJhbmdlLnN0YXJ0KSA6XG4gICAgICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwiZW5kXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuX2luc3RhbmNlICYmIHRoaXMuX2RlZi5oYXNFbmQpID9cbiAgICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0LmRhdGVFbnYudG9EYXRlKHRoaXMuX2luc3RhbmNlLnJhbmdlLmVuZCkgOlxuICAgICAgICAgICAgICAgIG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRBcGkucHJvdG90eXBlLCBcInN0YXJ0U3RyXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLl9pbnN0YW5jZTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZXh0LmRhdGVFbnYuZm9ybWF0SXNvKGluc3RhbmNlLnJhbmdlLnN0YXJ0LCB7XG4gICAgICAgICAgICAgICAgICAgIG9taXRUaW1lOiB0aGlzLl9kZWYuYWxsRGF5LFxuICAgICAgICAgICAgICAgICAgICBmb3JjZWRUem86IGluc3RhbmNlLmZvcmNlZFN0YXJ0VHpvLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50QXBpLnByb3RvdHlwZSwgXCJlbmRTdHJcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuX2luc3RhbmNlO1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlICYmIHRoaXMuX2RlZi5oYXNFbmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGV4dC5kYXRlRW52LmZvcm1hdElzbyhpbnN0YW5jZS5yYW5nZS5lbmQsIHtcbiAgICAgICAgICAgICAgICAgICAgb21pdFRpbWU6IHRoaXMuX2RlZi5hbGxEYXksXG4gICAgICAgICAgICAgICAgICAgIGZvcmNlZFR6bzogaW5zdGFuY2UuZm9yY2VkRW5kVHpvLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50QXBpLnByb3RvdHlwZSwgXCJpZFwiLCB7XG4gICAgICAgIC8vIGNvbXB1dGFibGUgcHJvcHMgdGhhdCBhbGwgYWNjZXNzIHRoZSBkZWZcbiAgICAgICAgLy8gVE9ETzogZmluZCBhIFR5cGVTY3JpcHQtY29tcGF0aWJsZSB3YXkgdG8gZG8gdGhpcyBhdCBzY2FsZVxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RlZi5wdWJsaWNJZDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwiZ3JvdXBJZFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGVmLmdyb3VwSWQ7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRBcGkucHJvdG90eXBlLCBcImFsbERheVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGVmLmFsbERheTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwidGl0bGVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RlZi50aXRsZTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwidXJsXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kZWYudXJsOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50QXBpLnByb3RvdHlwZSwgXCJkaXNwbGF5XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kZWYudWkuZGlzcGxheSB8fCAnYXV0byc7IH0gLy8gYmFkLiBqdXN0IG5vcm1hbGl6ZSB0aGUgdHlwZSBlYXJsaWVyXG4gICAgICAgICxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwic3RhcnRFZGl0YWJsZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGVmLnVpLnN0YXJ0RWRpdGFibGU7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRBcGkucHJvdG90eXBlLCBcImR1cmF0aW9uRWRpdGFibGVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RlZi51aS5kdXJhdGlvbkVkaXRhYmxlOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50QXBpLnByb3RvdHlwZSwgXCJjb25zdHJhaW50XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kZWYudWkuY29uc3RyYWludHNbMF0gfHwgbnVsbDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwib3ZlcmxhcFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGVmLnVpLm92ZXJsYXA7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRBcGkucHJvdG90eXBlLCBcImFsbG93XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kZWYudWkuYWxsb3dzWzBdIHx8IG51bGw7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRBcGkucHJvdG90eXBlLCBcImJhY2tncm91bmRDb2xvclwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGVmLnVpLmJhY2tncm91bmRDb2xvcjsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwiYm9yZGVyQ29sb3JcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RlZi51aS5ib3JkZXJDb2xvcjsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwidGV4dENvbG9yXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kZWYudWkudGV4dENvbG9yOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50QXBpLnByb3RvdHlwZSwgXCJjbGFzc05hbWVzXCIsIHtcbiAgICAgICAgLy8gTk9URTogdXNlciBjYW4ndCBtb2RpZnkgdGhlc2UgYmVjYXVzZSBPYmplY3QuZnJlZXplIHdhcyBjYWxsZWQgaW4gZXZlbnQtZGVmIHBhcnNpbmdcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kZWYudWkuY2xhc3NOYW1lczsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwiZXh0ZW5kZWRQcm9wc1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGVmLmV4dGVuZGVkUHJvcHM7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBFdmVudEFwaS5wcm90b3R5cGUudG9QbGFpbk9iamVjdCA9IGZ1bmN0aW9uIChzZXR0aW5ncykge1xuICAgICAgICBpZiAoc2V0dGluZ3MgPT09IHZvaWQgMCkgeyBzZXR0aW5ncyA9IHt9OyB9XG4gICAgICAgIHZhciBkZWYgPSB0aGlzLl9kZWY7XG4gICAgICAgIHZhciB1aSA9IGRlZi51aTtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgc3RhcnRTdHIgPSBfYS5zdGFydFN0ciwgZW5kU3RyID0gX2EuZW5kU3RyO1xuICAgICAgICB2YXIgcmVzID0ge307XG4gICAgICAgIGlmIChkZWYudGl0bGUpIHtcbiAgICAgICAgICAgIHJlcy50aXRsZSA9IGRlZi50aXRsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnRTdHIpIHtcbiAgICAgICAgICAgIHJlcy5zdGFydCA9IHN0YXJ0U3RyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmRTdHIpIHtcbiAgICAgICAgICAgIHJlcy5lbmQgPSBlbmRTdHI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5wdWJsaWNJZCkge1xuICAgICAgICAgICAgcmVzLmlkID0gZGVmLnB1YmxpY0lkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYuZ3JvdXBJZCkge1xuICAgICAgICAgICAgcmVzLmdyb3VwSWQgPSBkZWYuZ3JvdXBJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLnVybCkge1xuICAgICAgICAgICAgcmVzLnVybCA9IGRlZi51cmw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVpLmRpc3BsYXkgJiYgdWkuZGlzcGxheSAhPT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICByZXMuZGlzcGxheSA9IHVpLmRpc3BsYXk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogd2hhdCBhYm91dCByZWN1cnJpbmctZXZlbnQgcHJvcGVydGllcz8/P1xuICAgICAgICAvLyBUT0RPOiBpbmNsdWRlIHN0YXJ0RWRpdGFibGUvZHVyYXRpb25FZGl0YWJsZS9jb25zdHJhaW50L292ZXJsYXAvYWxsb3dcbiAgICAgICAgaWYgKHNldHRpbmdzLmNvbGxhcHNlQ29sb3IgJiYgdWkuYmFja2dyb3VuZENvbG9yICYmIHVpLmJhY2tncm91bmRDb2xvciA9PT0gdWkuYm9yZGVyQ29sb3IpIHtcbiAgICAgICAgICAgIHJlcy5jb2xvciA9IHVpLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh1aS5iYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICAgICAgICByZXMuYmFja2dyb3VuZENvbG9yID0gdWkuYmFja2dyb3VuZENvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVpLmJvcmRlckNvbG9yKSB7XG4gICAgICAgICAgICAgICAgcmVzLmJvcmRlckNvbG9yID0gdWkuYm9yZGVyQ29sb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVpLnRleHRDb2xvcikge1xuICAgICAgICAgICAgcmVzLnRleHRDb2xvciA9IHVpLnRleHRDb2xvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodWkuY2xhc3NOYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlcy5jbGFzc05hbWVzID0gdWkuY2xhc3NOYW1lcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGVmLmV4dGVuZGVkUHJvcHMpLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHNldHRpbmdzLmNvbGxhcHNlRXh0ZW5kZWRQcm9wcykge1xuICAgICAgICAgICAgICAgIHRzbGliLl9fYXNzaWduKHJlcywgZGVmLmV4dGVuZGVkUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzLmV4dGVuZGVkUHJvcHMgPSBkZWYuZXh0ZW5kZWRQcm9wcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgRXZlbnRBcGkucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9QbGFpbk9iamVjdCgpO1xuICAgIH07XG4gICAgcmV0dXJuIEV2ZW50QXBpO1xufSgpKTtcbmZ1bmN0aW9uIGV2ZW50QXBpVG9TdG9yZShldmVudEFwaSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgdmFyIGRlZiA9IGV2ZW50QXBpLl9kZWY7XG4gICAgdmFyIGluc3RhbmNlID0gZXZlbnRBcGkuX2luc3RhbmNlO1xuICAgIHJldHVybiB7XG4gICAgICAgIGRlZnM6IChfYSA9IHt9LCBfYVtkZWYuZGVmSWRdID0gZGVmLCBfYSksXG4gICAgICAgIGluc3RhbmNlczogaW5zdGFuY2VcbiAgICAgICAgICAgID8gKF9iID0ge30sIF9iW2luc3RhbmNlLmluc3RhbmNlSWRdID0gaW5zdGFuY2UsIF9iKSA6IHt9LFxuICAgIH07XG59XG5mdW5jdGlvbiBidWlsZEV2ZW50QXBpcyhldmVudFN0b3JlLCBjb250ZXh0LCBleGNsdWRlSW5zdGFuY2UpIHtcbiAgICB2YXIgZGVmcyA9IGV2ZW50U3RvcmUuZGVmcywgaW5zdGFuY2VzID0gZXZlbnRTdG9yZS5pbnN0YW5jZXM7XG4gICAgdmFyIGV2ZW50QXBpcyA9IFtdO1xuICAgIHZhciBleGNsdWRlSW5zdGFuY2VJZCA9IGV4Y2x1ZGVJbnN0YW5jZSA/IGV4Y2x1ZGVJbnN0YW5jZS5pbnN0YW5jZUlkIDogJyc7XG4gICAgZm9yICh2YXIgaWQgaW4gaW5zdGFuY2VzKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGluc3RhbmNlc1tpZF07XG4gICAgICAgIHZhciBkZWYgPSBkZWZzW2luc3RhbmNlLmRlZklkXTtcbiAgICAgICAgaWYgKGluc3RhbmNlLmluc3RhbmNlSWQgIT09IGV4Y2x1ZGVJbnN0YW5jZUlkKSB7XG4gICAgICAgICAgICBldmVudEFwaXMucHVzaChuZXcgRXZlbnRBcGkoY29udGV4dCwgZGVmLCBpbnN0YW5jZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBldmVudEFwaXM7XG59XG5cbnZhciBjYWxlbmRhclN5c3RlbUNsYXNzTWFwID0ge307XG5mdW5jdGlvbiByZWdpc3RlckNhbGVuZGFyU3lzdGVtKG5hbWUsIHRoZUNsYXNzKSB7XG4gICAgY2FsZW5kYXJTeXN0ZW1DbGFzc01hcFtuYW1lXSA9IHRoZUNsYXNzO1xufVxuZnVuY3Rpb24gY3JlYXRlQ2FsZW5kYXJTeXN0ZW0obmFtZSkge1xuICAgIHJldHVybiBuZXcgY2FsZW5kYXJTeXN0ZW1DbGFzc01hcFtuYW1lXSgpO1xufVxudmFyIEdyZWdvcmlhbkNhbGVuZGFyU3lzdGVtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEdyZWdvcmlhbkNhbGVuZGFyU3lzdGVtKCkge1xuICAgIH1cbiAgICBHcmVnb3JpYW5DYWxlbmRhclN5c3RlbS5wcm90b3R5cGUuZ2V0TWFya2VyWWVhciA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmdldFVUQ0Z1bGxZZWFyKCk7XG4gICAgfTtcbiAgICBHcmVnb3JpYW5DYWxlbmRhclN5c3RlbS5wcm90b3R5cGUuZ2V0TWFya2VyTW9udGggPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC5nZXRVVENNb250aCgpO1xuICAgIH07XG4gICAgR3JlZ29yaWFuQ2FsZW5kYXJTeXN0ZW0ucHJvdG90eXBlLmdldE1hcmtlckRheSA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmdldFVUQ0RhdGUoKTtcbiAgICB9O1xuICAgIEdyZWdvcmlhbkNhbGVuZGFyU3lzdGVtLnByb3RvdHlwZS5hcnJheVRvTWFya2VyID0gZnVuY3Rpb24gKGFycikge1xuICAgICAgICByZXR1cm4gYXJyYXlUb1V0Y0RhdGUoYXJyKTtcbiAgICB9O1xuICAgIEdyZWdvcmlhbkNhbGVuZGFyU3lzdGVtLnByb3RvdHlwZS5tYXJrZXJUb0FycmF5ID0gZnVuY3Rpb24gKG1hcmtlcikge1xuICAgICAgICByZXR1cm4gZGF0ZVRvVXRjQXJyYXkobWFya2VyKTtcbiAgICB9O1xuICAgIHJldHVybiBHcmVnb3JpYW5DYWxlbmRhclN5c3RlbTtcbn0oKSk7XG5yZWdpc3RlckNhbGVuZGFyU3lzdGVtKCdncmVnb3J5JywgR3JlZ29yaWFuQ2FsZW5kYXJTeXN0ZW0pO1xuXG52YXIgSVNPX1JFID0gL15cXHMqKFxcZHs0fSkoLT8oXFxkezJ9KSgtPyhcXGR7Mn0pKFtUIF0oXFxkezJ9KTo/KFxcZHsyfSkoOj8oXFxkezJ9KShcXC4oXFxkKykpPyk/KFp8KChbLStdKShcXGR7Mn0pKDo/KFxcZHsyfSkpPykpPyk/KT8pPyQvO1xuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gICAgdmFyIG0gPSBJU09fUkUuZXhlYyhzdHIpO1xuICAgIGlmIChtKSB7XG4gICAgICAgIHZhciBtYXJrZXIgPSBuZXcgRGF0ZShEYXRlLlVUQyhOdW1iZXIobVsxXSksIG1bM10gPyBOdW1iZXIobVszXSkgLSAxIDogMCwgTnVtYmVyKG1bNV0gfHwgMSksIE51bWJlcihtWzddIHx8IDApLCBOdW1iZXIobVs4XSB8fCAwKSwgTnVtYmVyKG1bMTBdIHx8IDApLCBtWzEyXSA/IE51bWJlcihcIjAuXCIgKyBtWzEyXSkgKiAxMDAwIDogMCkpO1xuICAgICAgICBpZiAoaXNWYWxpZERhdGUobWFya2VyKSkge1xuICAgICAgICAgICAgdmFyIHRpbWVab25lT2Zmc2V0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChtWzEzXSkge1xuICAgICAgICAgICAgICAgIHRpbWVab25lT2Zmc2V0ID0gKG1bMTVdID09PSAnLScgPyAtMSA6IDEpICogKE51bWJlcihtWzE2XSB8fCAwKSAqIDYwICtcbiAgICAgICAgICAgICAgICAgICAgTnVtYmVyKG1bMThdIHx8IDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbWFya2VyOiBtYXJrZXIsXG4gICAgICAgICAgICAgICAgaXNUaW1lVW5zcGVjaWZpZWQ6ICFtWzZdLFxuICAgICAgICAgICAgICAgIHRpbWVab25lT2Zmc2V0OiB0aW1lWm9uZU9mZnNldCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBEYXRlRW52ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERhdGVFbnYoc2V0dGluZ3MpIHtcbiAgICAgICAgdmFyIHRpbWVab25lID0gdGhpcy50aW1lWm9uZSA9IHNldHRpbmdzLnRpbWVab25lO1xuICAgICAgICB2YXIgaXNOYW1lZFRpbWVab25lID0gdGltZVpvbmUgIT09ICdsb2NhbCcgJiYgdGltZVpvbmUgIT09ICdVVEMnO1xuICAgICAgICBpZiAoc2V0dGluZ3MubmFtZWRUaW1lWm9uZUltcGwgJiYgaXNOYW1lZFRpbWVab25lKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWVkVGltZVpvbmVJbXBsID0gbmV3IHNldHRpbmdzLm5hbWVkVGltZVpvbmVJbXBsKHRpbWVab25lKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbkNvbXB1dGVPZmZzZXQgPSBCb29sZWFuKCFpc05hbWVkVGltZVpvbmUgfHwgdGhpcy5uYW1lZFRpbWVab25lSW1wbCk7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJTeXN0ZW0gPSBjcmVhdGVDYWxlbmRhclN5c3RlbShzZXR0aW5ncy5jYWxlbmRhclN5c3RlbSk7XG4gICAgICAgIHRoaXMubG9jYWxlID0gc2V0dGluZ3MubG9jYWxlO1xuICAgICAgICB0aGlzLndlZWtEb3cgPSBzZXR0aW5ncy5sb2NhbGUud2Vlay5kb3c7XG4gICAgICAgIHRoaXMud2Vla0RveSA9IHNldHRpbmdzLmxvY2FsZS53ZWVrLmRveTtcbiAgICAgICAgaWYgKHNldHRpbmdzLndlZWtOdW1iZXJDYWxjdWxhdGlvbiA9PT0gJ0lTTycpIHtcbiAgICAgICAgICAgIHRoaXMud2Vla0RvdyA9IDE7XG4gICAgICAgICAgICB0aGlzLndlZWtEb3kgPSA0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MuZmlyc3REYXkgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLndlZWtEb3cgPSBzZXR0aW5ncy5maXJzdERheTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNldHRpbmdzLndlZWtOdW1iZXJDYWxjdWxhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy53ZWVrTnVtYmVyRnVuYyA9IHNldHRpbmdzLndlZWtOdW1iZXJDYWxjdWxhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndlZWtUZXh0ID0gc2V0dGluZ3Mud2Vla1RleHQgIT0gbnVsbCA/IHNldHRpbmdzLndlZWtUZXh0IDogc2V0dGluZ3MubG9jYWxlLm9wdGlvbnMud2Vla1RleHQ7XG4gICAgICAgIHRoaXMud2Vla1RleHRMb25nID0gKHNldHRpbmdzLndlZWtUZXh0TG9uZyAhPSBudWxsID8gc2V0dGluZ3Mud2Vla1RleHRMb25nIDogc2V0dGluZ3MubG9jYWxlLm9wdGlvbnMud2Vla1RleHRMb25nKSB8fCB0aGlzLndlZWtUZXh0O1xuICAgICAgICB0aGlzLmNtZEZvcm1hdHRlciA9IHNldHRpbmdzLmNtZEZvcm1hdHRlcjtcbiAgICAgICAgdGhpcy5kZWZhdWx0U2VwYXJhdG9yID0gc2V0dGluZ3MuZGVmYXVsdFNlcGFyYXRvcjtcbiAgICB9XG4gICAgLy8gQ3JlYXRpbmcgLyBQYXJzaW5nXG4gICAgRGF0ZUVudi5wcm90b3R5cGUuY3JlYXRlTWFya2VyID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIHZhciBtZXRhID0gdGhpcy5jcmVhdGVNYXJrZXJNZXRhKGlucHV0KTtcbiAgICAgICAgaWYgKG1ldGEgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXRhLm1hcmtlcjtcbiAgICB9O1xuICAgIERhdGVFbnYucHJvdG90eXBlLmNyZWF0ZU5vd01hcmtlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuQ29tcHV0ZU9mZnNldCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGltZXN0YW1wVG9NYXJrZXIobmV3IERhdGUoKS52YWx1ZU9mKCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHdlIGNhbid0IGNvbXB1dGUgdGhlIGN1cnJlbnQgZGF0ZSB2YWwgZm9yIGEgdGltZXpvbmUsXG4gICAgICAgIC8vIGJldHRlciB0byBnaXZlIHRoZSBjdXJyZW50IGxvY2FsIGRhdGUgdmFscyB0aGFuIFVUQ1xuICAgICAgICByZXR1cm4gYXJyYXlUb1V0Y0RhdGUoZGF0ZVRvTG9jYWxBcnJheShuZXcgRGF0ZSgpKSk7XG4gICAgfTtcbiAgICBEYXRlRW52LnByb3RvdHlwZS5jcmVhdGVNYXJrZXJNZXRhID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZShpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1hcmtlciA9IG51bGw7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBtYXJrZXIgPSB0aGlzLnRpbWVzdGFtcFRvTWFya2VyKGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIGlucHV0ID0gaW5wdXQudmFsdWVPZigpO1xuICAgICAgICAgICAgaWYgKCFpc05hTihpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICBtYXJrZXIgPSB0aGlzLnRpbWVzdGFtcFRvTWFya2VyKGlucHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICAgICAgbWFya2VyID0gYXJyYXlUb1V0Y0RhdGUoaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXJrZXIgPT09IG51bGwgfHwgIWlzVmFsaWREYXRlKG1hcmtlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1hcmtlcjogbWFya2VyLCBpc1RpbWVVbnNwZWNpZmllZDogZmFsc2UsIGZvcmNlZFR6bzogbnVsbCB9O1xuICAgIH07XG4gICAgRGF0ZUVudi5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiAocykge1xuICAgICAgICB2YXIgcGFydHMgPSBwYXJzZShzKTtcbiAgICAgICAgaWYgKHBhcnRzID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWFya2VyID0gcGFydHMubWFya2VyO1xuICAgICAgICB2YXIgZm9yY2VkVHpvID0gbnVsbDtcbiAgICAgICAgaWYgKHBhcnRzLnRpbWVab25lT2Zmc2V0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jYW5Db21wdXRlT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgbWFya2VyID0gdGhpcy50aW1lc3RhbXBUb01hcmtlcihtYXJrZXIudmFsdWVPZigpIC0gcGFydHMudGltZVpvbmVPZmZzZXQgKiA2MCAqIDEwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yY2VkVHpvID0gcGFydHMudGltZVpvbmVPZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbWFya2VyOiBtYXJrZXIsIGlzVGltZVVuc3BlY2lmaWVkOiBwYXJ0cy5pc1RpbWVVbnNwZWNpZmllZCwgZm9yY2VkVHpvOiBmb3JjZWRUem8gfTtcbiAgICB9O1xuICAgIC8vIEFjY2Vzc29yc1xuICAgIERhdGVFbnYucHJvdG90eXBlLmdldFllYXIgPSBmdW5jdGlvbiAobWFya2VyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGVuZGFyU3lzdGVtLmdldE1hcmtlclllYXIobWFya2VyKTtcbiAgICB9O1xuICAgIERhdGVFbnYucHJvdG90eXBlLmdldE1vbnRoID0gZnVuY3Rpb24gKG1hcmtlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJNb250aChtYXJrZXIpO1xuICAgIH07XG4gICAgLy8gQWRkaW5nIC8gU3VidHJhY3RpbmdcbiAgICBEYXRlRW52LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAobWFya2VyLCBkdXIpIHtcbiAgICAgICAgdmFyIGEgPSB0aGlzLmNhbGVuZGFyU3lzdGVtLm1hcmtlclRvQXJyYXkobWFya2VyKTtcbiAgICAgICAgYVswXSArPSBkdXIueWVhcnM7XG4gICAgICAgIGFbMV0gKz0gZHVyLm1vbnRocztcbiAgICAgICAgYVsyXSArPSBkdXIuZGF5cztcbiAgICAgICAgYVs2XSArPSBkdXIubWlsbGlzZWNvbmRzO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5hcnJheVRvTWFya2VyKGEpO1xuICAgIH07XG4gICAgRGF0ZUVudi5wcm90b3R5cGUuc3VidHJhY3QgPSBmdW5jdGlvbiAobWFya2VyLCBkdXIpIHtcbiAgICAgICAgdmFyIGEgPSB0aGlzLmNhbGVuZGFyU3lzdGVtLm1hcmtlclRvQXJyYXkobWFya2VyKTtcbiAgICAgICAgYVswXSAtPSBkdXIueWVhcnM7XG4gICAgICAgIGFbMV0gLT0gZHVyLm1vbnRocztcbiAgICAgICAgYVsyXSAtPSBkdXIuZGF5cztcbiAgICAgICAgYVs2XSAtPSBkdXIubWlsbGlzZWNvbmRzO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5hcnJheVRvTWFya2VyKGEpO1xuICAgIH07XG4gICAgRGF0ZUVudi5wcm90b3R5cGUuYWRkWWVhcnMgPSBmdW5jdGlvbiAobWFya2VyLCBuKSB7XG4gICAgICAgIHZhciBhID0gdGhpcy5jYWxlbmRhclN5c3RlbS5tYXJrZXJUb0FycmF5KG1hcmtlcik7XG4gICAgICAgIGFbMF0gKz0gbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsZW5kYXJTeXN0ZW0uYXJyYXlUb01hcmtlcihhKTtcbiAgICB9O1xuICAgIERhdGVFbnYucHJvdG90eXBlLmFkZE1vbnRocyA9IGZ1bmN0aW9uIChtYXJrZXIsIG4pIHtcbiAgICAgICAgdmFyIGEgPSB0aGlzLmNhbGVuZGFyU3lzdGVtLm1hcmtlclRvQXJyYXkobWFya2VyKTtcbiAgICAgICAgYVsxXSArPSBuO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5hcnJheVRvTWFya2VyKGEpO1xuICAgIH07XG4gICAgLy8gRGlmZmluZyBXaG9sZSBVbml0c1xuICAgIERhdGVFbnYucHJvdG90eXBlLmRpZmZXaG9sZVllYXJzID0gZnVuY3Rpb24gKG0wLCBtMSkge1xuICAgICAgICB2YXIgY2FsZW5kYXJTeXN0ZW0gPSB0aGlzLmNhbGVuZGFyU3lzdGVtO1xuICAgICAgICBpZiAodGltZUFzTXMobTApID09PSB0aW1lQXNNcyhtMSkgJiZcbiAgICAgICAgICAgIGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlckRheShtMCkgPT09IGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlckRheShtMSkgJiZcbiAgICAgICAgICAgIGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlck1vbnRoKG0wKSA9PT0gY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyTW9udGgobTEpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyWWVhcihtMSkgLSBjYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJZZWFyKG0wKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIERhdGVFbnYucHJvdG90eXBlLmRpZmZXaG9sZU1vbnRocyA9IGZ1bmN0aW9uIChtMCwgbTEpIHtcbiAgICAgICAgdmFyIGNhbGVuZGFyU3lzdGVtID0gdGhpcy5jYWxlbmRhclN5c3RlbTtcbiAgICAgICAgaWYgKHRpbWVBc01zKG0wKSA9PT0gdGltZUFzTXMobTEpICYmXG4gICAgICAgICAgICBjYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJEYXkobTApID09PSBjYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJEYXkobTEpKSB7XG4gICAgICAgICAgICByZXR1cm4gKGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlck1vbnRoKG0xKSAtIGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlck1vbnRoKG0wKSkgK1xuICAgICAgICAgICAgICAgIChjYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJZZWFyKG0xKSAtIGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlclllYXIobTApKSAqIDEyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgLy8gUmFuZ2UgLyBEdXJhdGlvblxuICAgIERhdGVFbnYucHJvdG90eXBlLmdyZWF0ZXN0V2hvbGVVbml0ID0gZnVuY3Rpb24gKG0wLCBtMSkge1xuICAgICAgICB2YXIgbiA9IHRoaXMuZGlmZldob2xlWWVhcnMobTAsIG0xKTtcbiAgICAgICAgaWYgKG4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVuaXQ6ICd5ZWFyJywgdmFsdWU6IG4gfTtcbiAgICAgICAgfVxuICAgICAgICBuID0gdGhpcy5kaWZmV2hvbGVNb250aHMobTAsIG0xKTtcbiAgICAgICAgaWYgKG4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVuaXQ6ICdtb250aCcsIHZhbHVlOiBuIH07XG4gICAgICAgIH1cbiAgICAgICAgbiA9IGRpZmZXaG9sZVdlZWtzKG0wLCBtMSk7XG4gICAgICAgIGlmIChuICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4geyB1bml0OiAnd2VlaycsIHZhbHVlOiBuIH07XG4gICAgICAgIH1cbiAgICAgICAgbiA9IGRpZmZXaG9sZURheXMobTAsIG0xKTtcbiAgICAgICAgaWYgKG4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVuaXQ6ICdkYXknLCB2YWx1ZTogbiB9O1xuICAgICAgICB9XG4gICAgICAgIG4gPSBkaWZmSG91cnMobTAsIG0xKTtcbiAgICAgICAgaWYgKGlzSW50KG4pKSB7XG4gICAgICAgICAgICByZXR1cm4geyB1bml0OiAnaG91cicsIHZhbHVlOiBuIH07XG4gICAgICAgIH1cbiAgICAgICAgbiA9IGRpZmZNaW51dGVzKG0wLCBtMSk7XG4gICAgICAgIGlmIChpc0ludChuKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdW5pdDogJ21pbnV0ZScsIHZhbHVlOiBuIH07XG4gICAgICAgIH1cbiAgICAgICAgbiA9IGRpZmZTZWNvbmRzKG0wLCBtMSk7XG4gICAgICAgIGlmIChpc0ludChuKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdW5pdDogJ3NlY29uZCcsIHZhbHVlOiBuIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdW5pdDogJ21pbGxpc2Vjb25kJywgdmFsdWU6IG0xLnZhbHVlT2YoKSAtIG0wLnZhbHVlT2YoKSB9O1xuICAgIH07XG4gICAgRGF0ZUVudi5wcm90b3R5cGUuY291bnREdXJhdGlvbnNCZXR3ZWVuID0gZnVuY3Rpb24gKG0wLCBtMSwgZCkge1xuICAgICAgICAvLyBUT0RPOiBjYW4gdXNlIGdyZWF0ZXN0V2hvbGVVbml0XG4gICAgICAgIHZhciBkaWZmO1xuICAgICAgICBpZiAoZC55ZWFycykge1xuICAgICAgICAgICAgZGlmZiA9IHRoaXMuZGlmZldob2xlWWVhcnMobTAsIG0xKTtcbiAgICAgICAgICAgIGlmIChkaWZmICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpZmYgLyBhc1JvdWdoWWVhcnMoZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGQubW9udGhzKSB7XG4gICAgICAgICAgICBkaWZmID0gdGhpcy5kaWZmV2hvbGVNb250aHMobTAsIG0xKTtcbiAgICAgICAgICAgIGlmIChkaWZmICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpZmYgLyBhc1JvdWdoTW9udGhzKGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkLmRheXMpIHtcbiAgICAgICAgICAgIGRpZmYgPSBkaWZmV2hvbGVEYXlzKG0wLCBtMSk7XG4gICAgICAgICAgICBpZiAoZGlmZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkaWZmIC8gYXNSb3VnaERheXMoZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChtMS52YWx1ZU9mKCkgLSBtMC52YWx1ZU9mKCkpIC8gYXNSb3VnaE1zKGQpO1xuICAgIH07XG4gICAgLy8gU3RhcnQtT2ZcbiAgICAvLyB0aGVzZSBET04nVCByZXR1cm4gem9uZWQtZGF0ZXMuIG9ubHkgVVRDIHN0YXJ0LW9mIGRhdGVzXG4gICAgRGF0ZUVudi5wcm90b3R5cGUuc3RhcnRPZiA9IGZ1bmN0aW9uIChtLCB1bml0KSB7XG4gICAgICAgIGlmICh1bml0ID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0T2ZZZWFyKG0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bml0ID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydE9mTW9udGgobSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuaXQgPT09ICd3ZWVrJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZldlZWsobSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuaXQgPT09ICdkYXknKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhcnRPZkRheShtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pdCA9PT0gJ2hvdXInKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhcnRPZkhvdXIobSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuaXQgPT09ICdtaW51dGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhcnRPZk1pbnV0ZShtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pdCA9PT0gJ3NlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGFydE9mU2Vjb25kKG0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgRGF0ZUVudi5wcm90b3R5cGUuc3RhcnRPZlllYXIgPSBmdW5jdGlvbiAobSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5hcnJheVRvTWFya2VyKFtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyWWVhcihtKSxcbiAgICAgICAgXSk7XG4gICAgfTtcbiAgICBEYXRlRW52LnByb3RvdHlwZS5zdGFydE9mTW9udGggPSBmdW5jdGlvbiAobSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5hcnJheVRvTWFya2VyKFtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyWWVhcihtKSxcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyTW9udGgobSksXG4gICAgICAgIF0pO1xuICAgIH07XG4gICAgRGF0ZUVudi5wcm90b3R5cGUuc3RhcnRPZldlZWsgPSBmdW5jdGlvbiAobSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5hcnJheVRvTWFya2VyKFtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyWWVhcihtKSxcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyTW9udGgobSksXG4gICAgICAgICAgICBtLmdldFVUQ0RhdGUoKSAtICgobS5nZXRVVENEYXkoKSAtIHRoaXMud2Vla0RvdyArIDcpICUgNyksXG4gICAgICAgIF0pO1xuICAgIH07XG4gICAgLy8gV2VlayBOdW1iZXJcbiAgICBEYXRlRW52LnByb3RvdHlwZS5jb21wdXRlV2Vla051bWJlciA9IGZ1bmN0aW9uIChtYXJrZXIpIHtcbiAgICAgICAgaWYgKHRoaXMud2Vla051bWJlckZ1bmMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndlZWtOdW1iZXJGdW5jKHRoaXMudG9EYXRlKG1hcmtlcikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3ZWVrT2ZZZWFyKG1hcmtlciwgdGhpcy53ZWVrRG93LCB0aGlzLndlZWtEb3kpO1xuICAgIH07XG4gICAgLy8gVE9ETzogY2hva2Ugb24gdGltZVpvbmVOYW1lOiBsb25nXG4gICAgRGF0ZUVudi5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gKG1hcmtlciwgZm9ybWF0dGVyLCBkYXRlT3B0aW9ucykge1xuICAgICAgICBpZiAoZGF0ZU9wdGlvbnMgPT09IHZvaWQgMCkgeyBkYXRlT3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KHtcbiAgICAgICAgICAgIG1hcmtlcjogbWFya2VyLFxuICAgICAgICAgICAgdGltZVpvbmVPZmZzZXQ6IGRhdGVPcHRpb25zLmZvcmNlZFR6byAhPSBudWxsID9cbiAgICAgICAgICAgICAgICBkYXRlT3B0aW9ucy5mb3JjZWRUem8gOlxuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0Rm9yTWFya2VyKG1hcmtlciksXG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH07XG4gICAgRGF0ZUVudi5wcm90b3R5cGUuZm9ybWF0UmFuZ2UgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCwgZm9ybWF0dGVyLCBkYXRlT3B0aW9ucykge1xuICAgICAgICBpZiAoZGF0ZU9wdGlvbnMgPT09IHZvaWQgMCkgeyBkYXRlT3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIGlmIChkYXRlT3B0aW9ucy5pc0VuZEV4Y2x1c2l2ZSkge1xuICAgICAgICAgICAgZW5kID0gYWRkTXMoZW5kLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlci5mb3JtYXRSYW5nZSh7XG4gICAgICAgICAgICBtYXJrZXI6IHN0YXJ0LFxuICAgICAgICAgICAgdGltZVpvbmVPZmZzZXQ6IGRhdGVPcHRpb25zLmZvcmNlZFN0YXJ0VHpvICE9IG51bGwgP1xuICAgICAgICAgICAgICAgIGRhdGVPcHRpb25zLmZvcmNlZFN0YXJ0VHpvIDpcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldEZvck1hcmtlcihzdGFydCksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIG1hcmtlcjogZW5kLFxuICAgICAgICAgICAgdGltZVpvbmVPZmZzZXQ6IGRhdGVPcHRpb25zLmZvcmNlZEVuZFR6byAhPSBudWxsID9cbiAgICAgICAgICAgICAgICBkYXRlT3B0aW9ucy5mb3JjZWRFbmRUem8gOlxuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0Rm9yTWFya2VyKGVuZCksXG4gICAgICAgIH0sIHRoaXMsIGRhdGVPcHRpb25zLmRlZmF1bHRTZXBhcmF0b3IpO1xuICAgIH07XG4gICAgLypcbiAgICBEVU1COiB0aGUgb21pdFRpbWUgYXJnIGlzIGR1bWIuIGlmIHdlIG9taXQgdGhlIHRpbWUsIHdlIHdhbnQgdG8gb21pdCB0aGUgdGltZXpvbmUgb2Zmc2V0LiBhbmQgaWYgd2UgZG8gdGhhdCxcbiAgICBtaWdodCBhcyB3ZWxsIHVzZSBidWlsZElzb1N0cmluZyBvciBzb21lIG90aGVyIHV0aWwgZGlyZWN0bHlcbiAgICAqL1xuICAgIERhdGVFbnYucHJvdG90eXBlLmZvcm1hdElzbyA9IGZ1bmN0aW9uIChtYXJrZXIsIGV4dHJhT3B0aW9ucykge1xuICAgICAgICBpZiAoZXh0cmFPcHRpb25zID09PSB2b2lkIDApIHsgZXh0cmFPcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIHRpbWVab25lT2Zmc2V0ID0gbnVsbDtcbiAgICAgICAgaWYgKCFleHRyYU9wdGlvbnMub21pdFRpbWVab25lT2Zmc2V0KSB7XG4gICAgICAgICAgICBpZiAoZXh0cmFPcHRpb25zLmZvcmNlZFR6byAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGltZVpvbmVPZmZzZXQgPSBleHRyYU9wdGlvbnMuZm9yY2VkVHpvO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGltZVpvbmVPZmZzZXQgPSB0aGlzLm9mZnNldEZvck1hcmtlcihtYXJrZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZElzb1N0cmluZyhtYXJrZXIsIHRpbWVab25lT2Zmc2V0LCBleHRyYU9wdGlvbnMub21pdFRpbWUpO1xuICAgIH07XG4gICAgLy8gVGltZVpvbmVcbiAgICBEYXRlRW52LnByb3RvdHlwZS50aW1lc3RhbXBUb01hcmtlciA9IGZ1bmN0aW9uIChtcykge1xuICAgICAgICBpZiAodGhpcy50aW1lWm9uZSA9PT0gJ2xvY2FsJykge1xuICAgICAgICAgICAgcmV0dXJuIGFycmF5VG9VdGNEYXRlKGRhdGVUb0xvY2FsQXJyYXkobmV3IERhdGUobXMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudGltZVpvbmUgPT09ICdVVEMnIHx8ICF0aGlzLm5hbWVkVGltZVpvbmVJbXBsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUobXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheVRvVXRjRGF0ZSh0aGlzLm5hbWVkVGltZVpvbmVJbXBsLnRpbWVzdGFtcFRvQXJyYXkobXMpKTtcbiAgICB9O1xuICAgIERhdGVFbnYucHJvdG90eXBlLm9mZnNldEZvck1hcmtlciA9IGZ1bmN0aW9uIChtKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVab25lID09PSAnbG9jYWwnKSB7XG4gICAgICAgICAgICByZXR1cm4gLWFycmF5VG9Mb2NhbERhdGUoZGF0ZVRvVXRjQXJyYXkobSkpLmdldFRpbWV6b25lT2Zmc2V0KCk7IC8vIGNvbnZlcnQgXCJpbnZlcnNlXCIgb2Zmc2V0IHRvIFwibm9ybWFsXCIgb2Zmc2V0XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudGltZVpvbmUgPT09ICdVVEMnKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5uYW1lZFRpbWVab25lSW1wbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZWRUaW1lWm9uZUltcGwub2Zmc2V0Rm9yQXJyYXkoZGF0ZVRvVXRjQXJyYXkobSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgLy8gQ29udmVyc2lvblxuICAgIERhdGVFbnYucHJvdG90eXBlLnRvRGF0ZSA9IGZ1bmN0aW9uIChtLCBmb3JjZWRUem8pIHtcbiAgICAgICAgaWYgKHRoaXMudGltZVpvbmUgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgICAgIHJldHVybiBhcnJheVRvTG9jYWxEYXRlKGRhdGVUb1V0Y0FycmF5KG0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50aW1lWm9uZSA9PT0gJ1VUQycpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShtLnZhbHVlT2YoKSk7IC8vIG1ha2Ugc3VyZSBpdCdzIGEgY29weVxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5uYW1lZFRpbWVab25lSW1wbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG0udmFsdWVPZigpIC0gKGZvcmNlZFR6byB8fCAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG0udmFsdWVPZigpIC1cbiAgICAgICAgICAgIHRoaXMubmFtZWRUaW1lWm9uZUltcGwub2Zmc2V0Rm9yQXJyYXkoZGF0ZVRvVXRjQXJyYXkobSkpICogMTAwMCAqIDYwKTtcbiAgICB9O1xuICAgIHJldHVybiBEYXRlRW52O1xufSgpKTtcblxudmFyIGdsb2JhbExvY2FsZXMgPSBbXTtcblxudmFyIE1JTklNQUxfUkFXX0VOX0xPQ0FMRSA9IHtcbiAgICBjb2RlOiAnZW4nLFxuICAgIHdlZWs6IHtcbiAgICAgICAgZG93OiAwLFxuICAgICAgICBkb3k6IDQsIC8vIDQgZGF5cyBuZWVkIHRvIGJlIHdpdGhpbiB0aGUgeWVhciB0byBiZSBjb25zaWRlcmVkIHRoZSBmaXJzdCB3ZWVrXG4gICAgfSxcbiAgICBkaXJlY3Rpb246ICdsdHInLFxuICAgIGJ1dHRvblRleHQ6IHtcbiAgICAgICAgcHJldjogJ3ByZXYnLFxuICAgICAgICBuZXh0OiAnbmV4dCcsXG4gICAgICAgIHByZXZZZWFyOiAncHJldiB5ZWFyJyxcbiAgICAgICAgbmV4dFllYXI6ICduZXh0IHllYXInLFxuICAgICAgICB5ZWFyOiAneWVhcicsXG4gICAgICAgIHRvZGF5OiAndG9kYXknLFxuICAgICAgICBtb250aDogJ21vbnRoJyxcbiAgICAgICAgd2VlazogJ3dlZWsnLFxuICAgICAgICBkYXk6ICdkYXknLFxuICAgICAgICBsaXN0OiAnbGlzdCcsXG4gICAgfSxcbiAgICB3ZWVrVGV4dDogJ1cnLFxuICAgIHdlZWtUZXh0TG9uZzogJ1dlZWsnLFxuICAgIGNsb3NlSGludDogJ0Nsb3NlJyxcbiAgICB0aW1lSGludDogJ1RpbWUnLFxuICAgIGV2ZW50SGludDogJ0V2ZW50JyxcbiAgICBhbGxEYXlUZXh0OiAnYWxsLWRheScsXG4gICAgbW9yZUxpbmtUZXh0OiAnbW9yZScsXG4gICAgbm9FdmVudHNUZXh0OiAnTm8gZXZlbnRzIHRvIGRpc3BsYXknLFxufTtcbnZhciBSQVdfRU5fTE9DQUxFID0gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIE1JTklNQUxfUkFXX0VOX0xPQ0FMRSksIHsgXG4gICAgLy8gSW5jbHVkZXMgdGhpbmdzIHdlIGRvbid0IHdhbnQgb3RoZXIgbG9jYWxlcyB0byBpbmhlcml0LFxuICAgIC8vIHRoaW5ncyB0aGF0IGRlcml2ZSBmcm9tIG90aGVyIHRyYW5zbGF0YWJsZSBzdHJpbmdzLlxuICAgIGJ1dHRvbkhpbnRzOiB7XG4gICAgICAgIHByZXY6ICdQcmV2aW91cyAkMCcsXG4gICAgICAgIG5leHQ6ICdOZXh0ICQwJyxcbiAgICAgICAgdG9kYXk6IGZ1bmN0aW9uIChidXR0b25UZXh0LCB1bml0KSB7XG4gICAgICAgICAgICByZXR1cm4gKHVuaXQgPT09ICdkYXknKVxuICAgICAgICAgICAgICAgID8gJ1RvZGF5J1xuICAgICAgICAgICAgICAgIDogXCJUaGlzIFwiICsgYnV0dG9uVGV4dDtcbiAgICAgICAgfSxcbiAgICB9LCB2aWV3SGludDogJyQwIHZpZXcnLCBuYXZMaW5rSGludDogJ0dvIHRvICQwJywgbW9yZUxpbmtIaW50OiBmdW5jdGlvbiAoZXZlbnRDbnQpIHtcbiAgICAgICAgcmV0dXJuIFwiU2hvdyBcIiArIGV2ZW50Q250ICsgXCIgbW9yZSBldmVudFwiICsgKGV2ZW50Q250ID09PSAxID8gJycgOiAncycpO1xuICAgIH0gfSk7XG5mdW5jdGlvbiBvcmdhbml6ZVJhd0xvY2FsZXMoZXhwbGljaXRSYXdMb2NhbGVzKSB7XG4gICAgdmFyIGRlZmF1bHRDb2RlID0gZXhwbGljaXRSYXdMb2NhbGVzLmxlbmd0aCA+IDAgPyBleHBsaWNpdFJhd0xvY2FsZXNbMF0uY29kZSA6ICdlbic7XG4gICAgdmFyIGFsbFJhd0xvY2FsZXMgPSBnbG9iYWxMb2NhbGVzLmNvbmNhdChleHBsaWNpdFJhd0xvY2FsZXMpO1xuICAgIHZhciByYXdMb2NhbGVNYXAgPSB7XG4gICAgICAgIGVuOiBSQVdfRU5fTE9DQUxFLFxuICAgIH07XG4gICAgZm9yICh2YXIgX2kgPSAwLCBhbGxSYXdMb2NhbGVzXzEgPSBhbGxSYXdMb2NhbGVzOyBfaSA8IGFsbFJhd0xvY2FsZXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHJhd0xvY2FsZSA9IGFsbFJhd0xvY2FsZXNfMVtfaV07XG4gICAgICAgIHJhd0xvY2FsZU1hcFtyYXdMb2NhbGUuY29kZV0gPSByYXdMb2NhbGU7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIG1hcDogcmF3TG9jYWxlTWFwLFxuICAgICAgICBkZWZhdWx0Q29kZTogZGVmYXVsdENvZGUsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGJ1aWxkTG9jYWxlKGlucHV0U2luZ3VsYXIsIGF2YWlsYWJsZSkge1xuICAgIGlmICh0eXBlb2YgaW5wdXRTaW5ndWxhciA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaW5wdXRTaW5ndWxhcikpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlTG9jYWxlKGlucHV0U2luZ3VsYXIuY29kZSwgW2lucHV0U2luZ3VsYXIuY29kZV0sIGlucHV0U2luZ3VsYXIpO1xuICAgIH1cbiAgICByZXR1cm4gcXVlcnlMb2NhbGUoaW5wdXRTaW5ndWxhciwgYXZhaWxhYmxlKTtcbn1cbmZ1bmN0aW9uIHF1ZXJ5TG9jYWxlKGNvZGVBcmcsIGF2YWlsYWJsZSkge1xuICAgIHZhciBjb2RlcyA9IFtdLmNvbmNhdChjb2RlQXJnIHx8IFtdKTsgLy8gd2lsbCBjb252ZXJ0IHRvIGFycmF5XG4gICAgdmFyIHJhdyA9IHF1ZXJ5UmF3TG9jYWxlKGNvZGVzLCBhdmFpbGFibGUpIHx8IFJBV19FTl9MT0NBTEU7XG4gICAgcmV0dXJuIHBhcnNlTG9jYWxlKGNvZGVBcmcsIGNvZGVzLCByYXcpO1xufVxuZnVuY3Rpb24gcXVlcnlSYXdMb2NhbGUoY29kZXMsIGF2YWlsYWJsZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIHBhcnRzID0gY29kZXNbaV0udG9Mb2NhbGVMb3dlckNhc2UoKS5zcGxpdCgnLScpO1xuICAgICAgICBmb3IgKHZhciBqID0gcGFydHMubGVuZ3RoOyBqID4gMDsgaiAtPSAxKSB7XG4gICAgICAgICAgICB2YXIgc2ltcGxlSWQgPSBwYXJ0cy5zbGljZSgwLCBqKS5qb2luKCctJyk7XG4gICAgICAgICAgICBpZiAoYXZhaWxhYmxlW3NpbXBsZUlkXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhdmFpbGFibGVbc2ltcGxlSWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gcGFyc2VMb2NhbGUoY29kZUFyZywgY29kZXMsIHJhdykge1xuICAgIHZhciBtZXJnZWQgPSBtZXJnZVByb3BzKFtNSU5JTUFMX1JBV19FTl9MT0NBTEUsIHJhd10sIFsnYnV0dG9uVGV4dCddKTtcbiAgICBkZWxldGUgbWVyZ2VkLmNvZGU7IC8vIGRvbid0IHdhbnQgdGhpcyBwYXJ0IG9mIHRoZSBvcHRpb25zXG4gICAgdmFyIHdlZWsgPSBtZXJnZWQud2VlaztcbiAgICBkZWxldGUgbWVyZ2VkLndlZWs7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29kZUFyZzogY29kZUFyZyxcbiAgICAgICAgY29kZXM6IGNvZGVzLFxuICAgICAgICB3ZWVrOiB3ZWVrLFxuICAgICAgICBzaW1wbGVOdW1iZXJGb3JtYXQ6IG5ldyBJbnRsLk51bWJlckZvcm1hdChjb2RlQXJnKSxcbiAgICAgICAgb3B0aW9uczogbWVyZ2VkLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZUlucHV0LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICB2YXIgZGF0ZUVudiA9IGJ1aWxkRGF0ZUVudiQxKG9wdGlvbnMpO1xuICAgIHZhciBmb3JtYXR0ZXIgPSBjcmVhdGVGb3JtYXR0ZXIob3B0aW9ucyk7XG4gICAgdmFyIGRhdGVNZXRhID0gZGF0ZUVudi5jcmVhdGVNYXJrZXJNZXRhKGRhdGVJbnB1dCk7XG4gICAgaWYgKCFkYXRlTWV0YSkgeyAvLyBUT0RPOiB3YXJuaW5nP1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBkYXRlRW52LmZvcm1hdChkYXRlTWV0YS5tYXJrZXIsIGZvcm1hdHRlciwge1xuICAgICAgICBmb3JjZWRUem86IGRhdGVNZXRhLmZvcmNlZFR6byxcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGZvcm1hdFJhbmdlKHN0YXJ0SW5wdXQsIGVuZElucHV0LCBvcHRpb25zKSB7XG4gICAgdmFyIGRhdGVFbnYgPSBidWlsZERhdGVFbnYkMSh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyA/IG9wdGlvbnMgOiB7fSk7IC8vIHBhc3MgaW4gaWYgbm9uLW51bGwgb2JqZWN0XG4gICAgdmFyIGZvcm1hdHRlciA9IGNyZWF0ZUZvcm1hdHRlcihvcHRpb25zKTtcbiAgICB2YXIgc3RhcnRNZXRhID0gZGF0ZUVudi5jcmVhdGVNYXJrZXJNZXRhKHN0YXJ0SW5wdXQpO1xuICAgIHZhciBlbmRNZXRhID0gZGF0ZUVudi5jcmVhdGVNYXJrZXJNZXRhKGVuZElucHV0KTtcbiAgICBpZiAoIXN0YXJ0TWV0YSB8fCAhZW5kTWV0YSkgeyAvLyBUT0RPOiB3YXJuaW5nP1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBkYXRlRW52LmZvcm1hdFJhbmdlKHN0YXJ0TWV0YS5tYXJrZXIsIGVuZE1ldGEubWFya2VyLCBmb3JtYXR0ZXIsIHtcbiAgICAgICAgZm9yY2VkU3RhcnRUem86IHN0YXJ0TWV0YS5mb3JjZWRUem8sXG4gICAgICAgIGZvcmNlZEVuZFR6bzogZW5kTWV0YS5mb3JjZWRUem8sXG4gICAgICAgIGlzRW5kRXhjbHVzaXZlOiBvcHRpb25zLmlzRW5kRXhjbHVzaXZlLFxuICAgICAgICBkZWZhdWx0U2VwYXJhdG9yOiBCQVNFX09QVElPTl9ERUZBVUxUUy5kZWZhdWx0UmFuZ2VTZXBhcmF0b3IsXG4gICAgfSk7XG59XG4vLyBUT0RPOiBtb3JlIERSWSBhbmQgb3B0aW1pemVkXG5mdW5jdGlvbiBidWlsZERhdGVFbnYkMShzZXR0aW5ncykge1xuICAgIHZhciBsb2NhbGUgPSBidWlsZExvY2FsZShzZXR0aW5ncy5sb2NhbGUgfHwgJ2VuJywgb3JnYW5pemVSYXdMb2NhbGVzKFtdKS5tYXApOyAvLyBUT0RPOiBkb24ndCBoYXJkY29kZSAnZW4nIGV2ZXJ5d2hlcmVcbiAgICByZXR1cm4gbmV3IERhdGVFbnYodHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oeyB0aW1lWm9uZTogQkFTRV9PUFRJT05fREVGQVVMVFMudGltZVpvbmUsIGNhbGVuZGFyU3lzdGVtOiAnZ3JlZ29yeScgfSwgc2V0dGluZ3MpLCB7IGxvY2FsZTogbG9jYWxlIH0pKTtcbn1cblxudmFyIERFRl9ERUZBVUxUUyA9IHtcbiAgICBzdGFydFRpbWU6ICcwOTowMCcsXG4gICAgZW5kVGltZTogJzE3OjAwJyxcbiAgICBkYXlzT2ZXZWVrOiBbMSwgMiwgMywgNCwgNV0sXG4gICAgZGlzcGxheTogJ2ludmVyc2UtYmFja2dyb3VuZCcsXG4gICAgY2xhc3NOYW1lczogJ2ZjLW5vbi1idXNpbmVzcycsXG4gICAgZ3JvdXBJZDogJ19idXNpbmVzc0hvdXJzJywgLy8gc28gbXVsdGlwbGUgZGVmcyBnZXQgZ3JvdXBlZFxufTtcbi8qXG5UT0RPOiBwYXNzIGFyb3VuZCBhcyBFdmVudERlZkhhc2ghISFcbiovXG5mdW5jdGlvbiBwYXJzZUJ1c2luZXNzSG91cnMoaW5wdXQsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gcGFyc2VFdmVudHMocmVmaW5lSW5wdXRzKGlucHV0KSwgbnVsbCwgY29udGV4dCk7XG59XG5mdW5jdGlvbiByZWZpbmVJbnB1dHMoaW5wdXQpIHtcbiAgICB2YXIgcmF3RGVmcztcbiAgICBpZiAoaW5wdXQgPT09IHRydWUpIHtcbiAgICAgICAgcmF3RGVmcyA9IFt7fV07IC8vIHdpbGwgZ2V0IERFRl9ERUZBVUxUUyB2ZXJiYXRpbVxuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICAvLyBpZiBzcGVjaWZ5aW5nIGFuIGFycmF5LCBldmVyeSBzdWItZGVmaW5pdGlvbiBORUVEUyBhIGRheS1vZi13ZWVrXG4gICAgICAgIHJhd0RlZnMgPSBpbnB1dC5maWx0ZXIoZnVuY3Rpb24gKHJhd0RlZikgeyByZXR1cm4gcmF3RGVmLmRheXNPZldlZWs7IH0pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIGlucHV0KSB7IC8vIG5vbi1udWxsIG9iamVjdFxuICAgICAgICByYXdEZWZzID0gW2lucHV0XTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIGlzIHByb2JhYmx5IGZhbHNlXG4gICAgICAgIHJhd0RlZnMgPSBbXTtcbiAgICB9XG4gICAgcmF3RGVmcyA9IHJhd0RlZnMubWFwKGZ1bmN0aW9uIChyYXdEZWYpIHsgcmV0dXJuICh0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgREVGX0RFRkFVTFRTKSwgcmF3RGVmKSk7IH0pO1xuICAgIHJldHVybiByYXdEZWZzO1xufVxuXG5mdW5jdGlvbiBwb2ludEluc2lkZVJlY3QocG9pbnQsIHJlY3QpIHtcbiAgICByZXR1cm4gcG9pbnQubGVmdCA+PSByZWN0LmxlZnQgJiZcbiAgICAgICAgcG9pbnQubGVmdCA8IHJlY3QucmlnaHQgJiZcbiAgICAgICAgcG9pbnQudG9wID49IHJlY3QudG9wICYmXG4gICAgICAgIHBvaW50LnRvcCA8IHJlY3QuYm90dG9tO1xufVxuLy8gUmV0dXJucyBhIG5ldyByZWN0YW5nbGUgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gcmVjdGFuZ2xlcy4gSWYgdGhleSBkb24ndCBpbnRlcnNlY3QsIHJldHVybnMgZmFsc2VcbmZ1bmN0aW9uIGludGVyc2VjdFJlY3RzKHJlY3QxLCByZWN0Mikge1xuICAgIHZhciByZXMgPSB7XG4gICAgICAgIGxlZnQ6IE1hdGgubWF4KHJlY3QxLmxlZnQsIHJlY3QyLmxlZnQpLFxuICAgICAgICByaWdodDogTWF0aC5taW4ocmVjdDEucmlnaHQsIHJlY3QyLnJpZ2h0KSxcbiAgICAgICAgdG9wOiBNYXRoLm1heChyZWN0MS50b3AsIHJlY3QyLnRvcCksXG4gICAgICAgIGJvdHRvbTogTWF0aC5taW4ocmVjdDEuYm90dG9tLCByZWN0Mi5ib3R0b20pLFxuICAgIH07XG4gICAgaWYgKHJlcy5sZWZ0IDwgcmVzLnJpZ2h0ICYmIHJlcy50b3AgPCByZXMuYm90dG9tKSB7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHRyYW5zbGF0ZVJlY3QocmVjdCwgZGVsdGFYLCBkZWx0YVkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiByZWN0LmxlZnQgKyBkZWx0YVgsXG4gICAgICAgIHJpZ2h0OiByZWN0LnJpZ2h0ICsgZGVsdGFYLFxuICAgICAgICB0b3A6IHJlY3QudG9wICsgZGVsdGFZLFxuICAgICAgICBib3R0b206IHJlY3QuYm90dG9tICsgZGVsdGFZLFxuICAgIH07XG59XG4vLyBSZXR1cm5zIGEgbmV3IHBvaW50IHRoYXQgd2lsbCBoYXZlIGJlZW4gbW92ZWQgdG8gcmVzaWRlIHdpdGhpbiB0aGUgZ2l2ZW4gcmVjdGFuZ2xlXG5mdW5jdGlvbiBjb25zdHJhaW5Qb2ludChwb2ludCwgcmVjdCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6IE1hdGgubWluKE1hdGgubWF4KHBvaW50LmxlZnQsIHJlY3QubGVmdCksIHJlY3QucmlnaHQpLFxuICAgICAgICB0b3A6IE1hdGgubWluKE1hdGgubWF4KHBvaW50LnRvcCwgcmVjdC50b3ApLCByZWN0LmJvdHRvbSksXG4gICAgfTtcbn1cbi8vIFJldHVybnMgYSBwb2ludCB0aGF0IGlzIHRoZSBjZW50ZXIgb2YgdGhlIGdpdmVuIHJlY3RhbmdsZVxuZnVuY3Rpb24gZ2V0UmVjdENlbnRlcihyZWN0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMixcbiAgICAgICAgdG9wOiAocmVjdC50b3AgKyByZWN0LmJvdHRvbSkgLyAyLFxuICAgIH07XG59XG4vLyBTdWJ0cmFjdHMgcG9pbnQyJ3MgY29vcmRpbmF0ZXMgZnJvbSBwb2ludDEncyBjb29yZGluYXRlcywgcmV0dXJuaW5nIGEgZGVsdGFcbmZ1bmN0aW9uIGRpZmZQb2ludHMocG9pbnQxLCBwb2ludDIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiBwb2ludDEubGVmdCAtIHBvaW50Mi5sZWZ0LFxuICAgICAgICB0b3A6IHBvaW50MS50b3AgLSBwb2ludDIudG9wLFxuICAgIH07XG59XG5cbnZhciBjYW5WR3Jvd1dpdGhpbkNlbGw7XG5mdW5jdGlvbiBnZXRDYW5WR3Jvd1dpdGhpbkNlbGwoKSB7XG4gICAgaWYgKGNhblZHcm93V2l0aGluQ2VsbCA9PSBudWxsKSB7XG4gICAgICAgIGNhblZHcm93V2l0aGluQ2VsbCA9IGNvbXB1dGVDYW5WR3Jvd1dpdGhpbkNlbGwoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhblZHcm93V2l0aGluQ2VsbDtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVDYW5WR3Jvd1dpdGhpbkNlbGwoKSB7XG4gICAgLy8gZm9yIFNTUiwgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGwgaW1tZWRpYXRlbHkgYXQgdG9wLWxldmVsXG4gICAgLy8gVE9ETzoganVzdCBtYWtlIHRoaXMgbG9naWMgZXhlY3V0ZSB0b3AtbGV2ZWwsIGltbWVkaWF0ZWx5LCBpbnN0ZWFkIG9mIGRvaW5nIGxhemlseVxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgZWwuc3R5bGUudG9wID0gJzBweCc7XG4gICAgZWwuc3R5bGUubGVmdCA9ICcwcHgnO1xuICAgIGVsLmlubmVySFRNTCA9ICc8dGFibGU+PHRyPjx0ZD48ZGl2PjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPic7XG4gICAgZWwucXVlcnlTZWxlY3RvcigndGFibGUnKS5zdHlsZS5oZWlnaHQgPSAnMTAwcHgnO1xuICAgIGVsLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsKTtcbiAgICB2YXIgZGl2ID0gZWwucXVlcnlTZWxlY3RvcignZGl2Jyk7XG4gICAgdmFyIHBvc3NpYmxlID0gZGl2Lm9mZnNldEhlaWdodCA+IDA7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbCk7XG4gICAgcmV0dXJuIHBvc3NpYmxlO1xufVxuXG52YXIgRU1QVFlfRVZFTlRfU1RPUkUgPSBjcmVhdGVFbXB0eUV2ZW50U3RvcmUoKTsgLy8gZm9yIHB1cmVjb21wb25lbnRzLiBUT0RPOiBrZWVwIGVsc2V3aGVyZVxudmFyIFNwbGl0dGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNwbGl0dGVyKCkge1xuICAgICAgICB0aGlzLmdldEtleXNGb3JFdmVudERlZnMgPSBtZW1vaXplKHRoaXMuX2dldEtleXNGb3JFdmVudERlZnMpO1xuICAgICAgICB0aGlzLnNwbGl0RGF0ZVNlbGVjdGlvbiA9IG1lbW9pemUodGhpcy5fc3BsaXREYXRlU3Bhbik7XG4gICAgICAgIHRoaXMuc3BsaXRFdmVudFN0b3JlID0gbWVtb2l6ZSh0aGlzLl9zcGxpdEV2ZW50U3RvcmUpO1xuICAgICAgICB0aGlzLnNwbGl0SW5kaXZpZHVhbFVpID0gbWVtb2l6ZSh0aGlzLl9zcGxpdEluZGl2aWR1YWxVaSk7XG4gICAgICAgIHRoaXMuc3BsaXRFdmVudERyYWcgPSBtZW1vaXplKHRoaXMuX3NwbGl0SW50ZXJhY3Rpb24pO1xuICAgICAgICB0aGlzLnNwbGl0RXZlbnRSZXNpemUgPSBtZW1vaXplKHRoaXMuX3NwbGl0SW50ZXJhY3Rpb24pO1xuICAgICAgICB0aGlzLmV2ZW50VWlCdWlsZGVycyA9IHt9OyAvLyBUT0RPOiB0eXBlc2NyaXB0IHByb3RlY3Rpb25cbiAgICB9XG4gICAgU3BsaXR0ZXIucHJvdG90eXBlLnNwbGl0UHJvcHMgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGtleUluZm9zID0gdGhpcy5nZXRLZXlJbmZvKHByb3BzKTtcbiAgICAgICAgdmFyIGRlZktleXMgPSB0aGlzLmdldEtleXNGb3JFdmVudERlZnMocHJvcHMuZXZlbnRTdG9yZSk7XG4gICAgICAgIHZhciBkYXRlU2VsZWN0aW9ucyA9IHRoaXMuc3BsaXREYXRlU2VsZWN0aW9uKHByb3BzLmRhdGVTZWxlY3Rpb24pO1xuICAgICAgICB2YXIgaW5kaXZpZHVhbFVpID0gdGhpcy5zcGxpdEluZGl2aWR1YWxVaShwcm9wcy5ldmVudFVpQmFzZXMsIGRlZktleXMpOyAvLyB0aGUgaW5kaXZpZHVhbCAqYmFzZXMqXG4gICAgICAgIHZhciBldmVudFN0b3JlcyA9IHRoaXMuc3BsaXRFdmVudFN0b3JlKHByb3BzLmV2ZW50U3RvcmUsIGRlZktleXMpO1xuICAgICAgICB2YXIgZXZlbnREcmFncyA9IHRoaXMuc3BsaXRFdmVudERyYWcocHJvcHMuZXZlbnREcmFnKTtcbiAgICAgICAgdmFyIGV2ZW50UmVzaXplcyA9IHRoaXMuc3BsaXRFdmVudFJlc2l6ZShwcm9wcy5ldmVudFJlc2l6ZSk7XG4gICAgICAgIHZhciBzcGxpdFByb3BzID0ge307XG4gICAgICAgIHRoaXMuZXZlbnRVaUJ1aWxkZXJzID0gbWFwSGFzaChrZXlJbmZvcywgZnVuY3Rpb24gKGluZm8sIGtleSkgeyByZXR1cm4gX3RoaXMuZXZlbnRVaUJ1aWxkZXJzW2tleV0gfHwgbWVtb2l6ZShidWlsZEV2ZW50VWlGb3JLZXkpOyB9KTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGtleUluZm9zKSB7XG4gICAgICAgICAgICB2YXIga2V5SW5mbyA9IGtleUluZm9zW2tleV07XG4gICAgICAgICAgICB2YXIgZXZlbnRTdG9yZSA9IGV2ZW50U3RvcmVzW2tleV0gfHwgRU1QVFlfRVZFTlRfU1RPUkU7XG4gICAgICAgICAgICB2YXIgYnVpbGRFdmVudFVpID0gdGhpcy5ldmVudFVpQnVpbGRlcnNba2V5XTtcbiAgICAgICAgICAgIHNwbGl0UHJvcHNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICBidXNpbmVzc0hvdXJzOiBrZXlJbmZvLmJ1c2luZXNzSG91cnMgfHwgcHJvcHMuYnVzaW5lc3NIb3VycyxcbiAgICAgICAgICAgICAgICBkYXRlU2VsZWN0aW9uOiBkYXRlU2VsZWN0aW9uc1trZXldIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogZXZlbnRTdG9yZSxcbiAgICAgICAgICAgICAgICBldmVudFVpQmFzZXM6IGJ1aWxkRXZlbnRVaShwcm9wcy5ldmVudFVpQmFzZXNbJyddLCBrZXlJbmZvLnVpLCBpbmRpdmlkdWFsVWlba2V5XSksXG4gICAgICAgICAgICAgICAgZXZlbnRTZWxlY3Rpb246IGV2ZW50U3RvcmUuaW5zdGFuY2VzW3Byb3BzLmV2ZW50U2VsZWN0aW9uXSA/IHByb3BzLmV2ZW50U2VsZWN0aW9uIDogJycsXG4gICAgICAgICAgICAgICAgZXZlbnREcmFnOiBldmVudERyYWdzW2tleV0gfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBldmVudFJlc2l6ZTogZXZlbnRSZXNpemVzW2tleV0gfHwgbnVsbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNwbGl0UHJvcHM7XG4gICAgfTtcbiAgICBTcGxpdHRlci5wcm90b3R5cGUuX3NwbGl0RGF0ZVNwYW4gPSBmdW5jdGlvbiAoZGF0ZVNwYW4pIHtcbiAgICAgICAgdmFyIGRhdGVTcGFucyA9IHt9O1xuICAgICAgICBpZiAoZGF0ZVNwYW4pIHtcbiAgICAgICAgICAgIHZhciBrZXlzID0gdGhpcy5nZXRLZXlzRm9yRGF0ZVNwYW4oZGF0ZVNwYW4pO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBrZXlzXzEgPSBrZXlzOyBfaSA8IGtleXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0ga2V5c18xW19pXTtcbiAgICAgICAgICAgICAgICBkYXRlU3BhbnNba2V5XSA9IGRhdGVTcGFuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlU3BhbnM7XG4gICAgfTtcbiAgICBTcGxpdHRlci5wcm90b3R5cGUuX2dldEtleXNGb3JFdmVudERlZnMgPSBmdW5jdGlvbiAoZXZlbnRTdG9yZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbWFwSGFzaChldmVudFN0b3JlLmRlZnMsIGZ1bmN0aW9uIChldmVudERlZikgeyByZXR1cm4gX3RoaXMuZ2V0S2V5c0ZvckV2ZW50RGVmKGV2ZW50RGVmKTsgfSk7XG4gICAgfTtcbiAgICBTcGxpdHRlci5wcm90b3R5cGUuX3NwbGl0RXZlbnRTdG9yZSA9IGZ1bmN0aW9uIChldmVudFN0b3JlLCBkZWZLZXlzKSB7XG4gICAgICAgIHZhciBkZWZzID0gZXZlbnRTdG9yZS5kZWZzLCBpbnN0YW5jZXMgPSBldmVudFN0b3JlLmluc3RhbmNlcztcbiAgICAgICAgdmFyIHNwbGl0U3RvcmVzID0ge307XG4gICAgICAgIGZvciAodmFyIGRlZklkIGluIGRlZnMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBkZWZLZXlzW2RlZklkXTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gX2FbX2ldO1xuICAgICAgICAgICAgICAgIGlmICghc3BsaXRTdG9yZXNba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBzcGxpdFN0b3Jlc1trZXldID0gY3JlYXRlRW1wdHlFdmVudFN0b3JlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNwbGl0U3RvcmVzW2tleV0uZGVmc1tkZWZJZF0gPSBkZWZzW2RlZklkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpbnN0YW5jZUlkIGluIGluc3RhbmNlcykge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSAwLCBfYyA9IGRlZktleXNbaW5zdGFuY2UuZGVmSWRdOyBfYiA8IF9jLmxlbmd0aDsgX2IrKykge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBfY1tfYl07XG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0U3RvcmVzW2tleV0pIHsgLy8gbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBjcmVhdGVkXG4gICAgICAgICAgICAgICAgICAgIHNwbGl0U3RvcmVzW2tleV0uaW5zdGFuY2VzW2luc3RhbmNlSWRdID0gaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcGxpdFN0b3JlcztcbiAgICB9O1xuICAgIFNwbGl0dGVyLnByb3RvdHlwZS5fc3BsaXRJbmRpdmlkdWFsVWkgPSBmdW5jdGlvbiAoZXZlbnRVaUJhc2VzLCBkZWZLZXlzKSB7XG4gICAgICAgIHZhciBzcGxpdEhhc2hlcyA9IHt9O1xuICAgICAgICBmb3IgKHZhciBkZWZJZCBpbiBldmVudFVpQmFzZXMpIHtcbiAgICAgICAgICAgIGlmIChkZWZJZCkgeyAvLyBub3QgdGhlICcnIGtleVxuICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBkZWZLZXlzW2RlZklkXTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IF9hW19pXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzcGxpdEhhc2hlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGxpdEhhc2hlc1trZXldID0ge307XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3BsaXRIYXNoZXNba2V5XVtkZWZJZF0gPSBldmVudFVpQmFzZXNbZGVmSWRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3BsaXRIYXNoZXM7XG4gICAgfTtcbiAgICBTcGxpdHRlci5wcm90b3R5cGUuX3NwbGl0SW50ZXJhY3Rpb24gPSBmdW5jdGlvbiAoaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgdmFyIHNwbGl0U3RhdGVzID0ge307XG4gICAgICAgIGlmIChpbnRlcmFjdGlvbikge1xuICAgICAgICAgICAgdmFyIGFmZmVjdGVkU3RvcmVzXzEgPSB0aGlzLl9zcGxpdEV2ZW50U3RvcmUoaW50ZXJhY3Rpb24uYWZmZWN0ZWRFdmVudHMsIHRoaXMuX2dldEtleXNGb3JFdmVudERlZnMoaW50ZXJhY3Rpb24uYWZmZWN0ZWRFdmVudHMpKTtcbiAgICAgICAgICAgIC8vIGNhbid0IHJlbHkgb24gZGVmS2V5cyBiZWNhdXNlIGV2ZW50IGRhdGEgaXMgbXV0YXRlZFxuICAgICAgICAgICAgdmFyIG11dGF0ZWRLZXlzQnlEZWZJZCA9IHRoaXMuX2dldEtleXNGb3JFdmVudERlZnMoaW50ZXJhY3Rpb24ubXV0YXRlZEV2ZW50cyk7XG4gICAgICAgICAgICB2YXIgbXV0YXRlZFN0b3Jlc18xID0gdGhpcy5fc3BsaXRFdmVudFN0b3JlKGludGVyYWN0aW9uLm11dGF0ZWRFdmVudHMsIG11dGF0ZWRLZXlzQnlEZWZJZCk7XG4gICAgICAgICAgICB2YXIgcG9wdWxhdGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzcGxpdFN0YXRlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHNwbGl0U3RhdGVzW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZmZlY3RlZEV2ZW50czogYWZmZWN0ZWRTdG9yZXNfMVtrZXldIHx8IEVNUFRZX0VWRU5UX1NUT1JFLFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlZEV2ZW50czogbXV0YXRlZFN0b3Jlc18xW2tleV0gfHwgRU1QVFlfRVZFTlRfU1RPUkUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0V2ZW50OiBpbnRlcmFjdGlvbi5pc0V2ZW50LFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYWZmZWN0ZWRTdG9yZXNfMSkge1xuICAgICAgICAgICAgICAgIHBvcHVsYXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gbXV0YXRlZFN0b3Jlc18xKSB7XG4gICAgICAgICAgICAgICAgcG9wdWxhdGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3BsaXRTdGF0ZXM7XG4gICAgfTtcbiAgICByZXR1cm4gU3BsaXR0ZXI7XG59KCkpO1xuZnVuY3Rpb24gYnVpbGRFdmVudFVpRm9yS2V5KGFsbFVpLCBldmVudFVpRm9yS2V5LCBpbmRpdmlkdWFsVWkpIHtcbiAgICB2YXIgYmFzZVBhcnRzID0gW107XG4gICAgaWYgKGFsbFVpKSB7XG4gICAgICAgIGJhc2VQYXJ0cy5wdXNoKGFsbFVpKTtcbiAgICB9XG4gICAgaWYgKGV2ZW50VWlGb3JLZXkpIHtcbiAgICAgICAgYmFzZVBhcnRzLnB1c2goZXZlbnRVaUZvcktleSk7XG4gICAgfVxuICAgIHZhciBzdHVmZiA9IHtcbiAgICAgICAgJyc6IGNvbWJpbmVFdmVudFVpcyhiYXNlUGFydHMpLFxuICAgIH07XG4gICAgaWYgKGluZGl2aWR1YWxVaSkge1xuICAgICAgICB0c2xpYi5fX2Fzc2lnbihzdHVmZiwgaW5kaXZpZHVhbFVpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0dWZmO1xufVxuXG5mdW5jdGlvbiBnZXREYXRlTWV0YShkYXRlLCB0b2RheVJhbmdlLCBub3dEYXRlLCBkYXRlUHJvZmlsZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGRvdzogZGF0ZS5nZXRVVENEYXkoKSxcbiAgICAgICAgaXNEaXNhYmxlZDogQm9vbGVhbihkYXRlUHJvZmlsZSAmJiAhcmFuZ2VDb250YWluc01hcmtlcihkYXRlUHJvZmlsZS5hY3RpdmVSYW5nZSwgZGF0ZSkpLFxuICAgICAgICBpc090aGVyOiBCb29sZWFuKGRhdGVQcm9maWxlICYmICFyYW5nZUNvbnRhaW5zTWFya2VyKGRhdGVQcm9maWxlLmN1cnJlbnRSYW5nZSwgZGF0ZSkpLFxuICAgICAgICBpc1RvZGF5OiBCb29sZWFuKHRvZGF5UmFuZ2UgJiYgcmFuZ2VDb250YWluc01hcmtlcih0b2RheVJhbmdlLCBkYXRlKSksXG4gICAgICAgIGlzUGFzdDogQm9vbGVhbihub3dEYXRlID8gKGRhdGUgPCBub3dEYXRlKSA6IHRvZGF5UmFuZ2UgPyAoZGF0ZSA8IHRvZGF5UmFuZ2Uuc3RhcnQpIDogZmFsc2UpLFxuICAgICAgICBpc0Z1dHVyZTogQm9vbGVhbihub3dEYXRlID8gKGRhdGUgPiBub3dEYXRlKSA6IHRvZGF5UmFuZ2UgPyAoZGF0ZSA+PSB0b2RheVJhbmdlLmVuZCkgOiBmYWxzZSksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldERheUNsYXNzTmFtZXMobWV0YSwgdGhlbWUpIHtcbiAgICB2YXIgY2xhc3NOYW1lcyA9IFtcbiAgICAgICAgJ2ZjLWRheScsXG4gICAgICAgIFwiZmMtZGF5LVwiICsgREFZX0lEU1ttZXRhLmRvd10sXG4gICAgXTtcbiAgICBpZiAobWV0YS5pc0Rpc2FibGVkKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZGF5LWRpc2FibGVkJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAobWV0YS5pc1RvZGF5KSB7XG4gICAgICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLWRheS10b2RheScpO1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKHRoZW1lLmdldENsYXNzKCd0b2RheScpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YS5pc1Bhc3QpIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZGF5LXBhc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YS5pc0Z1dHVyZSkge1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1kYXktZnV0dXJlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGEuaXNPdGhlcikge1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1kYXktb3RoZXInKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xhc3NOYW1lcztcbn1cbmZ1bmN0aW9uIGdldFNsb3RDbGFzc05hbWVzKG1ldGEsIHRoZW1lKSB7XG4gICAgdmFyIGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICdmYy1zbG90JyxcbiAgICAgICAgXCJmYy1zbG90LVwiICsgREFZX0lEU1ttZXRhLmRvd10sXG4gICAgXTtcbiAgICBpZiAobWV0YS5pc0Rpc2FibGVkKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtc2xvdC1kaXNhYmxlZCcpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKG1ldGEuaXNUb2RheSkge1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1zbG90LXRvZGF5Jyk7XG4gICAgICAgICAgICBjbGFzc05hbWVzLnB1c2godGhlbWUuZ2V0Q2xhc3MoJ3RvZGF5JykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhLmlzUGFzdCkge1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1zbG90LXBhc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YS5pc0Z1dHVyZSkge1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1zbG90LWZ1dHVyZScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWVzO1xufVxuXG52YXIgREFZX0ZPUk1BVCA9IGNyZWF0ZUZvcm1hdHRlcih7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdsb25nJywgZGF5OiAnbnVtZXJpYycgfSk7XG52YXIgV0VFS19GT1JNQVQgPSBjcmVhdGVGb3JtYXR0ZXIoeyB3ZWVrOiAnbG9uZycgfSk7XG5mdW5jdGlvbiBidWlsZE5hdkxpbmtBdHRycyhjb250ZXh0LCBkYXRlTWFya2VyLCB2aWV3VHlwZSwgaXNUYWJiYWJsZSkge1xuICAgIGlmICh2aWV3VHlwZSA9PT0gdm9pZCAwKSB7IHZpZXdUeXBlID0gJ2RheSc7IH1cbiAgICBpZiAoaXNUYWJiYWJsZSA9PT0gdm9pZCAwKSB7IGlzVGFiYmFibGUgPSB0cnVlOyB9XG4gICAgdmFyIGRhdGVFbnYgPSBjb250ZXh0LmRhdGVFbnYsIG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnMsIGNhbGVuZGFyQXBpID0gY29udGV4dC5jYWxlbmRhckFwaTtcbiAgICB2YXIgZGF0ZVN0ciA9IGRhdGVFbnYuZm9ybWF0KGRhdGVNYXJrZXIsIHZpZXdUeXBlID09PSAnd2VlaycgPyBXRUVLX0ZPUk1BVCA6IERBWV9GT1JNQVQpO1xuICAgIGlmIChvcHRpb25zLm5hdkxpbmtzKSB7XG4gICAgICAgIHZhciB6b25lZERhdGUgPSBkYXRlRW52LnRvRGF0ZShkYXRlTWFya2VyKTtcbiAgICAgICAgdmFyIGhhbmRsZUludGVyYWN0aW9uID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgY3VzdG9tQWN0aW9uID0gdmlld1R5cGUgPT09ICdkYXknID8gb3B0aW9ucy5uYXZMaW5rRGF5Q2xpY2sgOlxuICAgICAgICAgICAgICAgIHZpZXdUeXBlID09PSAnd2VlaycgPyBvcHRpb25zLm5hdkxpbmtXZWVrQ2xpY2sgOiBudWxsO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXN0b21BY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb24uY2FsbChjYWxlbmRhckFwaSwgZGF0ZUVudi50b0RhdGUoZGF0ZU1hcmtlciksIGV2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VzdG9tQWN0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB2aWV3VHlwZSA9IGN1c3RvbUFjdGlvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsZW5kYXJBcGkuem9vbVRvKGRhdGVNYXJrZXIsIHZpZXdUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRzbGliLl9fYXNzaWduKHsgdGl0bGU6IGZvcm1hdFdpdGhPcmRpbmFscyhvcHRpb25zLm5hdkxpbmtIaW50LCBbZGF0ZVN0ciwgem9uZWREYXRlXSwgZGF0ZVN0ciksICdkYXRhLW5hdmxpbmsnOiAnJyB9LCAoaXNUYWJiYWJsZVxuICAgICAgICAgICAgPyBjcmVhdGVBcmlhQ2xpY2tBdHRycyhoYW5kbGVJbnRlcmFjdGlvbilcbiAgICAgICAgICAgIDogeyBvbkNsaWNrOiBoYW5kbGVJbnRlcmFjdGlvbiB9KSk7XG4gICAgfVxuICAgIHJldHVybiB7ICdhcmlhLWxhYmVsJzogZGF0ZVN0ciB9O1xufVxuXG52YXIgX2lzUnRsU2Nyb2xsYmFyT25MZWZ0ID0gbnVsbDtcbmZ1bmN0aW9uIGdldElzUnRsU2Nyb2xsYmFyT25MZWZ0KCkge1xuICAgIGlmIChfaXNSdGxTY3JvbGxiYXJPbkxlZnQgPT09IG51bGwpIHtcbiAgICAgICAgX2lzUnRsU2Nyb2xsYmFyT25MZWZ0ID0gY29tcHV0ZUlzUnRsU2Nyb2xsYmFyT25MZWZ0KCk7XG4gICAgfVxuICAgIHJldHVybiBfaXNSdGxTY3JvbGxiYXJPbkxlZnQ7XG59XG5mdW5jdGlvbiBjb21wdXRlSXNSdGxTY3JvbGxiYXJPbkxlZnQoKSB7XG4gICAgdmFyIG91dGVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBhcHBseVN0eWxlKG91dGVyRWwsIHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHRvcDogLTEwMDAsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIGJvcmRlcjogMCxcbiAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgb3ZlcmZsb3c6ICdzY3JvbGwnLFxuICAgICAgICBkaXJlY3Rpb246ICdydGwnLFxuICAgIH0pO1xuICAgIG91dGVyRWwuaW5uZXJIVE1MID0gJzxkaXY+PC9kaXY+JztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG91dGVyRWwpO1xuICAgIHZhciBpbm5lckVsID0gb3V0ZXJFbC5maXJzdENoaWxkO1xuICAgIHZhciByZXMgPSBpbm5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgPiBvdXRlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgcmVtb3ZlRWxlbWVudChvdXRlckVsKTtcbiAgICByZXR1cm4gcmVzO1xufVxuXG52YXIgX3Njcm9sbGJhcldpZHRocztcbmZ1bmN0aW9uIGdldFNjcm9sbGJhcldpZHRocygpIHtcbiAgICBpZiAoIV9zY3JvbGxiYXJXaWR0aHMpIHtcbiAgICAgICAgX3Njcm9sbGJhcldpZHRocyA9IGNvbXB1dGVTY3JvbGxiYXJXaWR0aHMoKTtcbiAgICB9XG4gICAgcmV0dXJuIF9zY3JvbGxiYXJXaWR0aHM7XG59XG5mdW5jdGlvbiBjb21wdXRlU2Nyb2xsYmFyV2lkdGhzKCkge1xuICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsLnN0eWxlLm92ZXJmbG93ID0gJ3Njcm9sbCc7XG4gICAgZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGVsLnN0eWxlLnRvcCA9ICctOTk5OXB4JztcbiAgICBlbC5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIHZhciByZXMgPSBjb21wdXRlU2Nyb2xsYmFyV2lkdGhzRm9yRWwoZWwpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIHJldHVybiByZXM7XG59XG4vLyBXQVJOSU5HOiB3aWxsIGluY2x1ZGUgYm9yZGVyXG5mdW5jdGlvbiBjb21wdXRlU2Nyb2xsYmFyV2lkdGhzRm9yRWwoZWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBlbC5vZmZzZXRIZWlnaHQgLSBlbC5jbGllbnRIZWlnaHQsXG4gICAgICAgIHk6IGVsLm9mZnNldFdpZHRoIC0gZWwuY2xpZW50V2lkdGgsXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUVkZ2VzKGVsLCBnZXRQYWRkaW5nKSB7XG4gICAgaWYgKGdldFBhZGRpbmcgPT09IHZvaWQgMCkgeyBnZXRQYWRkaW5nID0gZmFsc2U7IH1cbiAgICB2YXIgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTtcbiAgICB2YXIgYm9yZGVyTGVmdCA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoLCAxMCkgfHwgMDtcbiAgICB2YXIgYm9yZGVyUmlnaHQgPSBwYXJzZUludChjb21wdXRlZFN0eWxlLmJvcmRlclJpZ2h0V2lkdGgsIDEwKSB8fCAwO1xuICAgIHZhciBib3JkZXJUb3AgPSBwYXJzZUludChjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoLCAxMCkgfHwgMDtcbiAgICB2YXIgYm9yZGVyQm90dG9tID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5ib3JkZXJCb3R0b21XaWR0aCwgMTApIHx8IDA7XG4gICAgdmFyIGJhZFNjcm9sbGJhcldpZHRocyA9IGNvbXB1dGVTY3JvbGxiYXJXaWR0aHNGb3JFbChlbCk7IC8vIGluY2x1ZGVzIGJvcmRlciFcbiAgICB2YXIgc2Nyb2xsYmFyTGVmdFJpZ2h0ID0gYmFkU2Nyb2xsYmFyV2lkdGhzLnkgLSBib3JkZXJMZWZ0IC0gYm9yZGVyUmlnaHQ7XG4gICAgdmFyIHNjcm9sbGJhckJvdHRvbSA9IGJhZFNjcm9sbGJhcldpZHRocy54IC0gYm9yZGVyVG9wIC0gYm9yZGVyQm90dG9tO1xuICAgIHZhciByZXMgPSB7XG4gICAgICAgIGJvcmRlckxlZnQ6IGJvcmRlckxlZnQsXG4gICAgICAgIGJvcmRlclJpZ2h0OiBib3JkZXJSaWdodCxcbiAgICAgICAgYm9yZGVyVG9wOiBib3JkZXJUb3AsXG4gICAgICAgIGJvcmRlckJvdHRvbTogYm9yZGVyQm90dG9tLFxuICAgICAgICBzY3JvbGxiYXJCb3R0b206IHNjcm9sbGJhckJvdHRvbSxcbiAgICAgICAgc2Nyb2xsYmFyTGVmdDogMCxcbiAgICAgICAgc2Nyb2xsYmFyUmlnaHQ6IDAsXG4gICAgfTtcbiAgICBpZiAoZ2V0SXNSdGxTY3JvbGxiYXJPbkxlZnQoKSAmJiBjb21wdXRlZFN0eWxlLmRpcmVjdGlvbiA9PT0gJ3J0bCcpIHsgLy8gaXMgdGhlIHNjcm9sbGJhciBvbiB0aGUgbGVmdCBzaWRlP1xuICAgICAgICByZXMuc2Nyb2xsYmFyTGVmdCA9IHNjcm9sbGJhckxlZnRSaWdodDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlcy5zY3JvbGxiYXJSaWdodCA9IHNjcm9sbGJhckxlZnRSaWdodDtcbiAgICB9XG4gICAgaWYgKGdldFBhZGRpbmcpIHtcbiAgICAgICAgcmVzLnBhZGRpbmdMZWZ0ID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nTGVmdCwgMTApIHx8IDA7XG4gICAgICAgIHJlcy5wYWRkaW5nUmlnaHQgPSBwYXJzZUludChjb21wdXRlZFN0eWxlLnBhZGRpbmdSaWdodCwgMTApIHx8IDA7XG4gICAgICAgIHJlcy5wYWRkaW5nVG9wID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nVG9wLCAxMCkgfHwgMDtcbiAgICAgICAgcmVzLnBhZGRpbmdCb3R0b20gPSBwYXJzZUludChjb21wdXRlZFN0eWxlLnBhZGRpbmdCb3R0b20sIDEwKSB8fCAwO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gY29tcHV0ZUlubmVyUmVjdChlbCwgZ29XaXRoaW5QYWRkaW5nLCBkb0Zyb21XaW5kb3dWaWV3cG9ydCkge1xuICAgIGlmIChnb1dpdGhpblBhZGRpbmcgPT09IHZvaWQgMCkgeyBnb1dpdGhpblBhZGRpbmcgPSBmYWxzZTsgfVxuICAgIHZhciBvdXRlclJlY3QgPSBkb0Zyb21XaW5kb3dWaWV3cG9ydCA/IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogY29tcHV0ZVJlY3QoZWwpO1xuICAgIHZhciBlZGdlcyA9IGNvbXB1dGVFZGdlcyhlbCwgZ29XaXRoaW5QYWRkaW5nKTtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgICBsZWZ0OiBvdXRlclJlY3QubGVmdCArIGVkZ2VzLmJvcmRlckxlZnQgKyBlZGdlcy5zY3JvbGxiYXJMZWZ0LFxuICAgICAgICByaWdodDogb3V0ZXJSZWN0LnJpZ2h0IC0gZWRnZXMuYm9yZGVyUmlnaHQgLSBlZGdlcy5zY3JvbGxiYXJSaWdodCxcbiAgICAgICAgdG9wOiBvdXRlclJlY3QudG9wICsgZWRnZXMuYm9yZGVyVG9wLFxuICAgICAgICBib3R0b206IG91dGVyUmVjdC5ib3R0b20gLSBlZGdlcy5ib3JkZXJCb3R0b20gLSBlZGdlcy5zY3JvbGxiYXJCb3R0b20sXG4gICAgfTtcbiAgICBpZiAoZ29XaXRoaW5QYWRkaW5nKSB7XG4gICAgICAgIHJlcy5sZWZ0ICs9IGVkZ2VzLnBhZGRpbmdMZWZ0O1xuICAgICAgICByZXMucmlnaHQgLT0gZWRnZXMucGFkZGluZ1JpZ2h0O1xuICAgICAgICByZXMudG9wICs9IGVkZ2VzLnBhZGRpbmdUb3A7XG4gICAgICAgIHJlcy5ib3R0b20gLT0gZWRnZXMucGFkZGluZ0JvdHRvbTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGNvbXB1dGVSZWN0KGVsKSB7XG4gICAgdmFyIHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiByZWN0LmxlZnQgKyB3aW5kb3cucGFnZVhPZmZzZXQsXG4gICAgICAgIHRvcDogcmVjdC50b3AgKyB3aW5kb3cucGFnZVlPZmZzZXQsXG4gICAgICAgIHJpZ2h0OiByZWN0LnJpZ2h0ICsgd2luZG93LnBhZ2VYT2Zmc2V0LFxuICAgICAgICBib3R0b206IHJlY3QuYm90dG9tICsgd2luZG93LnBhZ2VZT2Zmc2V0LFxuICAgIH07XG59XG5mdW5jdGlvbiBjb21wdXRlQ2xpcHBlZENsaWVudFJlY3QoZWwpIHtcbiAgICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsKTtcbiAgICB2YXIgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGZvciAodmFyIF9pID0gMCwgY2xpcHBpbmdQYXJlbnRzXzEgPSBjbGlwcGluZ1BhcmVudHM7IF9pIDwgY2xpcHBpbmdQYXJlbnRzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBjbGlwcGluZ1BhcmVudCA9IGNsaXBwaW5nUGFyZW50c18xW19pXTtcbiAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IGludGVyc2VjdFJlY3RzKHJlY3QsIGNsaXBwaW5nUGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICAgICAgaWYgKGludGVyc2VjdGlvbikge1xuICAgICAgICAgICAgcmVjdCA9IGludGVyc2VjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZWN0O1xufVxuZnVuY3Rpb24gY29tcHV0ZUhlaWdodEFuZE1hcmdpbnMoZWwpIHtcbiAgICByZXR1cm4gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICsgY29tcHV0ZVZNYXJnaW5zKGVsKTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVWTWFyZ2lucyhlbCkge1xuICAgIHZhciBjb21wdXRlZCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTtcbiAgICByZXR1cm4gcGFyc2VJbnQoY29tcHV0ZWQubWFyZ2luVG9wLCAxMCkgK1xuICAgICAgICBwYXJzZUludChjb21wdXRlZC5tYXJnaW5Cb3R0b20sIDEwKTtcbn1cbi8vIGRvZXMgbm90IHJldHVybiB3aW5kb3dcbmZ1bmN0aW9uIGdldENsaXBwaW5nUGFyZW50cyhlbCkge1xuICAgIHZhciBwYXJlbnRzID0gW107XG4gICAgd2hpbGUgKGVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHsgLy8gd2lsbCBzdG9wIHdoZW4gZ2V0cyB0byBkb2N1bWVudCBvciBudWxsXG4gICAgICAgIHZhciBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpO1xuICAgICAgICBpZiAoY29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCgvKGF1dG98c2Nyb2xsKS8pLnRlc3QoY29tcHV0ZWRTdHlsZS5vdmVyZmxvdyArIGNvbXB1dGVkU3R5bGUub3ZlcmZsb3dZICsgY29tcHV0ZWRTdHlsZS5vdmVyZmxvd1gpKSB7XG4gICAgICAgICAgICBwYXJlbnRzLnB1c2goZWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsID0gZWwucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmVudHM7XG59XG5cbi8vIGdpdmVuIGEgZnVuY3Rpb24gdGhhdCByZXNvbHZlcyBhIHJlc3VsdCBhc3luY2hyb25vdXNseS5cbi8vIHRoZSBmdW5jdGlvbiBjYW4gZWl0aGVyIGNhbGwgcGFzc2VkLWluIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgY2FsbGJhY2tzLFxuLy8gb3IgaXQgY2FuIHJldHVybiBhIHByb21pc2UuXG4vLyBpZiB5b3UgbmVlZCB0byBwYXNzIGFkZGl0aW9uYWwgcGFyYW1zIHRvIGZ1bmMsIGJpbmQgdGhlbSBmaXJzdC5cbmZ1bmN0aW9uIHVucHJvbWlzaWZ5KGZ1bmMsIHN1Y2Nlc3MsIGZhaWx1cmUpIHtcbiAgICAvLyBndWFyZCBhZ2FpbnN0IHN1Y2Nlc3MvZmFpbHVyZSBjYWxsYmFja3MgYmVpbmcgY2FsbGVkIG1vcmUgdGhhbiBvbmNlXG4gICAgLy8gYW5kIGd1YXJkIGFnYWluc3QgYSBwcm9taXNlIEFORCBjYWxsYmFjayBiZWluZyB1c2VkIHRvZ2V0aGVyLlxuICAgIHZhciBpc1Jlc29sdmVkID0gZmFsc2U7XG4gICAgdmFyIHdyYXBwZWRTdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWlzUmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIGlzUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgc3VjY2Vzcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICAgICAgICB9XG4gICAgfTtcbiAgICB2YXIgd3JhcHBlZEZhaWx1cmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghaXNSZXNvbHZlZCkge1xuICAgICAgICAgICAgaXNSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZmFpbHVyZSkge1xuICAgICAgICAgICAgICAgIGZhaWx1cmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgdmFyIHJlcyA9IGZ1bmMod3JhcHBlZFN1Y2Nlc3MsIHdyYXBwZWRGYWlsdXJlKTtcbiAgICBpZiAocmVzICYmIHR5cGVvZiByZXMudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXMudGhlbih3cmFwcGVkU3VjY2Vzcywgd3JhcHBlZEZhaWx1cmUpO1xuICAgIH1cbn1cblxudmFyIEVtaXR0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRW1pdHRlcigpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgICAgICB0aGlzLnRoaXNDb250ZXh0ID0gbnVsbDtcbiAgICB9XG4gICAgRW1pdHRlci5wcm90b3R5cGUuc2V0VGhpc0NvbnRleHQgPSBmdW5jdGlvbiAodGhpc0NvbnRleHQpIHtcbiAgICAgICAgdGhpcy50aGlzQ29udGV4dCA9IHRoaXNDb250ZXh0O1xuICAgIH07XG4gICAgRW1pdHRlci5wcm90b3R5cGUuc2V0T3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfTtcbiAgICBFbWl0dGVyLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uICh0eXBlLCBoYW5kbGVyKSB7XG4gICAgICAgIGFkZFRvSGFzaCh0aGlzLmhhbmRsZXJzLCB0eXBlLCBoYW5kbGVyKTtcbiAgICB9O1xuICAgIEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uICh0eXBlLCBoYW5kbGVyKSB7XG4gICAgICAgIHJlbW92ZUZyb21IYXNoKHRoaXMuaGFuZGxlcnMsIHR5cGUsIGhhbmRsZXIpO1xuICAgIH07XG4gICAgRW1pdHRlci5wcm90b3R5cGUudHJpZ2dlciA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhdHRhY2hlZEhhbmRsZXJzID0gdGhpcy5oYW5kbGVyc1t0eXBlXSB8fCBbXTtcbiAgICAgICAgdmFyIG9wdGlvbkhhbmRsZXIgPSB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zW3R5cGVdO1xuICAgICAgICB2YXIgaGFuZGxlcnMgPSBbXS5jb25jYXQob3B0aW9uSGFuZGxlciB8fCBbXSwgYXR0YWNoZWRIYW5kbGVycyk7XG4gICAgICAgIGZvciAodmFyIF9hID0gMCwgaGFuZGxlcnNfMSA9IGhhbmRsZXJzOyBfYSA8IGhhbmRsZXJzXzEubGVuZ3RoOyBfYSsrKSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJzXzFbX2FdO1xuICAgICAgICAgICAgaGFuZGxlci5hcHBseSh0aGlzLnRoaXNDb250ZXh0LCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRW1pdHRlci5wcm90b3R5cGUuaGFzSGFuZGxlcnMgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbigodGhpcy5oYW5kbGVyc1t0eXBlXSAmJiB0aGlzLmhhbmRsZXJzW3R5cGVdLmxlbmd0aCkgfHxcbiAgICAgICAgICAgICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zW3R5cGVdKSk7XG4gICAgfTtcbiAgICByZXR1cm4gRW1pdHRlcjtcbn0oKSk7XG5mdW5jdGlvbiBhZGRUb0hhc2goaGFzaCwgdHlwZSwgaGFuZGxlcikge1xuICAgIChoYXNoW3R5cGVdIHx8IChoYXNoW3R5cGVdID0gW10pKVxuICAgICAgICAucHVzaChoYW5kbGVyKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUZyb21IYXNoKGhhc2gsIHR5cGUsIGhhbmRsZXIpIHtcbiAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICBpZiAoaGFzaFt0eXBlXSkge1xuICAgICAgICAgICAgaGFzaFt0eXBlXSA9IGhhc2hbdHlwZV0uZmlsdGVyKGZ1bmN0aW9uIChmdW5jKSB7IHJldHVybiBmdW5jICE9PSBoYW5kbGVyOyB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGhhc2hbdHlwZV07IC8vIHJlbW92ZSBhbGwgaGFuZGxlciBmdW5jcyBmb3IgdGhpcyB0eXBlXG4gICAgfVxufVxuXG4vKlxuUmVjb3JkcyBvZmZzZXQgaW5mb3JtYXRpb24gZm9yIGEgc2V0IG9mIGVsZW1lbnRzLCByZWxhdGl2ZSB0byBhbiBvcmlnaW4gZWxlbWVudC5cbkNhbiByZWNvcmQgdGhlIGxlZnQvcmlnaHQgT1IgdGhlIHRvcC9ib3R0b20gT1IgYm90aC5cblByb3ZpZGVzIG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIHRoZSBjYWNoZSBieSBwb3NpdGlvbi5cbiovXG52YXIgUG9zaXRpb25DYWNoZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQb3NpdGlvbkNhY2hlKG9yaWdpbkVsLCBlbHMsIGlzSG9yaXpvbnRhbCwgaXNWZXJ0aWNhbCkge1xuICAgICAgICB0aGlzLmVscyA9IGVscztcbiAgICAgICAgdmFyIG9yaWdpbkNsaWVudFJlY3QgPSB0aGlzLm9yaWdpbkNsaWVudFJlY3QgPSBvcmlnaW5FbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgLy8gcmVsYXRpdmUgdG8gdmlld3BvcnQgdG9wLWxlZnRcbiAgICAgICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgdGhpcy5idWlsZEVsSG9yaXpvbnRhbHMob3JpZ2luQ2xpZW50UmVjdC5sZWZ0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNWZXJ0aWNhbCkge1xuICAgICAgICAgICAgdGhpcy5idWlsZEVsVmVydGljYWxzKG9yaWdpbkNsaWVudFJlY3QudG9wKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBQb3B1bGF0ZXMgdGhlIGxlZnQvcmlnaHQgaW50ZXJuYWwgY29vcmRpbmF0ZSBhcnJheXNcbiAgICBQb3NpdGlvbkNhY2hlLnByb3RvdHlwZS5idWlsZEVsSG9yaXpvbnRhbHMgPSBmdW5jdGlvbiAob3JpZ2luQ2xpZW50TGVmdCkge1xuICAgICAgICB2YXIgbGVmdHMgPSBbXTtcbiAgICAgICAgdmFyIHJpZ2h0cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gdGhpcy5lbHM7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgZWwgPSBfYVtfaV07XG4gICAgICAgICAgICB2YXIgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgbGVmdHMucHVzaChyZWN0LmxlZnQgLSBvcmlnaW5DbGllbnRMZWZ0KTtcbiAgICAgICAgICAgIHJpZ2h0cy5wdXNoKHJlY3QucmlnaHQgLSBvcmlnaW5DbGllbnRMZWZ0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxlZnRzID0gbGVmdHM7XG4gICAgICAgIHRoaXMucmlnaHRzID0gcmlnaHRzO1xuICAgIH07XG4gICAgLy8gUG9wdWxhdGVzIHRoZSB0b3AvYm90dG9tIGludGVybmFsIGNvb3JkaW5hdGUgYXJyYXlzXG4gICAgUG9zaXRpb25DYWNoZS5wcm90b3R5cGUuYnVpbGRFbFZlcnRpY2FscyA9IGZ1bmN0aW9uIChvcmlnaW5DbGllbnRUb3ApIHtcbiAgICAgICAgdmFyIHRvcHMgPSBbXTtcbiAgICAgICAgdmFyIGJvdHRvbXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRoaXMuZWxzOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIGVsID0gX2FbX2ldO1xuICAgICAgICAgICAgdmFyIHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHRvcHMucHVzaChyZWN0LnRvcCAtIG9yaWdpbkNsaWVudFRvcCk7XG4gICAgICAgICAgICBib3R0b21zLnB1c2gocmVjdC5ib3R0b20gLSBvcmlnaW5DbGllbnRUb3ApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9wcyA9IHRvcHM7XG4gICAgICAgIHRoaXMuYm90dG9tcyA9IGJvdHRvbXM7XG4gICAgfTtcbiAgICAvLyBHaXZlbiBhIGxlZnQgb2Zmc2V0IChmcm9tIGRvY3VtZW50IGxlZnQpLCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZWwgdGhhdCBpdCBob3Jpem9udGFsbHkgaW50ZXJzZWN0cy5cbiAgICAvLyBJZiBubyBpbnRlcnNlY3Rpb24gaXMgbWFkZSwgcmV0dXJucyB1bmRlZmluZWQuXG4gICAgUG9zaXRpb25DYWNoZS5wcm90b3R5cGUubGVmdFRvSW5kZXggPSBmdW5jdGlvbiAobGVmdFBvc2l0aW9uKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIGxlZnRzID0gX2EubGVmdHMsIHJpZ2h0cyA9IF9hLnJpZ2h0cztcbiAgICAgICAgdmFyIGxlbiA9IGxlZnRzLmxlbmd0aDtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKGxlZnRQb3NpdGlvbiA+PSBsZWZ0c1tpXSAmJiBsZWZ0UG9zaXRpb24gPCByaWdodHNbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBUT0RPOiBiZXR0ZXJcbiAgICB9O1xuICAgIC8vIEdpdmVuIGEgdG9wIG9mZnNldCAoZnJvbSBkb2N1bWVudCB0b3ApLCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZWwgdGhhdCBpdCB2ZXJ0aWNhbGx5IGludGVyc2VjdHMuXG4gICAgLy8gSWYgbm8gaW50ZXJzZWN0aW9uIGlzIG1hZGUsIHJldHVybnMgdW5kZWZpbmVkLlxuICAgIFBvc2l0aW9uQ2FjaGUucHJvdG90eXBlLnRvcFRvSW5kZXggPSBmdW5jdGlvbiAodG9wUG9zaXRpb24pIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgdG9wcyA9IF9hLnRvcHMsIGJvdHRvbXMgPSBfYS5ib3R0b21zO1xuICAgICAgICB2YXIgbGVuID0gdG9wcy5sZW5ndGg7XG4gICAgICAgIHZhciBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGlmICh0b3BQb3NpdGlvbiA+PSB0b3BzW2ldICYmIHRvcFBvc2l0aW9uIDwgYm90dG9tc1tpXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIFRPRE86IGJldHRlclxuICAgIH07XG4gICAgLy8gR2V0cyB0aGUgd2lkdGggb2YgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4XG4gICAgUG9zaXRpb25DYWNoZS5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAobGVmdEluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJpZ2h0c1tsZWZ0SW5kZXhdIC0gdGhpcy5sZWZ0c1tsZWZ0SW5kZXhdO1xuICAgIH07XG4gICAgLy8gR2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleFxuICAgIFBvc2l0aW9uQ2FjaGUucHJvdG90eXBlLmdldEhlaWdodCA9IGZ1bmN0aW9uICh0b3BJbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ib3R0b21zW3RvcEluZGV4XSAtIHRoaXMudG9wc1t0b3BJbmRleF07XG4gICAgfTtcbiAgICByZXR1cm4gUG9zaXRpb25DYWNoZTtcbn0oKSk7XG5cbi8qIGVzbGludCBtYXgtY2xhc3Nlcy1wZXItZmlsZTogXCJvZmZcIiAqL1xuLypcbkFuIG9iamVjdCBmb3IgZ2V0dGluZy9zZXR0aW5nIHNjcm9sbC1yZWxhdGVkIGluZm9ybWF0aW9uIGZvciBhbiBlbGVtZW50LlxuSW50ZXJuYWxseSwgdGhpcyBpcyBkb25lIHZlcnkgZGlmZmVyZW50bHkgZm9yIHdpbmRvdyB2ZXJzdXMgRE9NIGVsZW1lbnQsXG5zbyB0aGlzIG9iamVjdCBzZXJ2ZXMgYXMgYSBjb21tb24gaW50ZXJmYWNlLlxuKi9cbnZhciBTY3JvbGxDb250cm9sbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNjcm9sbENvbnRyb2xsZXIoKSB7XG4gICAgfVxuICAgIFNjcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLmdldE1heFNjcm9sbFRvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2Nyb2xsSGVpZ2h0KCkgLSB0aGlzLmdldENsaWVudEhlaWdodCgpO1xuICAgIH07XG4gICAgU2Nyb2xsQ29udHJvbGxlci5wcm90b3R5cGUuZ2V0TWF4U2Nyb2xsTGVmdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2Nyb2xsV2lkdGgoKSAtIHRoaXMuZ2V0Q2xpZW50V2lkdGgoKTtcbiAgICB9O1xuICAgIFNjcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLmNhblNjcm9sbFZlcnRpY2FsbHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE1heFNjcm9sbFRvcCgpID4gMDtcbiAgICB9O1xuICAgIFNjcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLmNhblNjcm9sbEhvcml6b250YWxseSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWF4U2Nyb2xsTGVmdCgpID4gMDtcbiAgICB9O1xuICAgIFNjcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLmNhblNjcm9sbFVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTY3JvbGxUb3AoKSA+IDA7XG4gICAgfTtcbiAgICBTY3JvbGxDb250cm9sbGVyLnByb3RvdHlwZS5jYW5TY3JvbGxEb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTY3JvbGxUb3AoKSA8IHRoaXMuZ2V0TWF4U2Nyb2xsVG9wKCk7XG4gICAgfTtcbiAgICBTY3JvbGxDb250cm9sbGVyLnByb3RvdHlwZS5jYW5TY3JvbGxMZWZ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTY3JvbGxMZWZ0KCkgPiAwO1xuICAgIH07XG4gICAgU2Nyb2xsQ29udHJvbGxlci5wcm90b3R5cGUuY2FuU2Nyb2xsUmlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNjcm9sbExlZnQoKSA8IHRoaXMuZ2V0TWF4U2Nyb2xsTGVmdCgpO1xuICAgIH07XG4gICAgcmV0dXJuIFNjcm9sbENvbnRyb2xsZXI7XG59KCkpO1xudmFyIEVsZW1lbnRTY3JvbGxDb250cm9sbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhFbGVtZW50U2Nyb2xsQ29udHJvbGxlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBFbGVtZW50U2Nyb2xsQ29udHJvbGxlcihlbCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5lbCA9IGVsO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEVsZW1lbnRTY3JvbGxDb250cm9sbGVyLnByb3RvdHlwZS5nZXRTY3JvbGxUb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsLnNjcm9sbFRvcDtcbiAgICB9O1xuICAgIEVsZW1lbnRTY3JvbGxDb250cm9sbGVyLnByb3RvdHlwZS5nZXRTY3JvbGxMZWZ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbC5zY3JvbGxMZWZ0O1xuICAgIH07XG4gICAgRWxlbWVudFNjcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLnNldFNjcm9sbFRvcCA9IGZ1bmN0aW9uICh0b3ApIHtcbiAgICAgICAgdGhpcy5lbC5zY3JvbGxUb3AgPSB0b3A7XG4gICAgfTtcbiAgICBFbGVtZW50U2Nyb2xsQ29udHJvbGxlci5wcm90b3R5cGUuc2V0U2Nyb2xsTGVmdCA9IGZ1bmN0aW9uIChsZWZ0KSB7XG4gICAgICAgIHRoaXMuZWwuc2Nyb2xsTGVmdCA9IGxlZnQ7XG4gICAgfTtcbiAgICBFbGVtZW50U2Nyb2xsQ29udHJvbGxlci5wcm90b3R5cGUuZ2V0U2Nyb2xsV2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsLnNjcm9sbFdpZHRoO1xuICAgIH07XG4gICAgRWxlbWVudFNjcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLmdldFNjcm9sbEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWwuc2Nyb2xsSGVpZ2h0O1xuICAgIH07XG4gICAgRWxlbWVudFNjcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLmdldENsaWVudEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWwuY2xpZW50SGVpZ2h0O1xuICAgIH07XG4gICAgRWxlbWVudFNjcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLmdldENsaWVudFdpZHRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbC5jbGllbnRXaWR0aDtcbiAgICB9O1xuICAgIHJldHVybiBFbGVtZW50U2Nyb2xsQ29udHJvbGxlcjtcbn0oU2Nyb2xsQ29udHJvbGxlcikpO1xudmFyIFdpbmRvd1Njcm9sbENvbnRyb2xsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFdpbmRvd1Njcm9sbENvbnRyb2xsZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gV2luZG93U2Nyb2xsQ29udHJvbGxlcigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBXaW5kb3dTY3JvbGxDb250cm9sbGVyLnByb3RvdHlwZS5nZXRTY3JvbGxUb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gICAgfTtcbiAgICBXaW5kb3dTY3JvbGxDb250cm9sbGVyLnByb3RvdHlwZS5nZXRTY3JvbGxMZWZ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gd2luZG93LnBhZ2VYT2Zmc2V0O1xuICAgIH07XG4gICAgV2luZG93U2Nyb2xsQ29udHJvbGxlci5wcm90b3R5cGUuc2V0U2Nyb2xsVG9wID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgd2luZG93LnNjcm9sbCh3aW5kb3cucGFnZVhPZmZzZXQsIG4pO1xuICAgIH07XG4gICAgV2luZG93U2Nyb2xsQ29udHJvbGxlci5wcm90b3R5cGUuc2V0U2Nyb2xsTGVmdCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGwobiwgd2luZG93LnBhZ2VZT2Zmc2V0KTtcbiAgICB9O1xuICAgIFdpbmRvd1Njcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLmdldFNjcm9sbFdpZHRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoO1xuICAgIH07XG4gICAgV2luZG93U2Nyb2xsQ29udHJvbGxlci5wcm90b3R5cGUuZ2V0U2Nyb2xsSGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICB9O1xuICAgIFdpbmRvd1Njcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLmdldENsaWVudEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgfTtcbiAgICBXaW5kb3dTY3JvbGxDb250cm9sbGVyLnByb3RvdHlwZS5nZXRDbGllbnRXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICB9O1xuICAgIHJldHVybiBXaW5kb3dTY3JvbGxDb250cm9sbGVyO1xufShTY3JvbGxDb250cm9sbGVyKSk7XG5cbnZhciBUaGVtZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUaGVtZShjYWxlbmRhck9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuaWNvbk92ZXJyaWRlT3B0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNldEljb25PdmVycmlkZShjYWxlbmRhck9wdGlvbnNbdGhpcy5pY29uT3ZlcnJpZGVPcHRpb25dKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUaGVtZS5wcm90b3R5cGUuc2V0SWNvbk92ZXJyaWRlID0gZnVuY3Rpb24gKGljb25PdmVycmlkZUhhc2gpIHtcbiAgICAgICAgdmFyIGljb25DbGFzc2VzQ29weTtcbiAgICAgICAgdmFyIGJ1dHRvbk5hbWU7XG4gICAgICAgIGlmICh0eXBlb2YgaWNvbk92ZXJyaWRlSGFzaCA9PT0gJ29iamVjdCcgJiYgaWNvbk92ZXJyaWRlSGFzaCkgeyAvLyBub24tbnVsbCBvYmplY3RcbiAgICAgICAgICAgIGljb25DbGFzc2VzQ29weSA9IHRzbGliLl9fYXNzaWduKHt9LCB0aGlzLmljb25DbGFzc2VzKTtcbiAgICAgICAgICAgIGZvciAoYnV0dG9uTmFtZSBpbiBpY29uT3ZlcnJpZGVIYXNoKSB7XG4gICAgICAgICAgICAgICAgaWNvbkNsYXNzZXNDb3B5W2J1dHRvbk5hbWVdID0gdGhpcy5hcHBseUljb25PdmVycmlkZVByZWZpeChpY29uT3ZlcnJpZGVIYXNoW2J1dHRvbk5hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaWNvbkNsYXNzZXMgPSBpY29uQ2xhc3Nlc0NvcHk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaWNvbk92ZXJyaWRlSGFzaCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuaWNvbkNsYXNzZXMgPSB7fTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVGhlbWUucHJvdG90eXBlLmFwcGx5SWNvbk92ZXJyaWRlUHJlZml4ID0gZnVuY3Rpb24gKGNsYXNzTmFtZSkge1xuICAgICAgICB2YXIgcHJlZml4ID0gdGhpcy5pY29uT3ZlcnJpZGVQcmVmaXg7XG4gICAgICAgIGlmIChwcmVmaXggJiYgY2xhc3NOYW1lLmluZGV4T2YocHJlZml4KSAhPT0gMCkgeyAvLyBpZiBub3QgYWxyZWFkeSBwcmVzZW50XG4gICAgICAgICAgICBjbGFzc05hbWUgPSBwcmVmaXggKyBjbGFzc05hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTtcbiAgICB9O1xuICAgIFRoZW1lLnByb3RvdHlwZS5nZXRDbGFzcyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3Nlc1trZXldIHx8ICcnO1xuICAgIH07XG4gICAgVGhlbWUucHJvdG90eXBlLmdldEljb25DbGFzcyA9IGZ1bmN0aW9uIChidXR0b25OYW1lLCBpc1J0bCkge1xuICAgICAgICB2YXIgY2xhc3NOYW1lO1xuICAgICAgICBpZiAoaXNSdGwgJiYgdGhpcy5ydGxJY29uQ2xhc3Nlcykge1xuICAgICAgICAgICAgY2xhc3NOYW1lID0gdGhpcy5ydGxJY29uQ2xhc3Nlc1tidXR0b25OYW1lXSB8fCB0aGlzLmljb25DbGFzc2VzW2J1dHRvbk5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2xhc3NOYW1lID0gdGhpcy5pY29uQ2xhc3Nlc1tidXR0b25OYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlSWNvbkNsYXNzICsgXCIgXCIgKyBjbGFzc05hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH07XG4gICAgVGhlbWUucHJvdG90eXBlLmdldEN1c3RvbUJ1dHRvbkljb25DbGFzcyA9IGZ1bmN0aW9uIChjdXN0b21CdXR0b25Qcm9wcykge1xuICAgICAgICB2YXIgY2xhc3NOYW1lO1xuICAgICAgICBpZiAodGhpcy5pY29uT3ZlcnJpZGVDdXN0b21CdXR0b25PcHRpb24pIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZSA9IGN1c3RvbUJ1dHRvblByb3BzW3RoaXMuaWNvbk92ZXJyaWRlQ3VzdG9tQnV0dG9uT3B0aW9uXTtcbiAgICAgICAgICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlSWNvbkNsYXNzICsgXCIgXCIgKyB0aGlzLmFwcGx5SWNvbk92ZXJyaWRlUHJlZml4KGNsYXNzTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH07XG4gICAgcmV0dXJuIFRoZW1lO1xufSgpKTtcblRoZW1lLnByb3RvdHlwZS5jbGFzc2VzID0ge307XG5UaGVtZS5wcm90b3R5cGUuaWNvbkNsYXNzZXMgPSB7fTtcblRoZW1lLnByb3RvdHlwZS5iYXNlSWNvbkNsYXNzID0gJyc7XG5UaGVtZS5wcm90b3R5cGUuaWNvbk92ZXJyaWRlUHJlZml4ID0gJyc7XG5cbnZhciBTY3JvbGxSZXNwb25kZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2Nyb2xsUmVzcG9uZGVyKGV4ZWNGdW5jLCBlbWl0dGVyLCBzY3JvbGxUaW1lLCBzY3JvbGxUaW1lUmVzZXQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5leGVjRnVuYyA9IGV4ZWNGdW5jO1xuICAgICAgICB0aGlzLmVtaXR0ZXIgPSBlbWl0dGVyO1xuICAgICAgICB0aGlzLnNjcm9sbFRpbWUgPSBzY3JvbGxUaW1lO1xuICAgICAgICB0aGlzLnNjcm9sbFRpbWVSZXNldCA9IHNjcm9sbFRpbWVSZXNldDtcbiAgICAgICAgdGhpcy5oYW5kbGVTY3JvbGxSZXF1ZXN0ID0gZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgICAgICAgIF90aGlzLnF1ZXVlZFJlcXVlc3QgPSB0c2xpYi5fX2Fzc2lnbih7fSwgX3RoaXMucXVldWVkUmVxdWVzdCB8fCB7fSwgcmVxdWVzdCk7XG4gICAgICAgICAgICBfdGhpcy5kcmFpbigpO1xuICAgICAgICB9O1xuICAgICAgICBlbWl0dGVyLm9uKCdfc2Nyb2xsUmVxdWVzdCcsIHRoaXMuaGFuZGxlU2Nyb2xsUmVxdWVzdCk7XG4gICAgICAgIHRoaXMuZmlyZUluaXRpYWxTY3JvbGwoKTtcbiAgICB9XG4gICAgU2Nyb2xsUmVzcG9uZGVyLnByb3RvdHlwZS5kZXRhY2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlci5vZmYoJ19zY3JvbGxSZXF1ZXN0JywgdGhpcy5oYW5kbGVTY3JvbGxSZXF1ZXN0KTtcbiAgICB9O1xuICAgIFNjcm9sbFJlc3BvbmRlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKGlzRGF0ZXNOZXcpIHtcbiAgICAgICAgaWYgKGlzRGF0ZXNOZXcgJiYgdGhpcy5zY3JvbGxUaW1lUmVzZXQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZUluaXRpYWxTY3JvbGwoKTsgLy8gd2lsbCBkcmFpblxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kcmFpbigpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTY3JvbGxSZXNwb25kZXIucHJvdG90eXBlLmZpcmVJbml0aWFsU2Nyb2xsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbFJlcXVlc3Qoe1xuICAgICAgICAgICAgdGltZTogdGhpcy5zY3JvbGxUaW1lLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFNjcm9sbFJlc3BvbmRlci5wcm90b3R5cGUuZHJhaW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlZFJlcXVlc3QgJiYgdGhpcy5leGVjRnVuYyh0aGlzLnF1ZXVlZFJlcXVlc3QpKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlZFJlcXVlc3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gU2Nyb2xsUmVzcG9uZGVyO1xufSgpKTtcblxudmFyIFZpZXdDb250ZXh0VHlwZSA9IHZkb21fY2pzLmNyZWF0ZUNvbnRleHQoe30pOyAvLyBmb3IgQ29tcG9uZW50c1xuZnVuY3Rpb24gYnVpbGRWaWV3Q29udGV4dCh2aWV3U3BlYywgdmlld0FwaSwgdmlld09wdGlvbnMsIGRhdGVQcm9maWxlR2VuZXJhdG9yLCBkYXRlRW52LCB0aGVtZSwgcGx1Z2luSG9va3MsIGRpc3BhdGNoLCBnZXRDdXJyZW50RGF0YSwgZW1pdHRlciwgY2FsZW5kYXJBcGksIHJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQsIHVucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGRhdGVFbnY6IGRhdGVFbnYsXG4gICAgICAgIG9wdGlvbnM6IHZpZXdPcHRpb25zLFxuICAgICAgICBwbHVnaW5Ib29rczogcGx1Z2luSG9va3MsXG4gICAgICAgIGVtaXR0ZXI6IGVtaXR0ZXIsXG4gICAgICAgIGRpc3BhdGNoOiBkaXNwYXRjaCxcbiAgICAgICAgZ2V0Q3VycmVudERhdGE6IGdldEN1cnJlbnREYXRhLFxuICAgICAgICBjYWxlbmRhckFwaTogY2FsZW5kYXJBcGksXG4gICAgICAgIHZpZXdTcGVjOiB2aWV3U3BlYyxcbiAgICAgICAgdmlld0FwaTogdmlld0FwaSxcbiAgICAgICAgZGF0ZVByb2ZpbGVHZW5lcmF0b3I6IGRhdGVQcm9maWxlR2VuZXJhdG9yLFxuICAgICAgICB0aGVtZTogdGhlbWUsXG4gICAgICAgIGlzUnRsOiB2aWV3T3B0aW9ucy5kaXJlY3Rpb24gPT09ICdydGwnLFxuICAgICAgICBhZGRSZXNpemVIYW5kbGVyOiBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgICAgICAgZW1pdHRlci5vbignX3Jlc2l6ZScsIGhhbmRsZXIpO1xuICAgICAgICB9LFxuICAgICAgICByZW1vdmVSZXNpemVIYW5kbGVyOiBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgICAgICAgZW1pdHRlci5vZmYoJ19yZXNpemUnLCBoYW5kbGVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgY3JlYXRlU2Nyb2xsUmVzcG9uZGVyOiBmdW5jdGlvbiAoZXhlY0Z1bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2Nyb2xsUmVzcG9uZGVyKGV4ZWNGdW5jLCBlbWl0dGVyLCBjcmVhdGVEdXJhdGlvbih2aWV3T3B0aW9ucy5zY3JvbGxUaW1lKSwgdmlld09wdGlvbnMuc2Nyb2xsVGltZVJlc2V0KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudDogcmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCxcbiAgICAgICAgdW5yZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50OiB1bnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQsXG4gICAgfTtcbn1cblxuLyogZXNsaW50IG1heC1jbGFzc2VzLXBlci1maWxlOiBvZmYgKi9cbnZhciBQdXJlQ29tcG9uZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhQdXJlQ29tcG9uZW50LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFB1cmVDb21wb25lbnQoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUHVyZUNvbXBvbmVudC5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24gKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgY29uc29sZS5sb2coZ2V0VW5lcXVhbFByb3BzKG5leHRQcm9wcywgdGhpcy5wcm9wcyksIGdldFVuZXF1YWxQcm9wcyhuZXh0U3RhdGUsIHRoaXMuc3RhdGUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWNvbXBhcmVPYmpzKHRoaXMucHJvcHMsIG5leHRQcm9wcywgdGhpcy5wcm9wRXF1YWxpdHkpIHx8XG4gICAgICAgICAgICAhY29tcGFyZU9ianModGhpcy5zdGF0ZSwgbmV4dFN0YXRlLCB0aGlzLnN0YXRlRXF1YWxpdHkpO1xuICAgIH07XG4gICAgLy8gSEFDSyBmb3IgZnJlYWtpbicgUmVhY3QgU3RyaWN0TW9kZVxuICAgIFB1cmVDb21wb25lbnQucHJvdG90eXBlLnNhZmVTZXRTdGF0ZSA9IGZ1bmN0aW9uIChuZXdTdGF0ZSkge1xuICAgICAgICBpZiAoIWNvbXBhcmVPYmpzKHRoaXMuc3RhdGUsIHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCB0aGlzLnN0YXRlKSwgbmV3U3RhdGUpLCB0aGlzLnN0YXRlRXF1YWxpdHkpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUHVyZUNvbXBvbmVudC5hZGRQcm9wc0VxdWFsaXR5ID0gYWRkUHJvcHNFcXVhbGl0eTtcbiAgICBQdXJlQ29tcG9uZW50LmFkZFN0YXRlRXF1YWxpdHkgPSBhZGRTdGF0ZUVxdWFsaXR5O1xuICAgIFB1cmVDb21wb25lbnQuY29udGV4dFR5cGUgPSBWaWV3Q29udGV4dFR5cGU7XG4gICAgcmV0dXJuIFB1cmVDb21wb25lbnQ7XG59KHZkb21fY2pzLkNvbXBvbmVudCkpO1xuUHVyZUNvbXBvbmVudC5wcm90b3R5cGUucHJvcEVxdWFsaXR5ID0ge307XG5QdXJlQ29tcG9uZW50LnByb3RvdHlwZS5zdGF0ZUVxdWFsaXR5ID0ge307XG52YXIgQmFzZUNvbXBvbmVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoQmFzZUNvbXBvbmVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBCYXNlQ29tcG9uZW50KCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIEJhc2VDb21wb25lbnQuY29udGV4dFR5cGUgPSBWaWV3Q29udGV4dFR5cGU7XG4gICAgcmV0dXJuIEJhc2VDb21wb25lbnQ7XG59KFB1cmVDb21wb25lbnQpKTtcbmZ1bmN0aW9uIGFkZFByb3BzRXF1YWxpdHkocHJvcEVxdWFsaXR5KSB7XG4gICAgdmFyIGhhc2ggPSBPYmplY3QuY3JlYXRlKHRoaXMucHJvdG90eXBlLnByb3BFcXVhbGl0eSk7XG4gICAgdHNsaWIuX19hc3NpZ24oaGFzaCwgcHJvcEVxdWFsaXR5KTtcbiAgICB0aGlzLnByb3RvdHlwZS5wcm9wRXF1YWxpdHkgPSBoYXNoO1xufVxuZnVuY3Rpb24gYWRkU3RhdGVFcXVhbGl0eShzdGF0ZUVxdWFsaXR5KSB7XG4gICAgdmFyIGhhc2ggPSBPYmplY3QuY3JlYXRlKHRoaXMucHJvdG90eXBlLnN0YXRlRXF1YWxpdHkpO1xuICAgIHRzbGliLl9fYXNzaWduKGhhc2gsIHN0YXRlRXF1YWxpdHkpO1xuICAgIHRoaXMucHJvdG90eXBlLnN0YXRlRXF1YWxpdHkgPSBoYXNoO1xufVxuLy8gdXNlIG90aGVyIG9uZVxuZnVuY3Rpb24gc2V0UmVmKHJlZiwgY3VycmVudCkge1xuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlZihjdXJyZW50KTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmVmKSB7XG4gICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzMDI5XG4gICAgICAgIHJlZi5jdXJyZW50ID0gY3VycmVudDtcbiAgICB9XG59XG5cbi8qXG5hbiBJTlRFUkFDVEFCTEUgZGF0ZSBjb21wb25lbnRcblxuUFVSUE9TRVM6XG4tIGhvb2sgdXAgdG8gZmcsIGZpbGwsIGFuZCBtaXJyb3IgcmVuZGVyZXJzXG4tIGludGVyZmFjZSBmb3IgZHJhZ2dpbmcgYW5kIGhpdHNcbiovXG52YXIgRGF0ZUNvbXBvbmVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoRGF0ZUNvbXBvbmVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEYXRlQ29tcG9uZW50KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMudWlkID0gZ3VpZCgpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8vIEhpdCBTeXN0ZW1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIERhdGVDb21wb25lbnQucHJvdG90eXBlLnByZXBhcmVIaXRzID0gZnVuY3Rpb24gKCkge1xuICAgIH07XG4gICAgRGF0ZUNvbXBvbmVudC5wcm90b3R5cGUucXVlcnlIaXQgPSBmdW5jdGlvbiAocG9zaXRpb25MZWZ0LCBwb3NpdGlvblRvcCwgZWxXaWR0aCwgZWxIZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7IC8vIHRoaXMgc2hvdWxkIGJlIGFic3RyYWN0XG4gICAgfTtcbiAgICAvLyBQb2ludGVyIEludGVyYWN0aW9uIFV0aWxzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBEYXRlQ29tcG9uZW50LnByb3RvdHlwZS5pc1ZhbGlkU2VnRG93bkVsID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5wcm9wcy5ldmVudERyYWcgJiYgLy8gSEFDS1xuICAgICAgICAgICAgIXRoaXMucHJvcHMuZXZlbnRSZXNpemUgJiYgLy8gSEFDS1xuICAgICAgICAgICAgIWVsZW1lbnRDbG9zZXN0KGVsLCAnLmZjLWV2ZW50LW1pcnJvcicpO1xuICAgIH07XG4gICAgRGF0ZUNvbXBvbmVudC5wcm90b3R5cGUuaXNWYWxpZERhdGVEb3duRWwgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgcmV0dXJuICFlbGVtZW50Q2xvc2VzdChlbCwgJy5mYy1ldmVudDpub3QoLmZjLWJnLWV2ZW50KScpICYmXG4gICAgICAgICAgICAhZWxlbWVudENsb3Nlc3QoZWwsICcuZmMtbW9yZS1saW5rJykgJiYgLy8gYSBcIm1vcmUuLlwiIGxpbmtcbiAgICAgICAgICAgICFlbGVtZW50Q2xvc2VzdChlbCwgJ2FbZGF0YS1uYXZsaW5rXScpICYmIC8vIGEgY2xpY2thYmxlIG5hdiBsaW5rXG4gICAgICAgICAgICAhZWxlbWVudENsb3Nlc3QoZWwsICcuZmMtcG9wb3ZlcicpOyAvLyBoYWNrXG4gICAgfTtcbiAgICByZXR1cm4gRGF0ZUNvbXBvbmVudDtcbn0oQmFzZUNvbXBvbmVudCkpO1xuXG4vLyBUT0RPOiBlYXNpZXIgd2F5IHRvIGFkZCBuZXcgaG9va3M/IG5lZWQgdG8gdXBkYXRlIGEgbWlsbGlvbiB0aGluZ3NcbmZ1bmN0aW9uIGNyZWF0ZVBsdWdpbihpbnB1dCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBndWlkKCksXG4gICAgICAgIGRlcHM6IGlucHV0LmRlcHMgfHwgW10sXG4gICAgICAgIHJlZHVjZXJzOiBpbnB1dC5yZWR1Y2VycyB8fCBbXSxcbiAgICAgICAgaXNMb2FkaW5nRnVuY3M6IGlucHV0LmlzTG9hZGluZ0Z1bmNzIHx8IFtdLFxuICAgICAgICBjb250ZXh0SW5pdDogW10uY29uY2F0KGlucHV0LmNvbnRleHRJbml0IHx8IFtdKSxcbiAgICAgICAgZXZlbnRSZWZpbmVyczogaW5wdXQuZXZlbnRSZWZpbmVycyB8fCB7fSxcbiAgICAgICAgZXZlbnREZWZNZW1iZXJBZGRlcnM6IGlucHV0LmV2ZW50RGVmTWVtYmVyQWRkZXJzIHx8IFtdLFxuICAgICAgICBldmVudFNvdXJjZVJlZmluZXJzOiBpbnB1dC5ldmVudFNvdXJjZVJlZmluZXJzIHx8IHt9LFxuICAgICAgICBpc0RyYWdnYWJsZVRyYW5zZm9ybWVyczogaW5wdXQuaXNEcmFnZ2FibGVUcmFuc2Zvcm1lcnMgfHwgW10sXG4gICAgICAgIGV2ZW50RHJhZ011dGF0aW9uTWFzc2FnZXJzOiBpbnB1dC5ldmVudERyYWdNdXRhdGlvbk1hc3NhZ2VycyB8fCBbXSxcbiAgICAgICAgZXZlbnREZWZNdXRhdGlvbkFwcGxpZXJzOiBpbnB1dC5ldmVudERlZk11dGF0aW9uQXBwbGllcnMgfHwgW10sXG4gICAgICAgIGRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnM6IGlucHV0LmRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnMgfHwgW10sXG4gICAgICAgIGRhdGVQb2ludFRyYW5zZm9ybXM6IGlucHV0LmRhdGVQb2ludFRyYW5zZm9ybXMgfHwgW10sXG4gICAgICAgIGRhdGVTcGFuVHJhbnNmb3JtczogaW5wdXQuZGF0ZVNwYW5UcmFuc2Zvcm1zIHx8IFtdLFxuICAgICAgICB2aWV3czogaW5wdXQudmlld3MgfHwge30sXG4gICAgICAgIHZpZXdQcm9wc1RyYW5zZm9ybWVyczogaW5wdXQudmlld1Byb3BzVHJhbnNmb3JtZXJzIHx8IFtdLFxuICAgICAgICBpc1Byb3BzVmFsaWQ6IGlucHV0LmlzUHJvcHNWYWxpZCB8fCBudWxsLFxuICAgICAgICBleHRlcm5hbERlZlRyYW5zZm9ybXM6IGlucHV0LmV4dGVybmFsRGVmVHJhbnNmb3JtcyB8fCBbXSxcbiAgICAgICAgdmlld0NvbnRhaW5lckFwcGVuZHM6IGlucHV0LnZpZXdDb250YWluZXJBcHBlbmRzIHx8IFtdLFxuICAgICAgICBldmVudERyb3BUcmFuc2Zvcm1lcnM6IGlucHV0LmV2ZW50RHJvcFRyYW5zZm9ybWVycyB8fCBbXSxcbiAgICAgICAgY29tcG9uZW50SW50ZXJhY3Rpb25zOiBpbnB1dC5jb21wb25lbnRJbnRlcmFjdGlvbnMgfHwgW10sXG4gICAgICAgIGNhbGVuZGFySW50ZXJhY3Rpb25zOiBpbnB1dC5jYWxlbmRhckludGVyYWN0aW9ucyB8fCBbXSxcbiAgICAgICAgdGhlbWVDbGFzc2VzOiBpbnB1dC50aGVtZUNsYXNzZXMgfHwge30sXG4gICAgICAgIGV2ZW50U291cmNlRGVmczogaW5wdXQuZXZlbnRTb3VyY2VEZWZzIHx8IFtdLFxuICAgICAgICBjbWRGb3JtYXR0ZXI6IGlucHV0LmNtZEZvcm1hdHRlcixcbiAgICAgICAgcmVjdXJyaW5nVHlwZXM6IGlucHV0LnJlY3VycmluZ1R5cGVzIHx8IFtdLFxuICAgICAgICBuYW1lZFRpbWVab25lZEltcGw6IGlucHV0Lm5hbWVkVGltZVpvbmVkSW1wbCxcbiAgICAgICAgaW5pdGlhbFZpZXc6IGlucHV0LmluaXRpYWxWaWV3IHx8ICcnLFxuICAgICAgICBlbGVtZW50RHJhZ2dpbmdJbXBsOiBpbnB1dC5lbGVtZW50RHJhZ2dpbmdJbXBsLFxuICAgICAgICBvcHRpb25DaGFuZ2VIYW5kbGVyczogaW5wdXQub3B0aW9uQ2hhbmdlSGFuZGxlcnMgfHwge30sXG4gICAgICAgIHNjcm9sbEdyaWRJbXBsOiBpbnB1dC5zY3JvbGxHcmlkSW1wbCB8fCBudWxsLFxuICAgICAgICBjb250ZW50VHlwZUhhbmRsZXJzOiBpbnB1dC5jb250ZW50VHlwZUhhbmRsZXJzIHx8IHt9LFxuICAgICAgICBsaXN0ZW5lclJlZmluZXJzOiBpbnB1dC5saXN0ZW5lclJlZmluZXJzIHx8IHt9LFxuICAgICAgICBvcHRpb25SZWZpbmVyczogaW5wdXQub3B0aW9uUmVmaW5lcnMgfHwge30sXG4gICAgICAgIHByb3BTZXRIYW5kbGVyczogaW5wdXQucHJvcFNldEhhbmRsZXJzIHx8IHt9LFxuICAgIH07XG59XG5mdW5jdGlvbiBidWlsZFBsdWdpbkhvb2tzKHBsdWdpbkRlZnMsIGdsb2JhbERlZnMpIHtcbiAgICB2YXIgaXNBZGRlZCA9IHt9O1xuICAgIHZhciBob29rcyA9IHtcbiAgICAgICAgcmVkdWNlcnM6IFtdLFxuICAgICAgICBpc0xvYWRpbmdGdW5jczogW10sXG4gICAgICAgIGNvbnRleHRJbml0OiBbXSxcbiAgICAgICAgZXZlbnRSZWZpbmVyczoge30sXG4gICAgICAgIGV2ZW50RGVmTWVtYmVyQWRkZXJzOiBbXSxcbiAgICAgICAgZXZlbnRTb3VyY2VSZWZpbmVyczoge30sXG4gICAgICAgIGlzRHJhZ2dhYmxlVHJhbnNmb3JtZXJzOiBbXSxcbiAgICAgICAgZXZlbnREcmFnTXV0YXRpb25NYXNzYWdlcnM6IFtdLFxuICAgICAgICBldmVudERlZk11dGF0aW9uQXBwbGllcnM6IFtdLFxuICAgICAgICBkYXRlU2VsZWN0aW9uVHJhbnNmb3JtZXJzOiBbXSxcbiAgICAgICAgZGF0ZVBvaW50VHJhbnNmb3JtczogW10sXG4gICAgICAgIGRhdGVTcGFuVHJhbnNmb3JtczogW10sXG4gICAgICAgIHZpZXdzOiB7fSxcbiAgICAgICAgdmlld1Byb3BzVHJhbnNmb3JtZXJzOiBbXSxcbiAgICAgICAgaXNQcm9wc1ZhbGlkOiBudWxsLFxuICAgICAgICBleHRlcm5hbERlZlRyYW5zZm9ybXM6IFtdLFxuICAgICAgICB2aWV3Q29udGFpbmVyQXBwZW5kczogW10sXG4gICAgICAgIGV2ZW50RHJvcFRyYW5zZm9ybWVyczogW10sXG4gICAgICAgIGNvbXBvbmVudEludGVyYWN0aW9uczogW10sXG4gICAgICAgIGNhbGVuZGFySW50ZXJhY3Rpb25zOiBbXSxcbiAgICAgICAgdGhlbWVDbGFzc2VzOiB7fSxcbiAgICAgICAgZXZlbnRTb3VyY2VEZWZzOiBbXSxcbiAgICAgICAgY21kRm9ybWF0dGVyOiBudWxsLFxuICAgICAgICByZWN1cnJpbmdUeXBlczogW10sXG4gICAgICAgIG5hbWVkVGltZVpvbmVkSW1wbDogbnVsbCxcbiAgICAgICAgaW5pdGlhbFZpZXc6ICcnLFxuICAgICAgICBlbGVtZW50RHJhZ2dpbmdJbXBsOiBudWxsLFxuICAgICAgICBvcHRpb25DaGFuZ2VIYW5kbGVyczoge30sXG4gICAgICAgIHNjcm9sbEdyaWRJbXBsOiBudWxsLFxuICAgICAgICBjb250ZW50VHlwZUhhbmRsZXJzOiB7fSxcbiAgICAgICAgbGlzdGVuZXJSZWZpbmVyczoge30sXG4gICAgICAgIG9wdGlvblJlZmluZXJzOiB7fSxcbiAgICAgICAgcHJvcFNldEhhbmRsZXJzOiB7fSxcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGFkZERlZnMoZGVmcykge1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGRlZnNfMSA9IGRlZnM7IF9pIDwgZGVmc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIGRlZiA9IGRlZnNfMVtfaV07XG4gICAgICAgICAgICBpZiAoIWlzQWRkZWRbZGVmLmlkXSkge1xuICAgICAgICAgICAgICAgIGlzQWRkZWRbZGVmLmlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYWRkRGVmcyhkZWYuZGVwcyk7XG4gICAgICAgICAgICAgICAgaG9va3MgPSBjb21iaW5lSG9va3MoaG9va3MsIGRlZik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBsdWdpbkRlZnMpIHtcbiAgICAgICAgYWRkRGVmcyhwbHVnaW5EZWZzKTtcbiAgICB9XG4gICAgYWRkRGVmcyhnbG9iYWxEZWZzKTtcbiAgICByZXR1cm4gaG9va3M7XG59XG5mdW5jdGlvbiBidWlsZEJ1aWxkUGx1Z2luSG9va3MoKSB7XG4gICAgdmFyIGN1cnJlbnRPdmVycmlkZURlZnMgPSBbXTtcbiAgICB2YXIgY3VycmVudEdsb2JhbERlZnMgPSBbXTtcbiAgICB2YXIgY3VycmVudEhvb2tzO1xuICAgIHJldHVybiBmdW5jdGlvbiAob3ZlcnJpZGVEZWZzLCBnbG9iYWxEZWZzKSB7XG4gICAgICAgIGlmICghY3VycmVudEhvb2tzIHx8ICFpc0FycmF5c0VxdWFsKG92ZXJyaWRlRGVmcywgY3VycmVudE92ZXJyaWRlRGVmcykgfHwgIWlzQXJyYXlzRXF1YWwoZ2xvYmFsRGVmcywgY3VycmVudEdsb2JhbERlZnMpKSB7XG4gICAgICAgICAgICBjdXJyZW50SG9va3MgPSBidWlsZFBsdWdpbkhvb2tzKG92ZXJyaWRlRGVmcywgZ2xvYmFsRGVmcyk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudE92ZXJyaWRlRGVmcyA9IG92ZXJyaWRlRGVmcztcbiAgICAgICAgY3VycmVudEdsb2JhbERlZnMgPSBnbG9iYWxEZWZzO1xuICAgICAgICByZXR1cm4gY3VycmVudEhvb2tzO1xuICAgIH07XG59XG5mdW5jdGlvbiBjb21iaW5lSG9va3MoaG9va3MwLCBob29rczEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICByZWR1Y2VyczogaG9va3MwLnJlZHVjZXJzLmNvbmNhdChob29rczEucmVkdWNlcnMpLFxuICAgICAgICBpc0xvYWRpbmdGdW5jczogaG9va3MwLmlzTG9hZGluZ0Z1bmNzLmNvbmNhdChob29rczEuaXNMb2FkaW5nRnVuY3MpLFxuICAgICAgICBjb250ZXh0SW5pdDogaG9va3MwLmNvbnRleHRJbml0LmNvbmNhdChob29rczEuY29udGV4dEluaXQpLFxuICAgICAgICBldmVudFJlZmluZXJzOiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgaG9va3MwLmV2ZW50UmVmaW5lcnMpLCBob29rczEuZXZlbnRSZWZpbmVycyksXG4gICAgICAgIGV2ZW50RGVmTWVtYmVyQWRkZXJzOiBob29rczAuZXZlbnREZWZNZW1iZXJBZGRlcnMuY29uY2F0KGhvb2tzMS5ldmVudERlZk1lbWJlckFkZGVycyksXG4gICAgICAgIGV2ZW50U291cmNlUmVmaW5lcnM6IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBob29rczAuZXZlbnRTb3VyY2VSZWZpbmVycyksIGhvb2tzMS5ldmVudFNvdXJjZVJlZmluZXJzKSxcbiAgICAgICAgaXNEcmFnZ2FibGVUcmFuc2Zvcm1lcnM6IGhvb2tzMC5pc0RyYWdnYWJsZVRyYW5zZm9ybWVycy5jb25jYXQoaG9va3MxLmlzRHJhZ2dhYmxlVHJhbnNmb3JtZXJzKSxcbiAgICAgICAgZXZlbnREcmFnTXV0YXRpb25NYXNzYWdlcnM6IGhvb2tzMC5ldmVudERyYWdNdXRhdGlvbk1hc3NhZ2Vycy5jb25jYXQoaG9va3MxLmV2ZW50RHJhZ011dGF0aW9uTWFzc2FnZXJzKSxcbiAgICAgICAgZXZlbnREZWZNdXRhdGlvbkFwcGxpZXJzOiBob29rczAuZXZlbnREZWZNdXRhdGlvbkFwcGxpZXJzLmNvbmNhdChob29rczEuZXZlbnREZWZNdXRhdGlvbkFwcGxpZXJzKSxcbiAgICAgICAgZGF0ZVNlbGVjdGlvblRyYW5zZm9ybWVyczogaG9va3MwLmRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnMuY29uY2F0KGhvb2tzMS5kYXRlU2VsZWN0aW9uVHJhbnNmb3JtZXJzKSxcbiAgICAgICAgZGF0ZVBvaW50VHJhbnNmb3JtczogaG9va3MwLmRhdGVQb2ludFRyYW5zZm9ybXMuY29uY2F0KGhvb2tzMS5kYXRlUG9pbnRUcmFuc2Zvcm1zKSxcbiAgICAgICAgZGF0ZVNwYW5UcmFuc2Zvcm1zOiBob29rczAuZGF0ZVNwYW5UcmFuc2Zvcm1zLmNvbmNhdChob29rczEuZGF0ZVNwYW5UcmFuc2Zvcm1zKSxcbiAgICAgICAgdmlld3M6IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBob29rczAudmlld3MpLCBob29rczEudmlld3MpLFxuICAgICAgICB2aWV3UHJvcHNUcmFuc2Zvcm1lcnM6IGhvb2tzMC52aWV3UHJvcHNUcmFuc2Zvcm1lcnMuY29uY2F0KGhvb2tzMS52aWV3UHJvcHNUcmFuc2Zvcm1lcnMpLFxuICAgICAgICBpc1Byb3BzVmFsaWQ6IGhvb2tzMS5pc1Byb3BzVmFsaWQgfHwgaG9va3MwLmlzUHJvcHNWYWxpZCxcbiAgICAgICAgZXh0ZXJuYWxEZWZUcmFuc2Zvcm1zOiBob29rczAuZXh0ZXJuYWxEZWZUcmFuc2Zvcm1zLmNvbmNhdChob29rczEuZXh0ZXJuYWxEZWZUcmFuc2Zvcm1zKSxcbiAgICAgICAgdmlld0NvbnRhaW5lckFwcGVuZHM6IGhvb2tzMC52aWV3Q29udGFpbmVyQXBwZW5kcy5jb25jYXQoaG9va3MxLnZpZXdDb250YWluZXJBcHBlbmRzKSxcbiAgICAgICAgZXZlbnREcm9wVHJhbnNmb3JtZXJzOiBob29rczAuZXZlbnREcm9wVHJhbnNmb3JtZXJzLmNvbmNhdChob29rczEuZXZlbnREcm9wVHJhbnNmb3JtZXJzKSxcbiAgICAgICAgY2FsZW5kYXJJbnRlcmFjdGlvbnM6IGhvb2tzMC5jYWxlbmRhckludGVyYWN0aW9ucy5jb25jYXQoaG9va3MxLmNhbGVuZGFySW50ZXJhY3Rpb25zKSxcbiAgICAgICAgY29tcG9uZW50SW50ZXJhY3Rpb25zOiBob29rczAuY29tcG9uZW50SW50ZXJhY3Rpb25zLmNvbmNhdChob29rczEuY29tcG9uZW50SW50ZXJhY3Rpb25zKSxcbiAgICAgICAgdGhlbWVDbGFzc2VzOiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgaG9va3MwLnRoZW1lQ2xhc3NlcyksIGhvb2tzMS50aGVtZUNsYXNzZXMpLFxuICAgICAgICBldmVudFNvdXJjZURlZnM6IGhvb2tzMC5ldmVudFNvdXJjZURlZnMuY29uY2F0KGhvb2tzMS5ldmVudFNvdXJjZURlZnMpLFxuICAgICAgICBjbWRGb3JtYXR0ZXI6IGhvb2tzMS5jbWRGb3JtYXR0ZXIgfHwgaG9va3MwLmNtZEZvcm1hdHRlcixcbiAgICAgICAgcmVjdXJyaW5nVHlwZXM6IGhvb2tzMC5yZWN1cnJpbmdUeXBlcy5jb25jYXQoaG9va3MxLnJlY3VycmluZ1R5cGVzKSxcbiAgICAgICAgbmFtZWRUaW1lWm9uZWRJbXBsOiBob29rczEubmFtZWRUaW1lWm9uZWRJbXBsIHx8IGhvb2tzMC5uYW1lZFRpbWVab25lZEltcGwsXG4gICAgICAgIGluaXRpYWxWaWV3OiBob29rczAuaW5pdGlhbFZpZXcgfHwgaG9va3MxLmluaXRpYWxWaWV3LFxuICAgICAgICBlbGVtZW50RHJhZ2dpbmdJbXBsOiBob29rczAuZWxlbWVudERyYWdnaW5nSW1wbCB8fCBob29rczEuZWxlbWVudERyYWdnaW5nSW1wbCxcbiAgICAgICAgb3B0aW9uQ2hhbmdlSGFuZGxlcnM6IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBob29rczAub3B0aW9uQ2hhbmdlSGFuZGxlcnMpLCBob29rczEub3B0aW9uQ2hhbmdlSGFuZGxlcnMpLFxuICAgICAgICBzY3JvbGxHcmlkSW1wbDogaG9va3MxLnNjcm9sbEdyaWRJbXBsIHx8IGhvb2tzMC5zY3JvbGxHcmlkSW1wbCxcbiAgICAgICAgY29udGVudFR5cGVIYW5kbGVyczogdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGhvb2tzMC5jb250ZW50VHlwZUhhbmRsZXJzKSwgaG9va3MxLmNvbnRlbnRUeXBlSGFuZGxlcnMpLFxuICAgICAgICBsaXN0ZW5lclJlZmluZXJzOiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgaG9va3MwLmxpc3RlbmVyUmVmaW5lcnMpLCBob29rczEubGlzdGVuZXJSZWZpbmVycyksXG4gICAgICAgIG9wdGlvblJlZmluZXJzOiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgaG9va3MwLm9wdGlvblJlZmluZXJzKSwgaG9va3MxLm9wdGlvblJlZmluZXJzKSxcbiAgICAgICAgcHJvcFNldEhhbmRsZXJzOiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgaG9va3MwLnByb3BTZXRIYW5kbGVycyksIGhvb2tzMS5wcm9wU2V0SGFuZGxlcnMpLFxuICAgIH07XG59XG5cbnZhciBTdGFuZGFyZFRoZW1lID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhTdGFuZGFyZFRoZW1lLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFN0YW5kYXJkVGhlbWUoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFN0YW5kYXJkVGhlbWU7XG59KFRoZW1lKSk7XG5TdGFuZGFyZFRoZW1lLnByb3RvdHlwZS5jbGFzc2VzID0ge1xuICAgIHJvb3Q6ICdmYy10aGVtZS1zdGFuZGFyZCcsXG4gICAgdGFibGVDZWxsU2hhZGVkOiAnZmMtY2VsbC1zaGFkZWQnLFxuICAgIGJ1dHRvbkdyb3VwOiAnZmMtYnV0dG9uLWdyb3VwJyxcbiAgICBidXR0b246ICdmYy1idXR0b24gZmMtYnV0dG9uLXByaW1hcnknLFxuICAgIGJ1dHRvbkFjdGl2ZTogJ2ZjLWJ1dHRvbi1hY3RpdmUnLFxufTtcblN0YW5kYXJkVGhlbWUucHJvdG90eXBlLmJhc2VJY29uQ2xhc3MgPSAnZmMtaWNvbic7XG5TdGFuZGFyZFRoZW1lLnByb3RvdHlwZS5pY29uQ2xhc3NlcyA9IHtcbiAgICBjbG9zZTogJ2ZjLWljb24teCcsXG4gICAgcHJldjogJ2ZjLWljb24tY2hldnJvbi1sZWZ0JyxcbiAgICBuZXh0OiAnZmMtaWNvbi1jaGV2cm9uLXJpZ2h0JyxcbiAgICBwcmV2WWVhcjogJ2ZjLWljb24tY2hldnJvbnMtbGVmdCcsXG4gICAgbmV4dFllYXI6ICdmYy1pY29uLWNoZXZyb25zLXJpZ2h0Jyxcbn07XG5TdGFuZGFyZFRoZW1lLnByb3RvdHlwZS5ydGxJY29uQ2xhc3NlcyA9IHtcbiAgICBwcmV2OiAnZmMtaWNvbi1jaGV2cm9uLXJpZ2h0JyxcbiAgICBuZXh0OiAnZmMtaWNvbi1jaGV2cm9uLWxlZnQnLFxuICAgIHByZXZZZWFyOiAnZmMtaWNvbi1jaGV2cm9ucy1yaWdodCcsXG4gICAgbmV4dFllYXI6ICdmYy1pY29uLWNoZXZyb25zLWxlZnQnLFxufTtcblN0YW5kYXJkVGhlbWUucHJvdG90eXBlLmljb25PdmVycmlkZU9wdGlvbiA9ICdidXR0b25JY29ucyc7IC8vIFRPRE86IG1ha2UgVFMtZnJpZW5kbHlcblN0YW5kYXJkVGhlbWUucHJvdG90eXBlLmljb25PdmVycmlkZUN1c3RvbUJ1dHRvbk9wdGlvbiA9ICdpY29uJztcblN0YW5kYXJkVGhlbWUucHJvdG90eXBlLmljb25PdmVycmlkZVByZWZpeCA9ICdmYy1pY29uLSc7XG5cbmZ1bmN0aW9uIGNvbXBpbGVWaWV3RGVmcyhkZWZhdWx0Q29uZmlncywgb3ZlcnJpZGVDb25maWdzKSB7XG4gICAgdmFyIGhhc2ggPSB7fTtcbiAgICB2YXIgdmlld1R5cGU7XG4gICAgZm9yICh2aWV3VHlwZSBpbiBkZWZhdWx0Q29uZmlncykge1xuICAgICAgICBlbnN1cmVWaWV3RGVmKHZpZXdUeXBlLCBoYXNoLCBkZWZhdWx0Q29uZmlncywgb3ZlcnJpZGVDb25maWdzKTtcbiAgICB9XG4gICAgZm9yICh2aWV3VHlwZSBpbiBvdmVycmlkZUNvbmZpZ3MpIHtcbiAgICAgICAgZW5zdXJlVmlld0RlZih2aWV3VHlwZSwgaGFzaCwgZGVmYXVsdENvbmZpZ3MsIG92ZXJyaWRlQ29uZmlncyk7XG4gICAgfVxuICAgIHJldHVybiBoYXNoO1xufVxuZnVuY3Rpb24gZW5zdXJlVmlld0RlZih2aWV3VHlwZSwgaGFzaCwgZGVmYXVsdENvbmZpZ3MsIG92ZXJyaWRlQ29uZmlncykge1xuICAgIGlmIChoYXNoW3ZpZXdUeXBlXSkge1xuICAgICAgICByZXR1cm4gaGFzaFt2aWV3VHlwZV07XG4gICAgfVxuICAgIHZhciB2aWV3RGVmID0gYnVpbGRWaWV3RGVmKHZpZXdUeXBlLCBoYXNoLCBkZWZhdWx0Q29uZmlncywgb3ZlcnJpZGVDb25maWdzKTtcbiAgICBpZiAodmlld0RlZikge1xuICAgICAgICBoYXNoW3ZpZXdUeXBlXSA9IHZpZXdEZWY7XG4gICAgfVxuICAgIHJldHVybiB2aWV3RGVmO1xufVxuZnVuY3Rpb24gYnVpbGRWaWV3RGVmKHZpZXdUeXBlLCBoYXNoLCBkZWZhdWx0Q29uZmlncywgb3ZlcnJpZGVDb25maWdzKSB7XG4gICAgdmFyIGRlZmF1bHRDb25maWcgPSBkZWZhdWx0Q29uZmlnc1t2aWV3VHlwZV07XG4gICAgdmFyIG92ZXJyaWRlQ29uZmlnID0gb3ZlcnJpZGVDb25maWdzW3ZpZXdUeXBlXTtcbiAgICB2YXIgcXVlcnlQcm9wID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuICgoZGVmYXVsdENvbmZpZyAmJiBkZWZhdWx0Q29uZmlnW25hbWVdICE9PSBudWxsKSA/IGRlZmF1bHRDb25maWdbbmFtZV0gOlxuICAgICAgICAoKG92ZXJyaWRlQ29uZmlnICYmIG92ZXJyaWRlQ29uZmlnW25hbWVdICE9PSBudWxsKSA/IG92ZXJyaWRlQ29uZmlnW25hbWVdIDogbnVsbCkpOyB9O1xuICAgIHZhciB0aGVDb21wb25lbnQgPSBxdWVyeVByb3AoJ2NvbXBvbmVudCcpO1xuICAgIHZhciBzdXBlclR5cGUgPSBxdWVyeVByb3AoJ3N1cGVyVHlwZScpO1xuICAgIHZhciBzdXBlckRlZiA9IG51bGw7XG4gICAgaWYgKHN1cGVyVHlwZSkge1xuICAgICAgICBpZiAoc3VwZXJUeXBlID09PSB2aWV3VHlwZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGhhdmUgYSBjdXN0b20gdmlldyB0eXBlIHRoYXQgcmVmZXJlbmNlcyBpdHNlbGYnKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlckRlZiA9IGVuc3VyZVZpZXdEZWYoc3VwZXJUeXBlLCBoYXNoLCBkZWZhdWx0Q29uZmlncywgb3ZlcnJpZGVDb25maWdzKTtcbiAgICB9XG4gICAgaWYgKCF0aGVDb21wb25lbnQgJiYgc3VwZXJEZWYpIHtcbiAgICAgICAgdGhlQ29tcG9uZW50ID0gc3VwZXJEZWYuY29tcG9uZW50O1xuICAgIH1cbiAgICBpZiAoIXRoZUNvbXBvbmVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDsgLy8gZG9uJ3QgdGhyb3cgYSB3YXJuaW5nLCBtaWdodCBiZSBzZXR0aW5ncyBmb3IgYSBzaW5nbGUtdW5pdCB2aWV3XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHZpZXdUeXBlLFxuICAgICAgICBjb21wb25lbnQ6IHRoZUNvbXBvbmVudCxcbiAgICAgICAgZGVmYXVsdHM6IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCAoc3VwZXJEZWYgPyBzdXBlckRlZi5kZWZhdWx0cyA6IHt9KSksIChkZWZhdWx0Q29uZmlnID8gZGVmYXVsdENvbmZpZy5yYXdPcHRpb25zIDoge30pKSxcbiAgICAgICAgb3ZlcnJpZGVzOiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgKHN1cGVyRGVmID8gc3VwZXJEZWYub3ZlcnJpZGVzIDoge30pKSwgKG92ZXJyaWRlQ29uZmlnID8gb3ZlcnJpZGVDb25maWcucmF3T3B0aW9ucyA6IHt9KSksXG4gICAgfTtcbn1cblxuLyogZXNsaW50IG1heC1jbGFzc2VzLXBlci1maWxlOiBvZmYgKi9cbi8vIE5PVEU6IGluIEpTWCwgeW91IHNob3VsZCBhbHdheXMgdXNlIHRoaXMgY2xhc3Mgd2l0aCA8SG9va1Byb3BzPiBhcmcuIG90aGVyd2lzZSwgd2lsbCBkZWZhdWx0IHRvIGFueT8/P1xudmFyIFJlbmRlckhvb2sgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFJlbmRlckhvb2ssIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVuZGVySG9vaygpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnJvb3RFbFJlZiA9IHZkb21fY2pzLmNyZWF0ZVJlZigpO1xuICAgICAgICBfdGhpcy5oYW5kbGVSb290RWwgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIHNldFJlZihfdGhpcy5yb290RWxSZWYsIGVsKTtcbiAgICAgICAgICAgIGlmIChfdGhpcy5wcm9wcy5lbFJlZikge1xuICAgICAgICAgICAgICAgIHNldFJlZihfdGhpcy5wcm9wcy5lbFJlZiwgZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFJlbmRlckhvb2sucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgdmFyIGhvb2tQcm9wcyA9IHByb3BzLmhvb2tQcm9wcztcbiAgICAgICAgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KE1vdW50SG9vaywgeyBob29rUHJvcHM6IGhvb2tQcm9wcywgZGlkTW91bnQ6IHByb3BzLmRpZE1vdW50LCB3aWxsVW5tb3VudDogcHJvcHMud2lsbFVubW91bnQsIGVsUmVmOiB0aGlzLmhhbmRsZVJvb3RFbCB9LCBmdW5jdGlvbiAocm9vdEVsUmVmKSB7IHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChDb250ZW50SG9vaywgeyBob29rUHJvcHM6IGhvb2tQcm9wcywgY29udGVudDogcHJvcHMuY29udGVudCwgZGVmYXVsdENvbnRlbnQ6IHByb3BzLmRlZmF1bHRDb250ZW50LCBiYWNrdXBFbFJlZjogX3RoaXMucm9vdEVsUmVmIH0sIGZ1bmN0aW9uIChpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQpIHsgcmV0dXJuIHByb3BzLmNoaWxkcmVuKHJvb3RFbFJlZiwgbm9ybWFsaXplQ2xhc3NOYW1lcyhwcm9wcy5jbGFzc05hbWVzLCBob29rUHJvcHMpLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQpOyB9KSk7IH0pKTtcbiAgICB9O1xuICAgIHJldHVybiBSZW5kZXJIb29rO1xufShCYXNlQ29tcG9uZW50KSk7XG4vLyBUT0RPOiByZW5hbWUgdG8gYmUgYWJvdXQgZnVuY3Rpb24sIG5vdCBkZWZhdWx0LiB1c2UgaW4gYWJvdmUgdHlwZVxuLy8gZm9yIGZvcmNpbmcgcmVyZW5kZXIgb2YgY29tcG9uZW50cyB0aGF0IHVzZSB0aGUgQ29udGVudEhvb2tcbnZhciBDdXN0b21Db250ZW50UmVuZGVyQ29udGV4dCA9IHZkb21fY2pzLmNyZWF0ZUNvbnRleHQoMCk7XG5mdW5jdGlvbiBDb250ZW50SG9vayhwcm9wcykge1xuICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChDdXN0b21Db250ZW50UmVuZGVyQ29udGV4dC5Db25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKHJlbmRlcklkKSB7IHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChDb250ZW50SG9va0lubmVyLCB0c2xpYi5fX2Fzc2lnbih7IHJlbmRlcklkOiByZW5kZXJJZCB9LCBwcm9wcykpKTsgfSkpO1xufVxudmFyIENvbnRlbnRIb29rSW5uZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKENvbnRlbnRIb29rSW5uZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ29udGVudEhvb2tJbm5lcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmlubmVyRWxSZWYgPSB2ZG9tX2Nqcy5jcmVhdGVSZWYoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBDb250ZW50SG9va0lubmVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuKHRoaXMuaW5uZXJFbFJlZiwgdGhpcy5yZW5kZXJJbm5lckNvbnRlbnQoKSk7XG4gICAgfTtcbiAgICBDb250ZW50SG9va0lubmVyLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVDdXN0b21Db250ZW50KCk7XG4gICAgfTtcbiAgICBDb250ZW50SG9va0lubmVyLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ3VzdG9tQ29udGVudCgpO1xuICAgIH07XG4gICAgQ29udGVudEhvb2tJbm5lci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmN1c3RvbUNvbnRlbnRJbmZvICYmIHRoaXMuY3VzdG9tQ29udGVudEluZm8uZGVzdHJveSkge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21Db250ZW50SW5mby5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbnRlbnRIb29rSW5uZXIucHJvdG90eXBlLnJlbmRlcklubmVyQ29udGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGN1c3RvbUNvbnRlbnRJbmZvID0gdGhpcy5jdXN0b21Db250ZW50SW5mbzsgLy8gb25seSBwb3B1bGF0ZWQgaWYgdXNpbmcgbm9uLVtwXXJlYWN0IG5vZGUocylcbiAgICAgICAgdmFyIGlubmVyQ29udGVudCA9IHRoaXMuZ2V0SW5uZXJDb250ZW50KCk7XG4gICAgICAgIHZhciBtZXRhID0gdGhpcy5nZXRDb250ZW50TWV0YShpbm5lckNvbnRlbnQpO1xuICAgICAgICAvLyBpbml0aWFsIHJ1biwgb3IgY29udGVudC10eXBlIGNoYW5naW5nPyAoZnJvbSB2dWUgLT4gcmVhY3QgZm9yIGV4YW1wbGUpXG4gICAgICAgIGlmICghY3VzdG9tQ29udGVudEluZm8gfHwgY3VzdG9tQ29udGVudEluZm8uY29udGVudEtleSAhPT0gbWV0YS5jb250ZW50S2V5KSB7XG4gICAgICAgICAgICAvLyBjbGVhcmluZyBvbGQgdmFsdWVcbiAgICAgICAgICAgIGlmIChjdXN0b21Db250ZW50SW5mbykge1xuICAgICAgICAgICAgICAgIGlmIChjdXN0b21Db250ZW50SW5mby5kZXN0cm95KSB7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUNvbnRlbnRJbmZvLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VzdG9tQ29udGVudEluZm8gPSB0aGlzLmN1c3RvbUNvbnRlbnRJbmZvID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFzc2lnbmluZyBuZXcgdmFsdWVcbiAgICAgICAgICAgIGlmIChtZXRhLmNvbnRlbnRLZXkpIHtcbiAgICAgICAgICAgICAgICBjdXN0b21Db250ZW50SW5mbyA9IHRoaXMuY3VzdG9tQ29udGVudEluZm8gPSB0c2xpYi5fX2Fzc2lnbih7IGNvbnRlbnRLZXk6IG1ldGEuY29udGVudEtleSwgY29udGVudFZhbDogaW5uZXJDb250ZW50W21ldGEuY29udGVudEtleV0gfSwgbWV0YS5idWlsZExpZmVjeWNsZUZ1bmNzKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdXBkYXRpbmdcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdXN0b21Db250ZW50SW5mbykge1xuICAgICAgICAgICAgY3VzdG9tQ29udGVudEluZm8uY29udGVudFZhbCA9IGlubmVyQ29udGVudFttZXRhLmNvbnRlbnRLZXldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjdXN0b21Db250ZW50SW5mb1xuICAgICAgICAgICAgPyBbXSAvLyBzaWduYWwgdGhhdCBzb21ldGhpbmcgd2FzIHNwZWNpZmllZFxuICAgICAgICAgICAgOiBpbm5lckNvbnRlbnQ7IC8vIGFzc3VtZSBhIFtwXXJlYWN0IHZkb20gbm9kZS4gdXNlIGl0XG4gICAgfTtcbiAgICBDb250ZW50SG9va0lubmVyLnByb3RvdHlwZS5nZXRJbm5lckNvbnRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHZhciBpbm5lckNvbnRlbnQgPSBub3JtYWxpemVDb250ZW50KHByb3BzLmNvbnRlbnQsIHByb3BzLmhvb2tQcm9wcyk7XG4gICAgICAgIGlmIChpbm5lckNvbnRlbnQgPT09IHVuZGVmaW5lZCkgeyAvLyB1c2UgdGhlIGRlZmF1bHRcbiAgICAgICAgICAgIGlubmVyQ29udGVudCA9IG5vcm1hbGl6ZUNvbnRlbnQocHJvcHMuZGVmYXVsdENvbnRlbnQsIHByb3BzLmhvb2tQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlubmVyQ29udGVudCA9PSBudWxsID8gbnVsbCA6IGlubmVyQ29udGVudDsgLy8gY29udmVydCB1bmRlZmluZWQgdG8gbnVsbCAoYmV0dGVyIGZvciBSZWFjdClcbiAgICB9O1xuICAgIENvbnRlbnRIb29rSW5uZXIucHJvdG90eXBlLmdldENvbnRlbnRNZXRhID0gZnVuY3Rpb24gKGlubmVyQ29udGVudCkge1xuICAgICAgICB2YXIgY29udGVudFR5cGVIYW5kbGVycyA9IHRoaXMuY29udGV4dC5wbHVnaW5Ib29rcy5jb250ZW50VHlwZUhhbmRsZXJzO1xuICAgICAgICB2YXIgY29udGVudEtleSA9ICcnO1xuICAgICAgICB2YXIgYnVpbGRMaWZlY3ljbGVGdW5jcyA9IG51bGw7XG4gICAgICAgIGlmIChpbm5lckNvbnRlbnQpIHsgLy8gYWxsb3dlZCB0byBiZSBudWxsLCBmb3IgY29udmVuaWVuY2UgdG8gY2FsbGVyXG4gICAgICAgICAgICBmb3IgKHZhciBzZWFyY2hLZXkgaW4gY29udGVudFR5cGVIYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGlmIChpbm5lckNvbnRlbnRbc2VhcmNoS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRLZXkgPSBzZWFyY2hLZXk7XG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkTGlmZWN5Y2xlRnVuY3MgPSBjb250ZW50VHlwZUhhbmRsZXJzW3NlYXJjaEtleV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBjb250ZW50S2V5OiBjb250ZW50S2V5LCBidWlsZExpZmVjeWNsZUZ1bmNzOiBidWlsZExpZmVjeWNsZUZ1bmNzIH07XG4gICAgfTtcbiAgICBDb250ZW50SG9va0lubmVyLnByb3RvdHlwZS51cGRhdGVDdXN0b21Db250ZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21Db250ZW50SW5mbykgeyAvLyBmb3Igbm9uLVtwXXJlYWN0XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUNvbnRlbnRJbmZvLnJlbmRlcih0aGlzLmlubmVyRWxSZWYuY3VycmVudCB8fCB0aGlzLnByb3BzLmJhY2t1cEVsUmVmLmN1cnJlbnQsIC8vIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpbnRvXG4gICAgICAgICAgICB0aGlzLmN1c3RvbUNvbnRlbnRJbmZvLmNvbnRlbnRWYWwpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQ29udGVudEhvb2tJbm5lcjtcbn0oQmFzZUNvbXBvbmVudCkpO1xudmFyIE1vdW50SG9vayA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoTW91bnRIb29rLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1vdW50SG9vaygpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmhhbmRsZVJvb3RFbCA9IGZ1bmN0aW9uIChyb290RWwpIHtcbiAgICAgICAgICAgIF90aGlzLnJvb3RFbCA9IHJvb3RFbDtcbiAgICAgICAgICAgIGlmIChfdGhpcy5wcm9wcy5lbFJlZikge1xuICAgICAgICAgICAgICAgIHNldFJlZihfdGhpcy5wcm9wcy5lbFJlZiwgcm9vdEVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBNb3VudEhvb2sucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW4odGhpcy5oYW5kbGVSb290RWwpO1xuICAgIH07XG4gICAgTW91bnRIb29rLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdGhpcy5wcm9wcy5kaWRNb3VudDtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgdGhpcy5wcm9wcy5ob29rUHJvcHMpLCB7IGVsOiB0aGlzLnJvb3RFbCB9KSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE1vdW50SG9vay5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHRoaXMucHJvcHMud2lsbFVubW91bnQ7XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sodHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIHRoaXMucHJvcHMuaG9va1Byb3BzKSwgeyBlbDogdGhpcy5yb290RWwgfSkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gTW91bnRIb29rO1xufShCYXNlQ29tcG9uZW50KSk7XG5mdW5jdGlvbiBidWlsZENsYXNzTmFtZU5vcm1hbGl6ZXIoKSB7XG4gICAgdmFyIGN1cnJlbnRHZW5lcmF0b3I7XG4gICAgdmFyIGN1cnJlbnRIb29rUHJvcHM7XG4gICAgdmFyIGN1cnJlbnRDbGFzc05hbWVzID0gW107XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChnZW5lcmF0b3IsIGhvb2tQcm9wcykge1xuICAgICAgICBpZiAoIWN1cnJlbnRIb29rUHJvcHMgfHwgIWlzUHJvcHNFcXVhbChjdXJyZW50SG9va1Byb3BzLCBob29rUHJvcHMpIHx8IGdlbmVyYXRvciAhPT0gY3VycmVudEdlbmVyYXRvcikge1xuICAgICAgICAgICAgY3VycmVudEdlbmVyYXRvciA9IGdlbmVyYXRvcjtcbiAgICAgICAgICAgIGN1cnJlbnRIb29rUHJvcHMgPSBob29rUHJvcHM7XG4gICAgICAgICAgICBjdXJyZW50Q2xhc3NOYW1lcyA9IG5vcm1hbGl6ZUNsYXNzTmFtZXMoZ2VuZXJhdG9yLCBob29rUHJvcHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjdXJyZW50Q2xhc3NOYW1lcztcbiAgICB9O1xufVxuZnVuY3Rpb24gbm9ybWFsaXplQ2xhc3NOYW1lcyhjbGFzc05hbWVzLCBob29rUHJvcHMpIHtcbiAgICBpZiAodHlwZW9mIGNsYXNzTmFtZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2xhc3NOYW1lcyA9IGNsYXNzTmFtZXMoaG9va1Byb3BzKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlQ2xhc3NOYW1lcyhjbGFzc05hbWVzKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbnRlbnQoaW5wdXQsIGhvb2tQcm9wcykge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0KGhvb2tQcm9wcywgdmRvbV9janMuY3JlYXRlRWxlbWVudCk7IC8vIGdpdmUgdGhlIGZ1bmN0aW9uIHRoZSB2ZG9tLWNyZWF0aW9uIGZ1bmNcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0O1xufVxuXG52YXIgVmlld1Jvb3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFZpZXdSb290LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFZpZXdSb290KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubm9ybWFsaXplQ2xhc3NOYW1lcyA9IGJ1aWxkQ2xhc3NOYW1lTm9ybWFsaXplcigpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFZpZXdSb290LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgb3B0aW9ucyA9IGNvbnRleHQub3B0aW9ucztcbiAgICAgICAgdmFyIGhvb2tQcm9wcyA9IHsgdmlldzogY29udGV4dC52aWV3QXBpIH07XG4gICAgICAgIHZhciBjdXN0b21DbGFzc05hbWVzID0gdGhpcy5ub3JtYWxpemVDbGFzc05hbWVzKG9wdGlvbnMudmlld0NsYXNzTmFtZXMsIGhvb2tQcm9wcyk7XG4gICAgICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChNb3VudEhvb2ssIHsgaG9va1Byb3BzOiBob29rUHJvcHMsIGRpZE1vdW50OiBvcHRpb25zLnZpZXdEaWRNb3VudCwgd2lsbFVubW91bnQ6IG9wdGlvbnMudmlld1dpbGxVbm1vdW50LCBlbFJlZjogcHJvcHMuZWxSZWYgfSwgZnVuY3Rpb24gKHJvb3RFbFJlZikgeyByZXR1cm4gcHJvcHMuY2hpbGRyZW4ocm9vdEVsUmVmLCBbXCJmYy1cIiArIHByb3BzLnZpZXdTcGVjLnR5cGUgKyBcIi12aWV3XCIsICdmYy12aWV3J10uY29uY2F0KGN1c3RvbUNsYXNzTmFtZXMpKTsgfSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFZpZXdSb290O1xufShCYXNlQ29tcG9uZW50KSk7XG5cbmZ1bmN0aW9uIHBhcnNlVmlld0NvbmZpZ3MoaW5wdXRzKSB7XG4gICAgcmV0dXJuIG1hcEhhc2goaW5wdXRzLCBwYXJzZVZpZXdDb25maWcpO1xufVxuZnVuY3Rpb24gcGFyc2VWaWV3Q29uZmlnKGlucHV0KSB7XG4gICAgdmFyIHJhd09wdGlvbnMgPSB0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbicgP1xuICAgICAgICB7IGNvbXBvbmVudDogaW5wdXQgfSA6XG4gICAgICAgIGlucHV0O1xuICAgIHZhciBjb21wb25lbnQgPSByYXdPcHRpb25zLmNvbXBvbmVudDtcbiAgICBpZiAocmF3T3B0aW9ucy5jb250ZW50KSB7XG4gICAgICAgIGNvbXBvbmVudCA9IGNyZWF0ZVZpZXdIb29rQ29tcG9uZW50KHJhd09wdGlvbnMpO1xuICAgICAgICAvLyBUT0RPOiByZW1vdmUgY29udGVudC9jbGFzc05hbWVzL2RpZE1vdW50L2V0YyBmcm9tIG9wdGlvbnM/XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHN1cGVyVHlwZTogcmF3T3B0aW9ucy50eXBlLFxuICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCxcbiAgICAgICAgcmF3T3B0aW9uczogcmF3T3B0aW9ucyxcbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlVmlld0hvb2tDb21wb25lbnQob3B0aW9ucykge1xuICAgIHJldHVybiBmdW5jdGlvbiAodmlld1Byb3BzKSB7IHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChWaWV3Q29udGV4dFR5cGUuQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChjb250ZXh0KSB7IHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChWaWV3Um9vdCwgeyB2aWV3U3BlYzogY29udGV4dC52aWV3U3BlYyB9LCBmdW5jdGlvbiAodmlld0VsUmVmLCB2aWV3Q2xhc3NOYW1lcykge1xuICAgICAgICB2YXIgaG9va1Byb3BzID0gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIHZpZXdQcm9wcyksIHsgbmV4dERheVRocmVzaG9sZDogY29udGV4dC5vcHRpb25zLm5leHREYXlUaHJlc2hvbGQgfSk7XG4gICAgICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChSZW5kZXJIb29rLCB7IGhvb2tQcm9wczogaG9va1Byb3BzLCBjbGFzc05hbWVzOiBvcHRpb25zLmNsYXNzTmFtZXMsIGNvbnRlbnQ6IG9wdGlvbnMuY29udGVudCwgZGlkTW91bnQ6IG9wdGlvbnMuZGlkTW91bnQsIHdpbGxVbm1vdW50OiBvcHRpb25zLndpbGxVbm1vdW50LCBlbFJlZjogdmlld0VsUmVmIH0sIGZ1bmN0aW9uIChyb290RWxSZWYsIGN1c3RvbUNsYXNzTmFtZXMsIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCkgeyByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IHZpZXdDbGFzc05hbWVzLmNvbmNhdChjdXN0b21DbGFzc05hbWVzKS5qb2luKCcgJyksIHJlZjogcm9vdEVsUmVmIH0sIGlubmVyQ29udGVudCkpOyB9KSk7XG4gICAgfSkpOyB9KSk7IH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVmlld1NwZWNzKGRlZmF1bHRJbnB1dHMsIG9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcywgbG9jYWxlRGVmYXVsdHMpIHtcbiAgICB2YXIgZGVmYXVsdENvbmZpZ3MgPSBwYXJzZVZpZXdDb25maWdzKGRlZmF1bHRJbnB1dHMpO1xuICAgIHZhciBvdmVycmlkZUNvbmZpZ3MgPSBwYXJzZVZpZXdDb25maWdzKG9wdGlvbk92ZXJyaWRlcy52aWV3cyk7XG4gICAgdmFyIHZpZXdEZWZzID0gY29tcGlsZVZpZXdEZWZzKGRlZmF1bHRDb25maWdzLCBvdmVycmlkZUNvbmZpZ3MpO1xuICAgIHJldHVybiBtYXBIYXNoKHZpZXdEZWZzLCBmdW5jdGlvbiAodmlld0RlZikgeyByZXR1cm4gYnVpbGRWaWV3U3BlYyh2aWV3RGVmLCBvdmVycmlkZUNvbmZpZ3MsIG9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcywgbG9jYWxlRGVmYXVsdHMpOyB9KTtcbn1cbmZ1bmN0aW9uIGJ1aWxkVmlld1NwZWModmlld0RlZiwgb3ZlcnJpZGVDb25maWdzLCBvcHRpb25PdmVycmlkZXMsIGR5bmFtaWNPcHRpb25PdmVycmlkZXMsIGxvY2FsZURlZmF1bHRzKSB7XG4gICAgdmFyIGR1cmF0aW9uSW5wdXQgPSB2aWV3RGVmLm92ZXJyaWRlcy5kdXJhdGlvbiB8fFxuICAgICAgICB2aWV3RGVmLmRlZmF1bHRzLmR1cmF0aW9uIHx8XG4gICAgICAgIGR5bmFtaWNPcHRpb25PdmVycmlkZXMuZHVyYXRpb24gfHxcbiAgICAgICAgb3B0aW9uT3ZlcnJpZGVzLmR1cmF0aW9uO1xuICAgIHZhciBkdXJhdGlvbiA9IG51bGw7XG4gICAgdmFyIGR1cmF0aW9uVW5pdCA9ICcnO1xuICAgIHZhciBzaW5nbGVVbml0ID0gJyc7XG4gICAgdmFyIHNpbmdsZVVuaXRPdmVycmlkZXMgPSB7fTtcbiAgICBpZiAoZHVyYXRpb25JbnB1dCkge1xuICAgICAgICBkdXJhdGlvbiA9IGNyZWF0ZUR1cmF0aW9uQ2FjaGVkKGR1cmF0aW9uSW5wdXQpO1xuICAgICAgICBpZiAoZHVyYXRpb24pIHsgLy8gdmFsaWQ/XG4gICAgICAgICAgICB2YXIgZGVub20gPSBncmVhdGVzdER1cmF0aW9uRGVub21pbmF0b3IoZHVyYXRpb24pO1xuICAgICAgICAgICAgZHVyYXRpb25Vbml0ID0gZGVub20udW5pdDtcbiAgICAgICAgICAgIGlmIChkZW5vbS52YWx1ZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHNpbmdsZVVuaXQgPSBkdXJhdGlvblVuaXQ7XG4gICAgICAgICAgICAgICAgc2luZ2xlVW5pdE92ZXJyaWRlcyA9IG92ZXJyaWRlQ29uZmlnc1tkdXJhdGlvblVuaXRdID8gb3ZlcnJpZGVDb25maWdzW2R1cmF0aW9uVW5pdF0ucmF3T3B0aW9ucyA6IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBxdWVyeUJ1dHRvblRleHQgPSBmdW5jdGlvbiAob3B0aW9uc1N1YnNldCkge1xuICAgICAgICB2YXIgYnV0dG9uVGV4dE1hcCA9IG9wdGlvbnNTdWJzZXQuYnV0dG9uVGV4dCB8fCB7fTtcbiAgICAgICAgdmFyIGJ1dHRvblRleHRLZXkgPSB2aWV3RGVmLmRlZmF1bHRzLmJ1dHRvblRleHRLZXk7XG4gICAgICAgIGlmIChidXR0b25UZXh0S2V5ICE9IG51bGwgJiYgYnV0dG9uVGV4dE1hcFtidXR0b25UZXh0S2V5XSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYnV0dG9uVGV4dE1hcFtidXR0b25UZXh0S2V5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnV0dG9uVGV4dE1hcFt2aWV3RGVmLnR5cGVdICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBidXR0b25UZXh0TWFwW3ZpZXdEZWYudHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1dHRvblRleHRNYXBbc2luZ2xlVW5pdF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1dHRvblRleHRNYXBbc2luZ2xlVW5pdF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICB2YXIgcXVlcnlCdXR0b25UaXRsZSA9IGZ1bmN0aW9uIChvcHRpb25zU3Vic2V0KSB7XG4gICAgICAgIHZhciBidXR0b25IaW50cyA9IG9wdGlvbnNTdWJzZXQuYnV0dG9uSGludHMgfHwge307XG4gICAgICAgIHZhciBidXR0b25LZXkgPSB2aWV3RGVmLmRlZmF1bHRzLmJ1dHRvblRleHRLZXk7IC8vIHVzZSBzYW1lIGtleSBhcyB0ZXh0XG4gICAgICAgIGlmIChidXR0b25LZXkgIT0gbnVsbCAmJiBidXR0b25IaW50c1tidXR0b25LZXldICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBidXR0b25IaW50c1tidXR0b25LZXldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidXR0b25IaW50c1t2aWV3RGVmLnR5cGVdICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBidXR0b25IaW50c1t2aWV3RGVmLnR5cGVdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidXR0b25IaW50c1tzaW5nbGVVbml0XSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYnV0dG9uSGludHNbc2luZ2xlVW5pdF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiB2aWV3RGVmLnR5cGUsXG4gICAgICAgIGNvbXBvbmVudDogdmlld0RlZi5jb21wb25lbnQsXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgZHVyYXRpb25Vbml0OiBkdXJhdGlvblVuaXQsXG4gICAgICAgIHNpbmdsZVVuaXQ6IHNpbmdsZVVuaXQsXG4gICAgICAgIG9wdGlvbkRlZmF1bHRzOiB2aWV3RGVmLmRlZmF1bHRzLFxuICAgICAgICBvcHRpb25PdmVycmlkZXM6IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBzaW5nbGVVbml0T3ZlcnJpZGVzKSwgdmlld0RlZi5vdmVycmlkZXMpLFxuICAgICAgICBidXR0b25UZXh0T3ZlcnJpZGU6IHF1ZXJ5QnV0dG9uVGV4dChkeW5hbWljT3B0aW9uT3ZlcnJpZGVzKSB8fFxuICAgICAgICAgICAgcXVlcnlCdXR0b25UZXh0KG9wdGlvbk92ZXJyaWRlcykgfHwgLy8gY29uc3RydWN0b3Itc3BlY2lmaWVkIGJ1dHRvblRleHQgbG9va3VwIGhhc2ggdGFrZXMgcHJlY2VkZW5jZVxuICAgICAgICAgICAgdmlld0RlZi5vdmVycmlkZXMuYnV0dG9uVGV4dCxcbiAgICAgICAgYnV0dG9uVGV4dERlZmF1bHQ6IHF1ZXJ5QnV0dG9uVGV4dChsb2NhbGVEZWZhdWx0cykgfHxcbiAgICAgICAgICAgIHZpZXdEZWYuZGVmYXVsdHMuYnV0dG9uVGV4dCB8fFxuICAgICAgICAgICAgcXVlcnlCdXR0b25UZXh0KEJBU0VfT1BUSU9OX0RFRkFVTFRTKSB8fFxuICAgICAgICAgICAgdmlld0RlZi50eXBlLFxuICAgICAgICAvLyBub3QgRFJZXG4gICAgICAgIGJ1dHRvblRpdGxlT3ZlcnJpZGU6IHF1ZXJ5QnV0dG9uVGl0bGUoZHluYW1pY09wdGlvbk92ZXJyaWRlcykgfHxcbiAgICAgICAgICAgIHF1ZXJ5QnV0dG9uVGl0bGUob3B0aW9uT3ZlcnJpZGVzKSB8fFxuICAgICAgICAgICAgdmlld0RlZi5vdmVycmlkZXMuYnV0dG9uSGludCxcbiAgICAgICAgYnV0dG9uVGl0bGVEZWZhdWx0OiBxdWVyeUJ1dHRvblRpdGxlKGxvY2FsZURlZmF1bHRzKSB8fFxuICAgICAgICAgICAgdmlld0RlZi5kZWZhdWx0cy5idXR0b25IaW50IHx8XG4gICAgICAgICAgICBxdWVyeUJ1dHRvblRpdGxlKEJBU0VfT1BUSU9OX0RFRkFVTFRTKSxcbiAgICAgICAgLy8gd2lsbCBldmVudHVhbGx5IGZhbGwgYmFjayB0byBidXR0b25UZXh0XG4gICAgfTtcbn1cbi8vIGhhY2sgdG8gZ2V0IG1lbW9pemF0aW9uIHdvcmtpbmdcbnZhciBkdXJhdGlvbklucHV0TWFwID0ge307XG5mdW5jdGlvbiBjcmVhdGVEdXJhdGlvbkNhY2hlZChkdXJhdGlvbklucHV0KSB7XG4gICAgdmFyIGpzb24gPSBKU09OLnN0cmluZ2lmeShkdXJhdGlvbklucHV0KTtcbiAgICB2YXIgcmVzID0gZHVyYXRpb25JbnB1dE1hcFtqc29uXTtcbiAgICBpZiAocmVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzID0gY3JlYXRlRHVyYXRpb24oZHVyYXRpb25JbnB1dCk7XG4gICAgICAgIGR1cmF0aW9uSW5wdXRNYXBbanNvbl0gPSByZXM7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbnZhciBEYXRlUHJvZmlsZUdlbmVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEYXRlUHJvZmlsZUdlbmVyYXRvcihwcm9wcykge1xuICAgICAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgICAgIHRoaXMubm93RGF0ZSA9IGdldE5vdyhwcm9wcy5ub3dJbnB1dCwgcHJvcHMuZGF0ZUVudik7XG4gICAgICAgIHRoaXMuaW5pdEhpZGRlbkRheXMoKTtcbiAgICB9XG4gICAgLyogRGF0ZSBSYW5nZSBDb21wdXRhdGlvblxuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4gICAgLy8gQnVpbGRzIGEgc3RydWN0dXJlIHdpdGggaW5mbyBhYm91dCB3aGF0IHRoZSBkYXRlcy9yYW5nZXMgd2lsbCBiZSBmb3IgdGhlIFwicHJldlwiIHZpZXcuXG4gICAgRGF0ZVByb2ZpbGVHZW5lcmF0b3IucHJvdG90eXBlLmJ1aWxkUHJldiA9IGZ1bmN0aW9uIChjdXJyZW50RGF0ZVByb2ZpbGUsIGN1cnJlbnREYXRlLCBmb3JjZVRvVmFsaWQpIHtcbiAgICAgICAgdmFyIGRhdGVFbnYgPSB0aGlzLnByb3BzLmRhdGVFbnY7XG4gICAgICAgIHZhciBwcmV2RGF0ZSA9IGRhdGVFbnYuc3VidHJhY3QoZGF0ZUVudi5zdGFydE9mKGN1cnJlbnREYXRlLCBjdXJyZW50RGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlVW5pdCksIC8vIGltcG9ydGFudCBmb3Igc3RhcnQtb2YtbW9udGhcbiAgICAgICAgY3VycmVudERhdGVQcm9maWxlLmRhdGVJbmNyZW1lbnQpO1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZChwcmV2RGF0ZSwgLTEsIGZvcmNlVG9WYWxpZCk7XG4gICAgfTtcbiAgICAvLyBCdWlsZHMgYSBzdHJ1Y3R1cmUgd2l0aCBpbmZvIGFib3V0IHdoYXQgdGhlIGRhdGVzL3JhbmdlcyB3aWxsIGJlIGZvciB0aGUgXCJuZXh0XCIgdmlldy5cbiAgICBEYXRlUHJvZmlsZUdlbmVyYXRvci5wcm90b3R5cGUuYnVpbGROZXh0ID0gZnVuY3Rpb24gKGN1cnJlbnREYXRlUHJvZmlsZSwgY3VycmVudERhdGUsIGZvcmNlVG9WYWxpZCkge1xuICAgICAgICB2YXIgZGF0ZUVudiA9IHRoaXMucHJvcHMuZGF0ZUVudjtcbiAgICAgICAgdmFyIG5leHREYXRlID0gZGF0ZUVudi5hZGQoZGF0ZUVudi5zdGFydE9mKGN1cnJlbnREYXRlLCBjdXJyZW50RGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlVW5pdCksIC8vIGltcG9ydGFudCBmb3Igc3RhcnQtb2YtbW9udGhcbiAgICAgICAgY3VycmVudERhdGVQcm9maWxlLmRhdGVJbmNyZW1lbnQpO1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZChuZXh0RGF0ZSwgMSwgZm9yY2VUb1ZhbGlkKTtcbiAgICB9O1xuICAgIC8vIEJ1aWxkcyBhIHN0cnVjdHVyZSBob2xkaW5nIGRhdGVzL3JhbmdlcyBmb3IgcmVuZGVyaW5nIGFyb3VuZCB0aGUgZ2l2ZW4gZGF0ZS5cbiAgICAvLyBPcHRpb25hbCBkaXJlY3Rpb24gcGFyYW0gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGUgaXMgYmVpbmcgaW5jcmVtZW50ZWQvZGVjcmVtZW50ZWRcbiAgICAvLyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gZGVjcmVtZW50ZWQgPSAtMSwgaW5jcmVtZW50ZWQgPSAxIChkZWZhdWx0KS5cbiAgICBEYXRlUHJvZmlsZUdlbmVyYXRvci5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoY3VycmVudERhdGUsIGRpcmVjdGlvbiwgZm9yY2VUb1ZhbGlkKSB7XG4gICAgICAgIGlmIChmb3JjZVRvVmFsaWQgPT09IHZvaWQgMCkgeyBmb3JjZVRvVmFsaWQgPSB0cnVlOyB9XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHZhciB2YWxpZFJhbmdlO1xuICAgICAgICB2YXIgY3VycmVudEluZm87XG4gICAgICAgIHZhciBpc1JhbmdlQWxsRGF5O1xuICAgICAgICB2YXIgcmVuZGVyUmFuZ2U7XG4gICAgICAgIHZhciBhY3RpdmVSYW5nZTtcbiAgICAgICAgdmFyIGlzVmFsaWQ7XG4gICAgICAgIHZhbGlkUmFuZ2UgPSB0aGlzLmJ1aWxkVmFsaWRSYW5nZSgpO1xuICAgICAgICB2YWxpZFJhbmdlID0gdGhpcy50cmltSGlkZGVuRGF5cyh2YWxpZFJhbmdlKTtcbiAgICAgICAgaWYgKGZvcmNlVG9WYWxpZCkge1xuICAgICAgICAgICAgY3VycmVudERhdGUgPSBjb25zdHJhaW5NYXJrZXJUb1JhbmdlKGN1cnJlbnREYXRlLCB2YWxpZFJhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50SW5mbyA9IHRoaXMuYnVpbGRDdXJyZW50UmFuZ2VJbmZvKGN1cnJlbnREYXRlLCBkaXJlY3Rpb24pO1xuICAgICAgICBpc1JhbmdlQWxsRGF5ID0gL14oeWVhcnxtb250aHx3ZWVrfGRheSkkLy50ZXN0KGN1cnJlbnRJbmZvLnVuaXQpO1xuICAgICAgICByZW5kZXJSYW5nZSA9IHRoaXMuYnVpbGRSZW5kZXJSYW5nZSh0aGlzLnRyaW1IaWRkZW5EYXlzKGN1cnJlbnRJbmZvLnJhbmdlKSwgY3VycmVudEluZm8udW5pdCwgaXNSYW5nZUFsbERheSk7XG4gICAgICAgIHJlbmRlclJhbmdlID0gdGhpcy50cmltSGlkZGVuRGF5cyhyZW5kZXJSYW5nZSk7XG4gICAgICAgIGFjdGl2ZVJhbmdlID0gcmVuZGVyUmFuZ2U7XG4gICAgICAgIGlmICghcHJvcHMuc2hvd05vbkN1cnJlbnREYXRlcykge1xuICAgICAgICAgICAgYWN0aXZlUmFuZ2UgPSBpbnRlcnNlY3RSYW5nZXMoYWN0aXZlUmFuZ2UsIGN1cnJlbnRJbmZvLnJhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICBhY3RpdmVSYW5nZSA9IHRoaXMuYWRqdXN0QWN0aXZlUmFuZ2UoYWN0aXZlUmFuZ2UpO1xuICAgICAgICBhY3RpdmVSYW5nZSA9IGludGVyc2VjdFJhbmdlcyhhY3RpdmVSYW5nZSwgdmFsaWRSYW5nZSk7IC8vIG1pZ2h0IHJldHVybiBudWxsXG4gICAgICAgIC8vIGl0J3MgaW52YWxpZCBpZiB0aGUgb3JpZ2luYWxseSByZXF1ZXN0ZWQgZGF0ZSBpcyBub3QgY29udGFpbmVkLFxuICAgICAgICAvLyBvciBpZiB0aGUgcmFuZ2UgaXMgY29tcGxldGVseSBvdXRzaWRlIG9mIHRoZSB2YWxpZCByYW5nZS5cbiAgICAgICAgaXNWYWxpZCA9IHJhbmdlc0ludGVyc2VjdChjdXJyZW50SW5mby5yYW5nZSwgdmFsaWRSYW5nZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvLyBjb25zdHJhaW50IGZvciB3aGVyZSBwcmV2L25leHQgb3BlcmF0aW9ucyBjYW4gZ28gYW5kIHdoZXJlIGV2ZW50cyBjYW4gYmUgZHJhZ2dlZC9yZXNpemVkIHRvLlxuICAgICAgICAgICAgLy8gYW4gb2JqZWN0IHdpdGggb3B0aW9uYWwgc3RhcnQgYW5kIGVuZCBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgdmFsaWRSYW5nZTogdmFsaWRSYW5nZSxcbiAgICAgICAgICAgIC8vIHJhbmdlIHRoZSB2aWV3IGlzIGZvcm1hbGx5IHJlc3BvbnNpYmxlIGZvci5cbiAgICAgICAgICAgIC8vIGZvciBleGFtcGxlLCBhIG1vbnRoIHZpZXcgbWlnaHQgaGF2ZSAxc3QtMzFzdCwgZXhjbHVkaW5nIHBhZGRlZCBkYXRlc1xuICAgICAgICAgICAgY3VycmVudFJhbmdlOiBjdXJyZW50SW5mby5yYW5nZSxcbiAgICAgICAgICAgIC8vIG5hbWUgb2YgbGFyZ2VzdCB1bml0IGJlaW5nIGRpc3BsYXllZCwgbGlrZSBcIm1vbnRoXCIgb3IgXCJ3ZWVrXCJcbiAgICAgICAgICAgIGN1cnJlbnRSYW5nZVVuaXQ6IGN1cnJlbnRJbmZvLnVuaXQsXG4gICAgICAgICAgICBpc1JhbmdlQWxsRGF5OiBpc1JhbmdlQWxsRGF5LFxuICAgICAgICAgICAgLy8gZGF0ZXMgdGhhdCBkaXNwbGF5IGV2ZW50cyBhbmQgYWNjZXB0IGRyYWctbi1kcm9wXG4gICAgICAgICAgICAvLyB3aWxsIGJlIGBudWxsYCBpZiBubyBkYXRlcyBhY2NlcHQgZXZlbnRzXG4gICAgICAgICAgICBhY3RpdmVSYW5nZTogYWN0aXZlUmFuZ2UsXG4gICAgICAgICAgICAvLyBkYXRlIHJhbmdlIHdpdGggYSByZW5kZXJlZCBza2VsZXRvblxuICAgICAgICAgICAgLy8gaW5jbHVkZXMgbm90LWFjdGl2ZSBkYXlzIHRoYXQgbmVlZCBzb21lIHNvcnQgb2YgRE9NXG4gICAgICAgICAgICByZW5kZXJSYW5nZTogcmVuZGVyUmFuZ2UsXG4gICAgICAgICAgICAvLyBEdXJhdGlvbiBvYmplY3QgdGhhdCBkZW5vdGVzIHRoZSBmaXJzdCB2aXNpYmxlIHRpbWUgb2YgYW55IGdpdmVuIGRheVxuICAgICAgICAgICAgc2xvdE1pblRpbWU6IHByb3BzLnNsb3RNaW5UaW1lLFxuICAgICAgICAgICAgLy8gRHVyYXRpb24gb2JqZWN0IHRoYXQgZGVub3RlcyB0aGUgZXhjbHVzaXZlIHZpc2libGUgZW5kIHRpbWUgb2YgYW55IGdpdmVuIGRheVxuICAgICAgICAgICAgc2xvdE1heFRpbWU6IHByb3BzLnNsb3RNYXhUaW1lLFxuICAgICAgICAgICAgaXNWYWxpZDogaXNWYWxpZCxcbiAgICAgICAgICAgIC8vIGhvdyBmYXIgdGhlIGN1cnJlbnQgZGF0ZSB3aWxsIG1vdmUgZm9yIGEgcHJldi9uZXh0IG9wZXJhdGlvblxuICAgICAgICAgICAgZGF0ZUluY3JlbWVudDogdGhpcy5idWlsZERhdGVJbmNyZW1lbnQoY3VycmVudEluZm8uZHVyYXRpb24pLFxuICAgICAgICAgICAgLy8gcGFzcyBhIGZhbGxiYWNrIChtaWdodCBiZSBudWxsKSBeXG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvLyBCdWlsZHMgYW4gb2JqZWN0IHdpdGggb3B0aW9uYWwgc3RhcnQvZW5kIHByb3BlcnRpZXMuXG4gICAgLy8gSW5kaWNhdGVzIHRoZSBtaW5pbXVtL21heGltdW0gZGF0ZXMgdG8gZGlzcGxheS5cbiAgICAvLyBub3QgcmVzcG9uc2libGUgZm9yIHRyaW1taW5nIGhpZGRlbiBkYXlzLlxuICAgIERhdGVQcm9maWxlR2VuZXJhdG9yLnByb3RvdHlwZS5idWlsZFZhbGlkUmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IHRoaXMucHJvcHMudmFsaWRSYW5nZUlucHV0O1xuICAgICAgICB2YXIgc2ltcGxlSW5wdXQgPSB0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gaW5wdXQuY2FsbCh0aGlzLnByb3BzLmNhbGVuZGFyQXBpLCB0aGlzLm5vd0RhdGUpXG4gICAgICAgICAgICA6IGlucHV0O1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZpbmVSYW5nZShzaW1wbGVJbnB1dCkgfHxcbiAgICAgICAgICAgIHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbCB9OyAvLyBjb21wbGV0ZWx5IG9wZW4tZW5kZWRcbiAgICB9O1xuICAgIC8vIEJ1aWxkcyBhIHN0cnVjdHVyZSB3aXRoIGluZm8gYWJvdXQgdGhlIFwiY3VycmVudFwiIHJhbmdlLCB0aGUgcmFuZ2UgdGhhdCBpc1xuICAgIC8vIGhpZ2hsaWdodGVkIGFzIGJlaW5nIHRoZSBjdXJyZW50IG1vbnRoIGZvciBleGFtcGxlLlxuICAgIC8vIFNlZSBidWlsZCgpIGZvciBhIGRlc2NyaXB0aW9uIG9mIGBkaXJlY3Rpb25gLlxuICAgIC8vIEd1YXJhbnRlZWQgdG8gaGF2ZSBgcmFuZ2VgIGFuZCBgdW5pdGAgcHJvcGVydGllcy4gYGR1cmF0aW9uYCBpcyBvcHRpb25hbC5cbiAgICBEYXRlUHJvZmlsZUdlbmVyYXRvci5wcm90b3R5cGUuYnVpbGRDdXJyZW50UmFuZ2VJbmZvID0gZnVuY3Rpb24gKGRhdGUsIGRpcmVjdGlvbikge1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBudWxsO1xuICAgICAgICB2YXIgdW5pdCA9IG51bGw7XG4gICAgICAgIHZhciByYW5nZSA9IG51bGw7XG4gICAgICAgIHZhciBkYXlDb3VudDtcbiAgICAgICAgaWYgKHByb3BzLmR1cmF0aW9uKSB7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHByb3BzLmR1cmF0aW9uO1xuICAgICAgICAgICAgdW5pdCA9IHByb3BzLmR1cmF0aW9uVW5pdDtcbiAgICAgICAgICAgIHJhbmdlID0gdGhpcy5idWlsZFJhbmdlRnJvbUR1cmF0aW9uKGRhdGUsIGRpcmVjdGlvbiwgZHVyYXRpb24sIHVuaXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChkYXlDb3VudCA9IHRoaXMucHJvcHMuZGF5Q291bnQpKSB7XG4gICAgICAgICAgICB1bml0ID0gJ2RheSc7XG4gICAgICAgICAgICByYW5nZSA9IHRoaXMuYnVpbGRSYW5nZUZyb21EYXlDb3VudChkYXRlLCBkaXJlY3Rpb24sIGRheUNvdW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgocmFuZ2UgPSB0aGlzLmJ1aWxkQ3VzdG9tVmlzaWJsZVJhbmdlKGRhdGUpKSkge1xuICAgICAgICAgICAgdW5pdCA9IHByb3BzLmRhdGVFbnYuZ3JlYXRlc3RXaG9sZVVuaXQocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCkudW5pdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGR1cmF0aW9uID0gdGhpcy5nZXRGYWxsYmFja0R1cmF0aW9uKCk7XG4gICAgICAgICAgICB1bml0ID0gZ3JlYXRlc3REdXJhdGlvbkRlbm9taW5hdG9yKGR1cmF0aW9uKS51bml0O1xuICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLmJ1aWxkUmFuZ2VGcm9tRHVyYXRpb24oZGF0ZSwgZGlyZWN0aW9uLCBkdXJhdGlvbiwgdW5pdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZHVyYXRpb246IGR1cmF0aW9uLCB1bml0OiB1bml0LCByYW5nZTogcmFuZ2UgfTtcbiAgICB9O1xuICAgIERhdGVQcm9maWxlR2VuZXJhdG9yLnByb3RvdHlwZS5nZXRGYWxsYmFja0R1cmF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oeyBkYXk6IDEgfSk7XG4gICAgfTtcbiAgICAvLyBSZXR1cm5zIGEgbmV3IGFjdGl2ZVJhbmdlIHRvIGhhdmUgdGltZSB2YWx1ZXMgKHVuLWFtYmlndWF0ZSlcbiAgICAvLyBzbG90TWluVGltZSBvciBzbG90TWF4VGltZSBjYXVzZXMgdGhlIHJhbmdlIHRvIGV4cGFuZC5cbiAgICBEYXRlUHJvZmlsZUdlbmVyYXRvci5wcm90b3R5cGUuYWRqdXN0QWN0aXZlUmFuZ2UgPSBmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5wcm9wcywgZGF0ZUVudiA9IF9hLmRhdGVFbnYsIHVzZXNNaW5NYXhUaW1lID0gX2EudXNlc01pbk1heFRpbWUsIHNsb3RNaW5UaW1lID0gX2Euc2xvdE1pblRpbWUsIHNsb3RNYXhUaW1lID0gX2Euc2xvdE1heFRpbWU7XG4gICAgICAgIHZhciBzdGFydCA9IHJhbmdlLnN0YXJ0LCBlbmQgPSByYW5nZS5lbmQ7XG4gICAgICAgIGlmICh1c2VzTWluTWF4VGltZSkge1xuICAgICAgICAgICAgLy8gZXhwYW5kIGFjdGl2ZSByYW5nZSBpZiBzbG90TWluVGltZSBpcyBuZWdhdGl2ZSAod2h5IG5vdCB3aGVuIHBvc2l0aXZlPylcbiAgICAgICAgICAgIGlmIChhc1JvdWdoRGF5cyhzbG90TWluVGltZSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBzdGFydE9mRGF5KHN0YXJ0KTsgLy8gbmVjZXNzYXJ5P1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gZGF0ZUVudi5hZGQoc3RhcnQsIHNsb3RNaW5UaW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGV4cGFuZCBhY3RpdmUgcmFuZ2UgaWYgc2xvdE1heFRpbWUgaXMgYmV5b25kIG9uZSBkYXkgKHdoeSBub3Qgd2hlbiBuZWdhdGl2ZT8pXG4gICAgICAgICAgICBpZiAoYXNSb3VnaERheXMoc2xvdE1heFRpbWUpID4gMSkge1xuICAgICAgICAgICAgICAgIGVuZCA9IHN0YXJ0T2ZEYXkoZW5kKTsgLy8gbmVjZXNzYXJ5P1xuICAgICAgICAgICAgICAgIGVuZCA9IGFkZERheXMoZW5kLCAtMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0ZUVudi5hZGQoZW5kLCBzbG90TWF4VGltZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9O1xuICAgIH07XG4gICAgLy8gQnVpbGRzIHRoZSBcImN1cnJlbnRcIiByYW5nZSB3aGVuIGl0IGlzIHNwZWNpZmllZCBhcyBhbiBleHBsaWNpdCBkdXJhdGlvbi5cbiAgICAvLyBgdW5pdGAgaXMgdGhlIGFscmVhZHktY29tcHV0ZWQgZ3JlYXRlc3REdXJhdGlvbkRlbm9taW5hdG9yIHVuaXQgb2YgZHVyYXRpb24uXG4gICAgRGF0ZVByb2ZpbGVHZW5lcmF0b3IucHJvdG90eXBlLmJ1aWxkUmFuZ2VGcm9tRHVyYXRpb24gPSBmdW5jdGlvbiAoZGF0ZSwgZGlyZWN0aW9uLCBkdXJhdGlvbiwgdW5pdCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLnByb3BzLCBkYXRlRW52ID0gX2EuZGF0ZUVudiwgZGF0ZUFsaWdubWVudCA9IF9hLmRhdGVBbGlnbm1lbnQ7XG4gICAgICAgIHZhciBzdGFydDtcbiAgICAgICAgdmFyIGVuZDtcbiAgICAgICAgdmFyIHJlcztcbiAgICAgICAgLy8gY29tcHV0ZSB3aGF0IHRoZSBhbGlnbm1lbnQgc2hvdWxkIGJlXG4gICAgICAgIGlmICghZGF0ZUFsaWdubWVudCkge1xuICAgICAgICAgICAgdmFyIGRhdGVJbmNyZW1lbnQgPSB0aGlzLnByb3BzLmRhdGVJbmNyZW1lbnQ7XG4gICAgICAgICAgICBpZiAoZGF0ZUluY3JlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgc21hbGxlciBvZiB0aGUgdHdvIHVuaXRzXG4gICAgICAgICAgICAgICAgaWYgKGFzUm91Z2hNcyhkYXRlSW5jcmVtZW50KSA8IGFzUm91Z2hNcyhkdXJhdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZUFsaWdubWVudCA9IGdyZWF0ZXN0RHVyYXRpb25EZW5vbWluYXRvcihkYXRlSW5jcmVtZW50KS51bml0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZUFsaWdubWVudCA9IHVuaXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0ZUFsaWdubWVudCA9IHVuaXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgdGhlIHZpZXcgZGlzcGxheXMgYSBzaW5nbGUgZGF5IG9yIHNtYWxsZXJcbiAgICAgICAgaWYgKGFzUm91Z2hEYXlzKGR1cmF0aW9uKSA8PSAxKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0hpZGRlbkRheShzdGFydCkpIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IHRoaXMuc2tpcEhpZGRlbkRheXMoc3RhcnQsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBzdGFydE9mRGF5KHN0YXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBjb21wdXRlUmVzKCkge1xuICAgICAgICAgICAgc3RhcnQgPSBkYXRlRW52LnN0YXJ0T2YoZGF0ZSwgZGF0ZUFsaWdubWVudCk7XG4gICAgICAgICAgICBlbmQgPSBkYXRlRW52LmFkZChzdGFydCwgZHVyYXRpb24pO1xuICAgICAgICAgICAgcmVzID0geyBzdGFydDogc3RhcnQsIGVuZDogZW5kIH07XG4gICAgICAgIH1cbiAgICAgICAgY29tcHV0ZVJlcygpO1xuICAgICAgICAvLyBpZiByYW5nZSBpcyBjb21wbGV0ZWx5IGVudmVsb3BlZCBieSBoaWRkZW4gZGF5cywgZ28gcGFzdCB0aGUgaGlkZGVuIGRheXNcbiAgICAgICAgaWYgKCF0aGlzLnRyaW1IaWRkZW5EYXlzKHJlcykpIHtcbiAgICAgICAgICAgIGRhdGUgPSB0aGlzLnNraXBIaWRkZW5EYXlzKGRhdGUsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICBjb21wdXRlUmVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICAgIC8vIEJ1aWxkcyB0aGUgXCJjdXJyZW50XCIgcmFuZ2Ugd2hlbiBhIGRheUNvdW50IGlzIHNwZWNpZmllZC5cbiAgICBEYXRlUHJvZmlsZUdlbmVyYXRvci5wcm90b3R5cGUuYnVpbGRSYW5nZUZyb21EYXlDb3VudCA9IGZ1bmN0aW9uIChkYXRlLCBkaXJlY3Rpb24sIGRheUNvdW50KSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMucHJvcHMsIGRhdGVFbnYgPSBfYS5kYXRlRW52LCBkYXRlQWxpZ25tZW50ID0gX2EuZGF0ZUFsaWdubWVudDtcbiAgICAgICAgdmFyIHJ1bm5pbmdDb3VudCA9IDA7XG4gICAgICAgIHZhciBzdGFydCA9IGRhdGU7XG4gICAgICAgIHZhciBlbmQ7XG4gICAgICAgIGlmIChkYXRlQWxpZ25tZW50KSB7XG4gICAgICAgICAgICBzdGFydCA9IGRhdGVFbnYuc3RhcnRPZihzdGFydCwgZGF0ZUFsaWdubWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnQgPSBzdGFydE9mRGF5KHN0YXJ0KTtcbiAgICAgICAgc3RhcnQgPSB0aGlzLnNraXBIaWRkZW5EYXlzKHN0YXJ0LCBkaXJlY3Rpb24pO1xuICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgZW5kID0gYWRkRGF5cyhlbmQsIDEpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzSGlkZGVuRGF5KGVuZCkpIHtcbiAgICAgICAgICAgICAgICBydW5uaW5nQ291bnQgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAocnVubmluZ0NvdW50IDwgZGF5Q291bnQpO1xuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnQsIGVuZDogZW5kIH07XG4gICAgfTtcbiAgICAvLyBCdWlsZHMgYSBub3JtYWxpemVkIHJhbmdlIG9iamVjdCBmb3IgdGhlIFwidmlzaWJsZVwiIHJhbmdlLFxuICAgIC8vIHdoaWNoIGlzIGEgd2F5IHRvIGRlZmluZSB0aGUgY3VycmVudFJhbmdlIGFuZCBhY3RpdmVSYW5nZSBhdCB0aGUgc2FtZSB0aW1lLlxuICAgIERhdGVQcm9maWxlR2VuZXJhdG9yLnByb3RvdHlwZS5idWlsZEN1c3RvbVZpc2libGVSYW5nZSA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHZhciBpbnB1dCA9IHByb3BzLnZpc2libGVSYW5nZUlucHV0O1xuICAgICAgICB2YXIgc2ltcGxlSW5wdXQgPSB0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gaW5wdXQuY2FsbChwcm9wcy5jYWxlbmRhckFwaSwgcHJvcHMuZGF0ZUVudi50b0RhdGUoZGF0ZSkpXG4gICAgICAgICAgICA6IGlucHV0O1xuICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLnJlZmluZVJhbmdlKHNpbXBsZUlucHV0KTtcbiAgICAgICAgaWYgKHJhbmdlICYmIChyYW5nZS5zdGFydCA9PSBudWxsIHx8IHJhbmdlLmVuZCA9PSBudWxsKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJhbmdlO1xuICAgIH07XG4gICAgLy8gQ29tcHV0ZXMgdGhlIHJhbmdlIHRoYXQgd2lsbCByZXByZXNlbnQgdGhlIGVsZW1lbnQvY2VsbHMgZm9yICpyZW5kZXJpbmcqLFxuICAgIC8vIGJ1dCB3aGljaCBtYXkgaGF2ZSB2b2lkZWQgZGF5cy90aW1lcy5cbiAgICAvLyBub3QgcmVzcG9uc2libGUgZm9yIHRyaW1taW5nIGhpZGRlbiBkYXlzLlxuICAgIERhdGVQcm9maWxlR2VuZXJhdG9yLnByb3RvdHlwZS5idWlsZFJlbmRlclJhbmdlID0gZnVuY3Rpb24gKGN1cnJlbnRSYW5nZSwgY3VycmVudFJhbmdlVW5pdCwgaXNSYW5nZUFsbERheSkge1xuICAgICAgICByZXR1cm4gY3VycmVudFJhbmdlO1xuICAgIH07XG4gICAgLy8gQ29tcHV0ZSB0aGUgZHVyYXRpb24gdmFsdWUgdGhhdCBzaG91bGQgYmUgYWRkZWQvc3Vic3RyYWN0ZWQgdG8gdGhlIGN1cnJlbnQgZGF0ZVxuICAgIC8vIHdoZW4gYSBwcmV2L25leHQgb3BlcmF0aW9uIGhhcHBlbnMuXG4gICAgRGF0ZVByb2ZpbGVHZW5lcmF0b3IucHJvdG90eXBlLmJ1aWxkRGF0ZUluY3JlbWVudCA9IGZ1bmN0aW9uIChmYWxsYmFjaykge1xuICAgICAgICB2YXIgZGF0ZUluY3JlbWVudCA9IHRoaXMucHJvcHMuZGF0ZUluY3JlbWVudDtcbiAgICAgICAgdmFyIGN1c3RvbUFsaWdubWVudDtcbiAgICAgICAgaWYgKGRhdGVJbmNyZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRlSW5jcmVtZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICgoY3VzdG9tQWxpZ25tZW50ID0gdGhpcy5wcm9wcy5kYXRlQWxpZ25tZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKDEsIGN1c3RvbUFsaWdubWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKHsgZGF5czogMSB9KTtcbiAgICB9O1xuICAgIERhdGVQcm9maWxlR2VuZXJhdG9yLnByb3RvdHlwZS5yZWZpbmVSYW5nZSA9IGZ1bmN0aW9uIChyYW5nZUlucHV0KSB7XG4gICAgICAgIGlmIChyYW5nZUlucHV0KSB7XG4gICAgICAgICAgICB2YXIgcmFuZ2UgPSBwYXJzZVJhbmdlKHJhbmdlSW5wdXQsIHRoaXMucHJvcHMuZGF0ZUVudik7XG4gICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICByYW5nZSA9IGNvbXB1dGVWaXNpYmxlRGF5UmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJhbmdlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgLyogSGlkZGVuIERheXNcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuICAgIC8vIEluaXRpYWxpemVzIGludGVybmFsIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhbGN1bGF0aW5nIGhpZGRlbiBkYXlzLW9mLXdlZWtcbiAgICBEYXRlUHJvZmlsZUdlbmVyYXRvci5wcm90b3R5cGUuaW5pdEhpZGRlbkRheXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBoaWRkZW5EYXlzID0gdGhpcy5wcm9wcy5oaWRkZW5EYXlzIHx8IFtdOyAvLyBhcnJheSBvZiBkYXktb2Ytd2VlayBpbmRpY2VzIHRoYXQgYXJlIGhpZGRlblxuICAgICAgICB2YXIgaXNIaWRkZW5EYXlIYXNoID0gW107IC8vIGlzIHRoZSBkYXktb2Ytd2VlayBoaWRkZW4/IChoYXNoIHdpdGggZGF5LW9mLXdlZWstaW5kZXggLT4gYm9vbClcbiAgICAgICAgdmFyIGRheUNudCA9IDA7XG4gICAgICAgIHZhciBpO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy53ZWVrZW5kcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGhpZGRlbkRheXMucHVzaCgwLCA2KTsgLy8gMD1zdW5kYXksIDY9c2F0dXJkYXlcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSArPSAxKSB7XG4gICAgICAgICAgICBpZiAoIShpc0hpZGRlbkRheUhhc2hbaV0gPSBoaWRkZW5EYXlzLmluZGV4T2YoaSkgIT09IC0xKSkge1xuICAgICAgICAgICAgICAgIGRheUNudCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZGF5Q250KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaGlkZGVuRGF5cycpOyAvLyBhbGwgZGF5cyB3ZXJlIGhpZGRlbj8gYmFkLlxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNIaWRkZW5EYXlIYXNoID0gaXNIaWRkZW5EYXlIYXNoO1xuICAgIH07XG4gICAgLy8gUmVtb3ZlIGRheXMgZnJvbSB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIHJhbmdlIHRoYXQgYXJlIGNvbXB1dGVkIGFzIGhpZGRlbi5cbiAgICAvLyBJZiB0aGUgd2hvbGUgcmFuZ2UgaXMgdHJpbW1lZCBvZmYsIHJldHVybnMgbnVsbFxuICAgIERhdGVQcm9maWxlR2VuZXJhdG9yLnByb3RvdHlwZS50cmltSGlkZGVuRGF5cyA9IGZ1bmN0aW9uIChyYW5nZSkge1xuICAgICAgICB2YXIgc3RhcnQgPSByYW5nZS5zdGFydCwgZW5kID0gcmFuZ2UuZW5kO1xuICAgICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5za2lwSGlkZGVuRGF5cyhzdGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZCkge1xuICAgICAgICAgICAgZW5kID0gdGhpcy5za2lwSGlkZGVuRGF5cyhlbmQsIC0xLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnQgPT0gbnVsbCB8fCBlbmQgPT0gbnVsbCB8fCBzdGFydCA8IGVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgLy8gSXMgdGhlIGN1cnJlbnQgZGF5IGhpZGRlbj9cbiAgICAvLyBgZGF5YCBpcyBhIGRheS1vZi13ZWVrIGluZGV4ICgwLTYpLCBvciBhIERhdGUgKHVzZWQgZm9yIFVUQylcbiAgICBEYXRlUHJvZmlsZUdlbmVyYXRvci5wcm90b3R5cGUuaXNIaWRkZW5EYXkgPSBmdW5jdGlvbiAoZGF5KSB7XG4gICAgICAgIGlmIChkYXkgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICBkYXkgPSBkYXkuZ2V0VVRDRGF5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNIaWRkZW5EYXlIYXNoW2RheV07XG4gICAgfTtcbiAgICAvLyBJbmNyZW1lbnRpbmcgdGhlIGN1cnJlbnQgZGF5IHVudGlsIGl0IGlzIG5vIGxvbmdlciBhIGhpZGRlbiBkYXksIHJldHVybmluZyBhIGNvcHkuXG4gICAgLy8gRE9FUyBOT1QgQ09OU0lERVIgdmFsaWRSYW5nZSFcbiAgICAvLyBJZiB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBgZGF0ZWAgaXMgbm90IGEgaGlkZGVuIGRheSwgZG9uJ3QgZG8gYW55dGhpbmcuXG4gICAgLy8gUGFzcyBgaXNFeGNsdXNpdmVgIGFzIGB0cnVlYCBpZiB5b3UgYXJlIGRlYWxpbmcgd2l0aCBhbiBlbmQgZGF0ZS5cbiAgICAvLyBgaW5jYCBkZWZhdWx0cyB0byBgMWAgKGluY3JlbWVudCBvbmUgZGF5IGZvcndhcmQgZWFjaCB0aW1lKVxuICAgIERhdGVQcm9maWxlR2VuZXJhdG9yLnByb3RvdHlwZS5za2lwSGlkZGVuRGF5cyA9IGZ1bmN0aW9uIChkYXRlLCBpbmMsIGlzRXhjbHVzaXZlKSB7XG4gICAgICAgIGlmIChpbmMgPT09IHZvaWQgMCkgeyBpbmMgPSAxOyB9XG4gICAgICAgIGlmIChpc0V4Y2x1c2l2ZSA9PT0gdm9pZCAwKSB7IGlzRXhjbHVzaXZlID0gZmFsc2U7IH1cbiAgICAgICAgd2hpbGUgKHRoaXMuaXNIaWRkZW5EYXlIYXNoWyhkYXRlLmdldFVUQ0RheSgpICsgKGlzRXhjbHVzaXZlID8gaW5jIDogMCkgKyA3KSAlIDddKSB7XG4gICAgICAgICAgICBkYXRlID0gYWRkRGF5cyhkYXRlLCBpbmMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH07XG4gICAgcmV0dXJuIERhdGVQcm9maWxlR2VuZXJhdG9yO1xufSgpKTtcblxuZnVuY3Rpb24gcmVkdWNlVmlld1R5cGUodmlld1R5cGUsIGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnQ0hBTkdFX1ZJRVdfVFlQRSc6XG4gICAgICAgICAgICB2aWV3VHlwZSA9IGFjdGlvbi52aWV3VHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIHZpZXdUeXBlO1xufVxuXG5mdW5jdGlvbiByZWR1Y2VEeW5hbWljT3B0aW9uT3ZlcnJpZGVzKGR5bmFtaWNPcHRpb25PdmVycmlkZXMsIGFjdGlvbikge1xuICAgIHZhciBfYTtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ1NFVF9PUFRJT04nOlxuICAgICAgICAgICAgcmV0dXJuIHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzKSwgKF9hID0ge30sIF9hW2FjdGlvbi5vcHRpb25OYW1lXSA9IGFjdGlvbi5yYXdPcHRpb25WYWx1ZSwgX2EpKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVkdWNlRGF0ZVByb2ZpbGUoY3VycmVudERhdGVQcm9maWxlLCBhY3Rpb24sIGN1cnJlbnREYXRlLCBkYXRlUHJvZmlsZUdlbmVyYXRvcikge1xuICAgIHZhciBkcDtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0NIQU5HRV9WSUVXX1RZUEUnOlxuICAgICAgICAgICAgcmV0dXJuIGRhdGVQcm9maWxlR2VuZXJhdG9yLmJ1aWxkKGFjdGlvbi5kYXRlTWFya2VyIHx8IGN1cnJlbnREYXRlKTtcbiAgICAgICAgY2FzZSAnQ0hBTkdFX0RBVEUnOlxuICAgICAgICAgICAgcmV0dXJuIGRhdGVQcm9maWxlR2VuZXJhdG9yLmJ1aWxkKGFjdGlvbi5kYXRlTWFya2VyKTtcbiAgICAgICAgY2FzZSAnUFJFVic6XG4gICAgICAgICAgICBkcCA9IGRhdGVQcm9maWxlR2VuZXJhdG9yLmJ1aWxkUHJldihjdXJyZW50RGF0ZVByb2ZpbGUsIGN1cnJlbnREYXRlKTtcbiAgICAgICAgICAgIGlmIChkcC5pc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ05FWFQnOlxuICAgICAgICAgICAgZHAgPSBkYXRlUHJvZmlsZUdlbmVyYXRvci5idWlsZE5leHQoY3VycmVudERhdGVQcm9maWxlLCBjdXJyZW50RGF0ZSk7XG4gICAgICAgICAgICBpZiAoZHAuaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudERhdGVQcm9maWxlO1xufVxuXG5mdW5jdGlvbiBpbml0RXZlbnRTb3VyY2VzKGNhbGVuZGFyT3B0aW9ucywgZGF0ZVByb2ZpbGUsIGNvbnRleHQpIHtcbiAgICB2YXIgYWN0aXZlUmFuZ2UgPSBkYXRlUHJvZmlsZSA/IGRhdGVQcm9maWxlLmFjdGl2ZVJhbmdlIDogbnVsbDtcbiAgICByZXR1cm4gYWRkU291cmNlcyh7fSwgcGFyc2VJbml0aWFsU291cmNlcyhjYWxlbmRhck9wdGlvbnMsIGNvbnRleHQpLCBhY3RpdmVSYW5nZSwgY29udGV4dCk7XG59XG5mdW5jdGlvbiByZWR1Y2VFdmVudFNvdXJjZXMoZXZlbnRTb3VyY2VzLCBhY3Rpb24sIGRhdGVQcm9maWxlLCBjb250ZXh0KSB7XG4gICAgdmFyIGFjdGl2ZVJhbmdlID0gZGF0ZVByb2ZpbGUgPyBkYXRlUHJvZmlsZS5hY3RpdmVSYW5nZSA6IG51bGw7IC8vIG5lZWQgdGhpcyBjaGVjaz9cbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0FERF9FVkVOVF9TT1VSQ0VTJzogLy8gYWxyZWFkeSBwYXJzZWRcbiAgICAgICAgICAgIHJldHVybiBhZGRTb3VyY2VzKGV2ZW50U291cmNlcywgYWN0aW9uLnNvdXJjZXMsIGFjdGl2ZVJhbmdlLCBjb250ZXh0KTtcbiAgICAgICAgY2FzZSAnUkVNT1ZFX0VWRU5UX1NPVVJDRSc6XG4gICAgICAgICAgICByZXR1cm4gcmVtb3ZlU291cmNlKGV2ZW50U291cmNlcywgYWN0aW9uLnNvdXJjZUlkKTtcbiAgICAgICAgY2FzZSAnUFJFVic6IC8vIFRPRE86IGhvdyBkbyB3ZSB0cmFjayBhbGwgYWN0aW9ucyB0aGF0IGFmZmVjdCBkYXRlUHJvZmlsZSA6KFxuICAgICAgICBjYXNlICdORVhUJzpcbiAgICAgICAgY2FzZSAnQ0hBTkdFX0RBVEUnOlxuICAgICAgICBjYXNlICdDSEFOR0VfVklFV19UWVBFJzpcbiAgICAgICAgICAgIGlmIChkYXRlUHJvZmlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaERpcnR5U291cmNlcyhldmVudFNvdXJjZXMsIGFjdGl2ZVJhbmdlLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBldmVudFNvdXJjZXM7XG4gICAgICAgIGNhc2UgJ0ZFVENIX0VWRU5UX1NPVVJDRVMnOlxuICAgICAgICAgICAgcmV0dXJuIGZldGNoU291cmNlc0J5SWRzKGV2ZW50U291cmNlcywgYWN0aW9uLnNvdXJjZUlkcyA/IC8vIHdoeSBubyB0eXBlP1xuICAgICAgICAgICAgICAgIGFycmF5VG9IYXNoKGFjdGlvbi5zb3VyY2VJZHMpIDpcbiAgICAgICAgICAgICAgICBleGNsdWRlU3RhdGljU291cmNlcyhldmVudFNvdXJjZXMsIGNvbnRleHQpLCBhY3RpdmVSYW5nZSwgYWN0aW9uLmlzUmVmZXRjaCB8fCBmYWxzZSwgY29udGV4dCk7XG4gICAgICAgIGNhc2UgJ1JFQ0VJVkVfRVZFTlRTJzpcbiAgICAgICAgY2FzZSAnUkVDRUlWRV9FVkVOVF9FUlJPUic6XG4gICAgICAgICAgICByZXR1cm4gcmVjZWl2ZVJlc3BvbnNlKGV2ZW50U291cmNlcywgYWN0aW9uLnNvdXJjZUlkLCBhY3Rpb24uZmV0Y2hJZCwgYWN0aW9uLmZldGNoUmFuZ2UpO1xuICAgICAgICBjYXNlICdSRU1PVkVfQUxMX0VWRU5UX1NPVVJDRVMnOlxuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGV2ZW50U291cmNlcztcbiAgICB9XG59XG5mdW5jdGlvbiByZWR1Y2VFdmVudFNvdXJjZXNOZXdUaW1lWm9uZShldmVudFNvdXJjZXMsIGRhdGVQcm9maWxlLCBjb250ZXh0KSB7XG4gICAgdmFyIGFjdGl2ZVJhbmdlID0gZGF0ZVByb2ZpbGUgPyBkYXRlUHJvZmlsZS5hY3RpdmVSYW5nZSA6IG51bGw7IC8vIG5lZWQgdGhpcyBjaGVjaz9cbiAgICByZXR1cm4gZmV0Y2hTb3VyY2VzQnlJZHMoZXZlbnRTb3VyY2VzLCBleGNsdWRlU3RhdGljU291cmNlcyhldmVudFNvdXJjZXMsIGNvbnRleHQpLCBhY3RpdmVSYW5nZSwgdHJ1ZSwgY29udGV4dCk7XG59XG5mdW5jdGlvbiBjb21wdXRlRXZlbnRTb3VyY2VzTG9hZGluZyhldmVudFNvdXJjZXMpIHtcbiAgICBmb3IgKHZhciBzb3VyY2VJZCBpbiBldmVudFNvdXJjZXMpIHtcbiAgICAgICAgaWYgKGV2ZW50U291cmNlc1tzb3VyY2VJZF0uaXNGZXRjaGluZykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gYWRkU291cmNlcyhldmVudFNvdXJjZUhhc2gsIHNvdXJjZXMsIGZldGNoUmFuZ2UsIGNvbnRleHQpIHtcbiAgICB2YXIgaGFzaCA9IHt9O1xuICAgIGZvciAodmFyIF9pID0gMCwgc291cmNlc18xID0gc291cmNlczsgX2kgPCBzb3VyY2VzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzXzFbX2ldO1xuICAgICAgICBoYXNoW3NvdXJjZS5zb3VyY2VJZF0gPSBzb3VyY2U7XG4gICAgfVxuICAgIGlmIChmZXRjaFJhbmdlKSB7XG4gICAgICAgIGhhc2ggPSBmZXRjaERpcnR5U291cmNlcyhoYXNoLCBmZXRjaFJhbmdlLCBjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBldmVudFNvdXJjZUhhc2gpLCBoYXNoKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVNvdXJjZShldmVudFNvdXJjZUhhc2gsIHNvdXJjZUlkKSB7XG4gICAgcmV0dXJuIGZpbHRlckhhc2goZXZlbnRTb3VyY2VIYXNoLCBmdW5jdGlvbiAoZXZlbnRTb3VyY2UpIHsgcmV0dXJuIGV2ZW50U291cmNlLnNvdXJjZUlkICE9PSBzb3VyY2VJZDsgfSk7XG59XG5mdW5jdGlvbiBmZXRjaERpcnR5U291cmNlcyhzb3VyY2VIYXNoLCBmZXRjaFJhbmdlLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZldGNoU291cmNlc0J5SWRzKHNvdXJjZUhhc2gsIGZpbHRlckhhc2goc291cmNlSGFzaCwgZnVuY3Rpb24gKGV2ZW50U291cmNlKSB7IHJldHVybiBpc1NvdXJjZURpcnR5KGV2ZW50U291cmNlLCBmZXRjaFJhbmdlLCBjb250ZXh0KTsgfSksIGZldGNoUmFuZ2UsIGZhbHNlLCBjb250ZXh0KTtcbn1cbmZ1bmN0aW9uIGlzU291cmNlRGlydHkoZXZlbnRTb3VyY2UsIGZldGNoUmFuZ2UsIGNvbnRleHQpIHtcbiAgICBpZiAoIWRvZXNTb3VyY2VOZWVkUmFuZ2UoZXZlbnRTb3VyY2UsIGNvbnRleHQpKSB7XG4gICAgICAgIHJldHVybiAhZXZlbnRTb3VyY2UubGF0ZXN0RmV0Y2hJZDtcbiAgICB9XG4gICAgcmV0dXJuICFjb250ZXh0Lm9wdGlvbnMubGF6eUZldGNoaW5nIHx8XG4gICAgICAgICFldmVudFNvdXJjZS5mZXRjaFJhbmdlIHx8XG4gICAgICAgIGV2ZW50U291cmNlLmlzRmV0Y2hpbmcgfHwgLy8gYWx3YXlzIGNhbmNlbCBvdXRkYXRlZCBpbi1wcm9ncmVzcyBmZXRjaGVzXG4gICAgICAgIGZldGNoUmFuZ2Uuc3RhcnQgPCBldmVudFNvdXJjZS5mZXRjaFJhbmdlLnN0YXJ0IHx8XG4gICAgICAgIGZldGNoUmFuZ2UuZW5kID4gZXZlbnRTb3VyY2UuZmV0Y2hSYW5nZS5lbmQ7XG59XG5mdW5jdGlvbiBmZXRjaFNvdXJjZXNCeUlkcyhwcmV2U291cmNlcywgc291cmNlSWRIYXNoLCBmZXRjaFJhbmdlLCBpc1JlZmV0Y2gsIGNvbnRleHQpIHtcbiAgICB2YXIgbmV4dFNvdXJjZXMgPSB7fTtcbiAgICBmb3IgKHZhciBzb3VyY2VJZCBpbiBwcmV2U291cmNlcykge1xuICAgICAgICB2YXIgc291cmNlID0gcHJldlNvdXJjZXNbc291cmNlSWRdO1xuICAgICAgICBpZiAoc291cmNlSWRIYXNoW3NvdXJjZUlkXSkge1xuICAgICAgICAgICAgbmV4dFNvdXJjZXNbc291cmNlSWRdID0gZmV0Y2hTb3VyY2Uoc291cmNlLCBmZXRjaFJhbmdlLCBpc1JlZmV0Y2gsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmV4dFNvdXJjZXNbc291cmNlSWRdID0gc291cmNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXh0U291cmNlcztcbn1cbmZ1bmN0aW9uIGZldGNoU291cmNlKGV2ZW50U291cmNlLCBmZXRjaFJhbmdlLCBpc1JlZmV0Y2gsIGNvbnRleHQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGNvbnRleHQub3B0aW9ucywgY2FsZW5kYXJBcGkgPSBjb250ZXh0LmNhbGVuZGFyQXBpO1xuICAgIHZhciBzb3VyY2VEZWYgPSBjb250ZXh0LnBsdWdpbkhvb2tzLmV2ZW50U291cmNlRGVmc1tldmVudFNvdXJjZS5zb3VyY2VEZWZJZF07XG4gICAgdmFyIGZldGNoSWQgPSBndWlkKCk7XG4gICAgc291cmNlRGVmLmZldGNoKHtcbiAgICAgICAgZXZlbnRTb3VyY2U6IGV2ZW50U291cmNlLFxuICAgICAgICByYW5nZTogZmV0Y2hSYW5nZSxcbiAgICAgICAgaXNSZWZldGNoOiBpc1JlZmV0Y2gsXG4gICAgICAgIGNvbnRleHQ6IGNvbnRleHQsXG4gICAgfSwgZnVuY3Rpb24gKHJlcykge1xuICAgICAgICB2YXIgcmF3RXZlbnRzID0gcmVzLnJhd0V2ZW50cztcbiAgICAgICAgaWYgKG9wdGlvbnMuZXZlbnRTb3VyY2VTdWNjZXNzKSB7XG4gICAgICAgICAgICByYXdFdmVudHMgPSBvcHRpb25zLmV2ZW50U291cmNlU3VjY2Vzcy5jYWxsKGNhbGVuZGFyQXBpLCByYXdFdmVudHMsIHJlcy54aHIpIHx8IHJhd0V2ZW50cztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnRTb3VyY2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgcmF3RXZlbnRzID0gZXZlbnRTb3VyY2Uuc3VjY2Vzcy5jYWxsKGNhbGVuZGFyQXBpLCByYXdFdmVudHMsIHJlcy54aHIpIHx8IHJhd0V2ZW50cztcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdSRUNFSVZFX0VWRU5UUycsXG4gICAgICAgICAgICBzb3VyY2VJZDogZXZlbnRTb3VyY2Uuc291cmNlSWQsXG4gICAgICAgICAgICBmZXRjaElkOiBmZXRjaElkLFxuICAgICAgICAgICAgZmV0Y2hSYW5nZTogZmV0Y2hSYW5nZSxcbiAgICAgICAgICAgIHJhd0V2ZW50czogcmF3RXZlbnRzLFxuICAgICAgICB9KTtcbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGVycm9yLm1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZXZlbnRTb3VyY2VGYWlsdXJlKSB7XG4gICAgICAgICAgICBvcHRpb25zLmV2ZW50U291cmNlRmFpbHVyZS5jYWxsKGNhbGVuZGFyQXBpLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50U291cmNlLmZhaWx1cmUpIHtcbiAgICAgICAgICAgIGV2ZW50U291cmNlLmZhaWx1cmUoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ1JFQ0VJVkVfRVZFTlRfRVJST1InLFxuICAgICAgICAgICAgc291cmNlSWQ6IGV2ZW50U291cmNlLnNvdXJjZUlkLFxuICAgICAgICAgICAgZmV0Y2hJZDogZmV0Y2hJZCxcbiAgICAgICAgICAgIGZldGNoUmFuZ2U6IGZldGNoUmFuZ2UsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgZXZlbnRTb3VyY2UpLCB7IGlzRmV0Y2hpbmc6IHRydWUsIGxhdGVzdEZldGNoSWQ6IGZldGNoSWQgfSk7XG59XG5mdW5jdGlvbiByZWNlaXZlUmVzcG9uc2Uoc291cmNlSGFzaCwgc291cmNlSWQsIGZldGNoSWQsIGZldGNoUmFuZ2UpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGV2ZW50U291cmNlID0gc291cmNlSGFzaFtzb3VyY2VJZF07XG4gICAgaWYgKGV2ZW50U291cmNlICYmIC8vIG5vdCBhbHJlYWR5IHJlbW92ZWRcbiAgICAgICAgZmV0Y2hJZCA9PT0gZXZlbnRTb3VyY2UubGF0ZXN0RmV0Y2hJZCkge1xuICAgICAgICByZXR1cm4gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIHNvdXJjZUhhc2gpLCAoX2EgPSB7fSwgX2Fbc291cmNlSWRdID0gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGV2ZW50U291cmNlKSwgeyBpc0ZldGNoaW5nOiBmYWxzZSwgZmV0Y2hSYW5nZTogZmV0Y2hSYW5nZSB9KSwgX2EpKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZUhhc2g7XG59XG5mdW5jdGlvbiBleGNsdWRlU3RhdGljU291cmNlcyhldmVudFNvdXJjZXMsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gZmlsdGVySGFzaChldmVudFNvdXJjZXMsIGZ1bmN0aW9uIChldmVudFNvdXJjZSkgeyByZXR1cm4gZG9lc1NvdXJjZU5lZWRSYW5nZShldmVudFNvdXJjZSwgY29udGV4dCk7IH0pO1xufVxuZnVuY3Rpb24gcGFyc2VJbml0aWFsU291cmNlcyhyYXdPcHRpb25zLCBjb250ZXh0KSB7XG4gICAgdmFyIHJlZmluZXJzID0gYnVpbGRFdmVudFNvdXJjZVJlZmluZXJzKGNvbnRleHQpO1xuICAgIHZhciByYXdTb3VyY2VzID0gW10uY29uY2F0KHJhd09wdGlvbnMuZXZlbnRTb3VyY2VzIHx8IFtdKTtcbiAgICB2YXIgc291cmNlcyA9IFtdOyAvLyBwYXJzZWRcbiAgICBpZiAocmF3T3B0aW9ucy5pbml0aWFsRXZlbnRzKSB7XG4gICAgICAgIHJhd1NvdXJjZXMudW5zaGlmdChyYXdPcHRpb25zLmluaXRpYWxFdmVudHMpO1xuICAgIH1cbiAgICBpZiAocmF3T3B0aW9ucy5ldmVudHMpIHtcbiAgICAgICAgcmF3U291cmNlcy51bnNoaWZ0KHJhd09wdGlvbnMuZXZlbnRzKTtcbiAgICB9XG4gICAgZm9yICh2YXIgX2kgPSAwLCByYXdTb3VyY2VzXzEgPSByYXdTb3VyY2VzOyBfaSA8IHJhd1NvdXJjZXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHJhd1NvdXJjZSA9IHJhd1NvdXJjZXNfMVtfaV07XG4gICAgICAgIHZhciBzb3VyY2UgPSBwYXJzZUV2ZW50U291cmNlKHJhd1NvdXJjZSwgY29udGV4dCwgcmVmaW5lcnMpO1xuICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc291cmNlcztcbn1cbmZ1bmN0aW9uIGRvZXNTb3VyY2VOZWVkUmFuZ2UoZXZlbnRTb3VyY2UsIGNvbnRleHQpIHtcbiAgICB2YXIgZGVmcyA9IGNvbnRleHQucGx1Z2luSG9va3MuZXZlbnRTb3VyY2VEZWZzO1xuICAgIHJldHVybiAhZGVmc1tldmVudFNvdXJjZS5zb3VyY2VEZWZJZF0uaWdub3JlUmFuZ2U7XG59XG5cbmZ1bmN0aW9uIHJlZHVjZUV2ZW50U3RvcmUoZXZlbnRTdG9yZSwgYWN0aW9uLCBldmVudFNvdXJjZXMsIGRhdGVQcm9maWxlLCBjb250ZXh0KSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdSRUNFSVZFX0VWRU5UUyc6IC8vIHJhd1xuICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVSYXdFdmVudHMoZXZlbnRTdG9yZSwgZXZlbnRTb3VyY2VzW2FjdGlvbi5zb3VyY2VJZF0sIGFjdGlvbi5mZXRjaElkLCBhY3Rpb24uZmV0Y2hSYW5nZSwgYWN0aW9uLnJhd0V2ZW50cywgY29udGV4dCk7XG4gICAgICAgIGNhc2UgJ0FERF9FVkVOVFMnOiAvLyBhbHJlYWR5IHBhcnNlZCwgYnV0IG5vdCBleHBhbmRlZFxuICAgICAgICAgICAgcmV0dXJuIGFkZEV2ZW50KGV2ZW50U3RvcmUsIGFjdGlvbi5ldmVudFN0b3JlLCAvLyBuZXcgb25lc1xuICAgICAgICAgICAgZGF0ZVByb2ZpbGUgPyBkYXRlUHJvZmlsZS5hY3RpdmVSYW5nZSA6IG51bGwsIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdSRVNFVF9FVkVOVFMnOlxuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5ldmVudFN0b3JlO1xuICAgICAgICBjYXNlICdNRVJHRV9FVkVOVFMnOiAvLyBhbHJlYWR5IHBhcnNlZCBhbmQgZXhwYW5kZWRcbiAgICAgICAgICAgIHJldHVybiBtZXJnZUV2ZW50U3RvcmVzKGV2ZW50U3RvcmUsIGFjdGlvbi5ldmVudFN0b3JlKTtcbiAgICAgICAgY2FzZSAnUFJFVic6IC8vIFRPRE86IGhvdyBkbyB3ZSB0cmFjayBhbGwgYWN0aW9ucyB0aGF0IGFmZmVjdCBkYXRlUHJvZmlsZSA6KFxuICAgICAgICBjYXNlICdORVhUJzpcbiAgICAgICAgY2FzZSAnQ0hBTkdFX0RBVEUnOlxuICAgICAgICBjYXNlICdDSEFOR0VfVklFV19UWVBFJzpcbiAgICAgICAgICAgIGlmIChkYXRlUHJvZmlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHBhbmRSZWN1cnJpbmcoZXZlbnRTdG9yZSwgZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2UsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV2ZW50U3RvcmU7XG4gICAgICAgIGNhc2UgJ1JFTU9WRV9FVkVOVFMnOlxuICAgICAgICAgICAgcmV0dXJuIGV4Y2x1ZGVTdWJFdmVudFN0b3JlKGV2ZW50U3RvcmUsIGFjdGlvbi5ldmVudFN0b3JlKTtcbiAgICAgICAgY2FzZSAnUkVNT1ZFX0VWRU5UX1NPVVJDRSc6XG4gICAgICAgICAgICByZXR1cm4gZXhjbHVkZUV2ZW50c0J5U291cmNlSWQoZXZlbnRTdG9yZSwgYWN0aW9uLnNvdXJjZUlkKTtcbiAgICAgICAgY2FzZSAnUkVNT1ZFX0FMTF9FVkVOVF9TT1VSQ0VTJzpcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJFdmVudFN0b3JlRGVmcyhldmVudFN0b3JlLCBmdW5jdGlvbiAoZXZlbnREZWYpIHsgcmV0dXJuICghZXZlbnREZWYuc291cmNlSWQgLy8gb25seSBrZWVwIGV2ZW50cyB3aXRoIG5vIHNvdXJjZSBpZFxuICAgICAgICAgICAgKTsgfSk7XG4gICAgICAgIGNhc2UgJ1JFTU9WRV9BTExfRVZFTlRTJzpcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVFbXB0eUV2ZW50U3RvcmUoKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBldmVudFN0b3JlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlY2VpdmVSYXdFdmVudHMoZXZlbnRTdG9yZSwgZXZlbnRTb3VyY2UsIGZldGNoSWQsIGZldGNoUmFuZ2UsIHJhd0V2ZW50cywgY29udGV4dCkge1xuICAgIGlmIChldmVudFNvdXJjZSAmJiAvLyBub3QgYWxyZWFkeSByZW1vdmVkXG4gICAgICAgIGZldGNoSWQgPT09IGV2ZW50U291cmNlLmxhdGVzdEZldGNoSWQgLy8gVE9ETzogd2lzaCB0aGlzIGxvZ2ljIHdhcyBhbHdheXMgaW4gZXZlbnQtc291cmNlc1xuICAgICkge1xuICAgICAgICB2YXIgc3Vic2V0ID0gcGFyc2VFdmVudHModHJhbnNmb3JtUmF3RXZlbnRzKHJhd0V2ZW50cywgZXZlbnRTb3VyY2UsIGNvbnRleHQpLCBldmVudFNvdXJjZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChmZXRjaFJhbmdlKSB7XG4gICAgICAgICAgICBzdWJzZXQgPSBleHBhbmRSZWN1cnJpbmcoc3Vic2V0LCBmZXRjaFJhbmdlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVyZ2VFdmVudFN0b3JlcyhleGNsdWRlRXZlbnRzQnlTb3VyY2VJZChldmVudFN0b3JlLCBldmVudFNvdXJjZS5zb3VyY2VJZCksIHN1YnNldCk7XG4gICAgfVxuICAgIHJldHVybiBldmVudFN0b3JlO1xufVxuZnVuY3Rpb24gdHJhbnNmb3JtUmF3RXZlbnRzKHJhd0V2ZW50cywgZXZlbnRTb3VyY2UsIGNvbnRleHQpIHtcbiAgICB2YXIgY2FsRWFjaFRyYW5zZm9ybSA9IGNvbnRleHQub3B0aW9ucy5ldmVudERhdGFUcmFuc2Zvcm07XG4gICAgdmFyIHNvdXJjZUVhY2hUcmFuc2Zvcm0gPSBldmVudFNvdXJjZSA/IGV2ZW50U291cmNlLmV2ZW50RGF0YVRyYW5zZm9ybSA6IG51bGw7XG4gICAgaWYgKHNvdXJjZUVhY2hUcmFuc2Zvcm0pIHtcbiAgICAgICAgcmF3RXZlbnRzID0gdHJhbnNmb3JtRWFjaFJhd0V2ZW50KHJhd0V2ZW50cywgc291cmNlRWFjaFRyYW5zZm9ybSk7XG4gICAgfVxuICAgIGlmIChjYWxFYWNoVHJhbnNmb3JtKSB7XG4gICAgICAgIHJhd0V2ZW50cyA9IHRyYW5zZm9ybUVhY2hSYXdFdmVudChyYXdFdmVudHMsIGNhbEVhY2hUcmFuc2Zvcm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmF3RXZlbnRzO1xufVxuZnVuY3Rpb24gdHJhbnNmb3JtRWFjaFJhd0V2ZW50KHJhd0V2ZW50cywgZnVuYykge1xuICAgIHZhciByZWZpbmVkRXZlbnRzO1xuICAgIGlmICghZnVuYykge1xuICAgICAgICByZWZpbmVkRXZlbnRzID0gcmF3RXZlbnRzO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVmaW5lZEV2ZW50cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIHJhd0V2ZW50c18xID0gcmF3RXZlbnRzOyBfaSA8IHJhd0V2ZW50c18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIHJhd0V2ZW50ID0gcmF3RXZlbnRzXzFbX2ldO1xuICAgICAgICAgICAgdmFyIHJlZmluZWRFdmVudCA9IGZ1bmMocmF3RXZlbnQpO1xuICAgICAgICAgICAgaWYgKHJlZmluZWRFdmVudCkge1xuICAgICAgICAgICAgICAgIHJlZmluZWRFdmVudHMucHVzaChyZWZpbmVkRXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVmaW5lZEV2ZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZWZpbmVkRXZlbnRzLnB1c2gocmF3RXZlbnQpO1xuICAgICAgICAgICAgfSAvLyBpZiBhIGRpZmZlcmVudCBmYWxzeSB2YWx1ZSwgZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZWZpbmVkRXZlbnRzO1xufVxuZnVuY3Rpb24gYWRkRXZlbnQoZXZlbnRTdG9yZSwgc3Vic2V0LCBleHBhbmRSYW5nZSwgY29udGV4dCkge1xuICAgIGlmIChleHBhbmRSYW5nZSkge1xuICAgICAgICBzdWJzZXQgPSBleHBhbmRSZWN1cnJpbmcoc3Vic2V0LCBleHBhbmRSYW5nZSwgY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBtZXJnZUV2ZW50U3RvcmVzKGV2ZW50U3RvcmUsIHN1YnNldCk7XG59XG5mdW5jdGlvbiByZXpvbmVFdmVudFN0b3JlRGF0ZXMoZXZlbnRTdG9yZSwgb2xkRGF0ZUVudiwgbmV3RGF0ZUVudikge1xuICAgIHZhciBkZWZzID0gZXZlbnRTdG9yZS5kZWZzO1xuICAgIHZhciBpbnN0YW5jZXMgPSBtYXBIYXNoKGV2ZW50U3RvcmUuaW5zdGFuY2VzLCBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgdmFyIGRlZiA9IGRlZnNbaW5zdGFuY2UuZGVmSWRdO1xuICAgICAgICBpZiAoZGVmLmFsbERheSB8fCBkZWYucmVjdXJyaW5nRGVmKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7IC8vIGlzbid0IGRlcGVuZGVudCBvbiB0aW1lem9uZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgaW5zdGFuY2UpLCB7IHJhbmdlOiB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IG5ld0RhdGVFbnYuY3JlYXRlTWFya2VyKG9sZERhdGVFbnYudG9EYXRlKGluc3RhbmNlLnJhbmdlLnN0YXJ0LCBpbnN0YW5jZS5mb3JjZWRTdGFydFR6bykpLFxuICAgICAgICAgICAgICAgIGVuZDogbmV3RGF0ZUVudi5jcmVhdGVNYXJrZXIob2xkRGF0ZUVudi50b0RhdGUoaW5zdGFuY2UucmFuZ2UuZW5kLCBpbnN0YW5jZS5mb3JjZWRFbmRUem8pKSxcbiAgICAgICAgICAgIH0sIGZvcmNlZFN0YXJ0VHpvOiBuZXdEYXRlRW52LmNhbkNvbXB1dGVPZmZzZXQgPyBudWxsIDogaW5zdGFuY2UuZm9yY2VkU3RhcnRUem8sIGZvcmNlZEVuZFR6bzogbmV3RGF0ZUVudi5jYW5Db21wdXRlT2Zmc2V0ID8gbnVsbCA6IGluc3RhbmNlLmZvcmNlZEVuZFR6byB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4geyBkZWZzOiBkZWZzLCBpbnN0YW5jZXM6IGluc3RhbmNlcyB9O1xufVxuZnVuY3Rpb24gZXhjbHVkZUV2ZW50c0J5U291cmNlSWQoZXZlbnRTdG9yZSwgc291cmNlSWQpIHtcbiAgICByZXR1cm4gZmlsdGVyRXZlbnRTdG9yZURlZnMoZXZlbnRTdG9yZSwgZnVuY3Rpb24gKGV2ZW50RGVmKSB7IHJldHVybiBldmVudERlZi5zb3VyY2VJZCAhPT0gc291cmNlSWQ7IH0pO1xufVxuLy8gUVVFU1RJT046IHdoeSBub3QganVzdCByZXR1cm4gaW5zdGFuY2VzPyBkbyBhIGdlbmVyYWwgb2JqZWN0LXByb3BlcnR5LWV4Y2x1c2lvbiB1dGlsXG5mdW5jdGlvbiBleGNsdWRlSW5zdGFuY2VzKGV2ZW50U3RvcmUsIHJlbW92YWxzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVmczogZXZlbnRTdG9yZS5kZWZzLFxuICAgICAgICBpbnN0YW5jZXM6IGZpbHRlckhhc2goZXZlbnRTdG9yZS5pbnN0YW5jZXMsIGZ1bmN0aW9uIChpbnN0YW5jZSkgeyByZXR1cm4gIXJlbW92YWxzW2luc3RhbmNlLmluc3RhbmNlSWRdOyB9KSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiByZWR1Y2VEYXRlU2VsZWN0aW9uKGN1cnJlbnRTZWxlY3Rpb24sIGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnVU5TRUxFQ1RfREFURVMnOlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgJ1NFTEVDVF9EQVRFUyc6XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnNlbGVjdGlvbjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50U2VsZWN0aW9uO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVkdWNlU2VsZWN0ZWRFdmVudChjdXJyZW50SW5zdGFuY2VJZCwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdVTlNFTEVDVF9FVkVOVCc6XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIGNhc2UgJ1NFTEVDVF9FVkVOVCc6XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uLmV2ZW50SW5zdGFuY2VJZDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50SW5zdGFuY2VJZDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlZHVjZUV2ZW50RHJhZyhjdXJyZW50RHJhZywgYWN0aW9uKSB7XG4gICAgdmFyIG5ld0RyYWc7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdVTlNFVF9FVkVOVF9EUkFHJzpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBjYXNlICdTRVRfRVZFTlRfRFJBRyc6XG4gICAgICAgICAgICBuZXdEcmFnID0gYWN0aW9uLnN0YXRlO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhZmZlY3RlZEV2ZW50czogbmV3RHJhZy5hZmZlY3RlZEV2ZW50cyxcbiAgICAgICAgICAgICAgICBtdXRhdGVkRXZlbnRzOiBuZXdEcmFnLm11dGF0ZWRFdmVudHMsXG4gICAgICAgICAgICAgICAgaXNFdmVudDogbmV3RHJhZy5pc0V2ZW50LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RHJhZztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlZHVjZUV2ZW50UmVzaXplKGN1cnJlbnRSZXNpemUsIGFjdGlvbikge1xuICAgIHZhciBuZXdSZXNpemU7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdVTlNFVF9FVkVOVF9SRVNJWkUnOlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgJ1NFVF9FVkVOVF9SRVNJWkUnOlxuICAgICAgICAgICAgbmV3UmVzaXplID0gYWN0aW9uLnN0YXRlO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhZmZlY3RlZEV2ZW50czogbmV3UmVzaXplLmFmZmVjdGVkRXZlbnRzLFxuICAgICAgICAgICAgICAgIG11dGF0ZWRFdmVudHM6IG5ld1Jlc2l6ZS5tdXRhdGVkRXZlbnRzLFxuICAgICAgICAgICAgICAgIGlzRXZlbnQ6IG5ld1Jlc2l6ZS5pc0V2ZW50LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50UmVzaXplO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VUb29sYmFycyhjYWxlbmRhck9wdGlvbnMsIGNhbGVuZGFyT3B0aW9uT3ZlcnJpZGVzLCB0aGVtZSwgdmlld1NwZWNzLCBjYWxlbmRhckFwaSkge1xuICAgIHZhciBoZWFkZXIgPSBjYWxlbmRhck9wdGlvbnMuaGVhZGVyVG9vbGJhciA/IHBhcnNlVG9vbGJhcihjYWxlbmRhck9wdGlvbnMuaGVhZGVyVG9vbGJhciwgY2FsZW5kYXJPcHRpb25zLCBjYWxlbmRhck9wdGlvbk92ZXJyaWRlcywgdGhlbWUsIHZpZXdTcGVjcywgY2FsZW5kYXJBcGkpIDogbnVsbDtcbiAgICB2YXIgZm9vdGVyID0gY2FsZW5kYXJPcHRpb25zLmZvb3RlclRvb2xiYXIgPyBwYXJzZVRvb2xiYXIoY2FsZW5kYXJPcHRpb25zLmZvb3RlclRvb2xiYXIsIGNhbGVuZGFyT3B0aW9ucywgY2FsZW5kYXJPcHRpb25PdmVycmlkZXMsIHRoZW1lLCB2aWV3U3BlY3MsIGNhbGVuZGFyQXBpKSA6IG51bGw7XG4gICAgcmV0dXJuIHsgaGVhZGVyOiBoZWFkZXIsIGZvb3RlcjogZm9vdGVyIH07XG59XG5mdW5jdGlvbiBwYXJzZVRvb2xiYXIoc2VjdGlvblN0ckhhc2gsIGNhbGVuZGFyT3B0aW9ucywgY2FsZW5kYXJPcHRpb25PdmVycmlkZXMsIHRoZW1lLCB2aWV3U3BlY3MsIGNhbGVuZGFyQXBpKSB7XG4gICAgdmFyIHNlY3Rpb25XaWRnZXRzID0ge307XG4gICAgdmFyIHZpZXdzV2l0aEJ1dHRvbnMgPSBbXTtcbiAgICB2YXIgaGFzVGl0bGUgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBzZWN0aW9uTmFtZSBpbiBzZWN0aW9uU3RySGFzaCkge1xuICAgICAgICB2YXIgc2VjdGlvblN0ciA9IHNlY3Rpb25TdHJIYXNoW3NlY3Rpb25OYW1lXTtcbiAgICAgICAgdmFyIHNlY3Rpb25SZXMgPSBwYXJzZVNlY3Rpb24oc2VjdGlvblN0ciwgY2FsZW5kYXJPcHRpb25zLCBjYWxlbmRhck9wdGlvbk92ZXJyaWRlcywgdGhlbWUsIHZpZXdTcGVjcywgY2FsZW5kYXJBcGkpO1xuICAgICAgICBzZWN0aW9uV2lkZ2V0c1tzZWN0aW9uTmFtZV0gPSBzZWN0aW9uUmVzLndpZGdldHM7XG4gICAgICAgIHZpZXdzV2l0aEJ1dHRvbnMucHVzaC5hcHBseSh2aWV3c1dpdGhCdXR0b25zLCBzZWN0aW9uUmVzLnZpZXdzV2l0aEJ1dHRvbnMpO1xuICAgICAgICBoYXNUaXRsZSA9IGhhc1RpdGxlIHx8IHNlY3Rpb25SZXMuaGFzVGl0bGU7XG4gICAgfVxuICAgIHJldHVybiB7IHNlY3Rpb25XaWRnZXRzOiBzZWN0aW9uV2lkZ2V0cywgdmlld3NXaXRoQnV0dG9uczogdmlld3NXaXRoQnV0dG9ucywgaGFzVGl0bGU6IGhhc1RpdGxlIH07XG59XG4vKlxuQkFEOiBxdWVyeWluZyBpY29ucyBhbmQgdGV4dCBoZXJlLiBzaG91bGQgYmUgZG9uZSBhdCByZW5kZXIgdGltZVxuKi9cbmZ1bmN0aW9uIHBhcnNlU2VjdGlvbihzZWN0aW9uU3RyLCBjYWxlbmRhck9wdGlvbnMsIC8vIGRlZmF1bHRzK292ZXJyaWRlcywgdGhlbiByZWZpbmVkXG5jYWxlbmRhck9wdGlvbk92ZXJyaWRlcywgLy8gb3ZlcnJpZGVzIG9ubHkhLCB1bnJlZmluZWQgOihcbnRoZW1lLCB2aWV3U3BlY3MsIGNhbGVuZGFyQXBpKSB7XG4gICAgdmFyIGlzUnRsID0gY2FsZW5kYXJPcHRpb25zLmRpcmVjdGlvbiA9PT0gJ3J0bCc7XG4gICAgdmFyIGNhbGVuZGFyQ3VzdG9tQnV0dG9ucyA9IGNhbGVuZGFyT3B0aW9ucy5jdXN0b21CdXR0b25zIHx8IHt9O1xuICAgIHZhciBjYWxlbmRhckJ1dHRvblRleHRPdmVycmlkZXMgPSBjYWxlbmRhck9wdGlvbk92ZXJyaWRlcy5idXR0b25UZXh0IHx8IHt9O1xuICAgIHZhciBjYWxlbmRhckJ1dHRvblRleHQgPSBjYWxlbmRhck9wdGlvbnMuYnV0dG9uVGV4dCB8fCB7fTtcbiAgICB2YXIgY2FsZW5kYXJCdXR0b25IaW50T3ZlcnJpZGVzID0gY2FsZW5kYXJPcHRpb25PdmVycmlkZXMuYnV0dG9uSGludHMgfHwge307XG4gICAgdmFyIGNhbGVuZGFyQnV0dG9uSGludHMgPSBjYWxlbmRhck9wdGlvbnMuYnV0dG9uSGludHMgfHwge307XG4gICAgdmFyIHNlY3Rpb25TdWJzdHJzID0gc2VjdGlvblN0ciA/IHNlY3Rpb25TdHIuc3BsaXQoJyAnKSA6IFtdO1xuICAgIHZhciB2aWV3c1dpdGhCdXR0b25zID0gW107XG4gICAgdmFyIGhhc1RpdGxlID0gZmFsc2U7XG4gICAgdmFyIHdpZGdldHMgPSBzZWN0aW9uU3Vic3Rycy5tYXAoZnVuY3Rpb24gKGJ1dHRvbkdyb3VwU3RyKSB7IHJldHVybiAoYnV0dG9uR3JvdXBTdHIuc3BsaXQoJywnKS5tYXAoZnVuY3Rpb24gKGJ1dHRvbk5hbWUpIHtcbiAgICAgICAgaWYgKGJ1dHRvbk5hbWUgPT09ICd0aXRsZScpIHtcbiAgICAgICAgICAgIGhhc1RpdGxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB7IGJ1dHRvbk5hbWU6IGJ1dHRvbk5hbWUgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY3VzdG9tQnV0dG9uUHJvcHM7XG4gICAgICAgIHZhciB2aWV3U3BlYztcbiAgICAgICAgdmFyIGJ1dHRvbkNsaWNrO1xuICAgICAgICB2YXIgYnV0dG9uSWNvbjsgLy8gb25seSBvbmUgb2YgdGhlc2Ugd2lsbCBiZSBzZXRcbiAgICAgICAgdmFyIGJ1dHRvblRleHQ7IC8vIFwiXG4gICAgICAgIHZhciBidXR0b25IaW50O1xuICAgICAgICAvLyBeIGZvciB0aGUgdGl0bGU9XCJcIiBhdHRyaWJ1dGUsIGZvciBhY2Nlc3NpYmlsaXR5XG4gICAgICAgIGlmICgoY3VzdG9tQnV0dG9uUHJvcHMgPSBjYWxlbmRhckN1c3RvbUJ1dHRvbnNbYnV0dG9uTmFtZV0pKSB7XG4gICAgICAgICAgICBidXR0b25DbGljayA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgICAgIGlmIChjdXN0b21CdXR0b25Qcm9wcy5jbGljaykge1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21CdXR0b25Qcm9wcy5jbGljay5jYWxsKGV2LnRhcmdldCwgZXYsIGV2LnRhcmdldCk7IC8vIFRPRE86IHVzZSBDYWxlbmRhciB0aGlzIGNvbnRleHQ/XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIChidXR0b25JY29uID0gdGhlbWUuZ2V0Q3VzdG9tQnV0dG9uSWNvbkNsYXNzKGN1c3RvbUJ1dHRvblByb3BzKSkgfHxcbiAgICAgICAgICAgICAgICAoYnV0dG9uSWNvbiA9IHRoZW1lLmdldEljb25DbGFzcyhidXR0b25OYW1lLCBpc1J0bCkpIHx8XG4gICAgICAgICAgICAgICAgKGJ1dHRvblRleHQgPSBjdXN0b21CdXR0b25Qcm9wcy50ZXh0KTtcbiAgICAgICAgICAgIGJ1dHRvbkhpbnQgPSBjdXN0b21CdXR0b25Qcm9wcy5oaW50IHx8IGN1c3RvbUJ1dHRvblByb3BzLnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKHZpZXdTcGVjID0gdmlld1NwZWNzW2J1dHRvbk5hbWVdKSkge1xuICAgICAgICAgICAgdmlld3NXaXRoQnV0dG9ucy5wdXNoKGJ1dHRvbk5hbWUpO1xuICAgICAgICAgICAgYnV0dG9uQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY2FsZW5kYXJBcGkuY2hhbmdlVmlldyhidXR0b25OYW1lKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAoYnV0dG9uVGV4dCA9IHZpZXdTcGVjLmJ1dHRvblRleHRPdmVycmlkZSkgfHxcbiAgICAgICAgICAgICAgICAoYnV0dG9uSWNvbiA9IHRoZW1lLmdldEljb25DbGFzcyhidXR0b25OYW1lLCBpc1J0bCkpIHx8XG4gICAgICAgICAgICAgICAgKGJ1dHRvblRleHQgPSB2aWV3U3BlYy5idXR0b25UZXh0RGVmYXVsdCk7XG4gICAgICAgICAgICB2YXIgdGV4dEZhbGxiYWNrID0gdmlld1NwZWMuYnV0dG9uVGV4dE92ZXJyaWRlIHx8XG4gICAgICAgICAgICAgICAgdmlld1NwZWMuYnV0dG9uVGV4dERlZmF1bHQ7XG4gICAgICAgICAgICBidXR0b25IaW50ID0gZm9ybWF0V2l0aE9yZGluYWxzKHZpZXdTcGVjLmJ1dHRvblRpdGxlT3ZlcnJpZGUgfHxcbiAgICAgICAgICAgICAgICB2aWV3U3BlYy5idXR0b25UaXRsZURlZmF1bHQgfHxcbiAgICAgICAgICAgICAgICBjYWxlbmRhck9wdGlvbnMudmlld0hpbnQsIFt0ZXh0RmFsbGJhY2ssIGJ1dHRvbk5hbWVdLCAvLyB2aWV3LW5hbWUgPSBidXR0b25OYW1lXG4gICAgICAgICAgICB0ZXh0RmFsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNhbGVuZGFyQXBpW2J1dHRvbk5hbWVdKSB7IC8vIGEgY2FsZW5kYXJBcGkgbWV0aG9kXG4gICAgICAgICAgICBidXR0b25DbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjYWxlbmRhckFwaVtidXR0b25OYW1lXSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIChidXR0b25UZXh0ID0gY2FsZW5kYXJCdXR0b25UZXh0T3ZlcnJpZGVzW2J1dHRvbk5hbWVdKSB8fFxuICAgICAgICAgICAgICAgIChidXR0b25JY29uID0gdGhlbWUuZ2V0SWNvbkNsYXNzKGJ1dHRvbk5hbWUsIGlzUnRsKSkgfHxcbiAgICAgICAgICAgICAgICAoYnV0dG9uVGV4dCA9IGNhbGVuZGFyQnV0dG9uVGV4dFtidXR0b25OYW1lXSk7IC8vIGV2ZXJ5dGhpbmcgZWxzZSBpcyBjb25zaWRlcmVkIGRlZmF1bHRcbiAgICAgICAgICAgIGlmIChidXR0b25OYW1lID09PSAncHJldlllYXInIHx8IGJ1dHRvbk5hbWUgPT09ICduZXh0WWVhcicpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJldk9yTmV4dCA9IGJ1dHRvbk5hbWUgPT09ICdwcmV2WWVhcicgPyAncHJldicgOiAnbmV4dCc7XG4gICAgICAgICAgICAgICAgYnV0dG9uSGludCA9IGZvcm1hdFdpdGhPcmRpbmFscyhjYWxlbmRhckJ1dHRvbkhpbnRPdmVycmlkZXNbcHJldk9yTmV4dF0gfHxcbiAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJCdXR0b25IaW50c1twcmV2T3JOZXh0XSwgW1xuICAgICAgICAgICAgICAgICAgICBjYWxlbmRhckJ1dHRvblRleHQueWVhciB8fCAneWVhcicsXG4gICAgICAgICAgICAgICAgICAgICd5ZWFyJyxcbiAgICAgICAgICAgICAgICBdLCBjYWxlbmRhckJ1dHRvblRleHRbYnV0dG9uTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnV0dG9uSGludCA9IGZ1bmN0aW9uIChuYXZVbml0KSB7IHJldHVybiBmb3JtYXRXaXRoT3JkaW5hbHMoY2FsZW5kYXJCdXR0b25IaW50T3ZlcnJpZGVzW2J1dHRvbk5hbWVdIHx8XG4gICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyQnV0dG9uSGludHNbYnV0dG9uTmFtZV0sIFtcbiAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJCdXR0b25UZXh0W25hdlVuaXRdIHx8IG5hdlVuaXQsXG4gICAgICAgICAgICAgICAgICAgIG5hdlVuaXQsXG4gICAgICAgICAgICAgICAgXSwgY2FsZW5kYXJCdXR0b25UZXh0W2J1dHRvbk5hbWVdKTsgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBidXR0b25OYW1lOiBidXR0b25OYW1lLCBidXR0b25DbGljazogYnV0dG9uQ2xpY2ssIGJ1dHRvbkljb246IGJ1dHRvbkljb24sIGJ1dHRvblRleHQ6IGJ1dHRvblRleHQsIGJ1dHRvbkhpbnQ6IGJ1dHRvbkhpbnQgfTtcbiAgICB9KSk7IH0pO1xuICAgIHJldHVybiB7IHdpZGdldHM6IHdpZGdldHMsIHZpZXdzV2l0aEJ1dHRvbnM6IHZpZXdzV2l0aEJ1dHRvbnMsIGhhc1RpdGxlOiBoYXNUaXRsZSB9O1xufVxuXG52YXIgZXZlbnRTb3VyY2VEZWYkMiA9IHtcbiAgICBpZ25vcmVSYW5nZTogdHJ1ZSxcbiAgICBwYXJzZU1ldGE6IGZ1bmN0aW9uIChyZWZpbmVkKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlZmluZWQuZXZlbnRzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlZmluZWQuZXZlbnRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgZmV0Y2g6IGZ1bmN0aW9uIChhcmcsIHN1Y2Nlc3MpIHtcbiAgICAgICAgc3VjY2Vzcyh7XG4gICAgICAgICAgICByYXdFdmVudHM6IGFyZy5ldmVudFNvdXJjZS5tZXRhLFxuICAgICAgICB9KTtcbiAgICB9LFxufTtcbnZhciBhcnJheUV2ZW50U291cmNlUGx1Z2luID0gY3JlYXRlUGx1Z2luKHtcbiAgICBldmVudFNvdXJjZURlZnM6IFtldmVudFNvdXJjZURlZiQyXSxcbn0pO1xuXG52YXIgZXZlbnRTb3VyY2VEZWYkMSA9IHtcbiAgICBwYXJzZU1ldGE6IGZ1bmN0aW9uIChyZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVmaW5lZC5ldmVudHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiByZWZpbmVkLmV2ZW50cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIGZldGNoOiBmdW5jdGlvbiAoYXJnLCBzdWNjZXNzLCBmYWlsdXJlKSB7XG4gICAgICAgIHZhciBkYXRlRW52ID0gYXJnLmNvbnRleHQuZGF0ZUVudjtcbiAgICAgICAgdmFyIGZ1bmMgPSBhcmcuZXZlbnRTb3VyY2UubWV0YTtcbiAgICAgICAgdW5wcm9taXNpZnkoZnVuYy5iaW5kKG51bGwsIGJ1aWxkUmFuZ2VBcGlXaXRoVGltZVpvbmUoYXJnLnJhbmdlLCBkYXRlRW52KSksIGZ1bmN0aW9uIChyYXdFdmVudHMpIHtcbiAgICAgICAgICAgIHN1Y2Nlc3MoeyByYXdFdmVudHM6IHJhd0V2ZW50cyB9KTsgLy8gbmVlZHMgYW4gb2JqZWN0IHJlc3BvbnNlXG4gICAgICAgIH0sIGZhaWx1cmUpO1xuICAgIH0sXG59O1xudmFyIGZ1bmNFdmVudFNvdXJjZVBsdWdpbiA9IGNyZWF0ZVBsdWdpbih7XG4gICAgZXZlbnRTb3VyY2VEZWZzOiBbZXZlbnRTb3VyY2VEZWYkMV0sXG59KTtcblxuZnVuY3Rpb24gcmVxdWVzdEpzb24obWV0aG9kLCB1cmwsIHBhcmFtcywgc3VjY2Vzc0NhbGxiYWNrLCBmYWlsdXJlQ2FsbGJhY2spIHtcbiAgICBtZXRob2QgPSBtZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICB2YXIgYm9keSA9IG51bGw7XG4gICAgaWYgKG1ldGhvZCA9PT0gJ0dFVCcpIHtcbiAgICAgICAgdXJsID0gaW5qZWN0UXVlcnlTdHJpbmdQYXJhbXModXJsLCBwYXJhbXMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYm9keSA9IGVuY29kZVBhcmFtcyhwYXJhbXMpO1xuICAgIH1cbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgeGhyLm9wZW4obWV0aG9kLCB1cmwsIHRydWUpO1xuICAgIGlmIChtZXRob2QgIT09ICdHRVQnKSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgfVxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgNDAwKSB7XG4gICAgICAgICAgICB2YXIgcGFyc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgcmVzID0gdm9pZCAwO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXMgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgIHBhcnNlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gd2lsbCBoYW5kbGUgcGFyc2VkPWZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFyc2VkKSB7XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHJlcywgeGhyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZhaWx1cmVDYWxsYmFjaygnRmFpbHVyZSBwYXJzaW5nIEpTT04nLCB4aHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZmFpbHVyZUNhbGxiYWNrKCdSZXF1ZXN0IGZhaWxlZCcsIHhocik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmYWlsdXJlQ2FsbGJhY2soJ1JlcXVlc3QgZmFpbGVkJywgeGhyKTtcbiAgICB9O1xuICAgIHhoci5zZW5kKGJvZHkpO1xufVxuZnVuY3Rpb24gaW5qZWN0UXVlcnlTdHJpbmdQYXJhbXModXJsLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gdXJsICtcbiAgICAgICAgKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArXG4gICAgICAgIGVuY29kZVBhcmFtcyhwYXJhbXMpO1xufVxuZnVuY3Rpb24gZW5jb2RlUGFyYW1zKHBhcmFtcykge1xuICAgIHZhciBwYXJ0cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBwYXJhbXMpIHtcbiAgICAgICAgcGFydHMucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtc1trZXldKSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcmJyk7XG59XG5cbnZhciBKU09OX0ZFRURfRVZFTlRfU09VUkNFX1JFRklORVJTID0ge1xuICAgIG1ldGhvZDogU3RyaW5nLFxuICAgIGV4dHJhUGFyYW1zOiBpZGVudGl0eSxcbiAgICBzdGFydFBhcmFtOiBTdHJpbmcsXG4gICAgZW5kUGFyYW06IFN0cmluZyxcbiAgICB0aW1lWm9uZVBhcmFtOiBTdHJpbmcsXG59O1xuXG52YXIgZXZlbnRTb3VyY2VEZWYgPSB7XG4gICAgcGFyc2VNZXRhOiBmdW5jdGlvbiAocmVmaW5lZCkge1xuICAgICAgICBpZiAocmVmaW5lZC51cmwgJiYgKHJlZmluZWQuZm9ybWF0ID09PSAnanNvbicgfHwgIXJlZmluZWQuZm9ybWF0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHJlZmluZWQudXJsLFxuICAgICAgICAgICAgICAgIGZvcm1hdDogJ2pzb24nLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogKHJlZmluZWQubWV0aG9kIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpLFxuICAgICAgICAgICAgICAgIGV4dHJhUGFyYW1zOiByZWZpbmVkLmV4dHJhUGFyYW1zLFxuICAgICAgICAgICAgICAgIHN0YXJ0UGFyYW06IHJlZmluZWQuc3RhcnRQYXJhbSxcbiAgICAgICAgICAgICAgICBlbmRQYXJhbTogcmVmaW5lZC5lbmRQYXJhbSxcbiAgICAgICAgICAgICAgICB0aW1lWm9uZVBhcmFtOiByZWZpbmVkLnRpbWVab25lUGFyYW0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgZmV0Y2g6IGZ1bmN0aW9uIChhcmcsIHN1Y2Nlc3MsIGZhaWx1cmUpIHtcbiAgICAgICAgdmFyIG1ldGEgPSBhcmcuZXZlbnRTb3VyY2UubWV0YTtcbiAgICAgICAgdmFyIHJlcXVlc3RQYXJhbXMgPSBidWlsZFJlcXVlc3RQYXJhbXMobWV0YSwgYXJnLnJhbmdlLCBhcmcuY29udGV4dCk7XG4gICAgICAgIHJlcXVlc3RKc29uKG1ldGEubWV0aG9kLCBtZXRhLnVybCwgcmVxdWVzdFBhcmFtcywgZnVuY3Rpb24gKHJhd0V2ZW50cywgeGhyKSB7XG4gICAgICAgICAgICBzdWNjZXNzKHsgcmF3RXZlbnRzOiByYXdFdmVudHMsIHhocjogeGhyIH0pO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3JNZXNzYWdlLCB4aHIpIHtcbiAgICAgICAgICAgIGZhaWx1cmUoeyBtZXNzYWdlOiBlcnJvck1lc3NhZ2UsIHhocjogeGhyIH0pO1xuICAgICAgICB9KTtcbiAgICB9LFxufTtcbnZhciBqc29uRmVlZEV2ZW50U291cmNlUGx1Z2luID0gY3JlYXRlUGx1Z2luKHtcbiAgICBldmVudFNvdXJjZVJlZmluZXJzOiBKU09OX0ZFRURfRVZFTlRfU09VUkNFX1JFRklORVJTLFxuICAgIGV2ZW50U291cmNlRGVmczogW2V2ZW50U291cmNlRGVmXSxcbn0pO1xuZnVuY3Rpb24gYnVpbGRSZXF1ZXN0UGFyYW1zKG1ldGEsIHJhbmdlLCBjb250ZXh0KSB7XG4gICAgdmFyIGRhdGVFbnYgPSBjb250ZXh0LmRhdGVFbnYsIG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnM7XG4gICAgdmFyIHN0YXJ0UGFyYW07XG4gICAgdmFyIGVuZFBhcmFtO1xuICAgIHZhciB0aW1lWm9uZVBhcmFtO1xuICAgIHZhciBjdXN0b21SZXF1ZXN0UGFyYW1zO1xuICAgIHZhciBwYXJhbXMgPSB7fTtcbiAgICBzdGFydFBhcmFtID0gbWV0YS5zdGFydFBhcmFtO1xuICAgIGlmIChzdGFydFBhcmFtID09IG51bGwpIHtcbiAgICAgICAgc3RhcnRQYXJhbSA9IG9wdGlvbnMuc3RhcnRQYXJhbTtcbiAgICB9XG4gICAgZW5kUGFyYW0gPSBtZXRhLmVuZFBhcmFtO1xuICAgIGlmIChlbmRQYXJhbSA9PSBudWxsKSB7XG4gICAgICAgIGVuZFBhcmFtID0gb3B0aW9ucy5lbmRQYXJhbTtcbiAgICB9XG4gICAgdGltZVpvbmVQYXJhbSA9IG1ldGEudGltZVpvbmVQYXJhbTtcbiAgICBpZiAodGltZVpvbmVQYXJhbSA9PSBudWxsKSB7XG4gICAgICAgIHRpbWVab25lUGFyYW0gPSBvcHRpb25zLnRpbWVab25lUGFyYW07XG4gICAgfVxuICAgIC8vIHJldHJpZXZlIGFueSBvdXRib3VuZCBHRVQvUE9TVCBkYXRhIGZyb20gdGhlIG9wdGlvbnNcbiAgICBpZiAodHlwZW9mIG1ldGEuZXh0cmFQYXJhbXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gc3VwcGxpZWQgYXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBrZXkvdmFsdWUgb2JqZWN0XG4gICAgICAgIGN1c3RvbVJlcXVlc3RQYXJhbXMgPSBtZXRhLmV4dHJhUGFyYW1zKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBwcm9iYWJseSBzdXBwbGllZCBhcyBhIHN0cmFpZ2h0IGtleS92YWx1ZSBvYmplY3RcbiAgICAgICAgY3VzdG9tUmVxdWVzdFBhcmFtcyA9IG1ldGEuZXh0cmFQYXJhbXMgfHwge307XG4gICAgfVxuICAgIHRzbGliLl9fYXNzaWduKHBhcmFtcywgY3VzdG9tUmVxdWVzdFBhcmFtcyk7XG4gICAgcGFyYW1zW3N0YXJ0UGFyYW1dID0gZGF0ZUVudi5mb3JtYXRJc28ocmFuZ2Uuc3RhcnQpO1xuICAgIHBhcmFtc1tlbmRQYXJhbV0gPSBkYXRlRW52LmZvcm1hdElzbyhyYW5nZS5lbmQpO1xuICAgIGlmIChkYXRlRW52LnRpbWVab25lICE9PSAnbG9jYWwnKSB7XG4gICAgICAgIHBhcmFtc1t0aW1lWm9uZVBhcmFtXSA9IGRhdGVFbnYudGltZVpvbmU7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG59XG5cbnZhciBTSU1QTEVfUkVDVVJSSU5HX1JFRklORVJTID0ge1xuICAgIGRheXNPZldlZWs6IGlkZW50aXR5LFxuICAgIHN0YXJ0VGltZTogY3JlYXRlRHVyYXRpb24sXG4gICAgZW5kVGltZTogY3JlYXRlRHVyYXRpb24sXG4gICAgZHVyYXRpb246IGNyZWF0ZUR1cmF0aW9uLFxuICAgIHN0YXJ0UmVjdXI6IGlkZW50aXR5LFxuICAgIGVuZFJlY3VyOiBpZGVudGl0eSxcbn07XG5cbnZhciByZWN1cnJpbmcgPSB7XG4gICAgcGFyc2U6IGZ1bmN0aW9uIChyZWZpbmVkLCBkYXRlRW52KSB7XG4gICAgICAgIGlmIChyZWZpbmVkLmRheXNPZldlZWsgfHwgcmVmaW5lZC5zdGFydFRpbWUgfHwgcmVmaW5lZC5lbmRUaW1lIHx8IHJlZmluZWQuc3RhcnRSZWN1ciB8fCByZWZpbmVkLmVuZFJlY3VyKSB7XG4gICAgICAgICAgICB2YXIgcmVjdXJyaW5nRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBkYXlzT2ZXZWVrOiByZWZpbmVkLmRheXNPZldlZWsgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBzdGFydFRpbWU6IHJlZmluZWQuc3RhcnRUaW1lIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgZW5kVGltZTogcmVmaW5lZC5lbmRUaW1lIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgc3RhcnRSZWN1cjogcmVmaW5lZC5zdGFydFJlY3VyID8gZGF0ZUVudi5jcmVhdGVNYXJrZXIocmVmaW5lZC5zdGFydFJlY3VyKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgZW5kUmVjdXI6IHJlZmluZWQuZW5kUmVjdXIgPyBkYXRlRW52LmNyZWF0ZU1hcmtlcihyZWZpbmVkLmVuZFJlY3VyKSA6IG51bGwsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKHJlZmluZWQuZHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IHJlZmluZWQuZHVyYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWR1cmF0aW9uICYmIHJlZmluZWQuc3RhcnRUaW1lICYmIHJlZmluZWQuZW5kVGltZSkge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gc3VidHJhY3REdXJhdGlvbnMocmVmaW5lZC5lbmRUaW1lLCByZWZpbmVkLnN0YXJ0VGltZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFsbERheUd1ZXNzOiBCb29sZWFuKCFyZWZpbmVkLnN0YXJ0VGltZSAmJiAhcmVmaW5lZC5lbmRUaW1lKSxcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgdHlwZURhdGE6IHJlY3VycmluZ0RhdGEsIC8vIGRvZXNuJ3QgbmVlZCBlbmRUaW1lIGFueW1vcmUgYnV0IG9oIHdlbGxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICBleHBhbmQ6IGZ1bmN0aW9uICh0eXBlRGF0YSwgZnJhbWluZ1JhbmdlLCBkYXRlRW52KSB7XG4gICAgICAgIHZhciBjbGlwcGVkRnJhbWluZ1JhbmdlID0gaW50ZXJzZWN0UmFuZ2VzKGZyYW1pbmdSYW5nZSwgeyBzdGFydDogdHlwZURhdGEuc3RhcnRSZWN1ciwgZW5kOiB0eXBlRGF0YS5lbmRSZWN1ciB9KTtcbiAgICAgICAgaWYgKGNsaXBwZWRGcmFtaW5nUmFuZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBleHBhbmRSYW5nZXModHlwZURhdGEuZGF5c09mV2VlaywgdHlwZURhdGEuc3RhcnRUaW1lLCBjbGlwcGVkRnJhbWluZ1JhbmdlLCBkYXRlRW52KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfSxcbn07XG52YXIgc2ltcGxlUmVjdXJyaW5nRXZlbnRzUGx1Z2luID0gY3JlYXRlUGx1Z2luKHtcbiAgICByZWN1cnJpbmdUeXBlczogW3JlY3VycmluZ10sXG4gICAgZXZlbnRSZWZpbmVyczogU0lNUExFX1JFQ1VSUklOR19SRUZJTkVSUyxcbn0pO1xuZnVuY3Rpb24gZXhwYW5kUmFuZ2VzKGRheXNPZldlZWssIHN0YXJ0VGltZSwgZnJhbWluZ1JhbmdlLCBkYXRlRW52KSB7XG4gICAgdmFyIGRvd0hhc2ggPSBkYXlzT2ZXZWVrID8gYXJyYXlUb0hhc2goZGF5c09mV2VlaykgOiBudWxsO1xuICAgIHZhciBkYXlNYXJrZXIgPSBzdGFydE9mRGF5KGZyYW1pbmdSYW5nZS5zdGFydCk7XG4gICAgdmFyIGVuZE1hcmtlciA9IGZyYW1pbmdSYW5nZS5lbmQ7XG4gICAgdmFyIGluc3RhbmNlU3RhcnRzID0gW107XG4gICAgd2hpbGUgKGRheU1hcmtlciA8IGVuZE1hcmtlcikge1xuICAgICAgICB2YXIgaW5zdGFuY2VTdGFydCBcbiAgICAgICAgLy8gaWYgZXZlcnlkYXksIG9yIHRoaXMgcGFydGljdWxhciBkYXktb2Ytd2Vla1xuICAgICAgICA9IHZvaWQgMDtcbiAgICAgICAgLy8gaWYgZXZlcnlkYXksIG9yIHRoaXMgcGFydGljdWxhciBkYXktb2Ytd2Vla1xuICAgICAgICBpZiAoIWRvd0hhc2ggfHwgZG93SGFzaFtkYXlNYXJrZXIuZ2V0VVRDRGF5KCldKSB7XG4gICAgICAgICAgICBpZiAoc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VTdGFydCA9IGRhdGVFbnYuYWRkKGRheU1hcmtlciwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlU3RhcnQgPSBkYXlNYXJrZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnN0YW5jZVN0YXJ0cy5wdXNoKGluc3RhbmNlU3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIGRheU1hcmtlciA9IGFkZERheXMoZGF5TWFya2VyLCAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbmNlU3RhcnRzO1xufVxuXG52YXIgY2hhbmdlSGFuZGxlclBsdWdpbiA9IGNyZWF0ZVBsdWdpbih7XG4gICAgb3B0aW9uQ2hhbmdlSGFuZGxlcnM6IHtcbiAgICAgICAgZXZlbnRzOiBmdW5jdGlvbiAoZXZlbnRzLCBjb250ZXh0KSB7XG4gICAgICAgICAgICBoYW5kbGVFdmVudFNvdXJjZXMoW2V2ZW50c10sIGNvbnRleHQpO1xuICAgICAgICB9LFxuICAgICAgICBldmVudFNvdXJjZXM6IGhhbmRsZUV2ZW50U291cmNlcyxcbiAgICB9LFxufSk7XG4vKlxuQlVHOiBpZiBgZXZlbnRgIHdhcyBzdXBwbGllZCwgYWxsIHByZXZpb3VzbHktZ2l2ZW4gYGV2ZW50U291cmNlc2Agd2lsbCBiZSB3aXBlZCBvdXRcbiovXG5mdW5jdGlvbiBoYW5kbGVFdmVudFNvdXJjZXMoaW5wdXRzLCBjb250ZXh0KSB7XG4gICAgdmFyIHVuZm91bmRTb3VyY2VzID0gaGFzaFZhbHVlc1RvQXJyYXkoY29udGV4dC5nZXRDdXJyZW50RGF0YSgpLmV2ZW50U291cmNlcyk7XG4gICAgdmFyIG5ld0lucHV0cyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMCwgaW5wdXRzXzEgPSBpbnB1dHM7IF9pIDwgaW5wdXRzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IGlucHV0c18xW19pXTtcbiAgICAgICAgdmFyIGlucHV0Rm91bmQgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1bmZvdW5kU291cmNlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKHVuZm91bmRTb3VyY2VzW2ldLl9yYXcgPT09IGlucHV0KSB7XG4gICAgICAgICAgICAgICAgdW5mb3VuZFNvdXJjZXMuc3BsaWNlKGksIDEpOyAvLyBkZWxldGVcbiAgICAgICAgICAgICAgICBpbnB1dEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlucHV0Rm91bmQpIHtcbiAgICAgICAgICAgIG5ld0lucHV0cy5wdXNoKGlucHV0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBfYSA9IDAsIHVuZm91bmRTb3VyY2VzXzEgPSB1bmZvdW5kU291cmNlczsgX2EgPCB1bmZvdW5kU291cmNlc18xLmxlbmd0aDsgX2ErKykge1xuICAgICAgICB2YXIgdW5mb3VuZFNvdXJjZSA9IHVuZm91bmRTb3VyY2VzXzFbX2FdO1xuICAgICAgICBjb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdSRU1PVkVfRVZFTlRfU09VUkNFJyxcbiAgICAgICAgICAgIHNvdXJjZUlkOiB1bmZvdW5kU291cmNlLnNvdXJjZUlkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZm9yICh2YXIgX2IgPSAwLCBuZXdJbnB1dHNfMSA9IG5ld0lucHV0czsgX2IgPCBuZXdJbnB1dHNfMS5sZW5ndGg7IF9iKyspIHtcbiAgICAgICAgdmFyIG5ld0lucHV0ID0gbmV3SW5wdXRzXzFbX2JdO1xuICAgICAgICBjb250ZXh0LmNhbGVuZGFyQXBpLmFkZEV2ZW50U291cmNlKG5ld0lucHV0KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZURhdGVQcm9maWxlKGRhdGVQcm9maWxlLCBjb250ZXh0KSB7XG4gICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2RhdGVzU2V0JywgdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGJ1aWxkUmFuZ2VBcGlXaXRoVGltZVpvbmUoZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2UsIGNvbnRleHQuZGF0ZUVudikpLCB7IHZpZXc6IGNvbnRleHQudmlld0FwaSB9KSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50U3RvcmUoZXZlbnRTdG9yZSwgY29udGV4dCkge1xuICAgIHZhciBlbWl0dGVyID0gY29udGV4dC5lbWl0dGVyO1xuICAgIGlmIChlbWl0dGVyLmhhc0hhbmRsZXJzKCdldmVudHNTZXQnKSkge1xuICAgICAgICBlbWl0dGVyLnRyaWdnZXIoJ2V2ZW50c1NldCcsIGJ1aWxkRXZlbnRBcGlzKGV2ZW50U3RvcmUsIGNvbnRleHQpKTtcbiAgICB9XG59XG5cbi8qXG50aGlzIGFycmF5IGlzIGV4cG9zZWQgb24gdGhlIHJvb3QgbmFtZXNwYWNlIHNvIHRoYXQgVU1EIHBsdWdpbnMgY2FuIGFkZCB0byBpdC5cbnNlZSB0aGUgcm9sbHVwLWJ1bmRsZXMgc2NyaXB0LlxuKi9cbnZhciBnbG9iYWxQbHVnaW5zID0gW1xuICAgIGFycmF5RXZlbnRTb3VyY2VQbHVnaW4sXG4gICAgZnVuY0V2ZW50U291cmNlUGx1Z2luLFxuICAgIGpzb25GZWVkRXZlbnRTb3VyY2VQbHVnaW4sXG4gICAgc2ltcGxlUmVjdXJyaW5nRXZlbnRzUGx1Z2luLFxuICAgIGNoYW5nZUhhbmRsZXJQbHVnaW4sXG4gICAgY3JlYXRlUGx1Z2luKHtcbiAgICAgICAgaXNMb2FkaW5nRnVuY3M6IFtcbiAgICAgICAgICAgIGZ1bmN0aW9uIChzdGF0ZSkgeyByZXR1cm4gY29tcHV0ZUV2ZW50U291cmNlc0xvYWRpbmcoc3RhdGUuZXZlbnRTb3VyY2VzKTsgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudFR5cGVIYW5kbGVyczoge1xuICAgICAgICAgICAgaHRtbDogYnVpbGRIdG1sUmVuZGVyZXIsXG4gICAgICAgICAgICBkb21Ob2RlczogYnVpbGREb21Ob2RlUmVuZGVyZXIsXG4gICAgICAgIH0sXG4gICAgICAgIHByb3BTZXRIYW5kbGVyczoge1xuICAgICAgICAgICAgZGF0ZVByb2ZpbGU6IGhhbmRsZURhdGVQcm9maWxlLFxuICAgICAgICAgICAgZXZlbnRTdG9yZTogaGFuZGxlRXZlbnRTdG9yZSxcbiAgICAgICAgfSxcbiAgICB9KSxcbl07XG5mdW5jdGlvbiBidWlsZEh0bWxSZW5kZXJlcigpIHtcbiAgICB2YXIgY3VycmVudEVsID0gbnVsbDtcbiAgICB2YXIgY3VycmVudEh0bWwgPSAnJztcbiAgICBmdW5jdGlvbiByZW5kZXIoZWwsIGh0bWwpIHtcbiAgICAgICAgaWYgKGVsICE9PSBjdXJyZW50RWwgfHwgaHRtbCAhPT0gY3VycmVudEh0bWwpIHtcbiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudEVsID0gZWw7XG4gICAgICAgIGN1cnJlbnRIdG1sID0gaHRtbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgY3VycmVudEVsLmlubmVySFRNTCA9ICcnO1xuICAgICAgICBjdXJyZW50RWwgPSBudWxsO1xuICAgICAgICBjdXJyZW50SHRtbCA9ICcnO1xuICAgIH1cbiAgICByZXR1cm4geyByZW5kZXI6IHJlbmRlciwgZGVzdHJveTogZGVzdHJveSB9O1xufVxuZnVuY3Rpb24gYnVpbGREb21Ob2RlUmVuZGVyZXIoKSB7XG4gICAgdmFyIGN1cnJlbnRFbCA9IG51bGw7XG4gICAgdmFyIGN1cnJlbnREb21Ob2RlcyA9IFtdO1xuICAgIGZ1bmN0aW9uIHJlbmRlcihlbCwgZG9tTm9kZXMpIHtcbiAgICAgICAgdmFyIG5ld0RvbU5vZGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9tTm9kZXMpO1xuICAgICAgICBpZiAoZWwgIT09IGN1cnJlbnRFbCB8fCAhaXNBcnJheXNFcXVhbChjdXJyZW50RG9tTm9kZXMsIG5ld0RvbU5vZGVzKSkge1xuICAgICAgICAgICAgLy8gYXBwZW5kIGZpcnN0LCByZW1vdmUgc2Vjb25kIChmb3Igc2Nyb2xsIHJlc2V0dGluZylcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgbmV3RG9tTm9kZXNfMSA9IG5ld0RvbU5vZGVzOyBfaSA8IG5ld0RvbU5vZGVzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld05vZGUgPSBuZXdEb21Ob2Rlc18xW19pXTtcbiAgICAgICAgICAgICAgICBlbC5hcHBlbmRDaGlsZChuZXdOb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50RWwgPSBlbDtcbiAgICAgICAgY3VycmVudERvbU5vZGVzID0gbmV3RG9tTm9kZXM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIGN1cnJlbnREb21Ob2Rlcy5mb3JFYWNoKHJlbW92ZUVsZW1lbnQpO1xuICAgICAgICBjdXJyZW50RG9tTm9kZXMgPSBbXTtcbiAgICAgICAgY3VycmVudEVsID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHsgcmVuZGVyOiByZW5kZXIsIGRlc3Ryb3k6IGRlc3Ryb3kgfTtcbn1cblxudmFyIERlbGF5ZWRSdW5uZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVsYXllZFJ1bm5lcihkcmFpbmVkT3B0aW9uKSB7XG4gICAgICAgIHRoaXMuZHJhaW5lZE9wdGlvbiA9IGRyYWluZWRPcHRpb247XG4gICAgICAgIHRoaXMuaXNSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNEaXJ0eSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBhdXNlRGVwdGhzID0ge307XG4gICAgICAgIHRoaXMudGltZW91dElkID0gMDtcbiAgICB9XG4gICAgRGVsYXllZFJ1bm5lci5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uIChkZWxheSkge1xuICAgICAgICB0aGlzLmlzRGlydHkgPSB0cnVlO1xuICAgICAgICBpZiAoIXRoaXMuaXNQYXVzZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5jbGVhclRpbWVvdXQoKTtcbiAgICAgICAgICAgIGlmIChkZWxheSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cnlEcmFpbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KC8vIE5PVCBPUFRJTUFMISBUT0RPOiBsb29rIGF0IGRlYm91bmNlXG4gICAgICAgICAgICAgICAgdGhpcy50cnlEcmFpbi5iaW5kKHRoaXMpLCBkZWxheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERlbGF5ZWRSdW5uZXIucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICAgIGlmIChzY29wZSA9PT0gdm9pZCAwKSB7IHNjb3BlID0gJyc7IH1cbiAgICAgICAgdmFyIHBhdXNlRGVwdGhzID0gdGhpcy5wYXVzZURlcHRocztcbiAgICAgICAgcGF1c2VEZXB0aHNbc2NvcGVdID0gKHBhdXNlRGVwdGhzW3Njb3BlXSB8fCAwKSArIDE7XG4gICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0KCk7XG4gICAgfTtcbiAgICBEZWxheWVkUnVubmVyLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoc2NvcGUsIGZvcmNlKSB7XG4gICAgICAgIGlmIChzY29wZSA9PT0gdm9pZCAwKSB7IHNjb3BlID0gJyc7IH1cbiAgICAgICAgdmFyIHBhdXNlRGVwdGhzID0gdGhpcy5wYXVzZURlcHRocztcbiAgICAgICAgaWYgKHNjb3BlIGluIHBhdXNlRGVwdGhzKSB7XG4gICAgICAgICAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgcGF1c2VEZXB0aHNbc2NvcGVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGF1c2VEZXB0aHNbc2NvcGVdIC09IDE7XG4gICAgICAgICAgICAgICAgdmFyIGRlcHRoID0gcGF1c2VEZXB0aHNbc2NvcGVdO1xuICAgICAgICAgICAgICAgIGlmIChkZXB0aCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXVzZURlcHRoc1tzY29wZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50cnlEcmFpbigpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEZWxheWVkUnVubmVyLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucGF1c2VEZXB0aHMpLmxlbmd0aDtcbiAgICB9O1xuICAgIERlbGF5ZWRSdW5uZXIucHJvdG90eXBlLnRyeURyYWluID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNSdW5uaW5nICYmICF0aGlzLmlzUGF1c2VkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuaXNSdW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLmlzRGlydHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzRGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWluZWQoKTsgLy8gbWlnaHQgc2V0IGlzRGlydHkgdG8gdHJ1ZSBhZ2FpblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRGVsYXllZFJ1bm5lci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuaXNEaXJ0eSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBhdXNlRGVwdGhzID0ge307XG4gICAgfTtcbiAgICBEZWxheWVkUnVubmVyLnByb3RvdHlwZS5jbGVhclRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVvdXRJZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKTtcbiAgICAgICAgICAgIHRoaXMudGltZW91dElkID0gMDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRGVsYXllZFJ1bm5lci5wcm90b3R5cGUuZHJhaW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhaW5lZE9wdGlvbikge1xuICAgICAgICAgICAgdGhpcy5kcmFpbmVkT3B0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBEZWxheWVkUnVubmVyO1xufSgpKTtcblxudmFyIFRhc2tSdW5uZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGFza1J1bm5lcihydW5UYXNrT3B0aW9uLCBkcmFpbmVkT3B0aW9uKSB7XG4gICAgICAgIHRoaXMucnVuVGFza09wdGlvbiA9IHJ1blRhc2tPcHRpb247XG4gICAgICAgIHRoaXMuZHJhaW5lZE9wdGlvbiA9IGRyYWluZWRPcHRpb247XG4gICAgICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy5kZWxheWVkUnVubmVyID0gbmV3IERlbGF5ZWRSdW5uZXIodGhpcy5kcmFpbi5iaW5kKHRoaXMpKTtcbiAgICB9XG4gICAgVGFza1J1bm5lci5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uICh0YXNrLCBkZWxheSkge1xuICAgICAgICB0aGlzLnF1ZXVlLnB1c2godGFzayk7XG4gICAgICAgIHRoaXMuZGVsYXllZFJ1bm5lci5yZXF1ZXN0KGRlbGF5KTtcbiAgICB9O1xuICAgIFRhc2tSdW5uZXIucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICAgIHRoaXMuZGVsYXllZFJ1bm5lci5wYXVzZShzY29wZSk7XG4gICAgfTtcbiAgICBUYXNrUnVubmVyLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoc2NvcGUsIGZvcmNlKSB7XG4gICAgICAgIHRoaXMuZGVsYXllZFJ1bm5lci5yZXN1bWUoc2NvcGUsIGZvcmNlKTtcbiAgICB9O1xuICAgIFRhc2tSdW5uZXIucHJvdG90eXBlLmRyYWluID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcXVldWUgPSB0aGlzLnF1ZXVlO1xuICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgY29tcGxldGVkVGFza3MgPSBbXTtcbiAgICAgICAgICAgIHZhciB0YXNrID0gdm9pZCAwO1xuICAgICAgICAgICAgd2hpbGUgKCh0YXNrID0gcXVldWUuc2hpZnQoKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1blRhc2sodGFzayk7XG4gICAgICAgICAgICAgICAgY29tcGxldGVkVGFza3MucHVzaCh0YXNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZHJhaW5lZChjb21wbGV0ZWRUYXNrcyk7XG4gICAgICAgIH0gLy8ga2VlcCBnb2luZywgaW4gY2FzZSBuZXcgdGFza3Mgd2VyZSBhZGRlZCBpbiB0aGUgZHJhaW5lZCBoYW5kbGVyXG4gICAgfTtcbiAgICBUYXNrUnVubmVyLnByb3RvdHlwZS5ydW5UYXNrID0gZnVuY3Rpb24gKHRhc2spIHtcbiAgICAgICAgaWYgKHRoaXMucnVuVGFza09wdGlvbikge1xuICAgICAgICAgICAgdGhpcy5ydW5UYXNrT3B0aW9uKHRhc2spO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUYXNrUnVubmVyLnByb3RvdHlwZS5kcmFpbmVkID0gZnVuY3Rpb24gKGNvbXBsZXRlZFRhc2tzKSB7XG4gICAgICAgIGlmICh0aGlzLmRyYWluZWRPcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZHJhaW5lZE9wdGlvbihjb21wbGV0ZWRUYXNrcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBUYXNrUnVubmVyO1xufSgpKTtcblxuLy8gQ29tcHV0ZXMgd2hhdCB0aGUgdGl0bGUgYXQgdGhlIHRvcCBvZiB0aGUgY2FsZW5kYXJBcGkgc2hvdWxkIGJlIGZvciB0aGlzIHZpZXdcbmZ1bmN0aW9uIGJ1aWxkVGl0bGUoZGF0ZVByb2ZpbGUsIHZpZXdPcHRpb25zLCBkYXRlRW52KSB7XG4gICAgdmFyIHJhbmdlO1xuICAgIC8vIGZvciB2aWV3cyB0aGF0IHNwYW4gYSBsYXJnZSB1bml0IG9mIHRpbWUsIHNob3cgdGhlIHByb3BlciBpbnRlcnZhbCwgaWdub3Jpbmcgc3RyYXkgZGF5cyBiZWZvcmUgYW5kIGFmdGVyXG4gICAgaWYgKC9eKHllYXJ8bW9udGgpJC8udGVzdChkYXRlUHJvZmlsZS5jdXJyZW50UmFuZ2VVbml0KSkge1xuICAgICAgICByYW5nZSA9IGRhdGVQcm9maWxlLmN1cnJlbnRSYW5nZTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIGZvciBkYXkgdW5pdHMgb3Igc21hbGxlciwgdXNlIHRoZSBhY3R1YWwgZGF5IHJhbmdlXG4gICAgICAgIHJhbmdlID0gZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2U7XG4gICAgfVxuICAgIHJldHVybiBkYXRlRW52LmZvcm1hdFJhbmdlKHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQsIGNyZWF0ZUZvcm1hdHRlcih2aWV3T3B0aW9ucy50aXRsZUZvcm1hdCB8fCBidWlsZFRpdGxlRm9ybWF0KGRhdGVQcm9maWxlKSksIHtcbiAgICAgICAgaXNFbmRFeGNsdXNpdmU6IGRhdGVQcm9maWxlLmlzUmFuZ2VBbGxEYXksXG4gICAgICAgIGRlZmF1bHRTZXBhcmF0b3I6IHZpZXdPcHRpb25zLnRpdGxlUmFuZ2VTZXBhcmF0b3IsXG4gICAgfSk7XG59XG4vLyBHZW5lcmF0ZXMgdGhlIGZvcm1hdCBzdHJpbmcgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdGl0bGUgZm9yIHRoZSBjdXJyZW50IGRhdGUgcmFuZ2UuXG4vLyBBdHRlbXB0cyB0byBjb21wdXRlIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGZvcm1hdCBpZiBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQgd2l0aCBgdGl0bGVGb3JtYXRgLlxuZnVuY3Rpb24gYnVpbGRUaXRsZUZvcm1hdChkYXRlUHJvZmlsZSkge1xuICAgIHZhciBjdXJyZW50UmFuZ2VVbml0ID0gZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlVW5pdDtcbiAgICBpZiAoY3VycmVudFJhbmdlVW5pdCA9PT0gJ3llYXInKSB7XG4gICAgICAgIHJldHVybiB7IHllYXI6ICdudW1lcmljJyB9O1xuICAgIH1cbiAgICBpZiAoY3VycmVudFJhbmdlVW5pdCA9PT0gJ21vbnRoJykge1xuICAgICAgICByZXR1cm4geyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycgfTsgLy8gbGlrZSBcIlNlcHRlbWJlciAyMDE0XCJcbiAgICB9XG4gICAgdmFyIGRheXMgPSBkaWZmV2hvbGVEYXlzKGRhdGVQcm9maWxlLmN1cnJlbnRSYW5nZS5zdGFydCwgZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlLmVuZCk7XG4gICAgaWYgKGRheXMgIT09IG51bGwgJiYgZGF5cyA+IDEpIHtcbiAgICAgICAgLy8gbXVsdGktZGF5IHJhbmdlLiBzaG9ydGVyLCBsaWtlIFwiU2VwIDkgLSAxMCAyMDE0XCJcbiAgICAgICAgcmV0dXJuIHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycgfTtcbiAgICB9XG4gICAgLy8gb25lIGRheS4gbG9uZ2VyLCBsaWtlIFwiU2VwdGVtYmVyIDkgMjAxNFwiXG4gICAgcmV0dXJuIHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ2xvbmcnLCBkYXk6ICdudW1lcmljJyB9O1xufVxuXG4vLyBpbiBmdXR1cmUgcmVmYWN0b3IsIGRvIHRoZSByZWR1eC1zdHlsZSBmdW5jdGlvbihzdGF0ZT1pbml0aWFsKSBmb3IgaW5pdGlhbC1zdGF0ZVxuLy8gYWxzbywgd2hhdGV2ZXIgaXMgaGFwcGVuaW5nIGluIGNvbnN0cnVjdG9yLCBoYXZlIGl0IGhhcHBlbiBpbiBhY3Rpb24gcXVldWUgdG9vXG52YXIgQ2FsZW5kYXJEYXRhTWFuYWdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDYWxlbmRhckRhdGFNYW5hZ2VyKHByb3BzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuY29tcHV0ZU9wdGlvbnNEYXRhID0gbWVtb2l6ZSh0aGlzLl9jb21wdXRlT3B0aW9uc0RhdGEpO1xuICAgICAgICB0aGlzLmNvbXB1dGVDdXJyZW50Vmlld0RhdGEgPSBtZW1vaXplKHRoaXMuX2NvbXB1dGVDdXJyZW50Vmlld0RhdGEpO1xuICAgICAgICB0aGlzLm9yZ2FuaXplUmF3TG9jYWxlcyA9IG1lbW9pemUob3JnYW5pemVSYXdMb2NhbGVzKTtcbiAgICAgICAgdGhpcy5idWlsZExvY2FsZSA9IG1lbW9pemUoYnVpbGRMb2NhbGUpO1xuICAgICAgICB0aGlzLmJ1aWxkUGx1Z2luSG9va3MgPSBidWlsZEJ1aWxkUGx1Z2luSG9va3MoKTtcbiAgICAgICAgdGhpcy5idWlsZERhdGVFbnYgPSBtZW1vaXplKGJ1aWxkRGF0ZUVudik7XG4gICAgICAgIHRoaXMuYnVpbGRUaGVtZSA9IG1lbW9pemUoYnVpbGRUaGVtZSk7XG4gICAgICAgIHRoaXMucGFyc2VUb29sYmFycyA9IG1lbW9pemUocGFyc2VUb29sYmFycyk7XG4gICAgICAgIHRoaXMuYnVpbGRWaWV3U3BlY3MgPSBtZW1vaXplKGJ1aWxkVmlld1NwZWNzKTtcbiAgICAgICAgdGhpcy5idWlsZERhdGVQcm9maWxlR2VuZXJhdG9yID0gbWVtb2l6ZU9iakFyZyhidWlsZERhdGVQcm9maWxlR2VuZXJhdG9yKTtcbiAgICAgICAgdGhpcy5idWlsZFZpZXdBcGkgPSBtZW1vaXplKGJ1aWxkVmlld0FwaSk7XG4gICAgICAgIHRoaXMuYnVpbGRWaWV3VWlQcm9wcyA9IG1lbW9pemVPYmpBcmcoYnVpbGRWaWV3VWlQcm9wcyk7XG4gICAgICAgIHRoaXMuYnVpbGRFdmVudFVpQnlTb3VyY2UgPSBtZW1vaXplKGJ1aWxkRXZlbnRVaUJ5U291cmNlLCBpc1Byb3BzRXF1YWwpO1xuICAgICAgICB0aGlzLmJ1aWxkRXZlbnRVaUJhc2VzID0gbWVtb2l6ZShidWlsZEV2ZW50VWlCYXNlcyk7XG4gICAgICAgIHRoaXMucGFyc2VDb250ZXh0QnVzaW5lc3NIb3VycyA9IG1lbW9pemVPYmpBcmcocGFyc2VDb250ZXh0QnVzaW5lc3NIb3Vycyk7XG4gICAgICAgIHRoaXMuYnVpbGRUaXRsZSA9IG1lbW9pemUoYnVpbGRUaXRsZSk7XG4gICAgICAgIHRoaXMuZW1pdHRlciA9IG5ldyBFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuYWN0aW9uUnVubmVyID0gbmV3IFRhc2tSdW5uZXIodGhpcy5faGFuZGxlQWN0aW9uLmJpbmQodGhpcyksIHRoaXMudXBkYXRlRGF0YS5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FsZW5kYXJPcHRpb25zSW5wdXQgPSB7fTtcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FsZW5kYXJPcHRpb25zUmVmaW5lZCA9IHt9O1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3T3B0aW9uc0lucHV0ID0ge307XG4gICAgICAgIHRoaXMuY3VycmVudFZpZXdPcHRpb25zUmVmaW5lZCA9IHt9O1xuICAgICAgICB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNSZWZpbmVycyA9IHt9O1xuICAgICAgICB0aGlzLmdldEN1cnJlbnREYXRhID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuZGF0YTsgfTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCA9IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgICAgIF90aGlzLmFjdGlvblJ1bm5lci5yZXF1ZXN0KGFjdGlvbik7IC8vIHByb3RlY3RzIGFnYWluc3QgcmVjdXJzaXZlIGNhbGxzIHRvIF9oYW5kbGVBY3Rpb25cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgICAgICB0aGlzLmFjdGlvblJ1bm5lci5wYXVzZSgpO1xuICAgICAgICB2YXIgZHluYW1pY09wdGlvbk92ZXJyaWRlcyA9IHt9O1xuICAgICAgICB2YXIgb3B0aW9uc0RhdGEgPSB0aGlzLmNvbXB1dGVPcHRpb25zRGF0YShwcm9wcy5vcHRpb25PdmVycmlkZXMsIGR5bmFtaWNPcHRpb25PdmVycmlkZXMsIHByb3BzLmNhbGVuZGFyQXBpKTtcbiAgICAgICAgdmFyIGN1cnJlbnRWaWV3VHlwZSA9IG9wdGlvbnNEYXRhLmNhbGVuZGFyT3B0aW9ucy5pbml0aWFsVmlldyB8fCBvcHRpb25zRGF0YS5wbHVnaW5Ib29rcy5pbml0aWFsVmlldztcbiAgICAgICAgdmFyIGN1cnJlbnRWaWV3RGF0YSA9IHRoaXMuY29tcHV0ZUN1cnJlbnRWaWV3RGF0YShjdXJyZW50Vmlld1R5cGUsIG9wdGlvbnNEYXRhLCBwcm9wcy5vcHRpb25PdmVycmlkZXMsIGR5bmFtaWNPcHRpb25PdmVycmlkZXMpO1xuICAgICAgICAvLyB3aXJlIHRoaW5ncyB1cFxuICAgICAgICAvLyBUT0RPOiBub3QgRFJZXG4gICAgICAgIHByb3BzLmNhbGVuZGFyQXBpLmN1cnJlbnREYXRhTWFuYWdlciA9IHRoaXM7XG4gICAgICAgIHRoaXMuZW1pdHRlci5zZXRUaGlzQ29udGV4dChwcm9wcy5jYWxlbmRhckFwaSk7XG4gICAgICAgIHRoaXMuZW1pdHRlci5zZXRPcHRpb25zKGN1cnJlbnRWaWV3RGF0YS5vcHRpb25zKTtcbiAgICAgICAgdmFyIGN1cnJlbnREYXRlID0gZ2V0SW5pdGlhbERhdGUob3B0aW9uc0RhdGEuY2FsZW5kYXJPcHRpb25zLCBvcHRpb25zRGF0YS5kYXRlRW52KTtcbiAgICAgICAgdmFyIGRhdGVQcm9maWxlID0gY3VycmVudFZpZXdEYXRhLmRhdGVQcm9maWxlR2VuZXJhdG9yLmJ1aWxkKGN1cnJlbnREYXRlKTtcbiAgICAgICAgaWYgKCFyYW5nZUNvbnRhaW5zTWFya2VyKGRhdGVQcm9maWxlLmFjdGl2ZVJhbmdlLCBjdXJyZW50RGF0ZSkpIHtcbiAgICAgICAgICAgIGN1cnJlbnREYXRlID0gZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlLnN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBjYWxlbmRhckNvbnRleHQgPSB7XG4gICAgICAgICAgICBkYXRlRW52OiBvcHRpb25zRGF0YS5kYXRlRW52LFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc0RhdGEuY2FsZW5kYXJPcHRpb25zLFxuICAgICAgICAgICAgcGx1Z2luSG9va3M6IG9wdGlvbnNEYXRhLnBsdWdpbkhvb2tzLFxuICAgICAgICAgICAgY2FsZW5kYXJBcGk6IHByb3BzLmNhbGVuZGFyQXBpLFxuICAgICAgICAgICAgZGlzcGF0Y2g6IHRoaXMuZGlzcGF0Y2gsXG4gICAgICAgICAgICBlbWl0dGVyOiB0aGlzLmVtaXR0ZXIsXG4gICAgICAgICAgICBnZXRDdXJyZW50RGF0YTogdGhpcy5nZXRDdXJyZW50RGF0YSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gbmVlZHMgdG8gYmUgYWZ0ZXIgc2V0VGhpc0NvbnRleHRcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IG9wdGlvbnNEYXRhLnBsdWdpbkhvb2tzLmNvbnRleHRJbml0OyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gX2FbX2ldO1xuICAgICAgICAgICAgY2FsbGJhY2soY2FsZW5kYXJDb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOT1QgRFJZXG4gICAgICAgIHZhciBldmVudFNvdXJjZXMgPSBpbml0RXZlbnRTb3VyY2VzKG9wdGlvbnNEYXRhLmNhbGVuZGFyT3B0aW9ucywgZGF0ZVByb2ZpbGUsIGNhbGVuZGFyQ29udGV4dCk7XG4gICAgICAgIHZhciBpbml0aWFsU3RhdGUgPSB7XG4gICAgICAgICAgICBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzOiBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzLFxuICAgICAgICAgICAgY3VycmVudFZpZXdUeXBlOiBjdXJyZW50Vmlld1R5cGUsXG4gICAgICAgICAgICBjdXJyZW50RGF0ZTogY3VycmVudERhdGUsXG4gICAgICAgICAgICBkYXRlUHJvZmlsZTogZGF0ZVByb2ZpbGUsXG4gICAgICAgICAgICBidXNpbmVzc0hvdXJzOiB0aGlzLnBhcnNlQ29udGV4dEJ1c2luZXNzSG91cnMoY2FsZW5kYXJDb250ZXh0KSxcbiAgICAgICAgICAgIGV2ZW50U291cmNlczogZXZlbnRTb3VyY2VzLFxuICAgICAgICAgICAgZXZlbnRVaUJhc2VzOiB7fSxcbiAgICAgICAgICAgIGV2ZW50U3RvcmU6IGNyZWF0ZUVtcHR5RXZlbnRTdG9yZSgpLFxuICAgICAgICAgICAgcmVuZGVyYWJsZUV2ZW50U3RvcmU6IGNyZWF0ZUVtcHR5RXZlbnRTdG9yZSgpLFxuICAgICAgICAgICAgZGF0ZVNlbGVjdGlvbjogbnVsbCxcbiAgICAgICAgICAgIGV2ZW50U2VsZWN0aW9uOiAnJyxcbiAgICAgICAgICAgIGV2ZW50RHJhZzogbnVsbCxcbiAgICAgICAgICAgIGV2ZW50UmVzaXplOiBudWxsLFxuICAgICAgICAgICAgc2VsZWN0aW9uQ29uZmlnOiB0aGlzLmJ1aWxkVmlld1VpUHJvcHMoY2FsZW5kYXJDb250ZXh0KS5zZWxlY3Rpb25Db25maWcsXG4gICAgICAgIH07XG4gICAgICAgIHZhciBjb250ZXh0QW5kU3RhdGUgPSB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgY2FsZW5kYXJDb250ZXh0KSwgaW5pdGlhbFN0YXRlKTtcbiAgICAgICAgZm9yICh2YXIgX2IgPSAwLCBfYyA9IG9wdGlvbnNEYXRhLnBsdWdpbkhvb2tzLnJlZHVjZXJzOyBfYiA8IF9jLmxlbmd0aDsgX2IrKykge1xuICAgICAgICAgICAgdmFyIHJlZHVjZXIgPSBfY1tfYl07XG4gICAgICAgICAgICB0c2xpYi5fX2Fzc2lnbihpbml0aWFsU3RhdGUsIHJlZHVjZXIobnVsbCwgbnVsbCwgY29udGV4dEFuZFN0YXRlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXB1dGVJc0xvYWRpbmcoaW5pdGlhbFN0YXRlLCBjYWxlbmRhckNvbnRleHQpKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcignbG9hZGluZycsIHRydWUpOyAvLyBOT1QgRFJZXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgICAgICAgdGhpcy51cGRhdGVEYXRhKCk7XG4gICAgICAgIHRoaXMuYWN0aW9uUnVubmVyLnJlc3VtZSgpO1xuICAgIH1cbiAgICBDYWxlbmRhckRhdGFNYW5hZ2VyLnByb3RvdHlwZS5yZXNldE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9uT3ZlcnJpZGVzLCBhcHBlbmQpIHtcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgcHJvcHMub3B0aW9uT3ZlcnJpZGVzID0gYXBwZW5kXG4gICAgICAgICAgICA/IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBwcm9wcy5vcHRpb25PdmVycmlkZXMpLCBvcHRpb25PdmVycmlkZXMpIDogb3B0aW9uT3ZlcnJpZGVzO1xuICAgICAgICB0aGlzLmFjdGlvblJ1bm5lci5yZXF1ZXN0KHtcbiAgICAgICAgICAgIHR5cGU6ICdOT1RISU5HJyxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDYWxlbmRhckRhdGFNYW5hZ2VyLnByb3RvdHlwZS5faGFuZGxlQWN0aW9uID0gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBwcm9wcyA9IF9hLnByb3BzLCBzdGF0ZSA9IF9hLnN0YXRlLCBlbWl0dGVyID0gX2EuZW1pdHRlcjtcbiAgICAgICAgdmFyIGR5bmFtaWNPcHRpb25PdmVycmlkZXMgPSByZWR1Y2VEeW5hbWljT3B0aW9uT3ZlcnJpZGVzKHN0YXRlLmR5bmFtaWNPcHRpb25PdmVycmlkZXMsIGFjdGlvbik7XG4gICAgICAgIHZhciBvcHRpb25zRGF0YSA9IHRoaXMuY29tcHV0ZU9wdGlvbnNEYXRhKHByb3BzLm9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcywgcHJvcHMuY2FsZW5kYXJBcGkpO1xuICAgICAgICB2YXIgY3VycmVudFZpZXdUeXBlID0gcmVkdWNlVmlld1R5cGUoc3RhdGUuY3VycmVudFZpZXdUeXBlLCBhY3Rpb24pO1xuICAgICAgICB2YXIgY3VycmVudFZpZXdEYXRhID0gdGhpcy5jb21wdXRlQ3VycmVudFZpZXdEYXRhKGN1cnJlbnRWaWV3VHlwZSwgb3B0aW9uc0RhdGEsIHByb3BzLm9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcyk7XG4gICAgICAgIC8vIHdpcmUgdGhpbmdzIHVwXG4gICAgICAgIC8vIFRPRE86IG5vdCBEUllcbiAgICAgICAgcHJvcHMuY2FsZW5kYXJBcGkuY3VycmVudERhdGFNYW5hZ2VyID0gdGhpcztcbiAgICAgICAgZW1pdHRlci5zZXRUaGlzQ29udGV4dChwcm9wcy5jYWxlbmRhckFwaSk7XG4gICAgICAgIGVtaXR0ZXIuc2V0T3B0aW9ucyhjdXJyZW50Vmlld0RhdGEub3B0aW9ucyk7XG4gICAgICAgIHZhciBjYWxlbmRhckNvbnRleHQgPSB7XG4gICAgICAgICAgICBkYXRlRW52OiBvcHRpb25zRGF0YS5kYXRlRW52LFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc0RhdGEuY2FsZW5kYXJPcHRpb25zLFxuICAgICAgICAgICAgcGx1Z2luSG9va3M6IG9wdGlvbnNEYXRhLnBsdWdpbkhvb2tzLFxuICAgICAgICAgICAgY2FsZW5kYXJBcGk6IHByb3BzLmNhbGVuZGFyQXBpLFxuICAgICAgICAgICAgZGlzcGF0Y2g6IHRoaXMuZGlzcGF0Y2gsXG4gICAgICAgICAgICBlbWl0dGVyOiBlbWl0dGVyLFxuICAgICAgICAgICAgZ2V0Q3VycmVudERhdGE6IHRoaXMuZ2V0Q3VycmVudERhdGEsXG4gICAgICAgIH07XG4gICAgICAgIHZhciBjdXJyZW50RGF0ZSA9IHN0YXRlLmN1cnJlbnREYXRlLCBkYXRlUHJvZmlsZSA9IHN0YXRlLmRhdGVQcm9maWxlO1xuICAgICAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YS5kYXRlUHJvZmlsZUdlbmVyYXRvciAhPT0gY3VycmVudFZpZXdEYXRhLmRhdGVQcm9maWxlR2VuZXJhdG9yKSB7IC8vIGhhY2tcbiAgICAgICAgICAgIGRhdGVQcm9maWxlID0gY3VycmVudFZpZXdEYXRhLmRhdGVQcm9maWxlR2VuZXJhdG9yLmJ1aWxkKGN1cnJlbnREYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50RGF0ZSA9IHJlZHVjZUN1cnJlbnREYXRlKGN1cnJlbnREYXRlLCBhY3Rpb24pO1xuICAgICAgICBkYXRlUHJvZmlsZSA9IHJlZHVjZURhdGVQcm9maWxlKGRhdGVQcm9maWxlLCBhY3Rpb24sIGN1cnJlbnREYXRlLCBjdXJyZW50Vmlld0RhdGEuZGF0ZVByb2ZpbGVHZW5lcmF0b3IpO1xuICAgICAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdQUkVWJyB8fCAvLyBUT0RPOiBtb3ZlIHRoaXMgbG9naWMgaW50byBEYXRlUHJvZmlsZUdlbmVyYXRvclxuICAgICAgICAgICAgYWN0aW9uLnR5cGUgPT09ICdORVhUJyB8fCAvLyBcIlxuICAgICAgICAgICAgIXJhbmdlQ29udGFpbnNNYXJrZXIoZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlLCBjdXJyZW50RGF0ZSkpIHtcbiAgICAgICAgICAgIGN1cnJlbnREYXRlID0gZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlLnN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBldmVudFNvdXJjZXMgPSByZWR1Y2VFdmVudFNvdXJjZXMoc3RhdGUuZXZlbnRTb3VyY2VzLCBhY3Rpb24sIGRhdGVQcm9maWxlLCBjYWxlbmRhckNvbnRleHQpO1xuICAgICAgICB2YXIgZXZlbnRTdG9yZSA9IHJlZHVjZUV2ZW50U3RvcmUoc3RhdGUuZXZlbnRTdG9yZSwgYWN0aW9uLCBldmVudFNvdXJjZXMsIGRhdGVQcm9maWxlLCBjYWxlbmRhckNvbnRleHQpO1xuICAgICAgICB2YXIgaXNFdmVudHNMb2FkaW5nID0gY29tcHV0ZUV2ZW50U291cmNlc0xvYWRpbmcoZXZlbnRTb3VyY2VzKTsgLy8gQkFELiBhbHNvIGNhbGxlZCBpbiB0aGlzIGZ1bmMgaW4gY29tcHV0ZUlzTG9hZGluZ1xuICAgICAgICB2YXIgcmVuZGVyYWJsZUV2ZW50U3RvcmUgPSAoaXNFdmVudHNMb2FkaW5nICYmICFjdXJyZW50Vmlld0RhdGEub3B0aW9ucy5wcm9ncmVzc2l2ZUV2ZW50UmVuZGVyaW5nKSA/XG4gICAgICAgICAgICAoc3RhdGUucmVuZGVyYWJsZUV2ZW50U3RvcmUgfHwgZXZlbnRTdG9yZSkgOiAvLyB0cnkgZnJvbSBwcmV2aW91cyBzdGF0ZVxuICAgICAgICAgICAgZXZlbnRTdG9yZTtcbiAgICAgICAgdmFyIF9iID0gdGhpcy5idWlsZFZpZXdVaVByb3BzKGNhbGVuZGFyQ29udGV4dCksIGV2ZW50VWlTaW5nbGVCYXNlID0gX2IuZXZlbnRVaVNpbmdsZUJhc2UsIHNlbGVjdGlvbkNvbmZpZyA9IF9iLnNlbGVjdGlvbkNvbmZpZzsgLy8gd2lsbCBtZW1vaXplIG9ialxuICAgICAgICB2YXIgZXZlbnRVaUJ5U291cmNlID0gdGhpcy5idWlsZEV2ZW50VWlCeVNvdXJjZShldmVudFNvdXJjZXMpO1xuICAgICAgICB2YXIgZXZlbnRVaUJhc2VzID0gdGhpcy5idWlsZEV2ZW50VWlCYXNlcyhyZW5kZXJhYmxlRXZlbnRTdG9yZS5kZWZzLCBldmVudFVpU2luZ2xlQmFzZSwgZXZlbnRVaUJ5U291cmNlKTtcbiAgICAgICAgdmFyIG5ld1N0YXRlID0ge1xuICAgICAgICAgICAgZHluYW1pY09wdGlvbk92ZXJyaWRlczogZHluYW1pY09wdGlvbk92ZXJyaWRlcyxcbiAgICAgICAgICAgIGN1cnJlbnRWaWV3VHlwZTogY3VycmVudFZpZXdUeXBlLFxuICAgICAgICAgICAgY3VycmVudERhdGU6IGN1cnJlbnREYXRlLFxuICAgICAgICAgICAgZGF0ZVByb2ZpbGU6IGRhdGVQcm9maWxlLFxuICAgICAgICAgICAgZXZlbnRTb3VyY2VzOiBldmVudFNvdXJjZXMsXG4gICAgICAgICAgICBldmVudFN0b3JlOiBldmVudFN0b3JlLFxuICAgICAgICAgICAgcmVuZGVyYWJsZUV2ZW50U3RvcmU6IHJlbmRlcmFibGVFdmVudFN0b3JlLFxuICAgICAgICAgICAgc2VsZWN0aW9uQ29uZmlnOiBzZWxlY3Rpb25Db25maWcsXG4gICAgICAgICAgICBldmVudFVpQmFzZXM6IGV2ZW50VWlCYXNlcyxcbiAgICAgICAgICAgIGJ1c2luZXNzSG91cnM6IHRoaXMucGFyc2VDb250ZXh0QnVzaW5lc3NIb3VycyhjYWxlbmRhckNvbnRleHQpLFxuICAgICAgICAgICAgZGF0ZVNlbGVjdGlvbjogcmVkdWNlRGF0ZVNlbGVjdGlvbihzdGF0ZS5kYXRlU2VsZWN0aW9uLCBhY3Rpb24pLFxuICAgICAgICAgICAgZXZlbnRTZWxlY3Rpb246IHJlZHVjZVNlbGVjdGVkRXZlbnQoc3RhdGUuZXZlbnRTZWxlY3Rpb24sIGFjdGlvbiksXG4gICAgICAgICAgICBldmVudERyYWc6IHJlZHVjZUV2ZW50RHJhZyhzdGF0ZS5ldmVudERyYWcsIGFjdGlvbiksXG4gICAgICAgICAgICBldmVudFJlc2l6ZTogcmVkdWNlRXZlbnRSZXNpemUoc3RhdGUuZXZlbnRSZXNpemUsIGFjdGlvbiksXG4gICAgICAgIH07XG4gICAgICAgIHZhciBjb250ZXh0QW5kU3RhdGUgPSB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgY2FsZW5kYXJDb250ZXh0KSwgbmV3U3RhdGUpO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9jID0gb3B0aW9uc0RhdGEucGx1Z2luSG9va3MucmVkdWNlcnM7IF9pIDwgX2MubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgcmVkdWNlciA9IF9jW19pXTtcbiAgICAgICAgICAgIHRzbGliLl9fYXNzaWduKG5ld1N0YXRlLCByZWR1Y2VyKHN0YXRlLCBhY3Rpb24sIGNvbnRleHRBbmRTdGF0ZSkpOyAvLyBnaXZlIHRoZSBPTEQgc3RhdGUsIGZvciBvbGQgdmFsdWVcbiAgICAgICAgfVxuICAgICAgICB2YXIgd2FzTG9hZGluZyA9IGNvbXB1dGVJc0xvYWRpbmcoc3RhdGUsIGNhbGVuZGFyQ29udGV4dCk7XG4gICAgICAgIHZhciBpc0xvYWRpbmcgPSBjb21wdXRlSXNMb2FkaW5nKG5ld1N0YXRlLCBjYWxlbmRhckNvbnRleHQpO1xuICAgICAgICAvLyBUT0RPOiB1c2UgcHJvcFNldEhhbmRsZXJzIGluIHBsdWdpbiBzeXN0ZW1cbiAgICAgICAgaWYgKCF3YXNMb2FkaW5nICYmIGlzTG9hZGluZykge1xuICAgICAgICAgICAgZW1pdHRlci50cmlnZ2VyKCdsb2FkaW5nJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAod2FzTG9hZGluZyAmJiAhaXNMb2FkaW5nKSB7XG4gICAgICAgICAgICBlbWl0dGVyLnRyaWdnZXIoJ2xvYWRpbmcnLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICBpZiAocHJvcHMub25BY3Rpb24pIHtcbiAgICAgICAgICAgIHByb3BzLm9uQWN0aW9uKGFjdGlvbik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENhbGVuZGFyRGF0YU1hbmFnZXIucHJvdG90eXBlLnVwZGF0ZURhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIHN0YXRlID0gX2Euc3RhdGU7XG4gICAgICAgIHZhciBvbGREYXRhID0gdGhpcy5kYXRhO1xuICAgICAgICB2YXIgb3B0aW9uc0RhdGEgPSB0aGlzLmNvbXB1dGVPcHRpb25zRGF0YShwcm9wcy5vcHRpb25PdmVycmlkZXMsIHN0YXRlLmR5bmFtaWNPcHRpb25PdmVycmlkZXMsIHByb3BzLmNhbGVuZGFyQXBpKTtcbiAgICAgICAgdmFyIGN1cnJlbnRWaWV3RGF0YSA9IHRoaXMuY29tcHV0ZUN1cnJlbnRWaWV3RGF0YShzdGF0ZS5jdXJyZW50Vmlld1R5cGUsIG9wdGlvbnNEYXRhLCBwcm9wcy5vcHRpb25PdmVycmlkZXMsIHN0YXRlLmR5bmFtaWNPcHRpb25PdmVycmlkZXMpO1xuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSA9IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHsgdmlld1RpdGxlOiB0aGlzLmJ1aWxkVGl0bGUoc3RhdGUuZGF0ZVByb2ZpbGUsIGN1cnJlbnRWaWV3RGF0YS5vcHRpb25zLCBvcHRpb25zRGF0YS5kYXRlRW52KSwgY2FsZW5kYXJBcGk6IHByb3BzLmNhbGVuZGFyQXBpLCBkaXNwYXRjaDogdGhpcy5kaXNwYXRjaCwgZW1pdHRlcjogdGhpcy5lbWl0dGVyLCBnZXRDdXJyZW50RGF0YTogdGhpcy5nZXRDdXJyZW50RGF0YSB9LCBvcHRpb25zRGF0YSksIGN1cnJlbnRWaWV3RGF0YSksIHN0YXRlKTtcbiAgICAgICAgdmFyIGNoYW5nZUhhbmRsZXJzID0gb3B0aW9uc0RhdGEucGx1Z2luSG9va3Mub3B0aW9uQ2hhbmdlSGFuZGxlcnM7XG4gICAgICAgIHZhciBvbGRDYWxlbmRhck9wdGlvbnMgPSBvbGREYXRhICYmIG9sZERhdGEuY2FsZW5kYXJPcHRpb25zO1xuICAgICAgICB2YXIgbmV3Q2FsZW5kYXJPcHRpb25zID0gb3B0aW9uc0RhdGEuY2FsZW5kYXJPcHRpb25zO1xuICAgICAgICBpZiAob2xkQ2FsZW5kYXJPcHRpb25zICYmIG9sZENhbGVuZGFyT3B0aW9ucyAhPT0gbmV3Q2FsZW5kYXJPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAob2xkQ2FsZW5kYXJPcHRpb25zLnRpbWVab25lICE9PSBuZXdDYWxlbmRhck9wdGlvbnMudGltZVpvbmUpIHtcbiAgICAgICAgICAgICAgICAvLyBoYWNrXG4gICAgICAgICAgICAgICAgc3RhdGUuZXZlbnRTb3VyY2VzID0gZGF0YS5ldmVudFNvdXJjZXMgPSByZWR1Y2VFdmVudFNvdXJjZXNOZXdUaW1lWm9uZShkYXRhLmV2ZW50U291cmNlcywgc3RhdGUuZGF0ZVByb2ZpbGUsIGRhdGEpO1xuICAgICAgICAgICAgICAgIHN0YXRlLmV2ZW50U3RvcmUgPSBkYXRhLmV2ZW50U3RvcmUgPSByZXpvbmVFdmVudFN0b3JlRGF0ZXMoZGF0YS5ldmVudFN0b3JlLCBvbGREYXRhLmRhdGVFbnYsIGRhdGEuZGF0ZUVudik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBvcHRpb25OYW1lIGluIGNoYW5nZUhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9sZENhbGVuZGFyT3B0aW9uc1tvcHRpb25OYW1lXSAhPT0gbmV3Q2FsZW5kYXJPcHRpb25zW29wdGlvbk5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZUhhbmRsZXJzW29wdGlvbk5hbWVdKG5ld0NhbGVuZGFyT3B0aW9uc1tvcHRpb25OYW1lXSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wcy5vbkRhdGEpIHtcbiAgICAgICAgICAgIHByb3BzLm9uRGF0YShkYXRhKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ2FsZW5kYXJEYXRhTWFuYWdlci5wcm90b3R5cGUuX2NvbXB1dGVPcHRpb25zRGF0YSA9IGZ1bmN0aW9uIChvcHRpb25PdmVycmlkZXMsIGR5bmFtaWNPcHRpb25PdmVycmlkZXMsIGNhbGVuZGFyQXBpKSB7XG4gICAgICAgIC8vIFRPRE86IGJsYWNrbGlzdCBvcHRpb25zIHRoYXQgYXJlIGhhbmRsZWQgYnkgb3B0aW9uQ2hhbmdlSGFuZGxlcnNcbiAgICAgICAgdmFyIF9hID0gdGhpcy5wcm9jZXNzUmF3Q2FsZW5kYXJPcHRpb25zKG9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcyksIHJlZmluZWRPcHRpb25zID0gX2EucmVmaW5lZE9wdGlvbnMsIHBsdWdpbkhvb2tzID0gX2EucGx1Z2luSG9va3MsIGxvY2FsZURlZmF1bHRzID0gX2EubG9jYWxlRGVmYXVsdHMsIGF2YWlsYWJsZUxvY2FsZURhdGEgPSBfYS5hdmFpbGFibGVMb2NhbGVEYXRhLCBleHRyYSA9IF9hLmV4dHJhO1xuICAgICAgICB3YXJuVW5rbm93bk9wdGlvbnMoZXh0cmEpO1xuICAgICAgICB2YXIgZGF0ZUVudiA9IHRoaXMuYnVpbGREYXRlRW52KHJlZmluZWRPcHRpb25zLnRpbWVab25lLCByZWZpbmVkT3B0aW9ucy5sb2NhbGUsIHJlZmluZWRPcHRpb25zLndlZWtOdW1iZXJDYWxjdWxhdGlvbiwgcmVmaW5lZE9wdGlvbnMuZmlyc3REYXksIHJlZmluZWRPcHRpb25zLndlZWtUZXh0LCBwbHVnaW5Ib29rcywgYXZhaWxhYmxlTG9jYWxlRGF0YSwgcmVmaW5lZE9wdGlvbnMuZGVmYXVsdFJhbmdlU2VwYXJhdG9yKTtcbiAgICAgICAgdmFyIHZpZXdTcGVjcyA9IHRoaXMuYnVpbGRWaWV3U3BlY3MocGx1Z2luSG9va3Mudmlld3MsIG9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcywgbG9jYWxlRGVmYXVsdHMpO1xuICAgICAgICB2YXIgdGhlbWUgPSB0aGlzLmJ1aWxkVGhlbWUocmVmaW5lZE9wdGlvbnMsIHBsdWdpbkhvb2tzKTtcbiAgICAgICAgdmFyIHRvb2xiYXJDb25maWcgPSB0aGlzLnBhcnNlVG9vbGJhcnMocmVmaW5lZE9wdGlvbnMsIG9wdGlvbk92ZXJyaWRlcywgdGhlbWUsIHZpZXdTcGVjcywgY2FsZW5kYXJBcGkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2FsZW5kYXJPcHRpb25zOiByZWZpbmVkT3B0aW9ucyxcbiAgICAgICAgICAgIHBsdWdpbkhvb2tzOiBwbHVnaW5Ib29rcyxcbiAgICAgICAgICAgIGRhdGVFbnY6IGRhdGVFbnYsXG4gICAgICAgICAgICB2aWV3U3BlY3M6IHZpZXdTcGVjcyxcbiAgICAgICAgICAgIHRoZW1lOiB0aGVtZSxcbiAgICAgICAgICAgIHRvb2xiYXJDb25maWc6IHRvb2xiYXJDb25maWcsXG4gICAgICAgICAgICBsb2NhbGVEZWZhdWx0czogbG9jYWxlRGVmYXVsdHMsXG4gICAgICAgICAgICBhdmFpbGFibGVSYXdMb2NhbGVzOiBhdmFpbGFibGVMb2NhbGVEYXRhLm1hcCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8vIGFsd2F5cyBjYWxsZWQgZnJvbSBiZWhpbmQgYSBtZW1vaXplclxuICAgIENhbGVuZGFyRGF0YU1hbmFnZXIucHJvdG90eXBlLnByb2Nlc3NSYXdDYWxlbmRhck9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9uT3ZlcnJpZGVzLCBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzKSB7XG4gICAgICAgIHZhciBfYSA9IG1lcmdlUmF3T3B0aW9ucyhbXG4gICAgICAgICAgICBCQVNFX09QVElPTl9ERUZBVUxUUyxcbiAgICAgICAgICAgIG9wdGlvbk92ZXJyaWRlcyxcbiAgICAgICAgICAgIGR5bmFtaWNPcHRpb25PdmVycmlkZXMsXG4gICAgICAgIF0pLCBsb2NhbGVzID0gX2EubG9jYWxlcywgbG9jYWxlID0gX2EubG9jYWxlO1xuICAgICAgICB2YXIgYXZhaWxhYmxlTG9jYWxlRGF0YSA9IHRoaXMub3JnYW5pemVSYXdMb2NhbGVzKGxvY2FsZXMpO1xuICAgICAgICB2YXIgYXZhaWxhYmxlUmF3TG9jYWxlcyA9IGF2YWlsYWJsZUxvY2FsZURhdGEubWFwO1xuICAgICAgICB2YXIgbG9jYWxlRGVmYXVsdHMgPSB0aGlzLmJ1aWxkTG9jYWxlKGxvY2FsZSB8fCBhdmFpbGFibGVMb2NhbGVEYXRhLmRlZmF1bHRDb2RlLCBhdmFpbGFibGVSYXdMb2NhbGVzKS5vcHRpb25zO1xuICAgICAgICB2YXIgcGx1Z2luSG9va3MgPSB0aGlzLmJ1aWxkUGx1Z2luSG9va3Mob3B0aW9uT3ZlcnJpZGVzLnBsdWdpbnMgfHwgW10sIGdsb2JhbFBsdWdpbnMpO1xuICAgICAgICB2YXIgcmVmaW5lcnMgPSB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNSZWZpbmVycyA9IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBCQVNFX09QVElPTl9SRUZJTkVSUyksIENBTEVOREFSX0xJU1RFTkVSX1JFRklORVJTKSwgQ0FMRU5EQVJfT1BUSU9OX1JFRklORVJTKSwgcGx1Z2luSG9va3MubGlzdGVuZXJSZWZpbmVycyksIHBsdWdpbkhvb2tzLm9wdGlvblJlZmluZXJzKTtcbiAgICAgICAgdmFyIGV4dHJhID0ge307XG4gICAgICAgIHZhciByYXcgPSBtZXJnZVJhd09wdGlvbnMoW1xuICAgICAgICAgICAgQkFTRV9PUFRJT05fREVGQVVMVFMsXG4gICAgICAgICAgICBsb2NhbGVEZWZhdWx0cyxcbiAgICAgICAgICAgIG9wdGlvbk92ZXJyaWRlcyxcbiAgICAgICAgICAgIGR5bmFtaWNPcHRpb25PdmVycmlkZXMsXG4gICAgICAgIF0pO1xuICAgICAgICB2YXIgcmVmaW5lZCA9IHt9O1xuICAgICAgICB2YXIgY3VycmVudFJhdyA9IHRoaXMuY3VycmVudENhbGVuZGFyT3B0aW9uc0lucHV0O1xuICAgICAgICB2YXIgY3VycmVudFJlZmluZWQgPSB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNSZWZpbmVkO1xuICAgICAgICB2YXIgYW55Q2hhbmdlcyA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBvcHRpb25OYW1lIGluIHJhdykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbk5hbWUgIT09ICdwbHVnaW5zJykgeyAvLyBiZWNhdXNlIHBsdWdpbnMgaXMgc3BlY2lhbC1jYXNlZFxuICAgICAgICAgICAgICAgIGlmIChyYXdbb3B0aW9uTmFtZV0gPT09IGN1cnJlbnRSYXdbb3B0aW9uTmFtZV0gfHxcbiAgICAgICAgICAgICAgICAgICAgKENPTVBMRVhfT1BUSU9OX0NPTVBBUkFUT1JTW29wdGlvbk5hbWVdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uTmFtZSBpbiBjdXJyZW50UmF3KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlNbb3B0aW9uTmFtZV0oY3VycmVudFJhd1tvcHRpb25OYW1lXSwgcmF3W29wdGlvbk5hbWVdKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmaW5lZFtvcHRpb25OYW1lXSA9IGN1cnJlbnRSZWZpbmVkW29wdGlvbk5hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZpbmVyc1tvcHRpb25OYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICByZWZpbmVkW29wdGlvbk5hbWVdID0gcmVmaW5lcnNbb3B0aW9uTmFtZV0ocmF3W29wdGlvbk5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgYW55Q2hhbmdlcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBleHRyYVtvcHRpb25OYW1lXSA9IGN1cnJlbnRSYXdbb3B0aW9uTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhbnlDaGFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNJbnB1dCA9IHJhdztcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGVuZGFyT3B0aW9uc1JlZmluZWQgPSByZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByYXdPcHRpb25zOiB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNJbnB1dCxcbiAgICAgICAgICAgIHJlZmluZWRPcHRpb25zOiB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNSZWZpbmVkLFxuICAgICAgICAgICAgcGx1Z2luSG9va3M6IHBsdWdpbkhvb2tzLFxuICAgICAgICAgICAgYXZhaWxhYmxlTG9jYWxlRGF0YTogYXZhaWxhYmxlTG9jYWxlRGF0YSxcbiAgICAgICAgICAgIGxvY2FsZURlZmF1bHRzOiBsb2NhbGVEZWZhdWx0cyxcbiAgICAgICAgICAgIGV4dHJhOiBleHRyYSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIENhbGVuZGFyRGF0YU1hbmFnZXIucHJvdG90eXBlLl9jb21wdXRlQ3VycmVudFZpZXdEYXRhID0gZnVuY3Rpb24gKHZpZXdUeXBlLCBvcHRpb25zRGF0YSwgb3B0aW9uT3ZlcnJpZGVzLCBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzKSB7XG4gICAgICAgIHZhciB2aWV3U3BlYyA9IG9wdGlvbnNEYXRhLnZpZXdTcGVjc1t2aWV3VHlwZV07XG4gICAgICAgIGlmICghdmlld1NwZWMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInZpZXdUeXBlIFxcXCJcIiArIHZpZXdUeXBlICsgXCJcXFwiIGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSBtYWtlIHN1cmUgeW91J3ZlIGxvYWRlZCBhbGwgbmVjY2Vzc2FyeSBwbHVnaW5zXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfYSA9IHRoaXMucHJvY2Vzc1Jhd1ZpZXdPcHRpb25zKHZpZXdTcGVjLCBvcHRpb25zRGF0YS5wbHVnaW5Ib29rcywgb3B0aW9uc0RhdGEubG9jYWxlRGVmYXVsdHMsIG9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcyksIHJlZmluZWRPcHRpb25zID0gX2EucmVmaW5lZE9wdGlvbnMsIGV4dHJhID0gX2EuZXh0cmE7XG4gICAgICAgIHdhcm5Vbmtub3duT3B0aW9ucyhleHRyYSk7XG4gICAgICAgIHZhciBkYXRlUHJvZmlsZUdlbmVyYXRvciA9IHRoaXMuYnVpbGREYXRlUHJvZmlsZUdlbmVyYXRvcih7XG4gICAgICAgICAgICBkYXRlUHJvZmlsZUdlbmVyYXRvckNsYXNzOiB2aWV3U3BlYy5vcHRpb25EZWZhdWx0cy5kYXRlUHJvZmlsZUdlbmVyYXRvckNsYXNzLFxuICAgICAgICAgICAgZHVyYXRpb246IHZpZXdTcGVjLmR1cmF0aW9uLFxuICAgICAgICAgICAgZHVyYXRpb25Vbml0OiB2aWV3U3BlYy5kdXJhdGlvblVuaXQsXG4gICAgICAgICAgICB1c2VzTWluTWF4VGltZTogdmlld1NwZWMub3B0aW9uRGVmYXVsdHMudXNlc01pbk1heFRpbWUsXG4gICAgICAgICAgICBkYXRlRW52OiBvcHRpb25zRGF0YS5kYXRlRW52LFxuICAgICAgICAgICAgY2FsZW5kYXJBcGk6IHRoaXMucHJvcHMuY2FsZW5kYXJBcGksXG4gICAgICAgICAgICBzbG90TWluVGltZTogcmVmaW5lZE9wdGlvbnMuc2xvdE1pblRpbWUsXG4gICAgICAgICAgICBzbG90TWF4VGltZTogcmVmaW5lZE9wdGlvbnMuc2xvdE1heFRpbWUsXG4gICAgICAgICAgICBzaG93Tm9uQ3VycmVudERhdGVzOiByZWZpbmVkT3B0aW9ucy5zaG93Tm9uQ3VycmVudERhdGVzLFxuICAgICAgICAgICAgZGF5Q291bnQ6IHJlZmluZWRPcHRpb25zLmRheUNvdW50LFxuICAgICAgICAgICAgZGF0ZUFsaWdubWVudDogcmVmaW5lZE9wdGlvbnMuZGF0ZUFsaWdubWVudCxcbiAgICAgICAgICAgIGRhdGVJbmNyZW1lbnQ6IHJlZmluZWRPcHRpb25zLmRhdGVJbmNyZW1lbnQsXG4gICAgICAgICAgICBoaWRkZW5EYXlzOiByZWZpbmVkT3B0aW9ucy5oaWRkZW5EYXlzLFxuICAgICAgICAgICAgd2Vla2VuZHM6IHJlZmluZWRPcHRpb25zLndlZWtlbmRzLFxuICAgICAgICAgICAgbm93SW5wdXQ6IHJlZmluZWRPcHRpb25zLm5vdyxcbiAgICAgICAgICAgIHZhbGlkUmFuZ2VJbnB1dDogcmVmaW5lZE9wdGlvbnMudmFsaWRSYW5nZSxcbiAgICAgICAgICAgIHZpc2libGVSYW5nZUlucHV0OiByZWZpbmVkT3B0aW9ucy52aXNpYmxlUmFuZ2UsXG4gICAgICAgICAgICBtb250aE1vZGU6IHJlZmluZWRPcHRpb25zLm1vbnRoTW9kZSxcbiAgICAgICAgICAgIGZpeGVkV2Vla0NvdW50OiByZWZpbmVkT3B0aW9ucy5maXhlZFdlZWtDb3VudCxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB2aWV3QXBpID0gdGhpcy5idWlsZFZpZXdBcGkodmlld1R5cGUsIHRoaXMuZ2V0Q3VycmVudERhdGEsIG9wdGlvbnNEYXRhLmRhdGVFbnYpO1xuICAgICAgICByZXR1cm4geyB2aWV3U3BlYzogdmlld1NwZWMsIG9wdGlvbnM6IHJlZmluZWRPcHRpb25zLCBkYXRlUHJvZmlsZUdlbmVyYXRvcjogZGF0ZVByb2ZpbGVHZW5lcmF0b3IsIHZpZXdBcGk6IHZpZXdBcGkgfTtcbiAgICB9O1xuICAgIENhbGVuZGFyRGF0YU1hbmFnZXIucHJvdG90eXBlLnByb2Nlc3NSYXdWaWV3T3B0aW9ucyA9IGZ1bmN0aW9uICh2aWV3U3BlYywgcGx1Z2luSG9va3MsIGxvY2FsZURlZmF1bHRzLCBvcHRpb25PdmVycmlkZXMsIGR5bmFtaWNPcHRpb25PdmVycmlkZXMpIHtcbiAgICAgICAgdmFyIHJhdyA9IG1lcmdlUmF3T3B0aW9ucyhbXG4gICAgICAgICAgICBCQVNFX09QVElPTl9ERUZBVUxUUyxcbiAgICAgICAgICAgIHZpZXdTcGVjLm9wdGlvbkRlZmF1bHRzLFxuICAgICAgICAgICAgbG9jYWxlRGVmYXVsdHMsXG4gICAgICAgICAgICBvcHRpb25PdmVycmlkZXMsXG4gICAgICAgICAgICB2aWV3U3BlYy5vcHRpb25PdmVycmlkZXMsXG4gICAgICAgICAgICBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzLFxuICAgICAgICBdKTtcbiAgICAgICAgdmFyIHJlZmluZXJzID0gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIEJBU0VfT1BUSU9OX1JFRklORVJTKSwgQ0FMRU5EQVJfTElTVEVORVJfUkVGSU5FUlMpLCBDQUxFTkRBUl9PUFRJT05fUkVGSU5FUlMpLCBWSUVXX09QVElPTl9SRUZJTkVSUyksIHBsdWdpbkhvb2tzLmxpc3RlbmVyUmVmaW5lcnMpLCBwbHVnaW5Ib29rcy5vcHRpb25SZWZpbmVycyk7XG4gICAgICAgIHZhciByZWZpbmVkID0ge307XG4gICAgICAgIHZhciBjdXJyZW50UmF3ID0gdGhpcy5jdXJyZW50Vmlld09wdGlvbnNJbnB1dDtcbiAgICAgICAgdmFyIGN1cnJlbnRSZWZpbmVkID0gdGhpcy5jdXJyZW50Vmlld09wdGlvbnNSZWZpbmVkO1xuICAgICAgICB2YXIgYW55Q2hhbmdlcyA9IGZhbHNlO1xuICAgICAgICB2YXIgZXh0cmEgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgb3B0aW9uTmFtZSBpbiByYXcpIHtcbiAgICAgICAgICAgIGlmIChyYXdbb3B0aW9uTmFtZV0gPT09IGN1cnJlbnRSYXdbb3B0aW9uTmFtZV0gfHxcbiAgICAgICAgICAgICAgICAoQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlNbb3B0aW9uTmFtZV0gJiZcbiAgICAgICAgICAgICAgICAgICAgQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlNbb3B0aW9uTmFtZV0ocmF3W29wdGlvbk5hbWVdLCBjdXJyZW50UmF3W29wdGlvbk5hbWVdKSkpIHtcbiAgICAgICAgICAgICAgICByZWZpbmVkW29wdGlvbk5hbWVdID0gY3VycmVudFJlZmluZWRbb3B0aW9uTmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmF3W29wdGlvbk5hbWVdID09PSB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNJbnB1dFtvcHRpb25OYW1lXSB8fFxuICAgICAgICAgICAgICAgICAgICAoQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlNbb3B0aW9uTmFtZV0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIENPTVBMRVhfT1BUSU9OX0NPTVBBUkFUT1JTW29wdGlvbk5hbWVdKHJhd1tvcHRpb25OYW1lXSwgdGhpcy5jdXJyZW50Q2FsZW5kYXJPcHRpb25zSW5wdXRbb3B0aW9uTmFtZV0pKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTmFtZSBpbiB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNSZWZpbmVkKSB7IC8vIG1pZ2h0IGJlIGFuIFwiZXh0cmFcIiBwcm9wXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZpbmVkW29wdGlvbk5hbWVdID0gdGhpcy5jdXJyZW50Q2FsZW5kYXJPcHRpb25zUmVmaW5lZFtvcHRpb25OYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZpbmVyc1tvcHRpb25OYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICByZWZpbmVkW29wdGlvbk5hbWVdID0gcmVmaW5lcnNbb3B0aW9uTmFtZV0ocmF3W29wdGlvbk5hbWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhW29wdGlvbk5hbWVdID0gcmF3W29wdGlvbk5hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhbnlDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYW55Q2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Vmlld09wdGlvbnNJbnB1dCA9IHJhdztcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZpZXdPcHRpb25zUmVmaW5lZCA9IHJlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhd09wdGlvbnM6IHRoaXMuY3VycmVudFZpZXdPcHRpb25zSW5wdXQsXG4gICAgICAgICAgICByZWZpbmVkT3B0aW9uczogdGhpcy5jdXJyZW50Vmlld09wdGlvbnNSZWZpbmVkLFxuICAgICAgICAgICAgZXh0cmE6IGV4dHJhLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIENhbGVuZGFyRGF0YU1hbmFnZXI7XG59KCkpO1xuZnVuY3Rpb24gYnVpbGREYXRlRW52KHRpbWVab25lLCBleHBsaWNpdExvY2FsZSwgd2Vla051bWJlckNhbGN1bGF0aW9uLCBmaXJzdERheSwgd2Vla1RleHQsIHBsdWdpbkhvb2tzLCBhdmFpbGFibGVMb2NhbGVEYXRhLCBkZWZhdWx0U2VwYXJhdG9yKSB7XG4gICAgdmFyIGxvY2FsZSA9IGJ1aWxkTG9jYWxlKGV4cGxpY2l0TG9jYWxlIHx8IGF2YWlsYWJsZUxvY2FsZURhdGEuZGVmYXVsdENvZGUsIGF2YWlsYWJsZUxvY2FsZURhdGEubWFwKTtcbiAgICByZXR1cm4gbmV3IERhdGVFbnYoe1xuICAgICAgICBjYWxlbmRhclN5c3RlbTogJ2dyZWdvcnknLFxuICAgICAgICB0aW1lWm9uZTogdGltZVpvbmUsXG4gICAgICAgIG5hbWVkVGltZVpvbmVJbXBsOiBwbHVnaW5Ib29rcy5uYW1lZFRpbWVab25lZEltcGwsXG4gICAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgICB3ZWVrTnVtYmVyQ2FsY3VsYXRpb246IHdlZWtOdW1iZXJDYWxjdWxhdGlvbixcbiAgICAgICAgZmlyc3REYXk6IGZpcnN0RGF5LFxuICAgICAgICB3ZWVrVGV4dDogd2Vla1RleHQsXG4gICAgICAgIGNtZEZvcm1hdHRlcjogcGx1Z2luSG9va3MuY21kRm9ybWF0dGVyLFxuICAgICAgICBkZWZhdWx0U2VwYXJhdG9yOiBkZWZhdWx0U2VwYXJhdG9yLFxuICAgIH0pO1xufVxuZnVuY3Rpb24gYnVpbGRUaGVtZShvcHRpb25zLCBwbHVnaW5Ib29rcykge1xuICAgIHZhciBUaGVtZUNsYXNzID0gcGx1Z2luSG9va3MudGhlbWVDbGFzc2VzW29wdGlvbnMudGhlbWVTeXN0ZW1dIHx8IFN0YW5kYXJkVGhlbWU7XG4gICAgcmV0dXJuIG5ldyBUaGVtZUNsYXNzKG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gYnVpbGREYXRlUHJvZmlsZUdlbmVyYXRvcihwcm9wcykge1xuICAgIHZhciBEYXRlUHJvZmlsZUdlbmVyYXRvckNsYXNzID0gcHJvcHMuZGF0ZVByb2ZpbGVHZW5lcmF0b3JDbGFzcyB8fCBEYXRlUHJvZmlsZUdlbmVyYXRvcjtcbiAgICByZXR1cm4gbmV3IERhdGVQcm9maWxlR2VuZXJhdG9yQ2xhc3MocHJvcHMpO1xufVxuZnVuY3Rpb24gYnVpbGRWaWV3QXBpKHR5cGUsIGdldEN1cnJlbnREYXRhLCBkYXRlRW52KSB7XG4gICAgcmV0dXJuIG5ldyBWaWV3QXBpKHR5cGUsIGdldEN1cnJlbnREYXRhLCBkYXRlRW52KTtcbn1cbmZ1bmN0aW9uIGJ1aWxkRXZlbnRVaUJ5U291cmNlKGV2ZW50U291cmNlcykge1xuICAgIHJldHVybiBtYXBIYXNoKGV2ZW50U291cmNlcywgZnVuY3Rpb24gKGV2ZW50U291cmNlKSB7IHJldHVybiBldmVudFNvdXJjZS51aTsgfSk7XG59XG5mdW5jdGlvbiBidWlsZEV2ZW50VWlCYXNlcyhldmVudERlZnMsIGV2ZW50VWlTaW5nbGVCYXNlLCBldmVudFVpQnlTb3VyY2UpIHtcbiAgICB2YXIgZXZlbnRVaUJhc2VzID0geyAnJzogZXZlbnRVaVNpbmdsZUJhc2UgfTtcbiAgICBmb3IgKHZhciBkZWZJZCBpbiBldmVudERlZnMpIHtcbiAgICAgICAgdmFyIGRlZiA9IGV2ZW50RGVmc1tkZWZJZF07XG4gICAgICAgIGlmIChkZWYuc291cmNlSWQgJiYgZXZlbnRVaUJ5U291cmNlW2RlZi5zb3VyY2VJZF0pIHtcbiAgICAgICAgICAgIGV2ZW50VWlCYXNlc1tkZWZJZF0gPSBldmVudFVpQnlTb3VyY2VbZGVmLnNvdXJjZUlkXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXZlbnRVaUJhc2VzO1xufVxuZnVuY3Rpb24gYnVpbGRWaWV3VWlQcm9wcyhjYWxlbmRhckNvbnRleHQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGNhbGVuZGFyQ29udGV4dC5vcHRpb25zO1xuICAgIHJldHVybiB7XG4gICAgICAgIGV2ZW50VWlTaW5nbGVCYXNlOiBjcmVhdGVFdmVudFVpKHtcbiAgICAgICAgICAgIGRpc3BsYXk6IG9wdGlvbnMuZXZlbnREaXNwbGF5LFxuICAgICAgICAgICAgZWRpdGFibGU6IG9wdGlvbnMuZWRpdGFibGUsXG4gICAgICAgICAgICBzdGFydEVkaXRhYmxlOiBvcHRpb25zLmV2ZW50U3RhcnRFZGl0YWJsZSxcbiAgICAgICAgICAgIGR1cmF0aW9uRWRpdGFibGU6IG9wdGlvbnMuZXZlbnREdXJhdGlvbkVkaXRhYmxlLFxuICAgICAgICAgICAgY29uc3RyYWludDogb3B0aW9ucy5ldmVudENvbnN0cmFpbnQsXG4gICAgICAgICAgICBvdmVybGFwOiB0eXBlb2Ygb3B0aW9ucy5ldmVudE92ZXJsYXAgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuZXZlbnRPdmVybGFwIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYWxsb3c6IG9wdGlvbnMuZXZlbnRBbGxvdyxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5ldmVudEJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmV2ZW50Qm9yZGVyQ29sb3IsXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IG9wdGlvbnMuZXZlbnRUZXh0Q29sb3IsXG4gICAgICAgICAgICBjb2xvcjogb3B0aW9ucy5ldmVudENvbG9yLFxuICAgICAgICAgICAgLy8gY2xhc3NOYW1lczogb3B0aW9ucy5ldmVudENsYXNzTmFtZXMgLy8gcmVuZGVyIGhvb2sgd2lsbCBoYW5kbGUgdGhpc1xuICAgICAgICB9LCBjYWxlbmRhckNvbnRleHQpLFxuICAgICAgICBzZWxlY3Rpb25Db25maWc6IGNyZWF0ZUV2ZW50VWkoe1xuICAgICAgICAgICAgY29uc3RyYWludDogb3B0aW9ucy5zZWxlY3RDb25zdHJhaW50LFxuICAgICAgICAgICAgb3ZlcmxhcDogdHlwZW9mIG9wdGlvbnMuc2VsZWN0T3ZlcmxhcCA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5zZWxlY3RPdmVybGFwIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYWxsb3c6IG9wdGlvbnMuc2VsZWN0QWxsb3csXG4gICAgICAgIH0sIGNhbGVuZGFyQ29udGV4dCksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVJc0xvYWRpbmcoc3RhdGUsIGNvbnRleHQpIHtcbiAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gY29udGV4dC5wbHVnaW5Ib29rcy5pc0xvYWRpbmdGdW5jczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGlzTG9hZGluZ0Z1bmMgPSBfYVtfaV07XG4gICAgICAgIGlmIChpc0xvYWRpbmdGdW5jKHN0YXRlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gcGFyc2VDb250ZXh0QnVzaW5lc3NIb3VycyhjYWxlbmRhckNvbnRleHQpIHtcbiAgICByZXR1cm4gcGFyc2VCdXNpbmVzc0hvdXJzKGNhbGVuZGFyQ29udGV4dC5vcHRpb25zLmJ1c2luZXNzSG91cnMsIGNhbGVuZGFyQ29udGV4dCk7XG59XG5mdW5jdGlvbiB3YXJuVW5rbm93bk9wdGlvbnMob3B0aW9ucywgdmlld05hbWUpIHtcbiAgICBmb3IgKHZhciBvcHRpb25OYW1lIGluIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiVW5rbm93biBvcHRpb24gJ1wiICsgb3B0aW9uTmFtZSArIFwiJ1wiICtcbiAgICAgICAgICAgICh2aWV3TmFtZSA/IFwiIGZvciB2aWV3ICdcIiArIHZpZXdOYW1lICsgXCInXCIgOiAnJykpO1xuICAgIH1cbn1cblxuLy8gVE9ETzogbW92ZSB0aGlzIHRvIHJlYWN0IHBsdWdpbj9cbnZhciBDYWxlbmRhckRhdGFQcm92aWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoQ2FsZW5kYXJEYXRhUHJvdmlkZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ2FsZW5kYXJEYXRhUHJvdmlkZXIocHJvcHMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmhhbmRsZURhdGEgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgaWYgKCFfdGhpcy5kYXRhTWFuYWdlcikgeyAvLyBzdGlsbCB3aXRoaW4gaW5pdGlhbCBydW4sIGJlZm9yZSBhc3NpZ25tZW50IGluIGNvbnN0cnVjdG9yXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWRpcmVjdC1tdXRhdGlvbi1zdGF0ZVxuICAgICAgICAgICAgICAgIF90aGlzLnN0YXRlID0gZGF0YTsgLy8gY2FuJ3QgdXNlIHNldFN0YXRlIHlldFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuc2V0U3RhdGUoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmRhdGFNYW5hZ2VyID0gbmV3IENhbGVuZGFyRGF0YU1hbmFnZXIoe1xuICAgICAgICAgICAgb3B0aW9uT3ZlcnJpZGVzOiBwcm9wcy5vcHRpb25PdmVycmlkZXMsXG4gICAgICAgICAgICBjYWxlbmRhckFwaTogcHJvcHMuY2FsZW5kYXJBcGksXG4gICAgICAgICAgICBvbkRhdGE6IF90aGlzLmhhbmRsZURhdGEsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIENhbGVuZGFyRGF0YVByb3ZpZGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuKHRoaXMuc3RhdGUpO1xuICAgIH07XG4gICAgQ2FsZW5kYXJEYXRhUHJvdmlkZXIucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIChwcmV2UHJvcHMpIHtcbiAgICAgICAgdmFyIG5ld09wdGlvbk92ZXJyaWRlcyA9IHRoaXMucHJvcHMub3B0aW9uT3ZlcnJpZGVzO1xuICAgICAgICBpZiAobmV3T3B0aW9uT3ZlcnJpZGVzICE9PSBwcmV2UHJvcHMub3B0aW9uT3ZlcnJpZGVzKSB7IC8vIHByZXZlbnQgcmVjdXJzaXZlIGhhbmRsZURhdGFcbiAgICAgICAgICAgIHRoaXMuZGF0YU1hbmFnZXIucmVzZXRPcHRpb25zKG5ld09wdGlvbk92ZXJyaWRlcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDYWxlbmRhckRhdGFQcm92aWRlcjtcbn0odmRvbV9janMuQ29tcG9uZW50KSk7XG5cbi8vIEhFTFBFUlNcbi8qXG5pZiBuZXh0RGF5VGhyZXNob2xkIGlzIHNwZWNpZmllZCwgc2xpY2luZyBpcyBkb25lIGluIGFuIGFsbC1kYXkgZmFzaGlvbi5cbnlvdSBjYW4gZ2V0IG5leHREYXlUaHJlc2hvbGQgZnJvbSBjb250ZXh0Lm5leHREYXlUaHJlc2hvbGRcbiovXG5mdW5jdGlvbiBzbGljZUV2ZW50cyhwcm9wcywgYWxsRGF5KSB7XG4gICAgcmV0dXJuIHNsaWNlRXZlbnRTdG9yZShwcm9wcy5ldmVudFN0b3JlLCBwcm9wcy5ldmVudFVpQmFzZXMsIHByb3BzLmRhdGVQcm9maWxlLmFjdGl2ZVJhbmdlLCBhbGxEYXkgPyBwcm9wcy5uZXh0RGF5VGhyZXNob2xkIDogbnVsbCkuZmc7XG59XG5cbnZhciBOYW1lZFRpbWVab25lSW1wbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOYW1lZFRpbWVab25lSW1wbCh0aW1lWm9uZU5hbWUpIHtcbiAgICAgICAgdGhpcy50aW1lWm9uZU5hbWUgPSB0aW1lWm9uZU5hbWU7XG4gICAgfVxuICAgIHJldHVybiBOYW1lZFRpbWVab25lSW1wbDtcbn0oKSk7XG5cbnZhciBTZWdIaWVyYXJjaHkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2VnSGllcmFyY2h5KCkge1xuICAgICAgICAvLyBzZXR0aW5nc1xuICAgICAgICB0aGlzLnN0cmljdE9yZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWxsb3dSZXNsaWNpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tYXhDb29yZCA9IC0xOyAvLyAtMSBtZWFucyBubyBtYXhcbiAgICAgICAgdGhpcy5tYXhTdGFja0NudCA9IC0xOyAvLyAtMSBtZWFucyBubyBtYXhcbiAgICAgICAgdGhpcy5sZXZlbENvb3JkcyA9IFtdOyAvLyBvcmRlcmVkXG4gICAgICAgIHRoaXMuZW50cmllc0J5TGV2ZWwgPSBbXTsgLy8gcGFyYWxsZWwgd2l0aCBsZXZlbENvb3Jkc1xuICAgICAgICB0aGlzLnN0YWNrQ250cyA9IHt9OyAvLyBUT0RPOiB1c2UgYmV0dGVyIHRlY2huaXF1ZSE/XG4gICAgfVxuICAgIFNlZ0hpZXJhcmNoeS5wcm90b3R5cGUuYWRkU2VncyA9IGZ1bmN0aW9uIChpbnB1dHMpIHtcbiAgICAgICAgdmFyIGhpZGRlbkVudHJpZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBpbnB1dHNfMSA9IGlucHV0czsgX2kgPCBpbnB1dHNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBpbnB1dCA9IGlucHV0c18xW19pXTtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0RW50cnkoaW5wdXQsIGhpZGRlbkVudHJpZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoaWRkZW5FbnRyaWVzO1xuICAgIH07XG4gICAgU2VnSGllcmFyY2h5LnByb3RvdHlwZS5pbnNlcnRFbnRyeSA9IGZ1bmN0aW9uIChlbnRyeSwgaGlkZGVuRW50cmllcykge1xuICAgICAgICB2YXIgaW5zZXJ0aW9uID0gdGhpcy5maW5kSW5zZXJ0aW9uKGVudHJ5KTtcbiAgICAgICAgaWYgKHRoaXMuaXNJbnNlcnRpb25WYWxpZChpbnNlcnRpb24sIGVudHJ5KSkge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRFbnRyeUF0KGVudHJ5LCBpbnNlcnRpb24pO1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlSW52YWxpZEluc2VydGlvbihpbnNlcnRpb24sIGVudHJ5LCBoaWRkZW5FbnRyaWVzKTtcbiAgICB9O1xuICAgIFNlZ0hpZXJhcmNoeS5wcm90b3R5cGUuaXNJbnNlcnRpb25WYWxpZCA9IGZ1bmN0aW9uIChpbnNlcnRpb24sIGVudHJ5KSB7XG4gICAgICAgIHJldHVybiAodGhpcy5tYXhDb29yZCA9PT0gLTEgfHwgaW5zZXJ0aW9uLmxldmVsQ29vcmQgKyBlbnRyeS50aGlja25lc3MgPD0gdGhpcy5tYXhDb29yZCkgJiZcbiAgICAgICAgICAgICh0aGlzLm1heFN0YWNrQ250ID09PSAtMSB8fCBpbnNlcnRpb24uc3RhY2tDbnQgPCB0aGlzLm1heFN0YWNrQ250KTtcbiAgICB9O1xuICAgIC8vIHJldHVybnMgbnVtYmVyIG9mIG5ldyBlbnRyaWVzIGluc2VydGVkXG4gICAgU2VnSGllcmFyY2h5LnByb3RvdHlwZS5oYW5kbGVJbnZhbGlkSW5zZXJ0aW9uID0gZnVuY3Rpb24gKGluc2VydGlvbiwgZW50cnksIGhpZGRlbkVudHJpZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dSZXNsaWNpbmcgJiYgaW5zZXJ0aW9uLnRvdWNoaW5nRW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNwbGl0RW50cnkoZW50cnksIGluc2VydGlvbi50b3VjaGluZ0VudHJ5LCBoaWRkZW5FbnRyaWVzKTtcbiAgICAgICAgfVxuICAgICAgICBoaWRkZW5FbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9O1xuICAgIFNlZ0hpZXJhcmNoeS5wcm90b3R5cGUuc3BsaXRFbnRyeSA9IGZ1bmN0aW9uIChlbnRyeSwgYmFycmllciwgaGlkZGVuRW50cmllcykge1xuICAgICAgICB2YXIgcGFydENudCA9IDA7XG4gICAgICAgIHZhciBzcGxpdEhpZGRlbkVudHJpZXMgPSBbXTtcbiAgICAgICAgdmFyIGVudHJ5U3BhbiA9IGVudHJ5LnNwYW47XG4gICAgICAgIHZhciBiYXJyaWVyU3BhbiA9IGJhcnJpZXIuc3BhbjtcbiAgICAgICAgaWYgKGVudHJ5U3Bhbi5zdGFydCA8IGJhcnJpZXJTcGFuLnN0YXJ0KSB7XG4gICAgICAgICAgICBwYXJ0Q250ICs9IHRoaXMuaW5zZXJ0RW50cnkoe1xuICAgICAgICAgICAgICAgIGluZGV4OiBlbnRyeS5pbmRleCxcbiAgICAgICAgICAgICAgICB0aGlja25lc3M6IGVudHJ5LnRoaWNrbmVzcyxcbiAgICAgICAgICAgICAgICBzcGFuOiB7IHN0YXJ0OiBlbnRyeVNwYW4uc3RhcnQsIGVuZDogYmFycmllclNwYW4uc3RhcnQgfSxcbiAgICAgICAgICAgIH0sIHNwbGl0SGlkZGVuRW50cmllcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5U3Bhbi5lbmQgPiBiYXJyaWVyU3Bhbi5lbmQpIHtcbiAgICAgICAgICAgIHBhcnRDbnQgKz0gdGhpcy5pbnNlcnRFbnRyeSh7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGVudHJ5LmluZGV4LFxuICAgICAgICAgICAgICAgIHRoaWNrbmVzczogZW50cnkudGhpY2tuZXNzLFxuICAgICAgICAgICAgICAgIHNwYW46IHsgc3RhcnQ6IGJhcnJpZXJTcGFuLmVuZCwgZW5kOiBlbnRyeVNwYW4uZW5kIH0sXG4gICAgICAgICAgICB9LCBzcGxpdEhpZGRlbkVudHJpZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0Q250KSB7XG4gICAgICAgICAgICBoaWRkZW5FbnRyaWVzLnB1c2guYXBwbHkoaGlkZGVuRW50cmllcywgdHNsaWIuX19zcHJlYWRBcnJheShbe1xuICAgICAgICAgICAgICAgICAgICBpbmRleDogZW50cnkuaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHRoaWNrbmVzczogZW50cnkudGhpY2tuZXNzLFxuICAgICAgICAgICAgICAgICAgICBzcGFuOiBpbnRlcnNlY3RTcGFucyhiYXJyaWVyU3BhbiwgZW50cnlTcGFuKSwgLy8gZ3VhcmFudGVlZCB0byBpbnRlcnNlY3RcbiAgICAgICAgICAgICAgICB9XSwgc3BsaXRIaWRkZW5FbnRyaWVzKSk7XG4gICAgICAgICAgICByZXR1cm4gcGFydENudDtcbiAgICAgICAgfVxuICAgICAgICBoaWRkZW5FbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9O1xuICAgIFNlZ0hpZXJhcmNoeS5wcm90b3R5cGUuaW5zZXJ0RW50cnlBdCA9IGZ1bmN0aW9uIChlbnRyeSwgaW5zZXJ0aW9uKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIGVudHJpZXNCeUxldmVsID0gX2EuZW50cmllc0J5TGV2ZWwsIGxldmVsQ29vcmRzID0gX2EubGV2ZWxDb29yZHM7XG4gICAgICAgIGlmIChpbnNlcnRpb24ubGF0ZXJhbCA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBsZXZlbFxuICAgICAgICAgICAgaW5zZXJ0QXQobGV2ZWxDb29yZHMsIGluc2VydGlvbi5sZXZlbCwgaW5zZXJ0aW9uLmxldmVsQ29vcmQpO1xuICAgICAgICAgICAgaW5zZXJ0QXQoZW50cmllc0J5TGV2ZWwsIGluc2VydGlvbi5sZXZlbCwgW2VudHJ5XSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBpbnNlcnQgaW50byBleGlzdGluZyBsZXZlbFxuICAgICAgICAgICAgaW5zZXJ0QXQoZW50cmllc0J5TGV2ZWxbaW5zZXJ0aW9uLmxldmVsXSwgaW5zZXJ0aW9uLmxhdGVyYWwsIGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YWNrQ250c1tidWlsZEVudHJ5S2V5KGVudHJ5KV0gPSBpbnNlcnRpb24uc3RhY2tDbnQ7XG4gICAgfTtcbiAgICBTZWdIaWVyYXJjaHkucHJvdG90eXBlLmZpbmRJbnNlcnRpb24gPSBmdW5jdGlvbiAobmV3RW50cnkpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgbGV2ZWxDb29yZHMgPSBfYS5sZXZlbENvb3JkcywgZW50cmllc0J5TGV2ZWwgPSBfYS5lbnRyaWVzQnlMZXZlbCwgc3RyaWN0T3JkZXIgPSBfYS5zdHJpY3RPcmRlciwgc3RhY2tDbnRzID0gX2Euc3RhY2tDbnRzO1xuICAgICAgICB2YXIgbGV2ZWxDbnQgPSBsZXZlbENvb3Jkcy5sZW5ndGg7XG4gICAgICAgIHZhciBjYW5kaWRhdGVDb29yZCA9IDA7XG4gICAgICAgIHZhciB0b3VjaGluZ0xldmVsID0gLTE7XG4gICAgICAgIHZhciB0b3VjaGluZ0xhdGVyYWwgPSAtMTtcbiAgICAgICAgdmFyIHRvdWNoaW5nRW50cnkgPSBudWxsO1xuICAgICAgICB2YXIgc3RhY2tDbnQgPSAwO1xuICAgICAgICBmb3IgKHZhciB0cmFja2luZ0xldmVsID0gMDsgdHJhY2tpbmdMZXZlbCA8IGxldmVsQ250OyB0cmFja2luZ0xldmVsICs9IDEpIHtcbiAgICAgICAgICAgIHZhciB0cmFja2luZ0Nvb3JkID0gbGV2ZWxDb29yZHNbdHJhY2tpbmdMZXZlbF07XG4gICAgICAgICAgICAvLyBpZiB0aGUgY3VycmVudCBsZXZlbCBpcyBwYXN0IHRoZSBwbGFjZWQgZW50cnksIHdlIGhhdmUgZm91bmQgYSBnb29kIGVtcHR5IHNwYWNlIGFuZCBjYW4gc3RvcC5cbiAgICAgICAgICAgIC8vIGlmIHN0cmljdE9yZGVyLCBrZWVwIGZpbmRpbmcgbW9yZSBsYXRlcmFsIGludGVyc2VjdGlvbnMuXG4gICAgICAgICAgICBpZiAoIXN0cmljdE9yZGVyICYmIHRyYWNraW5nQ29vcmQgPj0gY2FuZGlkYXRlQ29vcmQgKyBuZXdFbnRyeS50aGlja25lc3MpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB0cmFja2luZ0VudHJpZXMgPSBlbnRyaWVzQnlMZXZlbFt0cmFja2luZ0xldmVsXTtcbiAgICAgICAgICAgIHZhciB0cmFja2luZ0VudHJ5ID0gdm9pZCAwO1xuICAgICAgICAgICAgdmFyIHNlYXJjaFJlcyA9IGJpbmFyeVNlYXJjaCh0cmFja2luZ0VudHJpZXMsIG5ld0VudHJ5LnNwYW4uc3RhcnQsIGdldEVudHJ5U3BhbkVuZCk7IC8vIGZpbmQgZmlyc3QgZW50cnkgYWZ0ZXIgbmV3RW50cnkncyBlbmRcbiAgICAgICAgICAgIHZhciBsYXRlcmFsSW5kZXggPSBzZWFyY2hSZXNbMF0gKyBzZWFyY2hSZXNbMV07IC8vIGlmIGV4YWN0IG1hdGNoICh3aGljaCBkb2Vzbid0IGNvbGxpZGUpLCBnbyB0byBuZXh0IG9uZVxuICAgICAgICAgICAgd2hpbGUgKCAvLyBsb29wIHRocm91Z2ggZW50cmllcyB0aGF0IGhvcml6b250YWxseSBpbnRlcnNlY3RcbiAgICAgICAgICAgICh0cmFja2luZ0VudHJ5ID0gdHJhY2tpbmdFbnRyaWVzW2xhdGVyYWxJbmRleF0pICYmIC8vIGJ1dCBub3QgcGFzdCB0aGUgd2hvbGUgZW50cnkgbGlzdFxuICAgICAgICAgICAgICAgIHRyYWNraW5nRW50cnkuc3Bhbi5zdGFydCA8IG5ld0VudHJ5LnNwYW4uZW5kIC8vIGFuZCBub3QgZW50aXJlbHkgcGFzdCBuZXdFbnRyeVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRyYWNraW5nRW50cnlCb3R0b20gPSB0cmFja2luZ0Nvb3JkICsgdHJhY2tpbmdFbnRyeS50aGlja25lc3M7XG4gICAgICAgICAgICAgICAgLy8gaW50ZXJzZWN0cyBpbnRvIHRoZSB0b3Agb2YgdGhlIGNhbmRpZGF0ZT9cbiAgICAgICAgICAgICAgICBpZiAodHJhY2tpbmdFbnRyeUJvdHRvbSA+IGNhbmRpZGF0ZUNvb3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZUNvb3JkID0gdHJhY2tpbmdFbnRyeUJvdHRvbTtcbiAgICAgICAgICAgICAgICAgICAgdG91Y2hpbmdFbnRyeSA9IHRyYWNraW5nRW50cnk7XG4gICAgICAgICAgICAgICAgICAgIHRvdWNoaW5nTGV2ZWwgPSB0cmFja2luZ0xldmVsO1xuICAgICAgICAgICAgICAgICAgICB0b3VjaGluZ0xhdGVyYWwgPSBsYXRlcmFsSW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGJ1dHRzIHVwIGFnYWluc3QgdG9wIG9mIGNhbmRpZGF0ZT8gKHdpbGwgaGFwcGVuIGlmIGp1c3QgaW50ZXJzZWN0ZWQgYXMgd2VsbClcbiAgICAgICAgICAgICAgICBpZiAodHJhY2tpbmdFbnRyeUJvdHRvbSA9PT0gY2FuZGlkYXRlQ29vcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYWNjdW11bGF0ZSB0aGUgaGlnaGVzdCBwb3NzaWJsZSBzdGFja0NudCBvZiB0aGUgdHJhY2tpbmdFbnRyaWVzIHRoYXQgYnV0dCB1cFxuICAgICAgICAgICAgICAgICAgICBzdGFja0NudCA9IE1hdGgubWF4KHN0YWNrQ250LCBzdGFja0NudHNbYnVpbGRFbnRyeUtleSh0cmFja2luZ0VudHJ5KV0gKyAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGF0ZXJhbEluZGV4ICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhlIGRlc3RpbmF0aW9uIGxldmVsIHdpbGwgYmUgYWZ0ZXIgdG91Y2hpbmdFbnRyeSdzIGxldmVsLiBmaW5kIGl0XG4gICAgICAgIHZhciBkZXN0TGV2ZWwgPSAwO1xuICAgICAgICBpZiAodG91Y2hpbmdFbnRyeSkge1xuICAgICAgICAgICAgZGVzdExldmVsID0gdG91Y2hpbmdMZXZlbCArIDE7XG4gICAgICAgICAgICB3aGlsZSAoZGVzdExldmVsIDwgbGV2ZWxDbnQgJiYgbGV2ZWxDb29yZHNbZGVzdExldmVsXSA8IGNhbmRpZGF0ZUNvb3JkKSB7XG4gICAgICAgICAgICAgICAgZGVzdExldmVsICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgYWRkaW5nIHRvIGFuIGV4aXN0aW5nIGxldmVsLCBmaW5kIHdoZXJlIHRvIGluc2VydFxuICAgICAgICB2YXIgZGVzdExhdGVyYWwgPSAtMTtcbiAgICAgICAgaWYgKGRlc3RMZXZlbCA8IGxldmVsQ250ICYmIGxldmVsQ29vcmRzW2Rlc3RMZXZlbF0gPT09IGNhbmRpZGF0ZUNvb3JkKSB7XG4gICAgICAgICAgICBkZXN0TGF0ZXJhbCA9IGJpbmFyeVNlYXJjaChlbnRyaWVzQnlMZXZlbFtkZXN0TGV2ZWxdLCBuZXdFbnRyeS5zcGFuLmVuZCwgZ2V0RW50cnlTcGFuRW5kKVswXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG91Y2hpbmdMZXZlbDogdG91Y2hpbmdMZXZlbCxcbiAgICAgICAgICAgIHRvdWNoaW5nTGF0ZXJhbDogdG91Y2hpbmdMYXRlcmFsLFxuICAgICAgICAgICAgdG91Y2hpbmdFbnRyeTogdG91Y2hpbmdFbnRyeSxcbiAgICAgICAgICAgIHN0YWNrQ250OiBzdGFja0NudCxcbiAgICAgICAgICAgIGxldmVsQ29vcmQ6IGNhbmRpZGF0ZUNvb3JkLFxuICAgICAgICAgICAgbGV2ZWw6IGRlc3RMZXZlbCxcbiAgICAgICAgICAgIGxhdGVyYWw6IGRlc3RMYXRlcmFsLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgLy8gc29ydGVkIGJ5IGxldmVsQ29vcmQgKGxvd2VzdCB0byBoaWdoZXN0KVxuICAgIFNlZ0hpZXJhcmNoeS5wcm90b3R5cGUudG9SZWN0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgZW50cmllc0J5TGV2ZWwgPSBfYS5lbnRyaWVzQnlMZXZlbCwgbGV2ZWxDb29yZHMgPSBfYS5sZXZlbENvb3JkcztcbiAgICAgICAgdmFyIGxldmVsQ250ID0gZW50cmllc0J5TGV2ZWwubGVuZ3RoO1xuICAgICAgICB2YXIgcmVjdHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgbGV2ZWwgPSAwOyBsZXZlbCA8IGxldmVsQ250OyBsZXZlbCArPSAxKSB7XG4gICAgICAgICAgICB2YXIgZW50cmllcyA9IGVudHJpZXNCeUxldmVsW2xldmVsXTtcbiAgICAgICAgICAgIHZhciBsZXZlbENvb3JkID0gbGV2ZWxDb29yZHNbbGV2ZWxdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBlbnRyaWVzXzEgPSBlbnRyaWVzOyBfaSA8IGVudHJpZXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzXzFbX2ldO1xuICAgICAgICAgICAgICAgIHJlY3RzLnB1c2godHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGVudHJ5KSwgeyBsZXZlbENvb3JkOiBsZXZlbENvb3JkIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjdHM7XG4gICAgfTtcbiAgICByZXR1cm4gU2VnSGllcmFyY2h5O1xufSgpKTtcbmZ1bmN0aW9uIGdldEVudHJ5U3BhbkVuZChlbnRyeSkge1xuICAgIHJldHVybiBlbnRyeS5zcGFuLmVuZDtcbn1cbmZ1bmN0aW9uIGJ1aWxkRW50cnlLZXkoZW50cnkpIHtcbiAgICByZXR1cm4gZW50cnkuaW5kZXggKyAnOicgKyBlbnRyeS5zcGFuLnN0YXJ0O1xufVxuLy8gcmV0dXJucyBncm91cHMgd2l0aCBlbnRyaWVzIHNvcnRlZCBieSBpbnB1dCBvcmRlclxuZnVuY3Rpb24gZ3JvdXBJbnRlcnNlY3RpbmdFbnRyaWVzKGVudHJpZXMpIHtcbiAgICB2YXIgbWVyZ2VzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwLCBlbnRyaWVzXzIgPSBlbnRyaWVzOyBfaSA8IGVudHJpZXNfMi5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc18yW19pXTtcbiAgICAgICAgdmFyIGZpbHRlcmVkTWVyZ2VzID0gW107XG4gICAgICAgIHZhciBodW5ncnlNZXJnZSA9IHtcbiAgICAgICAgICAgIHNwYW46IGVudHJ5LnNwYW4sXG4gICAgICAgICAgICBlbnRyaWVzOiBbZW50cnldLFxuICAgICAgICB9O1xuICAgICAgICBmb3IgKHZhciBfYSA9IDAsIG1lcmdlc18xID0gbWVyZ2VzOyBfYSA8IG1lcmdlc18xLmxlbmd0aDsgX2ErKykge1xuICAgICAgICAgICAgdmFyIG1lcmdlID0gbWVyZ2VzXzFbX2FdO1xuICAgICAgICAgICAgaWYgKGludGVyc2VjdFNwYW5zKG1lcmdlLnNwYW4sIGh1bmdyeU1lcmdlLnNwYW4pKSB7XG4gICAgICAgICAgICAgICAgaHVuZ3J5TWVyZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgIGVudHJpZXM6IG1lcmdlLmVudHJpZXMuY29uY2F0KGh1bmdyeU1lcmdlLmVudHJpZXMpLFxuICAgICAgICAgICAgICAgICAgICBzcGFuOiBqb2luU3BhbnMobWVyZ2Uuc3BhbiwgaHVuZ3J5TWVyZ2Uuc3BhbiksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbHRlcmVkTWVyZ2VzLnB1c2gobWVyZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpbHRlcmVkTWVyZ2VzLnB1c2goaHVuZ3J5TWVyZ2UpO1xuICAgICAgICBtZXJnZXMgPSBmaWx0ZXJlZE1lcmdlcztcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlcztcbn1cbmZ1bmN0aW9uIGpvaW5TcGFucyhzcGFuMCwgc3BhbjEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogTWF0aC5taW4oc3BhbjAuc3RhcnQsIHNwYW4xLnN0YXJ0KSxcbiAgICAgICAgZW5kOiBNYXRoLm1heChzcGFuMC5lbmQsIHNwYW4xLmVuZCksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGludGVyc2VjdFNwYW5zKHNwYW4wLCBzcGFuMSkge1xuICAgIHZhciBzdGFydCA9IE1hdGgubWF4KHNwYW4wLnN0YXJ0LCBzcGFuMS5zdGFydCk7XG4gICAgdmFyIGVuZCA9IE1hdGgubWluKHNwYW4wLmVuZCwgc3BhbjEuZW5kKTtcbiAgICBpZiAoc3RhcnQgPCBlbmQpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8vIGdlbmVyYWwgdXRpbFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBpbnNlcnRBdChhcnIsIGluZGV4LCBpdGVtKSB7XG4gICAgYXJyLnNwbGljZShpbmRleCwgMCwgaXRlbSk7XG59XG5mdW5jdGlvbiBiaW5hcnlTZWFyY2goYSwgc2VhcmNoVmFsLCBnZXRJdGVtVmFsKSB7XG4gICAgdmFyIHN0YXJ0SW5kZXggPSAwO1xuICAgIHZhciBlbmRJbmRleCA9IGEubGVuZ3RoOyAvLyBleGNsdXNpdmVcbiAgICBpZiAoIWVuZEluZGV4IHx8IHNlYXJjaFZhbCA8IGdldEl0ZW1WYWwoYVtzdGFydEluZGV4XSkpIHsgLy8gbm8gaXRlbXMgT1IgYmVmb3JlIGZpcnN0IGl0ZW1cbiAgICAgICAgcmV0dXJuIFswLCAwXTtcbiAgICB9XG4gICAgaWYgKHNlYXJjaFZhbCA+IGdldEl0ZW1WYWwoYVtlbmRJbmRleCAtIDFdKSkgeyAvLyBhZnRlciBsYXN0IGl0ZW1cbiAgICAgICAgcmV0dXJuIFtlbmRJbmRleCwgMF07XG4gICAgfVxuICAgIHdoaWxlIChzdGFydEluZGV4IDwgZW5kSW5kZXgpIHtcbiAgICAgICAgdmFyIG1pZGRsZUluZGV4ID0gTWF0aC5mbG9vcihzdGFydEluZGV4ICsgKGVuZEluZGV4IC0gc3RhcnRJbmRleCkgLyAyKTtcbiAgICAgICAgdmFyIG1pZGRsZVZhbCA9IGdldEl0ZW1WYWwoYVttaWRkbGVJbmRleF0pO1xuICAgICAgICBpZiAoc2VhcmNoVmFsIDwgbWlkZGxlVmFsKSB7XG4gICAgICAgICAgICBlbmRJbmRleCA9IG1pZGRsZUluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNlYXJjaFZhbCA+IG1pZGRsZVZhbCkge1xuICAgICAgICAgICAgc3RhcnRJbmRleCA9IG1pZGRsZUluZGV4ICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gZXF1YWwhXG4gICAgICAgICAgICByZXR1cm4gW21pZGRsZUluZGV4LCAxXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3N0YXJ0SW5kZXgsIDBdO1xufVxuXG52YXIgSW50ZXJhY3Rpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSW50ZXJhY3Rpb24oc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnQgPSBzZXR0aW5ncy5jb21wb25lbnQ7XG4gICAgICAgIHRoaXMuaXNIaXRDb21ib0FsbG93ZWQgPSBzZXR0aW5ncy5pc0hpdENvbWJvQWxsb3dlZCB8fCBudWxsO1xuICAgIH1cbiAgICBJbnRlcmFjdGlvbi5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICB9O1xuICAgIHJldHVybiBJbnRlcmFjdGlvbjtcbn0oKSk7XG5mdW5jdGlvbiBwYXJzZUludGVyYWN0aW9uU2V0dGluZ3MoY29tcG9uZW50LCBpbnB1dCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50LFxuICAgICAgICBlbDogaW5wdXQuZWwsXG4gICAgICAgIHVzZUV2ZW50Q2VudGVyOiBpbnB1dC51c2VFdmVudENlbnRlciAhPSBudWxsID8gaW5wdXQudXNlRXZlbnRDZW50ZXIgOiB0cnVlLFxuICAgICAgICBpc0hpdENvbWJvQWxsb3dlZDogaW5wdXQuaXNIaXRDb21ib0FsbG93ZWQgfHwgbnVsbCxcbiAgICB9O1xufVxuZnVuY3Rpb24gaW50ZXJhY3Rpb25TZXR0aW5nc1RvU3RvcmUoc2V0dGluZ3MpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIF9hID0ge30sXG4gICAgICAgIF9hW3NldHRpbmdzLmNvbXBvbmVudC51aWRdID0gc2V0dGluZ3MsXG4gICAgICAgIF9hO1xufVxuLy8gZ2xvYmFsIHN0YXRlXG52YXIgaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlID0ge307XG5cbi8qXG5BbiBhYnN0cmFjdGlvbiBmb3IgYSBkcmFnZ2luZyBpbnRlcmFjdGlvbiBvcmlnaW5hdGluZyBvbiBhbiBldmVudC5cbkRvZXMgaGlnaGVyLWxldmVsIHRoaW5ncyB0aGFuIFBvaW50ZXJEcmFnZ2VyLCBzdWNoIGFzIHBvc3NpYmx5OlxuLSBhIFwibWlycm9yXCIgdGhhdCBtb3ZlcyB3aXRoIHRoZSBwb2ludGVyXG4tIGEgbWluaW11bSBudW1iZXIgb2YgcGl4ZWxzIG9yIG90aGVyIGNyaXRlcmlhIGZvciBhIHRydWUgZHJhZyB0byBiZWdpblxuXG5zdWJjbGFzc2VzIG11c3QgZW1pdDpcbi0gcG9pbnRlcmRvd25cbi0gZHJhZ3N0YXJ0XG4tIGRyYWdtb3ZlXG4tIHBvaW50ZXJ1cFxuLSBkcmFnZW5kXG4qL1xudmFyIEVsZW1lbnREcmFnZ2luZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFbGVtZW50RHJhZ2dpbmcoZWwsIHNlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlciA9IG5ldyBFbWl0dGVyKCk7XG4gICAgfVxuICAgIEVsZW1lbnREcmFnZ2luZy5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICB9O1xuICAgIEVsZW1lbnREcmFnZ2luZy5wcm90b3R5cGUuc2V0TWlycm9ySXNWaXNpYmxlID0gZnVuY3Rpb24gKGJvb2wpIHtcbiAgICAgICAgLy8gb3B0aW9uYWwgaWYgc3ViY2xhc3MgZG9lc24ndCB3YW50IHRvIHN1cHBvcnQgYSBtaXJyb3JcbiAgICB9O1xuICAgIEVsZW1lbnREcmFnZ2luZy5wcm90b3R5cGUuc2V0TWlycm9yTmVlZHNSZXZlcnQgPSBmdW5jdGlvbiAoYm9vbCkge1xuICAgICAgICAvLyBvcHRpb25hbCBpZiBzdWJjbGFzcyBkb2Vzbid0IHdhbnQgdG8gc3VwcG9ydCBhIG1pcnJvclxuICAgIH07XG4gICAgRWxlbWVudERyYWdnaW5nLnByb3RvdHlwZS5zZXRBdXRvU2Nyb2xsRW5hYmxlZCA9IGZ1bmN0aW9uIChib29sKSB7XG4gICAgICAgIC8vIG9wdGlvbmFsXG4gICAgfTtcbiAgICByZXR1cm4gRWxlbWVudERyYWdnaW5nO1xufSgpKTtcblxuLy8gVE9ETzogZ2V0IHJpZCBvZiB0aGlzIGluIGZhdm9yIG9mIG9wdGlvbnMgc3lzdGVtLFxuLy8gdGhvIGl0J3MgcmVhbGx5IGVhc3kgdG8gYWNjZXNzIHRoaXMgZ2xvYmFsbHkgcmF0aGVyIHRoYW4gcGFzcyB0aHJ1IG9wdGlvbnMuXG52YXIgY29uZmlnID0ge307XG5cbi8qXG5JbmZvcm1hdGlvbiBhYm91dCB3aGF0IHdpbGwgaGFwcGVuIHdoZW4gYW4gZXh0ZXJuYWwgZWxlbWVudCBpcyBkcmFnZ2VkLWFuZC1kcm9wcGVkXG5vbnRvIGEgY2FsZW5kYXIuIENvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBjcmVhdGluZyBhbiBldmVudC5cbiovXG52YXIgRFJBR19NRVRBX1JFRklORVJTID0ge1xuICAgIHN0YXJ0VGltZTogY3JlYXRlRHVyYXRpb24sXG4gICAgZHVyYXRpb246IGNyZWF0ZUR1cmF0aW9uLFxuICAgIGNyZWF0ZTogQm9vbGVhbixcbiAgICBzb3VyY2VJZDogU3RyaW5nLFxufTtcbmZ1bmN0aW9uIHBhcnNlRHJhZ01ldGEocmF3KSB7XG4gICAgdmFyIF9hID0gcmVmaW5lUHJvcHMocmF3LCBEUkFHX01FVEFfUkVGSU5FUlMpLCByZWZpbmVkID0gX2EucmVmaW5lZCwgZXh0cmEgPSBfYS5leHRyYTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydFRpbWU6IHJlZmluZWQuc3RhcnRUaW1lIHx8IG51bGwsXG4gICAgICAgIGR1cmF0aW9uOiByZWZpbmVkLmR1cmF0aW9uIHx8IG51bGwsXG4gICAgICAgIGNyZWF0ZTogcmVmaW5lZC5jcmVhdGUgIT0gbnVsbCA/IHJlZmluZWQuY3JlYXRlIDogdHJ1ZSxcbiAgICAgICAgc291cmNlSWQ6IHJlZmluZWQuc291cmNlSWQsXG4gICAgICAgIGxlZnRvdmVyUHJvcHM6IGV4dHJhLFxuICAgIH07XG59XG5cbnZhciBUb29sYmFyU2VjdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVG9vbGJhclNlY3Rpb24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVG9vbGJhclNlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgVG9vbGJhclNlY3Rpb24ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5wcm9wcy53aWRnZXRHcm91cHMubWFwKGZ1bmN0aW9uICh3aWRnZXRHcm91cCkgeyByZXR1cm4gX3RoaXMucmVuZGVyV2lkZ2V0R3JvdXAod2lkZ2V0R3JvdXApOyB9KTtcbiAgICAgICAgcmV0dXJuIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQuYXBwbHkodm9pZCAwLCB0c2xpYi5fX3NwcmVhZEFycmF5KFsnZGl2JywgeyBjbGFzc05hbWU6ICdmYy10b29sYmFyLWNodW5rJyB9XSwgY2hpbGRyZW4pKTtcbiAgICB9O1xuICAgIFRvb2xiYXJTZWN0aW9uLnByb3RvdHlwZS5yZW5kZXJXaWRnZXRHcm91cCA9IGZ1bmN0aW9uICh3aWRnZXRHcm91cCkge1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgdGhlbWUgPSB0aGlzLmNvbnRleHQudGhlbWU7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuICAgICAgICB2YXIgaXNPbmx5QnV0dG9ucyA9IHRydWU7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgd2lkZ2V0R3JvdXBfMSA9IHdpZGdldEdyb3VwOyBfaSA8IHdpZGdldEdyb3VwXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0R3JvdXBfMVtfaV07XG4gICAgICAgICAgICB2YXIgYnV0dG9uTmFtZSA9IHdpZGdldC5idXR0b25OYW1lLCBidXR0b25DbGljayA9IHdpZGdldC5idXR0b25DbGljaywgYnV0dG9uVGV4dCA9IHdpZGdldC5idXR0b25UZXh0LCBidXR0b25JY29uID0gd2lkZ2V0LmJ1dHRvbkljb24sIGJ1dHRvbkhpbnQgPSB3aWRnZXQuYnV0dG9uSGludDtcbiAgICAgICAgICAgIGlmIChidXR0b25OYW1lID09PSAndGl0bGUnKSB7XG4gICAgICAgICAgICAgICAgaXNPbmx5QnV0dG9ucyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2godmRvbV9janMuY3JlYXRlRWxlbWVudChcImgyXCIsIHsgY2xhc3NOYW1lOiBcImZjLXRvb2xiYXItdGl0bGVcIiwgaWQ6IHByb3BzLnRpdGxlSWQgfSwgcHJvcHMudGl0bGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBpc1ByZXNzZWQgPSBidXR0b25OYW1lID09PSBwcm9wcy5hY3RpdmVCdXR0b247XG4gICAgICAgICAgICAgICAgdmFyIGlzRGlzYWJsZWQgPSAoIXByb3BzLmlzVG9kYXlFbmFibGVkICYmIGJ1dHRvbk5hbWUgPT09ICd0b2RheScpIHx8XG4gICAgICAgICAgICAgICAgICAgICghcHJvcHMuaXNQcmV2RW5hYmxlZCAmJiBidXR0b25OYW1lID09PSAncHJldicpIHx8XG4gICAgICAgICAgICAgICAgICAgICghcHJvcHMuaXNOZXh0RW5hYmxlZCAmJiBidXR0b25OYW1lID09PSAnbmV4dCcpO1xuICAgICAgICAgICAgICAgIHZhciBidXR0b25DbGFzc2VzID0gW1wiZmMtXCIgKyBidXR0b25OYW1lICsgXCItYnV0dG9uXCIsIHRoZW1lLmdldENsYXNzKCdidXR0b24nKV07XG4gICAgICAgICAgICAgICAgaWYgKGlzUHJlc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICBidXR0b25DbGFzc2VzLnB1c2godGhlbWUuZ2V0Q2xhc3MoJ2J1dHRvbkFjdGl2ZScpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHsgdHlwZTogXCJidXR0b25cIiwgdGl0bGU6IHR5cGVvZiBidXR0b25IaW50ID09PSAnZnVuY3Rpb24nID8gYnV0dG9uSGludChwcm9wcy5uYXZVbml0KSA6IGJ1dHRvbkhpbnQsIGRpc2FibGVkOiBpc0Rpc2FibGVkLCBcImFyaWEtcHJlc3NlZFwiOiBpc1ByZXNzZWQsIGNsYXNzTmFtZTogYnV0dG9uQ2xhc3Nlcy5qb2luKCcgJyksIG9uQ2xpY2s6IGJ1dHRvbkNsaWNrIH0sIGJ1dHRvblRleHQgfHwgKGJ1dHRvbkljb24gPyB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogYnV0dG9uSWNvbiB9KSA6ICcnKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgZ3JvdXBDbGFzc05hbWUgPSAoaXNPbmx5QnV0dG9ucyAmJiB0aGVtZS5nZXRDbGFzcygnYnV0dG9uR3JvdXAnKSkgfHwgJyc7XG4gICAgICAgICAgICByZXR1cm4gdmRvbV9janMuY3JlYXRlRWxlbWVudC5hcHBseSh2b2lkIDAsIHRzbGliLl9fc3ByZWFkQXJyYXkoWydkaXYnLCB7IGNsYXNzTmFtZTogZ3JvdXBDbGFzc05hbWUgfV0sIGNoaWxkcmVuKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuWzBdO1xuICAgIH07XG4gICAgcmV0dXJuIFRvb2xiYXJTZWN0aW9uO1xufShCYXNlQ29tcG9uZW50KSk7XG5cbnZhciBUb29sYmFyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhUb29sYmFyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRvb2xiYXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgVG9vbGJhci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLnByb3BzLCBtb2RlbCA9IF9hLm1vZGVsLCBleHRyYUNsYXNzTmFtZSA9IF9hLmV4dHJhQ2xhc3NOYW1lO1xuICAgICAgICB2YXIgZm9yY2VMdHIgPSBmYWxzZTtcbiAgICAgICAgdmFyIHN0YXJ0Q29udGVudDtcbiAgICAgICAgdmFyIGVuZENvbnRlbnQ7XG4gICAgICAgIHZhciBzZWN0aW9uV2lkZ2V0cyA9IG1vZGVsLnNlY3Rpb25XaWRnZXRzO1xuICAgICAgICB2YXIgY2VudGVyQ29udGVudCA9IHNlY3Rpb25XaWRnZXRzLmNlbnRlcjtcbiAgICAgICAgaWYgKHNlY3Rpb25XaWRnZXRzLmxlZnQpIHtcbiAgICAgICAgICAgIGZvcmNlTHRyID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXJ0Q29udGVudCA9IHNlY3Rpb25XaWRnZXRzLmxlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGFydENvbnRlbnQgPSBzZWN0aW9uV2lkZ2V0cy5zdGFydDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VjdGlvbldpZGdldHMucmlnaHQpIHtcbiAgICAgICAgICAgIGZvcmNlTHRyID0gdHJ1ZTtcbiAgICAgICAgICAgIGVuZENvbnRlbnQgPSBzZWN0aW9uV2lkZ2V0cy5yaWdodDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVuZENvbnRlbnQgPSBzZWN0aW9uV2lkZ2V0cy5lbmQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICAgICBleHRyYUNsYXNzTmFtZSB8fCAnJyxcbiAgICAgICAgICAgICdmYy10b29sYmFyJyxcbiAgICAgICAgICAgIGZvcmNlTHRyID8gJ2ZjLXRvb2xiYXItbHRyJyA6ICcnLFxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZXMuam9pbignICcpIH0sXG4gICAgICAgICAgICB0aGlzLnJlbmRlclNlY3Rpb24oJ3N0YXJ0Jywgc3RhcnRDb250ZW50IHx8IFtdKSxcbiAgICAgICAgICAgIHRoaXMucmVuZGVyU2VjdGlvbignY2VudGVyJywgY2VudGVyQ29udGVudCB8fCBbXSksXG4gICAgICAgICAgICB0aGlzLnJlbmRlclNlY3Rpb24oJ2VuZCcsIGVuZENvbnRlbnQgfHwgW10pKSk7XG4gICAgfTtcbiAgICBUb29sYmFyLnByb3RvdHlwZS5yZW5kZXJTZWN0aW9uID0gZnVuY3Rpb24gKGtleSwgd2lkZ2V0R3JvdXBzKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChUb29sYmFyU2VjdGlvbiwgeyBrZXk6IGtleSwgd2lkZ2V0R3JvdXBzOiB3aWRnZXRHcm91cHMsIHRpdGxlOiBwcm9wcy50aXRsZSwgbmF2VW5pdDogcHJvcHMubmF2VW5pdCwgYWN0aXZlQnV0dG9uOiBwcm9wcy5hY3RpdmVCdXR0b24sIGlzVG9kYXlFbmFibGVkOiBwcm9wcy5pc1RvZGF5RW5hYmxlZCwgaXNQcmV2RW5hYmxlZDogcHJvcHMuaXNQcmV2RW5hYmxlZCwgaXNOZXh0RW5hYmxlZDogcHJvcHMuaXNOZXh0RW5hYmxlZCwgdGl0bGVJZDogcHJvcHMudGl0bGVJZCB9KSk7XG4gICAgfTtcbiAgICByZXR1cm4gVG9vbGJhcjtcbn0oQmFzZUNvbXBvbmVudCkpO1xuXG4vLyBUT0RPOiBkbyBmdW5jdGlvbiBjb21wb25lbnQ/XG52YXIgVmlld0NvbnRhaW5lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVmlld0NvbnRhaW5lciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBWaWV3Q29udGFpbmVyKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBhdmFpbGFibGVXaWR0aDogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlRWwgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIF90aGlzLmVsID0gZWw7XG4gICAgICAgICAgICBzZXRSZWYoX3RoaXMucHJvcHMuZWxSZWYsIGVsKTtcbiAgICAgICAgICAgIF90aGlzLnVwZGF0ZUF2YWlsYWJsZVdpZHRoKCk7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmhhbmRsZVJlc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLnVwZGF0ZUF2YWlsYWJsZVdpZHRoKCk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgVmlld0NvbnRhaW5lci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBwcm9wcyA9IF9hLnByb3BzLCBzdGF0ZSA9IF9hLnN0YXRlO1xuICAgICAgICB2YXIgYXNwZWN0UmF0aW8gPSBwcm9wcy5hc3BlY3RSYXRpbztcbiAgICAgICAgdmFyIGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICAgICAnZmMtdmlldy1oYXJuZXNzJyxcbiAgICAgICAgICAgIChhc3BlY3RSYXRpbyB8fCBwcm9wcy5saXF1aWQgfHwgcHJvcHMuaGVpZ2h0KVxuICAgICAgICAgICAgICAgID8gJ2ZjLXZpZXctaGFybmVzcy1hY3RpdmUnIC8vIGhhcm5lc3MgY29udHJvbHMgdGhlIGhlaWdodFxuICAgICAgICAgICAgICAgIDogJ2ZjLXZpZXctaGFybmVzcy1wYXNzaXZlJywgLy8gbGV0IHRoZSB2aWV3IGRvIHRoZSBoZWlnaHRcbiAgICAgICAgXTtcbiAgICAgICAgdmFyIGhlaWdodCA9ICcnO1xuICAgICAgICB2YXIgcGFkZGluZ0JvdHRvbSA9ICcnO1xuICAgICAgICBpZiAoYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5hdmFpbGFibGVXaWR0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGhlaWdodCA9IHN0YXRlLmF2YWlsYWJsZVdpZHRoIC8gYXNwZWN0UmF0aW87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB3aGlsZSB3YWl0aW5nIHRvIGtub3cgYXZhaWxhYmxlV2lkdGgsIHdlIGNhbid0IHNldCBoZWlnaHQgdG8gKnplcm8qXG4gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB3aWxsIGNhdXNlIGxvdHMgb2YgdW5uZWNlc3Nhcnkgc2Nyb2xsYmFycyB3aXRoaW4gc2Nyb2xsZ3JpZC5cbiAgICAgICAgICAgICAgICAvLyBCRVRURVI6IGRvbid0IHN0YXJ0IHJlbmRlcmluZyBBTllUSElORyB5ZXQgdW50aWwgd2Uga25vdyBjb250YWluZXIgd2lkdGhcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiB3aHkgbm90IGFsd2F5cyB1c2UgcGFkZGluZ0JvdHRvbT8gQ2F1c2VzIGhlaWdodCBvc2NpbGxhdGlvbiAoaXNzdWUgNTYwNilcbiAgICAgICAgICAgICAgICBwYWRkaW5nQm90dG9tID0gKDEgLyBhc3BlY3RSYXRpbykgKiAxMDAgKyBcIiVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCB8fCAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBcImFyaWEtbGFiZWxsZWRieVwiOiBwcm9wcy5sYWJlbGVkQnlJZCwgcmVmOiB0aGlzLmhhbmRsZUVsLCBjbGFzc05hbWU6IGNsYXNzTmFtZXMuam9pbignICcpLCBzdHlsZTogeyBoZWlnaHQ6IGhlaWdodCwgcGFkZGluZ0JvdHRvbTogcGFkZGluZ0JvdHRvbSB9IH0sIHByb3BzLmNoaWxkcmVuKSk7XG4gICAgfTtcbiAgICBWaWV3Q29udGFpbmVyLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmFkZFJlc2l6ZUhhbmRsZXIodGhpcy5oYW5kbGVSZXNpemUpO1xuICAgIH07XG4gICAgVmlld0NvbnRhaW5lci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC5yZW1vdmVSZXNpemVIYW5kbGVyKHRoaXMuaGFuZGxlUmVzaXplKTtcbiAgICB9O1xuICAgIFZpZXdDb250YWluZXIucHJvdG90eXBlLnVwZGF0ZUF2YWlsYWJsZVdpZHRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5lbCAmJiAvLyBuZWVkZWQuIGJ1dCB3aHk/XG4gICAgICAgICAgICB0aGlzLnByb3BzLmFzcGVjdFJhdGlvIC8vIGFzcGVjdFJhdGlvIGlzIHRoZSBvbmx5IGhlaWdodCBzZXR0aW5nIHRoYXQgbmVlZHMgYXZhaWxhYmxlV2lkdGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgYXZhaWxhYmxlV2lkdGg6IHRoaXMuZWwub2Zmc2V0V2lkdGggfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBWaWV3Q29udGFpbmVyO1xufShCYXNlQ29tcG9uZW50KSk7XG5cbi8qXG5EZXRlY3RzIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIGFuIGV2ZW50IHdpdGhpbiBhIERhdGVDb21wb25lbnRcbiovXG52YXIgRXZlbnRDbGlja2luZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoRXZlbnRDbGlja2luZywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBFdmVudENsaWNraW5nKHNldHRpbmdzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHNldHRpbmdzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5oYW5kbGVTZWdDbGljayA9IGZ1bmN0aW9uIChldiwgc2VnRWwpIHtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSBfdGhpcy5jb21wb25lbnQ7XG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IGNvbXBvbmVudC5jb250ZXh0O1xuICAgICAgICAgICAgdmFyIHNlZyA9IGdldEVsU2VnKHNlZ0VsKTtcbiAgICAgICAgICAgIGlmIChzZWcgJiYgLy8gbWlnaHQgYmUgdGhlIDxkaXY+IHN1cnJvdW5kaW5nIHRoZSBtb3JlIGxpbmtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaXNWYWxpZFNlZ0Rvd25FbChldi50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgLy8gb3VyIHdheSB0byBzaW11bGF0ZSBhIGxpbmsgY2xpY2sgZm9yIGVsZW1lbnRzIHRoYXQgY2FuJ3QgYmUgPGE+IHRhZ3NcbiAgICAgICAgICAgICAgICAvLyBncmFiIGJlZm9yZSB0cmlnZ2VyIGZpcmVkIGluIGNhc2UgdHJpZ2dlciB0cmFzaGVzIERPTSB0aHJ1IHJlcmVuZGVyaW5nXG4gICAgICAgICAgICAgICAgdmFyIGhhc1VybENvbnRhaW5lciA9IGVsZW1lbnRDbG9zZXN0KGV2LnRhcmdldCwgJy5mYy1ldmVudC1mb3JjZWQtdXJsJyk7XG4gICAgICAgICAgICAgICAgdmFyIHVybCA9IGhhc1VybENvbnRhaW5lciA/IGhhc1VybENvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdhW2hyZWZdJykuaHJlZiA6ICcnO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdldmVudENsaWNrJywge1xuICAgICAgICAgICAgICAgICAgICBlbDogc2VnRWwsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBuZXcgRXZlbnRBcGkoY29tcG9uZW50LmNvbnRleHQsIHNlZy5ldmVudFJhbmdlLmRlZiwgc2VnLmV2ZW50UmFuZ2UuaW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgICAgICBqc0V2ZW50OiBldixcbiAgICAgICAgICAgICAgICAgICAgdmlldzogY29udGV4dC52aWV3QXBpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICh1cmwgJiYgIWV2LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5kZXN0cm95ID0gbGlzdGVuQnlTZWxlY3RvcihzZXR0aW5ncy5lbCwgJ2NsaWNrJywgJy5mYy1ldmVudCcsIC8vIG9uIGJvdGggZmcgYW5kIGJnIGV2ZW50c1xuICAgICAgICBfdGhpcy5oYW5kbGVTZWdDbGljayk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEV2ZW50Q2xpY2tpbmc7XG59KEludGVyYWN0aW9uKSk7XG5cbi8qXG5UcmlnZ2VycyBldmVudHMgYW5kIGFkZHMvcmVtb3ZlcyBjb3JlIGNsYXNzTmFtZXMgd2hlbiB0aGUgdXNlcidzIHBvaW50ZXJcbmVudGVycy9sZWF2ZXMgZXZlbnQtZWxlbWVudHMgb2YgYSBjb21wb25lbnQuXG4qL1xudmFyIEV2ZW50SG92ZXJpbmcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKEV2ZW50SG92ZXJpbmcsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRXZlbnRIb3ZlcmluZyhzZXR0aW5ncykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzZXR0aW5ncykgfHwgdGhpcztcbiAgICAgICAgLy8gZm9yIHNpbXVsYXRpbmcgYW4gZXZlbnRNb3VzZUxlYXZlIHdoZW4gdGhlIGV2ZW50IGVsIGlzIGRlc3Ryb3llZCB3aGlsZSBtb3VzZSBpcyBvdmVyIGl0XG4gICAgICAgIF90aGlzLmhhbmRsZUV2ZW50RWxSZW1vdmUgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIGlmIChlbCA9PT0gX3RoaXMuY3VycmVudFNlZ0VsKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuaGFuZGxlU2VnTGVhdmUobnVsbCwgX3RoaXMuY3VycmVudFNlZ0VsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlU2VnRW50ZXIgPSBmdW5jdGlvbiAoZXYsIHNlZ0VsKSB7XG4gICAgICAgICAgICBpZiAoZ2V0RWxTZWcoc2VnRWwpKSB7IC8vIFRPRE86IGJldHRlciB3YXkgdG8gbWFrZSBzdXJlIG5vdCBob3ZlcmluZyBvdmVyIG1vcmUrIGxpbmsgb3IgaXRzIHdyYXBwZXJcbiAgICAgICAgICAgICAgICBfdGhpcy5jdXJyZW50U2VnRWwgPSBzZWdFbDtcbiAgICAgICAgICAgICAgICBfdGhpcy50cmlnZ2VyRXZlbnQoJ2V2ZW50TW91c2VFbnRlcicsIGV2LCBzZWdFbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmhhbmRsZVNlZ0xlYXZlID0gZnVuY3Rpb24gKGV2LCBzZWdFbCkge1xuICAgICAgICAgICAgaWYgKF90aGlzLmN1cnJlbnRTZWdFbCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmN1cnJlbnRTZWdFbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgX3RoaXMudHJpZ2dlckV2ZW50KCdldmVudE1vdXNlTGVhdmUnLCBldiwgc2VnRWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5yZW1vdmVIb3Zlckxpc3RlbmVycyA9IGxpc3RlblRvSG92ZXJCeVNlbGVjdG9yKHNldHRpbmdzLmVsLCAnLmZjLWV2ZW50JywgLy8gb24gYm90aCBmZyBhbmQgYmcgZXZlbnRzXG4gICAgICAgIF90aGlzLmhhbmRsZVNlZ0VudGVyLCBfdGhpcy5oYW5kbGVTZWdMZWF2ZSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgRXZlbnRIb3ZlcmluZy5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVIb3Zlckxpc3RlbmVycygpO1xuICAgIH07XG4gICAgRXZlbnRIb3ZlcmluZy5wcm90b3R5cGUudHJpZ2dlckV2ZW50ID0gZnVuY3Rpb24gKHB1YmxpY0V2TmFtZSwgZXYsIHNlZ0VsKSB7XG4gICAgICAgIHZhciBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudDtcbiAgICAgICAgdmFyIGNvbnRleHQgPSBjb21wb25lbnQuY29udGV4dDtcbiAgICAgICAgdmFyIHNlZyA9IGdldEVsU2VnKHNlZ0VsKTtcbiAgICAgICAgaWYgKCFldiB8fCBjb21wb25lbnQuaXNWYWxpZFNlZ0Rvd25FbChldi50YXJnZXQpKSB7XG4gICAgICAgICAgICBjb250ZXh0LmVtaXR0ZXIudHJpZ2dlcihwdWJsaWNFdk5hbWUsIHtcbiAgICAgICAgICAgICAgICBlbDogc2VnRWwsXG4gICAgICAgICAgICAgICAgZXZlbnQ6IG5ldyBFdmVudEFwaShjb250ZXh0LCBzZWcuZXZlbnRSYW5nZS5kZWYsIHNlZy5ldmVudFJhbmdlLmluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICBqc0V2ZW50OiBldixcbiAgICAgICAgICAgICAgICB2aWV3OiBjb250ZXh0LnZpZXdBcGksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEV2ZW50SG92ZXJpbmc7XG59KEludGVyYWN0aW9uKSk7XG5cbnZhciBDYWxlbmRhckNvbnRlbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKENhbGVuZGFyQ29udGVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDYWxlbmRhckNvbnRlbnQoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5idWlsZFZpZXdDb250ZXh0ID0gbWVtb2l6ZShidWlsZFZpZXdDb250ZXh0KTtcbiAgICAgICAgX3RoaXMuYnVpbGRWaWV3UHJvcFRyYW5zZm9ybWVycyA9IG1lbW9pemUoYnVpbGRWaWV3UHJvcFRyYW5zZm9ybWVycyk7XG4gICAgICAgIF90aGlzLmJ1aWxkVG9vbGJhclByb3BzID0gbWVtb2l6ZShidWlsZFRvb2xiYXJQcm9wcyk7XG4gICAgICAgIF90aGlzLmhlYWRlclJlZiA9IHZkb21fY2pzLmNyZWF0ZVJlZigpO1xuICAgICAgICBfdGhpcy5mb290ZXJSZWYgPSB2ZG9tX2Nqcy5jcmVhdGVSZWYoKTtcbiAgICAgICAgX3RoaXMuaW50ZXJhY3Rpb25zU3RvcmUgPSB7fTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgdmlld0xhYmVsSWQ6IGdldFVuaXF1ZURvbUlkKCksXG4gICAgICAgIH07XG4gICAgICAgIC8vIENvbXBvbmVudCBSZWdpc3RyYXRpb25cbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgX3RoaXMucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCA9IGZ1bmN0aW9uIChjb21wb25lbnQsIHNldHRpbmdzSW5wdXQpIHtcbiAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHBhcnNlSW50ZXJhY3Rpb25TZXR0aW5ncyhjb21wb25lbnQsIHNldHRpbmdzSW5wdXQpO1xuICAgICAgICAgICAgdmFyIERFRkFVTFRfSU5URVJBQ1RJT05TID0gW1xuICAgICAgICAgICAgICAgIEV2ZW50Q2xpY2tpbmcsXG4gICAgICAgICAgICAgICAgRXZlbnRIb3ZlcmluZyxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICB2YXIgaW50ZXJhY3Rpb25DbGFzc2VzID0gREVGQVVMVF9JTlRFUkFDVElPTlMuY29uY2F0KF90aGlzLnByb3BzLnBsdWdpbkhvb2tzLmNvbXBvbmVudEludGVyYWN0aW9ucyk7XG4gICAgICAgICAgICB2YXIgaW50ZXJhY3Rpb25zID0gaW50ZXJhY3Rpb25DbGFzc2VzLm1hcChmdW5jdGlvbiAoVGhlSW50ZXJhY3Rpb25DbGFzcykgeyByZXR1cm4gbmV3IFRoZUludGVyYWN0aW9uQ2xhc3Moc2V0dGluZ3MpOyB9KTtcbiAgICAgICAgICAgIF90aGlzLmludGVyYWN0aW9uc1N0b3JlW2NvbXBvbmVudC51aWRdID0gaW50ZXJhY3Rpb25zO1xuICAgICAgICAgICAgaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlW2NvbXBvbmVudC51aWRdID0gc2V0dGluZ3M7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLnVucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCA9IGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgIHZhciBsaXN0ZW5lcnMgPSBfdGhpcy5pbnRlcmFjdGlvbnNTdG9yZVtjb21wb25lbnQudWlkXTtcbiAgICAgICAgICAgIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGxpc3RlbmVyc18xID0gbGlzdGVuZXJzOyBfaSA8IGxpc3RlbmVyc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNfMVtfaV07XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIF90aGlzLmludGVyYWN0aW9uc1N0b3JlW2NvbXBvbmVudC51aWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIGludGVyYWN0aW9uU2V0dGluZ3NTdG9yZVtjb21wb25lbnQudWlkXTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gUmVzaXppbmdcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgX3RoaXMucmVzaXplUnVubmVyID0gbmV3IERlbGF5ZWRSdW5uZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMucHJvcHMuZW1pdHRlci50cmlnZ2VyKCdfcmVzaXplJywgdHJ1ZSk7IC8vIHNob3VsZCB3aW5kb3cgcmVzaXplcyBiZSBjb25zaWRlcmVkIFwiZm9yY2VkXCIgP1xuICAgICAgICAgICAgX3RoaXMucHJvcHMuZW1pdHRlci50cmlnZ2VyKCd3aW5kb3dSZXNpemUnLCB7IHZpZXc6IF90aGlzLnByb3BzLnZpZXdBcGkgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBfdGhpcy5oYW5kbGVXaW5kb3dSZXNpemUgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIHZhciBvcHRpb25zID0gX3RoaXMucHJvcHMub3B0aW9ucztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmhhbmRsZVdpbmRvd1Jlc2l6ZSAmJlxuICAgICAgICAgICAgICAgIGV2LnRhcmdldCA9PT0gd2luZG93IC8vIGF2b2lkIGpxdWkgZXZlbnRzXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5yZXNpemVSdW5uZXIucmVxdWVzdChvcHRpb25zLndpbmRvd1Jlc2l6ZURlbGF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKlxuICAgIHJlbmRlcnMgSU5TSURFIG9mIGFuIG91dGVyIGRpdlxuICAgICovXG4gICAgQ2FsZW5kYXJDb250ZW50LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHZhciB0b29sYmFyQ29uZmlnID0gcHJvcHMudG9vbGJhckNvbmZpZywgb3B0aW9ucyA9IHByb3BzLm9wdGlvbnM7XG4gICAgICAgIHZhciB0b29sYmFyUHJvcHMgPSB0aGlzLmJ1aWxkVG9vbGJhclByb3BzKHByb3BzLnZpZXdTcGVjLCBwcm9wcy5kYXRlUHJvZmlsZSwgcHJvcHMuZGF0ZVByb2ZpbGVHZW5lcmF0b3IsIHByb3BzLmN1cnJlbnREYXRlLCBnZXROb3cocHJvcHMub3B0aW9ucy5ub3csIHByb3BzLmRhdGVFbnYpLCAvLyBUT0RPOiB1c2UgTm93VGltZXI/Pz8/XG4gICAgICAgIHByb3BzLnZpZXdUaXRsZSk7XG4gICAgICAgIHZhciB2aWV3Vkdyb3cgPSBmYWxzZTtcbiAgICAgICAgdmFyIHZpZXdIZWlnaHQgPSAnJztcbiAgICAgICAgdmFyIHZpZXdBc3BlY3RSYXRpbztcbiAgICAgICAgaWYgKHByb3BzLmlzSGVpZ2h0QXV0byB8fCBwcm9wcy5mb3JQcmludCkge1xuICAgICAgICAgICAgdmlld0hlaWdodCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuaGVpZ2h0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZpZXdWR3JvdyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5jb250ZW50SGVpZ2h0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZpZXdIZWlnaHQgPSBvcHRpb25zLmNvbnRlbnRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2aWV3QXNwZWN0UmF0aW8gPSBNYXRoLm1heChvcHRpb25zLmFzcGVjdFJhdGlvLCAwLjUpOyAvLyBwcmV2ZW50IGZyb20gZ2V0dGluZyB0b28gdGFsbFxuICAgICAgICB9XG4gICAgICAgIHZhciB2aWV3Q29udGV4dCA9IHRoaXMuYnVpbGRWaWV3Q29udGV4dChwcm9wcy52aWV3U3BlYywgcHJvcHMudmlld0FwaSwgcHJvcHMub3B0aW9ucywgcHJvcHMuZGF0ZVByb2ZpbGVHZW5lcmF0b3IsIHByb3BzLmRhdGVFbnYsIHByb3BzLnRoZW1lLCBwcm9wcy5wbHVnaW5Ib29rcywgcHJvcHMuZGlzcGF0Y2gsIHByb3BzLmdldEN1cnJlbnREYXRhLCBwcm9wcy5lbWl0dGVyLCBwcm9wcy5jYWxlbmRhckFwaSwgdGhpcy5yZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50LCB0aGlzLnVucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCk7XG4gICAgICAgIHZhciB2aWV3TGFiZWxJZCA9ICh0b29sYmFyQ29uZmlnLmhlYWRlciAmJiB0b29sYmFyQ29uZmlnLmhlYWRlci5oYXNUaXRsZSlcbiAgICAgICAgICAgID8gdGhpcy5zdGF0ZS52aWV3TGFiZWxJZFxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFZpZXdDb250ZXh0VHlwZS5Qcm92aWRlciwgeyB2YWx1ZTogdmlld0NvbnRleHQgfSxcbiAgICAgICAgICAgIHRvb2xiYXJDb25maWcuaGVhZGVyICYmICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFRvb2xiYXIsIHRzbGliLl9fYXNzaWduKHsgcmVmOiB0aGlzLmhlYWRlclJlZiwgZXh0cmFDbGFzc05hbWU6IFwiZmMtaGVhZGVyLXRvb2xiYXJcIiwgbW9kZWw6IHRvb2xiYXJDb25maWcuaGVhZGVyLCB0aXRsZUlkOiB2aWV3TGFiZWxJZCB9LCB0b29sYmFyUHJvcHMpKSksXG4gICAgICAgICAgICB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFZpZXdDb250YWluZXIsIHsgbGlxdWlkOiB2aWV3Vkdyb3csIGhlaWdodDogdmlld0hlaWdodCwgYXNwZWN0UmF0aW86IHZpZXdBc3BlY3RSYXRpbywgbGFiZWxlZEJ5SWQ6IHZpZXdMYWJlbElkIH0sXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJWaWV3KHByb3BzKSxcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkQXBwZW5kQ29udGVudCgpKSxcbiAgICAgICAgICAgIHRvb2xiYXJDb25maWcuZm9vdGVyICYmICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFRvb2xiYXIsIHRzbGliLl9fYXNzaWduKHsgcmVmOiB0aGlzLmZvb3RlclJlZiwgZXh0cmFDbGFzc05hbWU6IFwiZmMtZm9vdGVyLXRvb2xiYXJcIiwgbW9kZWw6IHRvb2xiYXJDb25maWcuZm9vdGVyLCB0aXRsZUlkOiBcIlwiIH0sIHRvb2xiYXJQcm9wcykpKSkpO1xuICAgIH07XG4gICAgQ2FsZW5kYXJDb250ZW50LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgdGhpcy5jYWxlbmRhckludGVyYWN0aW9ucyA9IHByb3BzLnBsdWdpbkhvb2tzLmNhbGVuZGFySW50ZXJhY3Rpb25zXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChDYWxlbmRhckludGVyYWN0aW9uQ2xhc3MpIHsgcmV0dXJuIG5ldyBDYWxlbmRhckludGVyYWN0aW9uQ2xhc3MocHJvcHMpOyB9KTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuaGFuZGxlV2luZG93UmVzaXplKTtcbiAgICAgICAgdmFyIHByb3BTZXRIYW5kbGVycyA9IHByb3BzLnBsdWdpbkhvb2tzLnByb3BTZXRIYW5kbGVycztcbiAgICAgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gcHJvcFNldEhhbmRsZXJzKSB7XG4gICAgICAgICAgICBwcm9wU2V0SGFuZGxlcnNbcHJvcE5hbWVdKHByb3BzW3Byb3BOYW1lXSwgcHJvcHMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDYWxlbmRhckNvbnRlbnQucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIChwcmV2UHJvcHMpIHtcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgdmFyIHByb3BTZXRIYW5kbGVycyA9IHByb3BzLnBsdWdpbkhvb2tzLnByb3BTZXRIYW5kbGVycztcbiAgICAgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gcHJvcFNldEhhbmRsZXJzKSB7XG4gICAgICAgICAgICBpZiAocHJvcHNbcHJvcE5hbWVdICE9PSBwcmV2UHJvcHNbcHJvcE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgcHJvcFNldEhhbmRsZXJzW3Byb3BOYW1lXShwcm9wc1twcm9wTmFtZV0sIHByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgQ2FsZW5kYXJDb250ZW50LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuaGFuZGxlV2luZG93UmVzaXplKTtcbiAgICAgICAgdGhpcy5yZXNpemVSdW5uZXIuY2xlYXIoKTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRoaXMuY2FsZW5kYXJJbnRlcmFjdGlvbnM7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgaW50ZXJhY3Rpb24gPSBfYVtfaV07XG4gICAgICAgICAgICBpbnRlcmFjdGlvbi5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9wcy5lbWl0dGVyLnRyaWdnZXIoJ191bm1vdW50Jyk7XG4gICAgfTtcbiAgICBDYWxlbmRhckNvbnRlbnQucHJvdG90eXBlLmJ1aWxkQXBwZW5kQ29udGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gcHJvcHMucGx1Z2luSG9va3Mudmlld0NvbnRhaW5lckFwcGVuZHMubWFwKGZ1bmN0aW9uIChidWlsZEFwcGVuZENvbnRlbnQpIHsgcmV0dXJuIGJ1aWxkQXBwZW5kQ29udGVudChwcm9wcyk7IH0pO1xuICAgICAgICByZXR1cm4gdmRvbV9janMuY3JlYXRlRWxlbWVudC5hcHBseSh2b2lkIDAsIHRzbGliLl9fc3ByZWFkQXJyYXkoW3Zkb21fY2pzLkZyYWdtZW50LCB7fV0sIGNoaWxkcmVuKSk7XG4gICAgfTtcbiAgICBDYWxlbmRhckNvbnRlbnQucHJvdG90eXBlLnJlbmRlclZpZXcgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgICAgdmFyIHBsdWdpbkhvb2tzID0gcHJvcHMucGx1Z2luSG9va3M7XG4gICAgICAgIHZhciB2aWV3U3BlYyA9IHByb3BzLnZpZXdTcGVjO1xuICAgICAgICB2YXIgdmlld1Byb3BzID0ge1xuICAgICAgICAgICAgZGF0ZVByb2ZpbGU6IHByb3BzLmRhdGVQcm9maWxlLFxuICAgICAgICAgICAgYnVzaW5lc3NIb3VyczogcHJvcHMuYnVzaW5lc3NIb3VycyxcbiAgICAgICAgICAgIGV2ZW50U3RvcmU6IHByb3BzLnJlbmRlcmFibGVFdmVudFN0b3JlLFxuICAgICAgICAgICAgZXZlbnRVaUJhc2VzOiBwcm9wcy5ldmVudFVpQmFzZXMsXG4gICAgICAgICAgICBkYXRlU2VsZWN0aW9uOiBwcm9wcy5kYXRlU2VsZWN0aW9uLFxuICAgICAgICAgICAgZXZlbnRTZWxlY3Rpb246IHByb3BzLmV2ZW50U2VsZWN0aW9uLFxuICAgICAgICAgICAgZXZlbnREcmFnOiBwcm9wcy5ldmVudERyYWcsXG4gICAgICAgICAgICBldmVudFJlc2l6ZTogcHJvcHMuZXZlbnRSZXNpemUsXG4gICAgICAgICAgICBpc0hlaWdodEF1dG86IHByb3BzLmlzSGVpZ2h0QXV0byxcbiAgICAgICAgICAgIGZvclByaW50OiBwcm9wcy5mb3JQcmludCxcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHRyYW5zZm9ybWVycyA9IHRoaXMuYnVpbGRWaWV3UHJvcFRyYW5zZm9ybWVycyhwbHVnaW5Ib29rcy52aWV3UHJvcHNUcmFuc2Zvcm1lcnMpO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIHRyYW5zZm9ybWVyc18xID0gdHJhbnNmb3JtZXJzOyBfaSA8IHRyYW5zZm9ybWVyc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzXzFbX2ldO1xuICAgICAgICAgICAgdHNsaWIuX19hc3NpZ24odmlld1Byb3BzLCB0cmFuc2Zvcm1lci50cmFuc2Zvcm0odmlld1Byb3BzLCBwcm9wcykpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBWaWV3Q29tcG9uZW50ID0gdmlld1NwZWMuY29tcG9uZW50O1xuICAgICAgICByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoVmlld0NvbXBvbmVudCwgdHNsaWIuX19hc3NpZ24oe30sIHZpZXdQcm9wcykpKTtcbiAgICB9O1xuICAgIHJldHVybiBDYWxlbmRhckNvbnRlbnQ7XG59KFB1cmVDb21wb25lbnQpKTtcbmZ1bmN0aW9uIGJ1aWxkVG9vbGJhclByb3BzKHZpZXdTcGVjLCBkYXRlUHJvZmlsZSwgZGF0ZVByb2ZpbGVHZW5lcmF0b3IsIGN1cnJlbnREYXRlLCBub3csIHRpdGxlKSB7XG4gICAgLy8gZG9uJ3QgZm9yY2UgYW55IGRhdGUtcHJvZmlsZXMgdG8gdmFsaWQgZGF0ZSBwcm9maWxlcyAodGhlIGBmYWxzZWApIHNvIHRoYXQgd2UgY2FuIHRlbGwgaWYgaXQncyBpbnZhbGlkXG4gICAgdmFyIHRvZGF5SW5mbyA9IGRhdGVQcm9maWxlR2VuZXJhdG9yLmJ1aWxkKG5vdywgdW5kZWZpbmVkLCBmYWxzZSk7IC8vIFRPRE86IG5lZWQgYHVuZGVmaW5lZGAgb3IgZWxzZSBJTkZJTklURSBMT09QIGZvciBzb21lIHJlYXNvblxuICAgIHZhciBwcmV2SW5mbyA9IGRhdGVQcm9maWxlR2VuZXJhdG9yLmJ1aWxkUHJldihkYXRlUHJvZmlsZSwgY3VycmVudERhdGUsIGZhbHNlKTtcbiAgICB2YXIgbmV4dEluZm8gPSBkYXRlUHJvZmlsZUdlbmVyYXRvci5idWlsZE5leHQoZGF0ZVByb2ZpbGUsIGN1cnJlbnREYXRlLCBmYWxzZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICBhY3RpdmVCdXR0b246IHZpZXdTcGVjLnR5cGUsXG4gICAgICAgIG5hdlVuaXQ6IHZpZXdTcGVjLnNpbmdsZVVuaXQsXG4gICAgICAgIGlzVG9kYXlFbmFibGVkOiB0b2RheUluZm8uaXNWYWxpZCAmJiAhcmFuZ2VDb250YWluc01hcmtlcihkYXRlUHJvZmlsZS5jdXJyZW50UmFuZ2UsIG5vdyksXG4gICAgICAgIGlzUHJldkVuYWJsZWQ6IHByZXZJbmZvLmlzVmFsaWQsXG4gICAgICAgIGlzTmV4dEVuYWJsZWQ6IG5leHRJbmZvLmlzVmFsaWQsXG4gICAgfTtcbn1cbi8vIFBsdWdpblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGJ1aWxkVmlld1Byb3BUcmFuc2Zvcm1lcnModGhlQ2xhc3Nlcykge1xuICAgIHJldHVybiB0aGVDbGFzc2VzLm1hcChmdW5jdGlvbiAoVGhlQ2xhc3MpIHsgcmV0dXJuIG5ldyBUaGVDbGFzcygpOyB9KTtcbn1cblxudmFyIENhbGVuZGFyUm9vdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoQ2FsZW5kYXJSb290LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENhbGVuZGFyUm9vdCgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgZm9yUHJpbnQ6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVCZWZvcmVQcmludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLnNldFN0YXRlKHsgZm9yUHJpbnQ6IHRydWUgfSk7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmhhbmRsZUFmdGVyUHJpbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7IGZvclByaW50OiBmYWxzZSB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBDYWxlbmRhclJvb3QucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBwcm9wcy5vcHRpb25zO1xuICAgICAgICB2YXIgZm9yUHJpbnQgPSB0aGlzLnN0YXRlLmZvclByaW50O1xuICAgICAgICB2YXIgaXNIZWlnaHRBdXRvID0gZm9yUHJpbnQgfHwgb3B0aW9ucy5oZWlnaHQgPT09ICdhdXRvJyB8fCBvcHRpb25zLmNvbnRlbnRIZWlnaHQgPT09ICdhdXRvJztcbiAgICAgICAgdmFyIGhlaWdodCA9ICghaXNIZWlnaHRBdXRvICYmIG9wdGlvbnMuaGVpZ2h0ICE9IG51bGwpID8gb3B0aW9ucy5oZWlnaHQgOiAnJztcbiAgICAgICAgdmFyIGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICAgICAnZmMnLFxuICAgICAgICAgICAgZm9yUHJpbnQgPyAnZmMtbWVkaWEtcHJpbnQnIDogJ2ZjLW1lZGlhLXNjcmVlbicsXG4gICAgICAgICAgICBcImZjLWRpcmVjdGlvbi1cIiArIG9wdGlvbnMuZGlyZWN0aW9uLFxuICAgICAgICAgICAgcHJvcHMudGhlbWUuZ2V0Q2xhc3MoJ3Jvb3QnKSxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKCFnZXRDYW5WR3Jvd1dpdGhpbkNlbGwoKSkge1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1saXF1aWQtaGFjaycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wcy5jaGlsZHJlbihjbGFzc05hbWVzLCBoZWlnaHQsIGlzSGVpZ2h0QXV0bywgZm9yUHJpbnQpO1xuICAgIH07XG4gICAgQ2FsZW5kYXJSb290LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVtaXR0ZXIgPSB0aGlzLnByb3BzLmVtaXR0ZXI7XG4gICAgICAgIGVtaXR0ZXIub24oJ19iZWZvcmVwcmludCcsIHRoaXMuaGFuZGxlQmVmb3JlUHJpbnQpO1xuICAgICAgICBlbWl0dGVyLm9uKCdfYWZ0ZXJwcmludCcsIHRoaXMuaGFuZGxlQWZ0ZXJQcmludCk7XG4gICAgfTtcbiAgICBDYWxlbmRhclJvb3QucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZW1pdHRlciA9IHRoaXMucHJvcHMuZW1pdHRlcjtcbiAgICAgICAgZW1pdHRlci5vZmYoJ19iZWZvcmVwcmludCcsIHRoaXMuaGFuZGxlQmVmb3JlUHJpbnQpO1xuICAgICAgICBlbWl0dGVyLm9mZignX2FmdGVycHJpbnQnLCB0aGlzLmhhbmRsZUFmdGVyUHJpbnQpO1xuICAgIH07XG4gICAgcmV0dXJuIENhbGVuZGFyUm9vdDtcbn0oQmFzZUNvbXBvbmVudCkpO1xuXG4vLyBDb21wdXRlcyBhIGRlZmF1bHQgY29sdW1uIGhlYWRlciBmb3JtYXR0aW5nIHN0cmluZyBpZiBgY29sRm9ybWF0YCBpcyBub3QgZXhwbGljaXRseSBkZWZpbmVkXG5mdW5jdGlvbiBjb21wdXRlRmFsbGJhY2tIZWFkZXJGb3JtYXQoZGF0ZXNSZXBEaXN0aW5jdERheXMsIGRheUNudCkge1xuICAgIC8vIGlmIG1vcmUgdGhhbiBvbmUgd2VlayByb3csIG9yIGlmIHRoZXJlIGFyZSBhIGxvdCBvZiBjb2x1bW5zIHdpdGggbm90IG11Y2ggc3BhY2UsXG4gICAgLy8gcHV0IGp1c3QgdGhlIGRheSBudW1iZXJzIHdpbGwgYmUgaW4gZWFjaCBjZWxsXG4gICAgaWYgKCFkYXRlc1JlcERpc3RpbmN0RGF5cyB8fCBkYXlDbnQgPiAxMCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRm9ybWF0dGVyKHsgd2Vla2RheTogJ3Nob3J0JyB9KTsgLy8gXCJTYXRcIlxuICAgIH1cbiAgICBpZiAoZGF5Q250ID4gMSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRm9ybWF0dGVyKHsgd2Vla2RheTogJ3Nob3J0JywgbW9udGg6ICdudW1lcmljJywgZGF5OiAnbnVtZXJpYycsIG9taXRDb21tYXM6IHRydWUgfSk7IC8vIFwiU2F0IDExLzEyXCJcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUZvcm1hdHRlcih7IHdlZWtkYXk6ICdsb25nJyB9KTsgLy8gXCJTYXR1cmRheVwiXG59XG5cbnZhciBDTEFTU19OQU1FID0gJ2ZjLWNvbC1oZWFkZXItY2VsbCc7IC8vIGRvIHRoZSBjdXNoaW9uIHRvbz8gbm9cbmZ1bmN0aW9uIHJlbmRlcklubmVyJDEoaG9va1Byb3BzKSB7XG4gICAgcmV0dXJuIGhvb2tQcm9wcy50ZXh0O1xufVxuXG52YXIgVGFibGVEYXRlQ2VsbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVGFibGVEYXRlQ2VsbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUYWJsZURhdGVDZWxsKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFRhYmxlRGF0ZUNlbGwucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5jb250ZXh0LCBkYXRlRW52ID0gX2EuZGF0ZUVudiwgb3B0aW9ucyA9IF9hLm9wdGlvbnMsIHRoZW1lID0gX2EudGhlbWUsIHZpZXdBcGkgPSBfYS52aWV3QXBpO1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgZGF0ZSA9IHByb3BzLmRhdGUsIGRhdGVQcm9maWxlID0gcHJvcHMuZGF0ZVByb2ZpbGU7XG4gICAgICAgIHZhciBkYXlNZXRhID0gZ2V0RGF0ZU1ldGEoZGF0ZSwgcHJvcHMudG9kYXlSYW5nZSwgbnVsbCwgZGF0ZVByb2ZpbGUpO1xuICAgICAgICB2YXIgY2xhc3NOYW1lcyA9IFtDTEFTU19OQU1FXS5jb25jYXQoZ2V0RGF5Q2xhc3NOYW1lcyhkYXlNZXRhLCB0aGVtZSkpO1xuICAgICAgICB2YXIgdGV4dCA9IGRhdGVFbnYuZm9ybWF0KGRhdGUsIHByb3BzLmRheUhlYWRlckZvcm1hdCk7XG4gICAgICAgIC8vIGlmIGNvbENudCBpcyAxLCB3ZSBhcmUgYWxyZWFkeSBpbiBhIGRheS12aWV3IGFuZCBkb24ndCBuZWVkIGEgbmF2bGlua1xuICAgICAgICB2YXIgbmF2TGlua0F0dHJzID0gKCFkYXlNZXRhLmlzRGlzYWJsZWQgJiYgcHJvcHMuY29sQ250ID4gMSlcbiAgICAgICAgICAgID8gYnVpbGROYXZMaW5rQXR0cnModGhpcy5jb250ZXh0LCBkYXRlKVxuICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgdmFyIGhvb2tQcm9wcyA9IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHsgZGF0ZTogZGF0ZUVudi50b0RhdGUoZGF0ZSksIHZpZXc6IHZpZXdBcGkgfSwgcHJvcHMuZXh0cmFIb29rUHJvcHMpLCB7IHRleHQ6IHRleHQgfSksIGRheU1ldGEpO1xuICAgICAgICByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoUmVuZGVySG9vaywgeyBob29rUHJvcHM6IGhvb2tQcm9wcywgY2xhc3NOYW1lczogb3B0aW9ucy5kYXlIZWFkZXJDbGFzc05hbWVzLCBjb250ZW50OiBvcHRpb25zLmRheUhlYWRlckNvbnRlbnQsIGRlZmF1bHRDb250ZW50OiByZW5kZXJJbm5lciQxLCBkaWRNb3VudDogb3B0aW9ucy5kYXlIZWFkZXJEaWRNb3VudCwgd2lsbFVubW91bnQ6IG9wdGlvbnMuZGF5SGVhZGVyV2lsbFVubW91bnQgfSwgZnVuY3Rpb24gKHJvb3RFbFJlZiwgY3VzdG9tQ2xhc3NOYW1lcywgaW5uZXJFbFJlZiwgaW5uZXJDb250ZW50KSB7IHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChcInRoXCIsIHRzbGliLl9fYXNzaWduKHsgcmVmOiByb290RWxSZWYsIHJvbGU6IFwiY29sdW1uaGVhZGVyXCIsIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5jb25jYXQoY3VzdG9tQ2xhc3NOYW1lcykuam9pbignICcpLCBcImRhdGEtZGF0ZVwiOiAhZGF5TWV0YS5pc0Rpc2FibGVkID8gZm9ybWF0RGF5U3RyaW5nKGRhdGUpIDogdW5kZWZpbmVkLCBjb2xTcGFuOiBwcm9wcy5jb2xTcGFuIH0sIHByb3BzLmV4dHJhRGF0YUF0dHJzKSxcbiAgICAgICAgICAgIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtc2Nyb2xsZ3JpZC1zeW5jLWlubmVyXCIgfSwgIWRheU1ldGEuaXNEaXNhYmxlZCAmJiAodmRvbV9janMuY3JlYXRlRWxlbWVudChcImFcIiwgdHNsaWIuX19hc3NpZ24oeyByZWY6IGlubmVyRWxSZWYsIGNsYXNzTmFtZTogW1xuICAgICAgICAgICAgICAgICAgICAnZmMtY29sLWhlYWRlci1jZWxsLWN1c2hpb24nLFxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5pc1N0aWNreSA/ICdmYy1zdGlja3knIDogJycsXG4gICAgICAgICAgICAgICAgXS5qb2luKCcgJykgfSwgbmF2TGlua0F0dHJzKSwgaW5uZXJDb250ZW50KSkpKSk7IH0pKTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZURhdGVDZWxsO1xufShCYXNlQ29tcG9uZW50KSk7XG5cbnZhciBXRUVLREFZX0ZPUk1BVCA9IGNyZWF0ZUZvcm1hdHRlcih7IHdlZWtkYXk6ICdsb25nJyB9KTtcbnZhciBUYWJsZURvd0NlbGwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFRhYmxlRG93Q2VsbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUYWJsZURvd0NlbGwoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgVGFibGVEb3dDZWxsLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuY29udGV4dCwgZGF0ZUVudiA9IF9hLmRhdGVFbnYsIHRoZW1lID0gX2EudGhlbWUsIHZpZXdBcGkgPSBfYS52aWV3QXBpLCBvcHRpb25zID0gX2Eub3B0aW9ucztcbiAgICAgICAgdmFyIGRhdGUgPSBhZGREYXlzKG5ldyBEYXRlKDI1OTIwMDAwMCksIHByb3BzLmRvdyk7IC8vIHN0YXJ0IHdpdGggU3VuLCAwNCBKYW4gMTk3MCAwMDowMDowMCBHTVRcbiAgICAgICAgdmFyIGRhdGVNZXRhID0ge1xuICAgICAgICAgICAgZG93OiBwcm9wcy5kb3csXG4gICAgICAgICAgICBpc0Rpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGlzRnV0dXJlOiBmYWxzZSxcbiAgICAgICAgICAgIGlzUGFzdDogZmFsc2UsXG4gICAgICAgICAgICBpc1RvZGF5OiBmYWxzZSxcbiAgICAgICAgICAgIGlzT3RoZXI6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICB2YXIgY2xhc3NOYW1lcyA9IFtDTEFTU19OQU1FXS5jb25jYXQoZ2V0RGF5Q2xhc3NOYW1lcyhkYXRlTWV0YSwgdGhlbWUpLCBwcm9wcy5leHRyYUNsYXNzTmFtZXMgfHwgW10pO1xuICAgICAgICB2YXIgdGV4dCA9IGRhdGVFbnYuZm9ybWF0KGRhdGUsIHByb3BzLmRheUhlYWRlckZvcm1hdCk7XG4gICAgICAgIHZhciBob29rUHJvcHMgPSB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7IC8vIFRPRE86IG1ha2UgdGhpcyBwdWJsaWM/XG4gICAgICAgICAgICBkYXRlOiBkYXRlIH0sIGRhdGVNZXRhKSwgeyB2aWV3OiB2aWV3QXBpIH0pLCBwcm9wcy5leHRyYUhvb2tQcm9wcyksIHsgdGV4dDogdGV4dCB9KTtcbiAgICAgICAgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFJlbmRlckhvb2ssIHsgaG9va1Byb3BzOiBob29rUHJvcHMsIGNsYXNzTmFtZXM6IG9wdGlvbnMuZGF5SGVhZGVyQ2xhc3NOYW1lcywgY29udGVudDogb3B0aW9ucy5kYXlIZWFkZXJDb250ZW50LCBkZWZhdWx0Q29udGVudDogcmVuZGVySW5uZXIkMSwgZGlkTW91bnQ6IG9wdGlvbnMuZGF5SGVhZGVyRGlkTW91bnQsIHdpbGxVbm1vdW50OiBvcHRpb25zLmRheUhlYWRlcldpbGxVbm1vdW50IH0sIGZ1bmN0aW9uIChyb290RWxSZWYsIGN1c3RvbUNsYXNzTmFtZXMsIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCkgeyByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJ0aFwiLCB0c2xpYi5fX2Fzc2lnbih7IHJlZjogcm9vdEVsUmVmLCByb2xlOiBcImNvbHVtbmhlYWRlclwiLCBjbGFzc05hbWU6IGNsYXNzTmFtZXMuY29uY2F0KGN1c3RvbUNsYXNzTmFtZXMpLmpvaW4oJyAnKSwgY29sU3BhbjogcHJvcHMuY29sU3BhbiB9LCBwcm9wcy5leHRyYURhdGFBdHRycyksXG4gICAgICAgICAgICB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLXNjcm9sbGdyaWQtc3luYy1pbm5lclwiIH0sXG4gICAgICAgICAgICAgICAgdmRvbV9janMuY3JlYXRlRWxlbWVudChcImFcIiwgeyBcImFyaWEtbGFiZWxcIjogZGF0ZUVudi5mb3JtYXQoZGF0ZSwgV0VFS0RBWV9GT1JNQVQpLCBjbGFzc05hbWU6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdmYy1jb2wtaGVhZGVyLWNlbGwtY3VzaGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5pc1N0aWNreSA/ICdmYy1zdGlja3knIDogJycsXG4gICAgICAgICAgICAgICAgICAgIF0uam9pbignICcpLCByZWY6IGlubmVyRWxSZWYgfSwgaW5uZXJDb250ZW50KSkpKTsgfSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFRhYmxlRG93Q2VsbDtcbn0oQmFzZUNvbXBvbmVudCkpO1xuXG52YXIgTm93VGltZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKE5vd1RpbWVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE5vd1RpbWVyKHByb3BzLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5pbml0aWFsTm93RGF0ZSA9IGdldE5vdyhjb250ZXh0Lm9wdGlvbnMubm93LCBjb250ZXh0LmRhdGVFbnYpO1xuICAgICAgICBfdGhpcy5pbml0aWFsTm93UXVlcmllZE1zID0gbmV3IERhdGUoKS52YWx1ZU9mKCk7XG4gICAgICAgIF90aGlzLnN0YXRlID0gX3RoaXMuY29tcHV0ZVRpbWluZygpLmN1cnJlbnRTdGF0ZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBOb3dUaW1lci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBwcm9wcyA9IF9hLnByb3BzLCBzdGF0ZSA9IF9hLnN0YXRlO1xuICAgICAgICByZXR1cm4gcHJvcHMuY2hpbGRyZW4oc3RhdGUubm93RGF0ZSwgc3RhdGUudG9kYXlSYW5nZSk7XG4gICAgfTtcbiAgICBOb3dUaW1lci5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2V0VGltZW91dCgpO1xuICAgIH07XG4gICAgTm93VGltZXIucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIChwcmV2UHJvcHMpIHtcbiAgICAgICAgaWYgKHByZXZQcm9wcy51bml0ICE9PSB0aGlzLnByb3BzLnVuaXQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0KCk7XG4gICAgICAgICAgICB0aGlzLnNldFRpbWVvdXQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTm93VGltZXIucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNsZWFyVGltZW91dCgpO1xuICAgIH07XG4gICAgTm93VGltZXIucHJvdG90eXBlLmNvbXB1dGVUaW1pbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgdW5yb3VuZGVkTm93ID0gYWRkTXModGhpcy5pbml0aWFsTm93RGF0ZSwgbmV3IERhdGUoKS52YWx1ZU9mKCkgLSB0aGlzLmluaXRpYWxOb3dRdWVyaWVkTXMpO1xuICAgICAgICB2YXIgY3VycmVudFVuaXRTdGFydCA9IGNvbnRleHQuZGF0ZUVudi5zdGFydE9mKHVucm91bmRlZE5vdywgcHJvcHMudW5pdCk7XG4gICAgICAgIHZhciBuZXh0VW5pdFN0YXJ0ID0gY29udGV4dC5kYXRlRW52LmFkZChjdXJyZW50VW5pdFN0YXJ0LCBjcmVhdGVEdXJhdGlvbigxLCBwcm9wcy51bml0KSk7XG4gICAgICAgIHZhciB3YWl0TXMgPSBuZXh0VW5pdFN0YXJ0LnZhbHVlT2YoKSAtIHVucm91bmRlZE5vdy52YWx1ZU9mKCk7XG4gICAgICAgIC8vIHRoZXJlIGlzIGEgbWF4IHNldFRpbWVvdXQgbXMgdmFsdWUgKGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNDY4NjUwLzk2MzQyKVxuICAgICAgICAvLyBlbnN1cmUgbm8gbG9uZ2VyIHRoYW4gYSBkYXlcbiAgICAgICAgd2FpdE1zID0gTWF0aC5taW4oMTAwMCAqIDYwICogNjAgKiAyNCwgd2FpdE1zKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGN1cnJlbnRTdGF0ZTogeyBub3dEYXRlOiBjdXJyZW50VW5pdFN0YXJ0LCB0b2RheVJhbmdlOiBidWlsZERheVJhbmdlKGN1cnJlbnRVbml0U3RhcnQpIH0sXG4gICAgICAgICAgICBuZXh0U3RhdGU6IHsgbm93RGF0ZTogbmV4dFVuaXRTdGFydCwgdG9kYXlSYW5nZTogYnVpbGREYXlSYW5nZShuZXh0VW5pdFN0YXJ0KSB9LFxuICAgICAgICAgICAgd2FpdE1zOiB3YWl0TXMsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBOb3dUaW1lci5wcm90b3R5cGUuc2V0VGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIF9hID0gdGhpcy5jb21wdXRlVGltaW5nKCksIG5leHRTdGF0ZSA9IF9hLm5leHRTdGF0ZSwgd2FpdE1zID0gX2Eud2FpdE1zO1xuICAgICAgICB0aGlzLnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMuc2V0U3RhdGUobmV4dFN0YXRlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuc2V0VGltZW91dCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIHdhaXRNcyk7XG4gICAgfTtcbiAgICBOb3dUaW1lci5wcm90b3R5cGUuY2xlYXJUaW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy50aW1lb3V0SWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE5vd1RpbWVyLmNvbnRleHRUeXBlID0gVmlld0NvbnRleHRUeXBlO1xuICAgIHJldHVybiBOb3dUaW1lcjtcbn0odmRvbV9janMuQ29tcG9uZW50KSk7XG5mdW5jdGlvbiBidWlsZERheVJhbmdlKGRhdGUpIHtcbiAgICB2YXIgc3RhcnQgPSBzdGFydE9mRGF5KGRhdGUpO1xuICAgIHZhciBlbmQgPSBhZGREYXlzKHN0YXJ0LCAxKTtcbiAgICByZXR1cm4geyBzdGFydDogc3RhcnQsIGVuZDogZW5kIH07XG59XG5cbnZhciBEYXlIZWFkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKERheUhlYWRlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEYXlIZWFkZXIoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5jcmVhdGVEYXlIZWFkZXJGb3JtYXR0ZXIgPSBtZW1vaXplKGNyZWF0ZURheUhlYWRlckZvcm1hdHRlcik7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgRGF5SGVhZGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICB2YXIgX2EgPSB0aGlzLnByb3BzLCBkYXRlcyA9IF9hLmRhdGVzLCBkYXRlUHJvZmlsZSA9IF9hLmRhdGVQcm9maWxlLCBkYXRlc1JlcERpc3RpbmN0RGF5cyA9IF9hLmRhdGVzUmVwRGlzdGluY3REYXlzLCByZW5kZXJJbnRybyA9IF9hLnJlbmRlckludHJvO1xuICAgICAgICB2YXIgZGF5SGVhZGVyRm9ybWF0ID0gdGhpcy5jcmVhdGVEYXlIZWFkZXJGb3JtYXR0ZXIoY29udGV4dC5vcHRpb25zLmRheUhlYWRlckZvcm1hdCwgZGF0ZXNSZXBEaXN0aW5jdERheXMsIGRhdGVzLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChOb3dUaW1lciwgeyB1bml0OiBcImRheVwiIH0sIGZ1bmN0aW9uIChub3dEYXRlLCB0b2RheVJhbmdlKSB7IHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChcInRyXCIsIHsgcm9sZTogXCJyb3dcIiB9LFxuICAgICAgICAgICAgcmVuZGVySW50cm8gJiYgcmVuZGVySW50cm8oJ2RheScpLFxuICAgICAgICAgICAgZGF0ZXMubWFwKGZ1bmN0aW9uIChkYXRlKSB7IHJldHVybiAoZGF0ZXNSZXBEaXN0aW5jdERheXMgPyAodmRvbV9janMuY3JlYXRlRWxlbWVudChUYWJsZURhdGVDZWxsLCB7IGtleTogZGF0ZS50b0lTT1N0cmluZygpLCBkYXRlOiBkYXRlLCBkYXRlUHJvZmlsZTogZGF0ZVByb2ZpbGUsIHRvZGF5UmFuZ2U6IHRvZGF5UmFuZ2UsIGNvbENudDogZGF0ZXMubGVuZ3RoLCBkYXlIZWFkZXJGb3JtYXQ6IGRheUhlYWRlckZvcm1hdCB9KSkgOiAodmRvbV9janMuY3JlYXRlRWxlbWVudChUYWJsZURvd0NlbGwsIHsga2V5OiBkYXRlLmdldFVUQ0RheSgpLCBkb3c6IGRhdGUuZ2V0VVRDRGF5KCksIGRheUhlYWRlckZvcm1hdDogZGF5SGVhZGVyRm9ybWF0IH0pKSk7IH0pKSk7IH0pKTtcbiAgICB9O1xuICAgIHJldHVybiBEYXlIZWFkZXI7XG59KEJhc2VDb21wb25lbnQpKTtcbmZ1bmN0aW9uIGNyZWF0ZURheUhlYWRlckZvcm1hdHRlcihleHBsaWNpdEZvcm1hdCwgZGF0ZXNSZXBEaXN0aW5jdERheXMsIGRhdGVDbnQpIHtcbiAgICByZXR1cm4gZXhwbGljaXRGb3JtYXQgfHwgY29tcHV0ZUZhbGxiYWNrSGVhZGVyRm9ybWF0KGRhdGVzUmVwRGlzdGluY3REYXlzLCBkYXRlQ250KTtcbn1cblxudmFyIERheVNlcmllc01vZGVsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERheVNlcmllc01vZGVsKHJhbmdlLCBkYXRlUHJvZmlsZUdlbmVyYXRvcikge1xuICAgICAgICB2YXIgZGF0ZSA9IHJhbmdlLnN0YXJ0O1xuICAgICAgICB2YXIgZW5kID0gcmFuZ2UuZW5kO1xuICAgICAgICB2YXIgaW5kaWNlcyA9IFtdO1xuICAgICAgICB2YXIgZGF0ZXMgPSBbXTtcbiAgICAgICAgdmFyIGRheUluZGV4ID0gLTE7XG4gICAgICAgIHdoaWxlIChkYXRlIDwgZW5kKSB7IC8vIGxvb3AgZWFjaCBkYXkgZnJvbSBzdGFydCB0byBlbmRcbiAgICAgICAgICAgIGlmIChkYXRlUHJvZmlsZUdlbmVyYXRvci5pc0hpZGRlbkRheShkYXRlKSkge1xuICAgICAgICAgICAgICAgIGluZGljZXMucHVzaChkYXlJbmRleCArIDAuNSk7IC8vIG1hcmsgdGhhdCBpdCdzIGJldHdlZW4gaW5kaWNlc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF5SW5kZXggKz0gMTtcbiAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goZGF5SW5kZXgpO1xuICAgICAgICAgICAgICAgIGRhdGVzLnB1c2goZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRlID0gYWRkRGF5cyhkYXRlLCAxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGVzID0gZGF0ZXM7XG4gICAgICAgIHRoaXMuaW5kaWNlcyA9IGluZGljZXM7XG4gICAgICAgIHRoaXMuY250ID0gZGF0ZXMubGVuZ3RoO1xuICAgIH1cbiAgICBEYXlTZXJpZXNNb2RlbC5wcm90b3R5cGUuc2xpY2VSYW5nZSA9IGZ1bmN0aW9uIChyYW5nZSkge1xuICAgICAgICB2YXIgZmlyc3RJbmRleCA9IHRoaXMuZ2V0RGF0ZURheUluZGV4KHJhbmdlLnN0YXJ0KTsgLy8gaW5jbHVzaXZlIGZpcnN0IGluZGV4XG4gICAgICAgIHZhciBsYXN0SW5kZXggPSB0aGlzLmdldERhdGVEYXlJbmRleChhZGREYXlzKHJhbmdlLmVuZCwgLTEpKTsgLy8gaW5jbHVzaXZlIGxhc3QgaW5kZXhcbiAgICAgICAgdmFyIGNsaXBwZWRGaXJzdEluZGV4ID0gTWF0aC5tYXgoMCwgZmlyc3RJbmRleCk7XG4gICAgICAgIHZhciBjbGlwcGVkTGFzdEluZGV4ID0gTWF0aC5taW4odGhpcy5jbnQgLSAxLCBsYXN0SW5kZXgpO1xuICAgICAgICAvLyBkZWFsIHdpdGggaW4tYmV0d2VlbiBpbmRpY2VzXG4gICAgICAgIGNsaXBwZWRGaXJzdEluZGV4ID0gTWF0aC5jZWlsKGNsaXBwZWRGaXJzdEluZGV4KTsgLy8gaW4tYmV0d2VlbiBzdGFydHMgcm91bmQgdG8gbmV4dCBjZWxsXG4gICAgICAgIGNsaXBwZWRMYXN0SW5kZXggPSBNYXRoLmZsb29yKGNsaXBwZWRMYXN0SW5kZXgpOyAvLyBpbi1iZXR3ZWVuIGVuZHMgcm91bmQgdG8gcHJldiBjZWxsXG4gICAgICAgIGlmIChjbGlwcGVkRmlyc3RJbmRleCA8PSBjbGlwcGVkTGFzdEluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZpcnN0SW5kZXg6IGNsaXBwZWRGaXJzdEluZGV4LFxuICAgICAgICAgICAgICAgIGxhc3RJbmRleDogY2xpcHBlZExhc3RJbmRleCxcbiAgICAgICAgICAgICAgICBpc1N0YXJ0OiBmaXJzdEluZGV4ID09PSBjbGlwcGVkRmlyc3RJbmRleCxcbiAgICAgICAgICAgICAgICBpc0VuZDogbGFzdEluZGV4ID09PSBjbGlwcGVkTGFzdEluZGV4LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIC8vIEdpdmVuIGEgZGF0ZSwgcmV0dXJucyBpdHMgY2hyb25vbG9jaWFsIGNlbGwtaW5kZXggZnJvbSB0aGUgZmlyc3QgY2VsbCBvZiB0aGUgZ3JpZC5cbiAgICAvLyBJZiB0aGUgZGF0ZSBsaWVzIGJldHdlZW4gY2VsbHMgKGJlY2F1c2Ugb2YgaGlkZGVuRGF5cyksIHJldHVybnMgYSBmbG9hdGluZy1wb2ludCB2YWx1ZSBiZXR3ZWVuIG9mZnNldHMuXG4gICAgLy8gSWYgYmVmb3JlIHRoZSBmaXJzdCBvZmZzZXQsIHJldHVybnMgYSBuZWdhdGl2ZSBudW1iZXIuXG4gICAgLy8gSWYgYWZ0ZXIgdGhlIGxhc3Qgb2Zmc2V0LCByZXR1cm5zIGFuIG9mZnNldCBwYXN0IHRoZSBsYXN0IGNlbGwgb2Zmc2V0LlxuICAgIC8vIE9ubHkgd29ya3MgZm9yICpzdGFydCogZGF0ZXMgb2YgY2VsbHMuIFdpbGwgbm90IHdvcmsgZm9yIGV4Y2x1c2l2ZSBlbmQgZGF0ZXMgZm9yIGNlbGxzLlxuICAgIERheVNlcmllc01vZGVsLnByb3RvdHlwZS5nZXREYXRlRGF5SW5kZXggPSBmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuaW5kaWNlcztcbiAgICAgICAgdmFyIGRheU9mZnNldCA9IE1hdGguZmxvb3IoZGlmZkRheXModGhpcy5kYXRlc1swXSwgZGF0ZSkpO1xuICAgICAgICBpZiAoZGF5T2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGluZGljZXNbMF0gLSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXlPZmZzZXQgPj0gaW5kaWNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMV0gKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmRpY2VzW2RheU9mZnNldF07XG4gICAgfTtcbiAgICByZXR1cm4gRGF5U2VyaWVzTW9kZWw7XG59KCkpO1xuXG52YXIgRGF5VGFibGVNb2RlbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEYXlUYWJsZU1vZGVsKGRheVNlcmllcywgYnJlYWtPbldlZWtzKSB7XG4gICAgICAgIHZhciBkYXRlcyA9IGRheVNlcmllcy5kYXRlcztcbiAgICAgICAgdmFyIGRheXNQZXJSb3c7XG4gICAgICAgIHZhciBmaXJzdERheTtcbiAgICAgICAgdmFyIHJvd0NudDtcbiAgICAgICAgaWYgKGJyZWFrT25XZWVrcykge1xuICAgICAgICAgICAgLy8gY291bnQgY29sdW1ucyB1bnRpbCB0aGUgZGF5LW9mLXdlZWsgcmVwZWF0c1xuICAgICAgICAgICAgZmlyc3REYXkgPSBkYXRlc1swXS5nZXRVVENEYXkoKTtcbiAgICAgICAgICAgIGZvciAoZGF5c1BlclJvdyA9IDE7IGRheXNQZXJSb3cgPCBkYXRlcy5sZW5ndGg7IGRheXNQZXJSb3cgKz0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRlc1tkYXlzUGVyUm93XS5nZXRVVENEYXkoKSA9PT0gZmlyc3REYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm93Q250ID0gTWF0aC5jZWlsKGRhdGVzLmxlbmd0aCAvIGRheXNQZXJSb3cpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcm93Q250ID0gMTtcbiAgICAgICAgICAgIGRheXNQZXJSb3cgPSBkYXRlcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb3dDbnQgPSByb3dDbnQ7XG4gICAgICAgIHRoaXMuY29sQ250ID0gZGF5c1BlclJvdztcbiAgICAgICAgdGhpcy5kYXlTZXJpZXMgPSBkYXlTZXJpZXM7XG4gICAgICAgIHRoaXMuY2VsbHMgPSB0aGlzLmJ1aWxkQ2VsbHMoKTtcbiAgICAgICAgdGhpcy5oZWFkZXJEYXRlcyA9IHRoaXMuYnVpbGRIZWFkZXJEYXRlcygpO1xuICAgIH1cbiAgICBEYXlUYWJsZU1vZGVsLnByb3RvdHlwZS5idWlsZENlbGxzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcm93cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCB0aGlzLnJvd0NudDsgcm93ICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBjZWxscyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgdGhpcy5jb2xDbnQ7IGNvbCArPSAxKSB7XG4gICAgICAgICAgICAgICAgY2VsbHMucHVzaCh0aGlzLmJ1aWxkQ2VsbChyb3csIGNvbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm93cy5wdXNoKGNlbGxzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93cztcbiAgICB9O1xuICAgIERheVRhYmxlTW9kZWwucHJvdG90eXBlLmJ1aWxkQ2VsbCA9IGZ1bmN0aW9uIChyb3csIGNvbCkge1xuICAgICAgICB2YXIgZGF0ZSA9IHRoaXMuZGF5U2VyaWVzLmRhdGVzW3JvdyAqIHRoaXMuY29sQ250ICsgY29sXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtleTogZGF0ZS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgZGF0ZTogZGF0ZSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIERheVRhYmxlTW9kZWwucHJvdG90eXBlLmJ1aWxkSGVhZGVyRGF0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkYXRlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCB0aGlzLmNvbENudDsgY29sICs9IDEpIHtcbiAgICAgICAgICAgIGRhdGVzLnB1c2godGhpcy5jZWxsc1swXVtjb2xdLmRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlcztcbiAgICB9O1xuICAgIERheVRhYmxlTW9kZWwucHJvdG90eXBlLnNsaWNlUmFuZ2UgPSBmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICAgICAgdmFyIGNvbENudCA9IHRoaXMuY29sQ250O1xuICAgICAgICB2YXIgc2VyaWVzU2VnID0gdGhpcy5kYXlTZXJpZXMuc2xpY2VSYW5nZShyYW5nZSk7XG4gICAgICAgIHZhciBzZWdzID0gW107XG4gICAgICAgIGlmIChzZXJpZXNTZWcpIHtcbiAgICAgICAgICAgIHZhciBmaXJzdEluZGV4ID0gc2VyaWVzU2VnLmZpcnN0SW5kZXgsIGxhc3RJbmRleCA9IHNlcmllc1NlZy5sYXN0SW5kZXg7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBmaXJzdEluZGV4O1xuICAgICAgICAgICAgd2hpbGUgKGluZGV4IDw9IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgICAgIHZhciByb3cgPSBNYXRoLmZsb29yKGluZGV4IC8gY29sQ250KTtcbiAgICAgICAgICAgICAgICB2YXIgbmV4dEluZGV4ID0gTWF0aC5taW4oKHJvdyArIDEpICogY29sQ250LCBsYXN0SW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICBzZWdzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb2w6IGluZGV4ICUgY29sQ250LFxuICAgICAgICAgICAgICAgICAgICBsYXN0Q29sOiAobmV4dEluZGV4IC0gMSkgJSBjb2xDbnQsXG4gICAgICAgICAgICAgICAgICAgIGlzU3RhcnQ6IHNlcmllc1NlZy5pc1N0YXJ0ICYmIGluZGV4ID09PSBmaXJzdEluZGV4LFxuICAgICAgICAgICAgICAgICAgICBpc0VuZDogc2VyaWVzU2VnLmlzRW5kICYmIChuZXh0SW5kZXggLSAxKSA9PT0gbGFzdEluZGV4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gbmV4dEluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWdzO1xuICAgIH07XG4gICAgcmV0dXJuIERheVRhYmxlTW9kZWw7XG59KCkpO1xuXG52YXIgU2xpY2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNsaWNlcigpIHtcbiAgICAgICAgdGhpcy5zbGljZUJ1c2luZXNzSG91cnMgPSBtZW1vaXplKHRoaXMuX3NsaWNlQnVzaW5lc3NIb3Vycyk7XG4gICAgICAgIHRoaXMuc2xpY2VEYXRlU2VsZWN0aW9uID0gbWVtb2l6ZSh0aGlzLl9zbGljZURhdGVTcGFuKTtcbiAgICAgICAgdGhpcy5zbGljZUV2ZW50U3RvcmUgPSBtZW1vaXplKHRoaXMuX3NsaWNlRXZlbnRTdG9yZSk7XG4gICAgICAgIHRoaXMuc2xpY2VFdmVudERyYWcgPSBtZW1vaXplKHRoaXMuX3NsaWNlSW50ZXJhY3Rpb24pO1xuICAgICAgICB0aGlzLnNsaWNlRXZlbnRSZXNpemUgPSBtZW1vaXplKHRoaXMuX3NsaWNlSW50ZXJhY3Rpb24pO1xuICAgICAgICB0aGlzLmZvcmNlRGF5SWZMaXN0SXRlbSA9IGZhbHNlOyAvLyBoYWNrXG4gICAgfVxuICAgIFNsaWNlci5wcm90b3R5cGUuc2xpY2VQcm9wcyA9IGZ1bmN0aW9uIChwcm9wcywgZGF0ZVByb2ZpbGUsIG5leHREYXlUaHJlc2hvbGQsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGV4dHJhQXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDQ7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgZXh0cmFBcmdzW19pIC0gNF0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBldmVudFVpQmFzZXMgPSBwcm9wcy5ldmVudFVpQmFzZXM7XG4gICAgICAgIHZhciBldmVudFNlZ3MgPSB0aGlzLnNsaWNlRXZlbnRTdG9yZS5hcHBseSh0aGlzLCB0c2xpYi5fX3NwcmVhZEFycmF5KFtwcm9wcy5ldmVudFN0b3JlLCBldmVudFVpQmFzZXMsIGRhdGVQcm9maWxlLCBuZXh0RGF5VGhyZXNob2xkXSwgZXh0cmFBcmdzKSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRlU2VsZWN0aW9uU2VnczogdGhpcy5zbGljZURhdGVTZWxlY3Rpb24uYXBwbHkodGhpcywgdHNsaWIuX19zcHJlYWRBcnJheShbcHJvcHMuZGF0ZVNlbGVjdGlvbiwgZXZlbnRVaUJhc2VzLCBjb250ZXh0XSwgZXh0cmFBcmdzKSksXG4gICAgICAgICAgICBidXNpbmVzc0hvdXJTZWdzOiB0aGlzLnNsaWNlQnVzaW5lc3NIb3Vycy5hcHBseSh0aGlzLCB0c2xpYi5fX3NwcmVhZEFycmF5KFtwcm9wcy5idXNpbmVzc0hvdXJzLCBkYXRlUHJvZmlsZSwgbmV4dERheVRocmVzaG9sZCwgY29udGV4dF0sIGV4dHJhQXJncykpLFxuICAgICAgICAgICAgZmdFdmVudFNlZ3M6IGV2ZW50U2Vncy5mZyxcbiAgICAgICAgICAgIGJnRXZlbnRTZWdzOiBldmVudFNlZ3MuYmcsXG4gICAgICAgICAgICBldmVudERyYWc6IHRoaXMuc2xpY2VFdmVudERyYWcuYXBwbHkodGhpcywgdHNsaWIuX19zcHJlYWRBcnJheShbcHJvcHMuZXZlbnREcmFnLCBldmVudFVpQmFzZXMsIGRhdGVQcm9maWxlLCBuZXh0RGF5VGhyZXNob2xkXSwgZXh0cmFBcmdzKSksXG4gICAgICAgICAgICBldmVudFJlc2l6ZTogdGhpcy5zbGljZUV2ZW50UmVzaXplLmFwcGx5KHRoaXMsIHRzbGliLl9fc3ByZWFkQXJyYXkoW3Byb3BzLmV2ZW50UmVzaXplLCBldmVudFVpQmFzZXMsIGRhdGVQcm9maWxlLCBuZXh0RGF5VGhyZXNob2xkXSwgZXh0cmFBcmdzKSksXG4gICAgICAgICAgICBldmVudFNlbGVjdGlvbjogcHJvcHMuZXZlbnRTZWxlY3Rpb24sXG4gICAgICAgIH07IC8vIFRPRE86IGdpdmUgaW50ZXJhY3Rpb25TZWdzP1xuICAgIH07XG4gICAgU2xpY2VyLnByb3RvdHlwZS5zbGljZU5vd0RhdGUgPSBmdW5jdGlvbiAoLy8gZG9lcyBub3QgbWVtb2l6ZVxuICAgIGRhdGUsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGV4dHJhQXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgZXh0cmFBcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zbGljZURhdGVTcGFuLmFwcGx5KHRoaXMsIHRzbGliLl9fc3ByZWFkQXJyYXkoW3sgcmFuZ2U6IHsgc3RhcnQ6IGRhdGUsIGVuZDogYWRkTXMoZGF0ZSwgMSkgfSwgYWxsRGF5OiBmYWxzZSB9LFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBjb250ZXh0XSwgZXh0cmFBcmdzKSk7XG4gICAgfTtcbiAgICBTbGljZXIucHJvdG90eXBlLl9zbGljZUJ1c2luZXNzSG91cnMgPSBmdW5jdGlvbiAoYnVzaW5lc3NIb3VycywgZGF0ZVByb2ZpbGUsIG5leHREYXlUaHJlc2hvbGQsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGV4dHJhQXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDQ7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgZXh0cmFBcmdzW19pIC0gNF0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYnVzaW5lc3NIb3Vycykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zbGljZUV2ZW50U3RvcmUuYXBwbHkodGhpcywgdHNsaWIuX19zcHJlYWRBcnJheShbZXhwYW5kUmVjdXJyaW5nKGJ1c2luZXNzSG91cnMsIGNvbXB1dGVBY3RpdmVSYW5nZShkYXRlUHJvZmlsZSwgQm9vbGVhbihuZXh0RGF5VGhyZXNob2xkKSksIGNvbnRleHQpLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBkYXRlUHJvZmlsZSxcbiAgICAgICAgICAgIG5leHREYXlUaHJlc2hvbGRdLCBleHRyYUFyZ3MpKS5iZztcbiAgICB9O1xuICAgIFNsaWNlci5wcm90b3R5cGUuX3NsaWNlRXZlbnRTdG9yZSA9IGZ1bmN0aW9uIChldmVudFN0b3JlLCBldmVudFVpQmFzZXMsIGRhdGVQcm9maWxlLCBuZXh0RGF5VGhyZXNob2xkKSB7XG4gICAgICAgIHZhciBleHRyYUFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSA0OyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGV4dHJhQXJnc1tfaSAtIDRdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnRTdG9yZSkge1xuICAgICAgICAgICAgdmFyIHJhbmdlUmVzID0gc2xpY2VFdmVudFN0b3JlKGV2ZW50U3RvcmUsIGV2ZW50VWlCYXNlcywgY29tcHV0ZUFjdGl2ZVJhbmdlKGRhdGVQcm9maWxlLCBCb29sZWFuKG5leHREYXlUaHJlc2hvbGQpKSwgbmV4dERheVRocmVzaG9sZCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGJnOiB0aGlzLnNsaWNlRXZlbnRSYW5nZXMocmFuZ2VSZXMuYmcsIGV4dHJhQXJncyksXG4gICAgICAgICAgICAgICAgZmc6IHRoaXMuc2xpY2VFdmVudFJhbmdlcyhyYW5nZVJlcy5mZywgZXh0cmFBcmdzKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgYmc6IFtdLCBmZzogW10gfTtcbiAgICB9O1xuICAgIFNsaWNlci5wcm90b3R5cGUuX3NsaWNlSW50ZXJhY3Rpb24gPSBmdW5jdGlvbiAoaW50ZXJhY3Rpb24sIGV2ZW50VWlCYXNlcywgZGF0ZVByb2ZpbGUsIG5leHREYXlUaHJlc2hvbGQpIHtcbiAgICAgICAgdmFyIGV4dHJhQXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDQ7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgZXh0cmFBcmdzW19pIC0gNF0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciByYW5nZVJlcyA9IHNsaWNlRXZlbnRTdG9yZShpbnRlcmFjdGlvbi5tdXRhdGVkRXZlbnRzLCBldmVudFVpQmFzZXMsIGNvbXB1dGVBY3RpdmVSYW5nZShkYXRlUHJvZmlsZSwgQm9vbGVhbihuZXh0RGF5VGhyZXNob2xkKSksIG5leHREYXlUaHJlc2hvbGQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2VnczogdGhpcy5zbGljZUV2ZW50UmFuZ2VzKHJhbmdlUmVzLmZnLCBleHRyYUFyZ3MpLFxuICAgICAgICAgICAgYWZmZWN0ZWRJbnN0YW5jZXM6IGludGVyYWN0aW9uLmFmZmVjdGVkRXZlbnRzLmluc3RhbmNlcyxcbiAgICAgICAgICAgIGlzRXZlbnQ6IGludGVyYWN0aW9uLmlzRXZlbnQsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBTbGljZXIucHJvdG90eXBlLl9zbGljZURhdGVTcGFuID0gZnVuY3Rpb24gKGRhdGVTcGFuLCBldmVudFVpQmFzZXMsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGV4dHJhQXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDM7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgZXh0cmFBcmdzW19pIC0gM10gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGF0ZVNwYW4pIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXZlbnRSYW5nZSA9IGZhYnJpY2F0ZUV2ZW50UmFuZ2UoZGF0ZVNwYW4sIGV2ZW50VWlCYXNlcywgY29udGV4dCk7XG4gICAgICAgIHZhciBzZWdzID0gdGhpcy5zbGljZVJhbmdlLmFwcGx5KHRoaXMsIHRzbGliLl9fc3ByZWFkQXJyYXkoW2RhdGVTcGFuLnJhbmdlXSwgZXh0cmFBcmdzKSk7XG4gICAgICAgIGZvciAodmFyIF9hID0gMCwgc2Vnc18xID0gc2VnczsgX2EgPCBzZWdzXzEubGVuZ3RoOyBfYSsrKSB7XG4gICAgICAgICAgICB2YXIgc2VnID0gc2Vnc18xW19hXTtcbiAgICAgICAgICAgIHNlZy5ldmVudFJhbmdlID0gZXZlbnRSYW5nZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VncztcbiAgICB9O1xuICAgIC8qXG4gICAgXCJjb21wbGV0ZVwiIHNlZyBtZWFucyBpdCBoYXMgY29tcG9uZW50IGFuZCBldmVudFJhbmdlXG4gICAgKi9cbiAgICBTbGljZXIucHJvdG90eXBlLnNsaWNlRXZlbnRSYW5nZXMgPSBmdW5jdGlvbiAoZXZlbnRSYW5nZXMsIGV4dHJhQXJncykge1xuICAgICAgICB2YXIgc2VncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGV2ZW50UmFuZ2VzXzEgPSBldmVudFJhbmdlczsgX2kgPCBldmVudFJhbmdlc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIGV2ZW50UmFuZ2UgPSBldmVudFJhbmdlc18xW19pXTtcbiAgICAgICAgICAgIHNlZ3MucHVzaC5hcHBseShzZWdzLCB0aGlzLnNsaWNlRXZlbnRSYW5nZShldmVudFJhbmdlLCBleHRyYUFyZ3MpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VncztcbiAgICB9O1xuICAgIC8qXG4gICAgXCJjb21wbGV0ZVwiIHNlZyBtZWFucyBpdCBoYXMgY29tcG9uZW50IGFuZCBldmVudFJhbmdlXG4gICAgKi9cbiAgICBTbGljZXIucHJvdG90eXBlLnNsaWNlRXZlbnRSYW5nZSA9IGZ1bmN0aW9uIChldmVudFJhbmdlLCBleHRyYUFyZ3MpIHtcbiAgICAgICAgdmFyIGRhdGVSYW5nZSA9IGV2ZW50UmFuZ2UucmFuZ2U7XG4gICAgICAgIC8vIGhhY2sgdG8gbWFrZSBtdWx0aS1kYXkgZXZlbnRzIHRoYXQgYXJlIGJlaW5nIGZvcmNlLWRpc3BsYXllZCBhcyBsaXN0LWl0ZW1zIHRvIHRha2UgdXAgb25seSBvbmUgZGF5XG4gICAgICAgIGlmICh0aGlzLmZvcmNlRGF5SWZMaXN0SXRlbSAmJiBldmVudFJhbmdlLnVpLmRpc3BsYXkgPT09ICdsaXN0LWl0ZW0nKSB7XG4gICAgICAgICAgICBkYXRlUmFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IGRhdGVSYW5nZS5zdGFydCxcbiAgICAgICAgICAgICAgICBlbmQ6IGFkZERheXMoZGF0ZVJhbmdlLnN0YXJ0LCAxKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNlZ3MgPSB0aGlzLnNsaWNlUmFuZ2UuYXBwbHkodGhpcywgdHNsaWIuX19zcHJlYWRBcnJheShbZGF0ZVJhbmdlXSwgZXh0cmFBcmdzKSk7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgc2Vnc18yID0gc2VnczsgX2kgPCBzZWdzXzIubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgc2VnID0gc2Vnc18yW19pXTtcbiAgICAgICAgICAgIHNlZy5ldmVudFJhbmdlID0gZXZlbnRSYW5nZTtcbiAgICAgICAgICAgIHNlZy5pc1N0YXJ0ID0gZXZlbnRSYW5nZS5pc1N0YXJ0ICYmIHNlZy5pc1N0YXJ0O1xuICAgICAgICAgICAgc2VnLmlzRW5kID0gZXZlbnRSYW5nZS5pc0VuZCAmJiBzZWcuaXNFbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlZ3M7XG4gICAgfTtcbiAgICByZXR1cm4gU2xpY2VyO1xufSgpKTtcbi8qXG5mb3IgaW5jb3Jwb3JhdGluZyBzbG90TWluVGltZS9zbG90TWF4VGltZSBpZiBhcHByb3ByaWF0ZVxuVE9ETzogc2hvdWxkIGJlIHBhcnQgb2YgRGF0ZVByb2ZpbGUhXG5UaW1lbGluZURhdGVQcm9maWxlIGFscmVhZHkgZG9lcyB0aGlzIGJ0d1xuKi9cbmZ1bmN0aW9uIGNvbXB1dGVBY3RpdmVSYW5nZShkYXRlUHJvZmlsZSwgaXNDb21wb25lbnRBbGxEYXkpIHtcbiAgICB2YXIgcmFuZ2UgPSBkYXRlUHJvZmlsZS5hY3RpdmVSYW5nZTtcbiAgICBpZiAoaXNDb21wb25lbnRBbGxEYXkpIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogYWRkTXMocmFuZ2Uuc3RhcnQsIGRhdGVQcm9maWxlLnNsb3RNaW5UaW1lLm1pbGxpc2Vjb25kcyksXG4gICAgICAgIGVuZDogYWRkTXMocmFuZ2UuZW5kLCBkYXRlUHJvZmlsZS5zbG90TWF4VGltZS5taWxsaXNlY29uZHMgLSA4NjRlNSksIC8vIDg2NGU1ID0gbXMgaW4gYSBkYXlcbiAgICB9O1xufVxuXG4vLyBoaWdoLWxldmVsIHNlZ21lbnRpbmctYXdhcmUgdGVzdGVyIGZ1bmN0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBpc0ludGVyYWN0aW9uVmFsaWQoaW50ZXJhY3Rpb24sIGRhdGVQcm9maWxlLCBjb250ZXh0KSB7XG4gICAgdmFyIGluc3RhbmNlcyA9IGludGVyYWN0aW9uLm11dGF0ZWRFdmVudHMuaW5zdGFuY2VzO1xuICAgIGZvciAodmFyIGluc3RhbmNlSWQgaW4gaW5zdGFuY2VzKSB7XG4gICAgICAgIGlmICghcmFuZ2VDb250YWluc1JhbmdlKGRhdGVQcm9maWxlLnZhbGlkUmFuZ2UsIGluc3RhbmNlc1tpbnN0YW5jZUlkXS5yYW5nZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXNOZXdQcm9wc1ZhbGlkKHsgZXZlbnREcmFnOiBpbnRlcmFjdGlvbiB9LCBjb250ZXh0KTsgLy8gSEFDSzogdGhlIGV2ZW50RHJhZyBwcm9wcyBpcyB1c2VkIGZvciBBTEwgaW50ZXJhY3Rpb25zXG59XG5mdW5jdGlvbiBpc0RhdGVTZWxlY3Rpb25WYWxpZChkYXRlU2VsZWN0aW9uLCBkYXRlUHJvZmlsZSwgY29udGV4dCkge1xuICAgIGlmICghcmFuZ2VDb250YWluc1JhbmdlKGRhdGVQcm9maWxlLnZhbGlkUmFuZ2UsIGRhdGVTZWxlY3Rpb24ucmFuZ2UpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzTmV3UHJvcHNWYWxpZCh7IGRhdGVTZWxlY3Rpb246IGRhdGVTZWxlY3Rpb24gfSwgY29udGV4dCk7XG59XG5mdW5jdGlvbiBpc05ld1Byb3BzVmFsaWQobmV3UHJvcHMsIGNvbnRleHQpIHtcbiAgICB2YXIgY2FsZW5kYXJTdGF0ZSA9IGNvbnRleHQuZ2V0Q3VycmVudERhdGEoKTtcbiAgICB2YXIgcHJvcHMgPSB0c2xpYi5fX2Fzc2lnbih7IGJ1c2luZXNzSG91cnM6IGNhbGVuZGFyU3RhdGUuYnVzaW5lc3NIb3VycywgZGF0ZVNlbGVjdGlvbjogJycsIGV2ZW50U3RvcmU6IGNhbGVuZGFyU3RhdGUuZXZlbnRTdG9yZSwgZXZlbnRVaUJhc2VzOiBjYWxlbmRhclN0YXRlLmV2ZW50VWlCYXNlcywgZXZlbnRTZWxlY3Rpb246ICcnLCBldmVudERyYWc6IG51bGwsIGV2ZW50UmVzaXplOiBudWxsIH0sIG5ld1Byb3BzKTtcbiAgICByZXR1cm4gKGNvbnRleHQucGx1Z2luSG9va3MuaXNQcm9wc1ZhbGlkIHx8IGlzUHJvcHNWYWxpZCkocHJvcHMsIGNvbnRleHQpO1xufVxuZnVuY3Rpb24gaXNQcm9wc1ZhbGlkKHN0YXRlLCBjb250ZXh0LCBkYXRlU3Bhbk1ldGEsIGZpbHRlckNvbmZpZykge1xuICAgIGlmIChkYXRlU3Bhbk1ldGEgPT09IHZvaWQgMCkgeyBkYXRlU3Bhbk1ldGEgPSB7fTsgfVxuICAgIGlmIChzdGF0ZS5ldmVudERyYWcgJiYgIWlzSW50ZXJhY3Rpb25Qcm9wc1ZhbGlkKHN0YXRlLCBjb250ZXh0LCBkYXRlU3Bhbk1ldGEsIGZpbHRlckNvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuZGF0ZVNlbGVjdGlvbiAmJiAhaXNEYXRlU2VsZWN0aW9uUHJvcHNWYWxpZChzdGF0ZSwgY29udGV4dCwgZGF0ZVNwYW5NZXRhLCBmaWx0ZXJDb25maWcpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBNb3ZpbmcgRXZlbnQgVmFsaWRhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBpc0ludGVyYWN0aW9uUHJvcHNWYWxpZChzdGF0ZSwgY29udGV4dCwgZGF0ZVNwYW5NZXRhLCBmaWx0ZXJDb25maWcpIHtcbiAgICB2YXIgY3VycmVudFN0YXRlID0gY29udGV4dC5nZXRDdXJyZW50RGF0YSgpO1xuICAgIHZhciBpbnRlcmFjdGlvbiA9IHN0YXRlLmV2ZW50RHJhZzsgLy8gSEFDSzogdGhlIGV2ZW50RHJhZyBwcm9wcyBpcyB1c2VkIGZvciBBTEwgaW50ZXJhY3Rpb25zXG4gICAgdmFyIHN1YmplY3RFdmVudFN0b3JlID0gaW50ZXJhY3Rpb24ubXV0YXRlZEV2ZW50cztcbiAgICB2YXIgc3ViamVjdERlZnMgPSBzdWJqZWN0RXZlbnRTdG9yZS5kZWZzO1xuICAgIHZhciBzdWJqZWN0SW5zdGFuY2VzID0gc3ViamVjdEV2ZW50U3RvcmUuaW5zdGFuY2VzO1xuICAgIHZhciBzdWJqZWN0Q29uZmlncyA9IGNvbXBpbGVFdmVudFVpcyhzdWJqZWN0RGVmcywgaW50ZXJhY3Rpb24uaXNFdmVudCA/XG4gICAgICAgIHN0YXRlLmV2ZW50VWlCYXNlcyA6XG4gICAgICAgIHsgJyc6IGN1cnJlbnRTdGF0ZS5zZWxlY3Rpb25Db25maWcgfSk7XG4gICAgaWYgKGZpbHRlckNvbmZpZykge1xuICAgICAgICBzdWJqZWN0Q29uZmlncyA9IG1hcEhhc2goc3ViamVjdENvbmZpZ3MsIGZpbHRlckNvbmZpZyk7XG4gICAgfVxuICAgIC8vIGV4Y2x1ZGUgdGhlIHN1YmplY3QgZXZlbnRzLiBUT0RPOiBleGNsdWRlIGRlZnMgdG9vP1xuICAgIHZhciBvdGhlckV2ZW50U3RvcmUgPSBleGNsdWRlSW5zdGFuY2VzKHN0YXRlLmV2ZW50U3RvcmUsIGludGVyYWN0aW9uLmFmZmVjdGVkRXZlbnRzLmluc3RhbmNlcyk7XG4gICAgdmFyIG90aGVyRGVmcyA9IG90aGVyRXZlbnRTdG9yZS5kZWZzO1xuICAgIHZhciBvdGhlckluc3RhbmNlcyA9IG90aGVyRXZlbnRTdG9yZS5pbnN0YW5jZXM7XG4gICAgdmFyIG90aGVyQ29uZmlncyA9IGNvbXBpbGVFdmVudFVpcyhvdGhlckRlZnMsIHN0YXRlLmV2ZW50VWlCYXNlcyk7XG4gICAgZm9yICh2YXIgc3ViamVjdEluc3RhbmNlSWQgaW4gc3ViamVjdEluc3RhbmNlcykge1xuICAgICAgICB2YXIgc3ViamVjdEluc3RhbmNlID0gc3ViamVjdEluc3RhbmNlc1tzdWJqZWN0SW5zdGFuY2VJZF07XG4gICAgICAgIHZhciBzdWJqZWN0UmFuZ2UgPSBzdWJqZWN0SW5zdGFuY2UucmFuZ2U7XG4gICAgICAgIHZhciBzdWJqZWN0Q29uZmlnID0gc3ViamVjdENvbmZpZ3Nbc3ViamVjdEluc3RhbmNlLmRlZklkXTtcbiAgICAgICAgdmFyIHN1YmplY3REZWYgPSBzdWJqZWN0RGVmc1tzdWJqZWN0SW5zdGFuY2UuZGVmSWRdO1xuICAgICAgICAvLyBjb25zdHJhaW50XG4gICAgICAgIGlmICghYWxsQ29uc3RyYWludHNQYXNzKHN1YmplY3RDb25maWcuY29uc3RyYWludHMsIHN1YmplY3RSYW5nZSwgb3RoZXJFdmVudFN0b3JlLCBzdGF0ZS5idXNpbmVzc0hvdXJzLCBjb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIG92ZXJsYXBcbiAgICAgICAgdmFyIGV2ZW50T3ZlcmxhcCA9IGNvbnRleHQub3B0aW9ucy5ldmVudE92ZXJsYXA7XG4gICAgICAgIHZhciBldmVudE92ZXJsYXBGdW5jID0gdHlwZW9mIGV2ZW50T3ZlcmxhcCA9PT0gJ2Z1bmN0aW9uJyA/IGV2ZW50T3ZlcmxhcCA6IG51bGw7XG4gICAgICAgIGZvciAodmFyIG90aGVySW5zdGFuY2VJZCBpbiBvdGhlckluc3RhbmNlcykge1xuICAgICAgICAgICAgdmFyIG90aGVySW5zdGFuY2UgPSBvdGhlckluc3RhbmNlc1tvdGhlckluc3RhbmNlSWRdO1xuICAgICAgICAgICAgLy8gaW50ZXJzZWN0ISBldmFsdWF0ZVxuICAgICAgICAgICAgaWYgKHJhbmdlc0ludGVyc2VjdChzdWJqZWN0UmFuZ2UsIG90aGVySW5zdGFuY2UucmFuZ2UpKSB7XG4gICAgICAgICAgICAgICAgdmFyIG90aGVyT3ZlcmxhcCA9IG90aGVyQ29uZmlnc1tvdGhlckluc3RhbmNlLmRlZklkXS5vdmVybGFwO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyIHRoZSBvdGhlciBldmVudCdzIG92ZXJsYXAuIG9ubHkgZG8gdGhpcyBpZiB0aGUgc3ViamVjdCBldmVudCBpcyBhIFwicmVhbFwiIGV2ZW50XG4gICAgICAgICAgICAgICAgaWYgKG90aGVyT3ZlcmxhcCA9PT0gZmFsc2UgJiYgaW50ZXJhY3Rpb24uaXNFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0Q29uZmlnLm92ZXJsYXAgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50T3ZlcmxhcEZ1bmMgJiYgIWV2ZW50T3ZlcmxhcEZ1bmMobmV3IEV2ZW50QXBpKGNvbnRleHQsIG90aGVyRGVmc1tvdGhlckluc3RhbmNlLmRlZklkXSwgb3RoZXJJbnN0YW5jZSksIC8vIHN0aWxsIGV2ZW50XG4gICAgICAgICAgICAgICAgbmV3IEV2ZW50QXBpKGNvbnRleHQsIHN1YmplY3REZWYsIHN1YmplY3RJbnN0YW5jZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gYWxsb3cgKGEgZnVuY3Rpb24pXG4gICAgICAgIHZhciBjYWxlbmRhckV2ZW50U3RvcmUgPSBjdXJyZW50U3RhdGUuZXZlbnRTdG9yZTsgLy8gbmVlZCBnbG9iYWwtdG8tY2FsZW5kYXIsIG5vdCBsb2NhbCB0byBjb21wb25lbnQgKHNwbGl0dGFibGUpc3RhdGVcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHN1YmplY3RDb25maWcuYWxsb3dzOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIHN1YmplY3RBbGxvdyA9IF9hW19pXTtcbiAgICAgICAgICAgIHZhciBzdWJqZWN0RGF0ZVNwYW4gPSB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgZGF0ZVNwYW5NZXRhKSwgeyByYW5nZTogc3ViamVjdEluc3RhbmNlLnJhbmdlLCBhbGxEYXk6IHN1YmplY3REZWYuYWxsRGF5IH0pO1xuICAgICAgICAgICAgdmFyIG9yaWdEZWYgPSBjYWxlbmRhckV2ZW50U3RvcmUuZGVmc1tzdWJqZWN0RGVmLmRlZklkXTtcbiAgICAgICAgICAgIHZhciBvcmlnSW5zdGFuY2UgPSBjYWxlbmRhckV2ZW50U3RvcmUuaW5zdGFuY2VzW3N1YmplY3RJbnN0YW5jZUlkXTtcbiAgICAgICAgICAgIHZhciBldmVudEFwaSA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmIChvcmlnRGVmKSB7IC8vIHdhcyBwcmV2aW91c2x5IGluIHRoZSBjYWxlbmRhclxuICAgICAgICAgICAgICAgIGV2ZW50QXBpID0gbmV3IEV2ZW50QXBpKGNvbnRleHQsIG9yaWdEZWYsIG9yaWdJbnN0YW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgLy8gd2FzIGFuIGV4dGVybmFsIGV2ZW50XG4gICAgICAgICAgICAgICAgZXZlbnRBcGkgPSBuZXcgRXZlbnRBcGkoY29udGV4dCwgc3ViamVjdERlZik7IC8vIG5vIGluc3RhbmNlLCBiZWNhdXNlIGhhZCBubyBkYXRlc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzdWJqZWN0QWxsb3coYnVpbGREYXRlU3BhbkFwaVdpdGhDb250ZXh0KHN1YmplY3REYXRlU3BhbiwgY29udGV4dCksIGV2ZW50QXBpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIERhdGUgU2VsZWN0aW9uIFZhbGlkYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gaXNEYXRlU2VsZWN0aW9uUHJvcHNWYWxpZChzdGF0ZSwgY29udGV4dCwgZGF0ZVNwYW5NZXRhLCBmaWx0ZXJDb25maWcpIHtcbiAgICB2YXIgcmVsZXZhbnRFdmVudFN0b3JlID0gc3RhdGUuZXZlbnRTdG9yZTtcbiAgICB2YXIgcmVsZXZhbnREZWZzID0gcmVsZXZhbnRFdmVudFN0b3JlLmRlZnM7XG4gICAgdmFyIHJlbGV2YW50SW5zdGFuY2VzID0gcmVsZXZhbnRFdmVudFN0b3JlLmluc3RhbmNlcztcbiAgICB2YXIgc2VsZWN0aW9uID0gc3RhdGUuZGF0ZVNlbGVjdGlvbjtcbiAgICB2YXIgc2VsZWN0aW9uUmFuZ2UgPSBzZWxlY3Rpb24ucmFuZ2U7XG4gICAgdmFyIHNlbGVjdGlvbkNvbmZpZyA9IGNvbnRleHQuZ2V0Q3VycmVudERhdGEoKS5zZWxlY3Rpb25Db25maWc7XG4gICAgaWYgKGZpbHRlckNvbmZpZykge1xuICAgICAgICBzZWxlY3Rpb25Db25maWcgPSBmaWx0ZXJDb25maWcoc2VsZWN0aW9uQ29uZmlnKTtcbiAgICB9XG4gICAgLy8gY29uc3RyYWludFxuICAgIGlmICghYWxsQ29uc3RyYWludHNQYXNzKHNlbGVjdGlvbkNvbmZpZy5jb25zdHJhaW50cywgc2VsZWN0aW9uUmFuZ2UsIHJlbGV2YW50RXZlbnRTdG9yZSwgc3RhdGUuYnVzaW5lc3NIb3VycywgY29udGV4dCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBvdmVybGFwXG4gICAgdmFyIHNlbGVjdE92ZXJsYXAgPSBjb250ZXh0Lm9wdGlvbnMuc2VsZWN0T3ZlcmxhcDtcbiAgICB2YXIgc2VsZWN0T3ZlcmxhcEZ1bmMgPSB0eXBlb2Ygc2VsZWN0T3ZlcmxhcCA9PT0gJ2Z1bmN0aW9uJyA/IHNlbGVjdE92ZXJsYXAgOiBudWxsO1xuICAgIGZvciAodmFyIHJlbGV2YW50SW5zdGFuY2VJZCBpbiByZWxldmFudEluc3RhbmNlcykge1xuICAgICAgICB2YXIgcmVsZXZhbnRJbnN0YW5jZSA9IHJlbGV2YW50SW5zdGFuY2VzW3JlbGV2YW50SW5zdGFuY2VJZF07XG4gICAgICAgIC8vIGludGVyc2VjdCEgZXZhbHVhdGVcbiAgICAgICAgaWYgKHJhbmdlc0ludGVyc2VjdChzZWxlY3Rpb25SYW5nZSwgcmVsZXZhbnRJbnN0YW5jZS5yYW5nZSkpIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb25Db25maWcub3ZlcmxhcCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VsZWN0T3ZlcmxhcEZ1bmMgJiYgIXNlbGVjdE92ZXJsYXBGdW5jKG5ldyBFdmVudEFwaShjb250ZXh0LCByZWxldmFudERlZnNbcmVsZXZhbnRJbnN0YW5jZS5kZWZJZF0sIHJlbGV2YW50SW5zdGFuY2UpLCBudWxsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBhbGxvdyAoYSBmdW5jdGlvbilcbiAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gc2VsZWN0aW9uQ29uZmlnLmFsbG93czsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHNlbGVjdGlvbkFsbG93ID0gX2FbX2ldO1xuICAgICAgICB2YXIgZnVsbERhdGVTcGFuID0gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGRhdGVTcGFuTWV0YSksIHNlbGVjdGlvbik7XG4gICAgICAgIGlmICghc2VsZWN0aW9uQWxsb3coYnVpbGREYXRlU3BhbkFwaVdpdGhDb250ZXh0KGZ1bGxEYXRlU3BhbiwgY29udGV4dCksIG51bGwpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBDb25zdHJhaW50IFV0aWxzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGFsbENvbnN0cmFpbnRzUGFzcyhjb25zdHJhaW50cywgc3ViamVjdFJhbmdlLCBvdGhlckV2ZW50U3RvcmUsIGJ1c2luZXNzSG91cnNVbmV4cGFuZGVkLCBjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgX2kgPSAwLCBjb25zdHJhaW50c18xID0gY29uc3RyYWludHM7IF9pIDwgY29uc3RyYWludHNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGNvbnN0cmFpbnQgPSBjb25zdHJhaW50c18xW19pXTtcbiAgICAgICAgaWYgKCFhbnlSYW5nZXNDb250YWluUmFuZ2UoY29uc3RyYWludFRvUmFuZ2VzKGNvbnN0cmFpbnQsIHN1YmplY3RSYW5nZSwgb3RoZXJFdmVudFN0b3JlLCBidXNpbmVzc0hvdXJzVW5leHBhbmRlZCwgY29udGV4dCksIHN1YmplY3RSYW5nZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGNvbnN0cmFpbnRUb1Jhbmdlcyhjb25zdHJhaW50LCBzdWJqZWN0UmFuZ2UsIC8vIGZvciBleHBhbmRpbmcgYSByZWN1cnJpbmcgY29uc3RyYWludCwgb3IgZXhwYW5kaW5nIGJ1c2luZXNzIGhvdXJzXG5vdGhlckV2ZW50U3RvcmUsIC8vIGZvciBpZiBjb25zdHJhaW50IGlzIGFuIGV2ZW4gZ3JvdXAgSURcbmJ1c2luZXNzSG91cnNVbmV4cGFuZGVkLCAvLyBmb3IgaWYgY29uc3RyYWludCBpcyAnYnVzaW5lc3NIb3VycydcbmNvbnRleHQpIHtcbiAgICBpZiAoY29uc3RyYWludCA9PT0gJ2J1c2luZXNzSG91cnMnKSB7XG4gICAgICAgIHJldHVybiBldmVudFN0b3JlVG9SYW5nZXMoZXhwYW5kUmVjdXJyaW5nKGJ1c2luZXNzSG91cnNVbmV4cGFuZGVkLCBzdWJqZWN0UmFuZ2UsIGNvbnRleHQpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25zdHJhaW50ID09PSAnc3RyaW5nJykgeyAvLyBhbiBncm91cCBJRFxuICAgICAgICByZXR1cm4gZXZlbnRTdG9yZVRvUmFuZ2VzKGZpbHRlckV2ZW50U3RvcmVEZWZzKG90aGVyRXZlbnRTdG9yZSwgZnVuY3Rpb24gKGV2ZW50RGVmKSB7IHJldHVybiBldmVudERlZi5ncm91cElkID09PSBjb25zdHJhaW50OyB9KSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29uc3RyYWludCA9PT0gJ29iamVjdCcgJiYgY29uc3RyYWludCkgeyAvLyBub24tbnVsbCBvYmplY3RcbiAgICAgICAgcmV0dXJuIGV2ZW50U3RvcmVUb1JhbmdlcyhleHBhbmRSZWN1cnJpbmcoY29uc3RyYWludCwgc3ViamVjdFJhbmdlLCBjb250ZXh0KSk7XG4gICAgfVxuICAgIHJldHVybiBbXTsgLy8gaWYgaXQncyBmYWxzZVxufVxuLy8gVE9ETzogbW92ZSB0byBldmVudC1zdG9yZSBmaWxlP1xuZnVuY3Rpb24gZXZlbnRTdG9yZVRvUmFuZ2VzKGV2ZW50U3RvcmUpIHtcbiAgICB2YXIgaW5zdGFuY2VzID0gZXZlbnRTdG9yZS5pbnN0YW5jZXM7XG4gICAgdmFyIHJhbmdlcyA9IFtdO1xuICAgIGZvciAodmFyIGluc3RhbmNlSWQgaW4gaW5zdGFuY2VzKSB7XG4gICAgICAgIHJhbmdlcy5wdXNoKGluc3RhbmNlc1tpbnN0YW5jZUlkXS5yYW5nZSk7XG4gICAgfVxuICAgIHJldHVybiByYW5nZXM7XG59XG4vLyBUT0RPOiBtb3ZlIHRvIGdlb20gZmlsZT9cbmZ1bmN0aW9uIGFueVJhbmdlc0NvbnRhaW5SYW5nZShvdXRlclJhbmdlcywgaW5uZXJSYW5nZSkge1xuICAgIGZvciAodmFyIF9pID0gMCwgb3V0ZXJSYW5nZXNfMSA9IG91dGVyUmFuZ2VzOyBfaSA8IG91dGVyUmFuZ2VzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBvdXRlclJhbmdlID0gb3V0ZXJSYW5nZXNfMVtfaV07XG4gICAgICAgIGlmIChyYW5nZUNvbnRhaW5zUmFuZ2Uob3V0ZXJSYW5nZSwgaW5uZXJSYW5nZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxudmFyIFZJU0lCTEVfSElEREVOX1JFID0gL14odmlzaWJsZXxoaWRkZW4pJC87XG52YXIgU2Nyb2xsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFNjcm9sbGVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFNjcm9sbGVyKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuaGFuZGxlRWwgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIF90aGlzLmVsID0gZWw7XG4gICAgICAgICAgICBzZXRSZWYoX3RoaXMucHJvcHMuZWxSZWYsIGVsKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBTY3JvbGxlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgbGlxdWlkID0gcHJvcHMubGlxdWlkLCBsaXF1aWRJc0Fic29sdXRlID0gcHJvcHMubGlxdWlkSXNBYnNvbHV0ZTtcbiAgICAgICAgdmFyIGlzQWJzb2x1dGUgPSBsaXF1aWQgJiYgbGlxdWlkSXNBYnNvbHV0ZTtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IFsnZmMtc2Nyb2xsZXInXTtcbiAgICAgICAgaWYgKGxpcXVpZCkge1xuICAgICAgICAgICAgaWYgKGxpcXVpZElzQWJzb2x1dGUpIHtcbiAgICAgICAgICAgICAgICBjbGFzc05hbWUucHVzaCgnZmMtc2Nyb2xsZXItbGlxdWlkLWFic29sdXRlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjbGFzc05hbWUucHVzaCgnZmMtc2Nyb2xsZXItbGlxdWlkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgcmVmOiB0aGlzLmhhbmRsZUVsLCBjbGFzc05hbWU6IGNsYXNzTmFtZS5qb2luKCcgJyksIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3dYOiBwcm9wcy5vdmVyZmxvd1gsXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3dZOiBwcm9wcy5vdmVyZmxvd1ksXG4gICAgICAgICAgICAgICAgbGVmdDogKGlzQWJzb2x1dGUgJiYgLShwcm9wcy5vdmVyY29tZUxlZnQgfHwgMCkpIHx8ICcnLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiAoaXNBYnNvbHV0ZSAmJiAtKHByb3BzLm92ZXJjb21lUmlnaHQgfHwgMCkpIHx8ICcnLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogKGlzQWJzb2x1dGUgJiYgLShwcm9wcy5vdmVyY29tZUJvdHRvbSB8fCAwKSkgfHwgJycsXG4gICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogKCFpc0Fic29sdXRlICYmIC0ocHJvcHMub3ZlcmNvbWVMZWZ0IHx8IDApKSB8fCAnJyxcbiAgICAgICAgICAgICAgICBtYXJnaW5SaWdodDogKCFpc0Fic29sdXRlICYmIC0ocHJvcHMub3ZlcmNvbWVSaWdodCB8fCAwKSkgfHwgJycsXG4gICAgICAgICAgICAgICAgbWFyZ2luQm90dG9tOiAoIWlzQWJzb2x1dGUgJiYgLShwcm9wcy5vdmVyY29tZUJvdHRvbSB8fCAwKSkgfHwgJycsXG4gICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiBwcm9wcy5tYXhIZWlnaHQgfHwgJycsXG4gICAgICAgICAgICB9IH0sIHByb3BzLmNoaWxkcmVuKSk7XG4gICAgfTtcbiAgICBTY3JvbGxlci5wcm90b3R5cGUubmVlZHNYU2Nyb2xsaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoVklTSUJMRV9ISURERU5fUkUudGVzdCh0aGlzLnByb3BzLm92ZXJmbG93WCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0ZXN0aW5nIHNjcm9sbFdpZHRoPmNsaWVudFdpZHRoIGlzIHVucmVsaWFibGUgY3Jvc3MtYnJvd3NlciB3aGVuIHBpeGVsIGhlaWdodHMgYXJlbid0IGludGVnZXJzLlxuICAgICAgICAvLyBtdWNoIG1vcmUgcmVsaWFibGUgdG8gc2VlIGlmIGNoaWxkcmVuIGFyZSB0YWxsZXIgdGhhbiB0aGUgc2Nyb2xsZXIsIGV2ZW4gdGhvIGRvZXNuJ3QgYWNjb3VudCBmb3JcbiAgICAgICAgLy8gaW5uZXItY2hpbGQgbWFyZ2lucyBhbmQgYWJzb2x1dGUgcG9zaXRpb25pbmdcbiAgICAgICAgdmFyIGVsID0gdGhpcy5lbDtcbiAgICAgICAgdmFyIHJlYWxDbGllbnRXaWR0aCA9IHRoaXMuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLSB0aGlzLmdldFlTY3JvbGxiYXJXaWR0aCgpO1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBlbC5jaGlsZHJlbjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgdmFyIGNoaWxkRWwgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChjaGlsZEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoID4gcmVhbENsaWVudFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgU2Nyb2xsZXIucHJvdG90eXBlLm5lZWRzWVNjcm9sbGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKFZJU0lCTEVfSElEREVOX1JFLnRlc3QodGhpcy5wcm9wcy5vdmVyZmxvd1kpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGVzdGluZyBzY3JvbGxIZWlnaHQ+Y2xpZW50SGVpZ2h0IGlzIHVucmVsaWFibGUgY3Jvc3MtYnJvd3NlciB3aGVuIHBpeGVsIGhlaWdodHMgYXJlbid0IGludGVnZXJzLlxuICAgICAgICAvLyBtdWNoIG1vcmUgcmVsaWFibGUgdG8gc2VlIGlmIGNoaWxkcmVuIGFyZSB0YWxsZXIgdGhhbiB0aGUgc2Nyb2xsZXIsIGV2ZW4gdGhvIGRvZXNuJ3QgYWNjb3VudCBmb3JcbiAgICAgICAgLy8gaW5uZXItY2hpbGQgbWFyZ2lucyBhbmQgYWJzb2x1dGUgcG9zaXRpb25pbmdcbiAgICAgICAgdmFyIGVsID0gdGhpcy5lbDtcbiAgICAgICAgdmFyIHJlYWxDbGllbnRIZWlnaHQgPSB0aGlzLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCAtIHRoaXMuZ2V0WFNjcm9sbGJhcldpZHRoKCk7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IGVsLmNoaWxkcmVuO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGRFbCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKGNoaWxkRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ID4gcmVhbENsaWVudEhlaWdodCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIFNjcm9sbGVyLnByb3RvdHlwZS5nZXRYU2Nyb2xsYmFyV2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChWSVNJQkxFX0hJRERFTl9SRS50ZXN0KHRoaXMucHJvcHMub3ZlcmZsb3dYKSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZWwub2Zmc2V0SGVpZ2h0IC0gdGhpcy5lbC5jbGllbnRIZWlnaHQ7IC8vIG9ubHkgd29ya3MgYmVjYXVzZSB3ZSBndWFyYW50ZWUgbm8gYm9yZGVycy4gVE9ETzogYWRkIHRvIENTUyB3aXRoIGltcG9ydGFudD9cbiAgICB9O1xuICAgIFNjcm9sbGVyLnByb3RvdHlwZS5nZXRZU2Nyb2xsYmFyV2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChWSVNJQkxFX0hJRERFTl9SRS50ZXN0KHRoaXMucHJvcHMub3ZlcmZsb3dZKSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZWwub2Zmc2V0V2lkdGggLSB0aGlzLmVsLmNsaWVudFdpZHRoOyAvLyBvbmx5IHdvcmtzIGJlY2F1c2Ugd2UgZ3VhcmFudGVlIG5vIGJvcmRlcnMuIFRPRE86IGFkZCB0byBDU1Mgd2l0aCBpbXBvcnRhbnQ/XG4gICAgfTtcbiAgICByZXR1cm4gU2Nyb2xsZXI7XG59KEJhc2VDb21wb25lbnQpKTtcblxuLypcblRPRE86IHNvbWVob3cgaW5mZXIgT3RoZXJBcmdzIGZyb20gbWFzdGVyQ2FsbGJhY2s/XG5UT0RPOiBpbmZlciBSZWZUeXBlIGZyb20gbWFzdGVyQ2FsbGJhY2sgaWYgcHJvdmlkZWRcbiovXG52YXIgUmVmTWFwID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlZk1hcChtYXN0ZXJDYWxsYmFjaykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLm1hc3RlckNhbGxiYWNrID0gbWFzdGVyQ2FsbGJhY2s7XG4gICAgICAgIHRoaXMuY3VycmVudE1hcCA9IHt9O1xuICAgICAgICB0aGlzLmRlcHRocyA9IHt9O1xuICAgICAgICB0aGlzLmNhbGxiYWNrTWFwID0ge307XG4gICAgICAgIHRoaXMuaGFuZGxlVmFsdWUgPSBmdW5jdGlvbiAodmFsLCBrZXkpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IF90aGlzLCBkZXB0aHMgPSBfYS5kZXB0aHMsIGN1cnJlbnRNYXAgPSBfYS5jdXJyZW50TWFwO1xuICAgICAgICAgICAgdmFyIHJlbW92ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBhZGRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHZhbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIGZvciBidWcuLi4gQUNUVUFMTFk6IGNhbiBwcm9iYWJseSBkbyBhd2F5IHdpdGggdGhpcyBub3cgdGhhdCBjYWxsZXJzIGRvbid0IHNoYXJlIG51bWVyaWMgaW5kaWNlcyBhbnltb3JlXG4gICAgICAgICAgICAgICAgcmVtb3ZlZCA9IChrZXkgaW4gY3VycmVudE1hcCk7XG4gICAgICAgICAgICAgICAgY3VycmVudE1hcFtrZXldID0gdmFsO1xuICAgICAgICAgICAgICAgIGRlcHRoc1trZXldID0gKGRlcHRoc1trZXldIHx8IDApICsgMTtcbiAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZXB0aHNba2V5XSAtPSAxO1xuICAgICAgICAgICAgICAgIGlmICghZGVwdGhzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGN1cnJlbnRNYXBba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIF90aGlzLmNhbGxiYWNrTWFwW2tleV07XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfdGhpcy5tYXN0ZXJDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGlmIChyZW1vdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm1hc3RlckNhbGxiYWNrKG51bGwsIFN0cmluZyhrZXkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFkZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm1hc3RlckNhbGxiYWNrKHZhbCwgU3RyaW5nKGtleSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgUmVmTWFwLnByb3RvdHlwZS5jcmVhdGVSZWYgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciByZWZDYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tNYXBba2V5XTtcbiAgICAgICAgaWYgKCFyZWZDYWxsYmFjaykge1xuICAgICAgICAgICAgcmVmQ2FsbGJhY2sgPSB0aGlzLmNhbGxiYWNrTWFwW2tleV0gPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuaGFuZGxlVmFsdWUodmFsLCBTdHJpbmcoa2V5KSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWZDYWxsYmFjaztcbiAgICB9O1xuICAgIC8vIFRPRE86IGNoZWNrIGNhbGxlcnMgdGhhdCBkb24ndCBjYXJlIGFib3V0IG9yZGVyLiBzaG91bGQgdXNlIGdldEFsbCBpbnN0ZWFkXG4gICAgLy8gTk9URTogdGhpcyBtZXRob2QgaGFzIGJlY29tZSBsZXNzIHZhbHVhYmxlIG5vdyB0aGF0IHdlIGFyZSBlbmNvdXJhZ2VkIHRvIG1hcCBvcmRlciBieSBzb21lIG90aGVyIGluZGV4XG4gICAgLy8gVE9ETzogcHJvdmlkZSBPTkUgYXJyYXktZXhwb3J0IGZ1bmN0aW9uLCBidWlsZEFycmF5LCB3aGljaCBmYWlscyBvbiBub24tbnVtZXJpYyBpbmRleGVzLiBjYWxsZXIgY2FuIG1hbmlwdWxhdGUgYW5kIFwiY29sbGVjdFwiXG4gICAgUmVmTWFwLnByb3RvdHlwZS5jb2xsZWN0ID0gZnVuY3Rpb24gKHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBzdGVwKSB7XG4gICAgICAgIHJldHVybiBjb2xsZWN0RnJvbUhhc2godGhpcy5jdXJyZW50TWFwLCBzdGFydEluZGV4LCBlbmRJbmRleCwgc3RlcCk7XG4gICAgfTtcbiAgICBSZWZNYXAucHJvdG90eXBlLmdldEFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGhhc2hWYWx1ZXNUb0FycmF5KHRoaXMuY3VycmVudE1hcCk7XG4gICAgfTtcbiAgICByZXR1cm4gUmVmTWFwO1xufSgpKTtcblxuZnVuY3Rpb24gY29tcHV0ZVNocmlua1dpZHRoKGNodW5rRWxzKSB7XG4gICAgdmFyIHNocmlua0NlbGxzID0gZmluZEVsZW1lbnRzKGNodW5rRWxzLCAnLmZjLXNjcm9sbGdyaWQtc2hyaW5rJyk7XG4gICAgdmFyIGxhcmdlc3RXaWR0aCA9IDA7XG4gICAgZm9yICh2YXIgX2kgPSAwLCBzaHJpbmtDZWxsc18xID0gc2hyaW5rQ2VsbHM7IF9pIDwgc2hyaW5rQ2VsbHNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHNocmlua0NlbGwgPSBzaHJpbmtDZWxsc18xW19pXTtcbiAgICAgICAgbGFyZ2VzdFdpZHRoID0gTWF0aC5tYXgobGFyZ2VzdFdpZHRoLCBjb21wdXRlU21hbGxlc3RDZWxsV2lkdGgoc2hyaW5rQ2VsbCkpO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5jZWlsKGxhcmdlc3RXaWR0aCk7IC8vIDx0YWJsZT4gZWxlbWVudHMgd29yayBiZXN0IHdpdGggaW50ZWdlcnMuIHJvdW5kIHVwIHRvIGVuc3VyZSBjb250ZW50cyBmaXRzXG59XG5mdW5jdGlvbiBnZXRTZWN0aW9uSGFzTGlxdWlkSGVpZ2h0KHByb3BzLCBzZWN0aW9uQ29uZmlnKSB7XG4gICAgcmV0dXJuIHByb3BzLmxpcXVpZCAmJiBzZWN0aW9uQ29uZmlnLmxpcXVpZDsgLy8gZG9lcyB0aGUgc2VjdGlvbiBkbyBsaXF1aWQtaGVpZ2h0PyAobmVlZCB0byBoYXZlIHdob2xlIHNjcm9sbGdyaWQgbGlxdWlkLWhlaWdodCBhcyB3ZWxsKVxufVxuZnVuY3Rpb24gZ2V0QWxsb3dZU2Nyb2xsaW5nKHByb3BzLCBzZWN0aW9uQ29uZmlnKSB7XG4gICAgcmV0dXJuIHNlY3Rpb25Db25maWcubWF4SGVpZ2h0ICE9IG51bGwgfHwgLy8gaWYgaXRzIHBvc3NpYmxlIGZvciB0aGUgaGVpZ2h0IHRvIG1heCBvdXQsIHdlIG1pZ2h0IG5lZWQgc2Nyb2xsYmFyc1xuICAgICAgICBnZXRTZWN0aW9uSGFzTGlxdWlkSGVpZ2h0KHByb3BzLCBzZWN0aW9uQ29uZmlnKTsgLy8gaWYgdGhlIHNlY3Rpb24gaXMgbGlxdWlkIGhlaWdodCwgaXQgbWlnaHQgY29uZGVuc2UgZW5vdWdoIHRvIHJlcXVpcmUgc2Nyb2xsYmFyc1xufVxuLy8gVE9ETzogT05MWSB1c2UgYGFyZ2AuIGZvcmNlIG91dCBpbnRlcm5hbCBmdW5jdGlvbiB0byB1c2Ugc2FtZSBBUElcbmZ1bmN0aW9uIHJlbmRlckNodW5rQ29udGVudChzZWN0aW9uQ29uZmlnLCBjaHVua0NvbmZpZywgYXJnLCBpc0hlYWRlcikge1xuICAgIHZhciBleHBhbmRSb3dzID0gYXJnLmV4cGFuZFJvd3M7XG4gICAgdmFyIGNvbnRlbnQgPSB0eXBlb2YgY2h1bmtDb25maWcuY29udGVudCA9PT0gJ2Z1bmN0aW9uJyA/XG4gICAgICAgIGNodW5rQ29uZmlnLmNvbnRlbnQoYXJnKSA6XG4gICAgICAgIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJywge1xuICAgICAgICAgICAgcm9sZTogJ3ByZXNlbnRhdGlvbicsXG4gICAgICAgICAgICBjbGFzc05hbWU6IFtcbiAgICAgICAgICAgICAgICBjaHVua0NvbmZpZy50YWJsZUNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICBzZWN0aW9uQ29uZmlnLnN5bmNSb3dIZWlnaHRzID8gJ2ZjLXNjcm9sbGdyaWQtc3luYy10YWJsZScgOiAnJyxcbiAgICAgICAgICAgIF0uam9pbignICcpLFxuICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICBtaW5XaWR0aDogYXJnLnRhYmxlTWluV2lkdGgsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGFyZy5jbGllbnRXaWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGV4cGFuZFJvd3MgPyBhcmcuY2xpZW50SGVpZ2h0IDogJycsIC8vIGNzcyBgaGVpZ2h0YCBvbiBhIDx0YWJsZT4gc2VydmVzIGFzIGEgbWluLWhlaWdodFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSwgYXJnLnRhYmxlQ29sR3JvdXBOb2RlLCB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KGlzSGVhZGVyID8gJ3RoZWFkJyA6ICd0Ym9keScsIHtcbiAgICAgICAgICAgIHJvbGU6ICdwcmVzZW50YXRpb24nLFxuICAgICAgICB9LCB0eXBlb2YgY2h1bmtDb25maWcucm93Q29udGVudCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBjaHVua0NvbmZpZy5yb3dDb250ZW50KGFyZylcbiAgICAgICAgICAgIDogY2h1bmtDb25maWcucm93Q29udGVudCkpO1xuICAgIHJldHVybiBjb250ZW50O1xufVxuZnVuY3Rpb24gaXNDb2xQcm9wc0VxdWFsKGNvbHMwLCBjb2xzMSkge1xuICAgIHJldHVybiBpc0FycmF5c0VxdWFsKGNvbHMwLCBjb2xzMSwgaXNQcm9wc0VxdWFsKTtcbn1cbmZ1bmN0aW9uIHJlbmRlck1pY3JvQ29sR3JvdXAoY29scywgc2hyaW5rV2lkdGgpIHtcbiAgICB2YXIgY29sTm9kZXMgPSBbXTtcbiAgICAvKlxuICAgIGZvciBDb2xQcm9wcyB3aXRoIHNwYW5zLCBpdCB3b3VsZCBoYXZlIGJlZW4gZ3JlYXQgdG8gbWFrZSBhIHNpbmdsZSA8Y29sIHNwYW49XCJcIj5cbiAgICBIT1dFVkVSLCBDaHJvbWUgd2FzIGdldHRpbmcgbWVzc2luZyB1cCBkaXN0cmlidXRpbmcgdGhlIHdpZHRoIHRvIDx0ZD4vPHRoPiBlbGVtZW50cyB3aXRoIGNvbHNwYW5zLlxuICAgIFNPTFVUSU9OOiBtYWtpbmcgaW5kaXZpZHVhbCA8Y29sPiBlbGVtZW50cyBtYWtlcyBDaHJvbWUgYmVoYXZlLlxuICAgICovXG4gICAgZm9yICh2YXIgX2kgPSAwLCBjb2xzXzEgPSBjb2xzOyBfaSA8IGNvbHNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGNvbFByb3BzID0gY29sc18xW19pXTtcbiAgICAgICAgdmFyIHNwYW4gPSBjb2xQcm9wcy5zcGFuIHx8IDE7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbjsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb2xOb2Rlcy5wdXNoKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJjb2xcIiwgeyBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogY29sUHJvcHMud2lkdGggPT09ICdzaHJpbmsnID8gc2FuaXRpemVTaHJpbmtXaWR0aChzaHJpbmtXaWR0aCkgOiAoY29sUHJvcHMud2lkdGggfHwgJycpLFxuICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogY29sUHJvcHMubWluV2lkdGggfHwgJycsXG4gICAgICAgICAgICAgICAgfSB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQuYXBwbHkodm9pZCAwLCB0c2xpYi5fX3NwcmVhZEFycmF5KFsnY29sZ3JvdXAnLCB7fV0sIGNvbE5vZGVzKSk7XG59XG5mdW5jdGlvbiBzYW5pdGl6ZVNocmlua1dpZHRoKHNocmlua1dpZHRoKSB7XG4gICAgLyogd2h5IDQ/IGlmIHdlIGRvIDAsIGl0IHdpbGwga2lsbCBhbnkgYm9yZGVyLCB3aGljaCBhcmUgbmVlZGVkIGZvciBjb21wdXRlU21hbGxlc3RDZWxsV2lkdGhcbiAgICA0IGFjY291bnRzIGZvciAyIDItcGl4ZWwgYm9yZGVycy4gVE9ETzogYmV0dGVyIHNvbHV0aW9uPyAqL1xuICAgIHJldHVybiBzaHJpbmtXaWR0aCA9PSBudWxsID8gNCA6IHNocmlua1dpZHRoO1xufVxuZnVuY3Rpb24gaGFzU2hyaW5rV2lkdGgoY29scykge1xuICAgIGZvciAodmFyIF9pID0gMCwgY29sc18yID0gY29sczsgX2kgPCBjb2xzXzIubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBjb2wgPSBjb2xzXzJbX2ldO1xuICAgICAgICBpZiAoY29sLndpZHRoID09PSAnc2hyaW5rJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0U2Nyb2xsR3JpZENsYXNzTmFtZXMobGlxdWlkLCBjb250ZXh0KSB7XG4gICAgdmFyIGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICdmYy1zY3JvbGxncmlkJyxcbiAgICAgICAgY29udGV4dC50aGVtZS5nZXRDbGFzcygndGFibGUnKSxcbiAgICBdO1xuICAgIGlmIChsaXF1aWQpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1zY3JvbGxncmlkLWxpcXVpZCcpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NOYW1lcztcbn1cbmZ1bmN0aW9uIGdldFNlY3Rpb25DbGFzc05hbWVzKHNlY3Rpb25Db25maWcsIHdob2xlVGFibGVWR3Jvdykge1xuICAgIHZhciBjbGFzc05hbWVzID0gW1xuICAgICAgICAnZmMtc2Nyb2xsZ3JpZC1zZWN0aW9uJyxcbiAgICAgICAgXCJmYy1zY3JvbGxncmlkLXNlY3Rpb24tXCIgKyBzZWN0aW9uQ29uZmlnLnR5cGUsXG4gICAgICAgIHNlY3Rpb25Db25maWcuY2xhc3NOYW1lLCAvLyB1c2VkP1xuICAgIF07XG4gICAgaWYgKHdob2xlVGFibGVWR3JvdyAmJiBzZWN0aW9uQ29uZmlnLmxpcXVpZCAmJiBzZWN0aW9uQ29uZmlnLm1heEhlaWdodCA9PSBudWxsKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtc2Nyb2xsZ3JpZC1zZWN0aW9uLWxpcXVpZCcpO1xuICAgIH1cbiAgICBpZiAoc2VjdGlvbkNvbmZpZy5pc1N0aWNreSkge1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLXNjcm9sbGdyaWQtc2VjdGlvbi1zdGlja3knKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzTmFtZXM7XG59XG5mdW5jdGlvbiByZW5kZXJTY3JvbGxTaGltKGFyZykge1xuICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1zY3JvbGxncmlkLXN0aWNreS1zaGltXCIsIHN0eWxlOiB7XG4gICAgICAgICAgICB3aWR0aDogYXJnLmNsaWVudFdpZHRoLFxuICAgICAgICAgICAgbWluV2lkdGg6IGFyZy50YWJsZU1pbldpZHRoLFxuICAgICAgICB9IH0pKTtcbn1cbmZ1bmN0aW9uIGdldFN0aWNreUhlYWRlckRhdGVzKG9wdGlvbnMpIHtcbiAgICB2YXIgc3RpY2t5SGVhZGVyRGF0ZXMgPSBvcHRpb25zLnN0aWNreUhlYWRlckRhdGVzO1xuICAgIGlmIChzdGlja3lIZWFkZXJEYXRlcyA9PSBudWxsIHx8IHN0aWNreUhlYWRlckRhdGVzID09PSAnYXV0bycpIHtcbiAgICAgICAgc3RpY2t5SGVhZGVyRGF0ZXMgPSBvcHRpb25zLmhlaWdodCA9PT0gJ2F1dG8nIHx8IG9wdGlvbnMudmlld0hlaWdodCA9PT0gJ2F1dG8nO1xuICAgIH1cbiAgICByZXR1cm4gc3RpY2t5SGVhZGVyRGF0ZXM7XG59XG5mdW5jdGlvbiBnZXRTdGlja3lGb290ZXJTY3JvbGxiYXIob3B0aW9ucykge1xuICAgIHZhciBzdGlja3lGb290ZXJTY3JvbGxiYXIgPSBvcHRpb25zLnN0aWNreUZvb3RlclNjcm9sbGJhcjtcbiAgICBpZiAoc3RpY2t5Rm9vdGVyU2Nyb2xsYmFyID09IG51bGwgfHwgc3RpY2t5Rm9vdGVyU2Nyb2xsYmFyID09PSAnYXV0bycpIHtcbiAgICAgICAgc3RpY2t5Rm9vdGVyU2Nyb2xsYmFyID0gb3B0aW9ucy5oZWlnaHQgPT09ICdhdXRvJyB8fCBvcHRpb25zLnZpZXdIZWlnaHQgPT09ICdhdXRvJztcbiAgICB9XG4gICAgcmV0dXJuIHN0aWNreUZvb3RlclNjcm9sbGJhcjtcbn1cblxudmFyIFNpbXBsZVNjcm9sbEdyaWQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFNpbXBsZVNjcm9sbEdyaWQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU2ltcGxlU2Nyb2xsR3JpZCgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnByb2Nlc3NDb2xzID0gbWVtb2l6ZShmdW5jdGlvbiAoYSkgeyByZXR1cm4gYTsgfSwgaXNDb2xQcm9wc0VxdWFsKTsgLy8gc28gd2UgZ2V0IHNhbWUgYGNvbHNgIHByb3BzIGV2ZXJ5IHRpbWVcbiAgICAgICAgLy8geXVja3kgdG8gbWVtb2l6ZSBWTm9kZXMsIGJ1dCBtdWNoIG1vcmUgZWZmaWNpZW50IGZvciBjb25zdW1lcnNcbiAgICAgICAgX3RoaXMucmVuZGVyTWljcm9Db2xHcm91cCA9IG1lbW9pemUocmVuZGVyTWljcm9Db2xHcm91cCk7XG4gICAgICAgIF90aGlzLnNjcm9sbGVyUmVmcyA9IG5ldyBSZWZNYXAoKTtcbiAgICAgICAgX3RoaXMuc2Nyb2xsZXJFbFJlZnMgPSBuZXcgUmVmTWFwKF90aGlzLl9oYW5kbGVTY3JvbGxlckVsLmJpbmQoX3RoaXMpKTtcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBzaHJpbmtXaWR0aDogbnVsbCxcbiAgICAgICAgICAgIGZvcmNlWVNjcm9sbGJhcnM6IGZhbHNlLFxuICAgICAgICAgICAgc2Nyb2xsZXJDbGllbnRXaWR0aHM6IHt9LFxuICAgICAgICAgICAgc2Nyb2xsZXJDbGllbnRIZWlnaHRzOiB7fSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gVE9ETzogY2FuIGRvIGEgcmVhbGx5IHNpbXBsZSBwcmludC12aWV3LiBkb250IG5lZWQgdG8gam9pbiByb3dzXG4gICAgICAgIF90aGlzLmhhbmRsZVNpemluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLnNhZmVTZXRTdGF0ZSh0c2xpYi5fX2Fzc2lnbih7IHNocmlua1dpZHRoOiBfdGhpcy5jb21wdXRlU2hyaW5rV2lkdGgoKSB9LCBfdGhpcy5jb21wdXRlU2Nyb2xsZXJEaW1zKCkpKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBTaW1wbGVTY3JvbGxHcmlkLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIHN0YXRlID0gX2Euc3RhdGUsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgc2VjdGlvbkNvbmZpZ3MgPSBwcm9wcy5zZWN0aW9ucyB8fCBbXTtcbiAgICAgICAgdmFyIGNvbHMgPSB0aGlzLnByb2Nlc3NDb2xzKHByb3BzLmNvbHMpO1xuICAgICAgICB2YXIgbWljcm9Db2xHcm91cE5vZGUgPSB0aGlzLnJlbmRlck1pY3JvQ29sR3JvdXAoY29scywgc3RhdGUuc2hyaW5rV2lkdGgpO1xuICAgICAgICB2YXIgY2xhc3NOYW1lcyA9IGdldFNjcm9sbEdyaWRDbGFzc05hbWVzKHByb3BzLmxpcXVpZCwgY29udGV4dCk7XG4gICAgICAgIGlmIChwcm9wcy5jb2xsYXBzaWJsZVdpZHRoKSB7XG4gICAgICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLXNjcm9sbGdyaWQtY29sbGFwc2libGUnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBtYWtlIERSWVxuICAgICAgICB2YXIgY29uZmlnQ250ID0gc2VjdGlvbkNvbmZpZ3MubGVuZ3RoO1xuICAgICAgICB2YXIgY29uZmlnSSA9IDA7XG4gICAgICAgIHZhciBjdXJyZW50Q29uZmlnO1xuICAgICAgICB2YXIgaGVhZFNlY3Rpb25Ob2RlcyA9IFtdO1xuICAgICAgICB2YXIgYm9keVNlY3Rpb25Ob2RlcyA9IFtdO1xuICAgICAgICB2YXIgZm9vdFNlY3Rpb25Ob2RlcyA9IFtdO1xuICAgICAgICB3aGlsZSAoY29uZmlnSSA8IGNvbmZpZ0NudCAmJiAoY3VycmVudENvbmZpZyA9IHNlY3Rpb25Db25maWdzW2NvbmZpZ0ldKS50eXBlID09PSAnaGVhZGVyJykge1xuICAgICAgICAgICAgaGVhZFNlY3Rpb25Ob2Rlcy5wdXNoKHRoaXMucmVuZGVyU2VjdGlvbihjdXJyZW50Q29uZmlnLCBtaWNyb0NvbEdyb3VwTm9kZSwgdHJ1ZSkpO1xuICAgICAgICAgICAgY29uZmlnSSArPSAxO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChjb25maWdJIDwgY29uZmlnQ250ICYmIChjdXJyZW50Q29uZmlnID0gc2VjdGlvbkNvbmZpZ3NbY29uZmlnSV0pLnR5cGUgPT09ICdib2R5Jykge1xuICAgICAgICAgICAgYm9keVNlY3Rpb25Ob2Rlcy5wdXNoKHRoaXMucmVuZGVyU2VjdGlvbihjdXJyZW50Q29uZmlnLCBtaWNyb0NvbEdyb3VwTm9kZSwgZmFsc2UpKTtcbiAgICAgICAgICAgIGNvbmZpZ0kgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoY29uZmlnSSA8IGNvbmZpZ0NudCAmJiAoY3VycmVudENvbmZpZyA9IHNlY3Rpb25Db25maWdzW2NvbmZpZ0ldKS50eXBlID09PSAnZm9vdGVyJykge1xuICAgICAgICAgICAgZm9vdFNlY3Rpb25Ob2Rlcy5wdXNoKHRoaXMucmVuZGVyU2VjdGlvbihjdXJyZW50Q29uZmlnLCBtaWNyb0NvbEdyb3VwTm9kZSwgdHJ1ZSkpO1xuICAgICAgICAgICAgY29uZmlnSSArPSAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZpcmVmb3ggYnVnOiB3aGVuIHNldHRpbmcgaGVpZ2h0IG9uIHRhYmxlIGFuZCB0aGVyZSBpcyBhIHRoZWFkIG9yIHRmb290LFxuICAgICAgICAvLyB0aGUgbmVjZXNzYXJ5IGhlaWdodDoxMDAlIG9uIHRoZSBsaXF1aWQtaGVpZ2h0IGJvZHkgc2VjdGlvbiBmb3JjZXMgdGhlICp3aG9sZSogdGFibGUgdG8gYmUgdGFsbGVyLiAoYnVnICM1NTI0KVxuICAgICAgICAvLyB1c2UgZ2V0Q2FuVkdyb3dXaXRoaW5DZWxsIGFzIGEgd2F5IHRvIGRldGVjdCB0YWJsZS1zdHVwaWQgZmlyZWZveC5cbiAgICAgICAgLy8gaWYgc28sIHVzZSBhIHNpbXBsZXIgZG9tIHN0cnVjdHVyZSwgamFtIGV2ZXJ5dGhpbmcgaW50byBhIGxvbmUgdGJvZHkuXG4gICAgICAgIHZhciBpc0J1Z2d5ID0gIWdldENhblZHcm93V2l0aGluQ2VsbCgpO1xuICAgICAgICB2YXIgcm9sZUF0dHJzID0geyByb2xlOiAncm93Z3JvdXAnIH07XG4gICAgICAgIHJldHVybiB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KCd0YWJsZScsIHtcbiAgICAgICAgICAgIHJvbGU6ICdncmlkJyxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5qb2luKCcgJyksXG4gICAgICAgICAgICBzdHlsZTogeyBoZWlnaHQ6IHByb3BzLmhlaWdodCB9LFxuICAgICAgICB9LCBCb29sZWFuKCFpc0J1Z2d5ICYmIGhlYWRTZWN0aW9uTm9kZXMubGVuZ3RoKSAmJiB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50LmFwcGx5KHZvaWQgMCwgdHNsaWIuX19zcHJlYWRBcnJheShbJ3RoZWFkJywgcm9sZUF0dHJzXSwgaGVhZFNlY3Rpb25Ob2RlcykpLCBCb29sZWFuKCFpc0J1Z2d5ICYmIGJvZHlTZWN0aW9uTm9kZXMubGVuZ3RoKSAmJiB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50LmFwcGx5KHZvaWQgMCwgdHNsaWIuX19zcHJlYWRBcnJheShbJ3Rib2R5Jywgcm9sZUF0dHJzXSwgYm9keVNlY3Rpb25Ob2RlcykpLCBCb29sZWFuKCFpc0J1Z2d5ICYmIGZvb3RTZWN0aW9uTm9kZXMubGVuZ3RoKSAmJiB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50LmFwcGx5KHZvaWQgMCwgdHNsaWIuX19zcHJlYWRBcnJheShbJ3Rmb290Jywgcm9sZUF0dHJzXSwgZm9vdFNlY3Rpb25Ob2RlcykpLCBpc0J1Z2d5ICYmIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQuYXBwbHkodm9pZCAwLCB0c2xpYi5fX3NwcmVhZEFycmF5KHRzbGliLl9fc3ByZWFkQXJyYXkodHNsaWIuX19zcHJlYWRBcnJheShbJ3Rib2R5Jywgcm9sZUF0dHJzXSwgaGVhZFNlY3Rpb25Ob2RlcyksIGJvZHlTZWN0aW9uTm9kZXMpLCBmb290U2VjdGlvbk5vZGVzKSkpO1xuICAgIH07XG4gICAgU2ltcGxlU2Nyb2xsR3JpZC5wcm90b3R5cGUucmVuZGVyU2VjdGlvbiA9IGZ1bmN0aW9uIChzZWN0aW9uQ29uZmlnLCBtaWNyb0NvbEdyb3VwTm9kZSwgaXNIZWFkZXIpIHtcbiAgICAgICAgaWYgKCdvdXRlckNvbnRlbnQnIGluIHNlY3Rpb25Db25maWcpIHtcbiAgICAgICAgICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudCh2ZG9tX2Nqcy5GcmFnbWVudCwgeyBrZXk6IHNlY3Rpb25Db25maWcua2V5IH0sIHNlY3Rpb25Db25maWcub3V0ZXJDb250ZW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwidHJcIiwgeyBrZXk6IHNlY3Rpb25Db25maWcua2V5LCByb2xlOiBcInByZXNlbnRhdGlvblwiLCBjbGFzc05hbWU6IGdldFNlY3Rpb25DbGFzc05hbWVzKHNlY3Rpb25Db25maWcsIHRoaXMucHJvcHMubGlxdWlkKS5qb2luKCcgJykgfSwgdGhpcy5yZW5kZXJDaHVua1RkKHNlY3Rpb25Db25maWcsIG1pY3JvQ29sR3JvdXBOb2RlLCBzZWN0aW9uQ29uZmlnLmNodW5rLCBpc0hlYWRlcikpKTtcbiAgICB9O1xuICAgIFNpbXBsZVNjcm9sbEdyaWQucHJvdG90eXBlLnJlbmRlckNodW5rVGQgPSBmdW5jdGlvbiAoc2VjdGlvbkNvbmZpZywgbWljcm9Db2xHcm91cE5vZGUsIGNodW5rQ29uZmlnLCBpc0hlYWRlcikge1xuICAgICAgICBpZiAoJ291dGVyQ29udGVudCcgaW4gY2h1bmtDb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybiBjaHVua0NvbmZpZy5vdXRlckNvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgdmFyIF9hID0gdGhpcy5zdGF0ZSwgZm9yY2VZU2Nyb2xsYmFycyA9IF9hLmZvcmNlWVNjcm9sbGJhcnMsIHNjcm9sbGVyQ2xpZW50V2lkdGhzID0gX2Euc2Nyb2xsZXJDbGllbnRXaWR0aHMsIHNjcm9sbGVyQ2xpZW50SGVpZ2h0cyA9IF9hLnNjcm9sbGVyQ2xpZW50SGVpZ2h0cztcbiAgICAgICAgdmFyIG5lZWRzWVNjcm9sbGluZyA9IGdldEFsbG93WVNjcm9sbGluZyhwcm9wcywgc2VjdGlvbkNvbmZpZyk7IC8vIFRPRE86IGRvIGxhemlseS4gZG8gaW4gc2VjdGlvbiBjb25maWc/XG4gICAgICAgIHZhciBpc0xpcXVpZCA9IGdldFNlY3Rpb25IYXNMaXF1aWRIZWlnaHQocHJvcHMsIHNlY3Rpb25Db25maWcpO1xuICAgICAgICAvLyBmb3IgYCFwcm9wcy5saXF1aWRgIC0gaXMgV0hPTEUgc2Nyb2xsZ3JpZCBuYXR1cmFsIGhlaWdodD9cbiAgICAgICAgLy8gVE9ETzogZG8gc2FtZSB0aGluZyBpbiBhZHZhbmNlZCBzY3JvbGxncmlkPyBwcm9sbHkgbm90IGIvYyBhbHdheXMgaGFzIGhvcml6b250YWwgc2Nyb2xsYmFyc1xuICAgICAgICB2YXIgb3ZlcmZsb3dZID0gIXByb3BzLmxpcXVpZCA/ICd2aXNpYmxlJyA6XG4gICAgICAgICAgICBmb3JjZVlTY3JvbGxiYXJzID8gJ3Njcm9sbCcgOlxuICAgICAgICAgICAgICAgICFuZWVkc1lTY3JvbGxpbmcgPyAnaGlkZGVuJyA6XG4gICAgICAgICAgICAgICAgICAgICdhdXRvJztcbiAgICAgICAgdmFyIHNlY3Rpb25LZXkgPSBzZWN0aW9uQ29uZmlnLmtleTtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSByZW5kZXJDaHVua0NvbnRlbnQoc2VjdGlvbkNvbmZpZywgY2h1bmtDb25maWcsIHtcbiAgICAgICAgICAgIHRhYmxlQ29sR3JvdXBOb2RlOiBtaWNyb0NvbEdyb3VwTm9kZSxcbiAgICAgICAgICAgIHRhYmxlTWluV2lkdGg6ICcnLFxuICAgICAgICAgICAgY2xpZW50V2lkdGg6ICghcHJvcHMuY29sbGFwc2libGVXaWR0aCAmJiBzY3JvbGxlckNsaWVudFdpZHRoc1tzZWN0aW9uS2V5XSAhPT0gdW5kZWZpbmVkKSA/IHNjcm9sbGVyQ2xpZW50V2lkdGhzW3NlY3Rpb25LZXldIDogbnVsbCxcbiAgICAgICAgICAgIGNsaWVudEhlaWdodDogc2Nyb2xsZXJDbGllbnRIZWlnaHRzW3NlY3Rpb25LZXldICE9PSB1bmRlZmluZWQgPyBzY3JvbGxlckNsaWVudEhlaWdodHNbc2VjdGlvbktleV0gOiBudWxsLFxuICAgICAgICAgICAgZXhwYW5kUm93czogc2VjdGlvbkNvbmZpZy5leHBhbmRSb3dzLFxuICAgICAgICAgICAgc3luY1Jvd0hlaWdodHM6IGZhbHNlLFxuICAgICAgICAgICAgcm93U3luY0hlaWdodHM6IFtdLFxuICAgICAgICAgICAgcmVwb3J0Um93SGVpZ2h0Q2hhbmdlOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIH0sIGlzSGVhZGVyKTtcbiAgICAgICAgcmV0dXJuIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoaXNIZWFkZXIgPyAndGgnIDogJ3RkJywge1xuICAgICAgICAgICAgcmVmOiBjaHVua0NvbmZpZy5lbFJlZixcbiAgICAgICAgICAgIHJvbGU6ICdwcmVzZW50YXRpb24nLFxuICAgICAgICB9LCB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLXNjcm9sbGVyLWhhcm5lc3NcIiArIChpc0xpcXVpZCA/ICcgZmMtc2Nyb2xsZXItaGFybmVzcy1saXF1aWQnIDogJycpIH0sXG4gICAgICAgICAgICB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFNjcm9sbGVyLCB7IHJlZjogdGhpcy5zY3JvbGxlclJlZnMuY3JlYXRlUmVmKHNlY3Rpb25LZXkpLCBlbFJlZjogdGhpcy5zY3JvbGxlckVsUmVmcy5jcmVhdGVSZWYoc2VjdGlvbktleSksIG92ZXJmbG93WTogb3ZlcmZsb3dZLCBvdmVyZmxvd1g6ICFwcm9wcy5saXF1aWQgPyAndmlzaWJsZScgOiAnaGlkZGVuJyAvKiBuYXR1cmFsIGhlaWdodD8gKi8sIG1heEhlaWdodDogc2VjdGlvbkNvbmZpZy5tYXhIZWlnaHQsIGxpcXVpZDogaXNMaXF1aWQsIGxpcXVpZElzQWJzb2x1dGUgLy8gYmVjYXVzZSBpdHMgd2l0aGluIGEgaGFybmVzc1xuICAgICAgICAgICAgICAgIDogdHJ1ZSB9LCBjb250ZW50KSkpO1xuICAgIH07XG4gICAgU2ltcGxlU2Nyb2xsR3JpZC5wcm90b3R5cGUuX2hhbmRsZVNjcm9sbGVyRWwgPSBmdW5jdGlvbiAoc2Nyb2xsZXJFbCwga2V5KSB7XG4gICAgICAgIHZhciBzZWN0aW9uID0gZ2V0U2VjdGlvbkJ5S2V5KHRoaXMucHJvcHMuc2VjdGlvbnMsIGtleSk7XG4gICAgICAgIGlmIChzZWN0aW9uKSB7XG4gICAgICAgICAgICBzZXRSZWYoc2VjdGlvbi5jaHVuay5zY3JvbGxlckVsUmVmLCBzY3JvbGxlckVsKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU2ltcGxlU2Nyb2xsR3JpZC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlU2l6aW5nKCk7XG4gICAgICAgIHRoaXMuY29udGV4dC5hZGRSZXNpemVIYW5kbGVyKHRoaXMuaGFuZGxlU2l6aW5nKTtcbiAgICB9O1xuICAgIFNpbXBsZVNjcm9sbEdyaWQucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gVE9ETzogbmVlZCBiZXR0ZXIgc29sdXRpb24gd2hlbiBzdGF0ZSBjb250YWlucyBub24tc2l6aW5nIHRoaW5nc1xuICAgICAgICB0aGlzLmhhbmRsZVNpemluZygpO1xuICAgIH07XG4gICAgU2ltcGxlU2Nyb2xsR3JpZC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC5yZW1vdmVSZXNpemVIYW5kbGVyKHRoaXMuaGFuZGxlU2l6aW5nKTtcbiAgICB9O1xuICAgIFNpbXBsZVNjcm9sbEdyaWQucHJvdG90eXBlLmNvbXB1dGVTaHJpbmtXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGhhc1Nocmlua1dpZHRoKHRoaXMucHJvcHMuY29scylcbiAgICAgICAgICAgID8gY29tcHV0ZVNocmlua1dpZHRoKHRoaXMuc2Nyb2xsZXJFbFJlZnMuZ2V0QWxsKCkpXG4gICAgICAgICAgICA6IDA7XG4gICAgfTtcbiAgICBTaW1wbGVTY3JvbGxHcmlkLnByb3RvdHlwZS5jb21wdXRlU2Nyb2xsZXJEaW1zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2Nyb2xsYmFyV2lkdGggPSBnZXRTY3JvbGxiYXJXaWR0aHMoKTtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgc2Nyb2xsZXJSZWZzID0gX2Euc2Nyb2xsZXJSZWZzLCBzY3JvbGxlckVsUmVmcyA9IF9hLnNjcm9sbGVyRWxSZWZzO1xuICAgICAgICB2YXIgZm9yY2VZU2Nyb2xsYmFycyA9IGZhbHNlO1xuICAgICAgICB2YXIgc2Nyb2xsZXJDbGllbnRXaWR0aHMgPSB7fTtcbiAgICAgICAgdmFyIHNjcm9sbGVyQ2xpZW50SGVpZ2h0cyA9IHt9O1xuICAgICAgICBmb3IgKHZhciBzZWN0aW9uS2V5IGluIHNjcm9sbGVyUmVmcy5jdXJyZW50TWFwKSB7XG4gICAgICAgICAgICB2YXIgc2Nyb2xsZXIgPSBzY3JvbGxlclJlZnMuY3VycmVudE1hcFtzZWN0aW9uS2V5XTtcbiAgICAgICAgICAgIGlmIChzY3JvbGxlciAmJiBzY3JvbGxlci5uZWVkc1lTY3JvbGxpbmcoKSkge1xuICAgICAgICAgICAgICAgIGZvcmNlWVNjcm9sbGJhcnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgX2IgPSB0aGlzLnByb3BzLnNlY3Rpb25zOyBfaSA8IF9iLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIHNlY3Rpb24gPSBfYltfaV07XG4gICAgICAgICAgICB2YXIgc2VjdGlvbktleSA9IHNlY3Rpb24ua2V5O1xuICAgICAgICAgICAgdmFyIHNjcm9sbGVyRWwgPSBzY3JvbGxlckVsUmVmcy5jdXJyZW50TWFwW3NlY3Rpb25LZXldO1xuICAgICAgICAgICAgaWYgKHNjcm9sbGVyRWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgaGFybmVzc0VsID0gc2Nyb2xsZXJFbC5wYXJlbnROb2RlOyAvLyBUT0RPOiB3ZWlyZCB3YXkgdG8gZ2V0IHRoaXMuIG5lZWQgaGFybmVzcyBiL2MgZG9lc24ndCBpbmNsdWRlIHRhYmxlIGJvcmRlcnNcbiAgICAgICAgICAgICAgICBzY3JvbGxlckNsaWVudFdpZHRoc1tzZWN0aW9uS2V5XSA9IE1hdGguZmxvb3IoaGFybmVzc0VsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC0gKGZvcmNlWVNjcm9sbGJhcnNcbiAgICAgICAgICAgICAgICAgICAgPyBzY3JvbGxiYXJXaWR0aC55IC8vIHVzZSBnbG9iYWwgYmVjYXVzZSBzY3JvbGxlciBtaWdodCBub3QgaGF2ZSBzY3JvbGxiYXJzIHlldCBidXQgd2lsbCBuZWVkIHRoZW0gaW4gZnV0dXJlXG4gICAgICAgICAgICAgICAgICAgIDogMCkpO1xuICAgICAgICAgICAgICAgIHNjcm9sbGVyQ2xpZW50SGVpZ2h0c1tzZWN0aW9uS2V5XSA9IE1hdGguZmxvb3IoaGFybmVzc0VsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZm9yY2VZU2Nyb2xsYmFyczogZm9yY2VZU2Nyb2xsYmFycywgc2Nyb2xsZXJDbGllbnRXaWR0aHM6IHNjcm9sbGVyQ2xpZW50V2lkdGhzLCBzY3JvbGxlckNsaWVudEhlaWdodHM6IHNjcm9sbGVyQ2xpZW50SGVpZ2h0cyB9O1xuICAgIH07XG4gICAgcmV0dXJuIFNpbXBsZVNjcm9sbEdyaWQ7XG59KEJhc2VDb21wb25lbnQpKTtcblNpbXBsZVNjcm9sbEdyaWQuYWRkU3RhdGVFcXVhbGl0eSh7XG4gICAgc2Nyb2xsZXJDbGllbnRXaWR0aHM6IGlzUHJvcHNFcXVhbCxcbiAgICBzY3JvbGxlckNsaWVudEhlaWdodHM6IGlzUHJvcHNFcXVhbCxcbn0pO1xuZnVuY3Rpb24gZ2V0U2VjdGlvbkJ5S2V5KHNlY3Rpb25zLCBrZXkpIHtcbiAgICBmb3IgKHZhciBfaSA9IDAsIHNlY3Rpb25zXzEgPSBzZWN0aW9uczsgX2kgPCBzZWN0aW9uc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgc2VjdGlvbiA9IHNlY3Rpb25zXzFbX2ldO1xuICAgICAgICBpZiAoc2VjdGlvbi5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlY3Rpb247XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBFdmVudFJvb3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKEV2ZW50Um9vdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBFdmVudFJvb3QoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5lbFJlZiA9IHZkb21fY2pzLmNyZWF0ZVJlZigpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEV2ZW50Um9vdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBwcm9wcyA9IF9hLnByb3BzLCBjb250ZXh0ID0gX2EuY29udGV4dDtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnM7XG4gICAgICAgIHZhciBzZWcgPSBwcm9wcy5zZWc7XG4gICAgICAgIHZhciBldmVudFJhbmdlID0gc2VnLmV2ZW50UmFuZ2U7XG4gICAgICAgIHZhciB1aSA9IGV2ZW50UmFuZ2UudWk7XG4gICAgICAgIHZhciBob29rUHJvcHMgPSB7XG4gICAgICAgICAgICBldmVudDogbmV3IEV2ZW50QXBpKGNvbnRleHQsIGV2ZW50UmFuZ2UuZGVmLCBldmVudFJhbmdlLmluc3RhbmNlKSxcbiAgICAgICAgICAgIHZpZXc6IGNvbnRleHQudmlld0FwaSxcbiAgICAgICAgICAgIHRpbWVUZXh0OiBwcm9wcy50aW1lVGV4dCxcbiAgICAgICAgICAgIHRleHRDb2xvcjogdWkudGV4dENvbG9yLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB1aS5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogdWkuYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICBpc0RyYWdnYWJsZTogIXByb3BzLmRpc2FibGVEcmFnZ2luZyAmJiBjb21wdXRlU2VnRHJhZ2dhYmxlKHNlZywgY29udGV4dCksXG4gICAgICAgICAgICBpc1N0YXJ0UmVzaXphYmxlOiAhcHJvcHMuZGlzYWJsZVJlc2l6aW5nICYmIGNvbXB1dGVTZWdTdGFydFJlc2l6YWJsZShzZWcsIGNvbnRleHQpLFxuICAgICAgICAgICAgaXNFbmRSZXNpemFibGU6ICFwcm9wcy5kaXNhYmxlUmVzaXppbmcgJiYgY29tcHV0ZVNlZ0VuZFJlc2l6YWJsZShzZWcpLFxuICAgICAgICAgICAgaXNNaXJyb3I6IEJvb2xlYW4ocHJvcHMuaXNEcmFnZ2luZyB8fCBwcm9wcy5pc1Jlc2l6aW5nIHx8IHByb3BzLmlzRGF0ZVNlbGVjdGluZyksXG4gICAgICAgICAgICBpc1N0YXJ0OiBCb29sZWFuKHNlZy5pc1N0YXJ0KSxcbiAgICAgICAgICAgIGlzRW5kOiBCb29sZWFuKHNlZy5pc0VuZCksXG4gICAgICAgICAgICBpc1Bhc3Q6IEJvb2xlYW4ocHJvcHMuaXNQYXN0KSxcbiAgICAgICAgICAgIGlzRnV0dXJlOiBCb29sZWFuKHByb3BzLmlzRnV0dXJlKSxcbiAgICAgICAgICAgIGlzVG9kYXk6IEJvb2xlYW4ocHJvcHMuaXNUb2RheSksXG4gICAgICAgICAgICBpc1NlbGVjdGVkOiBCb29sZWFuKHByb3BzLmlzU2VsZWN0ZWQpLFxuICAgICAgICAgICAgaXNEcmFnZ2luZzogQm9vbGVhbihwcm9wcy5pc0RyYWdnaW5nKSxcbiAgICAgICAgICAgIGlzUmVzaXppbmc6IEJvb2xlYW4ocHJvcHMuaXNSZXNpemluZyksXG4gICAgICAgIH07XG4gICAgICAgIHZhciBzdGFuZGFyZENsYXNzTmFtZXMgPSBnZXRFdmVudENsYXNzTmFtZXMoaG9va1Byb3BzKS5jb25jYXQodWkuY2xhc3NOYW1lcyk7XG4gICAgICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChSZW5kZXJIb29rLCB7IGhvb2tQcm9wczogaG9va1Byb3BzLCBjbGFzc05hbWVzOiBvcHRpb25zLmV2ZW50Q2xhc3NOYW1lcywgY29udGVudDogb3B0aW9ucy5ldmVudENvbnRlbnQsIGRlZmF1bHRDb250ZW50OiBwcm9wcy5kZWZhdWx0Q29udGVudCwgZGlkTW91bnQ6IG9wdGlvbnMuZXZlbnREaWRNb3VudCwgd2lsbFVubW91bnQ6IG9wdGlvbnMuZXZlbnRXaWxsVW5tb3VudCwgZWxSZWY6IHRoaXMuZWxSZWYgfSwgZnVuY3Rpb24gKHJvb3RFbFJlZiwgY3VzdG9tQ2xhc3NOYW1lcywgaW5uZXJFbFJlZiwgaW5uZXJDb250ZW50KSB7IHJldHVybiBwcm9wcy5jaGlsZHJlbihyb290RWxSZWYsIHN0YW5kYXJkQ2xhc3NOYW1lcy5jb25jYXQoY3VzdG9tQ2xhc3NOYW1lcyksIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCwgaG9va1Byb3BzKTsgfSkpO1xuICAgIH07XG4gICAgRXZlbnRSb290LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0RWxTZWcodGhpcy5lbFJlZi5jdXJyZW50LCB0aGlzLnByb3BzLnNlZyk7XG4gICAgfTtcbiAgICAvKlxuICAgIG5lZWQgdG8gcmUtYXNzaWduIHNlZyB0byB0aGUgZWxlbWVudCBpZiBzZWcgY2hhbmdlcywgZXZlbiBpZiB0aGUgZWxlbWVudCBpcyB0aGUgc2FtZVxuICAgICovXG4gICAgRXZlbnRSb290LnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiAocHJldlByb3BzKSB7XG4gICAgICAgIHZhciBzZWcgPSB0aGlzLnByb3BzLnNlZztcbiAgICAgICAgaWYgKHNlZyAhPT0gcHJldlByb3BzLnNlZykge1xuICAgICAgICAgICAgc2V0RWxTZWcodGhpcy5lbFJlZi5jdXJyZW50LCBzZWcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gRXZlbnRSb290O1xufShCYXNlQ29tcG9uZW50KSk7XG5cbi8vIHNob3VsZCBub3QgYmUgYSBwdXJlY29tcG9uZW50XG52YXIgU3RhbmRhcmRFdmVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoU3RhbmRhcmRFdmVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTdGFuZGFyZEV2ZW50KCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFN0YW5kYXJkRXZlbnQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgcHJvcHMgPSBfYS5wcm9wcywgY29udGV4dCA9IF9hLmNvbnRleHQ7XG4gICAgICAgIHZhciBzZWcgPSBwcm9wcy5zZWc7XG4gICAgICAgIHZhciB0aW1lRm9ybWF0ID0gY29udGV4dC5vcHRpb25zLmV2ZW50VGltZUZvcm1hdCB8fCBwcm9wcy5kZWZhdWx0VGltZUZvcm1hdDtcbiAgICAgICAgdmFyIHRpbWVUZXh0ID0gYnVpbGRTZWdUaW1lVGV4dChzZWcsIHRpbWVGb3JtYXQsIGNvbnRleHQsIHByb3BzLmRlZmF1bHREaXNwbGF5RXZlbnRUaW1lLCBwcm9wcy5kZWZhdWx0RGlzcGxheUV2ZW50RW5kKTtcbiAgICAgICAgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KEV2ZW50Um9vdCwgeyBzZWc6IHNlZywgdGltZVRleHQ6IHRpbWVUZXh0LCBkaXNhYmxlRHJhZ2dpbmc6IHByb3BzLmRpc2FibGVEcmFnZ2luZywgZGlzYWJsZVJlc2l6aW5nOiBwcm9wcy5kaXNhYmxlUmVzaXppbmcsIGRlZmF1bHRDb250ZW50OiBwcm9wcy5kZWZhdWx0Q29udGVudCB8fCByZW5kZXJJbm5lckNvbnRlbnQkMSwgaXNEcmFnZ2luZzogcHJvcHMuaXNEcmFnZ2luZywgaXNSZXNpemluZzogcHJvcHMuaXNSZXNpemluZywgaXNEYXRlU2VsZWN0aW5nOiBwcm9wcy5pc0RhdGVTZWxlY3RpbmcsIGlzU2VsZWN0ZWQ6IHByb3BzLmlzU2VsZWN0ZWQsIGlzUGFzdDogcHJvcHMuaXNQYXN0LCBpc0Z1dHVyZTogcHJvcHMuaXNGdXR1cmUsIGlzVG9kYXk6IHByb3BzLmlzVG9kYXkgfSwgZnVuY3Rpb24gKHJvb3RFbFJlZiwgY2xhc3NOYW1lcywgaW5uZXJFbFJlZiwgaW5uZXJDb250ZW50LCBob29rUHJvcHMpIHsgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwiYVwiLCB0c2xpYi5fX2Fzc2lnbih7IGNsYXNzTmFtZTogcHJvcHMuZXh0cmFDbGFzc05hbWVzLmNvbmNhdChjbGFzc05hbWVzKS5qb2luKCcgJyksIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGhvb2tQcm9wcy5ib3JkZXJDb2xvcixcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGhvb2tQcm9wcy5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICB9LCByZWY6IHJvb3RFbFJlZiB9LCBnZXRTZWdBbmNob3JBdHRycyhzZWcsIGNvbnRleHQpKSxcbiAgICAgICAgICAgIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZXZlbnQtbWFpblwiLCByZWY6IGlubmVyRWxSZWYsIHN0eWxlOiB7IGNvbG9yOiBob29rUHJvcHMudGV4dENvbG9yIH0gfSwgaW5uZXJDb250ZW50KSxcbiAgICAgICAgICAgIGhvb2tQcm9wcy5pc1N0YXJ0UmVzaXphYmxlICYmXG4gICAgICAgICAgICAgICAgdmRvbV9janMuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1ldmVudC1yZXNpemVyIGZjLWV2ZW50LXJlc2l6ZXItc3RhcnRcIiB9KSxcbiAgICAgICAgICAgIGhvb2tQcm9wcy5pc0VuZFJlc2l6YWJsZSAmJlxuICAgICAgICAgICAgICAgIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZXZlbnQtcmVzaXplciBmYy1ldmVudC1yZXNpemVyLWVuZFwiIH0pKSk7IH0pKTtcbiAgICB9O1xuICAgIHJldHVybiBTdGFuZGFyZEV2ZW50O1xufShCYXNlQ29tcG9uZW50KSk7XG5mdW5jdGlvbiByZW5kZXJJbm5lckNvbnRlbnQkMShpbm5lclByb3BzKSB7XG4gICAgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWV2ZW50LW1haW4tZnJhbWVcIiB9LFxuICAgICAgICBpbm5lclByb3BzLnRpbWVUZXh0ICYmICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWV2ZW50LXRpbWVcIiB9LCBpbm5lclByb3BzLnRpbWVUZXh0KSksXG4gICAgICAgIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZXZlbnQtdGl0bGUtY29udGFpbmVyXCIgfSxcbiAgICAgICAgICAgIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZXZlbnQtdGl0bGUgZmMtc3RpY2t5XCIgfSwgaW5uZXJQcm9wcy5ldmVudC50aXRsZSB8fCB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KHZkb21fY2pzLkZyYWdtZW50LCBudWxsLCBcIlxcdTAwQTBcIikpKSkpO1xufVxuXG52YXIgTm93SW5kaWNhdG9yUm9vdCA9IGZ1bmN0aW9uIChwcm9wcykgeyByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoVmlld0NvbnRleHRUeXBlLkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIHZhciBvcHRpb25zID0gY29udGV4dC5vcHRpb25zO1xuICAgIHZhciBob29rUHJvcHMgPSB7XG4gICAgICAgIGlzQXhpczogcHJvcHMuaXNBeGlzLFxuICAgICAgICBkYXRlOiBjb250ZXh0LmRhdGVFbnYudG9EYXRlKHByb3BzLmRhdGUpLFxuICAgICAgICB2aWV3OiBjb250ZXh0LnZpZXdBcGksXG4gICAgfTtcbiAgICByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoUmVuZGVySG9vaywgeyBob29rUHJvcHM6IGhvb2tQcm9wcywgY2xhc3NOYW1lczogb3B0aW9ucy5ub3dJbmRpY2F0b3JDbGFzc05hbWVzLCBjb250ZW50OiBvcHRpb25zLm5vd0luZGljYXRvckNvbnRlbnQsIGRpZE1vdW50OiBvcHRpb25zLm5vd0luZGljYXRvckRpZE1vdW50LCB3aWxsVW5tb3VudDogb3B0aW9ucy5ub3dJbmRpY2F0b3JXaWxsVW5tb3VudCB9LCBwcm9wcy5jaGlsZHJlbikpO1xufSkpOyB9O1xuXG52YXIgREFZX05VTV9GT1JNQVQgPSBjcmVhdGVGb3JtYXR0ZXIoeyBkYXk6ICdudW1lcmljJyB9KTtcbnZhciBEYXlDZWxsQ29udGVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoRGF5Q2VsbENvbnRlbnQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRGF5Q2VsbENvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgRGF5Q2VsbENvbnRlbnQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgcHJvcHMgPSBfYS5wcm9wcywgY29udGV4dCA9IF9hLmNvbnRleHQ7XG4gICAgICAgIHZhciBvcHRpb25zID0gY29udGV4dC5vcHRpb25zO1xuICAgICAgICB2YXIgaG9va1Byb3BzID0gcmVmaW5lRGF5Q2VsbEhvb2tQcm9wcyh7XG4gICAgICAgICAgICBkYXRlOiBwcm9wcy5kYXRlLFxuICAgICAgICAgICAgZGF0ZVByb2ZpbGU6IHByb3BzLmRhdGVQcm9maWxlLFxuICAgICAgICAgICAgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSxcbiAgICAgICAgICAgIHNob3dEYXlOdW1iZXI6IHByb3BzLnNob3dEYXlOdW1iZXIsXG4gICAgICAgICAgICBleHRyYVByb3BzOiBwcm9wcy5leHRyYUhvb2tQcm9wcyxcbiAgICAgICAgICAgIHZpZXdBcGk6IGNvbnRleHQudmlld0FwaSxcbiAgICAgICAgICAgIGRhdGVFbnY6IGNvbnRleHQuZGF0ZUVudixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChDb250ZW50SG9vaywgeyBob29rUHJvcHM6IGhvb2tQcm9wcywgY29udGVudDogb3B0aW9ucy5kYXlDZWxsQ29udGVudCwgZGVmYXVsdENvbnRlbnQ6IHByb3BzLmRlZmF1bHRDb250ZW50IH0sIHByb3BzLmNoaWxkcmVuKSk7XG4gICAgfTtcbiAgICByZXR1cm4gRGF5Q2VsbENvbnRlbnQ7XG59KEJhc2VDb21wb25lbnQpKTtcbmZ1bmN0aW9uIHJlZmluZURheUNlbGxIb29rUHJvcHMocmF3KSB7XG4gICAgdmFyIGRhdGUgPSByYXcuZGF0ZSwgZGF0ZUVudiA9IHJhdy5kYXRlRW52O1xuICAgIHZhciBkYXlNZXRhID0gZ2V0RGF0ZU1ldGEoZGF0ZSwgcmF3LnRvZGF5UmFuZ2UsIG51bGwsIHJhdy5kYXRlUHJvZmlsZSk7XG4gICAgcmV0dXJuIHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHsgZGF0ZTogZGF0ZUVudi50b0RhdGUoZGF0ZSksIHZpZXc6IHJhdy52aWV3QXBpIH0sIGRheU1ldGEpLCB7IGRheU51bWJlclRleHQ6IHJhdy5zaG93RGF5TnVtYmVyID8gZGF0ZUVudi5mb3JtYXQoZGF0ZSwgREFZX05VTV9GT1JNQVQpIDogJycgfSksIHJhdy5leHRyYVByb3BzKTtcbn1cblxudmFyIERheUNlbGxSb290ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhEYXlDZWxsUm9vdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEYXlDZWxsUm9vdCgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnJlZmluZUhvb2tQcm9wcyA9IG1lbW9pemVPYmpBcmcocmVmaW5lRGF5Q2VsbEhvb2tQcm9wcyk7XG4gICAgICAgIF90aGlzLm5vcm1hbGl6ZUNsYXNzTmFtZXMgPSBidWlsZENsYXNzTmFtZU5vcm1hbGl6ZXIoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBEYXlDZWxsUm9vdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBwcm9wcyA9IF9hLnByb3BzLCBjb250ZXh0ID0gX2EuY29udGV4dDtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnM7XG4gICAgICAgIHZhciBob29rUHJvcHMgPSB0aGlzLnJlZmluZUhvb2tQcm9wcyh7XG4gICAgICAgICAgICBkYXRlOiBwcm9wcy5kYXRlLFxuICAgICAgICAgICAgZGF0ZVByb2ZpbGU6IHByb3BzLmRhdGVQcm9maWxlLFxuICAgICAgICAgICAgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSxcbiAgICAgICAgICAgIHNob3dEYXlOdW1iZXI6IHByb3BzLnNob3dEYXlOdW1iZXIsXG4gICAgICAgICAgICBleHRyYVByb3BzOiBwcm9wcy5leHRyYUhvb2tQcm9wcyxcbiAgICAgICAgICAgIHZpZXdBcGk6IGNvbnRleHQudmlld0FwaSxcbiAgICAgICAgICAgIGRhdGVFbnY6IGNvbnRleHQuZGF0ZUVudixcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBjbGFzc05hbWVzID0gZ2V0RGF5Q2xhc3NOYW1lcyhob29rUHJvcHMsIGNvbnRleHQudGhlbWUpLmNvbmNhdChob29rUHJvcHMuaXNEaXNhYmxlZFxuICAgICAgICAgICAgPyBbXSAvLyBkb24ndCB1c2UgY3VzdG9tIGNsYXNzTmFtZXMgaWYgZGlzYWJsZWRcbiAgICAgICAgICAgIDogdGhpcy5ub3JtYWxpemVDbGFzc05hbWVzKG9wdGlvbnMuZGF5Q2VsbENsYXNzTmFtZXMsIGhvb2tQcm9wcykpO1xuICAgICAgICB2YXIgZGF0YUF0dHJzID0gaG9va1Byb3BzLmlzRGlzYWJsZWQgPyB7fSA6IHtcbiAgICAgICAgICAgICdkYXRhLWRhdGUnOiBmb3JtYXREYXlTdHJpbmcocHJvcHMuZGF0ZSksXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChNb3VudEhvb2ssIHsgaG9va1Byb3BzOiBob29rUHJvcHMsIGRpZE1vdW50OiBvcHRpb25zLmRheUNlbGxEaWRNb3VudCwgd2lsbFVubW91bnQ6IG9wdGlvbnMuZGF5Q2VsbFdpbGxVbm1vdW50LCBlbFJlZjogcHJvcHMuZWxSZWYgfSwgZnVuY3Rpb24gKHJvb3RFbFJlZikgeyByZXR1cm4gcHJvcHMuY2hpbGRyZW4ocm9vdEVsUmVmLCBjbGFzc05hbWVzLCBkYXRhQXR0cnMsIGhvb2tQcm9wcy5pc0Rpc2FibGVkKTsgfSkpO1xuICAgIH07XG4gICAgcmV0dXJuIERheUNlbGxSb290O1xufShCYXNlQ29tcG9uZW50KSk7XG5cbmZ1bmN0aW9uIHJlbmRlckZpbGwoZmlsbFR5cGUpIHtcbiAgICByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtXCIgKyBmaWxsVHlwZSB9KSk7XG59XG52YXIgQmdFdmVudCA9IGZ1bmN0aW9uIChwcm9wcykgeyByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoRXZlbnRSb290LCB7IGRlZmF1bHRDb250ZW50OiByZW5kZXJJbm5lckNvbnRlbnQsIHNlZzogcHJvcHMuc2VnIC8qIHVzZWxlc3NzIGkgdGhpbmsgKi8sIHRpbWVUZXh0OiBcIlwiLCBkaXNhYmxlRHJhZ2dpbmc6IHRydWUsIGRpc2FibGVSZXNpemluZzogdHJ1ZSwgaXNEcmFnZ2luZzogZmFsc2UsIGlzUmVzaXppbmc6IGZhbHNlLCBpc0RhdGVTZWxlY3Rpbmc6IGZhbHNlLCBpc1NlbGVjdGVkOiBmYWxzZSwgaXNQYXN0OiBwcm9wcy5pc1Bhc3QsIGlzRnV0dXJlOiBwcm9wcy5pc0Z1dHVyZSwgaXNUb2RheTogcHJvcHMuaXNUb2RheSB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQsIGhvb2tQcm9wcykgeyByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyByZWY6IHJvb3RFbFJlZiwgY2xhc3NOYW1lOiBbJ2ZjLWJnLWV2ZW50J10uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSwgc3R5bGU6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBob29rUHJvcHMuYmFja2dyb3VuZENvbG9yLFxuICAgIH0gfSwgaW5uZXJDb250ZW50KSk7IH0pKTsgfTtcbmZ1bmN0aW9uIHJlbmRlcklubmVyQ29udGVudChwcm9wcykge1xuICAgIHZhciB0aXRsZSA9IHByb3BzLmV2ZW50LnRpdGxlO1xuICAgIHJldHVybiB0aXRsZSAmJiAodmRvbV9janMuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1ldmVudC10aXRsZVwiIH0sIHByb3BzLmV2ZW50LnRpdGxlKSk7XG59XG5cbnZhciBXZWVrTnVtYmVyUm9vdCA9IGZ1bmN0aW9uIChwcm9wcykgeyByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoVmlld0NvbnRleHRUeXBlLkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIHZhciBkYXRlRW52ID0gY29udGV4dC5kYXRlRW52LCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zO1xuICAgIHZhciBkYXRlID0gcHJvcHMuZGF0ZTtcbiAgICB2YXIgZm9ybWF0ID0gb3B0aW9ucy53ZWVrTnVtYmVyRm9ybWF0IHx8IHByb3BzLmRlZmF1bHRGb3JtYXQ7XG4gICAgdmFyIG51bSA9IGRhdGVFbnYuY29tcHV0ZVdlZWtOdW1iZXIoZGF0ZSk7IC8vIFRPRE86IHNvbWVob3cgdXNlIGZvciBmb3JtYXR0aW5nIGFzIHdlbGw/XG4gICAgdmFyIHRleHQgPSBkYXRlRW52LmZvcm1hdChkYXRlLCBmb3JtYXQpO1xuICAgIHZhciBob29rUHJvcHMgPSB7IG51bTogbnVtLCB0ZXh0OiB0ZXh0LCBkYXRlOiBkYXRlIH07XG4gICAgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFJlbmRlckhvb2ssIHsgaG9va1Byb3BzOiBob29rUHJvcHMsIGNsYXNzTmFtZXM6IG9wdGlvbnMud2Vla051bWJlckNsYXNzTmFtZXMsIGNvbnRlbnQ6IG9wdGlvbnMud2Vla051bWJlckNvbnRlbnQsIGRlZmF1bHRDb250ZW50OiByZW5kZXJJbm5lciwgZGlkTW91bnQ6IG9wdGlvbnMud2Vla051bWJlckRpZE1vdW50LCB3aWxsVW5tb3VudDogb3B0aW9ucy53ZWVrTnVtYmVyV2lsbFVubW91bnQgfSwgcHJvcHMuY2hpbGRyZW4pKTtcbn0pKTsgfTtcbmZ1bmN0aW9uIHJlbmRlcklubmVyKGlubmVyUHJvcHMpIHtcbiAgICByZXR1cm4gaW5uZXJQcm9wcy50ZXh0O1xufVxuXG52YXIgUEFERElOR19GUk9NX1ZJRVdQT1JUID0gMTA7XG52YXIgUG9wb3ZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoUG9wb3ZlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQb3BvdmVyKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICB0aXRsZUlkOiBnZXRVbmlxdWVEb21JZCgpLFxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVSb290RWwgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIF90aGlzLnJvb3RFbCA9IGVsO1xuICAgICAgICAgICAgaWYgKF90aGlzLnByb3BzLmVsUmVmKSB7XG4gICAgICAgICAgICAgICAgc2V0UmVmKF90aGlzLnByb3BzLmVsUmVmLCBlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIFRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyAqYW55d2hlcmUqIGluIHRoZSBkb2N1bWVudCwgZm9yIHRoZSBhdXRvSGlkZSBmZWF0dXJlXG4gICAgICAgIF90aGlzLmhhbmRsZURvY3VtZW50TW91c2VEb3duID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICAvLyBvbmx5IGhpZGUgdGhlIHBvcG92ZXIgaWYgdGhlIGNsaWNrIGhhcHBlbmVkIG91dHNpZGUgdGhlIHBvcG92ZXJcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSBnZXRFdmVudFRhcmdldFZpYVJvb3QoZXYpO1xuICAgICAgICAgICAgaWYgKCFfdGhpcy5yb290RWwuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIF90aGlzLmhhbmRsZUNsb3NlQ2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlRG9jdW1lbnRLZXlEb3duID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBpZiAoZXYua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAgICAgICAgIF90aGlzLmhhbmRsZUNsb3NlQ2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlQ2xvc2VDbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvbkNsb3NlID0gX3RoaXMucHJvcHMub25DbG9zZTtcbiAgICAgICAgICAgIGlmIChvbkNsb3NlKSB7XG4gICAgICAgICAgICAgICAgb25DbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBvcG92ZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5jb250ZXh0LCB0aGVtZSA9IF9hLnRoZW1lLCBvcHRpb25zID0gX2Eub3B0aW9ucztcbiAgICAgICAgdmFyIF9iID0gdGhpcywgcHJvcHMgPSBfYi5wcm9wcywgc3RhdGUgPSBfYi5zdGF0ZTtcbiAgICAgICAgdmFyIGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICAgICAnZmMtcG9wb3ZlcicsXG4gICAgICAgICAgICB0aGVtZS5nZXRDbGFzcygncG9wb3ZlcicpLFxuICAgICAgICBdLmNvbmNhdChwcm9wcy5leHRyYUNsYXNzTmFtZXMgfHwgW10pO1xuICAgICAgICByZXR1cm4gdmRvbV9janMuY3JlYXRlUG9ydGFsKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgdHNsaWIuX19hc3NpZ24oeyBpZDogcHJvcHMuaWQsIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5qb2luKCcgJyksIFwiYXJpYS1sYWJlbGxlZGJ5XCI6IHN0YXRlLnRpdGxlSWQgfSwgcHJvcHMuZXh0cmFBdHRycywgeyByZWY6IHRoaXMuaGFuZGxlUm9vdEVsIH0pLFxuICAgICAgICAgICAgdmRvbV9janMuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogJ2ZjLXBvcG92ZXItaGVhZGVyICcgKyB0aGVtZS5nZXRDbGFzcygncG9wb3ZlckhlYWRlcicpIH0sXG4gICAgICAgICAgICAgICAgdmRvbV9janMuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6IFwiZmMtcG9wb3Zlci10aXRsZVwiLCBpZDogc3RhdGUudGl0bGVJZCB9LCBwcm9wcy50aXRsZSksXG4gICAgICAgICAgICAgICAgdmRvbV9janMuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6ICdmYy1wb3BvdmVyLWNsb3NlICcgKyB0aGVtZS5nZXRJY29uQ2xhc3MoJ2Nsb3NlJyksIHRpdGxlOiBvcHRpb25zLmNsb3NlSGludCwgb25DbGljazogdGhpcy5oYW5kbGVDbG9zZUNsaWNrIH0pKSxcbiAgICAgICAgICAgIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6ICdmYy1wb3BvdmVyLWJvZHkgJyArIHRoZW1lLmdldENsYXNzKCdwb3BvdmVyQ29udGVudCcpIH0sIHByb3BzLmNoaWxkcmVuKSksIHByb3BzLnBhcmVudEVsKTtcbiAgICB9O1xuICAgIFBvcG92ZXIucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZURvY3VtZW50TW91c2VEb3duKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlRG9jdW1lbnRLZXlEb3duKTtcbiAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgfTtcbiAgICBQb3BvdmVyLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5oYW5kbGVEb2N1bWVudE1vdXNlRG93bik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZURvY3VtZW50S2V5RG93bik7XG4gICAgfTtcbiAgICBQb3BvdmVyLnByb3RvdHlwZS51cGRhdGVTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaXNSdGwgPSB0aGlzLmNvbnRleHQuaXNSdGw7XG4gICAgICAgIHZhciBfYSA9IHRoaXMucHJvcHMsIGFsaWdubWVudEVsID0gX2EuYWxpZ25tZW50RWwsIGFsaWduR3JpZFRvcCA9IF9hLmFsaWduR3JpZFRvcDtcbiAgICAgICAgdmFyIHJvb3RFbCA9IHRoaXMucm9vdEVsO1xuICAgICAgICB2YXIgYWxpZ25tZW50UmVjdCA9IGNvbXB1dGVDbGlwcGVkQ2xpZW50UmVjdChhbGlnbm1lbnRFbCk7XG4gICAgICAgIGlmIChhbGlnbm1lbnRSZWN0KSB7XG4gICAgICAgICAgICB2YXIgcG9wb3ZlckRpbXMgPSByb290RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAvLyBwb3NpdGlvbiByZWxhdGl2ZSB0byB2aWV3cG9ydFxuICAgICAgICAgICAgdmFyIHBvcG92ZXJUb3AgPSBhbGlnbkdyaWRUb3BcbiAgICAgICAgICAgICAgICA/IGVsZW1lbnRDbG9zZXN0KGFsaWdubWVudEVsLCAnLmZjLXNjcm9sbGdyaWQnKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgICAgICAgICAgICAgICA6IGFsaWdubWVudFJlY3QudG9wO1xuICAgICAgICAgICAgdmFyIHBvcG92ZXJMZWZ0ID0gaXNSdGwgPyBhbGlnbm1lbnRSZWN0LnJpZ2h0IC0gcG9wb3ZlckRpbXMud2lkdGggOiBhbGlnbm1lbnRSZWN0LmxlZnQ7XG4gICAgICAgICAgICAvLyBjb25zdHJhaW5cbiAgICAgICAgICAgIHBvcG92ZXJUb3AgPSBNYXRoLm1heChwb3BvdmVyVG9wLCBQQURESU5HX0ZST01fVklFV1BPUlQpO1xuICAgICAgICAgICAgcG9wb3ZlckxlZnQgPSBNYXRoLm1pbihwb3BvdmVyTGVmdCwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIC0gUEFERElOR19GUk9NX1ZJRVdQT1JUIC0gcG9wb3ZlckRpbXMud2lkdGgpO1xuICAgICAgICAgICAgcG9wb3ZlckxlZnQgPSBNYXRoLm1heChwb3BvdmVyTGVmdCwgUEFERElOR19GUk9NX1ZJRVdQT1JUKTtcbiAgICAgICAgICAgIHZhciBvcmlnaW5fMSA9IHJvb3RFbC5vZmZzZXRQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBhcHBseVN0eWxlKHJvb3RFbCwge1xuICAgICAgICAgICAgICAgIHRvcDogcG9wb3ZlclRvcCAtIG9yaWdpbl8xLnRvcCxcbiAgICAgICAgICAgICAgICBsZWZ0OiBwb3BvdmVyTGVmdCAtIG9yaWdpbl8xLmxlZnQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFBvcG92ZXI7XG59KEJhc2VDb21wb25lbnQpKTtcblxudmFyIE1vcmVQb3BvdmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhNb3JlUG9wb3ZlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNb3JlUG9wb3ZlcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmhhbmRsZVJvb3RFbCA9IGZ1bmN0aW9uIChyb290RWwpIHtcbiAgICAgICAgICAgIF90aGlzLnJvb3RFbCA9IHJvb3RFbDtcbiAgICAgICAgICAgIGlmIChyb290RWwpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5jb250ZXh0LnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQoX3RoaXMsIHtcbiAgICAgICAgICAgICAgICAgICAgZWw6IHJvb3RFbCxcbiAgICAgICAgICAgICAgICAgICAgdXNlRXZlbnRDZW50ZXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuY29udGV4dC51bnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQoX3RoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIE1vcmVQb3BvdmVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuY29udGV4dCwgb3B0aW9ucyA9IF9hLm9wdGlvbnMsIGRhdGVFbnYgPSBfYS5kYXRlRW52O1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgc3RhcnREYXRlID0gcHJvcHMuc3RhcnREYXRlLCB0b2RheVJhbmdlID0gcHJvcHMudG9kYXlSYW5nZSwgZGF0ZVByb2ZpbGUgPSBwcm9wcy5kYXRlUHJvZmlsZTtcbiAgICAgICAgdmFyIHRpdGxlID0gZGF0ZUVudi5mb3JtYXQoc3RhcnREYXRlLCBvcHRpb25zLmRheVBvcG92ZXJGb3JtYXQpO1xuICAgICAgICByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoRGF5Q2VsbFJvb3QsIHsgZGF0ZTogc3RhcnREYXRlLCBkYXRlUHJvZmlsZTogZGF0ZVByb2ZpbGUsIHRvZGF5UmFuZ2U6IHRvZGF5UmFuZ2UsIGVsUmVmOiB0aGlzLmhhbmRsZVJvb3RFbCB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBkYXlDbGFzc05hbWVzLCBkYXRhQXR0cnMpIHsgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFBvcG92ZXIsIHsgZWxSZWY6IHJvb3RFbFJlZiwgaWQ6IHByb3BzLmlkLCB0aXRsZTogdGl0bGUsIGV4dHJhQ2xhc3NOYW1lczogWydmYy1tb3JlLXBvcG92ZXInXS5jb25jYXQoZGF5Q2xhc3NOYW1lcyksIGV4dHJhQXR0cnM6IGRhdGFBdHRycyAvKiBUT0RPOiBtYWtlIHRoZXNlIHRpbWUtYmFzZWQgd2hlbiBub3Qgd2hvbGUtZGF5PyAqLywgcGFyZW50RWw6IHByb3BzLnBhcmVudEVsLCBhbGlnbm1lbnRFbDogcHJvcHMuYWxpZ25tZW50RWwsIGFsaWduR3JpZFRvcDogcHJvcHMuYWxpZ25HcmlkVG9wLCBvbkNsb3NlOiBwcm9wcy5vbkNsb3NlIH0sXG4gICAgICAgICAgICB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KERheUNlbGxDb250ZW50LCB7IGRhdGU6IHN0YXJ0RGF0ZSwgZGF0ZVByb2ZpbGU6IGRhdGVQcm9maWxlLCB0b2RheVJhbmdlOiB0b2RheVJhbmdlIH0sIGZ1bmN0aW9uIChpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQpIHsgcmV0dXJuIChpbm5lckNvbnRlbnQgJiZcbiAgICAgICAgICAgICAgICB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLW1vcmUtcG9wb3Zlci1taXNjXCIsIHJlZjogaW5uZXJFbFJlZiB9LCBpbm5lckNvbnRlbnQpKTsgfSksXG4gICAgICAgICAgICBwcm9wcy5jaGlsZHJlbikpOyB9KSk7XG4gICAgfTtcbiAgICBNb3JlUG9wb3Zlci5wcm90b3R5cGUucXVlcnlIaXQgPSBmdW5jdGlvbiAocG9zaXRpb25MZWZ0LCBwb3NpdGlvblRvcCwgZWxXaWR0aCwgZWxIZWlnaHQpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgcm9vdEVsID0gX2Eucm9vdEVsLCBwcm9wcyA9IF9hLnByb3BzO1xuICAgICAgICBpZiAocG9zaXRpb25MZWZ0ID49IDAgJiYgcG9zaXRpb25MZWZ0IDwgZWxXaWR0aCAmJlxuICAgICAgICAgICAgcG9zaXRpb25Ub3AgPj0gMCAmJiBwb3NpdGlvblRvcCA8IGVsSGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSxcbiAgICAgICAgICAgICAgICBkYXRlU3BhbjogdHNsaWIuX19hc3NpZ24oeyBhbGxEYXk6IHRydWUsIHJhbmdlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogcHJvcHMuc3RhcnREYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBwcm9wcy5lbmREYXRlLFxuICAgICAgICAgICAgICAgICAgICB9IH0sIHByb3BzLmV4dHJhRGF0ZVNwYW4pLFxuICAgICAgICAgICAgICAgIGRheUVsOiByb290RWwsXG4gICAgICAgICAgICAgICAgcmVjdDoge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBlbFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICBib3R0b206IGVsSGVpZ2h0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbGF5ZXI6IDEsIC8vIGltcG9ydGFudCB3aGVuIGNvbXBhcmluZyB3aXRoIGhpdHMgZnJvbSBvdGhlciBjb21wb25lbnRzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIE1vcmVQb3BvdmVyO1xufShEYXRlQ29tcG9uZW50KSk7XG5cbnZhciBNb3JlTGlua1Jvb3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKE1vcmVMaW5rUm9vdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNb3JlTGlua1Jvb3QoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5saW5rRWxSZWYgPSB2ZG9tX2Nqcy5jcmVhdGVSZWYoKTtcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBpc1BvcG92ZXJPcGVuOiBmYWxzZSxcbiAgICAgICAgICAgIHBvcG92ZXJJZDogZ2V0VW5pcXVlRG9tSWQoKSxcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IF90aGlzLCBwcm9wcyA9IF9hLnByb3BzLCBjb250ZXh0ID0gX2EuY29udGV4dDtcbiAgICAgICAgICAgIHZhciBtb3JlTGlua0NsaWNrID0gY29udGV4dC5vcHRpb25zLm1vcmVMaW5rQ2xpY2s7XG4gICAgICAgICAgICB2YXIgZGF0ZSA9IGNvbXB1dGVSYW5nZShwcm9wcykuc3RhcnQ7XG4gICAgICAgICAgICBmdW5jdGlvbiBidWlsZFB1YmxpY1NlZyhzZWcpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2EgPSBzZWcuZXZlbnRSYW5nZSwgZGVmID0gX2EuZGVmLCBpbnN0YW5jZSA9IF9hLmluc3RhbmNlLCByYW5nZSA9IF9hLnJhbmdlO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBuZXcgRXZlbnRBcGkoY29udGV4dCwgZGVmLCBpbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBjb250ZXh0LmRhdGVFbnYudG9EYXRlKHJhbmdlLnN0YXJ0KSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBjb250ZXh0LmRhdGVFbnYudG9EYXRlKHJhbmdlLmVuZCksXG4gICAgICAgICAgICAgICAgICAgIGlzU3RhcnQ6IHNlZy5pc1N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICBpc0VuZDogc2VnLmlzRW5kLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1vcmVMaW5rQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBtb3JlTGlua0NsaWNrID0gbW9yZUxpbmtDbGljayh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGU6IGRhdGUsXG4gICAgICAgICAgICAgICAgICAgIGFsbERheTogQm9vbGVhbihwcm9wcy5hbGxEYXlEYXRlKSxcbiAgICAgICAgICAgICAgICAgICAgYWxsU2VnczogcHJvcHMuYWxsU2Vncy5tYXAoYnVpbGRQdWJsaWNTZWcpLFxuICAgICAgICAgICAgICAgICAgICBoaWRkZW5TZWdzOiBwcm9wcy5oaWRkZW5TZWdzLm1hcChidWlsZFB1YmxpY1NlZyksXG4gICAgICAgICAgICAgICAgICAgIGpzRXZlbnQ6IGV2LFxuICAgICAgICAgICAgICAgICAgICB2aWV3OiBjb250ZXh0LnZpZXdBcGksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW1vcmVMaW5rQ2xpY2sgfHwgbW9yZUxpbmtDbGljayA9PT0gJ3BvcG92ZXInKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuc2V0U3RhdGUoeyBpc1BvcG92ZXJPcGVuOiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1vcmVMaW5rQ2xpY2sgPT09ICdzdHJpbmcnKSB7IC8vIGEgdmlldyBuYW1lXG4gICAgICAgICAgICAgICAgY29udGV4dC5jYWxlbmRhckFwaS56b29tVG8oZGF0ZSwgbW9yZUxpbmtDbGljayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmhhbmRsZVBvcG92ZXJDbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLnNldFN0YXRlKHsgaXNQb3BvdmVyT3BlbjogZmFsc2UgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgTW9yZUxpbmtSb290LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIHN0YXRlID0gX2Euc3RhdGU7XG4gICAgICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChWaWV3Q29udGV4dFR5cGUuQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgICAgICB2YXIgdmlld0FwaSA9IGNvbnRleHQudmlld0FwaSwgb3B0aW9ucyA9IGNvbnRleHQub3B0aW9ucywgY2FsZW5kYXJBcGkgPSBjb250ZXh0LmNhbGVuZGFyQXBpO1xuICAgICAgICAgICAgdmFyIG1vcmVMaW5rVGV4dCA9IG9wdGlvbnMubW9yZUxpbmtUZXh0O1xuICAgICAgICAgICAgdmFyIG1vcmVDbnQgPSBwcm9wcy5tb3JlQ250O1xuICAgICAgICAgICAgdmFyIHJhbmdlID0gY29tcHV0ZVJhbmdlKHByb3BzKTtcbiAgICAgICAgICAgIHZhciB0ZXh0ID0gdHlwZW9mIG1vcmVMaW5rVGV4dCA9PT0gJ2Z1bmN0aW9uJyAvLyBUT0RPOiBldmVudHVhbGx5IHVzZSBmb3JtYXRXaXRoT3JkaW5hbHNcbiAgICAgICAgICAgICAgICA/IG1vcmVMaW5rVGV4dC5jYWxsKGNhbGVuZGFyQXBpLCBtb3JlQ250KVxuICAgICAgICAgICAgICAgIDogXCIrXCIgKyBtb3JlQ250ICsgXCIgXCIgKyBtb3JlTGlua1RleHQ7XG4gICAgICAgICAgICB2YXIgdGl0bGUgPSBmb3JtYXRXaXRoT3JkaW5hbHMob3B0aW9ucy5tb3JlTGlua0hpbnQsIFttb3JlQ250XSwgdGV4dCk7XG4gICAgICAgICAgICB2YXIgaG9va1Byb3BzID0ge1xuICAgICAgICAgICAgICAgIG51bTogbW9yZUNudCxcbiAgICAgICAgICAgICAgICBzaG9ydFRleHQ6IFwiK1wiICsgbW9yZUNudCxcbiAgICAgICAgICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICAgICAgICAgIHZpZXc6IHZpZXdBcGksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KHZkb21fY2pzLkZyYWdtZW50LCBudWxsLFxuICAgICAgICAgICAgICAgIEJvb2xlYW4ocHJvcHMubW9yZUNudCkgJiYgKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoUmVuZGVySG9vaywgeyBlbFJlZjogX3RoaXMubGlua0VsUmVmLCBob29rUHJvcHM6IGhvb2tQcm9wcywgY2xhc3NOYW1lczogb3B0aW9ucy5tb3JlTGlua0NsYXNzTmFtZXMsIGNvbnRlbnQ6IG9wdGlvbnMubW9yZUxpbmtDb250ZW50LCBkZWZhdWx0Q29udGVudDogcHJvcHMuZGVmYXVsdENvbnRlbnQgfHwgcmVuZGVyTW9yZUxpbmtJbm5lciwgZGlkTW91bnQ6IG9wdGlvbnMubW9yZUxpbmtEaWRNb3VudCwgd2lsbFVubW91bnQ6IG9wdGlvbnMubW9yZUxpbmtXaWxsVW5tb3VudCB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjdXN0b21DbGFzc05hbWVzLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQpIHsgcmV0dXJuIHByb3BzLmNoaWxkcmVuKHJvb3RFbFJlZiwgWydmYy1tb3JlLWxpbmsnXS5jb25jYXQoY3VzdG9tQ2xhc3NOYW1lcyksIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCwgX3RoaXMuaGFuZGxlQ2xpY2ssIHRpdGxlLCBzdGF0ZS5pc1BvcG92ZXJPcGVuLCBzdGF0ZS5pc1BvcG92ZXJPcGVuID8gc3RhdGUucG9wb3ZlcklkIDogJycpOyB9KSksXG4gICAgICAgICAgICAgICAgc3RhdGUuaXNQb3BvdmVyT3BlbiAmJiAodmRvbV9janMuY3JlYXRlRWxlbWVudChNb3JlUG9wb3ZlciwgeyBpZDogc3RhdGUucG9wb3ZlcklkLCBzdGFydERhdGU6IHJhbmdlLnN0YXJ0LCBlbmREYXRlOiByYW5nZS5lbmQsIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSwgZXh0cmFEYXRlU3BhbjogcHJvcHMuZXh0cmFEYXRlU3BhbiwgcGFyZW50RWw6IF90aGlzLnBhcmVudEVsLCBhbGlnbm1lbnRFbDogcHJvcHMuYWxpZ25tZW50RWxSZWYuY3VycmVudCwgYWxpZ25HcmlkVG9wOiBwcm9wcy5hbGlnbkdyaWRUb3AsIG9uQ2xvc2U6IF90aGlzLmhhbmRsZVBvcG92ZXJDbG9zZSB9LCBwcm9wcy5wb3BvdmVyQ29udGVudCgpKSkpKTtcbiAgICAgICAgfSkpO1xuICAgIH07XG4gICAgTW9yZUxpbmtSb290LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVQYXJlbnRFbCgpO1xuICAgIH07XG4gICAgTW9yZUxpbmtSb290LnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUGFyZW50RWwoKTtcbiAgICB9O1xuICAgIE1vcmVMaW5rUm9vdC5wcm90b3R5cGUudXBkYXRlUGFyZW50RWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmxpbmtFbFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudEVsID0gZWxlbWVudENsb3Nlc3QodGhpcy5saW5rRWxSZWYuY3VycmVudCwgJy5mYy12aWV3LWhhcm5lc3MnKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIE1vcmVMaW5rUm9vdDtcbn0oQmFzZUNvbXBvbmVudCkpO1xuZnVuY3Rpb24gcmVuZGVyTW9yZUxpbmtJbm5lcihwcm9wcykge1xuICAgIHJldHVybiBwcm9wcy50ZXh0O1xufVxuZnVuY3Rpb24gY29tcHV0ZVJhbmdlKHByb3BzKSB7XG4gICAgaWYgKHByb3BzLmFsbERheURhdGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXJ0OiBwcm9wcy5hbGxEYXlEYXRlLFxuICAgICAgICAgICAgZW5kOiBhZGREYXlzKHByb3BzLmFsbERheURhdGUsIDEpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICB2YXIgaGlkZGVuU2VncyA9IHByb3BzLmhpZGRlblNlZ3M7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IGNvbXB1dGVFYXJsaWVzdFNlZ1N0YXJ0KGhpZGRlblNlZ3MpLFxuICAgICAgICBlbmQ6IGNvbXB1dGVMYXRlc3RTZWdFbmQoaGlkZGVuU2VncyksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVFYXJsaWVzdFNlZ1N0YXJ0KHNlZ3MpIHtcbiAgICByZXR1cm4gc2Vncy5yZWR1Y2UocGlja0VhcmxpZXN0U3RhcnQpLmV2ZW50UmFuZ2UucmFuZ2Uuc3RhcnQ7XG59XG5mdW5jdGlvbiBwaWNrRWFybGllc3RTdGFydChzZWcwLCBzZWcxKSB7XG4gICAgcmV0dXJuIHNlZzAuZXZlbnRSYW5nZS5yYW5nZS5zdGFydCA8IHNlZzEuZXZlbnRSYW5nZS5yYW5nZS5zdGFydCA/IHNlZzAgOiBzZWcxO1xufVxuZnVuY3Rpb24gY29tcHV0ZUxhdGVzdFNlZ0VuZChzZWdzKSB7XG4gICAgcmV0dXJuIHNlZ3MucmVkdWNlKHBpY2tMYXRlc3RFbmQpLmV2ZW50UmFuZ2UucmFuZ2UuZW5kO1xufVxuZnVuY3Rpb24gcGlja0xhdGVzdEVuZChzZWcwLCBzZWcxKSB7XG4gICAgcmV0dXJuIHNlZzAuZXZlbnRSYW5nZS5yYW5nZS5lbmQgPiBzZWcxLmV2ZW50UmFuZ2UucmFuZ2UuZW5kID8gc2VnMCA6IHNlZzE7XG59XG5cbi8vIGV4cG9ydHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgdmVyc2lvbiA9ICc1LjExLjInOyAvLyBpbXBvcnRhbnQgdG8gdHlwZSBpdCwgc28gLmQudHMgaGFzIGdlbmVyaWMgc3RyaW5nXG5cbmV4cG9ydHMuQkFTRV9PUFRJT05fREVGQVVMVFMgPSBCQVNFX09QVElPTl9ERUZBVUxUUztcbmV4cG9ydHMuQkFTRV9PUFRJT05fUkVGSU5FUlMgPSBCQVNFX09QVElPTl9SRUZJTkVSUztcbmV4cG9ydHMuQmFzZUNvbXBvbmVudCA9IEJhc2VDb21wb25lbnQ7XG5leHBvcnRzLkJnRXZlbnQgPSBCZ0V2ZW50O1xuZXhwb3J0cy5DYWxlbmRhckFwaSA9IENhbGVuZGFyQXBpO1xuZXhwb3J0cy5DYWxlbmRhckNvbnRlbnQgPSBDYWxlbmRhckNvbnRlbnQ7XG5leHBvcnRzLkNhbGVuZGFyRGF0YU1hbmFnZXIgPSBDYWxlbmRhckRhdGFNYW5hZ2VyO1xuZXhwb3J0cy5DYWxlbmRhckRhdGFQcm92aWRlciA9IENhbGVuZGFyRGF0YVByb3ZpZGVyO1xuZXhwb3J0cy5DYWxlbmRhclJvb3QgPSBDYWxlbmRhclJvb3Q7XG5leHBvcnRzLkNvbnRlbnRIb29rID0gQ29udGVudEhvb2s7XG5leHBvcnRzLkN1c3RvbUNvbnRlbnRSZW5kZXJDb250ZXh0ID0gQ3VzdG9tQ29udGVudFJlbmRlckNvbnRleHQ7XG5leHBvcnRzLkRhdGVDb21wb25lbnQgPSBEYXRlQ29tcG9uZW50O1xuZXhwb3J0cy5EYXRlRW52ID0gRGF0ZUVudjtcbmV4cG9ydHMuRGF0ZVByb2ZpbGVHZW5lcmF0b3IgPSBEYXRlUHJvZmlsZUdlbmVyYXRvcjtcbmV4cG9ydHMuRGF5Q2VsbENvbnRlbnQgPSBEYXlDZWxsQ29udGVudDtcbmV4cG9ydHMuRGF5Q2VsbFJvb3QgPSBEYXlDZWxsUm9vdDtcbmV4cG9ydHMuRGF5SGVhZGVyID0gRGF5SGVhZGVyO1xuZXhwb3J0cy5EYXlTZXJpZXNNb2RlbCA9IERheVNlcmllc01vZGVsO1xuZXhwb3J0cy5EYXlUYWJsZU1vZGVsID0gRGF5VGFibGVNb2RlbDtcbmV4cG9ydHMuRGVsYXllZFJ1bm5lciA9IERlbGF5ZWRSdW5uZXI7XG5leHBvcnRzLkVsZW1lbnREcmFnZ2luZyA9IEVsZW1lbnREcmFnZ2luZztcbmV4cG9ydHMuRWxlbWVudFNjcm9sbENvbnRyb2xsZXIgPSBFbGVtZW50U2Nyb2xsQ29udHJvbGxlcjtcbmV4cG9ydHMuRW1pdHRlciA9IEVtaXR0ZXI7XG5leHBvcnRzLkV2ZW50QXBpID0gRXZlbnRBcGk7XG5leHBvcnRzLkV2ZW50Um9vdCA9IEV2ZW50Um9vdDtcbmV4cG9ydHMuRXZlbnRTb3VyY2VBcGkgPSBFdmVudFNvdXJjZUFwaTtcbmV4cG9ydHMuSW50ZXJhY3Rpb24gPSBJbnRlcmFjdGlvbjtcbmV4cG9ydHMuTW9yZUxpbmtSb290ID0gTW9yZUxpbmtSb290O1xuZXhwb3J0cy5Nb3VudEhvb2sgPSBNb3VudEhvb2s7XG5leHBvcnRzLk5hbWVkVGltZVpvbmVJbXBsID0gTmFtZWRUaW1lWm9uZUltcGw7XG5leHBvcnRzLk5vd0luZGljYXRvclJvb3QgPSBOb3dJbmRpY2F0b3JSb290O1xuZXhwb3J0cy5Ob3dUaW1lciA9IE5vd1RpbWVyO1xuZXhwb3J0cy5Qb3NpdGlvbkNhY2hlID0gUG9zaXRpb25DYWNoZTtcbmV4cG9ydHMuUmVmTWFwID0gUmVmTWFwO1xuZXhwb3J0cy5SZW5kZXJIb29rID0gUmVuZGVySG9vaztcbmV4cG9ydHMuU2Nyb2xsQ29udHJvbGxlciA9IFNjcm9sbENvbnRyb2xsZXI7XG5leHBvcnRzLlNjcm9sbFJlc3BvbmRlciA9IFNjcm9sbFJlc3BvbmRlcjtcbmV4cG9ydHMuU2Nyb2xsZXIgPSBTY3JvbGxlcjtcbmV4cG9ydHMuU2VnSGllcmFyY2h5ID0gU2VnSGllcmFyY2h5O1xuZXhwb3J0cy5TaW1wbGVTY3JvbGxHcmlkID0gU2ltcGxlU2Nyb2xsR3JpZDtcbmV4cG9ydHMuU2xpY2VyID0gU2xpY2VyO1xuZXhwb3J0cy5TcGxpdHRlciA9IFNwbGl0dGVyO1xuZXhwb3J0cy5TdGFuZGFyZEV2ZW50ID0gU3RhbmRhcmRFdmVudDtcbmV4cG9ydHMuVGFibGVEYXRlQ2VsbCA9IFRhYmxlRGF0ZUNlbGw7XG5leHBvcnRzLlRhYmxlRG93Q2VsbCA9IFRhYmxlRG93Q2VsbDtcbmV4cG9ydHMuVGhlbWUgPSBUaGVtZTtcbmV4cG9ydHMuVmlld0FwaSA9IFZpZXdBcGk7XG5leHBvcnRzLlZpZXdDb250ZXh0VHlwZSA9IFZpZXdDb250ZXh0VHlwZTtcbmV4cG9ydHMuVmlld1Jvb3QgPSBWaWV3Um9vdDtcbmV4cG9ydHMuV2Vla051bWJlclJvb3QgPSBXZWVrTnVtYmVyUm9vdDtcbmV4cG9ydHMuV2luZG93U2Nyb2xsQ29udHJvbGxlciA9IFdpbmRvd1Njcm9sbENvbnRyb2xsZXI7XG5leHBvcnRzLmFkZERheXMgPSBhZGREYXlzO1xuZXhwb3J0cy5hZGREdXJhdGlvbnMgPSBhZGREdXJhdGlvbnM7XG5leHBvcnRzLmFkZE1zID0gYWRkTXM7XG5leHBvcnRzLmFkZFdlZWtzID0gYWRkV2Vla3M7XG5leHBvcnRzLmFsbG93Q29udGV4dE1lbnUgPSBhbGxvd0NvbnRleHRNZW51O1xuZXhwb3J0cy5hbGxvd1NlbGVjdGlvbiA9IGFsbG93U2VsZWN0aW9uO1xuZXhwb3J0cy5hcHBseU11dGF0aW9uVG9FdmVudFN0b3JlID0gYXBwbHlNdXRhdGlvblRvRXZlbnRTdG9yZTtcbmV4cG9ydHMuYXBwbHlTdHlsZSA9IGFwcGx5U3R5bGU7XG5leHBvcnRzLmFwcGx5U3R5bGVQcm9wID0gYXBwbHlTdHlsZVByb3A7XG5leHBvcnRzLmFzQ2xlYW5EYXlzID0gYXNDbGVhbkRheXM7XG5leHBvcnRzLmFzUm91Z2hNaW51dGVzID0gYXNSb3VnaE1pbnV0ZXM7XG5leHBvcnRzLmFzUm91Z2hNcyA9IGFzUm91Z2hNcztcbmV4cG9ydHMuYXNSb3VnaFNlY29uZHMgPSBhc1JvdWdoU2Vjb25kcztcbmV4cG9ydHMuYmluYXJ5U2VhcmNoID0gYmluYXJ5U2VhcmNoO1xuZXhwb3J0cy5idWlsZENsYXNzTmFtZU5vcm1hbGl6ZXIgPSBidWlsZENsYXNzTmFtZU5vcm1hbGl6ZXI7XG5leHBvcnRzLmJ1aWxkRW50cnlLZXkgPSBidWlsZEVudHJ5S2V5O1xuZXhwb3J0cy5idWlsZEV2ZW50QXBpcyA9IGJ1aWxkRXZlbnRBcGlzO1xuZXhwb3J0cy5idWlsZEV2ZW50UmFuZ2VLZXkgPSBidWlsZEV2ZW50UmFuZ2VLZXk7XG5leHBvcnRzLmJ1aWxkSGFzaEZyb21BcnJheSA9IGJ1aWxkSGFzaEZyb21BcnJheTtcbmV4cG9ydHMuYnVpbGRJc29TdHJpbmcgPSBidWlsZElzb1N0cmluZztcbmV4cG9ydHMuYnVpbGROYXZMaW5rQXR0cnMgPSBidWlsZE5hdkxpbmtBdHRycztcbmV4cG9ydHMuYnVpbGRTZWdDb21wYXJlT2JqID0gYnVpbGRTZWdDb21wYXJlT2JqO1xuZXhwb3J0cy5idWlsZFNlZ1RpbWVUZXh0ID0gYnVpbGRTZWdUaW1lVGV4dDtcbmV4cG9ydHMuY29sbGVjdEZyb21IYXNoID0gY29sbGVjdEZyb21IYXNoO1xuZXhwb3J0cy5jb21iaW5lRXZlbnRVaXMgPSBjb21iaW5lRXZlbnRVaXM7XG5leHBvcnRzLmNvbXBhcmVCeUZpZWxkU3BlYyA9IGNvbXBhcmVCeUZpZWxkU3BlYztcbmV4cG9ydHMuY29tcGFyZUJ5RmllbGRTcGVjcyA9IGNvbXBhcmVCeUZpZWxkU3BlY3M7XG5leHBvcnRzLmNvbXBhcmVOdW1iZXJzID0gY29tcGFyZU51bWJlcnM7XG5leHBvcnRzLmNvbXBhcmVPYmpzID0gY29tcGFyZU9ianM7XG5leHBvcnRzLmNvbXB1dGVFYXJsaWVzdFNlZ1N0YXJ0ID0gY29tcHV0ZUVhcmxpZXN0U2VnU3RhcnQ7XG5leHBvcnRzLmNvbXB1dGVFZGdlcyA9IGNvbXB1dGVFZGdlcztcbmV4cG9ydHMuY29tcHV0ZUZhbGxiYWNrSGVhZGVyRm9ybWF0ID0gY29tcHV0ZUZhbGxiYWNrSGVhZGVyRm9ybWF0O1xuZXhwb3J0cy5jb21wdXRlSGVpZ2h0QW5kTWFyZ2lucyA9IGNvbXB1dGVIZWlnaHRBbmRNYXJnaW5zO1xuZXhwb3J0cy5jb21wdXRlSW5uZXJSZWN0ID0gY29tcHV0ZUlubmVyUmVjdDtcbmV4cG9ydHMuY29tcHV0ZVJlY3QgPSBjb21wdXRlUmVjdDtcbmV4cG9ydHMuY29tcHV0ZVNlZ0RyYWdnYWJsZSA9IGNvbXB1dGVTZWdEcmFnZ2FibGU7XG5leHBvcnRzLmNvbXB1dGVTZWdFbmRSZXNpemFibGUgPSBjb21wdXRlU2VnRW5kUmVzaXphYmxlO1xuZXhwb3J0cy5jb21wdXRlU2VnU3RhcnRSZXNpemFibGUgPSBjb21wdXRlU2VnU3RhcnRSZXNpemFibGU7XG5leHBvcnRzLmNvbXB1dGVTaHJpbmtXaWR0aCA9IGNvbXB1dGVTaHJpbmtXaWR0aDtcbmV4cG9ydHMuY29tcHV0ZVNtYWxsZXN0Q2VsbFdpZHRoID0gY29tcHV0ZVNtYWxsZXN0Q2VsbFdpZHRoO1xuZXhwb3J0cy5jb21wdXRlVmlzaWJsZURheVJhbmdlID0gY29tcHV0ZVZpc2libGVEYXlSYW5nZTtcbmV4cG9ydHMuY29uZmlnID0gY29uZmlnO1xuZXhwb3J0cy5jb25zdHJhaW5Qb2ludCA9IGNvbnN0cmFpblBvaW50O1xuZXhwb3J0cy5jcmVhdGVBcmlhQ2xpY2tBdHRycyA9IGNyZWF0ZUFyaWFDbGlja0F0dHJzO1xuZXhwb3J0cy5jcmVhdGVEdXJhdGlvbiA9IGNyZWF0ZUR1cmF0aW9uO1xuZXhwb3J0cy5jcmVhdGVFbXB0eUV2ZW50U3RvcmUgPSBjcmVhdGVFbXB0eUV2ZW50U3RvcmU7XG5leHBvcnRzLmNyZWF0ZUV2ZW50SW5zdGFuY2UgPSBjcmVhdGVFdmVudEluc3RhbmNlO1xuZXhwb3J0cy5jcmVhdGVFdmVudFVpID0gY3JlYXRlRXZlbnRVaTtcbmV4cG9ydHMuY3JlYXRlRm9ybWF0dGVyID0gY3JlYXRlRm9ybWF0dGVyO1xuZXhwb3J0cy5jcmVhdGVQbHVnaW4gPSBjcmVhdGVQbHVnaW47XG5leHBvcnRzLmRpZmZEYXRlcyA9IGRpZmZEYXRlcztcbmV4cG9ydHMuZGlmZkRheUFuZFRpbWUgPSBkaWZmRGF5QW5kVGltZTtcbmV4cG9ydHMuZGlmZkRheXMgPSBkaWZmRGF5cztcbmV4cG9ydHMuZGlmZlBvaW50cyA9IGRpZmZQb2ludHM7XG5leHBvcnRzLmRpZmZXZWVrcyA9IGRpZmZXZWVrcztcbmV4cG9ydHMuZGlmZldob2xlRGF5cyA9IGRpZmZXaG9sZURheXM7XG5leHBvcnRzLmRpZmZXaG9sZVdlZWtzID0gZGlmZldob2xlV2Vla3M7XG5leHBvcnRzLmRpc2FibGVDdXJzb3IgPSBkaXNhYmxlQ3Vyc29yO1xuZXhwb3J0cy5lbGVtZW50Q2xvc2VzdCA9IGVsZW1lbnRDbG9zZXN0O1xuZXhwb3J0cy5lbGVtZW50TWF0Y2hlcyA9IGVsZW1lbnRNYXRjaGVzO1xuZXhwb3J0cy5lbmFibGVDdXJzb3IgPSBlbmFibGVDdXJzb3I7XG5leHBvcnRzLmV2ZW50VHVwbGVUb1N0b3JlID0gZXZlbnRUdXBsZVRvU3RvcmU7XG5leHBvcnRzLmZpbHRlckV2ZW50U3RvcmVEZWZzID0gZmlsdGVyRXZlbnRTdG9yZURlZnM7XG5leHBvcnRzLmZpbHRlckhhc2ggPSBmaWx0ZXJIYXNoO1xuZXhwb3J0cy5maW5kRGlyZWN0Q2hpbGRyZW4gPSBmaW5kRGlyZWN0Q2hpbGRyZW47XG5leHBvcnRzLmZpbmRFbGVtZW50cyA9IGZpbmRFbGVtZW50cztcbmV4cG9ydHMuZmxleGlibGVDb21wYXJlID0gZmxleGlibGVDb21wYXJlO1xuZXhwb3J0cy5mb3JtYXREYXRlID0gZm9ybWF0RGF0ZTtcbmV4cG9ydHMuZm9ybWF0RGF5U3RyaW5nID0gZm9ybWF0RGF5U3RyaW5nO1xuZXhwb3J0cy5mb3JtYXRJc29UaW1lU3RyaW5nID0gZm9ybWF0SXNvVGltZVN0cmluZztcbmV4cG9ydHMuZm9ybWF0UmFuZ2UgPSBmb3JtYXRSYW5nZTtcbmV4cG9ydHMuZ2V0QWxsb3dZU2Nyb2xsaW5nID0gZ2V0QWxsb3dZU2Nyb2xsaW5nO1xuZXhwb3J0cy5nZXRDYW5WR3Jvd1dpdGhpbkNlbGwgPSBnZXRDYW5WR3Jvd1dpdGhpbkNlbGw7XG5leHBvcnRzLmdldENsaXBwaW5nUGFyZW50cyA9IGdldENsaXBwaW5nUGFyZW50cztcbmV4cG9ydHMuZ2V0RGF0ZU1ldGEgPSBnZXREYXRlTWV0YTtcbmV4cG9ydHMuZ2V0RGF5Q2xhc3NOYW1lcyA9IGdldERheUNsYXNzTmFtZXM7XG5leHBvcnRzLmdldERlZmF1bHRFdmVudEVuZCA9IGdldERlZmF1bHRFdmVudEVuZDtcbmV4cG9ydHMuZ2V0RWxSb290ID0gZ2V0RWxSb290O1xuZXhwb3J0cy5nZXRFbFNlZyA9IGdldEVsU2VnO1xuZXhwb3J0cy5nZXRFbnRyeVNwYW5FbmQgPSBnZXRFbnRyeVNwYW5FbmQ7XG5leHBvcnRzLmdldEV2ZW50Q2xhc3NOYW1lcyA9IGdldEV2ZW50Q2xhc3NOYW1lcztcbmV4cG9ydHMuZ2V0RXZlbnRUYXJnZXRWaWFSb290ID0gZ2V0RXZlbnRUYXJnZXRWaWFSb290O1xuZXhwb3J0cy5nZXRJc1J0bFNjcm9sbGJhck9uTGVmdCA9IGdldElzUnRsU2Nyb2xsYmFyT25MZWZ0O1xuZXhwb3J0cy5nZXRSZWN0Q2VudGVyID0gZ2V0UmVjdENlbnRlcjtcbmV4cG9ydHMuZ2V0UmVsZXZhbnRFdmVudHMgPSBnZXRSZWxldmFudEV2ZW50cztcbmV4cG9ydHMuZ2V0U2Nyb2xsR3JpZENsYXNzTmFtZXMgPSBnZXRTY3JvbGxHcmlkQ2xhc3NOYW1lcztcbmV4cG9ydHMuZ2V0U2Nyb2xsYmFyV2lkdGhzID0gZ2V0U2Nyb2xsYmFyV2lkdGhzO1xuZXhwb3J0cy5nZXRTZWN0aW9uQ2xhc3NOYW1lcyA9IGdldFNlY3Rpb25DbGFzc05hbWVzO1xuZXhwb3J0cy5nZXRTZWN0aW9uSGFzTGlxdWlkSGVpZ2h0ID0gZ2V0U2VjdGlvbkhhc0xpcXVpZEhlaWdodDtcbmV4cG9ydHMuZ2V0U2VnQW5jaG9yQXR0cnMgPSBnZXRTZWdBbmNob3JBdHRycztcbmV4cG9ydHMuZ2V0U2VnTWV0YSA9IGdldFNlZ01ldGE7XG5leHBvcnRzLmdldFNsb3RDbGFzc05hbWVzID0gZ2V0U2xvdENsYXNzTmFtZXM7XG5leHBvcnRzLmdldFN0aWNreUZvb3RlclNjcm9sbGJhciA9IGdldFN0aWNreUZvb3RlclNjcm9sbGJhcjtcbmV4cG9ydHMuZ2V0U3RpY2t5SGVhZGVyRGF0ZXMgPSBnZXRTdGlja3lIZWFkZXJEYXRlcztcbmV4cG9ydHMuZ2V0VW5lcXVhbFByb3BzID0gZ2V0VW5lcXVhbFByb3BzO1xuZXhwb3J0cy5nZXRVbmlxdWVEb21JZCA9IGdldFVuaXF1ZURvbUlkO1xuZXhwb3J0cy5nbG9iYWxMb2NhbGVzID0gZ2xvYmFsTG9jYWxlcztcbmV4cG9ydHMuZ2xvYmFsUGx1Z2lucyA9IGdsb2JhbFBsdWdpbnM7XG5leHBvcnRzLmdyZWF0ZXN0RHVyYXRpb25EZW5vbWluYXRvciA9IGdyZWF0ZXN0RHVyYXRpb25EZW5vbWluYXRvcjtcbmV4cG9ydHMuZ3JvdXBJbnRlcnNlY3RpbmdFbnRyaWVzID0gZ3JvdXBJbnRlcnNlY3RpbmdFbnRyaWVzO1xuZXhwb3J0cy5ndWlkID0gZ3VpZDtcbmV4cG9ydHMuaGFzQmdSZW5kZXJpbmcgPSBoYXNCZ1JlbmRlcmluZztcbmV4cG9ydHMuaGFzU2hyaW5rV2lkdGggPSBoYXNTaHJpbmtXaWR0aDtcbmV4cG9ydHMuaWRlbnRpdHkgPSBpZGVudGl0eTtcbmV4cG9ydHMuaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlID0gaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlO1xuZXhwb3J0cy5pbnRlcmFjdGlvblNldHRpbmdzVG9TdG9yZSA9IGludGVyYWN0aW9uU2V0dGluZ3NUb1N0b3JlO1xuZXhwb3J0cy5pbnRlcnNlY3RSYW5nZXMgPSBpbnRlcnNlY3RSYW5nZXM7XG5leHBvcnRzLmludGVyc2VjdFJlY3RzID0gaW50ZXJzZWN0UmVjdHM7XG5leHBvcnRzLmludGVyc2VjdFNwYW5zID0gaW50ZXJzZWN0U3BhbnM7XG5leHBvcnRzLmlzQXJyYXlzRXF1YWwgPSBpc0FycmF5c0VxdWFsO1xuZXhwb3J0cy5pc0NvbFByb3BzRXF1YWwgPSBpc0NvbFByb3BzRXF1YWw7XG5leHBvcnRzLmlzRGF0ZVNlbGVjdGlvblZhbGlkID0gaXNEYXRlU2VsZWN0aW9uVmFsaWQ7XG5leHBvcnRzLmlzRGF0ZVNwYW5zRXF1YWwgPSBpc0RhdGVTcGFuc0VxdWFsO1xuZXhwb3J0cy5pc0ludCA9IGlzSW50O1xuZXhwb3J0cy5pc0ludGVyYWN0aW9uVmFsaWQgPSBpc0ludGVyYWN0aW9uVmFsaWQ7XG5leHBvcnRzLmlzTXVsdGlEYXlSYW5nZSA9IGlzTXVsdGlEYXlSYW5nZTtcbmV4cG9ydHMuaXNQcm9wc0VxdWFsID0gaXNQcm9wc0VxdWFsO1xuZXhwb3J0cy5pc1Byb3BzVmFsaWQgPSBpc1Byb3BzVmFsaWQ7XG5leHBvcnRzLmlzVmFsaWREYXRlID0gaXNWYWxpZERhdGU7XG5leHBvcnRzLmpvaW5TcGFucyA9IGpvaW5TcGFucztcbmV4cG9ydHMubGlzdGVuQnlTZWxlY3RvciA9IGxpc3RlbkJ5U2VsZWN0b3I7XG5leHBvcnRzLm1hcEhhc2ggPSBtYXBIYXNoO1xuZXhwb3J0cy5tZW1vaXplID0gbWVtb2l6ZTtcbmV4cG9ydHMubWVtb2l6ZUFycmF5bGlrZSA9IG1lbW9pemVBcnJheWxpa2U7XG5leHBvcnRzLm1lbW9pemVIYXNobGlrZSA9IG1lbW9pemVIYXNobGlrZTtcbmV4cG9ydHMubWVtb2l6ZU9iakFyZyA9IG1lbW9pemVPYmpBcmc7XG5leHBvcnRzLm1lcmdlRXZlbnRTdG9yZXMgPSBtZXJnZUV2ZW50U3RvcmVzO1xuZXhwb3J0cy5tdWx0aXBseUR1cmF0aW9uID0gbXVsdGlwbHlEdXJhdGlvbjtcbmV4cG9ydHMucGFkU3RhcnQgPSBwYWRTdGFydDtcbmV4cG9ydHMucGFyc2VCdXNpbmVzc0hvdXJzID0gcGFyc2VCdXNpbmVzc0hvdXJzO1xuZXhwb3J0cy5wYXJzZUNsYXNzTmFtZXMgPSBwYXJzZUNsYXNzTmFtZXM7XG5leHBvcnRzLnBhcnNlRHJhZ01ldGEgPSBwYXJzZURyYWdNZXRhO1xuZXhwb3J0cy5wYXJzZUV2ZW50RGVmID0gcGFyc2VFdmVudERlZjtcbmV4cG9ydHMucGFyc2VGaWVsZFNwZWNzID0gcGFyc2VGaWVsZFNwZWNzO1xuZXhwb3J0cy5wYXJzZU1hcmtlciA9IHBhcnNlO1xuZXhwb3J0cy5wb2ludEluc2lkZVJlY3QgPSBwb2ludEluc2lkZVJlY3Q7XG5leHBvcnRzLnByZXZlbnRDb250ZXh0TWVudSA9IHByZXZlbnRDb250ZXh0TWVudTtcbmV4cG9ydHMucHJldmVudERlZmF1bHQgPSBwcmV2ZW50RGVmYXVsdDtcbmV4cG9ydHMucHJldmVudFNlbGVjdGlvbiA9IHByZXZlbnRTZWxlY3Rpb247XG5leHBvcnRzLnJhbmdlQ29udGFpbnNNYXJrZXIgPSByYW5nZUNvbnRhaW5zTWFya2VyO1xuZXhwb3J0cy5yYW5nZUNvbnRhaW5zUmFuZ2UgPSByYW5nZUNvbnRhaW5zUmFuZ2U7XG5leHBvcnRzLnJhbmdlc0VxdWFsID0gcmFuZ2VzRXF1YWw7XG5leHBvcnRzLnJhbmdlc0ludGVyc2VjdCA9IHJhbmdlc0ludGVyc2VjdDtcbmV4cG9ydHMucmVmaW5lRXZlbnREZWYgPSByZWZpbmVFdmVudERlZjtcbmV4cG9ydHMucmVmaW5lUHJvcHMgPSByZWZpbmVQcm9wcztcbmV4cG9ydHMucmVtb3ZlRWxlbWVudCA9IHJlbW92ZUVsZW1lbnQ7XG5leHBvcnRzLnJlbW92ZUV4YWN0ID0gcmVtb3ZlRXhhY3Q7XG5leHBvcnRzLnJlbmRlckNodW5rQ29udGVudCA9IHJlbmRlckNodW5rQ29udGVudDtcbmV4cG9ydHMucmVuZGVyRmlsbCA9IHJlbmRlckZpbGw7XG5leHBvcnRzLnJlbmRlck1pY3JvQ29sR3JvdXAgPSByZW5kZXJNaWNyb0NvbEdyb3VwO1xuZXhwb3J0cy5yZW5kZXJTY3JvbGxTaGltID0gcmVuZGVyU2Nyb2xsU2hpbTtcbmV4cG9ydHMucmVxdWVzdEpzb24gPSByZXF1ZXN0SnNvbjtcbmV4cG9ydHMuc2FuaXRpemVTaHJpbmtXaWR0aCA9IHNhbml0aXplU2hyaW5rV2lkdGg7XG5leHBvcnRzLnNldEVsU2VnID0gc2V0RWxTZWc7XG5leHBvcnRzLnNldFJlZiA9IHNldFJlZjtcbmV4cG9ydHMuc2xpY2VFdmVudFN0b3JlID0gc2xpY2VFdmVudFN0b3JlO1xuZXhwb3J0cy5zbGljZUV2ZW50cyA9IHNsaWNlRXZlbnRzO1xuZXhwb3J0cy5zb3J0RXZlbnRTZWdzID0gc29ydEV2ZW50U2VncztcbmV4cG9ydHMuc3RhcnRPZkRheSA9IHN0YXJ0T2ZEYXk7XG5leHBvcnRzLnRyYW5zbGF0ZVJlY3QgPSB0cmFuc2xhdGVSZWN0O1xuZXhwb3J0cy50cmlnZ2VyRGF0ZVNlbGVjdCA9IHRyaWdnZXJEYXRlU2VsZWN0O1xuZXhwb3J0cy51bnByb21pc2lmeSA9IHVucHJvbWlzaWZ5O1xuZXhwb3J0cy52ZXJzaW9uID0gdmVyc2lvbjtcbmV4cG9ydHMud2hlblRyYW5zaXRpb25Eb25lID0gd2hlblRyYW5zaXRpb25Eb25lO1xuZXhwb3J0cy53aG9sZURpdmlkZUR1cmF0aW9ucyA9IHdob2xlRGl2aWRlRHVyYXRpb25zO1xuT2JqZWN0LmtleXModmRvbV9janMpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICBpZiAoayAhPT0gJ2RlZmF1bHQnICYmICFleHBvcnRzLmhhc093blByb3BlcnR5KGspKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgaywge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2ZG9tX2Nqc1trXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUVBQSxNQUFNLENBQUNDLGNBQVAsQ0FBc0JDLE9BQXRCLEVBQStCLFlBQS9CLEVBQTZDO0VBQUVDLEtBQUssRUFBRTtBQUFULENBQTdDO0FBRUE7O0FBQ0EsSUFBSUMsS0FBSyxHQUFHQyxPQUFPLENBQUMsT0FBRCxDQUFuQjs7QUFDQSxJQUFJQyxRQUFRLEdBQUdELE9BQU8sQ0FBQyxZQUFELENBQXRCLEMsQ0FFQTtBQUNBOzs7QUFDQSxJQUFJRSxjQUFjO0FBQUc7QUFBZSxZQUFZO0VBQzVDLFNBQVNBLGNBQVQsQ0FBd0JDLE9BQXhCLEVBQWlDQyxtQkFBakMsRUFBc0Q7SUFDbEQsS0FBS0QsT0FBTCxHQUFlQSxPQUFmO0lBQ0EsS0FBS0MsbUJBQUwsR0FBMkJBLG1CQUEzQjtFQUNIOztFQUNERixjQUFjLENBQUNHLFNBQWYsQ0FBeUJDLE1BQXpCLEdBQWtDLFlBQVk7SUFDMUMsS0FBS0gsT0FBTCxDQUFhSSxRQUFiLENBQXNCO01BQ2xCQyxJQUFJLEVBQUUscUJBRFk7TUFFbEJDLFFBQVEsRUFBRSxLQUFLTCxtQkFBTCxDQUF5Qks7SUFGakIsQ0FBdEI7RUFJSCxDQUxEOztFQU1BUCxjQUFjLENBQUNHLFNBQWYsQ0FBeUJLLE9BQXpCLEdBQW1DLFlBQVk7SUFDM0Ms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 },{"./vdom.cjs":2,"tslib":32}],2:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); /// if (typeof FullCalendarVDom === 'undefined') { throw new Error('Please import the top-level fullcalendar lib before attempting to import a plugin.'); } var Component = FullCalendarVDom.Component; var createElement = FullCalendarVDom.createElement; var render = FullCalendarVDom.render; var createRef = FullCalendarVDom.createRef; var Fragment = FullCalendarVDom.Fragment; var createContext = FullCalendarVDom.createContext; var createPortal = FullCalendarVDom.createPortal; var flushSync = FullCalendarVDom.flushSync; var unmountComponentAtNode = FullCalendarVDom.unmountComponentAtNode; /* eslint-enable */ exports.Component = Component; exports.Fragment = Fragment; exports.createContext = createContext; exports.createElement = createElement; exports.createPortal = createPortal; exports.createRef = createRef; exports.flushSync = flushSync; exports.render = render; exports.unmountComponentAtNode = unmountComponentAtNode; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsIkZ1bGxDYWxlbmRhclZEb20iLCJFcnJvciIsIkNvbXBvbmVudCIsImNyZWF0ZUVsZW1lbnQiLCJyZW5kZXIiLCJjcmVhdGVSZWYiLCJGcmFnbWVudCIsImNyZWF0ZUNvbnRleHQiLCJjcmVhdGVQb3J0YWwiLCJmbHVzaFN5bmMiLCJ1bm1vdW50Q29tcG9uZW50QXROb2RlIl0sInNvdXJjZXMiOlsidmRvbS5janMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG4vLy8gPHJlZmVyZW5jZSB0eXBlcz1cIkBmdWxsY2FsZW5kYXIvY29yZS1wcmVhY3RcIiAvPlxuaWYgKHR5cGVvZiBGdWxsQ2FsZW5kYXJWRG9tID09PSAndW5kZWZpbmVkJykge1xuICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIGltcG9ydCB0aGUgdG9wLWxldmVsIGZ1bGxjYWxlbmRhciBsaWIgYmVmb3JlIGF0dGVtcHRpbmcgdG8gaW1wb3J0IGEgcGx1Z2luLicpO1xufVxudmFyIENvbXBvbmVudCA9IEZ1bGxDYWxlbmRhclZEb20uQ29tcG9uZW50O1xudmFyIGNyZWF0ZUVsZW1lbnQgPSBGdWxsQ2FsZW5kYXJWRG9tLmNyZWF0ZUVsZW1lbnQ7XG52YXIgcmVuZGVyID0gRnVsbENhbGVuZGFyVkRvbS5yZW5kZXI7XG52YXIgY3JlYXRlUmVmID0gRnVsbENhbGVuZGFyVkRvbS5jcmVhdGVSZWY7XG52YXIgRnJhZ21lbnQgPSBGdWxsQ2FsZW5kYXJWRG9tLkZyYWdtZW50O1xudmFyIGNyZWF0ZUNvbnRleHQgPSBGdWxsQ2FsZW5kYXJWRG9tLmNyZWF0ZUNvbnRleHQ7XG52YXIgY3JlYXRlUG9ydGFsID0gRnVsbENhbGVuZGFyVkRvbS5jcmVhdGVQb3J0YWw7XG52YXIgZmx1c2hTeW5jID0gRnVsbENhbGVuZGFyVkRvbS5mbHVzaFN5bmM7XG52YXIgdW5tb3VudENvbXBvbmVudEF0Tm9kZSA9IEZ1bGxDYWxlbmRhclZEb20udW5tb3VudENvbXBvbmVudEF0Tm9kZTtcbi8qIGVzbGludC1lbmFibGUgKi9cblxuZXhwb3J0cy5Db21wb25lbnQgPSBDb21wb25lbnQ7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLmNyZWF0ZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0O1xuZXhwb3J0cy5jcmVhdGVFbGVtZW50ID0gY3JlYXRlRWxlbWVudDtcbmV4cG9ydHMuY3JlYXRlUG9ydGFsID0gY3JlYXRlUG9ydGFsO1xuZXhwb3J0cy5jcmVhdGVSZWYgPSBjcmVhdGVSZWY7XG5leHBvcnRzLmZsdXNoU3luYyA9IGZsdXNoU3luYztcbmV4cG9ydHMucmVuZGVyID0gcmVuZGVyO1xuZXhwb3J0cy51bm1vdW50Q29tcG9uZW50QXROb2RlID0gdW5tb3VudENvbXBvbmVudEF0Tm9kZTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUFBLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkMsT0FBdEIsRUFBK0IsWUFBL0IsRUFBNkM7RUFBRUMsS0FBSyxFQUFFO0FBQVQsQ0FBN0MsRSxDQUVBOztBQUNBLElBQUksT0FBT0MsZ0JBQVAsS0FBNEIsV0FBaEMsRUFBNkM7RUFDekMsTUFBTSxJQUFJQyxLQUFKLENBQVUsb0ZBQVYsQ0FBTjtBQUNIOztBQUNELElBQUlDLFNBQVMsR0FBR0YsZ0JBQWdCLENBQUNFLFNBQWpDO0FBQ0EsSUFBSUMsYUFBYSxHQUFHSCxnQkFBZ0IsQ0FBQ0csYUFBckM7QUFDQSxJQUFJQyxNQUFNLEdBQUdKLGdCQUFnQixDQUFDSSxNQUE5QjtBQUNBLElBQUlDLFNBQVMsR0FBR0wsZ0JBQWdCLENBQUNLLFNBQWpDO0FBQ0EsSUFBSUMsUUFBUSxHQUFHTixnQkFBZ0IsQ0FBQ00sUUFBaEM7QUFDQSxJQUFJQyxhQUFhLEdBQUdQLGdCQUFnQixDQUFDTyxhQUFyQztBQUNBLElBQUlDLFlBQVksR0FBR1IsZ0JBQWdCLENBQUNRLFlBQXBDO0FBQ0EsSUFBSUMsU0FBUyxHQUFHVCxnQkFBZ0IsQ0FBQ1MsU0FBakM7QUFDQSxJQUFJQyxzQkFBc0IsR0FBR1YsZ0JBQWdCLENBQUNVLHNCQUE5QztBQUNBOztBQUVBWixPQUFPLENBQUNJLFNBQVIsR0FBb0JBLFNBQXBCO0FBQ0FKLE9BQU8sQ0FBQ1EsUUFBUixHQUFtQkEsUUFBbkI7QUFDQVIsT0FBTyxDQUFDUyxhQUFSLEdBQXdCQSxhQUF4QjtBQUNBVCxPQUFPLENBQUNLLGFBQVIsR0FBd0JBLGFBQXhCO0FBQ0FMLE9BQU8sQ0FBQ1UsWUFBUixHQUF1QkEsWUFBdkI7QUFDQVYsT0FBTyxDQUFDTyxTQUFSLEdBQW9CQSxTQUFwQjtBQUNBUCxPQUFPLENBQUNXLFNBQVIsR0FBb0JBLFNBQXBCO0FBQ0FYLE9BQU8sQ0FBQ00sTUFBUixHQUFpQkEsTUFBakI7QUFDQU4sT0FBTyxDQUFDWSxzQkFBUixHQUFpQ0Esc0JBQWpDIn0= },{}],3:[function(require,module,exports){ /*! FullCalendar v5.11.2 Docs & License: https://fullcalendar.io/ (c) 2022 Adam Shaw */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); require('./vdom.cjs'); var tslib = require('tslib'); var common = require('@fullcalendar/common'); var Calendar = /** @class */ function (_super) { tslib.__extends(Calendar, _super); function Calendar(el, optionOverrides) { if (optionOverrides === void 0) { optionOverrides = {}; } var _this = _super.call(this) || this; _this.isRendering = false; _this.isRendered = false; _this.currentClassNames = []; _this.customContentRenderId = 0; // will affect custom generated classNames? _this.handleAction = function (action) { // actions we know we want to render immediately switch (action.type) { case 'SET_EVENT_DRAG': case 'SET_EVENT_RESIZE': _this.renderRunner.tryDrain(); } }; _this.handleData = function (data) { _this.currentData = data; _this.renderRunner.request(data.calendarOptions.rerenderDelay); }; _this.handleRenderRequest = function () { if (_this.isRendering) { _this.isRendered = true; var currentData_1 = _this.currentData; common.flushSync(function () { common.render(common.createElement(common.CalendarRoot, { options: currentData_1.calendarOptions, theme: currentData_1.theme, emitter: currentData_1.emitter }, function (classNames, height, isHeightAuto, forPrint) { _this.setClassNames(classNames); _this.setHeight(height); return common.createElement(common.CustomContentRenderContext.Provider, { value: _this.customContentRenderId }, common.createElement(common.CalendarContent, tslib.__assign({ isHeightAuto: isHeightAuto, forPrint: forPrint }, currentData_1))); }), _this.el); }); } else if (_this.isRendered) { _this.isRendered = false; common.unmountComponentAtNode(_this.el); _this.setClassNames([]); _this.setHeight(''); } }; _this.el = el; _this.renderRunner = new common.DelayedRunner(_this.handleRenderRequest); new common.CalendarDataManager({ optionOverrides: optionOverrides, calendarApi: _this, onAction: _this.handleAction, onData: _this.handleData }); return _this; } Object.defineProperty(Calendar.prototype, "view", { get: function get() { return this.currentData.viewApi; } // for public API , enumerable: false, configurable: true }); Calendar.prototype.render = function () { var wasRendering = this.isRendering; if (!wasRendering) { this.isRendering = true; } else { this.customContentRenderId += 1; } this.renderRunner.request(); if (wasRendering) { this.updateSize(); } }; Calendar.prototype.destroy = function () { if (this.isRendering) { this.isRendering = false; this.renderRunner.request(); } }; Calendar.prototype.updateSize = function () { var _this = this; common.flushSync(function () { _super.prototype.updateSize.call(_this); }); }; Calendar.prototype.batchRendering = function (func) { this.renderRunner.pause('batchRendering'); func(); this.renderRunner.resume('batchRendering'); }; Calendar.prototype.pauseRendering = function () { this.renderRunner.pause('pauseRendering'); }; Calendar.prototype.resumeRendering = function () { this.renderRunner.resume('pauseRendering', true); }; Calendar.prototype.resetOptions = function (optionOverrides, append) { this.currentDataManager.resetOptions(optionOverrides, append); }; Calendar.prototype.setClassNames = function (classNames) { if (!common.isArraysEqual(classNames, this.currentClassNames)) { var classList = this.el.classList; for (var _i = 0, _a = this.currentClassNames; _i < _a.length; _i++) { var className = _a[_i]; classList.remove(className); } for (var _b = 0, classNames_1 = classNames; _b < classNames_1.length; _b++) { var className = classNames_1[_b]; classList.add(className); } this.currentClassNames = classNames; } }; Calendar.prototype.setHeight = function (height) { common.applyStyleProp(this.el, 'height', height); }; return Calendar; }(common.CalendarApi); exports.Calendar = Calendar; Object.keys(common).forEach(function (k) { if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { enumerable: true, get: function get() { return common[k]; } }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsInJlcXVpcmUiLCJ0c2xpYiIsImNvbW1vbiIsIkNhbGVuZGFyIiwiX3N1cGVyIiwiX19leHRlbmRzIiwiZWwiLCJvcHRpb25PdmVycmlkZXMiLCJfdGhpcyIsImNhbGwiLCJpc1JlbmRlcmluZyIsImlzUmVuZGVyZWQiLCJjdXJyZW50Q2xhc3NOYW1lcyIsImN1c3RvbUNvbnRlbnRSZW5kZXJJZCIsImhhbmRsZUFjdGlvbiIsImFjdGlvbiIsInR5cGUiLCJyZW5kZXJSdW5uZXIiLCJ0cnlEcmFpbiIsImhhbmRsZURhdGEiLCJkYXRhIiwiY3VycmVudERhdGEiLCJyZXF1ZXN0IiwiY2FsZW5kYXJPcHRpb25zIiwicmVyZW5kZXJEZWxheSIsImhhbmRsZVJlbmRlclJlcXVlc3QiLCJjdXJyZW50RGF0YV8xIiwiZmx1c2hTeW5jIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsIkNhbGVuZGFyUm9vdCIsIm9wdGlvbnMiLCJ0aGVtZSIsImVtaXR0ZXIiLCJjbGFzc05hbWVzIiwiaGVpZ2h0IiwiaXNIZWlnaHRBdXRvIiwiZm9yUHJpbnQiLCJzZXRDbGFzc05hbWVzIiwic2V0SGVpZ2h0IiwiQ3VzdG9tQ29udGVudFJlbmRlckNvbnRleHQiLCJQcm92aWRlciIsIkNhbGVuZGFyQ29udGVudCIsIl9fYXNzaWduIiwidW5tb3VudENvbXBvbmVudEF0Tm9kZSIsIkRlbGF5ZWRSdW5uZXIiLCJDYWxlbmRhckRhdGFNYW5hZ2VyIiwiY2FsZW5kYXJBcGkiLCJvbkFjdGlvbiIsIm9uRGF0YSIsInByb3RvdHlwZSIsImdldCIsInZpZXdBcGkiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid2FzUmVuZGVyaW5nIiwidXBkYXRlU2l6ZSIsImRlc3Ryb3kiLCJiYXRjaFJlbmRlcmluZyIsImZ1bmMiLCJwYXVzZSIsInJlc3VtZSIsInBhdXNlUmVuZGVyaW5nIiwicmVzdW1lUmVuZGVyaW5nIiwicmVzZXRPcHRpb25zIiwiYXBwZW5kIiwiY3VycmVudERhdGFNYW5hZ2VyIiwiaXNBcnJheXNFcXVhbCIsImNsYXNzTGlzdCIsIl9pIiwiX2EiLCJsZW5ndGgiLCJjbGFzc05hbWUiLCJyZW1vdmUiLCJfYiIsImNsYXNzTmFtZXNfMSIsImFkZCIsImFwcGx5U3R5bGVQcm9wIiwiQ2FsZW5kYXJBcGkiLCJrZXlzIiwiZm9yRWFjaCIsImsiLCJoYXNPd25Qcm9wZXJ0eSJdLCJzb3VyY2VzIjpbIm1haW4uY2pzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuRnVsbENhbGVuZGFyIHY1LjExLjJcbkRvY3MgJiBMaWNlbnNlOiBodHRwczovL2Z1bGxjYWxlbmRhci5pby9cbihjKSAyMDIyIEFkYW0gU2hhd1xuKi9cbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxucmVxdWlyZSgnLi92ZG9tLmNqcycpO1xudmFyIHRzbGliID0gcmVxdWlyZSgndHNsaWInKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCdAZnVsbGNhbGVuZGFyL2NvbW1vbicpO1xuXG52YXIgQ2FsZW5kYXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKENhbGVuZGFyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENhbGVuZGFyKGVsLCBvcHRpb25PdmVycmlkZXMpIHtcbiAgICAgICAgaWYgKG9wdGlvbk92ZXJyaWRlcyA9PT0gdm9pZCAwKSB7IG9wdGlvbk92ZXJyaWRlcyA9IHt9OyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmlzUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgICAgIF90aGlzLmlzUmVuZGVyZWQgPSBmYWxzZTtcbiAgICAgICAgX3RoaXMuY3VycmVudENsYXNzTmFtZXMgPSBbXTtcbiAgICAgICAgX3RoaXMuY3VzdG9tQ29udGVudFJlbmRlcklkID0gMDsgLy8gd2lsbCBhZmZlY3QgY3VzdG9tIGdlbmVyYXRlZCBjbGFzc05hbWVzP1xuICAgICAgICBfdGhpcy5oYW5kbGVBY3Rpb24gPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgICAgICAvLyBhY3Rpb25zIHdlIGtub3cgd2Ugd2FudCB0byByZW5kZXIgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdTRVRfRVZFTlRfRFJBRyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnU0VUX0VWRU5UX1JFU0laRSc6XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlclJ1bm5lci50cnlEcmFpbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVEYXRhID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIF90aGlzLmN1cnJlbnREYXRhID0gZGF0YTtcbiAgICAgICAgICAgIF90aGlzLnJlbmRlclJ1bm5lci5yZXF1ZXN0KGRhdGEuY2FsZW5kYXJPcHRpb25zLnJlcmVuZGVyRGVsYXkpO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVSZW5kZXJSZXF1ZXN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKF90aGlzLmlzUmVuZGVyaW5nKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuaXNSZW5kZXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnREYXRhXzEgPSBfdGhpcy5jdXJyZW50RGF0YTtcbiAgICAgICAgICAgICAgICBjb21tb24uZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uLnJlbmRlcihjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uQ2FsZW5kYXJSb290LCB7IG9wdGlvbnM6IGN1cnJlbnREYXRhXzEuY2FsZW5kYXJPcHRpb25zLCB0aGVtZTogY3VycmVudERhdGFfMS50aGVtZSwgZW1pdHRlcjogY3VycmVudERhdGFfMS5lbWl0dGVyIH0sIGZ1bmN0aW9uIChjbGFzc05hbWVzLCBoZWlnaHQsIGlzSGVpZ2h0QXV0bywgZm9yUHJpbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnNldENsYXNzTmFtZXMoY2xhc3NOYW1lcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zZXRIZWlnaHQoaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkN1c3RvbUNvbnRlbnRSZW5kZXJDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBfdGhpcy5jdXN0b21Db250ZW50UmVuZGVySWQgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uQ2FsZW5kYXJDb250ZW50LCB0c2xpYi5fX2Fzc2lnbih7IGlzSGVpZ2h0QXV0bzogaXNIZWlnaHRBdXRvLCBmb3JQcmludDogZm9yUHJpbnQgfSwgY3VycmVudERhdGFfMSkpKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pLCBfdGhpcy5lbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChfdGhpcy5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuaXNSZW5kZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbW1vbi51bm1vdW50Q29tcG9uZW50QXROb2RlKF90aGlzLmVsKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5zZXRDbGFzc05hbWVzKFtdKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5zZXRIZWlnaHQoJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5lbCA9IGVsO1xuICAgICAgICBfdGhpcy5yZW5kZXJSdW5uZXIgPSBuZXcgY29tbW9uLkRlbGF5ZWRSdW5uZXIoX3RoaXMuaGFuZGxlUmVuZGVyUmVxdWVzdCk7XG4gICAgICAgIG5ldyBjb21tb24uQ2FsZW5kYXJEYXRhTWFuYWdlcih7XG4gICAgICAgICAgICBvcHRpb25PdmVycmlkZXM6IG9wdGlvbk92ZXJyaWRlcyxcbiAgICAgICAgICAgIGNhbGVuZGFyQXBpOiBfdGhpcyxcbiAgICAgICAgICAgIG9uQWN0aW9uOiBfdGhpcy5oYW5kbGVBY3Rpb24sXG4gICAgICAgICAgICBvbkRhdGE6IF90aGlzLmhhbmRsZURhdGEsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDYWxlbmRhci5wcm90b3R5cGUsIFwidmlld1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5jdXJyZW50RGF0YS52aWV3QXBpOyB9IC8vIGZvciBwdWJsaWMgQVBJXG4gICAgICAgICxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIENhbGVuZGFyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3YXNSZW5kZXJpbmcgPSB0aGlzLmlzUmVuZGVyaW5nO1xuICAgICAgICBpZiAoIXdhc1JlbmRlcmluZykge1xuICAgICAgICAgICAgdGhpcy5pc1JlbmRlcmluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUNvbnRlbnRSZW5kZXJJZCArPSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVuZGVyUnVubmVyLnJlcXVlc3QoKTtcbiAgICAgICAgaWYgKHdhc1JlbmRlcmluZykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENhbGVuZGFyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pc1JlbmRlcmluZykge1xuICAgICAgICAgICAgdGhpcy5pc1JlbmRlcmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJSdW5uZXIucmVxdWVzdCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDYWxlbmRhci5wcm90b3R5cGUudXBkYXRlU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgY29tbW9uLmZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLnVwZGF0ZVNpemUuY2FsbChfdGhpcyk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ2FsZW5kYXIucHJvdG90eXBlLmJhdGNoUmVuZGVyaW5nID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJSdW5uZXIucGF1c2UoJ2JhdGNoUmVuZGVyaW5nJyk7XG4gICAgICAgIGZ1bmMoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJSdW5uZXIucmVzdW1lKCdiYXRjaFJlbmRlcmluZycpO1xuICAgIH07XG4gICAgQ2FsZW5kYXIucHJvdG90eXBlLnBhdXNlUmVuZGVyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJlbmRlclJ1bm5lci5wYXVzZSgncGF1c2VSZW5kZXJpbmcnKTtcbiAgICB9O1xuICAgIENhbGVuZGFyLnByb3RvdHlwZS5yZXN1bWVSZW5kZXJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyUnVubmVyLnJlc3VtZSgncGF1c2VSZW5kZXJpbmcnLCB0cnVlKTtcbiAgICB9O1xuICAgIENhbGVuZGFyLnByb3RvdHlwZS5yZXNldE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9uT3ZlcnJpZGVzLCBhcHBlbmQpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50RGF0YU1hbmFnZXIucmVzZXRPcHRpb25zKG9wdGlvbk92ZXJyaWRlcywgYXBwZW5kKTtcbiAgICB9O1xuICAgIENhbGVuZGFyLnByb3RvdHlwZS5zZXRDbGFzc05hbWVzID0gZnVuY3Rpb24gKGNsYXNzTmFtZXMpIHtcbiAgICAgICAgaWYgKCFjb21tb24uaXNBcnJheXNFcXVhbChjbGFzc05hbWVzLCB0aGlzLmN1cnJlbnRDbGFzc05hbWVzKSkge1xuICAgICAgICAgICAgdmFyIGNsYXNzTGlzdCA9IHRoaXMuZWwuY2xhc3NMaXN0O1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRoaXMuY3VycmVudENsYXNzTmFtZXM7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNsYXNzTmFtZSA9IF9hW19pXTtcbiAgICAgICAgICAgICAgICBjbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBfYiA9IDAsIGNsYXNzTmFtZXNfMSA9IGNsYXNzTmFtZXM7IF9iIDwgY2xhc3NOYW1lc18xLmxlbmd0aDsgX2IrKykge1xuICAgICAgICAgICAgICAgIHZhciBjbGFzc05hbWUgPSBjbGFzc05hbWVzXzFbX2JdO1xuICAgICAgICAgICAgICAgIGNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY3VycmVudENsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDYWxlbmRhci5wcm90b3R5cGUuc2V0SGVpZ2h0ID0gZnVuY3Rpb24gKGhlaWdodCkge1xuICAgICAgICBjb21tb24uYXBwbHlTdHlsZVByb3AodGhpcy5lbCwgJ2hlaWdodCcsIGhlaWdodCk7XG4gICAgfTtcbiAgICByZXR1cm4gQ2FsZW5kYXI7XG59KGNvbW1vbi5DYWxlbmRhckFwaSkpO1xuXG5leHBvcnRzLkNhbGVuZGFyID0gQ2FsZW5kYXI7XG5PYmplY3Qua2V5cyhjb21tb24pLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICBpZiAoayAhPT0gJ2RlZmF1bHQnICYmICFleHBvcnRzLmhhc093blByb3BlcnR5KGspKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgaywge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21tb25ba107XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUFBLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkMsT0FBdEIsRUFBK0IsWUFBL0IsRUFBNkM7RUFBRUMsS0FBSyxFQUFFO0FBQVQsQ0FBN0M7O0FBRUFDLE9BQU8sQ0FBQyxZQUFELENBQVA7O0FBQ0EsSUFBSUMsS0FBSyxHQUFHRCxPQUFPLENBQUMsT0FBRCxDQUFuQjs7QUFDQSxJQUFJRSxNQUFNLEdBQUdGLE9BQU8sQ0FBQyxzQkFBRCxDQUFwQjs7QUFFQSxJQUFJRyxRQUFRO0FBQUc7QUFBZSxVQUFVQyxNQUFWLEVBQWtCO0VBQzVDSCxLQUFLLENBQUNJLFNBQU4sQ0FBZ0JGLFFBQWhCLEVBQTBCQyxNQUExQjs7RUFDQSxTQUFTRCxRQUFULENBQWtCRyxFQUFsQixFQUFzQkMsZUFBdEIsRUFBdUM7SUFDbkMsSUFBSUEsZUFBZSxLQUFLLEtBQUssQ0FBN0IsRUFBZ0M7TUFBRUEsZUFBZSxHQUFHLEVBQWxCO0lBQXVCOztJQUN6RCxJQUFJQyxLQUFLLEdBQUdKLE1BQU0sQ0FBQ0ssSUFBUCxDQUFZLElBQVosS0FBcUIsSUFBakM7O0lBQ0FELEtBQUssQ0FBQ0UsV0FBTixHQUFvQixLQUFwQjtJQUNBRixLQUFLLENBQUNHLFVBQU4sR0FBbUIsS0FBbkI7SUFDQUgsS0FBSyxDQUFDSSxpQkFBTixHQUEwQixFQUExQjtJQUNBSixLQUFLLENBQUNLLHFCQUFOLEdBQThCLENBQTlCLENBTm1D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 },{"./vdom.cjs":4,"@fullcalendar/common":1,"tslib":32}],4:[function(require,module,exports){ 'use strict'; var tslib = require('tslib'); var preact = require('preact'); var preactCompat = require('preact/compat'); function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty(n, k, d.get ? d : { enumerable: true, get: function get() { return e[k]; } }); } }); } n['default'] = e; return Object.freeze(n); } var preact__namespace = /*#__PURE__*/_interopNamespace(preact); var preactCompat__namespace = /*#__PURE__*/_interopNamespace(preactCompat); var globalObj = typeof globalThis !== 'undefined' ? globalThis : window; // // TODO: streamline when killing IE11 support if (globalObj.FullCalendarVDom) { console.warn('FullCalendar VDOM already loaded'); } else { globalObj.FullCalendarVDom = { Component: preact__namespace.Component, createElement: preact__namespace.createElement, render: preact__namespace.render, createRef: preact__namespace.createRef, Fragment: preact__namespace.Fragment, createContext: createContext, createPortal: preactCompat__namespace.createPortal, flushSync: flushSync, unmountComponentAtNode: unmountComponentAtNode }; } // HACKS... // TODO: lock version // TODO: link gh issues function flushSync(runBeforeFlush) { runBeforeFlush(); var oldDebounceRendering = preact__namespace.options.debounceRendering; // orig var callbackQ = []; function execCallbackSync(callback) { callbackQ.push(callback); } preact__namespace.options.debounceRendering = execCallbackSync; preact__namespace.render(preact__namespace.createElement(FakeComponent, {}), document.createElement('div')); while (callbackQ.length) { callbackQ.shift()(); } preact__namespace.options.debounceRendering = oldDebounceRendering; } var FakeComponent = /** @class */ function (_super) { tslib.__extends(FakeComponent, _super); function FakeComponent() { return _super !== null && _super.apply(this, arguments) || this; } FakeComponent.prototype.render = function () { return preact__namespace.createElement('div', {}); }; FakeComponent.prototype.componentDidMount = function () { this.setState({}); }; return FakeComponent; }(preact__namespace.Component); function createContext(defaultValue) { var ContextType = preact__namespace.createContext(defaultValue); var origProvider = ContextType.Provider; ContextType.Provider = function () { var _this = this; var isNew = !this.getChildContext; var children = origProvider.apply(this, arguments); // eslint-disable-line prefer-rest-params if (isNew) { var subs_1 = []; this.shouldComponentUpdate = function (_props) { if (_this.props.value !== _props.value) { subs_1.forEach(function (c) { c.context = _props.value; c.forceUpdate(); }); } }; this.sub = function (c) { subs_1.push(c); var old = c.componentWillUnmount; c.componentWillUnmount = function () { subs_1.splice(subs_1.indexOf(c), 1); old && old.call(c); }; }; } return children; }; return ContextType; } function unmountComponentAtNode(node) { preact__namespace.render(null, node); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0c2xpYiIsInJlcXVpcmUiLCJwcmVhY3QiLCJwcmVhY3RDb21wYXQiLCJfaW50ZXJvcE5hbWVzcGFjZSIsImUiLCJfX2VzTW9kdWxlIiwibiIsIk9iamVjdCIsImNyZWF0ZSIsImtleXMiLCJmb3JFYWNoIiwiayIsImQiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJkZWZpbmVQcm9wZXJ0eSIsImdldCIsImVudW1lcmFibGUiLCJmcmVlemUiLCJwcmVhY3RfX25hbWVzcGFjZSIsInByZWFjdENvbXBhdF9fbmFtZXNwYWNlIiwiZ2xvYmFsT2JqIiwiZ2xvYmFsVGhpcyIsIndpbmRvdyIsIkZ1bGxDYWxlbmRhclZEb20iLCJjb25zb2xlIiwid2FybiIsIkNvbXBvbmVudCIsImNyZWF0ZUVsZW1lbnQiLCJyZW5kZXIiLCJjcmVhdGVSZWYiLCJGcmFnbWVudCIsImNyZWF0ZUNvbnRleHQiLCJjcmVhdGVQb3J0YWwiLCJmbHVzaFN5bmMiLCJ1bm1vdW50Q29tcG9uZW50QXROb2RlIiwicnVuQmVmb3JlRmx1c2giLCJvbGREZWJvdW5jZVJlbmRlcmluZyIsIm9wdGlvbnMiLCJkZWJvdW5jZVJlbmRlcmluZyIsImNhbGxiYWNrUSIsImV4ZWNDYWxsYmFja1N5bmMiLCJjYWxsYmFjayIsInB1c2giLCJGYWtlQ29tcG9uZW50IiwiZG9jdW1lbnQiLCJsZW5ndGgiLCJzaGlmdCIsIl9zdXBlciIsIl9fZXh0ZW5kcyIsImFwcGx5IiwiYXJndW1lbnRzIiwicHJvdG90eXBlIiwiY29tcG9uZW50RGlkTW91bnQiLCJzZXRTdGF0ZSIsImRlZmF1bHRWYWx1ZSIsIkNvbnRleHRUeXBlIiwib3JpZ1Byb3ZpZGVyIiwiUHJvdmlkZXIiLCJfdGhpcyIsImlzTmV3IiwiZ2V0Q2hpbGRDb250ZXh0IiwiY2hpbGRyZW4iLCJzdWJzXzEiLCJzaG91bGRDb21wb25lbnRVcGRhdGUiLCJfcHJvcHMiLCJwcm9wcyIsInZhbHVlIiwiYyIsImNvbnRleHQiLCJmb3JjZVVwZGF0ZSIsInN1YiIsIm9sZCIsImNvbXBvbmVudFdpbGxVbm1vdW50Iiwic3BsaWNlIiwiaW5kZXhPZiIsImNhbGwiLCJub2RlIl0sInNvdXJjZXMiOlsidmRvbS5janMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdHNsaWIgPSByZXF1aXJlKCd0c2xpYicpO1xudmFyIHByZWFjdCA9IHJlcXVpcmUoJ3ByZWFjdCcpO1xudmFyIHByZWFjdENvbXBhdCA9IHJlcXVpcmUoJ3ByZWFjdC9jb21wYXQnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BOYW1lc3BhY2UoZSkge1xuICAgIGlmIChlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgdmFyIG4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGlmIChlKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICAgIGlmIChrICE9PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICB2YXIgZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgayk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIGssIGQuZ2V0ID8gZCA6IHtcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtrXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgblsnZGVmYXVsdCddID0gZTtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShuKTtcbn1cblxudmFyIHByZWFjdF9fbmFtZXNwYWNlID0gLyojX19QVVJFX18qL19pbnRlcm9wTmFtZXNwYWNlKHByZWFjdCk7XG52YXIgcHJlYWN0Q29tcGF0X19uYW1lc3BhY2UgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BOYW1lc3BhY2UocHJlYWN0Q29tcGF0KTtcblxudmFyIGdsb2JhbE9iaiA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB3aW5kb3c7IC8vIC8vIFRPRE86IHN0cmVhbWxpbmUgd2hlbiBraWxsaW5nIElFMTEgc3VwcG9ydFxuaWYgKGdsb2JhbE9iai5GdWxsQ2FsZW5kYXJWRG9tKSB7XG4gICAgY29uc29sZS53YXJuKCdGdWxsQ2FsZW5kYXIgVkRPTSBhbHJlYWR5IGxvYWRlZCcpO1xufVxuZWxzZSB7XG4gICAgZ2xvYmFsT2JqLkZ1bGxDYWxlbmRhclZEb20gPSB7XG4gICAgICAgIENvbXBvbmVudDogcHJlYWN0X19uYW1lc3BhY2UuQ29tcG9uZW50LFxuICAgICAgICBjcmVhdGVFbGVtZW50OiBwcmVhY3RfX25hbWVzcGFjZS5jcmVhdGVFbGVtZW50LFxuICAgICAgICByZW5kZXI6IHByZWFjdF9fbmFtZXNwYWNlLnJlbmRlcixcbiAgICAgICAgY3JlYXRlUmVmOiBwcmVhY3RfX25hbWVzcGFjZS5jcmVhdGVSZWYsXG4gICAgICAgIEZyYWdtZW50OiBwcmVhY3RfX25hbWVzcGFjZS5GcmFnbWVudCxcbiAgICAgICAgY3JlYXRlQ29udGV4dDogY3JlYXRlQ29udGV4dCxcbiAgICAgICAgY3JlYXRlUG9ydGFsOiBwcmVhY3RDb21wYXRfX25hbWVzcGFjZS5jcmVhdGVQb3J0YWwsXG4gICAgICAgIGZsdXNoU3luYzogZmx1c2hTeW5jLFxuICAgICAgICB1bm1vdW50Q29tcG9uZW50QXROb2RlOiB1bm1vdW50Q29tcG9uZW50QXROb2RlLFxuICAgIH07XG59XG4vLyBIQUNLUy4uLlxuLy8gVE9ETzogbG9jayB2ZXJzaW9uXG4vLyBUT0RPOiBsaW5rIGdoIGlzc3Vlc1xuZnVuY3Rpb24gZmx1c2hTeW5jKHJ1bkJlZm9yZUZsdXNoKSB7XG4gICAgcnVuQmVmb3JlRmx1c2goKTtcbiAgICB2YXIgb2xkRGVib3VuY2VSZW5kZXJpbmcgPSBwcmVhY3RfX25hbWVzcGFjZS5vcHRpb25zLmRlYm91bmNlUmVuZGVyaW5nOyAvLyBvcmlnXG4gICAgdmFyIGNhbGxiYWNrUSA9IFtdO1xuICAgIGZ1bmN0aW9uIGV4ZWNDYWxsYmFja1N5bmMoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2tRLnB1c2goY2FsbGJhY2spO1xuICAgIH1cbiAgICBwcmVhY3RfX25hbWVzcGFjZS5vcHRpb25zLmRlYm91bmNlUmVuZGVyaW5nID0gZXhlY0NhbGxiYWNrU3luYztcbiAgICBwcmVhY3RfX25hbWVzcGFjZS5yZW5kZXIocHJlYWN0X19uYW1lc3BhY2UuY3JlYXRlRWxlbWVudChGYWtlQ29tcG9uZW50LCB7fSksIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcbiAgICB3aGlsZSAoY2FsbGJhY2tRLmxlbmd0aCkge1xuICAgICAgICBjYWxsYmFja1Euc2hpZnQoKSgpO1xuICAgIH1cbiAgICBwcmVhY3RfX25hbWVzcGFjZS5vcHRpb25zLmRlYm91bmNlUmVuZGVyaW5nID0gb2xkRGVib3VuY2VSZW5kZXJpbmc7XG59XG52YXIgRmFrZUNvbXBvbmVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoRmFrZUNvbXBvbmVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBGYWtlQ29tcG9uZW50KCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIEZha2VDb21wb25lbnQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHByZWFjdF9fbmFtZXNwYWNlLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHt9KTsgfTtcbiAgICBGYWtlQ29tcG9uZW50LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5zZXRTdGF0ZSh7fSk7IH07XG4gICAgcmV0dXJuIEZha2VDb21wb25lbnQ7XG59KHByZWFjdF9fbmFtZXNwYWNlLkNvbXBvbmVudCkpO1xuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChkZWZhdWx0VmFsdWUpIHtcbiAgICB2YXIgQ29udGV4dFR5cGUgPSBwcmVhY3RfX25hbWVzcGFjZS5jcmVhdGVDb250ZXh0KGRlZmF1bHRWYWx1ZSk7XG4gICAgdmFyIG9yaWdQcm92aWRlciA9IENvbnRleHRUeXBlLlByb3ZpZGVyO1xuICAgIENvbnRleHRUeXBlLlByb3ZpZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgaXNOZXcgPSAhdGhpcy5nZXRDaGlsZENvbnRleHQ7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IG9yaWdQcm92aWRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICAgICAgICBpZiAoaXNOZXcpIHtcbiAgICAgICAgICAgIHZhciBzdWJzXzEgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24gKF9wcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5wcm9wcy52YWx1ZSAhPT0gX3Byb3BzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNfMS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmNvbnRleHQgPSBfcHJvcHMudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmZvcmNlVXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnN1YiA9IGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICAgICAgc3Vic18xLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgdmFyIG9sZCA9IGMuY29tcG9uZW50V2lsbFVubW91bnQ7XG4gICAgICAgICAgICAgICAgYy5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgc3Vic18xLnNwbGljZShzdWJzXzEuaW5kZXhPZihjKSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIG9sZCAmJiBvbGQuY2FsbChjKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgfTtcbiAgICByZXR1cm4gQ29udGV4dFR5cGU7XG59XG5mdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50QXROb2RlKG5vZGUpIHtcbiAgICBwcmVhY3RfX25hbWVzcGFjZS5yZW5kZXIobnVsbCwgbm9kZSk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBLElBQUlBLEtBQUssR0FBR0MsT0FBTyxDQUFDLE9BQUQsQ0FBbkI7O0FBQ0EsSUFBSUMsTUFBTSxHQUFHRCxPQUFPLENBQUMsUUFBRCxDQUFwQjs7QUFDQSxJQUFJRSxZQUFZLEdBQUdGLE9BQU8sQ0FBQyxlQUFELENBQTFCOztBQUVBLFNBQVNHLGlCQUFULENBQTJCQyxDQUEzQixFQUE4QjtFQUMxQixJQUFJQSxDQUFDLElBQUlBLENBQUMsQ0FBQ0MsVUFBWCxFQUF1QixPQUFPRCxDQUFQO0VBQ3ZCLElBQUlFLENBQUMsR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQWMsSUFBZCxDQUFSOztFQUNBLElBQUlKLENBQUosRUFBTztJQUNIRyxNQUFNLENBQUNFLElBQVAsQ0FBWUwsQ0FBWixFQUFlTSxPQUFmLENBQXVCLFVBQVVDLENBQVYsRUFBYTtNQUNoQyxJQUFJQSxDQUFDLEtBQUssU0FBVixFQUFxQjtRQUNqQixJQUFJQyxDQUFDLEdBQUdMLE1BQU0sQ0FBQ00sd0JBQVAsQ0FBZ0NULENBQWhDLEVBQW1DTyxDQUFuQyxDQUFSO1FBQ0FKLE1B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 },{"preact":29,"preact/compat":28,"tslib":32}],5:[function(require,module,exports){ /*! FullCalendar v5.11.2 Docs & License: https://fullcalendar.io/ (c) 2022 Adam Shaw */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var common = require('@fullcalendar/common'); var tslib = require('tslib'); ; /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells. ----------------------------------------------------------------------------------------------------------------------*/ // It is a manager for a Table subcomponent, which does most of the heavy lifting. // It is responsible for managing width/height. var TableView = /** @class */ function (_super) { tslib.__extends(TableView, _super); function TableView() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.headerElRef = common.createRef(); return _this; } TableView.prototype.renderSimpleLayout = function (headerRowContent, bodyContent) { var _a = this, props = _a.props, context = _a.context; var sections = []; var stickyHeaderDates = common.getStickyHeaderDates(context.options); if (headerRowContent) { sections.push({ type: 'header', key: 'header', isSticky: stickyHeaderDates, chunk: { elRef: this.headerElRef, tableClassName: 'fc-col-header', rowContent: headerRowContent } }); } sections.push({ type: 'body', key: 'body', liquid: true, chunk: { content: bodyContent } }); return common.createElement(common.ViewRoot, { viewSpec: context.viewSpec }, function (rootElRef, classNames) { return common.createElement("div", { ref: rootElRef, className: ['fc-daygrid'].concat(classNames).join(' ') }, common.createElement(common.SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [] /* TODO: make optional? */ , sections: sections })); }); }; TableView.prototype.renderHScrollLayout = function (headerRowContent, bodyContent, colCnt, dayMinWidth) { var ScrollGrid = this.context.pluginHooks.scrollGridImpl; if (!ScrollGrid) { throw new Error('No ScrollGrid implementation'); } var _a = this, props = _a.props, context = _a.context; var stickyHeaderDates = !props.forPrint && common.getStickyHeaderDates(context.options); var stickyFooterScrollbar = !props.forPrint && common.getStickyFooterScrollbar(context.options); var sections = []; if (headerRowContent) { sections.push({ type: 'header', key: 'header', isSticky: stickyHeaderDates, chunks: [{ key: 'main', elRef: this.headerElRef, tableClassName: 'fc-col-header', rowContent: headerRowContent }] }); } sections.push({ type: 'body', key: 'body', liquid: true, chunks: [{ key: 'main', content: bodyContent }] }); if (stickyFooterScrollbar) { sections.push({ type: 'footer', key: 'footer', isSticky: true, chunks: [{ key: 'main', content: common.renderScrollShim }] }); } return common.createElement(common.ViewRoot, { viewSpec: context.viewSpec }, function (rootElRef, classNames) { return common.createElement("div", { ref: rootElRef, className: ['fc-daygrid'].concat(classNames).join(' ') }, common.createElement(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, colGroups: [{ cols: [{ span: colCnt, minWidth: dayMinWidth }] }], sections: sections })); }); }; return TableView; }(common.DateComponent); function splitSegsByRow(segs, rowCnt) { var byRow = []; for (var i = 0; i < rowCnt; i += 1) { byRow[i] = []; } for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) { var seg = segs_1[_i]; byRow[seg.row].push(seg); } return byRow; } function splitSegsByFirstCol(segs, colCnt) { var byCol = []; for (var i = 0; i < colCnt; i += 1) { byCol[i] = []; } for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) { var seg = segs_2[_i]; byCol[seg.firstCol].push(seg); } return byCol; } function splitInteractionByRow(ui, rowCnt) { var byRow = []; if (!ui) { for (var i = 0; i < rowCnt; i += 1) { byRow[i] = null; } } else { for (var i = 0; i < rowCnt; i += 1) { byRow[i] = { affectedInstances: ui.affectedInstances, isEvent: ui.isEvent, segs: [] }; } for (var _i = 0, _a = ui.segs; _i < _a.length; _i++) { var seg = _a[_i]; byRow[seg.row].segs.push(seg); } } return byRow; } var TableCellTop = /** @class */ function (_super) { tslib.__extends(TableCellTop, _super); function TableCellTop() { return _super !== null && _super.apply(this, arguments) || this; } TableCellTop.prototype.render = function () { var props = this.props; var navLinkAttrs = common.buildNavLinkAttrs(this.context, props.date); return common.createElement(common.DayCellContent, { date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, extraHookProps: props.extraHookProps, defaultContent: renderTopInner }, function (innerElRef, innerContent) { return (innerContent || props.forceDayTop) && common.createElement("div", { className: "fc-daygrid-day-top", ref: innerElRef }, common.createElement("a", tslib.__assign({ id: props.dayNumberId, className: "fc-daygrid-day-number" }, navLinkAttrs), innerContent || common.createElement(common.Fragment, null, "\xA0"))); }); }; return TableCellTop; }(common.BaseComponent); function renderTopInner(props) { return props.dayNumberText; } var DEFAULT_TABLE_EVENT_TIME_FORMAT = common.createFormatter({ hour: 'numeric', minute: '2-digit', omitZeroMinute: true, meridiem: 'narrow' }); function hasListItemDisplay(seg) { var display = seg.eventRange.ui.display; return display === 'list-item' || display === 'auto' && !seg.eventRange.def.allDay && seg.firstCol === seg.lastCol && // can't be multi-day seg.isStart && // " seg.isEnd // " ; } var TableBlockEvent = /** @class */ function (_super) { tslib.__extends(TableBlockEvent, _super); function TableBlockEvent() { return _super !== null && _super.apply(this, arguments) || this; } TableBlockEvent.prototype.render = function () { var props = this.props; return common.createElement(common.StandardEvent, tslib.__assign({}, props, { extraClassNames: ['fc-daygrid-event', 'fc-daygrid-block-event', 'fc-h-event'], defaultTimeFormat: DEFAULT_TABLE_EVENT_TIME_FORMAT, defaultDisplayEventEnd: props.defaultDisplayEventEnd, disableResizing: !props.seg.eventRange.def.allDay })); }; return TableBlockEvent; }(common.BaseComponent); var TableListItemEvent = /** @class */ function (_super) { tslib.__extends(TableListItemEvent, _super); function TableListItemEvent() { return _super !== null && _super.apply(this, arguments) || this; } TableListItemEvent.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; var timeFormat = context.options.eventTimeFormat || DEFAULT_TABLE_EVENT_TIME_FORMAT; var timeText = common.buildSegTimeText(props.seg, timeFormat, context, true, props.defaultDisplayEventEnd); return common.createElement(common.EventRoot, { seg: props.seg, timeText: timeText, defaultContent: renderInnerContent, isDragging: props.isDragging, isResizing: false, isDateSelecting: false, isSelected: props.isSelected, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday }, function (rootElRef, classNames, innerElRef, innerContent) { return (// we don't use styles! common.createElement("a", tslib.__assign({ className: ['fc-daygrid-event', 'fc-daygrid-dot-event'].concat(classNames).join(' '), ref: rootElRef }, common.getSegAnchorAttrs(props.seg, context)), innerContent) ); }); }; return TableListItemEvent; }(common.BaseComponent); function renderInnerContent(innerProps) { return common.createElement(common.Fragment, null, common.createElement("div", { className: "fc-daygrid-event-dot", style: { borderColor: innerProps.borderColor || innerProps.backgroundColor } }), innerProps.timeText && common.createElement("div", { className: "fc-event-time" }, innerProps.timeText), common.createElement("div", { className: "fc-event-title" }, innerProps.event.title || common.createElement(common.Fragment, null, "\xA0"))); } var TableCellMoreLink = /** @class */ function (_super) { tslib.__extends(TableCellMoreLink, _super); function TableCellMoreLink() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.compileSegs = common.memoize(compileSegs); return _this; } TableCellMoreLink.prototype.render = function () { var props = this.props; var _a = this.compileSegs(props.singlePlacements), allSegs = _a.allSegs, invisibleSegs = _a.invisibleSegs; return common.createElement(common.MoreLinkRoot, { dateProfile: props.dateProfile, todayRange: props.todayRange, allDayDate: props.allDayDate, moreCnt: props.moreCnt, allSegs: allSegs, hiddenSegs: invisibleSegs, alignmentElRef: props.alignmentElRef, alignGridTop: props.alignGridTop, extraDateSpan: props.extraDateSpan, popoverContent: function popoverContent() { var isForcedInvisible = (props.eventDrag ? props.eventDrag.affectedInstances : null) || (props.eventResize ? props.eventResize.affectedInstances : null) || {}; return common.createElement(common.Fragment, null, allSegs.map(function (seg) { var instanceId = seg.eventRange.instance.instanceId; return common.createElement("div", { className: "fc-daygrid-event-harness", key: instanceId, style: { visibility: isForcedInvisible[instanceId] ? 'hidden' : '' } }, hasListItemDisplay(seg) ? common.createElement(TableListItemEvent, tslib.__assign({ seg: seg, isDragging: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, common.getSegMeta(seg, props.todayRange))) : common.createElement(TableBlockEvent, tslib.__assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, common.getSegMeta(seg, props.todayRange)))); })); } }, function (rootElRef, classNames, innerElRef, innerContent, handleClick, title, isExpanded, popoverId) { return common.createElement("a", tslib.__assign({ ref: rootElRef, className: ['fc-daygrid-more-link'].concat(classNames).join(' '), title: title, "aria-expanded": isExpanded, "aria-controls": popoverId }, common.createAriaClickAttrs(handleClick)), innerContent); }); }; return TableCellMoreLink; }(common.BaseComponent); function compileSegs(singlePlacements) { var allSegs = []; var invisibleSegs = []; for (var _i = 0, singlePlacements_1 = singlePlacements; _i < singlePlacements_1.length; _i++) { var placement = singlePlacements_1[_i]; allSegs.push(placement.seg); if (!placement.isVisible) { invisibleSegs.push(placement.seg); } } return { allSegs: allSegs, invisibleSegs: invisibleSegs }; } var DEFAULT_WEEK_NUM_FORMAT = common.createFormatter({ week: 'narrow' }); var TableCell = /** @class */ function (_super) { tslib.__extends(TableCell, _super); function TableCell() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.rootElRef = common.createRef(); _this.state = { dayNumberId: common.getUniqueDomId() }; _this.handleRootEl = function (el) { common.setRef(_this.rootElRef, el); common.setRef(_this.props.elRef, el); }; return _this; } TableCell.prototype.render = function () { var _a = this, context = _a.context, props = _a.props, state = _a.state, rootElRef = _a.rootElRef; var date = props.date, dateProfile = props.dateProfile; var navLinkAttrs = common.buildNavLinkAttrs(context, date, 'week'); return common.createElement(common.DayCellRoot, { date: date, dateProfile: dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, extraHookProps: props.extraHookProps, elRef: this.handleRootEl }, function (dayElRef, dayClassNames, rootDataAttrs, isDisabled) { return common.createElement("td", tslib.__assign({ ref: dayElRef, role: "gridcell", className: ['fc-daygrid-day'].concat(dayClassNames, props.extraClassNames || []).join(' ') }, rootDataAttrs, props.extraDataAttrs, props.showDayNumber ? { 'aria-labelledby': state.dayNumberId } : {}), common.createElement("div", { className: "fc-daygrid-day-frame fc-scrollgrid-sync-inner", ref: props.innerElRef /* different from hook system! RENAME */ }, props.showWeekNumber && common.createElement(common.WeekNumberRoot, { date: date, defaultFormat: DEFAULT_WEEK_NUM_FORMAT }, function (weekElRef, weekClassNames, innerElRef, innerContent) { return common.createElement("a", tslib.__assign({ ref: weekElRef, className: ['fc-daygrid-week-number'].concat(weekClassNames).join(' ') }, navLinkAttrs), innerContent); }), !isDisabled && common.createElement(TableCellTop, { date: date, dateProfile: dateProfile, showDayNumber: props.showDayNumber, dayNumberId: state.dayNumberId, forceDayTop: props.forceDayTop, todayRange: props.todayRange, extraHookProps: props.extraHookProps }), common.createElement("div", { className: "fc-daygrid-day-events", ref: props.fgContentElRef }, props.fgContent, common.createElement("div", { className: "fc-daygrid-day-bottom", style: { marginTop: props.moreMarginTop } }, common.createElement(TableCellMoreLink, { allDayDate: date, singlePlacements: props.singlePlacements, moreCnt: props.moreCnt, alignmentElRef: rootElRef, alignGridTop: !props.showDayNumber, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange }))), common.createElement("div", { className: "fc-daygrid-day-bg" }, props.bgContent))); }); }; return TableCell; }(common.DateComponent); function computeFgSegPlacement(segs, // assumed already sorted dayMaxEvents, dayMaxEventRows, strictOrder, eventInstanceHeights, maxContentHeight, cells) { var hierarchy = new DayGridSegHierarchy(); hierarchy.allowReslicing = true; hierarchy.strictOrder = strictOrder; if (dayMaxEvents === true || dayMaxEventRows === true) { hierarchy.maxCoord = maxContentHeight; hierarchy.hiddenConsumes = true; } else if (typeof dayMaxEvents === 'number') { hierarchy.maxStackCnt = dayMaxEvents; } else if (typeof dayMaxEventRows === 'number') { hierarchy.maxStackCnt = dayMaxEventRows; hierarchy.hiddenConsumes = true; } // create segInputs only for segs with known heights var segInputs = []; var unknownHeightSegs = []; for (var i = 0; i < segs.length; i += 1) { var seg = segs[i]; var instanceId = seg.eventRange.instance.instanceId; var eventHeight = eventInstanceHeights[instanceId]; if (eventHeight != null) { segInputs.push({ index: i, thickness: eventHeight, span: { start: seg.firstCol, end: seg.lastCol + 1 } }); } else { unknownHeightSegs.push(seg); } } var hiddenEntries = hierarchy.addSegs(segInputs); var segRects = hierarchy.toRects(); var _a = placeRects(segRects, segs, cells), singleColPlacements = _a.singleColPlacements, multiColPlacements = _a.multiColPlacements, leftoverMargins = _a.leftoverMargins; var moreCnts = []; var moreMarginTops = []; // add segs with unknown heights for (var _i = 0, unknownHeightSegs_1 = unknownHeightSegs; _i < unknownHeightSegs_1.length; _i++) { var seg = unknownHeightSegs_1[_i]; multiColPlacements[seg.firstCol].push({ seg: seg, isVisible: false, isAbsolute: true, absoluteTop: 0, marginTop: 0 }); for (var col = seg.firstCol; col <= seg.lastCol; col += 1) { singleColPlacements[col].push({ seg: resliceSeg(seg, col, col + 1, cells), isVisible: false, isAbsolute: false, absoluteTop: 0, marginTop: 0 }); } } // add the hidden entries for (var col = 0; col < cells.length; col += 1) { moreCnts.push(0); } for (var _b = 0, hiddenEntries_1 = hiddenEntries; _b < hiddenEntries_1.length; _b++) { var hiddenEntry = hiddenEntries_1[_b]; var seg = segs[hiddenEntry.index]; var hiddenSpan = hiddenEntry.span; multiColPlacements[hiddenSpan.start].push({ seg: resliceSeg(seg, hiddenSpan.start, hiddenSpan.end, cells), isVisible: false, isAbsolute: true, absoluteTop: 0, marginTop: 0 }); for (var col = hiddenSpan.start; col < hiddenSpan.end; col += 1) { moreCnts[col] += 1; singleColPlacements[col].push({ seg: resliceSeg(seg, col, col + 1, cells), isVisible: false, isAbsolute: false, absoluteTop: 0, marginTop: 0 }); } } // deal with leftover margins for (var col = 0; col < cells.length; col += 1) { moreMarginTops.push(leftoverMargins[col]); } return { singleColPlacements: singleColPlacements, multiColPlacements: multiColPlacements, moreCnts: moreCnts, moreMarginTops: moreMarginTops }; } // rects ordered by top coord, then left function placeRects(allRects, segs, cells) { var rectsByEachCol = groupRectsByEachCol(allRects, cells.length); var singleColPlacements = []; var multiColPlacements = []; var leftoverMargins = []; for (var col = 0; col < cells.length; col += 1) { var rects = rectsByEachCol[col]; // compute all static segs in singlePlacements var singlePlacements = []; var currentHeight = 0; var currentMarginTop = 0; for (var _i = 0, rects_1 = rects; _i < rects_1.length; _i++) { var rect = rects_1[_i]; var seg = segs[rect.index]; singlePlacements.push({ seg: resliceSeg(seg, col, col + 1, cells), isVisible: true, isAbsolute: false, absoluteTop: rect.levelCoord, marginTop: rect.levelCoord - currentHeight }); currentHeight = rect.levelCoord + rect.thickness; } // compute mixed static/absolute segs in multiPlacements var multiPlacements = []; currentHeight = 0; currentMarginTop = 0; for (var _a = 0, rects_2 = rects; _a < rects_2.length; _a++) { var rect = rects_2[_a]; var seg = segs[rect.index]; var isAbsolute = rect.span.end - rect.span.start > 1; // multi-column? var isFirstCol = rect.span.start === col; currentMarginTop += rect.levelCoord - currentHeight; // amount of space since bottom of previous seg currentHeight = rect.levelCoord + rect.thickness; // height will now be bottom of current seg if (isAbsolute) { currentMarginTop += rect.thickness; if (isFirstCol) { multiPlacements.push({ seg: resliceSeg(seg, rect.span.start, rect.span.end, cells), isVisible: true, isAbsolute: true, absoluteTop: rect.levelCoord, marginTop: 0 }); } } else if (isFirstCol) { multiPlacements.push({ seg: resliceSeg(seg, rect.span.start, rect.span.end, cells), isVisible: true, isAbsolute: false, absoluteTop: rect.levelCoord, marginTop: currentMarginTop // claim the margin }); currentMarginTop = 0; } } singleColPlacements.push(singlePlacements); multiColPlacements.push(multiPlacements); leftoverMargins.push(currentMarginTop); } return { singleColPlacements: singleColPlacements, multiColPlacements: multiColPlacements, leftoverMargins: leftoverMargins }; } function groupRectsByEachCol(rects, colCnt) { var rectsByEachCol = []; for (var col = 0; col < colCnt; col += 1) { rectsByEachCol.push([]); } for (var _i = 0, rects_3 = rects; _i < rects_3.length; _i++) { var rect = rects_3[_i]; for (var col = rect.span.start; col < rect.span.end; col += 1) { rectsByEachCol[col].push(rect); } } return rectsByEachCol; } function resliceSeg(seg, spanStart, spanEnd, cells) { if (seg.firstCol === spanStart && seg.lastCol === spanEnd - 1) { return seg; } var eventRange = seg.eventRange; var origRange = eventRange.range; var slicedRange = common.intersectRanges(origRange, { start: cells[spanStart].date, end: common.addDays(cells[spanEnd - 1].date, 1) }); return tslib.__assign(tslib.__assign({}, seg), { firstCol: spanStart, lastCol: spanEnd - 1, eventRange: { def: eventRange.def, ui: tslib.__assign(tslib.__assign({}, eventRange.ui), { durationEditable: false }), instance: eventRange.instance, range: slicedRange }, isStart: seg.isStart && slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd && slicedRange.end.valueOf() === origRange.end.valueOf() }); } var DayGridSegHierarchy = /** @class */ function (_super) { tslib.__extends(DayGridSegHierarchy, _super); function DayGridSegHierarchy() { var _this = _super !== null && _super.apply(this, arguments) || this; // config _this.hiddenConsumes = false; // allows us to keep hidden entries in the hierarchy so they take up space _this.forceHidden = {}; return _this; } DayGridSegHierarchy.prototype.addSegs = function (segInputs) { var _this = this; var hiddenSegs = _super.prototype.addSegs.call(this, segInputs); var entriesByLevel = this.entriesByLevel; var excludeHidden = function excludeHidden(entry) { return !_this.forceHidden[common.buildEntryKey(entry)]; }; // remove the forced-hidden segs for (var level = 0; level < entriesByLevel.length; level += 1) { entriesByLevel[level] = entriesByLevel[level].filter(excludeHidden); } return hiddenSegs; }; DayGridSegHierarchy.prototype.handleInvalidInsertion = function (insertion, entry, hiddenEntries) { var _a = this, entriesByLevel = _a.entriesByLevel, forceHidden = _a.forceHidden; var touchingEntry = insertion.touchingEntry, touchingLevel = insertion.touchingLevel, touchingLateral = insertion.touchingLateral; if (this.hiddenConsumes && touchingEntry) { var touchingEntryId = common.buildEntryKey(touchingEntry); // if not already hidden if (!forceHidden[touchingEntryId]) { if (this.allowReslicing) { var placeholderEntry = tslib.__assign(tslib.__assign({}, touchingEntry), { span: common.intersectSpans(touchingEntry.span, entry.span) }); var placeholderEntryId = common.buildEntryKey(placeholderEntry); forceHidden[placeholderEntryId] = true; entriesByLevel[touchingLevel][touchingLateral] = placeholderEntry; // replace touchingEntry with our placeholder this.splitEntry(touchingEntry, entry, hiddenEntries); // split up the touchingEntry, reinsert it } else { forceHidden[touchingEntryId] = true; hiddenEntries.push(touchingEntry); } } } return _super.prototype.handleInvalidInsertion.call(this, insertion, entry, hiddenEntries); }; return DayGridSegHierarchy; }(common.SegHierarchy); var TableRow = /** @class */ function (_super) { tslib.__extends(TableRow, _super); function TableRow() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.cellElRefs = new common.RefMap(); // the ? common.createElement("tr", { role: "presentation", className: "fc-scrollgrid-section" }, common.createElement("td", { className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') })) }); } sections.push({ type: 'body', key: 'body', liquid: true, expandRows: Boolean(context.options.expandRows), chunk: { scrollerElRef: this.scrollerElRef, content: timeContent } }); return common.createElement(common.ViewRoot, { viewSpec: context.viewSpec, elRef: this.rootElRef }, function (rootElRef, classNames) { return common.createElement("div", { className: ['fc-timegrid'].concat(classNames).join(' '), ref: rootElRef }, common.createElement(common.SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [{ width: 'shrink' }], sections: sections })); }); }; TimeColsView.prototype.renderHScrollLayout = function (headerRowContent, allDayContent, timeContent, colCnt, dayMinWidth, slatMetas, slatCoords) { var _this = this; var ScrollGrid = this.context.pluginHooks.scrollGridImpl; if (!ScrollGrid) { throw new Error('No ScrollGrid implementation'); } var _a = this, context = _a.context, props = _a.props; var stickyHeaderDates = !props.forPrint && common.getStickyHeaderDates(context.options); var stickyFooterScrollbar = !props.forPrint && common.getStickyFooterScrollbar(context.options); var sections = []; if (headerRowContent) { sections.push({ type: 'header', key: 'header', isSticky: stickyHeaderDates, syncRowHeights: true, chunks: [{ key: 'axis', rowContent: function rowContent(arg) { return common.createElement("tr", { role: "presentation" }, _this.renderHeadAxis('day', arg.rowSyncHeights[0])); } }, { key: 'cols', elRef: this.headerElRef, tableClassName: 'fc-col-header', rowContent: headerRowContent }] }); } if (allDayContent) { sections.push({ type: 'body', key: 'all-day', syncRowHeights: true, chunks: [{ key: 'axis', rowContent: function rowContent(contentArg) { return common.createElement("tr", { role: "presentation" }, _this.renderTableRowAxis(contentArg.rowSyncHeights[0])); } }, { key: 'cols', content: allDayContent }] }); sections.push({ key: 'all-day-divider', type: 'body', outerContent: // TODO: rename to cellContent so don't need to define ? common.createElement("tr", { role: "presentation", className: "fc-scrollgrid-section" }, common.createElement("td", { colSpan: 2, className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') })) }); } var isNowIndicator = context.options.nowIndicator; sections.push({ type: 'body', key: 'body', liquid: true, expandRows: Boolean(context.options.expandRows), chunks: [{ key: 'axis', content: function content(arg) { return (// TODO: make this now-indicator arrow more DRY with TimeColsContent common.createElement("div", { className: "fc-timegrid-axis-chunk" }, common.createElement("table", { "aria-hidden": true, style: { height: arg.expandRows ? arg.clientHeight : '' } }, arg.tableColGroupNode, common.createElement("tbody", null, common.createElement(TimeBodyAxis, { slatMetas: slatMetas }))), common.createElement("div", { className: "fc-timegrid-now-indicator-container" }, common.createElement(common.NowTimer, { unit: isNowIndicator ? 'minute' : 'day' /* hacky */ }, function (nowDate) { var nowIndicatorTop = isNowIndicator && slatCoords && slatCoords.safeComputeTop(nowDate); // might return void if (typeof nowIndicatorTop === 'number') { return common.createElement(common.NowIndicatorRoot, { isAxis: true, date: nowDate }, function (rootElRef, classNames, innerElRef, innerContent) { return common.createElement("div", { ref: rootElRef, className: ['fc-timegrid-now-indicator-arrow'].concat(classNames).join(' '), style: { top: nowIndicatorTop } }, innerContent); }); } return null; }))) ); } }, { key: 'cols', scrollerElRef: this.scrollerElRef, content: timeContent }] }); if (stickyFooterScrollbar) { sections.push({ key: 'footer', type: 'footer', isSticky: true, chunks: [{ key: 'axis', content: common.renderScrollShim }, { key: 'cols', content: common.renderScrollShim }] }); } return common.createElement(common.ViewRoot, { viewSpec: context.viewSpec, elRef: this.rootElRef }, function (rootElRef, classNames) { return common.createElement("div", { className: ['fc-timegrid'].concat(classNames).join(' '), ref: rootElRef }, common.createElement(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: false, colGroups: [{ width: 'shrink', cols: [{ width: 'shrink' }] }, { cols: [{ span: colCnt, minWidth: dayMinWidth }] }], sections: sections })); }); }; /* Dimensions ------------------------------------------------------------------------------------------------------------------*/ TimeColsView.prototype.getAllDayMaxEventProps = function () { var _a = this.context.options, dayMaxEvents = _a.dayMaxEvents, dayMaxEventRows = _a.dayMaxEventRows; if (dayMaxEvents === true || dayMaxEventRows === true) { // is auto? dayMaxEvents = undefined; dayMaxEventRows = AUTO_ALL_DAY_MAX_EVENT_ROWS; // make sure "auto" goes to a real number } return { dayMaxEvents: dayMaxEvents, dayMaxEventRows: dayMaxEventRows }; }; return TimeColsView; }(common.DateComponent); function renderAllDayInner(hookProps) { return hookProps.text; } var TimeColsSlatsCoords = /** @class */ function () { function TimeColsSlatsCoords(positions, dateProfile, slotDuration) { this.positions = positions; this.dateProfile = dateProfile; this.slotDuration = slotDuration; } TimeColsSlatsCoords.prototype.safeComputeTop = function (date) { var dateProfile = this.dateProfile; if (common.rangeContainsMarker(dateProfile.currentRange, date)) { var startOfDayDate = common.startOfDay(date); var timeMs = date.valueOf() - startOfDayDate.valueOf(); if (timeMs >= common.asRoughMs(dateProfile.slotMinTime) && timeMs < common.asRoughMs(dateProfile.slotMaxTime)) { return this.computeTimeTop(common.createDuration(timeMs)); } } return null; }; // Computes the top coordinate, relative to the bounds of the grid, of the given date. // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight. TimeColsSlatsCoords.prototype.computeDateTop = function (when, startOfDayDate) { if (!startOfDayDate) { startOfDayDate = common.startOfDay(when); } return this.computeTimeTop(common.createDuration(when.valueOf() - startOfDayDate.valueOf())); }; // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration). // This is a makeshify way to compute the time-top. Assumes all slatMetas dates are uniform. // Eventually allow computation with arbirary slat dates. TimeColsSlatsCoords.prototype.computeTimeTop = function (duration) { var _a = this, positions = _a.positions, dateProfile = _a.dateProfile; var len = positions.els.length; // floating-point value of # of slots covered var slatCoverage = (duration.milliseconds - common.asRoughMs(dateProfile.slotMinTime)) / common.asRoughMs(this.slotDuration); var slatIndex; var slatRemainder; // compute a floating-point number for how many slats should be progressed through. // from 0 to number of slats (inclusive) // constrained because slotMinTime/slotMaxTime might be customized. slatCoverage = Math.max(0, slatCoverage); slatCoverage = Math.min(len, slatCoverage); // an integer index of the furthest whole slat // from 0 to number slats (*exclusive*, so len-1) slatIndex = Math.floor(slatCoverage); slatIndex = Math.min(slatIndex, len - 1); // how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition. // could be 1.0 if slatCoverage is covering *all* the slots slatRemainder = slatCoverage - slatIndex; return positions.tops[slatIndex] + positions.getHeight(slatIndex) * slatRemainder; }; return TimeColsSlatsCoords; }(); var TimeColsSlatsBody = /** @class */ function (_super) { tslib.__extends(TimeColsSlatsBody, _super); function TimeColsSlatsBody() { return _super !== null && _super.apply(this, arguments) || this; } TimeColsSlatsBody.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; var options = context.options; var slatElRefs = props.slatElRefs; return common.createElement("tbody", null, props.slatMetas.map(function (slatMeta, i) { var hookProps = { time: slatMeta.time, date: context.dateEnv.toDate(slatMeta.date), view: context.viewApi }; var classNames = ['fc-timegrid-slot', 'fc-timegrid-slot-lane', slatMeta.isLabeled ? '' : 'fc-timegrid-slot-minor']; return common.createElement("tr", { key: slatMeta.key, ref: slatElRefs.createRef(slatMeta.key) }, props.axis && common.createElement(TimeColsAxisCell, tslib.__assign({}, slatMeta)), common.createElement(common.RenderHook, { hookProps: hookProps, classNames: options.slotLaneClassNames, content: options.slotLaneContent, didMount: options.slotLaneDidMount, willUnmount: options.slotLaneWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return common.createElement("td", { ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-time": slatMeta.isoTimeStr }, innerContent); })); })); }; return TimeColsSlatsBody; }(common.BaseComponent); /* for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL. */ var TimeColsSlats = /** @class */ function (_super) { tslib.__extends(TimeColsSlats, _super); function TimeColsSlats() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.rootElRef = common.createRef(); _this.slatElRefs = new common.RefMap(); return _this; } TimeColsSlats.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; return common.createElement("div", { ref: this.rootElRef, className: "fc-timegrid-slots" }, common.createElement("table", { "aria-hidden": true, className: context.theme.getClass('table'), style: { minWidth: props.tableMinWidth, width: props.clientWidth, height: props.minHeight } }, props.tableColGroupNode /* relies on there only being a single for the axis */ , common.createElement(TimeColsSlatsBody, { slatElRefs: this.slatElRefs, axis: props.axis, slatMetas: props.slatMetas }))); }; TimeColsSlats.prototype.componentDidMount = function () { this.updateSizing(); }; TimeColsSlats.prototype.componentDidUpdate = function () { this.updateSizing(); }; TimeColsSlats.prototype.componentWillUnmount = function () { if (this.props.onCoords) { this.props.onCoords(null); } }; TimeColsSlats.prototype.updateSizing = function () { var _a = this, context = _a.context, props = _a.props; if (props.onCoords && props.clientWidth !== null // means sizing has stabilized ) { var rootEl = this.rootElRef.current; if (rootEl.offsetHeight) { // not hidden by css props.onCoords(new TimeColsSlatsCoords(new common.PositionCache(this.rootElRef.current, collectSlatEls(this.slatElRefs.currentMap, props.slatMetas), false, true), this.props.dateProfile, context.options.slotDuration)); } } }; return TimeColsSlats; }(common.BaseComponent); function collectSlatEls(elMap, slatMetas) { return slatMetas.map(function (slatMeta) { return elMap[slatMeta.key]; }); } function splitSegsByCol(segs, colCnt) { var segsByCol = []; var i; for (i = 0; i < colCnt; i += 1) { segsByCol.push([]); } if (segs) { for (i = 0; i < segs.length; i += 1) { segsByCol[segs[i].col].push(segs[i]); } } return segsByCol; } function splitInteractionByCol(ui, colCnt) { var byRow = []; if (!ui) { for (var i = 0; i < colCnt; i += 1) { byRow[i] = null; } } else { for (var i = 0; i < colCnt; i += 1) { byRow[i] = { affectedInstances: ui.affectedInstances, isEvent: ui.isEvent, segs: [] }; } for (var _i = 0, _a = ui.segs; _i < _a.length; _i++) { var seg = _a[_i]; byRow[seg.col].segs.push(seg); } } return byRow; } var TimeColMoreLink = /** @class */ function (_super) { tslib.__extends(TimeColMoreLink, _super); function TimeColMoreLink() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.rootElRef = common.createRef(); return _this; } TimeColMoreLink.prototype.render = function () { var _this = this; var props = this.props; return common.createElement(common.MoreLinkRoot, { allDayDate: null, moreCnt: props.hiddenSegs.length, allSegs: props.hiddenSegs, hiddenSegs: props.hiddenSegs, alignmentElRef: this.rootElRef, defaultContent: renderMoreLinkInner, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, todayRange: props.todayRange, popoverContent: function popoverContent() { return renderPlainFgSegs(props.hiddenSegs, props); } }, function (rootElRef, classNames, innerElRef, innerContent, handleClick, title, isExpanded, popoverId) { return common.createElement("a", { ref: function ref(el) { common.setRef(rootElRef, el); common.setRef(_this.rootElRef, el); }, className: ['fc-timegrid-more-link'].concat(classNames).join(' '), style: { top: props.top, bottom: props.bottom }, onClick: handleClick, title: title, "aria-expanded": isExpanded, "aria-controls": popoverId }, common.createElement("div", { ref: innerElRef, className: "fc-timegrid-more-link-inner fc-sticky" }, innerContent)); }); }; return TimeColMoreLink; }(common.BaseComponent); function renderMoreLinkInner(props) { return props.shortText; } // segInputs assumed sorted function buildPositioning(segInputs, strictOrder, maxStackCnt) { var hierarchy = new common.SegHierarchy(); if (strictOrder != null) { hierarchy.strictOrder = strictOrder; } if (maxStackCnt != null) { hierarchy.maxStackCnt = maxStackCnt; } var hiddenEntries = hierarchy.addSegs(segInputs); var hiddenGroups = common.groupIntersectingEntries(hiddenEntries); var web = buildWeb(hierarchy); web = stretchWeb(web, 1); // all levelCoords/thickness will have 0.0-1.0 var segRects = webToRects(web); return { segRects: segRects, hiddenGroups: hiddenGroups }; } function buildWeb(hierarchy) { var entriesByLevel = hierarchy.entriesByLevel; var buildNode = cacheable(function (level, lateral) { return level + ':' + lateral; }, function (level, lateral) { var siblingRange = findNextLevelSegs(hierarchy, level, lateral); var nextLevelRes = buildNodes(siblingRange, buildNode); var entry = entriesByLevel[level][lateral]; return [tslib.__assign(tslib.__assign({}, entry), { nextLevelNodes: nextLevelRes[0] }), entry.thickness + nextLevelRes[1] // the pressure builds ]; }); return buildNodes(entriesByLevel.length ? { level: 0, lateralStart: 0, lateralEnd: entriesByLevel[0].length } : null, buildNode)[0]; } function buildNodes(siblingRange, buildNode) { if (!siblingRange) { return [[], 0]; } var level = siblingRange.level, lateralStart = siblingRange.lateralStart, lateralEnd = siblingRange.lateralEnd; var lateral = lateralStart; var pairs = []; while (lateral < lateralEnd) { pairs.push(buildNode(level, lateral)); lateral += 1; } pairs.sort(cmpDescPressures); return [pairs.map(extractNode), pairs[0][1] // first item's pressure ]; } function cmpDescPressures(a, b) { return b[1] - a[1]; } function extractNode(a) { return a[0]; } function findNextLevelSegs(hierarchy, subjectLevel, subjectLateral) { var levelCoords = hierarchy.levelCoords, entriesByLevel = hierarchy.entriesByLevel; var subjectEntry = entriesByLevel[subjectLevel][subjectLateral]; var afterSubject = levelCoords[subjectLevel] + subjectEntry.thickness; var levelCnt = levelCoords.length; var level = subjectLevel; // skip past levels that are too high up for (; level < levelCnt && levelCoords[level] < afterSubject; level += 1) { ; } // do nothing for (; level < levelCnt; level += 1) { var entries = entriesByLevel[level]; var entry = void 0; var searchIndex = common.binarySearch(entries, subjectEntry.span.start, common.getEntrySpanEnd); var lateralStart = searchIndex[0] + searchIndex[1]; // if exact match (which doesn't collide), go to next one var lateralEnd = lateralStart; while ( // loop through entries that horizontally intersect (entry = entries[lateralEnd]) && // but not past the whole seg list entry.span.start < subjectEntry.span.end) { lateralEnd += 1; } if (lateralStart < lateralEnd) { return { level: level, lateralStart: lateralStart, lateralEnd: lateralEnd }; } } return null; } function stretchWeb(topLevelNodes, totalThickness) { var stretchNode = cacheable(function (node, startCoord, prevThickness) { return common.buildEntryKey(node); }, function (node, startCoord, prevThickness) { var nextLevelNodes = node.nextLevelNodes, thickness = node.thickness; var allThickness = thickness + prevThickness; var thicknessFraction = thickness / allThickness; var endCoord; var newChildren = []; if (!nextLevelNodes.length) { endCoord = totalThickness; } else { for (var _i = 0, nextLevelNodes_1 = nextLevelNodes; _i < nextLevelNodes_1.length; _i++) { var childNode = nextLevelNodes_1[_i]; if (endCoord === undefined) { var res = stretchNode(childNode, startCoord, allThickness); endCoord = res[0]; newChildren.push(res[1]); } else { var res = stretchNode(childNode, endCoord, 0); newChildren.push(res[1]); } } } var newThickness = (endCoord - startCoord) * thicknessFraction; return [endCoord - newThickness, tslib.__assign(tslib.__assign({}, node), { thickness: newThickness, nextLevelNodes: newChildren })]; }); return topLevelNodes.map(function (node) { return stretchNode(node, 0, 0)[1]; }); } // not sorted in any particular order function webToRects(topLevelNodes) { var rects = []; var processNode = cacheable(function (node, levelCoord, stackDepth) { return common.buildEntryKey(node); }, function (node, levelCoord, stackDepth) { var rect = tslib.__assign(tslib.__assign({}, node), { levelCoord: levelCoord, stackDepth: stackDepth, stackForward: 0 }); rects.push(rect); return rect.stackForward = processNodes(node.nextLevelNodes, levelCoord + node.thickness, stackDepth + 1) + 1; }); function processNodes(nodes, levelCoord, stackDepth) { var stackForward = 0; for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) { var node = nodes_1[_i]; stackForward = Math.max(processNode(node, levelCoord, stackDepth), stackForward); } return stackForward; } processNodes(topLevelNodes, 0, 0); return rects; // TODO: sort rects by levelCoord to be consistent with toRects? } // TODO: move to general util function cacheable(keyFunc, workFunc) { var cache = {}; return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var key = keyFunc.apply(void 0, args); return key in cache ? cache[key] : cache[key] = workFunc.apply(void 0, args); }; } function computeSegVCoords(segs, colDate, slatCoords, eventMinHeight) { if (slatCoords === void 0) { slatCoords = null; } if (eventMinHeight === void 0) { eventMinHeight = 0; } var vcoords = []; if (slatCoords) { for (var i = 0; i < segs.length; i += 1) { var seg = segs[i]; var spanStart = slatCoords.computeDateTop(seg.start, colDate); var spanEnd = Math.max(spanStart + (eventMinHeight || 0), // :( slatCoords.computeDateTop(seg.end, colDate)); vcoords.push({ start: Math.round(spanStart), end: Math.round(spanEnd) // }); } } return vcoords; } function computeFgSegPlacements(segs, segVCoords, // might not have for every seg eventOrderStrict, eventMaxStack) { var segInputs = []; var dumbSegs = []; // segs without coords for (var i = 0; i < segs.length; i += 1) { var vcoords = segVCoords[i]; if (vcoords) { segInputs.push({ index: i, thickness: 1, span: vcoords }); } else { dumbSegs.push(segs[i]); } } var _a = buildPositioning(segInputs, eventOrderStrict, eventMaxStack), segRects = _a.segRects, hiddenGroups = _a.hiddenGroups; var segPlacements = []; for (var _i = 0, segRects_1 = segRects; _i < segRects_1.length; _i++) { var segRect = segRects_1[_i]; segPlacements.push({ seg: segs[segRect.index], rect: segRect }); } for (var _b = 0, dumbSegs_1 = dumbSegs; _b < dumbSegs_1.length; _b++) { var dumbSeg = dumbSegs_1[_b]; segPlacements.push({ seg: dumbSeg, rect: null }); } return { segPlacements: segPlacements, hiddenGroups: hiddenGroups }; } var DEFAULT_TIME_FORMAT = common.createFormatter({ hour: 'numeric', minute: '2-digit', meridiem: false }); var TimeColEvent = /** @class */ function (_super) { tslib.__extends(TimeColEvent, _super); function TimeColEvent() { return _super !== null && _super.apply(this, arguments) || this; } TimeColEvent.prototype.render = function () { var classNames = ['fc-timegrid-event', 'fc-v-event']; if (this.props.isShort) { classNames.push('fc-timegrid-event-short'); } return common.createElement(common.StandardEvent, tslib.__assign({}, this.props, { defaultTimeFormat: DEFAULT_TIME_FORMAT, extraClassNames: classNames })); }; return TimeColEvent; }(common.BaseComponent); var TimeColMisc = /** @class */ function (_super) { tslib.__extends(TimeColMisc, _super); function TimeColMisc() { return _super !== null && _super.apply(this, arguments) || this; } TimeColMisc.prototype.render = function () { var props = this.props; return common.createElement(common.DayCellContent, { date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraHookProps: props.extraHookProps }, function (innerElRef, innerContent) { return innerContent && common.createElement("div", { className: "fc-timegrid-col-misc", ref: innerElRef }, innerContent); }); }; return TimeColMisc; }(common.BaseComponent); var TimeCol = /** @class */ function (_super) { tslib.__extends(TimeCol, _super); function TimeCol() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.sortEventSegs = common.memoize(common.sortEventSegs); return _this; } // TODO: memoize event-placement? TimeCol.prototype.render = function () { var _this = this; var _a = this, props = _a.props, context = _a.context; var isSelectMirror = context.options.selectMirror; var mirrorSegs = props.eventDrag && props.eventDrag.segs || props.eventResize && props.eventResize.segs || isSelectMirror && props.dateSelectionSegs || []; var interactionAffectedInstances = // TODO: messy way to compute this props.eventDrag && props.eventDrag.affectedInstances || props.eventResize && props.eventResize.affectedInstances || {}; var sortedFgSegs = this.sortEventSegs(props.fgEventSegs, context.options.eventOrder); return common.createElement(common.DayCellRoot, { elRef: props.elRef, date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraHookProps: props.extraHookProps }, function (rootElRef, classNames, dataAttrs) { return common.createElement("td", tslib.__assign({ ref: rootElRef, role: "gridcell", className: ['fc-timegrid-col'].concat(classNames, props.extraClassNames || []).join(' ') }, dataAttrs, props.extraDataAttrs), common.createElement("div", { className: "fc-timegrid-col-frame" }, common.createElement("div", { className: "fc-timegrid-col-bg" }, _this.renderFillSegs(props.businessHourSegs, 'non-business'), _this.renderFillSegs(props.bgEventSegs, 'bg-event'), _this.renderFillSegs(props.dateSelectionSegs, 'highlight')), common.createElement("div", { className: "fc-timegrid-col-events" }, _this.renderFgSegs(sortedFgSegs, interactionAffectedInstances, false, false, false)), common.createElement("div", { className: "fc-timegrid-col-events" }, _this.renderFgSegs(mirrorSegs, {}, Boolean(props.eventDrag), Boolean(props.eventResize), Boolean(isSelectMirror))), common.createElement("div", { className: "fc-timegrid-now-indicator-container" }, _this.renderNowIndicator(props.nowIndicatorSegs)), common.createElement(TimeColMisc, { date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraHookProps: props.extraHookProps }))); }); }; TimeCol.prototype.renderFgSegs = function (sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting) { var props = this.props; if (props.forPrint) { return renderPlainFgSegs(sortedFgSegs, props); } return this.renderPositionedFgSegs(sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting); }; TimeCol.prototype.renderPositionedFgSegs = function (segs, // if not mirror, needs to be sorted segIsInvisible, isDragging, isResizing, isDateSelecting) { var _this = this; var _a = this.context.options, eventMaxStack = _a.eventMaxStack, eventShortHeight = _a.eventShortHeight, eventOrderStrict = _a.eventOrderStrict, eventMinHeight = _a.eventMinHeight; var _b = this.props, date = _b.date, slatCoords = _b.slatCoords, eventSelection = _b.eventSelection, todayRange = _b.todayRange, nowDate = _b.nowDate; var isMirror = isDragging || isResizing || isDateSelecting; var segVCoords = computeSegVCoords(segs, date, slatCoords, eventMinHeight); var _c = computeFgSegPlacements(segs, segVCoords, eventOrderStrict, eventMaxStack), segPlacements = _c.segPlacements, hiddenGroups = _c.hiddenGroups; return common.createElement(common.Fragment, null, this.renderHiddenGroups(hiddenGroups, segs), segPlacements.map(function (segPlacement) { var seg = segPlacement.seg, rect = segPlacement.rect; var instanceId = seg.eventRange.instance.instanceId; var isVisible = isMirror || Boolean(!segIsInvisible[instanceId] && rect); var vStyle = computeSegVStyle(rect && rect.span); var hStyle = !isMirror && rect ? _this.computeSegHStyle(rect) : { left: 0, right: 0 }; var isInset = Boolean(rect) && rect.stackForward > 0; var isShort = Boolean(rect) && rect.span.end - rect.span.start < eventShortHeight; // look at other places for this problem return common.createElement("div", { className: 'fc-timegrid-event-harness' + (isInset ? ' fc-timegrid-event-harness-inset' : ''), key: instanceId, style: tslib.__assign(tslib.__assign({ visibility: isVisible ? '' : 'hidden' }, vStyle), hStyle) }, common.createElement(TimeColEvent, tslib.__assign({ seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === eventSelection, isShort: isShort }, common.getSegMeta(seg, todayRange, nowDate)))); })); }; // will already have eventMinHeight applied because segInputs already had it TimeCol.prototype.renderHiddenGroups = function (hiddenGroups, segs) { var _a = this.props, extraDateSpan = _a.extraDateSpan, dateProfile = _a.dateProfile, todayRange = _a.todayRange, nowDate = _a.nowDate, eventSelection = _a.eventSelection, eventDrag = _a.eventDrag, eventResize = _a.eventResize; return common.createElement(common.Fragment, null, hiddenGroups.map(function (hiddenGroup) { var positionCss = computeSegVStyle(hiddenGroup.span); var hiddenSegs = compileSegsFromEntries(hiddenGroup.entries, segs); return common.createElement(TimeColMoreLink, { key: common.buildIsoString(common.computeEarliestSegStart(hiddenSegs)), hiddenSegs: hiddenSegs, top: positionCss.top, bottom: positionCss.bottom, extraDateSpan: extraDateSpan, dateProfile: dateProfile, todayRange: todayRange, nowDate: nowDate, eventSelection: eventSelection, eventDrag: eventDrag, eventResize: eventResize }); })); }; TimeCol.prototype.renderFillSegs = function (segs, fillType) { var _a = this, props = _a.props, context = _a.context; var segVCoords = computeSegVCoords(segs, props.date, props.slatCoords, context.options.eventMinHeight); // don't assume all populated var children = segVCoords.map(function (vcoords, i) { var seg = segs[i]; return common.createElement("div", { key: common.buildEventRangeKey(seg.eventRange), className: "fc-timegrid-bg-harness", style: computeSegVStyle(vcoords) }, fillType === 'bg-event' ? common.createElement(common.BgEvent, tslib.__assign({ seg: seg }, common.getSegMeta(seg, props.todayRange, props.nowDate))) : common.renderFill(fillType)); }); return common.createElement(common.Fragment, null, children); }; TimeCol.prototype.renderNowIndicator = function (segs) { var _a = this.props, slatCoords = _a.slatCoords, date = _a.date; if (!slatCoords) { return null; } return segs.map(function (seg, i) { return common.createElement(common.NowIndicatorRoot, { isAxis: false, date: date, // key doesn't matter. will only ever be one key: i }, function (rootElRef, classNames, innerElRef, innerContent) { return common.createElement("div", { ref: rootElRef, className: ['fc-timegrid-now-indicator-line'].concat(classNames).join(' '), style: { top: slatCoords.computeDateTop(seg.start, date) } }, innerContent); }); }); }; TimeCol.prototype.computeSegHStyle = function (segHCoords) { var _a = this.context, isRtl = _a.isRtl, options = _a.options; var shouldOverlap = options.slotEventOverlap; var nearCoord = segHCoords.levelCoord; // the left side if LTR. the right side if RTL. floating-point var farCoord = segHCoords.levelCoord + segHCoords.thickness; // the right side if LTR. the left side if RTL. floating-point var left; // amount of space from left edge, a fraction of the total width var right; // amount of space from right edge, a fraction of the total width if (shouldOverlap) { // double the width, but don't go beyond the maximum forward coordinate (1.0) farCoord = Math.min(1, nearCoord + (farCoord - nearCoord) * 2); } if (isRtl) { left = 1 - farCoord; right = nearCoord; } else { left = nearCoord; right = 1 - farCoord; } var props = { zIndex: segHCoords.stackDepth + 1, left: left * 100 + '%', right: right * 100 + '%' }; if (shouldOverlap && !segHCoords.stackForward) { // add padding to the edge so that forward stacked events don't cover the resizer's icon props[isRtl ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width } return props; }; return TimeCol; }(common.BaseComponent); function renderPlainFgSegs(sortedFgSegs, _a) { var todayRange = _a.todayRange, nowDate = _a.nowDate, eventSelection = _a.eventSelection, eventDrag = _a.eventDrag, eventResize = _a.eventResize; var hiddenInstances = (eventDrag ? eventDrag.affectedInstances : null) || (eventResize ? eventResize.affectedInstances : null) || {}; return common.createElement(common.Fragment, null, sortedFgSegs.map(function (seg) { var instanceId = seg.eventRange.instance.instanceId; return common.createElement("div", { key: instanceId, style: { visibility: hiddenInstances[instanceId] ? 'hidden' : '' } }, common.createElement(TimeColEvent, tslib.__assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === eventSelection, isShort: false }, common.getSegMeta(seg, todayRange, nowDate)))); })); } function computeSegVStyle(segVCoords) { if (!segVCoords) { return { top: '', bottom: '' }; } return { top: segVCoords.start, bottom: -segVCoords.end }; } function compileSegsFromEntries(segEntries, allSegs) { return segEntries.map(function (segEntry) { return allSegs[segEntry.index]; }); } var TimeColsContent = /** @class */ function (_super) { tslib.__extends(TimeColsContent, _super); function TimeColsContent() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.splitFgEventSegs = common.memoize(splitSegsByCol); _this.splitBgEventSegs = common.memoize(splitSegsByCol); _this.splitBusinessHourSegs = common.memoize(splitSegsByCol); _this.splitNowIndicatorSegs = common.memoize(splitSegsByCol); _this.splitDateSelectionSegs = common.memoize(splitSegsByCol); _this.splitEventDrag = common.memoize(splitInteractionByCol); _this.splitEventResize = common.memoize(splitInteractionByCol); _this.rootElRef = common.createRef(); _this.cellElRefs = new common.RefMap(); return _this; } TimeColsContent.prototype.render = function () { var _this = this; var _a = this, props = _a.props, context = _a.context; var nowIndicatorTop = context.options.nowIndicator && props.slatCoords && props.slatCoords.safeComputeTop(props.nowDate); // might return void var colCnt = props.cells.length; var fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs, colCnt); var bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, colCnt); var businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, colCnt); var nowIndicatorSegsByRow = this.splitNowIndicatorSegs(props.nowIndicatorSegs, colCnt); var dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, colCnt); var eventDragByRow = this.splitEventDrag(props.eventDrag, colCnt); var eventResizeByRow = this.splitEventResize(props.eventResize, colCnt); return common.createElement("div", { className: "fc-timegrid-cols", ref: this.rootElRef }, common.createElement("table", { role: "presentation", style: { minWidth: props.tableMinWidth, width: props.clientWidth } }, props.tableColGroupNode, common.createElement("tbody", { role: "presentation" }, common.createElement("tr", { role: "row" }, props.axis && common.createElement("td", { "aria-hidden": true, className: "fc-timegrid-col fc-timegrid-axis" }, common.createElement("div", { className: "fc-timegrid-col-frame" }, common.createElement("div", { className: "fc-timegrid-now-indicator-container" }, typeof nowIndicatorTop === 'number' && common.createElement(common.NowIndicatorRoot, { isAxis: true, date: props.nowDate }, function (rootElRef, classNames, innerElRef, innerContent) { return common.createElement("div", { ref: rootElRef, className: ['fc-timegrid-now-indicator-arrow'].concat(classNames).join(' '), style: { top: nowIndicatorTop } }, innerContent); })))), props.cells.map(function (cell, i) { return common.createElement(TimeCol, { key: cell.key, elRef: _this.cellElRefs.createRef(cell.key), dateProfile: props.dateProfile, date: cell.date, nowDate: props.nowDate, todayRange: props.todayRange, extraHookProps: cell.extraHookProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, extraDateSpan: cell.extraDateSpan, fgEventSegs: fgEventSegsByRow[i], bgEventSegs: bgEventSegsByRow[i], businessHourSegs: businessHourSegsByRow[i], nowIndicatorSegs: nowIndicatorSegsByRow[i], dateSelectionSegs: dateSelectionSegsByRow[i], eventDrag: eventDragByRow[i], eventResize: eventResizeByRow[i], slatCoords: props.slatCoords, eventSelection: props.eventSelection, forPrint: props.forPrint }); }))))); }; TimeColsContent.prototype.componentDidMount = function () { this.updateCoords(); }; TimeColsContent.prototype.componentDidUpdate = function () { this.updateCoords(); }; TimeColsContent.prototype.updateCoords = function () { var props = this.props; if (props.onColCoords && props.clientWidth !== null // means sizing has stabilized ) { props.onColCoords(new common.PositionCache(this.rootElRef.current, collectCellEls(this.cellElRefs.currentMap, props.cells), true, // horizontal false)); } }; return TimeColsContent; }(common.BaseComponent); function collectCellEls(elMap, cells) { return cells.map(function (cell) { return elMap[cell.key]; }); } /* A component that renders one or more columns of vertical time slots ----------------------------------------------------------------------------------------------------------------------*/ var TimeCols = /** @class */ function (_super) { tslib.__extends(TimeCols, _super); function TimeCols() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.processSlotOptions = common.memoize(processSlotOptions); _this.state = { slatCoords: null }; _this.handleRootEl = function (el) { if (el) { _this.context.registerInteractiveComponent(_this, { el: el, isHitComboAllowed: _this.props.isHitComboAllowed }); } else { _this.context.unregisterInteractiveComponent(_this); } }; _this.handleScrollRequest = function (request) { var onScrollTopRequest = _this.props.onScrollTopRequest; var slatCoords = _this.state.slatCoords; if (onScrollTopRequest && slatCoords) { if (request.time) { var top_1 = slatCoords.computeTimeTop(request.time); top_1 = Math.ceil(top_1); // zoom can give weird floating-point values. rather scroll a little bit further if (top_1) { top_1 += 1; // to overcome top border that slots beyond the first have. looks better } onScrollTopRequest(top_1); } return true; } return false; }; _this.handleColCoords = function (colCoords) { _this.colCoords = colCoords; }; _this.handleSlatCoords = function (slatCoords) { _this.setState({ slatCoords: slatCoords }); if (_this.props.onSlatCoords) { _this.props.onSlatCoords(slatCoords); } }; return _this; } TimeCols.prototype.render = function () { var _a = this, props = _a.props, state = _a.state; return common.createElement("div", { className: "fc-timegrid-body", ref: this.handleRootEl, style: { // these props are important to give this wrapper correct dimensions for interactions // TODO: if we set it here, can we avoid giving to inner tables? width: props.clientWidth, minWidth: props.tableMinWidth } }, common.createElement(TimeColsSlats, { axis: props.axis, dateProfile: props.dateProfile, slatMetas: props.slatMetas, clientWidth: props.clientWidth, minHeight: props.expandRows ? props.clientHeight : '', tableMinWidth: props.tableMinWidth, tableColGroupNode: props.axis ? props.tableColGroupNode : null /* axis depends on the colgroup's shrinking */ , onCoords: this.handleSlatCoords }), common.createElement(TimeColsContent, { cells: props.cells, axis: props.axis, dateProfile: props.dateProfile, businessHourSegs: props.businessHourSegs, bgEventSegs: props.bgEventSegs, fgEventSegs: props.fgEventSegs, dateSelectionSegs: props.dateSelectionSegs, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange, nowDate: props.nowDate, nowIndicatorSegs: props.nowIndicatorSegs, clientWidth: props.clientWidth, tableMinWidth: props.tableMinWidth, tableColGroupNode: props.tableColGroupNode, slatCoords: state.slatCoords, onColCoords: this.handleColCoords, forPrint: props.forPrint })); }; TimeCols.prototype.componentDidMount = function () { this.scrollResponder = this.context.createScrollResponder(this.handleScrollRequest); }; TimeCols.prototype.componentDidUpdate = function (prevProps) { this.scrollResponder.update(prevProps.dateProfile !== this.props.dateProfile); }; TimeCols.prototype.componentWillUnmount = function () { this.scrollResponder.detach(); }; TimeCols.prototype.queryHit = function (positionLeft, positionTop) { var _a = this.context, dateEnv = _a.dateEnv, options = _a.options; var colCoords = this.colCoords; var dateProfile = this.props.dateProfile; var slatCoords = this.state.slatCoords; var _b = this.processSlotOptions(this.props.slotDuration, options.snapDuration), snapDuration = _b.snapDuration, snapsPerSlot = _b.snapsPerSlot; var colIndex = colCoords.leftToIndex(positionLeft); var slatIndex = slatCoords.positions.topToIndex(positionTop); if (colIndex != null && slatIndex != null) { var cell = this.props.cells[colIndex]; var slatTop = slatCoords.positions.tops[slatIndex]; var slatHeight = slatCoords.positions.getHeight(slatIndex); var partial = (positionTop - slatTop) / slatHeight; // floating point number between 0 and 1 var localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat var snapIndex = slatIndex * snapsPerSlot + localSnapIndex; var dayDate = this.props.cells[colIndex].date; var time = common.addDurations(dateProfile.slotMinTime, common.multiplyDuration(snapDuration, snapIndex)); var start = dateEnv.add(dayDate, time); var end = dateEnv.add(start, snapDuration); return { dateProfile: dateProfile, dateSpan: tslib.__assign({ range: { start: start, end: end }, allDay: false }, cell.extraDateSpan), dayEl: colCoords.els[colIndex], rect: { left: colCoords.lefts[colIndex], right: colCoords.rights[colIndex], top: slatTop, bottom: slatTop + slatHeight }, layer: 0 }; } return null; }; return TimeCols; }(common.DateComponent); function processSlotOptions(slotDuration, snapDurationOverride) { var snapDuration = snapDurationOverride || slotDuration; var snapsPerSlot = common.wholeDivideDurations(slotDuration, snapDuration); if (snapsPerSlot === null) { snapDuration = slotDuration; snapsPerSlot = 1; // TODO: say warning? } return { snapDuration: snapDuration, snapsPerSlot: snapsPerSlot }; } var DayTimeColsSlicer = /** @class */ function (_super) { tslib.__extends(DayTimeColsSlicer, _super); function DayTimeColsSlicer() { return _super !== null && _super.apply(this, arguments) || this; } DayTimeColsSlicer.prototype.sliceRange = function (range, dayRanges) { var segs = []; for (var col = 0; col < dayRanges.length; col += 1) { var segRange = common.intersectRanges(range, dayRanges[col]); if (segRange) { segs.push({ start: segRange.start, end: segRange.end, isStart: segRange.start.valueOf() === range.start.valueOf(), isEnd: segRange.end.valueOf() === range.end.valueOf(), col: col }); } } return segs; }; return DayTimeColsSlicer; }(common.Slicer); var DayTimeCols = /** @class */ function (_super) { tslib.__extends(DayTimeCols, _super); function DayTimeCols() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.buildDayRanges = common.memoize(buildDayRanges); _this.slicer = new DayTimeColsSlicer(); _this.timeColsRef = common.createRef(); return _this; } DayTimeCols.prototype.render = function () { var _this = this; var _a = this, props = _a.props, context = _a.context; var dateProfile = props.dateProfile, dayTableModel = props.dayTableModel; var isNowIndicator = context.options.nowIndicator; var dayRanges = this.buildDayRanges(dayTableModel, dateProfile, context.dateEnv); // give it the first row of cells // TODO: would move this further down hierarchy, but sliceNowDate needs it return common.createElement(common.NowTimer, { unit: isNowIndicator ? 'minute' : 'day' }, function (nowDate, todayRange) { return common.createElement(TimeCols, tslib.__assign({ ref: _this.timeColsRef }, _this.slicer.sliceProps(props, dateProfile, null, context, dayRanges), { forPrint: props.forPrint, axis: props.axis, dateProfile: dateProfile, slatMetas: props.slatMetas, slotDuration: props.slotDuration, cells: dayTableModel.cells[0], tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, clientWidth: props.clientWidth, clientHeight: props.clientHeight, expandRows: props.expandRows, nowDate: nowDate, nowIndicatorSegs: isNowIndicator && _this.slicer.sliceNowDate(nowDate, context, dayRanges), todayRange: todayRange, onScrollTopRequest: props.onScrollTopRequest, onSlatCoords: props.onSlatCoords })); }); }; return DayTimeCols; }(common.DateComponent); function buildDayRanges(dayTableModel, dateProfile, dateEnv) { var ranges = []; for (var _i = 0, _a = dayTableModel.headerDates; _i < _a.length; _i++) { var date = _a[_i]; ranges.push({ start: dateEnv.add(date, dateProfile.slotMinTime), end: dateEnv.add(date, dateProfile.slotMaxTime) }); } return ranges; } // potential nice values for the slot-duration and interval-duration // from largest to smallest var STOCK_SUB_DURATIONS = [{ hours: 1 }, { minutes: 30 }, { minutes: 15 }, { seconds: 30 }, { seconds: 15 }]; function buildSlatMetas(slotMinTime, slotMaxTime, explicitLabelInterval, slotDuration, dateEnv) { var dayStart = new Date(0); var slatTime = slotMinTime; var slatIterator = common.createDuration(0); var labelInterval = explicitLabelInterval || computeLabelInterval(slotDuration); var metas = []; while (common.asRoughMs(slatTime) < common.asRoughMs(slotMaxTime)) { var date = dateEnv.add(dayStart, slatTime); var isLabeled = common.wholeDivideDurations(slatIterator, labelInterval) !== null; metas.push({ date: date, time: slatTime, key: date.toISOString(), isoTimeStr: common.formatIsoTimeString(date), isLabeled: isLabeled }); slatTime = common.addDurations(slatTime, slotDuration); slatIterator = common.addDurations(slatIterator, slotDuration); } return metas; } // Computes an automatic value for slotLabelInterval function computeLabelInterval(slotDuration) { var i; var labelInterval; var slotsPerLabel; // find the smallest stock label interval that results in more than one slots-per-label for (i = STOCK_SUB_DURATIONS.length - 1; i >= 0; i -= 1) { labelInterval = common.createDuration(STOCK_SUB_DURATIONS[i]); slotsPerLabel = common.wholeDivideDurations(labelInterval, slotDuration); if (slotsPerLabel !== null && slotsPerLabel > 1) { return labelInterval; } } return slotDuration; // fall back } var DayTimeColsView = /** @class */ function (_super) { tslib.__extends(DayTimeColsView, _super); function DayTimeColsView() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.buildTimeColsModel = common.memoize(buildTimeColsModel); _this.buildSlatMetas = common.memoize(buildSlatMetas); return _this; } DayTimeColsView.prototype.render = function () { var _this = this; var _a = this.context, options = _a.options, dateEnv = _a.dateEnv, dateProfileGenerator = _a.dateProfileGenerator; var props = this.props; var dateProfile = props.dateProfile; var dayTableModel = this.buildTimeColsModel(dateProfile, dateProfileGenerator); var splitProps = this.allDaySplitter.splitProps(props); var slatMetas = this.buildSlatMetas(dateProfile.slotMinTime, dateProfile.slotMaxTime, options.slotLabelInterval, options.slotDuration, dateEnv); var dayMinWidth = options.dayMinWidth; var hasAttachedAxis = !dayMinWidth; var hasDetachedAxis = dayMinWidth; var headerContent = options.dayHeaders && common.createElement(common.DayHeader, { dates: dayTableModel.headerDates, dateProfile: dateProfile, datesRepDistinctDays: true, renderIntro: hasAttachedAxis ? this.renderHeadAxis : null }); var allDayContent = options.allDaySlot !== false && function (contentArg) { return common.createElement(daygrid.DayTable, tslib.__assign({}, splitProps.allDay, { dateProfile: dateProfile, dayTableModel: dayTableModel, nextDayThreshold: options.nextDayThreshold, tableMinWidth: contentArg.tableMinWidth, colGroupNode: contentArg.tableColGroupNode, renderRowIntro: hasAttachedAxis ? _this.renderTableRowAxis : null, showWeekNumbers: false, expandRows: false, headerAlignElRef: _this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint }, _this.getAllDayMaxEventProps())); }; var timeGridContent = function timeGridContent(contentArg) { return common.createElement(DayTimeCols, tslib.__assign({}, splitProps.timed, { dayTableModel: dayTableModel, dateProfile: dateProfile, axis: hasAttachedAxis, slotDuration: options.slotDuration, slatMetas: slatMetas, forPrint: props.forPrint, tableColGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, onSlatCoords: _this.handleSlatCoords, expandRows: contentArg.expandRows, onScrollTopRequest: _this.handleScrollTopRequest })); }; return hasDetachedAxis ? this.renderHScrollLayout(headerContent, allDayContent, timeGridContent, dayTableModel.colCnt, dayMinWidth, slatMetas, this.state.slatCoords) : this.renderSimpleLayout(headerContent, allDayContent, timeGridContent); }; return DayTimeColsView; }(TimeColsView); function buildTimeColsModel(dateProfile, dateProfileGenerator) { var daySeries = new common.DaySeriesModel(dateProfile.renderRange, dateProfileGenerator); return new common.DayTableModel(daySeries, false); } var OPTION_REFINERS = { allDaySlot: Boolean }; var main = common.createPlugin({ initialView: 'timeGridWeek', optionRefiners: OPTION_REFINERS, views: { timeGrid: { component: DayTimeColsView, usesMinMaxTime: true, allDaySlot: true, slotDuration: '00:30:00', slotEventOverlap: true // a bad name. confused with overlap/constraint system }, timeGridDay: { type: 'timeGrid', duration: { days: 1 } }, timeGridWeek: { type: 'timeGrid', duration: { weeks: 1 } } } }); exports.DayTimeCols = DayTimeCols; exports.DayTimeColsSlicer = DayTimeColsSlicer; exports.DayTimeColsView = DayTimeColsView; exports.TimeCols = TimeCols; exports.TimeColsSlatsCoords = TimeColsSlatsCoords; exports.TimeColsView = TimeColsView; exports.buildDayRanges = buildDayRanges; exports.buildSlatMetas = buildSlatMetas; exports.buildTimeColsModel = buildTimeColsModel; exports["default"] = main; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImNvbW1vbiIsInJlcXVpcmUiLCJ0c2xpYiIsImRheWdyaWQiLCJBbGxEYXlTcGxpdHRlciIsIl9zdXBlciIsIl9fZXh0ZW5kcyIsImFwcGx5IiwiYXJndW1lbnRzIiwicHJvdG90eXBlIiwiZ2V0S2V5SW5mbyIsImFsbERheSIsInRpbWVkIiwiZ2V0S2V5c0ZvckRhdGVTcGFuIiwiZGF0ZVNwYW4iLCJnZXRLZXlzRm9yRXZlbnREZWYiLCJldmVudERlZiIsImhhc0JnUmVuZGVyaW5nIiwiU3BsaXR0ZXIiLCJERUZBVUxUX1NMQVRfTEFCRUxfRk9STUFUIiwiY3JlYXRlRm9ybWF0dGVyIiwiaG91ciIsIm1pbnV0ZSIsIm9taXRaZXJvTWludXRlIiwibWVyaWRpZW0iLCJUaW1lQ29sc0F4aXNDZWxsIiwicHJvcHMiLCJjbGFzc05hbWVzIiwiaXNMYWJlbGVkIiwiY3JlYXRlRWxlbWVudCIsIlZpZXdDb250ZXh0VHlwZSIsIkNvbnN1bWVyIiwiY29udGV4dCIsImNsYXNzTmFtZSIsImpvaW4iLCJpc29UaW1lU3RyIiwiZGF0ZUVudiIsIm9wdGlvbnMiLCJ2aWV3QXBpIiwibGFiZWxGb3JtYXQiLCJzbG90TGFiZWxGb3JtYXQiLCJBcnJheSIsImlzQXJyYXkiLCJob29rUHJvcHMiLCJsZXZlbCIsInRpbWUiLCJkYXRlIiwidG9EYXRlIiwidmlldyIsInRleHQiLCJmb3JtYXQiLCJSZW5kZXJIb29rIiwic2xvdExhYmVsQ2xhc3NOYW1lcyIsImNvbnRlbnQiLCJzbG90TGFiZWxDb250ZW50IiwiZGVmYXVsdENvbnRlbnQiLCJyZW5kZXJJbm5lckNvbnRlbnQiLCJkaWRNb3VudCIsInNsb3RMYWJlbERpZE1vdW50Iiwid2lsbFVubW91bnQiLCJzbG90TGFiZWxXaWxsVW5tb3VudCIsInJvb3RFbFJlZiIsImN1c3RvbUNsYXNzTmFtZXMiLCJpbm5lckVsUmVmIiwiaW5uZXJDb250ZW50IiwicmVmIiwiY29uY2F0IiwiVGltZUJvZHlBeGlzIiwicmVuZGVyIiwic2xhdE1ldGFzIiwibWFwIiwic2xhdE1ldGEiLCJrZXkiLCJfX2Fzc2lnbiIsIkJhc2VDb21wb25lbnQiLCJERUZBVUxUX1dFRUtfTlVNX0ZPUk1BVCIsIndlZWsiLCJBVVRPX0FMTF9EQVlfTUFYX0VWRU5UX1JPV1MiLCJUaW1lQ29sc1ZpZXciLCJfdGhpcyIsImFsbERheVNwbGl0dGVyIiwiaGVhZGVyRWxSZWYiLCJjcmVhdGVSZWYiLCJzY3JvbGxlckVsUmVmIiwic3RhdGUiLCJzbGF0Q29vcmRzIiwiaGFuZGxlU2Nyb2xsVG9wUmVxdWVzdCIsInNjcm9sbFRvcCIsInNjcm9sbGVyRWwiLCJjdXJyZW50IiwicmVuZGVySGVhZEF4aXMiLCJyb3dLZXkiLCJmcmFtZUhlaWdodCIsImRhdGVQcm9maWxlIiwicmFuZ2UiLCJyZW5kZXJSYW5nZSIsImRheUNudCIsImRpZmZEYXlzIiwic3RhcnQiLCJlbmQiLCJuYXZMaW5rQXR0cnMiLCJidWlsZE5hdkxpbmtBdHRycyIsIndlZWtOdW1iZXJzIiwiV2Vla051bWJlclJvb3QiLCJkZWZhdWx0Rm9ybWF0Iiwic3R5bGUiLCJoZWlnaHQiLCJyZW5kZXJUYWJsZVJvd0F4aXMiLCJyb3dIZWlnaHQiLCJfYSIsImFsbERheVRleHQiLCJhbGxEYXlDbGFzc05hbWVzIiwiYWxsRGF5Q29udGVudCIsInJlbmRlckFsbERheUlubmVyIiwiYWxsRGF5RGlkTW91bnQiLCJhbGxEYXlXaWxsVW5tb3VudCIsImhhbmRsZVNsYXRDb29yZHMiLCJzZXRTdGF0ZSIsInJlbmRlclNpbXBsZUxheW91dCIsImhlYWRlclJvd0NvbnRlbnQiLCJ0aW1lQ29udGVudCIsInNlY3Rpb25zIiwic3RpY2t5SGVhZGVyRGF0ZXMiLCJnZXRTdGlja3lIZWFkZXJEYXRlcyIsInB1c2giLCJ0eXBlIiwiaXNTdGlja3kiLCJjaHVuayIsImVsUmVmIiwidGFibGVDbGFzc05hbWUiLCJyb3dDb250ZW50Iiwib3V0ZXJDb250ZW50Iiwicm9sZSIsInRoZW1lIiwiZ2V0Q2xhc3MiLCJsaXF1aWQiLCJleHBhbmRSb3dzIiwiQm9vbGVhbiIsIlZpZXdSb290Iiwidmlld1NwZWMiLCJTaW1wbGVTY3JvbGxHcmlkIiwiaXNIZWlnaHRBdXRvIiwiZm9yUHJpbnQiLCJjb2xsYXBzaWJsZVdpZHRoIiwiY29scyIsIndpZHRoIiwicmVuZGVySFNjcm9sbExheW91dCIsImNvbENudCIsImRheU1pbldpZHRoIiwiU2Nyb2xsR3JpZCIsInBsdWdpbkhvb2tzIiwic2Nyb2xsR3JpZEltcGwiLCJFcnJvciIsInN0aWNreUZvb3RlclNjcm9sbGJhciIsImdldFN0aWNreUZvb3RlclNjcm9sbGJhciIsInN5bmNSb3dIZWlnaHRzIiwiY2h1bmtzIiwiYXJnIiwicm93U3luY0hlaWdodHMiLCJjb250ZW50QXJnIiwiY29sU3BhbiIsImlzTm93SW5kaWNhdG9yIiwibm93SW5kaWNhdG9yIiwiY2xpZW50SGVpZ2h0IiwidGFibGVDb2xHcm91cE5vZGUiLCJOb3dUaW1lciIsInVuaXQiLCJub3dEYXRlIiwibm93SW5kaWNhdG9yVG9wIiwic2FmZUNvbXB1dGVUb3AiLCJOb3dJbmRpY2F0b3JSb290IiwiaXNBeGlzIiwidG9wIiwicmVuZGVyU2Nyb2xsU2hpbSIsImNvbEdyb3VwcyIsInNwYW4iLCJtaW5XaWR0aCIsImdldEFsbERheU1heEV2ZW50UHJvcHMiLCJkYXlNYXhFdmVudHMiLCJkYXlNYXhFdmVudFJvd3MiLCJ1bmRlZmluZWQiLCJEYXRlQ29tcG9uZW50IiwiVGltZUNvbHNTbGF0c0Nvb3JkcyIsInBvc2l0aW9ucyIsInNsb3REdXJhdGlvbiIsInJhbmdlQ29udGFpbnNNYXJrZXIiLCJjdXJyZW50UmFuZ2UiLCJzdGFydE9mRGF5RGF0ZSIsInN0YXJ0T2ZEYXkiLCJ0aW1lTXMiLCJ2YWx1ZU9mIiwiYXNSb3VnaE1zIiwic2xvdE1pblRpbWUiLCJzbG90TWF4VGltZSIsImNvbXB1dGVUaW1lVG9wIiwiY3JlYXRlRHVyYXRpb24iLCJjb21wdXRlRGF0ZVRvcCIsIndoZW4iLCJkdXJhdGlvbiIsImxlbiIsImVscyIsImxlbmd0aCIsInNsYXRDb3ZlcmFnZSIsIm1pbGxpc2Vjb25kcyIsInNsYXRJbmRleCIsInNsYXRSZW1haW5kZXIiLCJNYXRoIiwibWF4IiwibWluIiwiZmxvb3IiLCJ0b3BzIiwiZ2V0SGVpZ2h0IiwiVGltZUNvbHNTbGF0c0JvZHkiLCJzbGF0RWxSZWZzIiwiaSIsImF4aXMiLCJzbG90TGFuZUNsYXNzTmFtZXMiLCJzbG90TGFuZUNvbnRlbnQiLCJzbG90TGFuZURpZE1vdW50Iiwic2xvdExhbmVXaWxsVW5tb3VudCIsIlRpbWVDb2xzU2xhdHMiLCJSZWZNYXAiLCJ0YWJsZU1pbldpZHRoIiwiY2xpZW50V2lkdGgiLCJtaW5IZWlnaHQiLCJjb21wb25lbnREaWRNb3VudCIsInVwZGF0ZVNpemluZyIsImNvbXBvbmVudERpZFVwZGF0ZSIsImNvbXBvbmVudFdpbGxVbm1vdW50Iiwib25Db29yZHMiLCJyb290RWwiLCJvZmZzZXRIZWlnaHQiLCJQb3NpdGlvbkNhY2hlIiwiY29sbGVjdFNsYXRFbHMiLCJjdXJyZW50TWFwIiwiZWxNYXAiLCJzcGxpdFNlZ3NCeUNvbCIsInNlZ3MiLCJzZWdzQnlDb2wiLCJjb2wiLCJzcGxpdEludGVyYWN0aW9uQnlDb2wiLCJ1aSIsImJ5Um93IiwiYWZmZWN0ZWRJbnN0YW5jZXMiLCJpc0V2ZW50IiwiX2kiLCJzZWciLCJUaW1lQ29sTW9yZUxpbmsiLCJNb3JlTGlua1Jvb3QiLCJhbGxEYXlEYXRlIiwibW9yZUNudCIsImhpZGRlblNlZ3MiLCJhbGxTZWdzIiwiYWxpZ25tZW50RWxSZWYiLCJyZW5kZXJNb3JlTGlua0lubmVyIiwiZXh0cmFEYXRlU3BhbiIsInRvZGF5UmFuZ2UiLCJwb3BvdmVyQ29udGVudCIsInJlbmRlclBsYWluRmdTZWdzIiwiaGFuZGxlQ2xpY2siLCJ0aXRsZSIsImlzRXhwYW5kZWQiLCJwb3BvdmVySWQiLCJlbCIsInNldFJlZiIsImJvdHRvbSIsIm9uQ2xpY2siLCJzaG9ydFRleHQiLCJidWlsZFBvc2l0aW9uaW5nIiwic2VnSW5wdXRzIiwic3RyaWN0T3JkZXIiLCJtYXhTdGFja0NudCIsImhpZXJhcmNoeSIsIlNlZ0hpZXJhcmNoeSIsImhpZGRlbkVudHJpZXMiLCJhZGRTZWdzIiwiaGlkZGVuR3JvdXBzIiwiZ3JvdXBJbnRlcnNlY3RpbmdFbnRyaWVzIiwid2ViIiwiYnVpbGRXZWIiLCJzdHJldGNoV2ViIiwic2VnUmVjdHMiLCJ3ZWJUb1JlY3RzIiwiZW50cmllc0J5TGV2ZWwiLCJidWlsZE5vZGUiLCJjYWNoZWFibGUiLCJsYXRlcmFsIiwic2libGluZ1JhbmdlIiwiZmluZE5leHRMZXZlbFNlZ3MiLCJuZXh0TGV2ZWxSZXMiLCJidWlsZE5vZGVzIiwiZW50cnkiLCJuZXh0TGV2ZWxOb2RlcyIsInRoaWNrbmVzcyIsImxhdGVyYWxTdGFydCIsImxhdGVyYWxFbmQiLCJwYWlycyIsInNvcnQiLCJjbXBEZXNjUHJlc3N1cmVzIiwiZXh0cmFjdE5vZGUiLCJhIiwiYiIsInN1YmplY3RMZXZlbCIsInN1YmplY3RMYXRlcmFsIiwibGV2ZWxDb29yZHMiLCJzdWJqZWN0RW50cnkiLCJhZnRlclN1YmplY3QiLCJsZXZlbENudCIsImVudHJpZXMiLCJzZWFyY2hJbmRleCIsImJpbmFyeVNlYXJjaCIsImdldEVudHJ5U3BhbkVuZCIsInRvcExldmVsTm9kZXMiLCJ0b3RhbFRoaWNrbmVzcyIsInN0cmV0Y2hOb2RlIiwibm9kZSIsInN0YXJ0Q29vcmQiLCJwcmV2VGhpY2tuZXNzIiwiYnVpbGRFbnRyeUtleSIsImFsbFRoaWNrbmVzcyIsInRoaWNrbmVzc0ZyYWN0aW9uIiwiZW5kQ29vcmQiLCJuZXdDaGlsZHJlbiIsIm5leHRMZXZlbE5vZGVzXzEiLCJjaGlsZE5vZGUiLCJyZXMiLCJuZXdUaGlja25lc3MiLCJyZWN0cyIsInByb2Nlc3NOb2RlIiwibGV2ZWxDb29yZCIsInN0YWNrRGVwdGgiLCJyZWN0Iiwic3RhY2tGb3J3YXJkIiwicHJvY2Vzc05vZGVzIiwibm9kZXMiLCJub2Rlc18xIiwia2V5RnVuYyIsIndvcmtGdW5jIiwiY2FjaGUiLCJhcmdzIiwiY29tcHV0ZVNlZ1ZDb29yZHMiLCJjb2xEYXRlIiwiZXZlbnRNaW5IZWlnaHQiLCJ2Y29vcmRzIiwic3BhblN0YXJ0Iiwic3BhbkVuZCIsInJvdW5kIiwiY29tcHV0ZUZnU2VnUGxhY2VtZW50cyIsInNlZ1ZDb29yZHMiLCJldmVudE9yZGVyU3RyaWN0IiwiZXZlbnRNYXhTdGFjayIsImR1bWJTZWdzIiwiaW5kZXgiLCJzZWdQbGFjZW1lbnRzIiwic2VnUmVjdHNfMSIsInNlZ1JlY3QiLCJfYiIsImR1bWJTZWdzXzEiLCJkdW1iU2VnIiwiREVGQVVMVF9USU1FX0ZPUk1BVCIsIlRpbWVDb2xFdmVudCIsImlzU2hvcnQiLCJTdGFuZGFyZEV2ZW50IiwiZGVmYXVsdFRpbWVGb3JtYXQiLCJleHRyYUNsYXNzTmFtZXMiLCJUaW1lQ29sTWlzYyIsIkRheUNlbGxDb250ZW50IiwiZXh0cmFIb29rUHJvcHMiLCJUaW1lQ29sIiwic29ydEV2ZW50U2VncyIsIm1lbW9pemUiLCJpc1NlbGVjdE1pcnJvciIsInNlbGVjdE1pcnJvciIsIm1pcnJvclNlZ3MiLCJldmVudERyYWciLCJldmVudFJlc2l6ZSIsImRhdGVTZWxlY3Rpb25TZWdzIiwiaW50ZXJhY3Rpb25BZmZlY3RlZEluc3RhbmNlcyIsInNvcnRlZEZnU2VncyIsImZnRXZlbnRTZWdzIiwiZXZlbnRPcmRlciIsIkRheUNlbGxSb290IiwiZGF0YUF0dHJzIiwiZXh0cmFEYXRhQXR0cnMiLCJyZW5kZXJGaWxsU2VncyIsImJ1c2luZXNzSG91clNlZ3MiLCJiZ0V2ZW50U2VncyIsInJlbmRlckZnU2VncyIsInJlbmRlck5vd0luZGljYXRvciIsIm5vd0luZGljYXRvclNlZ3MiLCJzZWdJc0ludmlzaWJsZSIsImlzRHJhZ2dpbmciLCJpc1Jlc2l6aW5nIiwiaXNEYXRlU2VsZWN0aW5nIiwicmVuZGVyUG9zaXRpb25lZEZnU2VncyIsImV2ZW50U2hvcnRIZWlnaHQiLCJldmVudFNlbGVjdGlvbiIsImlzTWlycm9yIiwiX2MiLCJGcmFnbWVudCIsInJlbmRlckhpZGRlbkdyb3VwcyIsInNlZ1BsYWNlbWVudCIsImluc3RhbmNlSWQiLCJldmVudFJhbmdlIiwiaW5zdGFuY2UiLCJpc1Zpc2libGUiLCJ2U3R5bGUiLCJjb21wdXRlU2VnVlN0eWxlIiwiaFN0eWxlIiwiY29tcHV0ZVNlZ0hTdHlsZSIsImxlZnQiLCJyaWdodCIsImlzSW5zZXQiLCJ2aXNpYmlsaXR5IiwiaXNTZWxlY3RlZCIsImdldFNlZ01ldGEiLCJoaWRkZW5Hcm91cCIsInBvc2l0aW9uQ3NzIiwiY29tcGlsZVNlZ3NGcm9tRW50cmllcyIsImJ1aWxkSXNvU3RyaW5nIiwiY29tcHV0ZUVhcmxpZXN0U2VnU3RhcnQiLCJmaWxsVHlwZSIsImNoaWxkcmVuIiwiYnVpbGRFdmVudFJhbmdlS2V5IiwiQmdFdmVudCIsInJlbmRlckZpbGwiLCJzZWdIQ29vcmRzIiwiaXNSdGwiLCJzaG91bGRPdmVybGFwIiwic2xvdEV2ZW50T3ZlcmxhcCIsIm5lYXJDb29yZCIsImZhckNvb3JkIiwiekluZGV4IiwiaGlkZGVuSW5zdGFuY2VzIiwic2VnRW50cmllcyIsInNlZ0VudHJ5IiwiVGltZUNvbHNDb250ZW50Iiwic3BsaXRGZ0V2ZW50U2VncyIsInNwbGl0QmdFdmVudFNlZ3MiLCJzcGxpdEJ1c2luZXNzSG91clNlZ3MiLCJzcGxpdE5vd0luZGljYXRvclNlZ3MiLCJzcGxpdERhdGVTZWxlY3Rpb25TZWdzIiwic3BsaXRFdmVudERyYWciLCJzcGxpdEV2ZW50UmVzaXplIiwiY2VsbEVsUmVmcyIsImNlbGxzIiwiZmdFdmVudFNlZ3NCeVJvdyIsImJnRXZlbnRTZWdzQnlSb3ciLCJidXNpbmVzc0hvdXJTZWdzQnlSb3ciLCJub3dJbmRpY2F0b3JTZWdzQnlSb3ciLCJkYXRlU2VsZWN0aW9uU2Vnc0J5Um93IiwiZXZlbnREcmFnQnlSb3ciLCJldmVudFJlc2l6ZUJ5Um93IiwiY2VsbCIsInVwZGF0ZUNvb3JkcyIsIm9uQ29sQ29vcmRzIiwiY29sbGVjdENlbGxFbHMiLCJUaW1lQ29scyIsInByb2Nlc3NTbG90T3B0aW9ucyIsImhhbmRsZVJvb3RFbCIsInJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQiLCJpc0hpdENvbWJvQWxsb3dlZCIsInVucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCIsImhhbmRsZVNjcm9sbFJlcXVlc3QiLCJyZXF1ZXN0Iiwib25TY3JvbGxUb3BSZXF1ZXN0IiwidG9wXzEiLCJjZWlsIiwiaGFuZGxlQ29sQ29vcmRzIiwiY29sQ29vcmRzIiwib25TbGF0Q29vcmRzIiwic2Nyb2xsUmVzcG9uZGVyIiwiY3JlYXRlU2Nyb2xsUmVzcG9uZGVyIiwicHJldlByb3BzIiwidXBkYXRlIiwiZGV0YWNoIiwicXVlcnlIaXQiLCJwb3NpdGlvbkxlZnQiLCJwb3NpdGlvblRvcCIsInNuYXBEdXJhdGlvbiIsInNuYXBzUGVyU2xvdCIsImNvbEluZGV4IiwibGVmdFRvSW5kZXgiLCJ0b3BUb0luZGV4Iiwic2xhdFRvcCIsInNsYXRIZWlnaHQiLCJwYXJ0aWFsIiwibG9jYWxTbmFwSW5kZXgiLCJzbmFwSW5kZXgiLCJkYXlEYXRlIiwiYWRkRHVyYXRpb25zIiwibXVsdGlwbHlEdXJhdGlvbiIsImFkZCIsImRheUVsIiwibGVmdHMiLCJyaWdodHMiLCJsYXllciIsInNuYXBEdXJhdGlvbk92ZXJyaWRlIiwid2hvbGVEaXZpZGVEdXJhdGlvbnMiLCJEYXlUaW1lQ29sc1NsaWNlciIsInNsaWNlUmFuZ2UiLCJkYXlSYW5nZXMiLCJzZWdSYW5nZSIsImludGVyc2VjdFJhbmdlcyIsImlzU3RhcnQiLCJpc0VuZCIsIlNsaWNlciIsIkRheVRpbWVDb2xzIiwiYnVpbGREYXlSYW5nZXMiLCJzbGljZXIiLCJ0aW1lQ29sc1JlZiIsImRheVRhYmxlTW9kZWwiLCJzbGljZVByb3BzIiwic2xpY2VOb3dEYXRlIiwicmFuZ2VzIiwiaGVhZGVyRGF0ZXMiLCJTVE9DS19TVUJfRFVSQVRJT05TIiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyIsImJ1aWxkU2xhdE1ldGFzIiwiZXhwbGljaXRMYWJlbEludGVydmFsIiwiZGF5U3RhcnQiLCJEYXRlIiwic2xhdFRpbWUiLCJzbGF0SXRlcmF0b3IiLCJsYWJlbEludGVydmFsIiwiY29tcHV0ZUxhYmVsSW50ZXJ2YWwiLCJtZXRhcyIsInRvSVNPU3RyaW5nIiwiZm9ybWF0SXNvVGltZVN0cmluZyIsInNsb3RzUGVyTGFiZWwiLCJEYXlUaW1lQ29sc1ZpZXciLCJidWlsZFRpbWVDb2xzTW9kZWwiLCJkYXRlUHJvZmlsZUdlbmVyYXRvciIsInNwbGl0UHJvcHMiLCJzbG90TGFiZWxJbnRlcnZhbCIsImhhc0F0dGFjaGVkQXhpcyIsImhhc0RldGFjaGVkQXhpcyIsImhlYWRlckNvbnRlbnQiLCJkYXlIZWFkZXJzIiwiRGF5SGVhZGVyIiwiZGF0ZXMiLCJkYXRlc1JlcERpc3RpbmN0RGF5cyIsInJlbmRlckludHJvIiwiYWxsRGF5U2xvdCIsIkRheVRhYmxlIiwibmV4dERheVRocmVzaG9sZCIsImNvbEdyb3VwTm9kZSIsInJlbmRlclJvd0ludHJvIiwic2hvd1dlZWtOdW1iZXJzIiwiaGVhZGVyQWxpZ25FbFJlZiIsInRpbWVHcmlkQ29udGVudCIsImRheVNlcmllcyIsIkRheVNlcmllc01vZGVsIiwiRGF5VGFibGVNb2RlbCIsIk9QVElPTl9SRUZJTkVSUyIsIm1haW4iLCJjcmVhdGVQbHVnaW4iLCJpbml0aWFsVmlldyIsIm9wdGlvblJlZmluZXJzIiwidmlld3MiLCJ0aW1lR3JpZCIsImNvbXBvbmVudCIsInVzZXNNaW5NYXhUaW1lIiwidGltZUdyaWREYXkiLCJkYXlzIiwidGltZUdyaWRXZWVrIiwid2Vla3MiXSwic291cmNlcyI6WyJtYWluLmNqcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbkZ1bGxDYWxlbmRhciB2NS4xMS4yXG5Eb2NzICYgTGljZW5zZTogaHR0cHM6Ly9mdWxsY2FsZW5kYXIuaW8vXG4oYykgMjAyMiBBZGFtIFNoYXdcbiovXG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciBjb21tb24gPSByZXF1aXJlKCdAZnVsbGNhbGVuZGFyL2NvbW1vbicpO1xudmFyIHRzbGliID0gcmVxdWlyZSgndHNsaWInKTtcbnZhciBkYXlncmlkID0gcmVxdWlyZSgnQGZ1bGxjYWxlbmRhci9kYXlncmlkJyk7XG47XG5cbnZhciBBbGxEYXlTcGxpdHRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoQWxsRGF5U3BsaXR0ZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQWxsRGF5U3BsaXR0ZXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgQWxsRGF5U3BsaXR0ZXIucHJvdG90eXBlLmdldEtleUluZm8gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGxEYXk6IHt9LFxuICAgICAgICAgICAgdGltZWQ6IHt9LFxuICAgICAgICB9O1xuICAgIH07XG4gICAgQWxsRGF5U3BsaXR0ZXIucHJvdG90eXBlLmdldEtleXNGb3JEYXRlU3BhbiA9IGZ1bmN0aW9uIChkYXRlU3Bhbikge1xuICAgICAgICBpZiAoZGF0ZVNwYW4uYWxsRGF5KSB7XG4gICAgICAgICAgICByZXR1cm4gWydhbGxEYXknXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gWyd0aW1lZCddO1xuICAgIH07XG4gICAgQWxsRGF5U3BsaXR0ZXIucHJvdG90eXBlLmdldEtleXNGb3JFdmVudERlZiA9IGZ1bmN0aW9uIChldmVudERlZikge1xuICAgICAgICBpZiAoIWV2ZW50RGVmLmFsbERheSkge1xuICAgICAgICAgICAgcmV0dXJuIFsndGltZWQnXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbW9uLmhhc0JnUmVuZGVyaW5nKGV2ZW50RGVmKSkge1xuICAgICAgICAgICAgcmV0dXJuIFsndGltZWQnLCAnYWxsRGF5J107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFsnYWxsRGF5J107XG4gICAgfTtcbiAgICByZXR1cm4gQWxsRGF5U3BsaXR0ZXI7XG59KGNvbW1vbi5TcGxpdHRlcikpO1xuXG52YXIgREVGQVVMVF9TTEFUX0xBQkVMX0ZPUk1BVCA9IGNvbW1vbi5jcmVhdGVGb3JtYXR0ZXIoe1xuICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICBvbWl0WmVyb01pbnV0ZTogdHJ1ZSxcbiAgICBtZXJpZGllbTogJ3Nob3J0Jyxcbn0pO1xuZnVuY3Rpb24gVGltZUNvbHNBeGlzQ2VsbChwcm9wcykge1xuICAgIHZhciBjbGFzc05hbWVzID0gW1xuICAgICAgICAnZmMtdGltZWdyaWQtc2xvdCcsXG4gICAgICAgICdmYy10aW1lZ3JpZC1zbG90LWxhYmVsJyxcbiAgICAgICAgcHJvcHMuaXNMYWJlbGVkID8gJ2ZjLXNjcm9sbGdyaWQtc2hyaW5rJyA6ICdmYy10aW1lZ3JpZC1zbG90LW1pbm9yJyxcbiAgICBdO1xuICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLlZpZXdDb250ZXh0VHlwZS5Db25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCFwcm9wcy5pc0xhYmVsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy5qb2luKCcgJyksIFwiZGF0YS10aW1lXCI6IHByb3BzLmlzb1RpbWVTdHIgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXRlRW52ID0gY29udGV4dC5kYXRlRW52LCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zLCB2aWV3QXBpID0gY29udGV4dC52aWV3QXBpO1xuICAgICAgICB2YXIgbGFiZWxGb3JtYXQgPSAvLyBUT0RPOiBmdWxseSBwcmUtcGFyc2VcbiAgICAgICAgIG9wdGlvbnMuc2xvdExhYmVsRm9ybWF0ID09IG51bGwgPyBERUZBVUxUX1NMQVRfTEFCRUxfRk9STUFUIDpcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkob3B0aW9ucy5zbG90TGFiZWxGb3JtYXQpID8gY29tbW9uLmNyZWF0ZUZvcm1hdHRlcihvcHRpb25zLnNsb3RMYWJlbEZvcm1hdFswXSkgOlxuICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVGb3JtYXR0ZXIob3B0aW9ucy5zbG90TGFiZWxGb3JtYXQpO1xuICAgICAgICB2YXIgaG9va1Byb3BzID0ge1xuICAgICAgICAgICAgbGV2ZWw6IDAsXG4gICAgICAgICAgICB0aW1lOiBwcm9wcy50aW1lLFxuICAgICAgICAgICAgZGF0ZTogZGF0ZUVudi50b0RhdGUocHJvcHMuZGF0ZSksXG4gICAgICAgICAgICB2aWV3OiB2aWV3QXBpLFxuICAgICAgICAgICAgdGV4dDogZGF0ZUVudi5mb3JtYXQocHJvcHMuZGF0ZSwgbGFiZWxGb3JtYXQpLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5SZW5kZXJIb29rLCB7IGhvb2tQcm9wczogaG9va1Byb3BzLCBjbGFzc05hbWVzOiBvcHRpb25zLnNsb3RMYWJlbENsYXNzTmFtZXMsIGNvbnRlbnQ6IG9wdGlvbnMuc2xvdExhYmVsQ29udGVudCwgZGVmYXVsdENvbnRlbnQ6IHJlbmRlcklubmVyQ29udGVudCwgZGlkTW91bnQ6IG9wdGlvbnMuc2xvdExhYmVsRGlkTW91bnQsIHdpbGxVbm1vdW50OiBvcHRpb25zLnNsb3RMYWJlbFdpbGxVbm1vdW50IH0sIGZ1bmN0aW9uIChyb290RWxSZWYsIGN1c3RvbUNsYXNzTmFtZXMsIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCkgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGRcIiwgeyByZWY6IHJvb3RFbFJlZiwgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmNvbmNhdChjdXN0b21DbGFzc05hbWVzKS5qb2luKCcgJyksIFwiZGF0YS10aW1lXCI6IHByb3BzLmlzb1RpbWVTdHIgfSxcbiAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLXRpbWVncmlkLXNsb3QtbGFiZWwtZnJhbWUgZmMtc2Nyb2xsZ3JpZC1zaHJpbmstZnJhbWVcIiB9LFxuICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLXRpbWVncmlkLXNsb3QtbGFiZWwtY3VzaGlvbiBmYy1zY3JvbGxncmlkLXNocmluay1jdXNoaW9uXCIsIHJlZjogaW5uZXJFbFJlZiB9LCBpbm5lckNvbnRlbnQpKSkpOyB9KSk7XG4gICAgfSkpO1xufVxuZnVuY3Rpb24gcmVuZGVySW5uZXJDb250ZW50KHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLnRleHQ7XG59XG5cbnZhciBUaW1lQm9keUF4aXMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFRpbWVCb2R5QXhpcywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUaW1lQm9keUF4aXMoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgVGltZUJvZHlBeGlzLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLnNsYXRNZXRhcy5tYXAoZnVuY3Rpb24gKHNsYXRNZXRhKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCB7IGtleTogc2xhdE1ldGEua2V5IH0sXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChUaW1lQ29sc0F4aXNDZWxsLCB0c2xpYi5fX2Fzc2lnbih7fSwgc2xhdE1ldGEpKSkpOyB9KTtcbiAgICB9O1xuICAgIHJldHVybiBUaW1lQm9keUF4aXM7XG59KGNvbW1vbi5CYXNlQ29tcG9uZW50KSk7XG5cbnZhciBERUZBVUxUX1dFRUtfTlVNX0ZPUk1BVCA9IGNvbW1vbi5jcmVhdGVGb3JtYXR0ZXIoeyB3ZWVrOiAnc2hvcnQnIH0pO1xudmFyIEFVVE9fQUxMX0RBWV9NQVhfRVZFTlRfUk9XUyA9IDU7XG52YXIgVGltZUNvbHNWaWV3ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhUaW1lQ29sc1ZpZXcsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGltZUNvbHNWaWV3KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuYWxsRGF5U3BsaXR0ZXIgPSBuZXcgQWxsRGF5U3BsaXR0ZXIoKTsgLy8gZm9yIHVzZSBieSBzdWJjbGFzc2VzXG4gICAgICAgIF90aGlzLmhlYWRlckVsUmVmID0gY29tbW9uLmNyZWF0ZVJlZigpO1xuICAgICAgICBfdGhpcy5yb290RWxSZWYgPSBjb21tb24uY3JlYXRlUmVmKCk7XG4gICAgICAgIF90aGlzLnNjcm9sbGVyRWxSZWYgPSBjb21tb24uY3JlYXRlUmVmKCk7XG4gICAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgc2xhdENvb3JkczogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlU2Nyb2xsVG9wUmVxdWVzdCA9IGZ1bmN0aW9uIChzY3JvbGxUb3ApIHtcbiAgICAgICAgICAgIHZhciBzY3JvbGxlckVsID0gX3RoaXMuc2Nyb2xsZXJFbFJlZi5jdXJyZW50O1xuICAgICAgICAgICAgaWYgKHNjcm9sbGVyRWwpIHsgLy8gVE9ETzogbm90IHN1cmUgaG93IHRoaXMgY291bGQgZXZlciBiZSBudWxsLiB3ZWlyZG5lc3Mgd2l0aCB0aGUgcmVkdWNlclxuICAgICAgICAgICAgICAgIHNjcm9sbGVyRWwuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKiBIZWFkZXIgUmVuZGVyIE1ldGhvZHNcbiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbiAgICAgICAgX3RoaXMucmVuZGVySGVhZEF4aXMgPSBmdW5jdGlvbiAocm93S2V5LCBmcmFtZUhlaWdodCkge1xuICAgICAgICAgICAgaWYgKGZyYW1lSGVpZ2h0ID09PSB2b2lkIDApIHsgZnJhbWVIZWlnaHQgPSAnJzsgfVxuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBfdGhpcy5jb250ZXh0Lm9wdGlvbnM7XG4gICAgICAgICAgICB2YXIgZGF0ZVByb2ZpbGUgPSBfdGhpcy5wcm9wcy5kYXRlUHJvZmlsZTtcbiAgICAgICAgICAgIHZhciByYW5nZSA9IGRhdGVQcm9maWxlLnJlbmRlclJhbmdlO1xuICAgICAgICAgICAgdmFyIGRheUNudCA9IGNvbW1vbi5kaWZmRGF5cyhyYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIHZhciBuYXZMaW5rQXR0cnMgPSAoZGF5Q250ID09PSAxKSAvLyBvbmx5IGRvIGluIGRheSB2aWV3cyAodG8gYXZvaWQgZG9pbmcgaW4gd2VlayB2aWV3cyB0aGF0IGRvbnQgbmVlZCBpdClcbiAgICAgICAgICAgICAgICA/IGNvbW1vbi5idWlsZE5hdkxpbmtBdHRycyhfdGhpcy5jb250ZXh0LCByYW5nZS5zdGFydCwgJ3dlZWsnKVxuICAgICAgICAgICAgICAgIDoge307XG4gICAgICAgICAgICBpZiAob3B0aW9ucy53ZWVrTnVtYmVycyAmJiByb3dLZXkgPT09ICdkYXknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uV2Vla051bWJlclJvb3QsIHsgZGF0ZTogcmFuZ2Uuc3RhcnQsIGRlZmF1bHRGb3JtYXQ6IERFRkFVTFRfV0VFS19OVU1fRk9STUFUIH0sIGZ1bmN0aW9uIChyb290RWxSZWYsIGNsYXNzTmFtZXMsIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCkgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGhcIiwgeyByZWY6IHJvb3RFbFJlZiwgXCJhcmlhLWhpZGRlblwiOiB0cnVlLCBjbGFzc05hbWU6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdmYy10aW1lZ3JpZC1heGlzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdmYy1zY3JvbGxncmlkLXNocmluaycsXG4gICAgICAgICAgICAgICAgICAgIF0uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSB9LFxuICAgICAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy10aW1lZ3JpZC1heGlzLWZyYW1lIGZjLXNjcm9sbGdyaWQtc2hyaW5rLWZyYW1lIGZjLXRpbWVncmlkLWF4aXMtZnJhbWUtbGlxdWlkXCIsIHN0eWxlOiB7IGhlaWdodDogZnJhbWVIZWlnaHQgfSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHRzbGliLl9fYXNzaWduKHsgcmVmOiBpbm5lckVsUmVmLCBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtYXhpcy1jdXNoaW9uIGZjLXNjcm9sbGdyaWQtc2hyaW5rLWN1c2hpb24gZmMtc2Nyb2xsZ3JpZC1zeW5jLWlubmVyXCIgfSwgbmF2TGlua0F0dHJzKSwgaW5uZXJDb250ZW50KSkpKTsgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcInRoXCIsIHsgXCJhcmlhLWhpZGRlblwiOiB0cnVlLCBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtYXhpc1wiIH0sXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtYXhpcy1mcmFtZVwiLCBzdHlsZTogeyBoZWlnaHQ6IGZyYW1lSGVpZ2h0IH0gfSkpKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyogVGFibGUgQ29tcG9uZW50IFJlbmRlciBNZXRob2RzXG4gICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4gICAgICAgIC8vIG9ubHkgYSBvbmUtd2F5IGhlaWdodCBzeW5jLiB3ZSBkb24ndCBzZW5kIHRoZSBheGlzIGlubmVyLWNvbnRlbnQgaGVpZ2h0IHRvIHRoZSBEYXlHcmlkLFxuICAgICAgICAvLyBidXQgRGF5R3JpZCBzdGlsbCBuZWVkcyB0byBoYXZlIGNsYXNzTmFtZXMgb24gaW5uZXIgZWxlbWVudHMgaW4gb3JkZXIgdG8gbWVhc3VyZS5cbiAgICAgICAgX3RoaXMucmVuZGVyVGFibGVSb3dBeGlzID0gZnVuY3Rpb24gKHJvd0hlaWdodCkge1xuICAgICAgICAgICAgdmFyIF9hID0gX3RoaXMuY29udGV4dCwgb3B0aW9ucyA9IF9hLm9wdGlvbnMsIHZpZXdBcGkgPSBfYS52aWV3QXBpO1xuICAgICAgICAgICAgdmFyIGhvb2tQcm9wcyA9IHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBvcHRpb25zLmFsbERheVRleHQsXG4gICAgICAgICAgICAgICAgdmlldzogdmlld0FwaSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgLy8gVE9ETzogbWFrZSByZXVzYWJsZSBob29rLiB1c2VkIGluIGxpc3QgdmlldyB0b29cbiAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5SZW5kZXJIb29rLCB7IGhvb2tQcm9wczogaG9va1Byb3BzLCBjbGFzc05hbWVzOiBvcHRpb25zLmFsbERheUNsYXNzTmFtZXMsIGNvbnRlbnQ6IG9wdGlvbnMuYWxsRGF5Q29udGVudCwgZGVmYXVsdENvbnRlbnQ6IHJlbmRlckFsbERheUlubmVyLCBkaWRNb3VudDogb3B0aW9ucy5hbGxEYXlEaWRNb3VudCwgd2lsbFVubW91bnQ6IG9wdGlvbnMuYWxsRGF5V2lsbFVubW91bnQgfSwgZnVuY3Rpb24gKHJvb3RFbFJlZiwgY2xhc3NOYW1lcywgaW5uZXJFbFJlZiwgaW5uZXJDb250ZW50KSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCB7IHJlZjogcm9vdEVsUmVmLCBcImFyaWEtaGlkZGVuXCI6IHRydWUsIGNsYXNzTmFtZTogW1xuICAgICAgICAgICAgICAgICAgICAnZmMtdGltZWdyaWQtYXhpcycsXG4gICAgICAgICAgICAgICAgICAgICdmYy1zY3JvbGxncmlkLXNocmluaycsXG4gICAgICAgICAgICAgICAgXS5jb25jYXQoY2xhc3NOYW1lcykuam9pbignICcpIH0sXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6ICdmYy10aW1lZ3JpZC1heGlzLWZyYW1lIGZjLXNjcm9sbGdyaWQtc2hyaW5rLWZyYW1lJyArIChyb3dIZWlnaHQgPT0gbnVsbCA/ICcgZmMtdGltZWdyaWQtYXhpcy1mcmFtZS1saXF1aWQnIDogJycpLCBzdHlsZTogeyBoZWlnaHQ6IHJvd0hlaWdodCB9IH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogXCJmYy10aW1lZ3JpZC1heGlzLWN1c2hpb24gZmMtc2Nyb2xsZ3JpZC1zaHJpbmstY3VzaGlvbiBmYy1zY3JvbGxncmlkLXN5bmMtaW5uZXJcIiwgcmVmOiBpbm5lckVsUmVmIH0sIGlubmVyQ29udGVudCkpKSk7IH0pKTtcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlU2xhdENvb3JkcyA9IGZ1bmN0aW9uIChzbGF0Q29vcmRzKSB7XG4gICAgICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7IHNsYXRDb29yZHM6IHNsYXRDb29yZHMgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLy8gcmVuZGVyaW5nXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFRpbWVDb2xzVmlldy5wcm90b3R5cGUucmVuZGVyU2ltcGxlTGF5b3V0ID0gZnVuY3Rpb24gKGhlYWRlclJvd0NvbnRlbnQsIGFsbERheUNvbnRlbnQsIHRpbWVDb250ZW50KSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIGNvbnRleHQgPSBfYS5jb250ZXh0LCBwcm9wcyA9IF9hLnByb3BzO1xuICAgICAgICB2YXIgc2VjdGlvbnMgPSBbXTtcbiAgICAgICAgdmFyIHN0aWNreUhlYWRlckRhdGVzID0gY29tbW9uLmdldFN0aWNreUhlYWRlckRhdGVzKGNvbnRleHQub3B0aW9ucyk7XG4gICAgICAgIGlmIChoZWFkZXJSb3dDb250ZW50KSB7XG4gICAgICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnaGVhZGVyJyxcbiAgICAgICAgICAgICAgICBrZXk6ICdoZWFkZXInLFxuICAgICAgICAgICAgICAgIGlzU3RpY2t5OiBzdGlja3lIZWFkZXJEYXRlcyxcbiAgICAgICAgICAgICAgICBjaHVuazoge1xuICAgICAgICAgICAgICAgICAgICBlbFJlZjogdGhpcy5oZWFkZXJFbFJlZixcbiAgICAgICAgICAgICAgICAgICAgdGFibGVDbGFzc05hbWU6ICdmYy1jb2wtaGVhZGVyJyxcbiAgICAgICAgICAgICAgICAgICAgcm93Q29udGVudDogaGVhZGVyUm93Q29udGVudCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsbERheUNvbnRlbnQpIHtcbiAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdib2R5JyxcbiAgICAgICAgICAgICAgICBrZXk6ICdhbGwtZGF5JyxcbiAgICAgICAgICAgICAgICBjaHVuazogeyBjb250ZW50OiBhbGxEYXlDb250ZW50IH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdib2R5JyxcbiAgICAgICAgICAgICAgICBrZXk6ICdhbGwtZGF5LWRpdmlkZXInLFxuICAgICAgICAgICAgICAgIG91dGVyQ29udGVudDogKCAvLyBUT0RPOiByZW5hbWUgdG8gY2VsbENvbnRlbnQgc28gZG9uJ3QgbmVlZCB0byBkZWZpbmUgPHRyPj9cbiAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInRyXCIsIHsgcm9sZTogXCJwcmVzZW50YXRpb25cIiwgY2xhc3NOYW1lOiBcImZjLXNjcm9sbGdyaWQtc2VjdGlvblwiIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGRcIiwgeyBjbGFzc05hbWU6ICdmYy10aW1lZ3JpZC1kaXZpZGVyICcgKyBjb250ZXh0LnRoZW1lLmdldENsYXNzKCd0YWJsZUNlbGxTaGFkZWQnKSB9KSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnYm9keScsXG4gICAgICAgICAgICBrZXk6ICdib2R5JyxcbiAgICAgICAgICAgIGxpcXVpZDogdHJ1ZSxcbiAgICAgICAgICAgIGV4cGFuZFJvd3M6IEJvb2xlYW4oY29udGV4dC5vcHRpb25zLmV4cGFuZFJvd3MpLFxuICAgICAgICAgICAgY2h1bms6IHtcbiAgICAgICAgICAgICAgICBzY3JvbGxlckVsUmVmOiB0aGlzLnNjcm9sbGVyRWxSZWYsXG4gICAgICAgICAgICAgICAgY29udGVudDogdGltZUNvbnRlbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uVmlld1Jvb3QsIHsgdmlld1NwZWM6IGNvbnRleHQudmlld1NwZWMsIGVsUmVmOiB0aGlzLnJvb3RFbFJlZiB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFsnZmMtdGltZWdyaWQnXS5jb25jYXQoY2xhc3NOYW1lcykuam9pbignICcpLCByZWY6IHJvb3RFbFJlZiB9LFxuICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLlNpbXBsZVNjcm9sbEdyaWQsIHsgbGlxdWlkOiAhcHJvcHMuaXNIZWlnaHRBdXRvICYmICFwcm9wcy5mb3JQcmludCwgY29sbGFwc2libGVXaWR0aDogcHJvcHMuZm9yUHJpbnQsIGNvbHM6IFt7IHdpZHRoOiAnc2hyaW5rJyB9XSwgc2VjdGlvbnM6IHNlY3Rpb25zIH0pKSk7IH0pKTtcbiAgICB9O1xuICAgIFRpbWVDb2xzVmlldy5wcm90b3R5cGUucmVuZGVySFNjcm9sbExheW91dCA9IGZ1bmN0aW9uIChoZWFkZXJSb3dDb250ZW50LCBhbGxEYXlDb250ZW50LCB0aW1lQ29udGVudCwgY29sQ250LCBkYXlNaW5XaWR0aCwgc2xhdE1ldGFzLCBzbGF0Q29vcmRzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBTY3JvbGxHcmlkID0gdGhpcy5jb250ZXh0LnBsdWdpbkhvb2tzLnNjcm9sbEdyaWRJbXBsO1xuICAgICAgICBpZiAoIVNjcm9sbEdyaWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gU2Nyb2xsR3JpZCBpbXBsZW1lbnRhdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIGNvbnRleHQgPSBfYS5jb250ZXh0LCBwcm9wcyA9IF9hLnByb3BzO1xuICAgICAgICB2YXIgc3RpY2t5SGVhZGVyRGF0ZXMgPSAhcHJvcHMuZm9yUHJpbnQgJiYgY29tbW9uLmdldFN0aWNreUhlYWRlckRhdGVzKGNvbnRleHQub3B0aW9ucyk7XG4gICAgICAgIHZhciBzdGlja3lGb290ZXJTY3JvbGxiYXIgPSAhcHJvcHMuZm9yUHJpbnQgJiYgY29tbW9uLmdldFN0aWNreUZvb3RlclNjcm9sbGJhcihjb250ZXh0Lm9wdGlvbnMpO1xuICAgICAgICB2YXIgc2VjdGlvbnMgPSBbXTtcbiAgICAgICAgaWYgKGhlYWRlclJvd0NvbnRlbnQpIHtcbiAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdoZWFkZXInLFxuICAgICAgICAgICAgICAgIGtleTogJ2hlYWRlcicsXG4gICAgICAgICAgICAgICAgaXNTdGlja3k6IHN0aWNreUhlYWRlckRhdGVzLFxuICAgICAgICAgICAgICAgIHN5bmNSb3dIZWlnaHRzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNodW5rczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdheGlzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0NvbnRlbnQ6IGZ1bmN0aW9uIChhcmcpIHsgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcInRyXCIsIHsgcm9sZTogXCJwcmVzZW50YXRpb25cIiB9LCBfdGhpcy5yZW5kZXJIZWFkQXhpcygnZGF5JywgYXJnLnJvd1N5bmNIZWlnaHRzWzBdKSkpOyB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdjb2xzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsUmVmOiB0aGlzLmhlYWRlckVsUmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDbGFzc05hbWU6ICdmYy1jb2wtaGVhZGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0NvbnRlbnQ6IGhlYWRlclJvd0NvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbGxEYXlDb250ZW50KSB7XG4gICAgICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYm9keScsXG4gICAgICAgICAgICAgICAga2V5OiAnYWxsLWRheScsXG4gICAgICAgICAgICAgICAgc3luY1Jvd0hlaWdodHM6IHRydWUsXG4gICAgICAgICAgICAgICAgY2h1bmtzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2F4aXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm93Q29udGVudDogZnVuY3Rpb24gKGNvbnRlbnRBcmcpIHsgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcInRyXCIsIHsgcm9sZTogXCJwcmVzZW50YXRpb25cIiB9LCBfdGhpcy5yZW5kZXJUYWJsZVJvd0F4aXMoY29udGVudEFyZy5yb3dTeW5jSGVpZ2h0c1swXSkpKTsgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnY29scycsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBhbGxEYXlDb250ZW50LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogJ2FsbC1kYXktZGl2aWRlcicsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2JvZHknLFxuICAgICAgICAgICAgICAgIG91dGVyQ29udGVudDogKCAvLyBUT0RPOiByZW5hbWUgdG8gY2VsbENvbnRlbnQgc28gZG9uJ3QgbmVlZCB0byBkZWZpbmUgPHRyPj9cbiAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInRyXCIsIHsgcm9sZTogXCJwcmVzZW50YXRpb25cIiwgY2xhc3NOYW1lOiBcImZjLXNjcm9sbGdyaWQtc2VjdGlvblwiIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGRcIiwgeyBjb2xTcGFuOiAyLCBjbGFzc05hbWU6ICdmYy10aW1lZ3JpZC1kaXZpZGVyICcgKyBjb250ZXh0LnRoZW1lLmdldENsYXNzKCd0YWJsZUNlbGxTaGFkZWQnKSB9KSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlzTm93SW5kaWNhdG9yID0gY29udGV4dC5vcHRpb25zLm5vd0luZGljYXRvcjtcbiAgICAgICAgc2VjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnYm9keScsXG4gICAgICAgICAgICBrZXk6ICdib2R5JyxcbiAgICAgICAgICAgIGxpcXVpZDogdHJ1ZSxcbiAgICAgICAgICAgIGV4cGFuZFJvd3M6IEJvb2xlYW4oY29udGV4dC5vcHRpb25zLmV4cGFuZFJvd3MpLFxuICAgICAgICAgICAgY2h1bmtzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBrZXk6ICdheGlzJyxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYWtlIHRoaXMgbm93LWluZGljYXRvciBhcnJvdyBtb3JlIERSWSB3aXRoIFRpbWVDb2xzQ29udGVudFxuICAgICAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy10aW1lZ3JpZC1heGlzLWNodW5rXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGFibGVcIiwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUsIHN0eWxlOiB7IGhlaWdodDogYXJnLmV4cGFuZFJvd3MgPyBhcmcuY2xpZW50SGVpZ2h0IDogJycgfSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZy50YWJsZUNvbEdyb3VwTm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInRib2R5XCIsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFRpbWVCb2R5QXhpcywgeyBzbGF0TWV0YXM6IHNsYXRNZXRhcyB9KSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtbm93LWluZGljYXRvci1jb250YWluZXJcIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5Ob3dUaW1lciwgeyB1bml0OiBpc05vd0luZGljYXRvciA/ICdtaW51dGUnIDogJ2RheScgLyogaGFja3kgKi8gfSwgZnVuY3Rpb24gKG5vd0RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vd0luZGljYXRvclRvcCA9IGlzTm93SW5kaWNhdG9yICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGF0Q29vcmRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGF0Q29vcmRzLnNhZmVDb21wdXRlVG9wKG5vd0RhdGUpOyAvLyBtaWdodCByZXR1cm4gdm9pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5vd0luZGljYXRvclRvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLk5vd0luZGljYXRvclJvb3QsIHsgaXNBeGlzOiB0cnVlLCBkYXRlOiBub3dEYXRlIH0sIGZ1bmN0aW9uIChyb290RWxSZWYsIGNsYXNzTmFtZXMsIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCkgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgcmVmOiByb290RWxSZWYsIGNsYXNzTmFtZTogWydmYy10aW1lZ3JpZC1ub3ctaW5kaWNhdG9yLWFycm93J10uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSwgc3R5bGU6IHsgdG9wOiBub3dJbmRpY2F0b3JUb3AgfSB9LCBpbm5lckNvbnRlbnQpKTsgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSkpOyB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBrZXk6ICdjb2xzJyxcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsZXJFbFJlZjogdGhpcy5zY3JvbGxlckVsUmVmLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB0aW1lQ29udGVudCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzdGlja3lGb290ZXJTY3JvbGxiYXIpIHtcbiAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogJ2Zvb3RlcicsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2Zvb3RlcicsXG4gICAgICAgICAgICAgICAgaXNTdGlja3k6IHRydWUsXG4gICAgICAgICAgICAgICAgY2h1bmtzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2F4aXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogY29tbW9uLnJlbmRlclNjcm9sbFNoaW0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2NvbHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogY29tbW9uLnJlbmRlclNjcm9sbFNoaW0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLlZpZXdSb290LCB7IHZpZXdTcGVjOiBjb250ZXh0LnZpZXdTcGVjLCBlbFJlZjogdGhpcy5yb290RWxSZWYgfSwgZnVuY3Rpb24gKHJvb3RFbFJlZiwgY2xhc3NOYW1lcykgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBbJ2ZjLXRpbWVncmlkJ10uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSwgcmVmOiByb290RWxSZWYgfSxcbiAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFNjcm9sbEdyaWQsIHsgbGlxdWlkOiAhcHJvcHMuaXNIZWlnaHRBdXRvICYmICFwcm9wcy5mb3JQcmludCwgY29sbGFwc2libGVXaWR0aDogZmFsc2UsIGNvbEdyb3VwczogW1xuICAgICAgICAgICAgICAgICAgICB7IHdpZHRoOiAnc2hyaW5rJywgY29sczogW3sgd2lkdGg6ICdzaHJpbmsnIH1dIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sczogW3sgc3BhbjogY29sQ250LCBtaW5XaWR0aDogZGF5TWluV2lkdGggfV0gfSxcbiAgICAgICAgICAgICAgICBdLCBzZWN0aW9uczogc2VjdGlvbnMgfSkpKTsgfSkpO1xuICAgIH07XG4gICAgLyogRGltZW5zaW9uc1xuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4gICAgVGltZUNvbHNWaWV3LnByb3RvdHlwZS5nZXRBbGxEYXlNYXhFdmVudFByb3BzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmNvbnRleHQub3B0aW9ucywgZGF5TWF4RXZlbnRzID0gX2EuZGF5TWF4RXZlbnRzLCBkYXlNYXhFdmVudFJvd3MgPSBfYS5kYXlNYXhFdmVudFJvd3M7XG4gICAgICAgIGlmIChkYXlNYXhFdmVudHMgPT09IHRydWUgfHwgZGF5TWF4RXZlbnRSb3dzID09PSB0cnVlKSB7IC8vIGlzIGF1dG8/XG4gICAgICAgICAgICBkYXlNYXhFdmVudHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBkYXlNYXhFdmVudFJvd3MgPSBBVVRPX0FMTF9EQVlfTUFYX0VWRU5UX1JPV1M7IC8vIG1ha2Ugc3VyZSBcImF1dG9cIiBnb2VzIHRvIGEgcmVhbCBudW1iZXJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkYXlNYXhFdmVudHM6IGRheU1heEV2ZW50cywgZGF5TWF4RXZlbnRSb3dzOiBkYXlNYXhFdmVudFJvd3MgfTtcbiAgICB9O1xuICAgIHJldHVybiBUaW1lQ29sc1ZpZXc7XG59KGNvbW1vbi5EYXRlQ29tcG9uZW50KSk7XG5mdW5jdGlvbiByZW5kZXJBbGxEYXlJbm5lcihob29rUHJvcHMpIHtcbiAgICByZXR1cm4gaG9va1Byb3BzLnRleHQ7XG59XG5cbnZhciBUaW1lQ29sc1NsYXRzQ29vcmRzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRpbWVDb2xzU2xhdHNDb29yZHMocG9zaXRpb25zLCBkYXRlUHJvZmlsZSwgc2xvdER1cmF0aW9uKSB7XG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gcG9zaXRpb25zO1xuICAgICAgICB0aGlzLmRhdGVQcm9maWxlID0gZGF0ZVByb2ZpbGU7XG4gICAgICAgIHRoaXMuc2xvdER1cmF0aW9uID0gc2xvdER1cmF0aW9uO1xuICAgIH1cbiAgICBUaW1lQ29sc1NsYXRzQ29vcmRzLnByb3RvdHlwZS5zYWZlQ29tcHV0ZVRvcCA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIHZhciBkYXRlUHJvZmlsZSA9IHRoaXMuZGF0ZVByb2ZpbGU7XG4gICAgICAgIGlmIChjb21tb24ucmFuZ2VDb250YWluc01hcmtlcihkYXRlUHJvZmlsZS5jdXJyZW50UmFuZ2UsIGRhdGUpKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnRPZkRheURhdGUgPSBjb21tb24uc3RhcnRPZkRheShkYXRlKTtcbiAgICAgICAgICAgIHZhciB0aW1lTXMgPSBkYXRlLnZhbHVlT2YoKSAtIHN0YXJ0T2ZEYXlEYXRlLnZhbHVlT2YoKTtcbiAgICAgICAgICAgIGlmICh0aW1lTXMgPj0gY29tbW9uLmFzUm91Z2hNcyhkYXRlUHJvZmlsZS5zbG90TWluVGltZSkgJiZcbiAgICAgICAgICAgICAgICB0aW1lTXMgPCBjb21tb24uYXNSb3VnaE1zKGRhdGVQcm9maWxlLnNsb3RNYXhUaW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVUaW1lVG9wKGNvbW1vbi5jcmVhdGVEdXJhdGlvbih0aW1lTXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIC8vIENvbXB1dGVzIHRoZSB0b3AgY29vcmRpbmF0ZSwgcmVsYXRpdmUgdG8gdGhlIGJvdW5kcyBvZiB0aGUgZ3JpZCwgb2YgdGhlIGdpdmVuIGRhdGUuXG4gICAgLy8gQSBgc3RhcnRPZkRheURhdGVgIG11c3QgYmUgZ2l2ZW4gZm9yIGF2b2lkaW5nIGFtYmlndWl0eSBvdmVyIGhvdyB0byB0cmVhdCBtaWRuaWdodC5cbiAgICBUaW1lQ29sc1NsYXRzQ29vcmRzLnByb3RvdHlwZS5jb21wdXRlRGF0ZVRvcCA9IGZ1bmN0aW9uICh3aGVuLCBzdGFydE9mRGF5RGF0ZSkge1xuICAgICAgICBpZiAoIXN0YXJ0T2ZEYXlEYXRlKSB7XG4gICAgICAgICAgICBzdGFydE9mRGF5RGF0ZSA9IGNvbW1vbi5zdGFydE9mRGF5KHdoZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVUaW1lVG9wKGNvbW1vbi5jcmVhdGVEdXJhdGlvbih3aGVuLnZhbHVlT2YoKSAtIHN0YXJ0T2ZEYXlEYXRlLnZhbHVlT2YoKSkpO1xuICAgIH07XG4gICAgLy8gQ29tcHV0ZXMgdGhlIHRvcCBjb29yZGluYXRlLCByZWxhdGl2ZSB0byB0aGUgYm91bmRzIG9mIHRoZSBncmlkLCBvZiB0aGUgZ2l2ZW4gdGltZSAoYSBEdXJhdGlvbikuXG4gICAgLy8gVGhpcyBpcyBhIG1ha2VzaGlmeSB3YXkgdG8gY29tcHV0ZSB0aGUgdGltZS10b3AuIEFzc3VtZXMgYWxsIHNsYXRNZXRhcyBkYXRlcyBhcmUgdW5pZm9ybS5cbiAgICAvLyBFdmVudHVhbGx5IGFsbG93IGNvbXB1dGF0aW9uIHdpdGggYXJiaXJhcnkgc2xhdCBkYXRlcy5cbiAgICBUaW1lQ29sc1NsYXRzQ29vcmRzLnByb3RvdHlwZS5jb21wdXRlVGltZVRvcCA9IGZ1bmN0aW9uIChkdXJhdGlvbikge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBwb3NpdGlvbnMgPSBfYS5wb3NpdGlvbnMsIGRhdGVQcm9maWxlID0gX2EuZGF0ZVByb2ZpbGU7XG4gICAgICAgIHZhciBsZW4gPSBwb3NpdGlvbnMuZWxzLmxlbmd0aDtcbiAgICAgICAgLy8gZmxvYXRpbmctcG9pbnQgdmFsdWUgb2YgIyBvZiBzbG90cyBjb3ZlcmVkXG4gICAgICAgIHZhciBzbGF0Q292ZXJhZ2UgPSAoZHVyYXRpb24ubWlsbGlzZWNvbmRzIC0gY29tbW9uLmFzUm91Z2hNcyhkYXRlUHJvZmlsZS5zbG90TWluVGltZSkpIC8gY29tbW9uLmFzUm91Z2hNcyh0aGlzLnNsb3REdXJhdGlvbik7XG4gICAgICAgIHZhciBzbGF0SW5kZXg7XG4gICAgICAgIHZhciBzbGF0UmVtYWluZGVyO1xuICAgICAgICAvLyBjb21wdXRlIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGZvciBob3cgbWFueSBzbGF0cyBzaG91bGQgYmUgcHJvZ3Jlc3NlZCB0aHJvdWdoLlxuICAgICAgICAvLyBmcm9tIDAgdG8gbnVtYmVyIG9mIHNsYXRzIChpbmNsdXNpdmUpXG4gICAgICAgIC8vIGNvbnN0cmFpbmVkIGJlY2F1c2Ugc2xvdE1pblRpbWUvc2xvdE1heFRpbWUgbWlnaHQgYmUgY3VzdG9taXplZC5cbiAgICAgICAgc2xhdENvdmVyYWdlID0gTWF0aC5tYXgoMCwgc2xhdENvdmVyYWdlKTtcbiAgICAgICAgc2xhdENvdmVyYWdlID0gTWF0aC5taW4obGVuLCBzbGF0Q292ZXJhZ2UpO1xuICAgICAgICAvLyBhbiBpbnRlZ2VyIGluZGV4IG9mIHRoZSBmdXJ0aGVzdCB3aG9sZSBzbGF0XG4gICAgICAgIC8vIGZyb20gMCB0byBudW1iZXIgc2xhdHMgKCpleGNsdXNpdmUqLCBzbyBsZW4tMSlcbiAgICAgICAgc2xhdEluZGV4ID0gTWF0aC5mbG9vcihzbGF0Q292ZXJhZ2UpO1xuICAgICAgICBzbGF0SW5kZXggPSBNYXRoLm1pbihzbGF0SW5kZXgsIGxlbiAtIDEpO1xuICAgICAgICAvLyBob3cgbXVjaCBmdXJ0aGVyIHRocm91Z2ggdGhlIHNsYXRJbmRleCBzbGF0IChmcm9tIDAuMC0xLjApIG11c3QgYmUgY292ZXJlZCBpbiBhZGRpdGlvbi5cbiAgICAgICAgLy8gY291bGQgYmUgMS4wIGlmIHNsYXRDb3ZlcmFnZSBpcyBjb3ZlcmluZyAqYWxsKiB0aGUgc2xvdHNcbiAgICAgICAgc2xhdFJlbWFpbmRlciA9IHNsYXRDb3ZlcmFnZSAtIHNsYXRJbmRleDtcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9ucy50b3BzW3NsYXRJbmRleF0gK1xuICAgICAgICAgICAgcG9zaXRpb25zLmdldEhlaWdodChzbGF0SW5kZXgpICogc2xhdFJlbWFpbmRlcjtcbiAgICB9O1xuICAgIHJldHVybiBUaW1lQ29sc1NsYXRzQ29vcmRzO1xufSgpKTtcblxudmFyIFRpbWVDb2xzU2xhdHNCb2R5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhUaW1lQ29sc1NsYXRzQm9keSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUaW1lQ29sc1NsYXRzQm9keSgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBUaW1lQ29sc1NsYXRzQm9keS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBwcm9wcyA9IF9hLnByb3BzLCBjb250ZXh0ID0gX2EuY29udGV4dDtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnM7XG4gICAgICAgIHZhciBzbGF0RWxSZWZzID0gcHJvcHMuc2xhdEVsUmVmcztcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcInRib2R5XCIsIG51bGwsIHByb3BzLnNsYXRNZXRhcy5tYXAoZnVuY3Rpb24gKHNsYXRNZXRhLCBpKSB7XG4gICAgICAgICAgICB2YXIgaG9va1Byb3BzID0ge1xuICAgICAgICAgICAgICAgIHRpbWU6IHNsYXRNZXRhLnRpbWUsXG4gICAgICAgICAgICAgICAgZGF0ZTogY29udGV4dC5kYXRlRW52LnRvRGF0ZShzbGF0TWV0YS5kYXRlKSxcbiAgICAgICAgICAgICAgICB2aWV3OiBjb250ZXh0LnZpZXdBcGksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICAgICAgICAgJ2ZjLXRpbWVncmlkLXNsb3QnLFxuICAgICAgICAgICAgICAgICdmYy10aW1lZ3JpZC1zbG90LWxhbmUnLFxuICAgICAgICAgICAgICAgIHNsYXRNZXRhLmlzTGFiZWxlZCA/ICcnIDogJ2ZjLXRpbWVncmlkLXNsb3QtbWlub3InLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCB7IGtleTogc2xhdE1ldGEua2V5LCByZWY6IHNsYXRFbFJlZnMuY3JlYXRlUmVmKHNsYXRNZXRhLmtleSkgfSxcbiAgICAgICAgICAgICAgICBwcm9wcy5heGlzICYmIChjb21tb24uY3JlYXRlRWxlbWVudChUaW1lQ29sc0F4aXNDZWxsLCB0c2xpYi5fX2Fzc2lnbih7fSwgc2xhdE1ldGEpKSksXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLlJlbmRlckhvb2ssIHsgaG9va1Byb3BzOiBob29rUHJvcHMsIGNsYXNzTmFtZXM6IG9wdGlvbnMuc2xvdExhbmVDbGFzc05hbWVzLCBjb250ZW50OiBvcHRpb25zLnNsb3RMYW5lQ29udGVudCwgZGlkTW91bnQ6IG9wdGlvbnMuc2xvdExhbmVEaWRNb3VudCwgd2lsbFVubW91bnQ6IG9wdGlvbnMuc2xvdExhbmVXaWxsVW5tb3VudCB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjdXN0b21DbGFzc05hbWVzLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQpIHsgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcInRkXCIsIHsgcmVmOiByb290RWxSZWYsIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5jb25jYXQoY3VzdG9tQ2xhc3NOYW1lcykuam9pbignICcpLCBcImRhdGEtdGltZVwiOiBzbGF0TWV0YS5pc29UaW1lU3RyIH0sIGlubmVyQ29udGVudCkpOyB9KSkpO1xuICAgICAgICB9KSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFRpbWVDb2xzU2xhdHNCb2R5O1xufShjb21tb24uQmFzZUNvbXBvbmVudCkpO1xuXG4vKlxuZm9yIHRoZSBob3Jpem9udGFsIFwic2xhdHNcIiB0aGF0IHJ1biB3aWR0aC13aXNlLiBIYXMgYSB0aW1lIGF4aXMgb24gYSBzaWRlLiBEZXBlbmRzIG9uIFJUTC5cbiovXG52YXIgVGltZUNvbHNTbGF0cyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVGltZUNvbHNTbGF0cywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUaW1lQ29sc1NsYXRzKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucm9vdEVsUmVmID0gY29tbW9uLmNyZWF0ZVJlZigpO1xuICAgICAgICBfdGhpcy5zbGF0RWxSZWZzID0gbmV3IGNvbW1vbi5SZWZNYXAoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBUaW1lQ29sc1NsYXRzLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgcmVmOiB0aGlzLnJvb3RFbFJlZiwgY2xhc3NOYW1lOiBcImZjLXRpbWVncmlkLXNsb3RzXCIgfSxcbiAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGFibGVcIiwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUsIGNsYXNzTmFtZTogY29udGV4dC50aGVtZS5nZXRDbGFzcygndGFibGUnKSwgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IHByb3BzLnRhYmxlTWluV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBwcm9wcy5jbGllbnRXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBwcm9wcy5taW5IZWlnaHQsXG4gICAgICAgICAgICAgICAgfSB9LFxuICAgICAgICAgICAgICAgIHByb3BzLnRhYmxlQ29sR3JvdXBOb2RlIC8qIHJlbGllcyBvbiB0aGVyZSBvbmx5IGJlaW5nIGEgc2luZ2xlIDxjb2w+IGZvciB0aGUgYXhpcyAqLyxcbiAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChUaW1lQ29sc1NsYXRzQm9keSwgeyBzbGF0RWxSZWZzOiB0aGlzLnNsYXRFbFJlZnMsIGF4aXM6IHByb3BzLmF4aXMsIHNsYXRNZXRhczogcHJvcHMuc2xhdE1ldGFzIH0pKSkpO1xuICAgIH07XG4gICAgVGltZUNvbHNTbGF0cy5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU2l6aW5nKCk7XG4gICAgfTtcbiAgICBUaW1lQ29sc1NsYXRzLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU2l6aW5nKCk7XG4gICAgfTtcbiAgICBUaW1lQ29sc1NsYXRzLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25Db29yZHMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25Db29yZHMobnVsbCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFRpbWVDb2xzU2xhdHMucHJvdG90eXBlLnVwZGF0ZVNpemluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgY29udGV4dCA9IF9hLmNvbnRleHQsIHByb3BzID0gX2EucHJvcHM7XG4gICAgICAgIGlmIChwcm9wcy5vbkNvb3JkcyAmJlxuICAgICAgICAgICAgcHJvcHMuY2xpZW50V2lkdGggIT09IG51bGwgLy8gbWVhbnMgc2l6aW5nIGhhcyBzdGFiaWxpemVkXG4gICAgICAgICkge1xuICAgICAgICAgICAgdmFyIHJvb3RFbCA9IHRoaXMucm9vdEVsUmVmLmN1cnJlbnQ7XG4gICAgICAgICAgICBpZiAocm9vdEVsLm9mZnNldEhlaWdodCkgeyAvLyBub3QgaGlkZGVuIGJ5IGNzc1xuICAgICAgICAgICAgICAgIHByb3BzLm9uQ29vcmRzKG5ldyBUaW1lQ29sc1NsYXRzQ29vcmRzKG5ldyBjb21tb24uUG9zaXRpb25DYWNoZSh0aGlzLnJvb3RFbFJlZi5jdXJyZW50LCBjb2xsZWN0U2xhdEVscyh0aGlzLnNsYXRFbFJlZnMuY3VycmVudE1hcCwgcHJvcHMuc2xhdE1ldGFzKSwgZmFsc2UsIHRydWUpLCB0aGlzLnByb3BzLmRhdGVQcm9maWxlLCBjb250ZXh0Lm9wdGlvbnMuc2xvdER1cmF0aW9uKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBUaW1lQ29sc1NsYXRzO1xufShjb21tb24uQmFzZUNvbXBvbmVudCkpO1xuZnVuY3Rpb24gY29sbGVjdFNsYXRFbHMoZWxNYXAsIHNsYXRNZXRhcykge1xuICAgIHJldHVybiBzbGF0TWV0YXMubWFwKGZ1bmN0aW9uIChzbGF0TWV0YSkgeyByZXR1cm4gZWxNYXBbc2xhdE1ldGEua2V5XTsgfSk7XG59XG5cbmZ1bmN0aW9uIHNwbGl0U2Vnc0J5Q29sKHNlZ3MsIGNvbENudCkge1xuICAgIHZhciBzZWdzQnlDb2wgPSBbXTtcbiAgICB2YXIgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgY29sQ250OyBpICs9IDEpIHtcbiAgICAgICAgc2Vnc0J5Q29sLnB1c2goW10pO1xuICAgIH1cbiAgICBpZiAoc2Vncykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgc2Vnc0J5Q29sW3NlZ3NbaV0uY29sXS5wdXNoKHNlZ3NbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZWdzQnlDb2w7XG59XG5mdW5jdGlvbiBzcGxpdEludGVyYWN0aW9uQnlDb2wodWksIGNvbENudCkge1xuICAgIHZhciBieVJvdyA9IFtdO1xuICAgIGlmICghdWkpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xDbnQ7IGkgKz0gMSkge1xuICAgICAgICAgICAgYnlSb3dbaV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbENudDsgaSArPSAxKSB7XG4gICAgICAgICAgICBieVJvd1tpXSA9IHtcbiAgICAgICAgICAgICAgICBhZmZlY3RlZEluc3RhbmNlczogdWkuYWZmZWN0ZWRJbnN0YW5jZXMsXG4gICAgICAgICAgICAgICAgaXNFdmVudDogdWkuaXNFdmVudCxcbiAgICAgICAgICAgICAgICBzZWdzOiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHVpLnNlZ3M7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgc2VnID0gX2FbX2ldO1xuICAgICAgICAgICAgYnlSb3dbc2VnLmNvbF0uc2Vncy5wdXNoKHNlZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ5Um93O1xufVxuXG52YXIgVGltZUNvbE1vcmVMaW5rID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhUaW1lQ29sTW9yZUxpbmssIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGltZUNvbE1vcmVMaW5rKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucm9vdEVsUmVmID0gY29tbW9uLmNyZWF0ZVJlZigpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFRpbWVDb2xNb3JlTGluay5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5Nb3JlTGlua1Jvb3QsIHsgYWxsRGF5RGF0ZTogbnVsbCwgbW9yZUNudDogcHJvcHMuaGlkZGVuU2Vncy5sZW5ndGgsIGFsbFNlZ3M6IHByb3BzLmhpZGRlblNlZ3MsIGhpZGRlblNlZ3M6IHByb3BzLmhpZGRlblNlZ3MsIGFsaWdubWVudEVsUmVmOiB0aGlzLnJvb3RFbFJlZiwgZGVmYXVsdENvbnRlbnQ6IHJlbmRlck1vcmVMaW5rSW5uZXIsIGV4dHJhRGF0ZVNwYW46IHByb3BzLmV4dHJhRGF0ZVNwYW4sIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSwgcG9wb3ZlckNvbnRlbnQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlbmRlclBsYWluRmdTZWdzKHByb3BzLmhpZGRlblNlZ3MsIHByb3BzKTsgfSB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQsIGhhbmRsZUNsaWNrLCB0aXRsZSwgaXNFeHBhbmRlZCwgcG9wb3ZlcklkKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHsgcmVmOiBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgICAgICBjb21tb24uc2V0UmVmKHJvb3RFbFJlZiwgZWwpO1xuICAgICAgICAgICAgICAgIGNvbW1vbi5zZXRSZWYoX3RoaXMucm9vdEVsUmVmLCBlbCk7XG4gICAgICAgICAgICB9LCBjbGFzc05hbWU6IFsnZmMtdGltZWdyaWQtbW9yZS1saW5rJ10uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSwgc3R5bGU6IHsgdG9wOiBwcm9wcy50b3AsIGJvdHRvbTogcHJvcHMuYm90dG9tIH0sIG9uQ2xpY2s6IGhhbmRsZUNsaWNrLCB0aXRsZTogdGl0bGUsIFwiYXJpYS1leHBhbmRlZFwiOiBpc0V4cGFuZGVkLCBcImFyaWEtY29udHJvbHNcIjogcG9wb3ZlcklkIH0sXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IHJlZjogaW5uZXJFbFJlZiwgY2xhc3NOYW1lOiBcImZjLXRpbWVncmlkLW1vcmUtbGluay1pbm5lciBmYy1zdGlja3lcIiB9LCBpbm5lckNvbnRlbnQpKSk7IH0pKTtcbiAgICB9O1xuICAgIHJldHVybiBUaW1lQ29sTW9yZUxpbms7XG59KGNvbW1vbi5CYXNlQ29tcG9uZW50KSk7XG5mdW5jdGlvbiByZW5kZXJNb3JlTGlua0lubmVyKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLnNob3J0VGV4dDtcbn1cblxuLy8gc2VnSW5wdXRzIGFzc3VtZWQgc29ydGVkXG5mdW5jdGlvbiBidWlsZFBvc2l0aW9uaW5nKHNlZ0lucHV0cywgc3RyaWN0T3JkZXIsIG1heFN0YWNrQ250KSB7XG4gICAgdmFyIGhpZXJhcmNoeSA9IG5ldyBjb21tb24uU2VnSGllcmFyY2h5KCk7XG4gICAgaWYgKHN0cmljdE9yZGVyICE9IG51bGwpIHtcbiAgICAgICAgaGllcmFyY2h5LnN0cmljdE9yZGVyID0gc3RyaWN0T3JkZXI7XG4gICAgfVxuICAgIGlmIChtYXhTdGFja0NudCAhPSBudWxsKSB7XG4gICAgICAgIGhpZXJhcmNoeS5tYXhTdGFja0NudCA9IG1heFN0YWNrQ250O1xuICAgIH1cbiAgICB2YXIgaGlkZGVuRW50cmllcyA9IGhpZXJhcmNoeS5hZGRTZWdzKHNlZ0lucHV0cyk7XG4gICAgdmFyIGhpZGRlbkdyb3VwcyA9IGNvbW1vbi5ncm91cEludGVyc2VjdGluZ0VudHJpZXMoaGlkZGVuRW50cmllcyk7XG4gICAgdmFyIHdlYiA9IGJ1aWxkV2ViKGhpZXJhcmNoeSk7XG4gICAgd2ViID0gc3RyZXRjaFdlYih3ZWIsIDEpOyAvLyBhbGwgbGV2ZWxDb29yZHMvdGhpY2tuZXNzIHdpbGwgaGF2ZSAwLjAtMS4wXG4gICAgdmFyIHNlZ1JlY3RzID0gd2ViVG9SZWN0cyh3ZWIpO1xuICAgIHJldHVybiB7IHNlZ1JlY3RzOiBzZWdSZWN0cywgaGlkZGVuR3JvdXBzOiBoaWRkZW5Hcm91cHMgfTtcbn1cbmZ1bmN0aW9uIGJ1aWxkV2ViKGhpZXJhcmNoeSkge1xuICAgIHZhciBlbnRyaWVzQnlMZXZlbCA9IGhpZXJhcmNoeS5lbnRyaWVzQnlMZXZlbDtcbiAgICB2YXIgYnVpbGROb2RlID0gY2FjaGVhYmxlKGZ1bmN0aW9uIChsZXZlbCwgbGF0ZXJhbCkgeyByZXR1cm4gbGV2ZWwgKyAnOicgKyBsYXRlcmFsOyB9LCBmdW5jdGlvbiAobGV2ZWwsIGxhdGVyYWwpIHtcbiAgICAgICAgdmFyIHNpYmxpbmdSYW5nZSA9IGZpbmROZXh0TGV2ZWxTZWdzKGhpZXJhcmNoeSwgbGV2ZWwsIGxhdGVyYWwpO1xuICAgICAgICB2YXIgbmV4dExldmVsUmVzID0gYnVpbGROb2RlcyhzaWJsaW5nUmFuZ2UsIGJ1aWxkTm9kZSk7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNCeUxldmVsW2xldmVsXVtsYXRlcmFsXTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBlbnRyeSksIHsgbmV4dExldmVsTm9kZXM6IG5leHRMZXZlbFJlc1swXSB9KSxcbiAgICAgICAgICAgIGVudHJ5LnRoaWNrbmVzcyArIG5leHRMZXZlbFJlc1sxXSwgLy8gdGhlIHByZXNzdXJlIGJ1aWxkc1xuICAgICAgICBdO1xuICAgIH0pO1xuICAgIHJldHVybiBidWlsZE5vZGVzKGVudHJpZXNCeUxldmVsLmxlbmd0aFxuICAgICAgICA/IHsgbGV2ZWw6IDAsIGxhdGVyYWxTdGFydDogMCwgbGF0ZXJhbEVuZDogZW50cmllc0J5TGV2ZWxbMF0ubGVuZ3RoIH1cbiAgICAgICAgOiBudWxsLCBidWlsZE5vZGUpWzBdO1xufVxuZnVuY3Rpb24gYnVpbGROb2RlcyhzaWJsaW5nUmFuZ2UsIGJ1aWxkTm9kZSkge1xuICAgIGlmICghc2libGluZ1JhbmdlKSB7XG4gICAgICAgIHJldHVybiBbW10sIDBdO1xuICAgIH1cbiAgICB2YXIgbGV2ZWwgPSBzaWJsaW5nUmFuZ2UubGV2ZWwsIGxhdGVyYWxTdGFydCA9IHNpYmxpbmdSYW5nZS5sYXRlcmFsU3RhcnQsIGxhdGVyYWxFbmQgPSBzaWJsaW5nUmFuZ2UubGF0ZXJhbEVuZDtcbiAgICB2YXIgbGF0ZXJhbCA9IGxhdGVyYWxTdGFydDtcbiAgICB2YXIgcGFpcnMgPSBbXTtcbiAgICB3aGlsZSAobGF0ZXJhbCA8IGxhdGVyYWxFbmQpIHtcbiAgICAgICAgcGFpcnMucHVzaChidWlsZE5vZGUobGV2ZWwsIGxhdGVyYWwpKTtcbiAgICAgICAgbGF0ZXJhbCArPSAxO1xuICAgIH1cbiAgICBwYWlycy5zb3J0KGNtcERlc2NQcmVzc3VyZXMpO1xuICAgIHJldHVybiBbXG4gICAgICAgIHBhaXJzLm1hcChleHRyYWN0Tm9kZSksXG4gICAgICAgIHBhaXJzWzBdWzFdLCAvLyBmaXJzdCBpdGVtJ3MgcHJlc3N1cmVcbiAgICBdO1xufVxuZnVuY3Rpb24gY21wRGVzY1ByZXNzdXJlcyhhLCBiKSB7XG4gICAgcmV0dXJuIGJbMV0gLSBhWzFdO1xufVxuZnVuY3Rpb24gZXh0cmFjdE5vZGUoYSkge1xuICAgIHJldHVybiBhWzBdO1xufVxuZnVuY3Rpb24gZmluZE5leHRMZXZlbFNlZ3MoaGllcmFyY2h5LCBzdWJqZWN0TGV2ZWwsIHN1YmplY3RMYXRlcmFsKSB7XG4gICAgdmFyIGxldmVsQ29vcmRzID0gaGllcmFyY2h5LmxldmVsQ29vcmRzLCBlbnRyaWVzQnlMZXZlbCA9IGhpZXJhcmNoeS5lbnRyaWVzQnlMZXZlbDtcbiAgICB2YXIgc3ViamVjdEVudHJ5ID0gZW50cmllc0J5TGV2ZWxbc3ViamVjdExldmVsXVtzdWJqZWN0TGF0ZXJhbF07XG4gICAgdmFyIGFmdGVyU3ViamVjdCA9IGxldmVsQ29vcmRzW3N1YmplY3RMZXZlbF0gKyBzdWJqZWN0RW50cnkudGhpY2tuZXNzO1xuICAgIHZhciBsZXZlbENudCA9IGxldmVsQ29vcmRzLmxlbmd0aDtcbiAgICB2YXIgbGV2ZWwgPSBzdWJqZWN0TGV2ZWw7XG4gICAgLy8gc2tpcCBwYXN0IGxldmVscyB0aGF0IGFyZSB0b28gaGlnaCB1cFxuICAgIGZvciAoOyBsZXZlbCA8IGxldmVsQ250ICYmIGxldmVsQ29vcmRzW2xldmVsXSA8IGFmdGVyU3ViamVjdDsgbGV2ZWwgKz0gMSlcbiAgICAgICAgOyAvLyBkbyBub3RoaW5nXG4gICAgZm9yICg7IGxldmVsIDwgbGV2ZWxDbnQ7IGxldmVsICs9IDEpIHtcbiAgICAgICAgdmFyIGVudHJpZXMgPSBlbnRyaWVzQnlMZXZlbFtsZXZlbF07XG4gICAgICAgIHZhciBlbnRyeSA9IHZvaWQgMDtcbiAgICAgICAgdmFyIHNlYXJjaEluZGV4ID0gY29tbW9uLmJpbmFyeVNlYXJjaChlbnRyaWVzLCBzdWJqZWN0RW50cnkuc3Bhbi5zdGFydCwgY29tbW9uLmdldEVudHJ5U3BhbkVuZCk7XG4gICAgICAgIHZhciBsYXRlcmFsU3RhcnQgPSBzZWFyY2hJbmRleFswXSArIHNlYXJjaEluZGV4WzFdOyAvLyBpZiBleGFjdCBtYXRjaCAod2hpY2ggZG9lc24ndCBjb2xsaWRlKSwgZ28gdG8gbmV4dCBvbmVcbiAgICAgICAgdmFyIGxhdGVyYWxFbmQgPSBsYXRlcmFsU3RhcnQ7XG4gICAgICAgIHdoaWxlICggLy8gbG9vcCB0aHJvdWdoIGVudHJpZXMgdGhhdCBob3Jpem9udGFsbHkgaW50ZXJzZWN0XG4gICAgICAgIChlbnRyeSA9IGVudHJpZXNbbGF0ZXJhbEVuZF0pICYmIC8vIGJ1dCBub3QgcGFzdCB0aGUgd2hvbGUgc2VnIGxpc3RcbiAgICAgICAgICAgIGVudHJ5LnNwYW4uc3RhcnQgPCBzdWJqZWN0RW50cnkuc3Bhbi5lbmQpIHtcbiAgICAgICAgICAgIGxhdGVyYWxFbmQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGF0ZXJhbFN0YXJ0IDwgbGF0ZXJhbEVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbGV2ZWw6IGxldmVsLCBsYXRlcmFsU3RhcnQ6IGxhdGVyYWxTdGFydCwgbGF0ZXJhbEVuZDogbGF0ZXJhbEVuZCB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gc3RyZXRjaFdlYih0b3BMZXZlbE5vZGVzLCB0b3RhbFRoaWNrbmVzcykge1xuICAgIHZhciBzdHJldGNoTm9kZSA9IGNhY2hlYWJsZShmdW5jdGlvbiAobm9kZSwgc3RhcnRDb29yZCwgcHJldlRoaWNrbmVzcykgeyByZXR1cm4gY29tbW9uLmJ1aWxkRW50cnlLZXkobm9kZSk7IH0sIGZ1bmN0aW9uIChub2RlLCBzdGFydENvb3JkLCBwcmV2VGhpY2tuZXNzKSB7XG4gICAgICAgIHZhciBuZXh0TGV2ZWxOb2RlcyA9IG5vZGUubmV4dExldmVsTm9kZXMsIHRoaWNrbmVzcyA9IG5vZGUudGhpY2tuZXNzO1xuICAgICAgICB2YXIgYWxsVGhpY2tuZXNzID0gdGhpY2tuZXNzICsgcHJldlRoaWNrbmVzcztcbiAgICAgICAgdmFyIHRoaWNrbmVzc0ZyYWN0aW9uID0gdGhpY2tuZXNzIC8gYWxsVGhpY2tuZXNzO1xuICAgICAgICB2YXIgZW5kQ29vcmQ7XG4gICAgICAgIHZhciBuZXdDaGlsZHJlbiA9IFtdO1xuICAgICAgICBpZiAoIW5leHRMZXZlbE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgZW5kQ29vcmQgPSB0b3RhbFRoaWNrbmVzcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgbmV4dExldmVsTm9kZXNfMSA9IG5leHRMZXZlbE5vZGVzOyBfaSA8IG5leHRMZXZlbE5vZGVzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkTm9kZSA9IG5leHRMZXZlbE5vZGVzXzFbX2ldO1xuICAgICAgICAgICAgICAgIGlmIChlbmRDb29yZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXMgPSBzdHJldGNoTm9kZShjaGlsZE5vZGUsIHN0YXJ0Q29vcmQsIGFsbFRoaWNrbmVzcyk7XG4gICAgICAgICAgICAgICAgICAgIGVuZENvb3JkID0gcmVzWzBdO1xuICAgICAgICAgICAgICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKHJlc1sxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzID0gc3RyZXRjaE5vZGUoY2hpbGROb2RlLCBlbmRDb29yZCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuLnB1c2gocmVzWzFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5ld1RoaWNrbmVzcyA9IChlbmRDb29yZCAtIHN0YXJ0Q29vcmQpICogdGhpY2tuZXNzRnJhY3Rpb247XG4gICAgICAgIHJldHVybiBbZW5kQ29vcmQgLSBuZXdUaGlja25lc3MsIHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBub2RlKSwgeyB0aGlja25lc3M6IG5ld1RoaWNrbmVzcywgbmV4dExldmVsTm9kZXM6IG5ld0NoaWxkcmVuIH0pXTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG9wTGV2ZWxOb2Rlcy5tYXAoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIHN0cmV0Y2hOb2RlKG5vZGUsIDAsIDApWzFdOyB9KTtcbn1cbi8vIG5vdCBzb3J0ZWQgaW4gYW55IHBhcnRpY3VsYXIgb3JkZXJcbmZ1bmN0aW9uIHdlYlRvUmVjdHModG9wTGV2ZWxOb2Rlcykge1xuICAgIHZhciByZWN0cyA9IFtdO1xuICAgIHZhciBwcm9jZXNzTm9kZSA9IGNhY2hlYWJsZShmdW5jdGlvbiAobm9kZSwgbGV2ZWxDb29yZCwgc3RhY2tEZXB0aCkgeyByZXR1cm4gY29tbW9uLmJ1aWxkRW50cnlLZXkobm9kZSk7IH0sIGZ1bmN0aW9uIChub2RlLCBsZXZlbENvb3JkLCBzdGFja0RlcHRoKSB7XG4gICAgICAgIHZhciByZWN0ID0gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIG5vZGUpLCB7IGxldmVsQ29vcmQ6IGxldmVsQ29vcmQsXG4gICAgICAgICAgICBzdGFja0RlcHRoOiBzdGFja0RlcHRoLCBzdGFja0ZvcndhcmQ6IDAgfSk7XG4gICAgICAgIHJlY3RzLnB1c2gocmVjdCk7XG4gICAgICAgIHJldHVybiAocmVjdC5zdGFja0ZvcndhcmQgPSBwcm9jZXNzTm9kZXMobm9kZS5uZXh0TGV2ZWxOb2RlcywgbGV2ZWxDb29yZCArIG5vZGUudGhpY2tuZXNzLCBzdGFja0RlcHRoICsgMSkgKyAxKTtcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBwcm9jZXNzTm9kZXMobm9kZXMsIGxldmVsQ29vcmQsIHN0YWNrRGVwdGgpIHtcbiAgICAgICAgdmFyIHN0YWNrRm9yd2FyZCA9IDA7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgbm9kZXNfMSA9IG5vZGVzOyBfaSA8IG5vZGVzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IG5vZGVzXzFbX2ldO1xuICAgICAgICAgICAgc3RhY2tGb3J3YXJkID0gTWF0aC5tYXgocHJvY2Vzc05vZGUobm9kZSwgbGV2ZWxDb29yZCwgc3RhY2tEZXB0aCksIHN0YWNrRm9yd2FyZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YWNrRm9yd2FyZDtcbiAgICB9XG4gICAgcHJvY2Vzc05vZGVzKHRvcExldmVsTm9kZXMsIDAsIDApO1xuICAgIHJldHVybiByZWN0czsgLy8gVE9ETzogc29ydCByZWN0cyBieSBsZXZlbENvb3JkIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0b1JlY3RzP1xufVxuLy8gVE9ETzogbW92ZSB0byBnZW5lcmFsIHV0aWxcbmZ1bmN0aW9uIGNhY2hlYWJsZShrZXlGdW5jLCB3b3JrRnVuYykge1xuICAgIHZhciBjYWNoZSA9IHt9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGtleSA9IGtleUZ1bmMuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICAgICAgcmV0dXJuIChrZXkgaW4gY2FjaGUpXG4gICAgICAgICAgICA/IGNhY2hlW2tleV1cbiAgICAgICAgICAgIDogKGNhY2hlW2tleV0gPSB3b3JrRnVuYy5hcHBseSh2b2lkIDAsIGFyZ3MpKTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU2VnVkNvb3JkcyhzZWdzLCBjb2xEYXRlLCBzbGF0Q29vcmRzLCBldmVudE1pbkhlaWdodCkge1xuICAgIGlmIChzbGF0Q29vcmRzID09PSB2b2lkIDApIHsgc2xhdENvb3JkcyA9IG51bGw7IH1cbiAgICBpZiAoZXZlbnRNaW5IZWlnaHQgPT09IHZvaWQgMCkgeyBldmVudE1pbkhlaWdodCA9IDA7IH1cbiAgICB2YXIgdmNvb3JkcyA9IFtdO1xuICAgIGlmIChzbGF0Q29vcmRzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgdmFyIHNlZyA9IHNlZ3NbaV07XG4gICAgICAgICAgICB2YXIgc3BhblN0YXJ0ID0gc2xhdENvb3Jkcy5jb21wdXRlRGF0ZVRvcChzZWcuc3RhcnQsIGNvbERhdGUpO1xuICAgICAgICAgICAgdmFyIHNwYW5FbmQgPSBNYXRoLm1heChzcGFuU3RhcnQgKyAoZXZlbnRNaW5IZWlnaHQgfHwgMCksIC8vIDooXG4gICAgICAgICAgICBzbGF0Q29vcmRzLmNvbXB1dGVEYXRlVG9wKHNlZy5lbmQsIGNvbERhdGUpKTtcbiAgICAgICAgICAgIHZjb29yZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IE1hdGgucm91bmQoc3BhblN0YXJ0KSxcbiAgICAgICAgICAgICAgICBlbmQ6IE1hdGgucm91bmQoc3BhbkVuZCksIC8vXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmNvb3Jkcztcbn1cbmZ1bmN0aW9uIGNvbXB1dGVGZ1NlZ1BsYWNlbWVudHMoc2Vncywgc2VnVkNvb3JkcywgLy8gbWlnaHQgbm90IGhhdmUgZm9yIGV2ZXJ5IHNlZ1xuZXZlbnRPcmRlclN0cmljdCwgZXZlbnRNYXhTdGFjaykge1xuICAgIHZhciBzZWdJbnB1dHMgPSBbXTtcbiAgICB2YXIgZHVtYlNlZ3MgPSBbXTsgLy8gc2VncyB3aXRob3V0IGNvb3Jkc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgdmNvb3JkcyA9IHNlZ1ZDb29yZHNbaV07XG4gICAgICAgIGlmICh2Y29vcmRzKSB7XG4gICAgICAgICAgICBzZWdJbnB1dHMucHVzaCh7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICAgICAgdGhpY2tuZXNzOiAxLFxuICAgICAgICAgICAgICAgIHNwYW46IHZjb29yZHMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGR1bWJTZWdzLnB1c2goc2Vnc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIF9hID0gYnVpbGRQb3NpdGlvbmluZyhzZWdJbnB1dHMsIGV2ZW50T3JkZXJTdHJpY3QsIGV2ZW50TWF4U3RhY2spLCBzZWdSZWN0cyA9IF9hLnNlZ1JlY3RzLCBoaWRkZW5Hcm91cHMgPSBfYS5oaWRkZW5Hcm91cHM7XG4gICAgdmFyIHNlZ1BsYWNlbWVudHMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDAsIHNlZ1JlY3RzXzEgPSBzZWdSZWN0czsgX2kgPCBzZWdSZWN0c18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgc2VnUmVjdCA9IHNlZ1JlY3RzXzFbX2ldO1xuICAgICAgICBzZWdQbGFjZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgc2VnOiBzZWdzW3NlZ1JlY3QuaW5kZXhdLFxuICAgICAgICAgICAgcmVjdDogc2VnUmVjdCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZvciAodmFyIF9iID0gMCwgZHVtYlNlZ3NfMSA9IGR1bWJTZWdzOyBfYiA8IGR1bWJTZWdzXzEubGVuZ3RoOyBfYisrKSB7XG4gICAgICAgIHZhciBkdW1iU2VnID0gZHVtYlNlZ3NfMVtfYl07XG4gICAgICAgIHNlZ1BsYWNlbWVudHMucHVzaCh7IHNlZzogZHVtYlNlZywgcmVjdDogbnVsbCB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc2VnUGxhY2VtZW50czogc2VnUGxhY2VtZW50cywgaGlkZGVuR3JvdXBzOiBoaWRkZW5Hcm91cHMgfTtcbn1cblxudmFyIERFRkFVTFRfVElNRV9GT1JNQVQgPSBjb21tb24uY3JlYXRlRm9ybWF0dGVyKHtcbiAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgbWVyaWRpZW06IGZhbHNlLFxufSk7XG52YXIgVGltZUNvbEV2ZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhUaW1lQ29sRXZlbnQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGltZUNvbEV2ZW50KCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFRpbWVDb2xFdmVudC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2xhc3NOYW1lcyA9IFtcbiAgICAgICAgICAgICdmYy10aW1lZ3JpZC1ldmVudCcsXG4gICAgICAgICAgICAnZmMtdi1ldmVudCcsXG4gICAgICAgIF07XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmlzU2hvcnQpIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtdGltZWdyaWQtZXZlbnQtc2hvcnQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5TdGFuZGFyZEV2ZW50LCB0c2xpYi5fX2Fzc2lnbih7fSwgdGhpcy5wcm9wcywgeyBkZWZhdWx0VGltZUZvcm1hdDogREVGQVVMVF9USU1FX0ZPUk1BVCwgZXh0cmFDbGFzc05hbWVzOiBjbGFzc05hbWVzIH0pKSk7XG4gICAgfTtcbiAgICByZXR1cm4gVGltZUNvbEV2ZW50O1xufShjb21tb24uQmFzZUNvbXBvbmVudCkpO1xuXG52YXIgVGltZUNvbE1pc2MgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFRpbWVDb2xNaXNjLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRpbWVDb2xNaXNjKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFRpbWVDb2xNaXNjLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkRheUNlbGxDb250ZW50LCB7IGRhdGU6IHByb3BzLmRhdGUsIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSwgZXh0cmFIb29rUHJvcHM6IHByb3BzLmV4dHJhSG9va1Byb3BzIH0sIGZ1bmN0aW9uIChpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQpIHsgcmV0dXJuIChpbm5lckNvbnRlbnQgJiZcbiAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLXRpbWVncmlkLWNvbC1taXNjXCIsIHJlZjogaW5uZXJFbFJlZiB9LCBpbm5lckNvbnRlbnQpKTsgfSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFRpbWVDb2xNaXNjO1xufShjb21tb24uQmFzZUNvbXBvbmVudCkpO1xuXG52YXIgVGltZUNvbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVGltZUNvbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUaW1lQ29sKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc29ydEV2ZW50U2VncyA9IGNvbW1vbi5tZW1vaXplKGNvbW1vbi5zb3J0RXZlbnRTZWdzKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvLyBUT0RPOiBtZW1vaXplIGV2ZW50LXBsYWNlbWVudD9cbiAgICBUaW1lQ29sLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgaXNTZWxlY3RNaXJyb3IgPSBjb250ZXh0Lm9wdGlvbnMuc2VsZWN0TWlycm9yO1xuICAgICAgICB2YXIgbWlycm9yU2VncyA9IChwcm9wcy5ldmVudERyYWcgJiYgcHJvcHMuZXZlbnREcmFnLnNlZ3MpIHx8XG4gICAgICAgICAgICAocHJvcHMuZXZlbnRSZXNpemUgJiYgcHJvcHMuZXZlbnRSZXNpemUuc2VncykgfHxcbiAgICAgICAgICAgIChpc1NlbGVjdE1pcnJvciAmJiBwcm9wcy5kYXRlU2VsZWN0aW9uU2VncykgfHxcbiAgICAgICAgICAgIFtdO1xuICAgICAgICB2YXIgaW50ZXJhY3Rpb25BZmZlY3RlZEluc3RhbmNlcyA9IC8vIFRPRE86IG1lc3N5IHdheSB0byBjb21wdXRlIHRoaXNcbiAgICAgICAgIChwcm9wcy5ldmVudERyYWcgJiYgcHJvcHMuZXZlbnREcmFnLmFmZmVjdGVkSW5zdGFuY2VzKSB8fFxuICAgICAgICAgICAgKHByb3BzLmV2ZW50UmVzaXplICYmIHByb3BzLmV2ZW50UmVzaXplLmFmZmVjdGVkSW5zdGFuY2VzKSB8fFxuICAgICAgICAgICAge307XG4gICAgICAgIHZhciBzb3J0ZWRGZ1NlZ3MgPSB0aGlzLnNvcnRFdmVudFNlZ3MocHJvcHMuZmdFdmVudFNlZ3MsIGNvbnRleHQub3B0aW9ucy5ldmVudE9yZGVyKTtcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uRGF5Q2VsbFJvb3QsIHsgZWxSZWY6IHByb3BzLmVsUmVmLCBkYXRlOiBwcm9wcy5kYXRlLCBkYXRlUHJvZmlsZTogcHJvcHMuZGF0ZVByb2ZpbGUsIHRvZGF5UmFuZ2U6IHByb3BzLnRvZGF5UmFuZ2UsIGV4dHJhSG9va1Byb3BzOiBwcm9wcy5leHRyYUhvb2tQcm9wcyB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzLCBkYXRhQXR0cnMpIHsgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcInRkXCIsIHRzbGliLl9fYXNzaWduKHsgcmVmOiByb290RWxSZWYsIHJvbGU6IFwiZ3JpZGNlbGxcIiwgY2xhc3NOYW1lOiBbJ2ZjLXRpbWVncmlkLWNvbCddLmNvbmNhdChjbGFzc05hbWVzLCBwcm9wcy5leHRyYUNsYXNzTmFtZXMgfHwgW10pLmpvaW4oJyAnKSB9LCBkYXRhQXR0cnMsIHByb3BzLmV4dHJhRGF0YUF0dHJzKSxcbiAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLXRpbWVncmlkLWNvbC1mcmFtZVwiIH0sXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtY29sLWJnXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVuZGVyRmlsbFNlZ3MocHJvcHMuYnVzaW5lc3NIb3VyU2VncywgJ25vbi1idXNpbmVzcycpLFxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZW5kZXJGaWxsU2Vncyhwcm9wcy5iZ0V2ZW50U2VncywgJ2JnLWV2ZW50JyksXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlckZpbGxTZWdzKHByb3BzLmRhdGVTZWxlY3Rpb25TZWdzLCAnaGlnaGxpZ2h0JykpLFxuICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLXRpbWVncmlkLWNvbC1ldmVudHNcIiB9LCBfdGhpcy5yZW5kZXJGZ1NlZ3Moc29ydGVkRmdTZWdzLCBpbnRlcmFjdGlvbkFmZmVjdGVkSW5zdGFuY2VzLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSksXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtY29sLWV2ZW50c1wiIH0sIF90aGlzLnJlbmRlckZnU2VncyhtaXJyb3JTZWdzLCB7fSwgQm9vbGVhbihwcm9wcy5ldmVudERyYWcpLCBCb29sZWFuKHByb3BzLmV2ZW50UmVzaXplKSwgQm9vbGVhbihpc1NlbGVjdE1pcnJvcikpKSxcbiAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy10aW1lZ3JpZC1ub3ctaW5kaWNhdG9yLWNvbnRhaW5lclwiIH0sIF90aGlzLnJlbmRlck5vd0luZGljYXRvcihwcm9wcy5ub3dJbmRpY2F0b3JTZWdzKSksXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoVGltZUNvbE1pc2MsIHsgZGF0ZTogcHJvcHMuZGF0ZSwgZGF0ZVByb2ZpbGU6IHByb3BzLmRhdGVQcm9maWxlLCB0b2RheVJhbmdlOiBwcm9wcy50b2RheVJhbmdlLCBleHRyYUhvb2tQcm9wczogcHJvcHMuZXh0cmFIb29rUHJvcHMgfSkpKSk7IH0pKTtcbiAgICB9O1xuICAgIFRpbWVDb2wucHJvdG90eXBlLnJlbmRlckZnU2VncyA9IGZ1bmN0aW9uIChzb3J0ZWRGZ1NlZ3MsIHNlZ0lzSW52aXNpYmxlLCBpc0RyYWdnaW5nLCBpc1Jlc2l6aW5nLCBpc0RhdGVTZWxlY3RpbmcpIHtcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgaWYgKHByb3BzLmZvclByaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyUGxhaW5GZ1NlZ3Moc29ydGVkRmdTZWdzLCBwcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyUG9zaXRpb25lZEZnU2Vncyhzb3J0ZWRGZ1NlZ3MsIHNlZ0lzSW52aXNpYmxlLCBpc0RyYWdnaW5nLCBpc1Jlc2l6aW5nLCBpc0RhdGVTZWxlY3RpbmcpO1xuICAgIH07XG4gICAgVGltZUNvbC5wcm90b3R5cGUucmVuZGVyUG9zaXRpb25lZEZnU2VncyA9IGZ1bmN0aW9uIChzZWdzLCAvLyBpZiBub3QgbWlycm9yLCBuZWVkcyB0byBiZSBzb3J0ZWRcbiAgICBzZWdJc0ludmlzaWJsZSwgaXNEcmFnZ2luZywgaXNSZXNpemluZywgaXNEYXRlU2VsZWN0aW5nKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuY29udGV4dC5vcHRpb25zLCBldmVudE1heFN0YWNrID0gX2EuZXZlbnRNYXhTdGFjaywgZXZlbnRTaG9ydEhlaWdodCA9IF9hLmV2ZW50U2hvcnRIZWlnaHQsIGV2ZW50T3JkZXJTdHJpY3QgPSBfYS5ldmVudE9yZGVyU3RyaWN0LCBldmVudE1pbkhlaWdodCA9IF9hLmV2ZW50TWluSGVpZ2h0O1xuICAgICAgICB2YXIgX2IgPSB0aGlzLnByb3BzLCBkYXRlID0gX2IuZGF0ZSwgc2xhdENvb3JkcyA9IF9iLnNsYXRDb29yZHMsIGV2ZW50U2VsZWN0aW9uID0gX2IuZXZlbnRTZWxlY3Rpb24sIHRvZGF5UmFuZ2UgPSBfYi50b2RheVJhbmdlLCBub3dEYXRlID0gX2Iubm93RGF0ZTtcbiAgICAgICAgdmFyIGlzTWlycm9yID0gaXNEcmFnZ2luZyB8fCBpc1Jlc2l6aW5nIHx8IGlzRGF0ZVNlbGVjdGluZztcbiAgICAgICAgdmFyIHNlZ1ZDb29yZHMgPSBjb21wdXRlU2VnVkNvb3JkcyhzZWdzLCBkYXRlLCBzbGF0Q29vcmRzLCBldmVudE1pbkhlaWdodCk7XG4gICAgICAgIHZhciBfYyA9IGNvbXB1dGVGZ1NlZ1BsYWNlbWVudHMoc2Vncywgc2VnVkNvb3JkcywgZXZlbnRPcmRlclN0cmljdCwgZXZlbnRNYXhTdGFjayksIHNlZ1BsYWNlbWVudHMgPSBfYy5zZWdQbGFjZW1lbnRzLCBoaWRkZW5Hcm91cHMgPSBfYy5oaWRkZW5Hcm91cHM7XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkZyYWdtZW50LCBudWxsLFxuICAgICAgICAgICAgdGhpcy5yZW5kZXJIaWRkZW5Hcm91cHMoaGlkZGVuR3JvdXBzLCBzZWdzKSxcbiAgICAgICAgICAgIHNlZ1BsYWNlbWVudHMubWFwKGZ1bmN0aW9uIChzZWdQbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VnID0gc2VnUGxhY2VtZW50LnNlZywgcmVjdCA9IHNlZ1BsYWNlbWVudC5yZWN0O1xuICAgICAgICAgICAgICAgIHZhciBpbnN0YW5jZUlkID0gc2VnLmV2ZW50UmFuZ2UuaW5zdGFuY2UuaW5zdGFuY2VJZDtcbiAgICAgICAgICAgICAgICB2YXIgaXNWaXNpYmxlID0gaXNNaXJyb3IgfHwgQm9vbGVhbighc2VnSXNJbnZpc2libGVbaW5zdGFuY2VJZF0gJiYgcmVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIHZTdHlsZSA9IGNvbXB1dGVTZWdWU3R5bGUocmVjdCAmJiByZWN0LnNwYW4pO1xuICAgICAgICAgICAgICAgIHZhciBoU3R5bGUgPSAoIWlzTWlycm9yICYmIHJlY3QpID8gX3RoaXMuY29tcHV0ZVNlZ0hTdHlsZShyZWN0KSA6IHsgbGVmdDogMCwgcmlnaHQ6IDAgfTtcbiAgICAgICAgICAgICAgICB2YXIgaXNJbnNldCA9IEJvb2xlYW4ocmVjdCkgJiYgcmVjdC5zdGFja0ZvcndhcmQgPiAwO1xuICAgICAgICAgICAgICAgIHZhciBpc1Nob3J0ID0gQm9vbGVhbihyZWN0KSAmJiAocmVjdC5zcGFuLmVuZCAtIHJlY3Quc3Bhbi5zdGFydCkgPCBldmVudFNob3J0SGVpZ2h0OyAvLyBsb29rIGF0IG90aGVyIHBsYWNlcyBmb3IgdGhpcyBwcm9ibGVtXG4gICAgICAgICAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogJ2ZjLXRpbWVncmlkLWV2ZW50LWhhcm5lc3MnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChpc0luc2V0ID8gJyBmYy10aW1lZ3JpZC1ldmVudC1oYXJuZXNzLWluc2V0JyA6ICcnKSwga2V5OiBpbnN0YW5jZUlkLCBzdHlsZTogdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oeyB2aXNpYmlsaXR5OiBpc1Zpc2libGUgPyAnJyA6ICdoaWRkZW4nIH0sIHZTdHlsZSksIGhTdHlsZSkgfSxcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoVGltZUNvbEV2ZW50LCB0c2xpYi5fX2Fzc2lnbih7IHNlZzogc2VnLCBpc0RyYWdnaW5nOiBpc0RyYWdnaW5nLCBpc1Jlc2l6aW5nOiBpc1Jlc2l6aW5nLCBpc0RhdGVTZWxlY3Rpbmc6IGlzRGF0ZVNlbGVjdGluZywgaXNTZWxlY3RlZDogaW5zdGFuY2VJZCA9PT0gZXZlbnRTZWxlY3Rpb24sIGlzU2hvcnQ6IGlzU2hvcnQgfSwgY29tbW9uLmdldFNlZ01ldGEoc2VnLCB0b2RheVJhbmdlLCBub3dEYXRlKSkpKSk7XG4gICAgICAgICAgICB9KSkpO1xuICAgIH07XG4gICAgLy8gd2lsbCBhbHJlYWR5IGhhdmUgZXZlbnRNaW5IZWlnaHQgYXBwbGllZCBiZWNhdXNlIHNlZ0lucHV0cyBhbHJlYWR5IGhhZCBpdFxuICAgIFRpbWVDb2wucHJvdG90eXBlLnJlbmRlckhpZGRlbkdyb3VwcyA9IGZ1bmN0aW9uIChoaWRkZW5Hcm91cHMsIHNlZ3MpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5wcm9wcywgZXh0cmFEYXRlU3BhbiA9IF9hLmV4dHJhRGF0ZVNwYW4sIGRhdGVQcm9maWxlID0gX2EuZGF0ZVByb2ZpbGUsIHRvZGF5UmFuZ2UgPSBfYS50b2RheVJhbmdlLCBub3dEYXRlID0gX2Eubm93RGF0ZSwgZXZlbnRTZWxlY3Rpb24gPSBfYS5ldmVudFNlbGVjdGlvbiwgZXZlbnREcmFnID0gX2EuZXZlbnREcmFnLCBldmVudFJlc2l6ZSA9IF9hLmV2ZW50UmVzaXplO1xuICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5GcmFnbWVudCwgbnVsbCwgaGlkZGVuR3JvdXBzLm1hcChmdW5jdGlvbiAoaGlkZGVuR3JvdXApIHtcbiAgICAgICAgICAgIHZhciBwb3NpdGlvbkNzcyA9IGNvbXB1dGVTZWdWU3R5bGUoaGlkZGVuR3JvdXAuc3Bhbik7XG4gICAgICAgICAgICB2YXIgaGlkZGVuU2VncyA9IGNvbXBpbGVTZWdzRnJvbUVudHJpZXMoaGlkZGVuR3JvdXAuZW50cmllcywgc2Vncyk7XG4gICAgICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFRpbWVDb2xNb3JlTGluaywgeyBrZXk6IGNvbW1vbi5idWlsZElzb1N0cmluZyhjb21tb24uY29tcHV0ZUVhcmxpZXN0U2VnU3RhcnQoaGlkZGVuU2VncykpLCBoaWRkZW5TZWdzOiBoaWRkZW5TZWdzLCB0b3A6IHBvc2l0aW9uQ3NzLnRvcCwgYm90dG9tOiBwb3NpdGlvbkNzcy5ib3R0b20sIGV4dHJhRGF0ZVNwYW46IGV4dHJhRGF0ZVNwYW4sIGRhdGVQcm9maWxlOiBkYXRlUHJvZmlsZSwgdG9kYXlSYW5nZTogdG9kYXlSYW5nZSwgbm93RGF0ZTogbm93RGF0ZSwgZXZlbnRTZWxlY3Rpb246IGV2ZW50U2VsZWN0aW9uLCBldmVudERyYWc6IGV2ZW50RHJhZywgZXZlbnRSZXNpemU6IGV2ZW50UmVzaXplIH0pKTtcbiAgICAgICAgfSkpKTtcbiAgICB9O1xuICAgIFRpbWVDb2wucHJvdG90eXBlLnJlbmRlckZpbGxTZWdzID0gZnVuY3Rpb24gKHNlZ3MsIGZpbGxUeXBlKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgc2VnVkNvb3JkcyA9IGNvbXB1dGVTZWdWQ29vcmRzKHNlZ3MsIHByb3BzLmRhdGUsIHByb3BzLnNsYXRDb29yZHMsIGNvbnRleHQub3B0aW9ucy5ldmVudE1pbkhlaWdodCk7IC8vIGRvbid0IGFzc3VtZSBhbGwgcG9wdWxhdGVkXG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHNlZ1ZDb29yZHMubWFwKGZ1bmN0aW9uICh2Y29vcmRzLCBpKSB7XG4gICAgICAgICAgICB2YXIgc2VnID0gc2Vnc1tpXTtcbiAgICAgICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBrZXk6IGNvbW1vbi5idWlsZEV2ZW50UmFuZ2VLZXkoc2VnLmV2ZW50UmFuZ2UpLCBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtYmctaGFybmVzc1wiLCBzdHlsZTogY29tcHV0ZVNlZ1ZTdHlsZSh2Y29vcmRzKSB9LCBmaWxsVHlwZSA9PT0gJ2JnLWV2ZW50JyA/XG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkJnRXZlbnQsIHRzbGliLl9fYXNzaWduKHsgc2VnOiBzZWcgfSwgY29tbW9uLmdldFNlZ01ldGEoc2VnLCBwcm9wcy50b2RheVJhbmdlLCBwcm9wcy5ub3dEYXRlKSkpIDpcbiAgICAgICAgICAgICAgICBjb21tb24ucmVuZGVyRmlsbChmaWxsVHlwZSkpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uRnJhZ21lbnQsIG51bGwsIGNoaWxkcmVuKTtcbiAgICB9O1xuICAgIFRpbWVDb2wucHJvdG90eXBlLnJlbmRlck5vd0luZGljYXRvciA9IGZ1bmN0aW9uIChzZWdzKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMucHJvcHMsIHNsYXRDb29yZHMgPSBfYS5zbGF0Q29vcmRzLCBkYXRlID0gX2EuZGF0ZTtcbiAgICAgICAgaWYgKCFzbGF0Q29vcmRzKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2Vncy5tYXAoZnVuY3Rpb24gKHNlZywgaSkgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5Ob3dJbmRpY2F0b3JSb290LCB7IGlzQXhpczogZmFsc2UsIGRhdGU6IGRhdGUsIFxuICAgICAgICAgICAgLy8ga2V5IGRvZXNuJ3QgbWF0dGVyLiB3aWxsIG9ubHkgZXZlciBiZSBvbmVcbiAgICAgICAgICAgIGtleTogaSB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQpIHsgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IHJlZjogcm9vdEVsUmVmLCBjbGFzc05hbWU6IFsnZmMtdGltZWdyaWQtbm93LWluZGljYXRvci1saW5lJ10uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSwgc3R5bGU6IHsgdG9wOiBzbGF0Q29vcmRzLmNvbXB1dGVEYXRlVG9wKHNlZy5zdGFydCwgZGF0ZSkgfSB9LCBpbm5lckNvbnRlbnQpKTsgfSkpOyB9KTtcbiAgICB9O1xuICAgIFRpbWVDb2wucHJvdG90eXBlLmNvbXB1dGVTZWdIU3R5bGUgPSBmdW5jdGlvbiAoc2VnSENvb3Jkcykge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmNvbnRleHQsIGlzUnRsID0gX2EuaXNSdGwsIG9wdGlvbnMgPSBfYS5vcHRpb25zO1xuICAgICAgICB2YXIgc2hvdWxkT3ZlcmxhcCA9IG9wdGlvbnMuc2xvdEV2ZW50T3ZlcmxhcDtcbiAgICAgICAgdmFyIG5lYXJDb29yZCA9IHNlZ0hDb29yZHMubGV2ZWxDb29yZDsgLy8gdGhlIGxlZnQgc2lkZSBpZiBMVFIuIHRoZSByaWdodCBzaWRlIGlmIFJUTC4gZmxvYXRpbmctcG9pbnRcbiAgICAgICAgdmFyIGZhckNvb3JkID0gc2VnSENvb3Jkcy5sZXZlbENvb3JkICsgc2VnSENvb3Jkcy50aGlja25lc3M7IC8vIHRoZSByaWdodCBzaWRlIGlmIExUUi4gdGhlIGxlZnQgc2lkZSBpZiBSVEwuIGZsb2F0aW5nLXBvaW50XG4gICAgICAgIHZhciBsZWZ0OyAvLyBhbW91bnQgb2Ygc3BhY2UgZnJvbSBsZWZ0IGVkZ2UsIGEgZnJhY3Rpb24gb2YgdGhlIHRvdGFsIHdpZHRoXG4gICAgICAgIHZhciByaWdodDsgLy8gYW1vdW50IG9mIHNwYWNlIGZyb20gcmlnaHQgZWRnZSwgYSBmcmFjdGlvbiBvZiB0aGUgdG90YWwgd2lkdGhcbiAgICAgICAgaWYgKHNob3VsZE92ZXJsYXApIHtcbiAgICAgICAgICAgIC8vIGRvdWJsZSB0aGUgd2lkdGgsIGJ1dCBkb24ndCBnbyBiZXlvbmQgdGhlIG1heGltdW0gZm9yd2FyZCBjb29yZGluYXRlICgxLjApXG4gICAgICAgICAgICBmYXJDb29yZCA9IE1hdGgubWluKDEsIG5lYXJDb29yZCArIChmYXJDb29yZCAtIG5lYXJDb29yZCkgKiAyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNSdGwpIHtcbiAgICAgICAgICAgIGxlZnQgPSAxIC0gZmFyQ29vcmQ7XG4gICAgICAgICAgICByaWdodCA9IG5lYXJDb29yZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxlZnQgPSBuZWFyQ29vcmQ7XG4gICAgICAgICAgICByaWdodCA9IDEgLSBmYXJDb29yZDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgICAgICB6SW5kZXg6IHNlZ0hDb29yZHMuc3RhY2tEZXB0aCArIDEsXG4gICAgICAgICAgICBsZWZ0OiBsZWZ0ICogMTAwICsgJyUnLFxuICAgICAgICAgICAgcmlnaHQ6IHJpZ2h0ICogMTAwICsgJyUnLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoc2hvdWxkT3ZlcmxhcCAmJiAhc2VnSENvb3Jkcy5zdGFja0ZvcndhcmQpIHtcbiAgICAgICAgICAgIC8vIGFkZCBwYWRkaW5nIHRvIHRoZSBlZGdlIHNvIHRoYXQgZm9yd2FyZCBzdGFja2VkIGV2ZW50cyBkb24ndCBjb3ZlciB0aGUgcmVzaXplcidzIGljb25cbiAgICAgICAgICAgIHByb3BzW2lzUnRsID8gJ21hcmdpbkxlZnQnIDogJ21hcmdpblJpZ2h0J10gPSAxMCAqIDI7IC8vIDEwIGlzIGEgZ3Vlc3N0aW1hdGUgb2YgdGhlIGljb24ncyB3aWR0aFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wcztcbiAgICB9O1xuICAgIHJldHVybiBUaW1lQ29sO1xufShjb21tb24uQmFzZUNvbXBvbmVudCkpO1xuZnVuY3Rpb24gcmVuZGVyUGxhaW5GZ1NlZ3Moc29ydGVkRmdTZWdzLCBfYSkge1xuICAgIHZhciB0b2RheVJhbmdlID0gX2EudG9kYXlSYW5nZSwgbm93RGF0ZSA9IF9hLm5vd0RhdGUsIGV2ZW50U2VsZWN0aW9uID0gX2EuZXZlbnRTZWxlY3Rpb24sIGV2ZW50RHJhZyA9IF9hLmV2ZW50RHJhZywgZXZlbnRSZXNpemUgPSBfYS5ldmVudFJlc2l6ZTtcbiAgICB2YXIgaGlkZGVuSW5zdGFuY2VzID0gKGV2ZW50RHJhZyA/IGV2ZW50RHJhZy5hZmZlY3RlZEluc3RhbmNlcyA6IG51bGwpIHx8XG4gICAgICAgIChldmVudFJlc2l6ZSA/IGV2ZW50UmVzaXplLmFmZmVjdGVkSW5zdGFuY2VzIDogbnVsbCkgfHxcbiAgICAgICAge307XG4gICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uRnJhZ21lbnQsIG51bGwsIHNvcnRlZEZnU2Vncy5tYXAoZnVuY3Rpb24gKHNlZykge1xuICAgICAgICB2YXIgaW5zdGFuY2VJZCA9IHNlZy5ldmVudFJhbmdlLmluc3RhbmNlLmluc3RhbmNlSWQ7XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBrZXk6IGluc3RhbmNlSWQsIHN0eWxlOiB7IHZpc2liaWxpdHk6IGhpZGRlbkluc3RhbmNlc1tpbnN0YW5jZUlkXSA/ICdoaWRkZW4nIDogJycgfSB9LFxuICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoVGltZUNvbEV2ZW50LCB0c2xpYi5fX2Fzc2lnbih7IHNlZzogc2VnLCBpc0RyYWdnaW5nOiBmYWxzZSwgaXNSZXNpemluZzogZmFsc2UsIGlzRGF0ZVNlbGVjdGluZzogZmFsc2UsIGlzU2VsZWN0ZWQ6IGluc3RhbmNlSWQgPT09IGV2ZW50U2VsZWN0aW9uLCBpc1Nob3J0OiBmYWxzZSB9LCBjb21tb24uZ2V0U2VnTWV0YShzZWcsIHRvZGF5UmFuZ2UsIG5vd0RhdGUpKSkpKTtcbiAgICB9KSkpO1xufVxuZnVuY3Rpb24gY29tcHV0ZVNlZ1ZTdHlsZShzZWdWQ29vcmRzKSB7XG4gICAgaWYgKCFzZWdWQ29vcmRzKSB7XG4gICAgICAgIHJldHVybiB7IHRvcDogJycsIGJvdHRvbTogJycgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdG9wOiBzZWdWQ29vcmRzLnN0YXJ0LFxuICAgICAgICBib3R0b206IC1zZWdWQ29vcmRzLmVuZCxcbiAgICB9O1xufVxuZnVuY3Rpb24gY29tcGlsZVNlZ3NGcm9tRW50cmllcyhzZWdFbnRyaWVzLCBhbGxTZWdzKSB7XG4gICAgcmV0dXJuIHNlZ0VudHJpZXMubWFwKGZ1bmN0aW9uIChzZWdFbnRyeSkgeyByZXR1cm4gYWxsU2Vnc1tzZWdFbnRyeS5pbmRleF07IH0pO1xufVxuXG52YXIgVGltZUNvbHNDb250ZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhUaW1lQ29sc0NvbnRlbnQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGltZUNvbHNDb250ZW50KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3BsaXRGZ0V2ZW50U2VncyA9IGNvbW1vbi5tZW1vaXplKHNwbGl0U2Vnc0J5Q29sKTtcbiAgICAgICAgX3RoaXMuc3BsaXRCZ0V2ZW50U2VncyA9IGNvbW1vbi5tZW1vaXplKHNwbGl0U2Vnc0J5Q29sKTtcbiAgICAgICAgX3RoaXMuc3BsaXRCdXNpbmVzc0hvdXJTZWdzID0gY29tbW9uLm1lbW9pemUoc3BsaXRTZWdzQnlDb2wpO1xuICAgICAgICBfdGhpcy5zcGxpdE5vd0luZGljYXRvclNlZ3MgPSBjb21tb24ubWVtb2l6ZShzcGxpdFNlZ3NCeUNvbCk7XG4gICAgICAgIF90aGlzLnNwbGl0RGF0ZVNlbGVjdGlvblNlZ3MgPSBjb21tb24ubWVtb2l6ZShzcGxpdFNlZ3NCeUNvbCk7XG4gICAgICAgIF90aGlzLnNwbGl0RXZlbnREcmFnID0gY29tbW9uLm1lbW9pemUoc3BsaXRJbnRlcmFjdGlvbkJ5Q29sKTtcbiAgICAgICAgX3RoaXMuc3BsaXRFdmVudFJlc2l6ZSA9IGNvbW1vbi5tZW1vaXplKHNwbGl0SW50ZXJhY3Rpb25CeUNvbCk7XG4gICAgICAgIF90aGlzLnJvb3RFbFJlZiA9IGNvbW1vbi5jcmVhdGVSZWYoKTtcbiAgICAgICAgX3RoaXMuY2VsbEVsUmVmcyA9IG5ldyBjb21tb24uUmVmTWFwKCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgVGltZUNvbHNDb250ZW50LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgbm93SW5kaWNhdG9yVG9wID0gY29udGV4dC5vcHRpb25zLm5vd0luZGljYXRvciAmJlxuICAgICAgICAgICAgcHJvcHMuc2xhdENvb3JkcyAmJlxuICAgICAgICAgICAgcHJvcHMuc2xhdENvb3Jkcy5zYWZlQ29tcHV0ZVRvcChwcm9wcy5ub3dEYXRlKTsgLy8gbWlnaHQgcmV0dXJuIHZvaWRcbiAgICAgICAgdmFyIGNvbENudCA9IHByb3BzLmNlbGxzLmxlbmd0aDtcbiAgICAgICAgdmFyIGZnRXZlbnRTZWdzQnlSb3cgPSB0aGlzLnNwbGl0RmdFdmVudFNlZ3MocHJvcHMuZmdFdmVudFNlZ3MsIGNvbENudCk7XG4gICAgICAgIHZhciBiZ0V2ZW50U2Vnc0J5Um93ID0gdGhpcy5zcGxpdEJnRXZlbnRTZWdzKHByb3BzLmJnRXZlbnRTZWdzLCBjb2xDbnQpO1xuICAgICAgICB2YXIgYnVzaW5lc3NIb3VyU2Vnc0J5Um93ID0gdGhpcy5zcGxpdEJ1c2luZXNzSG91clNlZ3MocHJvcHMuYnVzaW5lc3NIb3VyU2VncywgY29sQ250KTtcbiAgICAgICAgdmFyIG5vd0luZGljYXRvclNlZ3NCeVJvdyA9IHRoaXMuc3BsaXROb3dJbmRpY2F0b3JTZWdzKHByb3BzLm5vd0luZGljYXRvclNlZ3MsIGNvbENudCk7XG4gICAgICAgIHZhciBkYXRlU2VsZWN0aW9uU2Vnc0J5Um93ID0gdGhpcy5zcGxpdERhdGVTZWxlY3Rpb25TZWdzKHByb3BzLmRhdGVTZWxlY3Rpb25TZWdzLCBjb2xDbnQpO1xuICAgICAgICB2YXIgZXZlbnREcmFnQnlSb3cgPSB0aGlzLnNwbGl0RXZlbnREcmFnKHByb3BzLmV2ZW50RHJhZywgY29sQ250KTtcbiAgICAgICAgdmFyIGV2ZW50UmVzaXplQnlSb3cgPSB0aGlzLnNwbGl0RXZlbnRSZXNpemUocHJvcHMuZXZlbnRSZXNpemUsIGNvbENudCk7XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtY29sc1wiLCByZWY6IHRoaXMucm9vdEVsUmVmIH0sXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInRhYmxlXCIsIHsgcm9sZTogXCJwcmVzZW50YXRpb25cIiwgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IHByb3BzLnRhYmxlTWluV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBwcm9wcy5jbGllbnRXaWR0aCxcbiAgICAgICAgICAgICAgICB9IH0sXG4gICAgICAgICAgICAgICAgcHJvcHMudGFibGVDb2xHcm91cE5vZGUsXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0Ym9keVwiLCB7IHJvbGU6IFwicHJlc2VudGF0aW9uXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCB7IHJvbGU6IFwicm93XCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLmF4aXMgJiYgKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGRcIiwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUsIGNsYXNzTmFtZTogXCJmYy10aW1lZ3JpZC1jb2wgZmMtdGltZWdyaWQtYXhpc1wiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtY29sLWZyYW1lXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtbm93LWluZGljYXRvci1jb250YWluZXJcIiB9LCB0eXBlb2Ygbm93SW5kaWNhdG9yVG9wID09PSAnbnVtYmVyJyAmJiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLk5vd0luZGljYXRvclJvb3QsIHsgaXNBeGlzOiB0cnVlLCBkYXRlOiBwcm9wcy5ub3dEYXRlIH0sIGZ1bmN0aW9uIChyb290RWxSZWYsIGNsYXNzTmFtZXMsIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCkgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgcmVmOiByb290RWxSZWYsIGNsYXNzTmFtZTogWydmYy10aW1lZ3JpZC1ub3ctaW5kaWNhdG9yLWFycm93J10uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSwgc3R5bGU6IHsgdG9wOiBub3dJbmRpY2F0b3JUb3AgfSB9LCBpbm5lckNvbnRlbnQpKTsgfSkpKSkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLmNlbGxzLm1hcChmdW5jdGlvbiAoY2VsbCwgaSkgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFRpbWVDb2wsIHsga2V5OiBjZWxsLmtleSwgZWxSZWY6IF90aGlzLmNlbGxFbFJlZnMuY3JlYXRlUmVmKGNlbGwua2V5KSwgZGF0ZVByb2ZpbGU6IHByb3BzLmRhdGVQcm9maWxlLCBkYXRlOiBjZWxsLmRhdGUsIG5vd0RhdGU6IHByb3BzLm5vd0RhdGUsIHRvZGF5UmFuZ2U6IHByb3BzLnRvZGF5UmFuZ2UsIGV4dHJhSG9va1Byb3BzOiBjZWxsLmV4dHJhSG9va1Byb3BzLCBleHRyYURhdGFBdHRyczogY2VsbC5leHRyYURhdGFBdHRycywgZXh0cmFDbGFzc05hbWVzOiBjZWxsLmV4dHJhQ2xhc3NOYW1lcywgZXh0cmFEYXRlU3BhbjogY2VsbC5leHRyYURhdGVTcGFuLCBmZ0V2ZW50U2VnczogZmdFdmVudFNlZ3NCeVJvd1tpXSwgYmdFdmVudFNlZ3M6IGJnRXZlbnRTZWdzQnlSb3dbaV0sIGJ1c2luZXNzSG91clNlZ3M6IGJ1c2luZXNzSG91clNlZ3NCeVJvd1tpXSwgbm93SW5kaWNhdG9yU2Vnczogbm93SW5kaWNhdG9yU2Vnc0J5Um93W2ldLCBkYXRlU2VsZWN0aW9uU2VnczogZGF0ZVNlbGVjdGlvblNlZ3NCeVJvd1tpXSwgZXZlbnREcmFnOiBldmVudERyYWdCeVJvd1tpXSwgZXZlbnRSZXNpemU6IGV2ZW50UmVzaXplQnlSb3dbaV0sIHNsYXRDb29yZHM6IHByb3BzLnNsYXRDb29yZHMsIGV2ZW50U2VsZWN0aW9uOiBwcm9wcy5ldmVudFNlbGVjdGlvbiwgZm9yUHJpbnQ6IHByb3BzLmZvclByaW50IH0pKTsgfSkpKSkpKTtcbiAgICB9O1xuICAgIFRpbWVDb2xzQ29udGVudC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ29vcmRzKCk7XG4gICAgfTtcbiAgICBUaW1lQ29sc0NvbnRlbnQucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVDb29yZHMoKTtcbiAgICB9O1xuICAgIFRpbWVDb2xzQ29udGVudC5wcm90b3R5cGUudXBkYXRlQ29vcmRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICBpZiAocHJvcHMub25Db2xDb29yZHMgJiZcbiAgICAgICAgICAgIHByb3BzLmNsaWVudFdpZHRoICE9PSBudWxsIC8vIG1lYW5zIHNpemluZyBoYXMgc3RhYmlsaXplZFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHByb3BzLm9uQ29sQ29vcmRzKG5ldyBjb21tb24uUG9zaXRpb25DYWNoZSh0aGlzLnJvb3RFbFJlZi5jdXJyZW50LCBjb2xsZWN0Q2VsbEVscyh0aGlzLmNlbGxFbFJlZnMuY3VycmVudE1hcCwgcHJvcHMuY2VsbHMpLCB0cnVlLCAvLyBob3Jpem9udGFsXG4gICAgICAgICAgICBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVGltZUNvbHNDb250ZW50O1xufShjb21tb24uQmFzZUNvbXBvbmVudCkpO1xuZnVuY3Rpb24gY29sbGVjdENlbGxFbHMoZWxNYXAsIGNlbGxzKSB7XG4gICAgcmV0dXJuIGNlbGxzLm1hcChmdW5jdGlvbiAoY2VsbCkgeyByZXR1cm4gZWxNYXBbY2VsbC5rZXldOyB9KTtcbn1cblxuLyogQSBjb21wb25lbnQgdGhhdCByZW5kZXJzIG9uZSBvciBtb3JlIGNvbHVtbnMgb2YgdmVydGljYWwgdGltZSBzbG90c1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG52YXIgVGltZUNvbHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFRpbWVDb2xzLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRpbWVDb2xzKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucHJvY2Vzc1Nsb3RPcHRpb25zID0gY29tbW9uLm1lbW9pemUocHJvY2Vzc1Nsb3RPcHRpb25zKTtcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBzbGF0Q29vcmRzOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVSb290RWwgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmNvbnRleHQucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudChfdGhpcywge1xuICAgICAgICAgICAgICAgICAgICBlbDogZWwsXG4gICAgICAgICAgICAgICAgICAgIGlzSGl0Q29tYm9BbGxvd2VkOiBfdGhpcy5wcm9wcy5pc0hpdENvbWJvQWxsb3dlZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIF90aGlzLmNvbnRleHQudW5yZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50KF90aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlU2Nyb2xsUmVxdWVzdCA9IGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG4gICAgICAgICAgICB2YXIgb25TY3JvbGxUb3BSZXF1ZXN0ID0gX3RoaXMucHJvcHMub25TY3JvbGxUb3BSZXF1ZXN0O1xuICAgICAgICAgICAgdmFyIHNsYXRDb29yZHMgPSBfdGhpcy5zdGF0ZS5zbGF0Q29vcmRzO1xuICAgICAgICAgICAgaWYgKG9uU2Nyb2xsVG9wUmVxdWVzdCAmJiBzbGF0Q29vcmRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QudGltZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdG9wXzEgPSBzbGF0Q29vcmRzLmNvbXB1dGVUaW1lVG9wKHJlcXVlc3QudGltZSk7XG4gICAgICAgICAgICAgICAgICAgIHRvcF8xID0gTWF0aC5jZWlsKHRvcF8xKTsgLy8gem9vbSBjYW4gZ2l2ZSB3ZWlyZCBmbG9hdGluZy1wb2ludCB2YWx1ZXMuIHJhdGhlciBzY3JvbGwgYSBsaXR0bGUgYml0IGZ1cnRoZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvcF8xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3BfMSArPSAxOyAvLyB0byBvdmVyY29tZSB0b3AgYm9yZGVyIHRoYXQgc2xvdHMgYmV5b25kIHRoZSBmaXJzdCBoYXZlLiBsb29rcyBiZXR0ZXJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBvblNjcm9sbFRvcFJlcXVlc3QodG9wXzEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlQ29sQ29vcmRzID0gZnVuY3Rpb24gKGNvbENvb3Jkcykge1xuICAgICAgICAgICAgX3RoaXMuY29sQ29vcmRzID0gY29sQ29vcmRzO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVTbGF0Q29vcmRzID0gZnVuY3Rpb24gKHNsYXRDb29yZHMpIHtcbiAgICAgICAgICAgIF90aGlzLnNldFN0YXRlKHsgc2xhdENvb3Jkczogc2xhdENvb3JkcyB9KTtcbiAgICAgICAgICAgIGlmIChfdGhpcy5wcm9wcy5vblNsYXRDb29yZHMpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5wcm9wcy5vblNsYXRDb29yZHMoc2xhdENvb3Jkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgVGltZUNvbHMucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgcHJvcHMgPSBfYS5wcm9wcywgc3RhdGUgPSBfYS5zdGF0ZTtcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy10aW1lZ3JpZC1ib2R5XCIsIHJlZjogdGhpcy5oYW5kbGVSb290RWwsIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgLy8gdGhlc2UgcHJvcHMgYXJlIGltcG9ydGFudCB0byBnaXZlIHRoaXMgd3JhcHBlciBjb3JyZWN0IGRpbWVuc2lvbnMgZm9yIGludGVyYWN0aW9uc1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IGlmIHdlIHNldCBpdCBoZXJlLCBjYW4gd2UgYXZvaWQgZ2l2aW5nIHRvIGlubmVyIHRhYmxlcz9cbiAgICAgICAgICAgICAgICB3aWR0aDogcHJvcHMuY2xpZW50V2lkdGgsXG4gICAgICAgICAgICAgICAgbWluV2lkdGg6IHByb3BzLnRhYmxlTWluV2lkdGgsXG4gICAgICAgICAgICB9IH0sXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChUaW1lQ29sc1NsYXRzLCB7IGF4aXM6IHByb3BzLmF4aXMsIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgc2xhdE1ldGFzOiBwcm9wcy5zbGF0TWV0YXMsIGNsaWVudFdpZHRoOiBwcm9wcy5jbGllbnRXaWR0aCwgbWluSGVpZ2h0OiBwcm9wcy5leHBhbmRSb3dzID8gcHJvcHMuY2xpZW50SGVpZ2h0IDogJycsIHRhYmxlTWluV2lkdGg6IHByb3BzLnRhYmxlTWluV2lkdGgsIHRhYmxlQ29sR3JvdXBOb2RlOiBwcm9wcy5heGlzID8gcHJvcHMudGFibGVDb2xHcm91cE5vZGUgOiBudWxsIC8qIGF4aXMgZGVwZW5kcyBvbiB0aGUgY29sZ3JvdXAncyBzaHJpbmtpbmcgKi8sIG9uQ29vcmRzOiB0aGlzLmhhbmRsZVNsYXRDb29yZHMgfSksXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChUaW1lQ29sc0NvbnRlbnQsIHsgY2VsbHM6IHByb3BzLmNlbGxzLCBheGlzOiBwcm9wcy5heGlzLCBkYXRlUHJvZmlsZTogcHJvcHMuZGF0ZVByb2ZpbGUsIGJ1c2luZXNzSG91clNlZ3M6IHByb3BzLmJ1c2luZXNzSG91clNlZ3MsIGJnRXZlbnRTZWdzOiBwcm9wcy5iZ0V2ZW50U2VncywgZmdFdmVudFNlZ3M6IHByb3BzLmZnRXZlbnRTZWdzLCBkYXRlU2VsZWN0aW9uU2VnczogcHJvcHMuZGF0ZVNlbGVjdGlvblNlZ3MsIGV2ZW50U2VsZWN0aW9uOiBwcm9wcy5ldmVudFNlbGVjdGlvbiwgZXZlbnREcmFnOiBwcm9wcy5ldmVudERyYWcsIGV2ZW50UmVzaXplOiBwcm9wcy5ldmVudFJlc2l6ZSwgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSwgbm93RGF0ZTogcHJvcHMubm93RGF0ZSwgbm93SW5kaWNhdG9yU2VnczogcHJvcHMubm93SW5kaWNhdG9yU2VncywgY2xpZW50V2lkdGg6IHByb3BzLmNsaWVudFdpZHRoLCB0YWJsZU1pbldpZHRoOiBwcm9wcy50YWJsZU1pbldpZHRoLCB0YWJsZUNvbEdyb3VwTm9kZTogcHJvcHMudGFibGVDb2xHcm91cE5vZGUsIHNsYXRDb29yZHM6IHN0YXRlLnNsYXRDb29yZHMsIG9uQ29sQ29vcmRzOiB0aGlzLmhhbmRsZUNvbENvb3JkcywgZm9yUHJpbnQ6IHByb3BzLmZvclByaW50IH0pKSk7XG4gICAgfTtcbiAgICBUaW1lQ29scy5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsUmVzcG9uZGVyID0gdGhpcy5jb250ZXh0LmNyZWF0ZVNjcm9sbFJlc3BvbmRlcih0aGlzLmhhbmRsZVNjcm9sbFJlcXVlc3QpO1xuICAgIH07XG4gICAgVGltZUNvbHMucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIChwcmV2UHJvcHMpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxSZXNwb25kZXIudXBkYXRlKHByZXZQcm9wcy5kYXRlUHJvZmlsZSAhPT0gdGhpcy5wcm9wcy5kYXRlUHJvZmlsZSk7XG4gICAgfTtcbiAgICBUaW1lQ29scy5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsUmVzcG9uZGVyLmRldGFjaCgpO1xuICAgIH07XG4gICAgVGltZUNvbHMucHJvdG90eXBlLnF1ZXJ5SGl0ID0gZnVuY3Rpb24gKHBvc2l0aW9uTGVmdCwgcG9zaXRpb25Ub3ApIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5jb250ZXh0LCBkYXRlRW52ID0gX2EuZGF0ZUVudiwgb3B0aW9ucyA9IF9hLm9wdGlvbnM7XG4gICAgICAgIHZhciBjb2xDb29yZHMgPSB0aGlzLmNvbENvb3JkcztcbiAgICAgICAgdmFyIGRhdGVQcm9maWxlID0gdGhpcy5wcm9wcy5kYXRlUHJvZmlsZTtcbiAgICAgICAgdmFyIHNsYXRDb29yZHMgPSB0aGlzLnN0YXRlLnNsYXRDb29yZHM7XG4gICAgICAgIHZhciBfYiA9IHRoaXMucHJvY2Vzc1Nsb3RPcHRpb25zKHRoaXMucHJvcHMuc2xvdER1cmF0aW9uLCBvcHRpb25zLnNuYXBEdXJhdGlvbiksIHNuYXBEdXJhdGlvbiA9IF9iLnNuYXBEdXJhdGlvbiwgc25hcHNQZXJTbG90ID0gX2Iuc25hcHNQZXJTbG90O1xuICAgICAgICB2YXIgY29sSW5kZXggPSBjb2xDb29yZHMubGVmdFRvSW5kZXgocG9zaXRpb25MZWZ0KTtcbiAgICAgICAgdmFyIHNsYXRJbmRleCA9IHNsYXRDb29yZHMucG9zaXRpb25zLnRvcFRvSW5kZXgocG9zaXRpb25Ub3ApO1xuICAgICAgICBpZiAoY29sSW5kZXggIT0gbnVsbCAmJiBzbGF0SW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGNlbGwgPSB0aGlzLnByb3BzLmNlbGxzW2NvbEluZGV4XTtcbiAgICAgICAgICAgIHZhciBzbGF0VG9wID0gc2xhdENvb3Jkcy5wb3NpdGlvbnMudG9wc1tzbGF0SW5kZXhdO1xuICAgICAgICAgICAgdmFyIHNsYXRIZWlnaHQgPSBzbGF0Q29vcmRzLnBvc2l0aW9ucy5nZXRIZWlnaHQoc2xhdEluZGV4KTtcbiAgICAgICAgICAgIHZhciBwYXJ0aWFsID0gKHBvc2l0aW9uVG9wIC0gc2xhdFRvcCkgLyBzbGF0SGVpZ2h0OyAvLyBmbG9hdGluZyBwb2ludCBudW1iZXIgYmV0d2VlbiAwIGFuZCAxXG4gICAgICAgICAgICB2YXIgbG9jYWxTbmFwSW5kZXggPSBNYXRoLmZsb29yKHBhcnRpYWwgKiBzbmFwc1BlclNsb3QpOyAvLyB0aGUgc25hcCAjIHJlbGF0aXZlIHRvIHN0YXJ0IG9mIHNsYXRcbiAgICAgICAgICAgIHZhciBzbmFwSW5kZXggPSBzbGF0SW5kZXggKiBzbmFwc1BlclNsb3QgKyBsb2NhbFNuYXBJbmRleDtcbiAgICAgICAgICAgIHZhciBkYXlEYXRlID0gdGhpcy5wcm9wcy5jZWxsc1tjb2xJbmRleF0uZGF0ZTtcbiAgICAgICAgICAgIHZhciB0aW1lID0gY29tbW9uLmFkZER1cmF0aW9ucyhkYXRlUHJvZmlsZS5zbG90TWluVGltZSwgY29tbW9uLm11bHRpcGx5RHVyYXRpb24oc25hcER1cmF0aW9uLCBzbmFwSW5kZXgpKTtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IGRhdGVFbnYuYWRkKGRheURhdGUsIHRpbWUpO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGRhdGVFbnYuYWRkKHN0YXJ0LCBzbmFwRHVyYXRpb24pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRlUHJvZmlsZTogZGF0ZVByb2ZpbGUsXG4gICAgICAgICAgICAgICAgZGF0ZVNwYW46IHRzbGliLl9fYXNzaWduKHsgcmFuZ2U6IHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9LCBhbGxEYXk6IGZhbHNlIH0sIGNlbGwuZXh0cmFEYXRlU3BhbiksXG4gICAgICAgICAgICAgICAgZGF5RWw6IGNvbENvb3Jkcy5lbHNbY29sSW5kZXhdLFxuICAgICAgICAgICAgICAgIHJlY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogY29sQ29vcmRzLmxlZnRzW2NvbEluZGV4XSxcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IGNvbENvb3Jkcy5yaWdodHNbY29sSW5kZXhdLFxuICAgICAgICAgICAgICAgICAgICB0b3A6IHNsYXRUb3AsXG4gICAgICAgICAgICAgICAgICAgIGJvdHRvbTogc2xhdFRvcCArIHNsYXRIZWlnaHQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBsYXllcjogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4gVGltZUNvbHM7XG59KGNvbW1vbi5EYXRlQ29tcG9uZW50KSk7XG5mdW5jdGlvbiBwcm9jZXNzU2xvdE9wdGlvbnMoc2xvdER1cmF0aW9uLCBzbmFwRHVyYXRpb25PdmVycmlkZSkge1xuICAgIHZhciBzbmFwRHVyYXRpb24gPSBzbmFwRHVyYXRpb25PdmVycmlkZSB8fCBzbG90RHVyYXRpb247XG4gICAgdmFyIHNuYXBzUGVyU2xvdCA9IGNvbW1vbi53aG9sZURpdmlkZUR1cmF0aW9ucyhzbG90RHVyYXRpb24sIHNuYXBEdXJhdGlvbik7XG4gICAgaWYgKHNuYXBzUGVyU2xvdCA9PT0gbnVsbCkge1xuICAgICAgICBzbmFwRHVyYXRpb24gPSBzbG90RHVyYXRpb247XG4gICAgICAgIHNuYXBzUGVyU2xvdCA9IDE7XG4gICAgICAgIC8vIFRPRE86IHNheSB3YXJuaW5nP1xuICAgIH1cbiAgICByZXR1cm4geyBzbmFwRHVyYXRpb246IHNuYXBEdXJhdGlvbiwgc25hcHNQZXJTbG90OiBzbmFwc1BlclNsb3QgfTtcbn1cblxudmFyIERheVRpbWVDb2xzU2xpY2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhEYXlUaW1lQ29sc1NsaWNlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEYXlUaW1lQ29sc1NsaWNlcigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBEYXlUaW1lQ29sc1NsaWNlci5wcm90b3R5cGUuc2xpY2VSYW5nZSA9IGZ1bmN0aW9uIChyYW5nZSwgZGF5UmFuZ2VzKSB7XG4gICAgICAgIHZhciBzZWdzID0gW107XG4gICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IGRheVJhbmdlcy5sZW5ndGg7IGNvbCArPSAxKSB7XG4gICAgICAgICAgICB2YXIgc2VnUmFuZ2UgPSBjb21tb24uaW50ZXJzZWN0UmFuZ2VzKHJhbmdlLCBkYXlSYW5nZXNbY29sXSk7XG4gICAgICAgICAgICBpZiAoc2VnUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBzZWdzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBzdGFydDogc2VnUmFuZ2Uuc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIGVuZDogc2VnUmFuZ2UuZW5kLFxuICAgICAgICAgICAgICAgICAgICBpc1N0YXJ0OiBzZWdSYW5nZS5zdGFydC52YWx1ZU9mKCkgPT09IHJhbmdlLnN0YXJ0LnZhbHVlT2YoKSxcbiAgICAgICAgICAgICAgICAgICAgaXNFbmQ6IHNlZ1JhbmdlLmVuZC52YWx1ZU9mKCkgPT09IHJhbmdlLmVuZC52YWx1ZU9mKCksXG4gICAgICAgICAgICAgICAgICAgIGNvbDogY29sLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWdzO1xuICAgIH07XG4gICAgcmV0dXJuIERheVRpbWVDb2xzU2xpY2VyO1xufShjb21tb24uU2xpY2VyKSk7XG5cbnZhciBEYXlUaW1lQ29scyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoRGF5VGltZUNvbHMsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRGF5VGltZUNvbHMoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5idWlsZERheVJhbmdlcyA9IGNvbW1vbi5tZW1vaXplKGJ1aWxkRGF5UmFuZ2VzKTtcbiAgICAgICAgX3RoaXMuc2xpY2VyID0gbmV3IERheVRpbWVDb2xzU2xpY2VyKCk7XG4gICAgICAgIF90aGlzLnRpbWVDb2xzUmVmID0gY29tbW9uLmNyZWF0ZVJlZigpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIERheVRpbWVDb2xzLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgZGF0ZVByb2ZpbGUgPSBwcm9wcy5kYXRlUHJvZmlsZSwgZGF5VGFibGVNb2RlbCA9IHByb3BzLmRheVRhYmxlTW9kZWw7XG4gICAgICAgIHZhciBpc05vd0luZGljYXRvciA9IGNvbnRleHQub3B0aW9ucy5ub3dJbmRpY2F0b3I7XG4gICAgICAgIHZhciBkYXlSYW5nZXMgPSB0aGlzLmJ1aWxkRGF5UmFuZ2VzKGRheVRhYmxlTW9kZWwsIGRhdGVQcm9maWxlLCBjb250ZXh0LmRhdGVFbnYpO1xuICAgICAgICAvLyBnaXZlIGl0IHRoZSBmaXJzdCByb3cgb2YgY2VsbHNcbiAgICAgICAgLy8gVE9ETzogd291bGQgbW92ZSB0aGlzIGZ1cnRoZXIgZG93biBoaWVyYXJjaHksIGJ1dCBzbGljZU5vd0RhdGUgbmVlZHMgaXRcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uTm93VGltZXIsIHsgdW5pdDogaXNOb3dJbmRpY2F0b3IgPyAnbWludXRlJyA6ICdkYXknIH0sIGZ1bmN0aW9uIChub3dEYXRlLCB0b2RheVJhbmdlKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoVGltZUNvbHMsIHRzbGliLl9fYXNzaWduKHsgcmVmOiBfdGhpcy50aW1lQ29sc1JlZiB9LCBfdGhpcy5zbGljZXIuc2xpY2VQcm9wcyhwcm9wcywgZGF0ZVByb2ZpbGUsIG51bGwsIGNvbnRleHQsIGRheVJhbmdlcyksIHsgZm9yUHJpbnQ6IHByb3BzLmZvclByaW50LCBheGlzOiBwcm9wcy5heGlzLCBkYXRlUHJvZmlsZTogZGF0ZVByb2ZpbGUsIHNsYXRNZXRhczogcHJvcHMuc2xhdE1ldGFzLCBzbG90RHVyYXRpb246IHByb3BzLnNsb3REdXJhdGlvbiwgY2VsbHM6IGRheVRhYmxlTW9kZWwuY2VsbHNbMF0sIHRhYmxlQ29sR3JvdXBOb2RlOiBwcm9wcy50YWJsZUNvbEdyb3VwTm9kZSwgdGFibGVNaW5XaWR0aDogcHJvcHMudGFibGVNaW5XaWR0aCwgY2xpZW50V2lkdGg6IHByb3BzLmNsaWVudFdpZHRoLCBjbGllbnRIZWlnaHQ6IHByb3BzLmNsaWVudEhlaWdodCwgZXhwYW5kUm93czogcHJvcHMuZXhwYW5kUm93cywgbm93RGF0ZTogbm93RGF0ZSwgbm93SW5kaWNhdG9yU2VnczogaXNOb3dJbmRpY2F0b3IgJiYgX3RoaXMuc2xpY2VyLnNsaWNlTm93RGF0ZShub3dEYXRlLCBjb250ZXh0LCBkYXlSYW5nZXMpLCB0b2RheVJhbmdlOiB0b2RheVJhbmdlLCBvblNjcm9sbFRvcFJlcXVlc3Q6IHByb3BzLm9uU2Nyb2xsVG9wUmVxdWVzdCwgb25TbGF0Q29vcmRzOiBwcm9wcy5vblNsYXRDb29yZHMgfSkpKTsgfSkpO1xuICAgIH07XG4gICAgcmV0dXJuIERheVRpbWVDb2xzO1xufShjb21tb24uRGF0ZUNvbXBvbmVudCkpO1xuZnVuY3Rpb24gYnVpbGREYXlSYW5nZXMoZGF5VGFibGVNb2RlbCwgZGF0ZVByb2ZpbGUsIGRhdGVFbnYpIHtcbiAgICB2YXIgcmFuZ2VzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IGRheVRhYmxlTW9kZWwuaGVhZGVyRGF0ZXM7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBkYXRlID0gX2FbX2ldO1xuICAgICAgICByYW5nZXMucHVzaCh7XG4gICAgICAgICAgICBzdGFydDogZGF0ZUVudi5hZGQoZGF0ZSwgZGF0ZVByb2ZpbGUuc2xvdE1pblRpbWUpLFxuICAgICAgICAgICAgZW5kOiBkYXRlRW52LmFkZChkYXRlLCBkYXRlUHJvZmlsZS5zbG90TWF4VGltZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmFuZ2VzO1xufVxuXG4vLyBwb3RlbnRpYWwgbmljZSB2YWx1ZXMgZm9yIHRoZSBzbG90LWR1cmF0aW9uIGFuZCBpbnRlcnZhbC1kdXJhdGlvblxuLy8gZnJvbSBsYXJnZXN0IHRvIHNtYWxsZXN0XG52YXIgU1RPQ0tfU1VCX0RVUkFUSU9OUyA9IFtcbiAgICB7IGhvdXJzOiAxIH0sXG4gICAgeyBtaW51dGVzOiAzMCB9LFxuICAgIHsgbWludXRlczogMTUgfSxcbiAgICB7IHNlY29uZHM6IDMwIH0sXG4gICAgeyBzZWNvbmRzOiAxNSB9LFxuXTtcbmZ1bmN0aW9uIGJ1aWxkU2xhdE1ldGFzKHNsb3RNaW5UaW1lLCBzbG90TWF4VGltZSwgZXhwbGljaXRMYWJlbEludGVydmFsLCBzbG90RHVyYXRpb24sIGRhdGVFbnYpIHtcbiAgICB2YXIgZGF5U3RhcnQgPSBuZXcgRGF0ZSgwKTtcbiAgICB2YXIgc2xhdFRpbWUgPSBzbG90TWluVGltZTtcbiAgICB2YXIgc2xhdEl0ZXJhdG9yID0gY29tbW9uLmNyZWF0ZUR1cmF0aW9uKDApO1xuICAgIHZhciBsYWJlbEludGVydmFsID0gZXhwbGljaXRMYWJlbEludGVydmFsIHx8IGNvbXB1dGVMYWJlbEludGVydmFsKHNsb3REdXJhdGlvbik7XG4gICAgdmFyIG1ldGFzID0gW107XG4gICAgd2hpbGUgKGNvbW1vbi5hc1JvdWdoTXMoc2xhdFRpbWUpIDwgY29tbW9uLmFzUm91Z2hNcyhzbG90TWF4VGltZSkpIHtcbiAgICAgICAgdmFyIGRhdGUgPSBkYXRlRW52LmFkZChkYXlTdGFydCwgc2xhdFRpbWUpO1xuICAgICAgICB2YXIgaXNMYWJlbGVkID0gY29tbW9uLndob2xlRGl2aWRlRHVyYXRpb25zKHNsYXRJdGVyYXRvciwgbGFiZWxJbnRlcnZhbCkgIT09IG51bGw7XG4gICAgICAgIG1ldGFzLnB1c2goe1xuICAgICAgICAgICAgZGF0ZTogZGF0ZSxcbiAgICAgICAgICAgIHRpbWU6IHNsYXRUaW1lLFxuICAgICAgICAgICAga2V5OiBkYXRlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICBpc29UaW1lU3RyOiBjb21tb24uZm9ybWF0SXNvVGltZVN0cmluZyhkYXRlKSxcbiAgICAgICAgICAgIGlzTGFiZWxlZDogaXNMYWJlbGVkLFxuICAgICAgICB9KTtcbiAgICAgICAgc2xhdFRpbWUgPSBjb21tb24uYWRkRHVyYXRpb25zKHNsYXRUaW1lLCBzbG90RHVyYXRpb24pO1xuICAgICAgICBzbGF0SXRlcmF0b3IgPSBjb21tb24uYWRkRHVyYXRpb25zKHNsYXRJdGVyYXRvciwgc2xvdER1cmF0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGFzO1xufVxuLy8gQ29tcHV0ZXMgYW4gYXV0b21hdGljIHZhbHVlIGZvciBzbG90TGFiZWxJbnRlcnZhbFxuZnVuY3Rpb24gY29tcHV0ZUxhYmVsSW50ZXJ2YWwoc2xvdER1cmF0aW9uKSB7XG4gICAgdmFyIGk7XG4gICAgdmFyIGxhYmVsSW50ZXJ2YWw7XG4gICAgdmFyIHNsb3RzUGVyTGFiZWw7XG4gICAgLy8gZmluZCB0aGUgc21hbGxlc3Qgc3RvY2sgbGFiZWwgaW50ZXJ2YWwgdGhhdCByZXN1bHRzIGluIG1vcmUgdGhhbiBvbmUgc2xvdHMtcGVyLWxhYmVsXG4gICAgZm9yIChpID0gU1RPQ0tfU1VCX0RVUkFUSU9OUy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgICBsYWJlbEludGVydmFsID0gY29tbW9uLmNyZWF0ZUR1cmF0aW9uKFNUT0NLX1NVQl9EVVJBVElPTlNbaV0pO1xuICAgICAgICBzbG90c1BlckxhYmVsID0gY29tbW9uLndob2xlRGl2aWRlRHVyYXRpb25zKGxhYmVsSW50ZXJ2YWwsIHNsb3REdXJhdGlvbik7XG4gICAgICAgIGlmIChzbG90c1BlckxhYmVsICE9PSBudWxsICYmIHNsb3RzUGVyTGFiZWwgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbGFiZWxJbnRlcnZhbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2xvdER1cmF0aW9uOyAvLyBmYWxsIGJhY2tcbn1cblxudmFyIERheVRpbWVDb2xzVmlldyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoRGF5VGltZUNvbHNWaWV3LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIERheVRpbWVDb2xzVmlldygpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmJ1aWxkVGltZUNvbHNNb2RlbCA9IGNvbW1vbi5tZW1vaXplKGJ1aWxkVGltZUNvbHNNb2RlbCk7XG4gICAgICAgIF90aGlzLmJ1aWxkU2xhdE1ldGFzID0gY29tbW9uLm1lbW9pemUoYnVpbGRTbGF0TWV0YXMpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIERheVRpbWVDb2xzVmlldy5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmNvbnRleHQsIG9wdGlvbnMgPSBfYS5vcHRpb25zLCBkYXRlRW52ID0gX2EuZGF0ZUVudiwgZGF0ZVByb2ZpbGVHZW5lcmF0b3IgPSBfYS5kYXRlUHJvZmlsZUdlbmVyYXRvcjtcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgdmFyIGRhdGVQcm9maWxlID0gcHJvcHMuZGF0ZVByb2ZpbGU7XG4gICAgICAgIHZhciBkYXlUYWJsZU1vZGVsID0gdGhpcy5idWlsZFRpbWVDb2xzTW9kZWwoZGF0ZVByb2ZpbGUsIGRhdGVQcm9maWxlR2VuZXJhdG9yKTtcbiAgICAgICAgdmFyIHNwbGl0UHJvcHMgPSB0aGlzLmFsbERheVNwbGl0dGVyLnNwbGl0UHJvcHMocHJvcHMpO1xuICAgICAgICB2YXIgc2xhdE1ldGFzID0gdGhpcy5idWlsZFNsYXRNZXRhcyhkYXRlUHJvZmlsZS5zbG90TWluVGltZSwgZGF0ZVByb2ZpbGUuc2xvdE1heFRpbWUsIG9wdGlvbnMuc2xvdExhYmVsSW50ZXJ2YWwsIG9wdGlvbnMuc2xvdER1cmF0aW9uLCBkYXRlRW52KTtcbiAgICAgICAgdmFyIGRheU1pbldpZHRoID0gb3B0aW9ucy5kYXlNaW5XaWR0aDtcbiAgICAgICAgdmFyIGhhc0F0dGFjaGVkQXhpcyA9ICFkYXlNaW5XaWR0aDtcbiAgICAgICAgdmFyIGhhc0RldGFjaGVkQXhpcyA9IGRheU1pbldpZHRoO1xuICAgICAgICB2YXIgaGVhZGVyQ29udGVudCA9IG9wdGlvbnMuZGF5SGVhZGVycyAmJiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkRheUhlYWRlciwgeyBkYXRlczogZGF5VGFibGVNb2RlbC5oZWFkZXJEYXRlcywgZGF0ZVByb2ZpbGU6IGRhdGVQcm9maWxlLCBkYXRlc1JlcERpc3RpbmN0RGF5czogdHJ1ZSwgcmVuZGVySW50cm86IGhhc0F0dGFjaGVkQXhpcyA/IHRoaXMucmVuZGVySGVhZEF4aXMgOiBudWxsIH0pKTtcbiAgICAgICAgdmFyIGFsbERheUNvbnRlbnQgPSAob3B0aW9ucy5hbGxEYXlTbG90ICE9PSBmYWxzZSkgJiYgKGZ1bmN0aW9uIChjb250ZW50QXJnKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoZGF5Z3JpZC5EYXlUYWJsZSwgdHNsaWIuX19hc3NpZ24oe30sIHNwbGl0UHJvcHMuYWxsRGF5LCB7IGRhdGVQcm9maWxlOiBkYXRlUHJvZmlsZSwgZGF5VGFibGVNb2RlbDogZGF5VGFibGVNb2RlbCwgbmV4dERheVRocmVzaG9sZDogb3B0aW9ucy5uZXh0RGF5VGhyZXNob2xkLCB0YWJsZU1pbldpZHRoOiBjb250ZW50QXJnLnRhYmxlTWluV2lkdGgsIGNvbEdyb3VwTm9kZTogY29udGVudEFyZy50YWJsZUNvbEdyb3VwTm9kZSwgcmVuZGVyUm93SW50cm86IGhhc0F0dGFjaGVkQXhpcyA/IF90aGlzLnJlbmRlclRhYmxlUm93QXhpcyA6IG51bGwsIHNob3dXZWVrTnVtYmVyczogZmFsc2UsIGV4cGFuZFJvd3M6IGZhbHNlLCBoZWFkZXJBbGlnbkVsUmVmOiBfdGhpcy5oZWFkZXJFbFJlZiwgY2xpZW50V2lkdGg6IGNvbnRlbnRBcmcuY2xpZW50V2lkdGgsIGNsaWVudEhlaWdodDogY29udGVudEFyZy5jbGllbnRIZWlnaHQsIGZvclByaW50OiBwcm9wcy5mb3JQcmludCB9LCBfdGhpcy5nZXRBbGxEYXlNYXhFdmVudFByb3BzKCkpKSk7IH0pO1xuICAgICAgICB2YXIgdGltZUdyaWRDb250ZW50ID0gZnVuY3Rpb24gKGNvbnRlbnRBcmcpIHsgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChEYXlUaW1lQ29scywgdHNsaWIuX19hc3NpZ24oe30sIHNwbGl0UHJvcHMudGltZWQsIHsgZGF5VGFibGVNb2RlbDogZGF5VGFibGVNb2RlbCwgZGF0ZVByb2ZpbGU6IGRhdGVQcm9maWxlLCBheGlzOiBoYXNBdHRhY2hlZEF4aXMsIHNsb3REdXJhdGlvbjogb3B0aW9ucy5zbG90RHVyYXRpb24sIHNsYXRNZXRhczogc2xhdE1ldGFzLCBmb3JQcmludDogcHJvcHMuZm9yUHJpbnQsIHRhYmxlQ29sR3JvdXBOb2RlOiBjb250ZW50QXJnLnRhYmxlQ29sR3JvdXBOb2RlLCB0YWJsZU1pbldpZHRoOiBjb250ZW50QXJnLnRhYmxlTWluV2lkdGgsIGNsaWVudFdpZHRoOiBjb250ZW50QXJnLmNsaWVudFdpZHRoLCBjbGllbnRIZWlnaHQ6IGNvbnRlbnRBcmcuY2xpZW50SGVpZ2h0LCBvblNsYXRDb29yZHM6IF90aGlzLmhhbmRsZVNsYXRDb29yZHMsIGV4cGFuZFJvd3M6IGNvbnRlbnRBcmcuZXhwYW5kUm93cywgb25TY3JvbGxUb3BSZXF1ZXN0OiBfdGhpcy5oYW5kbGVTY3JvbGxUb3BSZXF1ZXN0IH0pKSk7IH07XG4gICAgICAgIHJldHVybiBoYXNEZXRhY2hlZEF4aXNcbiAgICAgICAgICAgID8gdGhpcy5yZW5kZXJIU2Nyb2xsTGF5b3V0KGhlYWRlckNvbnRlbnQsIGFsbERheUNvbnRlbnQsIHRpbWVHcmlkQ29udGVudCwgZGF5VGFibGVNb2RlbC5jb2xDbnQsIGRheU1pbldpZHRoLCBzbGF0TWV0YXMsIHRoaXMuc3RhdGUuc2xhdENvb3JkcylcbiAgICAgICAgICAgIDogdGhpcy5yZW5kZXJTaW1wbGVMYXlvdXQoaGVhZGVyQ29udGVudCwgYWxsRGF5Q29udGVudCwgdGltZUdyaWRDb250ZW50KTtcbiAgICB9O1xuICAgIHJldHVybiBEYXlUaW1lQ29sc1ZpZXc7XG59KFRpbWVDb2xzVmlldykpO1xuZnVuY3Rpb24gYnVpbGRUaW1lQ29sc01vZGVsKGRhdGVQcm9maWxlLCBkYXRlUHJvZmlsZUdlbmVyYXRvcikge1xuICAgIHZhciBkYXlTZXJpZXMgPSBuZXcgY29tbW9uLkRheVNlcmllc01vZGVsKGRhdGVQcm9maWxlLnJlbmRlclJhbmdlLCBkYXRlUHJvZmlsZUdlbmVyYXRvcik7XG4gICAgcmV0dXJuIG5ldyBjb21tb24uRGF5VGFibGVNb2RlbChkYXlTZXJpZXMsIGZhbHNlKTtcbn1cblxudmFyIE9QVElPTl9SRUZJTkVSUyA9IHtcbiAgICBhbGxEYXlTbG90OiBCb29sZWFuLFxufTtcblxudmFyIG1haW4gPSBjb21tb24uY3JlYXRlUGx1Z2luKHtcbiAgICBpbml0aWFsVmlldzogJ3RpbWVHcmlkV2VlaycsXG4gICAgb3B0aW9uUmVmaW5lcnM6IE9QVElPTl9SRUZJTkVSUyxcbiAgICB2aWV3czoge1xuICAgICAgICB0aW1lR3JpZDoge1xuICAgICAgICAgICAgY29tcG9uZW50OiBEYXlUaW1lQ29sc1ZpZXcsXG4gICAgICAgICAgICB1c2VzTWluTWF4VGltZTogdHJ1ZSxcbiAgICAgICAgICAgIGFsbERheVNsb3Q6IHRydWUsXG4gICAgICAgICAgICBzbG90RHVyYXRpb246ICcwMDozMDowMCcsXG4gICAgICAgICAgICBzbG90RXZlbnRPdmVybGFwOiB0cnVlLCAvLyBhIGJhZCBuYW1lLiBjb25mdXNlZCB3aXRoIG92ZXJsYXAvY29uc3RyYWludCBzeXN0ZW1cbiAgICAgICAgfSxcbiAgICAgICAgdGltZUdyaWREYXk6IHtcbiAgICAgICAgICAgIHR5cGU6ICd0aW1lR3JpZCcsXG4gICAgICAgICAgICBkdXJhdGlvbjogeyBkYXlzOiAxIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHRpbWVHcmlkV2Vlazoge1xuICAgICAgICAgICAgdHlwZTogJ3RpbWVHcmlkJyxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB7IHdlZWtzOiAxIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn0pO1xuXG5leHBvcnRzLkRheVRpbWVDb2xzID0gRGF5VGltZUNvbHM7XG5leHBvcnRzLkRheVRpbWVDb2xzU2xpY2VyID0gRGF5VGltZUNvbHNTbGljZXI7XG5leHBvcnRzLkRheVRpbWVDb2xzVmlldyA9IERheVRpbWVDb2xzVmlldztcbmV4cG9ydHMuVGltZUNvbHMgPSBUaW1lQ29scztcbmV4cG9ydHMuVGltZUNvbHNTbGF0c0Nvb3JkcyA9IFRpbWVDb2xzU2xhdHNDb29yZHM7XG5leHBvcnRzLlRpbWVDb2xzVmlldyA9IFRpbWVDb2xzVmlldztcbmV4cG9ydHMuYnVpbGREYXlSYW5nZXMgPSBidWlsZERheVJhbmdlcztcbmV4cG9ydHMuYnVpbGRTbGF0TWV0YXMgPSBidWlsZFNsYXRNZXRhcztcbmV4cG9ydHMuYnVpbGRUaW1lQ29sc01vZGVsID0gYnVpbGRUaW1lQ29sc01vZGVsO1xuZXhwb3J0cy5kZWZhdWx0ID0gbWFpbjtcbiJdLCJtYXBwaW5ncyI6IkFB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 },{"@fullcalendar/common":1,"@fullcalendar/daygrid":5,"tslib":32}],9:[function(require,module,exports){ (function (process){ /** * @popperjs/core v2.11.5 - MIT License */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function getWindow(node) { if (node == null) { return window; } if (node.toString() !== '[object Window]') { var ownerDocument = node.ownerDocument; return ownerDocument ? ownerDocument.defaultView || window : window; } return node; } function isElement(node) { var OwnElement = getWindow(node).Element; return node instanceof OwnElement || node instanceof Element; } function isHTMLElement(node) { var OwnElement = getWindow(node).HTMLElement; return node instanceof OwnElement || node instanceof HTMLElement; } function isShadowRoot(node) { // IE 11 has no ShadowRoot if (typeof ShadowRoot === 'undefined') { return false; } var OwnElement = getWindow(node).ShadowRoot; return node instanceof OwnElement || node instanceof ShadowRoot; } var max = Math.max; var min = Math.min; var round = Math.round; function getBoundingClientRect(element, includeScale) { if (includeScale === void 0) { includeScale = false; } var rect = element.getBoundingClientRect(); var scaleX = 1; var scaleY = 1; if (isHTMLElement(element) && includeScale) { var offsetHeight = element.offsetHeight; var offsetWidth = element.offsetWidth; // Do not attempt to divide by 0, otherwise we get `Infinity` as scale // Fallback to 1 in case both values are `0` if (offsetWidth > 0) { scaleX = round(rect.width) / offsetWidth || 1; } if (offsetHeight > 0) { scaleY = round(rect.height) / offsetHeight || 1; } } return { width: rect.width / scaleX, height: rect.height / scaleY, top: rect.top / scaleY, right: rect.right / scaleX, bottom: rect.bottom / scaleY, left: rect.left / scaleX, x: rect.left / scaleX, y: rect.top / scaleY }; } function getWindowScroll(node) { var win = getWindow(node); var scrollLeft = win.pageXOffset; var scrollTop = win.pageYOffset; return { scrollLeft: scrollLeft, scrollTop: scrollTop }; } function getHTMLElementScroll(element) { return { scrollLeft: element.scrollLeft, scrollTop: element.scrollTop }; } function getNodeScroll(node) { if (node === getWindow(node) || !isHTMLElement(node)) { return getWindowScroll(node); } else { return getHTMLElementScroll(node); } } function getNodeName(element) { return element ? (element.nodeName || '').toLowerCase() : null; } function getDocumentElement(element) { // $FlowFixMe[incompatible-return]: assume body is always available return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing] element.document) || window.document).documentElement; } function getWindowScrollBarX(element) { // If has a CSS width greater than the viewport, then this will be // incorrect for RTL. // Popper 1 is broken in this case and never had a bug report so let's assume // it's not an issue. I don't think anyone ever specifies width on // anyway. // Browsers where the left scrollbar doesn't cause an issue report `0` for // this (e.g. Edge 2019, IE11, Safari) return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; } function getComputedStyle(element) { return getWindow(element).getComputedStyle(element); } function isScrollParent(element) { // Firefox wants us to check `-x` and `-y` variations as well var _getComputedStyle = getComputedStyle(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY; return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); } function isElementScaled(element) { var rect = element.getBoundingClientRect(); var scaleX = round(rect.width) / element.offsetWidth || 1; var scaleY = round(rect.height) / element.offsetHeight || 1; return scaleX !== 1 || scaleY !== 1; } // Returns the composite rect of an element relative to its offsetParent. // Composite means it takes into account transforms as well as layout. function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { if (isFixed === void 0) { isFixed = false; } var isOffsetParentAnElement = isHTMLElement(offsetParent); var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent); var documentElement = getDocumentElement(offsetParent); var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled); var scroll = { scrollLeft: 0, scrollTop: 0 }; var offsets = { x: 0, y: 0 }; if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078 isScrollParent(documentElement)) { scroll = getNodeScroll(offsetParent); } if (isHTMLElement(offsetParent)) { offsets = getBoundingClientRect(offsetParent, true); offsets.x += offsetParent.clientLeft; offsets.y += offsetParent.clientTop; } else if (documentElement) { offsets.x = getWindowScrollBarX(documentElement); } } return { x: rect.left + scroll.scrollLeft - offsets.x, y: rect.top + scroll.scrollTop - offsets.y, width: rect.width, height: rect.height }; } // means it doesn't take into account transforms. function getLayoutRect(element) { var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed. // Fixes https://github.com/popperjs/popper-core/issues/1223 var width = element.offsetWidth; var height = element.offsetHeight; if (Math.abs(clientRect.width - width) <= 1) { width = clientRect.width; } if (Math.abs(clientRect.height - height) <= 1) { height = clientRect.height; } return { x: element.offsetLeft, y: element.offsetTop, width: width, height: height }; } function getParentNode(element) { if (getNodeName(element) === 'html') { return element; } return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle // $FlowFixMe[incompatible-return] // $FlowFixMe[prop-missing] element.assignedSlot || // step into the shadow DOM of the parent of a slotted node element.parentNode || ( // DOM Element detected isShadowRoot(element) ? element.host : null) || // ShadowRoot detected // $FlowFixMe[incompatible-call]: HTMLElement is a Node getDocumentElement(element) // fallback ); } function getScrollParent(node) { if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) { // $FlowFixMe[incompatible-return]: assume body is always available return node.ownerDocument.body; } if (isHTMLElement(node) && isScrollParent(node)) { return node; } return getScrollParent(getParentNode(node)); } /* given a DOM element, return the list of all scroll parents, up the list of ancesors until we get to the top window object. This list is what we attach scroll listeners to, because if any of these parent elements scroll, we'll need to re-calculate the reference element's position. */ function listScrollParents(element, list) { var _element$ownerDocumen; if (list === void 0) { list = []; } var scrollParent = getScrollParent(element); var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); var win = getWindow(scrollParent); var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; var updatedList = list.concat(target); return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here updatedList.concat(listScrollParents(getParentNode(target))); } function isTableElement(element) { return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0; } function getTrueOffsetParent(element) { if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837 getComputedStyle(element).position === 'fixed') { return null; } return element.offsetParent; } // `.offsetParent` reports `null` for fixed elements, while absolute elements // return the containing block function getContainingBlock(element) { var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1; var isIE = navigator.userAgent.indexOf('Trident') !== -1; if (isIE && isHTMLElement(element)) { // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport var elementCss = getComputedStyle(element); if (elementCss.position === 'fixed') { return null; } } var currentNode = getParentNode(element); if (isShadowRoot(currentNode)) { currentNode = currentNode.host; } while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) { var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that // create a containing block. // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') { return currentNode; } else { currentNode = currentNode.parentNode; } } return null; } // Gets the closest ancestor positioned element. Handles some edge cases, // such as table ancestors and cross browser bugs. function getOffsetParent(element) { var window = getWindow(element); var offsetParent = getTrueOffsetParent(element); while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') { offsetParent = getTrueOffsetParent(offsetParent); } if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) { return window; } return offsetParent || getContainingBlock(element) || window; } var top = 'top'; var bottom = 'bottom'; var right = 'right'; var left = 'left'; var auto = 'auto'; var basePlacements = [top, bottom, right, left]; var start = 'start'; var end = 'end'; var clippingParents = 'clippingParents'; var viewport = 'viewport'; var popper = 'popper'; var reference = 'reference'; var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) { return acc.concat([placement + "-" + start, placement + "-" + end]); }, []); var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) { return acc.concat([placement, placement + "-" + start, placement + "-" + end]); }, []); // modifiers that need to read the DOM var beforeRead = 'beforeRead'; var read = 'read'; var afterRead = 'afterRead'; // pure-logic modifiers var beforeMain = 'beforeMain'; var main = 'main'; var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state) var beforeWrite = 'beforeWrite'; var write = 'write'; var afterWrite = 'afterWrite'; var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; function order(modifiers) { var map = new Map(); var visited = new Set(); var result = []; modifiers.forEach(function (modifier) { map.set(modifier.name, modifier); }); // On visiting object, check for its dependencies and visit them recursively function sort(modifier) { visited.add(modifier.name); var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); requires.forEach(function (dep) { if (!visited.has(dep)) { var depModifier = map.get(dep); if (depModifier) { sort(depModifier); } } }); result.push(modifier); } modifiers.forEach(function (modifier) { if (!visited.has(modifier.name)) { // check for visited object sort(modifier); } }); return result; } function orderModifiers(modifiers) { // order based on dependencies var orderedModifiers = order(modifiers); // order based on phase return modifierPhases.reduce(function (acc, phase) { return acc.concat(orderedModifiers.filter(function (modifier) { return modifier.phase === phase; })); }, []); } function debounce(fn) { var pending; return function () { if (!pending) { pending = new Promise(function (resolve) { Promise.resolve().then(function () { pending = undefined; resolve(fn()); }); }); } return pending; }; } function format(str) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } return [].concat(args).reduce(function (p, c) { return p.replace(/%s/, c); }, str); } var INVALID_MODIFIER_ERROR = 'Popper: modifier "%s" provided an invalid %s property, expected %s but got %s'; var MISSING_DEPENDENCY_ERROR = 'Popper: modifier "%s" requires "%s", but "%s" modifier is not available'; var VALID_PROPERTIES = ['name', 'enabled', 'phase', 'fn', 'effect', 'requires', 'options']; function validateModifiers(modifiers) { modifiers.forEach(function (modifier) { [].concat(Object.keys(modifier), VALID_PROPERTIES) // IE11-compatible replacement for `new Set(iterable)` .filter(function (value, index, self) { return self.indexOf(value) === index; }).forEach(function (key) { switch (key) { case 'name': if (typeof modifier.name !== 'string') { console.error(format(INVALID_MODIFIER_ERROR, String(modifier.name), '"name"', '"string"', "\"" + String(modifier.name) + "\"")); } break; case 'enabled': if (typeof modifier.enabled !== 'boolean') { console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"enabled"', '"boolean"', "\"" + String(modifier.enabled) + "\"")); } break; case 'phase': if (modifierPhases.indexOf(modifier.phase) < 0) { console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"phase"', "either " + modifierPhases.join(', '), "\"" + String(modifier.phase) + "\"")); } break; case 'fn': if (typeof modifier.fn !== 'function') { console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"fn"', '"function"', "\"" + String(modifier.fn) + "\"")); } break; case 'effect': if (modifier.effect != null && typeof modifier.effect !== 'function') { console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"effect"', '"function"', "\"" + String(modifier.fn) + "\"")); } break; case 'requires': if (modifier.requires != null && !Array.isArray(modifier.requires)) { console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requires"', '"array"', "\"" + String(modifier.requires) + "\"")); } break; case 'requiresIfExists': if (!Array.isArray(modifier.requiresIfExists)) { console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requiresIfExists"', '"array"', "\"" + String(modifier.requiresIfExists) + "\"")); } break; case 'options': case 'data': break; default: console.error("PopperJS: an invalid property has been provided to the \"" + modifier.name + "\" modifier, valid properties are " + VALID_PROPERTIES.map(function (s) { return "\"" + s + "\""; }).join(', ') + "; but \"" + key + "\" was provided."); } modifier.requires && modifier.requires.forEach(function (requirement) { if (modifiers.find(function (mod) { return mod.name === requirement; }) == null) { console.error(format(MISSING_DEPENDENCY_ERROR, String(modifier.name), requirement, requirement)); } }); }); }); } function uniqueBy(arr, fn) { var identifiers = new Set(); return arr.filter(function (item) { var identifier = fn(item); if (!identifiers.has(identifier)) { identifiers.add(identifier); return true; } }); } function getBasePlacement(placement) { return placement.split('-')[0]; } function mergeByName(modifiers) { var merged = modifiers.reduce(function (merged, current) { var existing = merged[current.name]; merged[current.name] = existing ? Object.assign({}, existing, current, { options: Object.assign({}, existing.options, current.options), data: Object.assign({}, existing.data, current.data) }) : current; return merged; }, {}); // IE11 does not support Object.values return Object.keys(merged).map(function (key) { return merged[key]; }); } function getViewportRect(element) { var win = getWindow(element); var html = getDocumentElement(element); var visualViewport = win.visualViewport; var width = html.clientWidth; var height = html.clientHeight; var x = 0; var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper // can be obscured underneath it. // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even // if it isn't open, so if this isn't available, the popper will be detected // to overflow the bottom of the screen too early. if (visualViewport) { width = visualViewport.width; height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently) // In Chrome, it returns a value very close to 0 (+/-) but contains rounding // errors due to floating point numbers, so we need to check precision. // Safari returns a number <= 0, usually < -1 when pinch-zoomed // Feature detection fails in mobile emulation mode in Chrome. // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) < // 0.001 // Fallback here: "Not Safari" userAgent if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { x = visualViewport.offsetLeft; y = visualViewport.offsetTop; } } return { width: width, height: height, x: x + getWindowScrollBarX(element), y: y }; } // of the `` and `` rect bounds if horizontally scrollable function getDocumentRect(element) { var _element$ownerDocumen; var html = getDocumentElement(element); var winScroll = getWindowScroll(element); var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); var x = -winScroll.scrollLeft + getWindowScrollBarX(element); var y = -winScroll.scrollTop; if (getComputedStyle(body || html).direction === 'rtl') { x += max(html.clientWidth, body ? body.clientWidth : 0) - width; } return { width: width, height: height, x: x, y: y }; } function contains(parent, child) { var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method if (parent.contains(child)) { return true; } // then fallback to custom implementation with Shadow DOM support else if (rootNode && isShadowRoot(rootNode)) { var next = child; do { if (next && parent.isSameNode(next)) { return true; } // $FlowFixMe[prop-missing]: need a better way to handle this... next = next.parentNode || next.host; } while (next); } // Give up, the result is false return false; } function rectToClientRect(rect) { return Object.assign({}, rect, { left: rect.x, top: rect.y, right: rect.x + rect.width, bottom: rect.y + rect.height }); } function getInnerBoundingClientRect(element) { var rect = getBoundingClientRect(element); rect.top = rect.top + element.clientTop; rect.left = rect.left + element.clientLeft; rect.bottom = rect.top + element.clientHeight; rect.right = rect.left + element.clientWidth; rect.width = element.clientWidth; rect.height = element.clientHeight; rect.x = rect.left; rect.y = rect.top; return rect; } function getClientRectFromMixedType(element, clippingParent) { return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element))); } // A "clipping parent" is an overflowable container with the characteristic of // clipping (or hiding) overflowing elements with a position different from // `initial` function getClippingParents(element) { var clippingParents = listScrollParents(getParentNode(element)); var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0; var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; if (!isElement(clipperElement)) { return []; } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414 return clippingParents.filter(function (clippingParent) { return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body'; }); } // Gets the maximum area that the element is visible in due to any number of // clipping parents function getClippingRect(element, boundary, rootBoundary) { var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary); var clippingParents = [].concat(mainClippingParents, [rootBoundary]); var firstClippingParent = clippingParents[0]; var clippingRect = clippingParents.reduce(function (accRect, clippingParent) { var rect = getClientRectFromMixedType(element, clippingParent); accRect.top = max(rect.top, accRect.top); accRect.right = min(rect.right, accRect.right); accRect.bottom = min(rect.bottom, accRect.bottom); accRect.left = max(rect.left, accRect.left); return accRect; }, getClientRectFromMixedType(element, firstClippingParent)); clippingRect.width = clippingRect.right - clippingRect.left; clippingRect.height = clippingRect.bottom - clippingRect.top; clippingRect.x = clippingRect.left; clippingRect.y = clippingRect.top; return clippingRect; } function getVariation(placement) { return placement.split('-')[1]; } function getMainAxisFromPlacement(placement) { return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y'; } function computeOffsets(_ref) { var reference = _ref.reference, element = _ref.element, placement = _ref.placement; var basePlacement = placement ? getBasePlacement(placement) : null; var variation = placement ? getVariation(placement) : null; var commonX = reference.x + reference.width / 2 - element.width / 2; var commonY = reference.y + reference.height / 2 - element.height / 2; var offsets; switch (basePlacement) { case top: offsets = { x: commonX, y: reference.y - element.height }; break; case bottom: offsets = { x: commonX, y: reference.y + reference.height }; break; case right: offsets = { x: reference.x + reference.width, y: commonY }; break; case left: offsets = { x: reference.x - element.width, y: commonY }; break; default: offsets = { x: reference.x, y: reference.y }; } var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; if (mainAxis != null) { var len = mainAxis === 'y' ? 'height' : 'width'; switch (variation) { case start: offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2); break; case end: offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2); break; } } return offsets; } function getFreshSideObject() { return { top: 0, right: 0, bottom: 0, left: 0 }; } function mergePaddingObject(paddingObject) { return Object.assign({}, getFreshSideObject(), paddingObject); } function expandToHashMap(value, keys) { return keys.reduce(function (hashMap, key) { hashMap[key] = value; return hashMap; }, {}); } function detectOverflow(state, options) { if (options === void 0) { options = {}; } var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding; var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)); var altContext = elementContext === popper ? reference : popper; var popperRect = state.rects.popper; var element = state.elements[altBoundary ? altContext : elementContext]; var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary); var referenceClientRect = getBoundingClientRect(state.elements.reference); var popperOffsets = computeOffsets({ reference: referenceClientRect, element: popperRect, strategy: 'absolute', placement: placement }); var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets)); var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect // 0 or negative = within the clipping rect var overflowOffsets = { top: clippingClientRect.top - elementClientRect.top + paddingObject.top, bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, left: clippingClientRect.left - elementClientRect.left + paddingObject.left, right: elementClientRect.right - clippingClientRect.right + paddingObject.right }; var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element if (elementContext === popper && offsetData) { var offset = offsetData[placement]; Object.keys(overflowOffsets).forEach(function (key) { var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x'; overflowOffsets[key] += offset[axis] * multiply; }); } return overflowOffsets; } var INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.'; var INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.'; var DEFAULT_OPTIONS = { placement: 'bottom', modifiers: [], strategy: 'absolute' }; function areValidElements() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return !args.some(function (element) { return !(element && typeof element.getBoundingClientRect === 'function'); }); } function popperGenerator(generatorOptions) { if (generatorOptions === void 0) { generatorOptions = {}; } var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; return function createPopper(reference, popper, options) { if (options === void 0) { options = defaultOptions; } var state = { placement: 'bottom', orderedModifiers: [], options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), modifiersData: {}, elements: { reference: reference, popper: popper }, attributes: {}, styles: {} }; var effectCleanupFns = []; var isDestroyed = false; var instance = { state: state, setOptions: function setOptions(setOptionsAction) { var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction; cleanupModifierEffects(); state.options = Object.assign({}, defaultOptions, state.options, options); state.scrollParents = { reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [], popper: listScrollParents(popper) }; // Orders the modifiers based on their dependencies and `phase` // properties var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers state.orderedModifiers = orderedModifiers.filter(function (m) { return m.enabled; }); // Validate the provided modifiers so that the consumer will get warned // if one of the modifiers is invalid for any reason if (process.env.NODE_ENV !== "production") { var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) { var name = _ref.name; return name; }); validateModifiers(modifiers); if (getBasePlacement(state.options.placement) === auto) { var flipModifier = state.orderedModifiers.find(function (_ref2) { var name = _ref2.name; return name === 'flip'; }); if (!flipModifier) { console.error(['Popper: "auto" placements require the "flip" modifier be', 'present and enabled to work.'].join(' ')); } } var _getComputedStyle = getComputedStyle(popper), marginTop = _getComputedStyle.marginTop, marginRight = _getComputedStyle.marginRight, marginBottom = _getComputedStyle.marginBottom, marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can // cause bugs with positioning, so we'll warn the consumer if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) { return parseFloat(margin); })) { console.warn(['Popper: CSS "margin" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' ')); } } runModifierEffects(); return instance.update(); }, // Sync update – it will always be executed, even if not necessary. This // is useful for low frequency updates where sync behavior simplifies the // logic. // For high frequency updates (e.g. `resize` and `scroll` events), always // prefer the async Popper#update method forceUpdate: function forceUpdate() { if (isDestroyed) { return; } var _state$elements = state.elements, reference = _state$elements.reference, popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements // anymore if (!areValidElements(reference, popper)) { if (process.env.NODE_ENV !== "production") { console.error(INVALID_ELEMENT_ERROR); } return; } // Store the reference and popper rects to be read by modifiers state.rects = { reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'), popper: getLayoutRect(popper) }; // Modifiers have the ability to reset the current update cycle. The // most common use case for this is the `flip` modifier changing the // placement, which then needs to re-run all the modifiers, because the // logic was previously ran for the previous placement and is therefore // stale/incorrect state.reset = false; state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier // is filled with the initial data specified by the modifier. This means // it doesn't persist and is fresh on each update. // To ensure persistent data, use `${name}#persistent` state.orderedModifiers.forEach(function (modifier) { return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); }); var __debug_loops__ = 0; for (var index = 0; index < state.orderedModifiers.length; index++) { if (process.env.NODE_ENV !== "production") { __debug_loops__ += 1; if (__debug_loops__ > 100) { console.error(INFINITE_LOOP_ERROR); break; } } if (state.reset === true) { state.reset = false; index = -1; continue; } var _state$orderedModifie = state.orderedModifiers[index], fn = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name; if (typeof fn === 'function') { state = fn({ state: state, options: _options, name: name, instance: instance }) || state; } } }, // Async and optimistically optimized update – it will not be executed if // not necessary (debounced to run at most once-per-tick) update: debounce(function () { return new Promise(function (resolve) { instance.forceUpdate(); resolve(state); }); }), destroy: function destroy() { cleanupModifierEffects(); isDestroyed = true; } }; if (!areValidElements(reference, popper)) { if (process.env.NODE_ENV !== "production") { console.error(INVALID_ELEMENT_ERROR); } return instance; } instance.setOptions(options).then(function (state) { if (!isDestroyed && options.onFirstUpdate) { options.onFirstUpdate(state); } }); // Modifiers have the ability to execute arbitrary code before the first // update cycle runs. They will be executed in the same order as the update // cycle. This is useful when a modifier adds some persistent data that // other modifiers need to use, but the modifier is run after the dependent // one. function runModifierEffects() { state.orderedModifiers.forEach(function (_ref3) { var name = _ref3.name, _ref3$options = _ref3.options, options = _ref3$options === void 0 ? {} : _ref3$options, effect = _ref3.effect; if (typeof effect === 'function') { var cleanupFn = effect({ state: state, name: name, instance: instance, options: options }); var noopFn = function noopFn() {}; effectCleanupFns.push(cleanupFn || noopFn); } }); } function cleanupModifierEffects() { effectCleanupFns.forEach(function (fn) { return fn(); }); effectCleanupFns = []; } return instance; }; } var passive = { passive: true }; function effect$2(_ref) { var state = _ref.state, instance = _ref.instance, options = _ref.options; var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize; var window = getWindow(state.elements.popper); var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); if (scroll) { scrollParents.forEach(function (scrollParent) { scrollParent.addEventListener('scroll', instance.update, passive); }); } if (resize) { window.addEventListener('resize', instance.update, passive); } return function () { if (scroll) { scrollParents.forEach(function (scrollParent) { scrollParent.removeEventListener('scroll', instance.update, passive); }); } if (resize) { window.removeEventListener('resize', instance.update, passive); } }; } // eslint-disable-next-line import/no-unused-modules var eventListeners = { name: 'eventListeners', enabled: true, phase: 'write', fn: function fn() {}, effect: effect$2, data: {} }; function popperOffsets(_ref) { var state = _ref.state, name = _ref.name; // Offsets are the actual position the popper needs to have to be // properly positioned near its reference element // This is the most basic placement, and will be adjusted by // the modifiers in the next step state.modifiersData[name] = computeOffsets({ reference: state.rects.reference, element: state.rects.popper, strategy: 'absolute', placement: state.placement }); } // eslint-disable-next-line import/no-unused-modules var popperOffsets$1 = { name: 'popperOffsets', enabled: true, phase: 'read', fn: popperOffsets, data: {} }; var unsetSides = { top: 'auto', right: 'auto', bottom: 'auto', left: 'auto' }; // Round the offsets to the nearest suitable subpixel based on the DPR. // Zooming can change the DPR, but it seems to report a value that will // cleanly divide the values into the appropriate subpixels. function roundOffsetsByDPR(_ref) { var x = _ref.x, y = _ref.y; var win = window; var dpr = win.devicePixelRatio || 1; return { x: round(x * dpr) / dpr || 0, y: round(y * dpr) / dpr || 0 }; } function mapToStyles(_ref2) { var _Object$assign2; var popper = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed = _ref2.isFixed; var _offsets$x = offsets.x, x = _offsets$x === void 0 ? 0 : _offsets$x, _offsets$y = offsets.y, y = _offsets$y === void 0 ? 0 : _offsets$y; var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({ x: x, y: y }) : { x: x, y: y }; x = _ref3.x; y = _ref3.y; var hasX = offsets.hasOwnProperty('x'); var hasY = offsets.hasOwnProperty('y'); var sideX = left; var sideY = top; var win = window; if (adaptive) { var offsetParent = getOffsetParent(popper); var heightProp = 'clientHeight'; var widthProp = 'clientWidth'; if (offsetParent === getWindow(popper)) { offsetParent = getDocumentElement(popper); if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') { heightProp = 'scrollHeight'; widthProp = 'scrollWidth'; } } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it offsetParent = offsetParent; if (placement === top || (placement === left || placement === right) && variation === end) { sideY = bottom; var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing] offsetParent[heightProp]; y -= offsetY - popperRect.height; y *= gpuAcceleration ? 1 : -1; } if (placement === left || (placement === top || placement === bottom) && variation === end) { sideX = right; var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing] offsetParent[widthProp]; x -= offsetX - popperRect.width; x *= gpuAcceleration ? 1 : -1; } } var commonStyles = Object.assign({ position: position }, adaptive && unsetSides); var _ref4 = roundOffsets === true ? roundOffsetsByDPR({ x: x, y: y }) : { x: x, y: y }; x = _ref4.x; y = _ref4.y; if (gpuAcceleration) { var _Object$assign; return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign)); } return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2)); } function computeStyles(_ref5) { var state = _ref5.state, options = _ref5.options; var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; if (process.env.NODE_ENV !== "production") { var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || ''; if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) { return transitionProperty.indexOf(property) >= 0; })) { console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: "transform", "top", "right", "bottom", "left".', '\n\n', 'Disable the "computeStyles" modifier\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\n\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' ')); } } var commonStyles = { placement: getBasePlacement(state.placement), variation: getVariation(state.placement), popper: state.elements.popper, popperRect: state.rects.popper, gpuAcceleration: gpuAcceleration, isFixed: state.options.strategy === 'fixed' }; if (state.modifiersData.popperOffsets != null) { state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { offsets: state.modifiersData.popperOffsets, position: state.options.strategy, adaptive: adaptive, roundOffsets: roundOffsets }))); } if (state.modifiersData.arrow != null) { state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { offsets: state.modifiersData.arrow, position: 'absolute', adaptive: false, roundOffsets: roundOffsets }))); } state.attributes.popper = Object.assign({}, state.attributes.popper, { 'data-popper-placement': state.placement }); } // eslint-disable-next-line import/no-unused-modules var computeStyles$1 = { name: 'computeStyles', enabled: true, phase: 'beforeWrite', fn: computeStyles, data: {} }; // and applies them to the HTMLElements such as popper and arrow function applyStyles(_ref) { var state = _ref.state; Object.keys(state.elements).forEach(function (name) { var style = state.styles[name] || {}; var attributes = state.attributes[name] || {}; var element = state.elements[name]; // arrow is optional + virtual elements if (!isHTMLElement(element) || !getNodeName(element)) { return; } // Flow doesn't support to extend this property, but it's the most // effective way to apply styles to an HTMLElement // $FlowFixMe[cannot-write] Object.assign(element.style, style); Object.keys(attributes).forEach(function (name) { var value = attributes[name]; if (value === false) { element.removeAttribute(name); } else { element.setAttribute(name, value === true ? '' : value); } }); }); } function effect$1(_ref2) { var state = _ref2.state; var initialStyles = { popper: { position: state.options.strategy, left: '0', top: '0', margin: '0' }, arrow: { position: 'absolute' }, reference: {} }; Object.assign(state.elements.popper.style, initialStyles.popper); state.styles = initialStyles; if (state.elements.arrow) { Object.assign(state.elements.arrow.style, initialStyles.arrow); } return function () { Object.keys(state.elements).forEach(function (name) { var element = state.elements[name]; var attributes = state.attributes[name] || {}; var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them var style = styleProperties.reduce(function (style, property) { style[property] = ''; return style; }, {}); // arrow is optional + virtual elements if (!isHTMLElement(element) || !getNodeName(element)) { return; } Object.assign(element.style, style); Object.keys(attributes).forEach(function (attribute) { element.removeAttribute(attribute); }); }); }; } // eslint-disable-next-line import/no-unused-modules var applyStyles$1 = { name: 'applyStyles', enabled: true, phase: 'write', fn: applyStyles, effect: effect$1, requires: ['computeStyles'] }; function distanceAndSkiddingToXY(placement, rects, offset) { var basePlacement = getBasePlacement(placement); var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1; var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, { placement: placement })) : offset, skidding = _ref[0], distance = _ref[1]; skidding = skidding || 0; distance = (distance || 0) * invertDistance; return [left, right].indexOf(basePlacement) >= 0 ? { x: distance, y: skidding } : { x: skidding, y: distance }; } function offset(_ref2) { var state = _ref2.state, options = _ref2.options, name = _ref2.name; var _options$offset = options.offset, offset = _options$offset === void 0 ? [0, 0] : _options$offset; var data = placements.reduce(function (acc, placement) { acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset); return acc; }, {}); var _data$state$placement = data[state.placement], x = _data$state$placement.x, y = _data$state$placement.y; if (state.modifiersData.popperOffsets != null) { state.modifiersData.popperOffsets.x += x; state.modifiersData.popperOffsets.y += y; } state.modifiersData[name] = data; } // eslint-disable-next-line import/no-unused-modules var offset$1 = { name: 'offset', enabled: true, phase: 'main', requires: ['popperOffsets'], fn: offset }; var hash$1 = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' }; function getOppositePlacement(placement) { return placement.replace(/left|right|bottom|top/g, function (matched) { return hash$1[matched]; }); } var hash = { start: 'end', end: 'start' }; function getOppositeVariationPlacement(placement) { return placement.replace(/start|end/g, function (matched) { return hash[matched]; }); } function computeAutoPlacement(state, options) { if (options === void 0) { options = {}; } var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP; var variation = getVariation(placement); var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) { return getVariation(placement) === variation; }) : basePlacements; var allowedPlacements = placements$1.filter(function (placement) { return allowedAutoPlacements.indexOf(placement) >= 0; }); if (allowedPlacements.length === 0) { allowedPlacements = placements$1; if (process.env.NODE_ENV !== "production") { console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, "auto" cannot be used to allow "bottom-start".', 'Use "auto-start" instead.'].join(' ')); } } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions... var overflows = allowedPlacements.reduce(function (acc, placement) { acc[placement] = detectOverflow(state, { placement: placement, boundary: boundary, rootBoundary: rootBoundary, padding: padding })[getBasePlacement(placement)]; return acc; }, {}); return Object.keys(overflows).sort(function (a, b) { return overflows[a] - overflows[b]; }); } function getExpandedFallbackPlacements(placement) { if (getBasePlacement(placement) === auto) { return []; } var oppositePlacement = getOppositePlacement(placement); return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; } function flip(_ref) { var state = _ref.state, options = _ref.options, name = _ref.name; if (state.modifiersData[name]._skip) { return; } var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements; var preferredPlacement = state.options.placement; var basePlacement = getBasePlacement(preferredPlacement); var isBasePlacement = basePlacement === preferredPlacement; var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) { return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, { placement: placement, boundary: boundary, rootBoundary: rootBoundary, padding: padding, flipVariations: flipVariations, allowedAutoPlacements: allowedAutoPlacements }) : placement); }, []); var referenceRect = state.rects.reference; var popperRect = state.rects.popper; var checksMap = new Map(); var makeFallbackChecks = true; var firstFittingPlacement = placements[0]; for (var i = 0; i < placements.length; i++) { var placement = placements[i]; var _basePlacement = getBasePlacement(placement); var isStartVariation = getVariation(placement) === start; var isVertical = [top, bottom].indexOf(_basePlacement) >= 0; var len = isVertical ? 'width' : 'height'; var overflow = detectOverflow(state, { placement: placement, boundary: boundary, rootBoundary: rootBoundary, altBoundary: altBoundary, padding: padding }); var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top; if (referenceRect[len] > popperRect[len]) { mainVariationSide = getOppositePlacement(mainVariationSide); } var altVariationSide = getOppositePlacement(mainVariationSide); var checks = []; if (checkMainAxis) { checks.push(overflow[_basePlacement] <= 0); } if (checkAltAxis) { checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); } if (checks.every(function (check) { return check; })) { firstFittingPlacement = placement; makeFallbackChecks = false; break; } checksMap.set(placement, checks); } if (makeFallbackChecks) { // `2` may be desired in some cases – research later var numberOfChecks = flipVariations ? 3 : 1; var _loop = function _loop(_i) { var fittingPlacement = placements.find(function (placement) { var checks = checksMap.get(placement); if (checks) { return checks.slice(0, _i).every(function (check) { return check; }); } }); if (fittingPlacement) { firstFittingPlacement = fittingPlacement; return "break"; } }; for (var _i = numberOfChecks; _i > 0; _i--) { var _ret = _loop(_i); if (_ret === "break") break; } } if (state.placement !== firstFittingPlacement) { state.modifiersData[name]._skip = true; state.placement = firstFittingPlacement; state.reset = true; } } // eslint-disable-next-line import/no-unused-modules var flip$1 = { name: 'flip', enabled: true, phase: 'main', fn: flip, requiresIfExists: ['offset'], data: { _skip: false } }; function getAltAxis(axis) { return axis === 'x' ? 'y' : 'x'; } function within(min$1, value, max$1) { return max(min$1, min(value, max$1)); } function withinMaxClamp(min, value, max) { var v = within(min, value, max); return v > max ? max : v; } function preventOverflow(_ref) { var state = _ref.state, options = _ref.options, name = _ref.name; var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; var overflow = detectOverflow(state, { boundary: boundary, rootBoundary: rootBoundary, padding: padding, altBoundary: altBoundary }); var basePlacement = getBasePlacement(state.placement); var variation = getVariation(state.placement); var isBasePlacement = !variation; var mainAxis = getMainAxisFromPlacement(basePlacement); var altAxis = getAltAxis(mainAxis); var popperOffsets = state.modifiersData.popperOffsets; var referenceRect = state.rects.reference; var popperRect = state.rects.popper; var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, { placement: state.placement })) : tetherOffset; var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? { mainAxis: tetherOffsetValue, altAxis: tetherOffsetValue } : Object.assign({ mainAxis: 0, altAxis: 0 }, tetherOffsetValue); var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null; var data = { x: 0, y: 0 }; if (!popperOffsets) { return; } if (checkMainAxis) { var _offsetModifierState$; var mainSide = mainAxis === 'y' ? top : left; var altSide = mainAxis === 'y' ? bottom : right; var len = mainAxis === 'y' ? 'height' : 'width'; var offset = popperOffsets[mainAxis]; var min$1 = offset + overflow[mainSide]; var max$1 = offset - overflow[altSide]; var additive = tether ? -popperRect[len] / 2 : 0; var minLen = variation === start ? referenceRect[len] : popperRect[len]; var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go // outside the reference bounds var arrowElement = state.elements.arrow; var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { width: 0, height: 0 }; var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject(); var arrowPaddingMin = arrowPaddingObject[mainSide]; var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want // to include its full size in the calculation. If the reference is small // and near the edge of a boundary, the popper can overflow even if the // reference is not overflowing as well (e.g. virtual elements with no // width or height) var arrowLen = within(0, referenceRect[len], arrowRect[len]); var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis; var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis; var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0; var tetherMin = offset + minOffset - offsetModifierValue - clientOffset; var tetherMax = offset + maxOffset - offsetModifierValue; var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset, tether ? max(max$1, tetherMax) : max$1); popperOffsets[mainAxis] = preventedOffset; data[mainAxis] = preventedOffset - offset; } if (checkAltAxis) { var _offsetModifierState$2; var _mainSide = mainAxis === 'x' ? top : left; var _altSide = mainAxis === 'x' ? bottom : right; var _offset = popperOffsets[altAxis]; var _len = altAxis === 'y' ? 'height' : 'width'; var _min = _offset + overflow[_mainSide]; var _max = _offset - overflow[_altSide]; var isOriginSide = [top, left].indexOf(basePlacement) !== -1; var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0; var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis; var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max; var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max); popperOffsets[altAxis] = _preventedOffset; data[altAxis] = _preventedOffset - _offset; } state.modifiersData[name] = data; } // eslint-disable-next-line import/no-unused-modules var preventOverflow$1 = { name: 'preventOverflow', enabled: true, phase: 'main', fn: preventOverflow, requiresIfExists: ['offset'] }; var toPaddingObject = function toPaddingObject(padding, state) { padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, { placement: state.placement })) : padding; return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)); }; function arrow(_ref) { var _state$modifiersData$; var state = _ref.state, name = _ref.name, options = _ref.options; var arrowElement = state.elements.arrow; var popperOffsets = state.modifiersData.popperOffsets; var basePlacement = getBasePlacement(state.placement); var axis = getMainAxisFromPlacement(basePlacement); var isVertical = [left, right].indexOf(basePlacement) >= 0; var len = isVertical ? 'height' : 'width'; if (!arrowElement || !popperOffsets) { return; } var paddingObject = toPaddingObject(options.padding, state); var arrowRect = getLayoutRect(arrowElement); var minProp = axis === 'y' ? top : left; var maxProp = axis === 'y' ? bottom : right; var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len]; var startDiff = popperOffsets[axis] - state.rects.reference[axis]; var arrowOffsetParent = getOffsetParent(arrowElement); var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is // outside of the popper bounds var min = paddingObject[minProp]; var max = clientSize - arrowRect[len] - paddingObject[maxProp]; var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; var offset = within(min, center, max); // Prevents breaking syntax highlighting... var axisProp = axis; state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$); } function effect(_ref2) { var state = _ref2.state, options = _ref2.options; var _options$element = options.element, arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element; if (arrowElement == null) { return; } // CSS selector if (typeof arrowElement === 'string') { arrowElement = state.elements.popper.querySelector(arrowElement); if (!arrowElement) { return; } } if (process.env.NODE_ENV !== "production") { if (!isHTMLElement(arrowElement)) { console.error(['Popper: "arrow" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' ')); } } if (!contains(state.elements.popper, arrowElement)) { if (process.env.NODE_ENV !== "production") { console.error(['Popper: "arrow" modifier\'s `element` must be a child of the popper', 'element.'].join(' ')); } return; } state.elements.arrow = arrowElement; } // eslint-disable-next-line import/no-unused-modules var arrow$1 = { name: 'arrow', enabled: true, phase: 'main', fn: arrow, effect: effect, requires: ['popperOffsets'], requiresIfExists: ['preventOverflow'] }; function getSideOffsets(overflow, rect, preventedOffsets) { if (preventedOffsets === void 0) { preventedOffsets = { x: 0, y: 0 }; } return { top: overflow.top - rect.height - preventedOffsets.y, right: overflow.right - rect.width + preventedOffsets.x, bottom: overflow.bottom - rect.height + preventedOffsets.y, left: overflow.left - rect.width - preventedOffsets.x }; } function isAnySideFullyClipped(overflow) { return [top, right, bottom, left].some(function (side) { return overflow[side] >= 0; }); } function hide(_ref) { var state = _ref.state, name = _ref.name; var referenceRect = state.rects.reference; var popperRect = state.rects.popper; var preventedOffsets = state.modifiersData.preventOverflow; var referenceOverflow = detectOverflow(state, { elementContext: 'reference' }); var popperAltOverflow = detectOverflow(state, { altBoundary: true }); var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); state.modifiersData[name] = { referenceClippingOffsets: referenceClippingOffsets, popperEscapeOffsets: popperEscapeOffsets, isReferenceHidden: isReferenceHidden, hasPopperEscaped: hasPopperEscaped }; state.attributes.popper = Object.assign({}, state.attributes.popper, { 'data-popper-reference-hidden': isReferenceHidden, 'data-popper-escaped': hasPopperEscaped }); } // eslint-disable-next-line import/no-unused-modules var hide$1 = { name: 'hide', enabled: true, phase: 'main', requiresIfExists: ['preventOverflow'], fn: hide }; var defaultModifiers$1 = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1]; var createPopper$1 = /*#__PURE__*/popperGenerator({ defaultModifiers: defaultModifiers$1 }); // eslint-disable-next-line import/no-unused-modules var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1]; var createPopper = /*#__PURE__*/popperGenerator({ defaultModifiers: defaultModifiers }); // eslint-disable-next-line import/no-unused-modules exports.applyStyles = applyStyles$1; exports.arrow = arrow$1; exports.computeStyles = computeStyles$1; exports.createPopper = createPopper; exports.createPopperLite = createPopper$1; exports.defaultModifiers = defaultModifiers; exports.detectOverflow = detectOverflow; exports.eventListeners = eventListeners; exports.flip = flip$1; exports.hide = hide$1; exports.offset = offset$1; exports.popperGenerator = popperGenerator; exports.popperOffsets = popperOffsets$1; exports.preventOverflow = preventOverflow$1; //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QU5qQixDQUFvQjNHLElBQXBCMkcsSUFBNEI7SUFDMUJ5TCx3QkFBd0IsRUFBeEJBLHdCQUQwQjtJQUUxQkMsbUJBQW1CLEVBQW5CQSxtQkFGMEI7SUFHMUJDLGlCQUFpQixFQUFqQkEsaUJBSDBCO0lBSTFCQyxnQkFBZ0IsRUFBaEJBO0VBSjBCLENBQTVCNUw7RUFPQUEsS0FBSyxDQUFDK0IsVUFBTi9CLENBQWlCdEksTUFBakJzSSxxQkFDS0EsS0FBSyxDQUFDK0IsVUFBTi9CLENBQWlCdEksTUFEdEI7SUFFRSxnQ0FBZ0NpVSxpQkFGbEM7SUFHRSx1QkFBdUJDO0VBSHpCO0FBS0QsQyxDQUFBOzs7QUFJRCxhQUFnQjtFQUNkdlMsSUFBSSxFQUFFLE1BRFE7RUFFZHdDLE9BQU8sRUFBRSxJQUZLO0VBR2Q1QixLQUFLLEVBQUUsTUFITztFQUlkUixnQkFBZ0IsRUFBRSxDQUFDLGlCQUFELENBSko7RUFLZFUsRUFBRSxFQUFFbVI7QUFMVSxDQUFoQjtBQzNEQSxJQUFNMUosa0JBQWdCLEdBQUcsQ0FDdkJpSyxjQUR1QixFQUV2QmxMLGVBRnVCLEVBR3ZCc0UsZUFIdUIsRUFJdkJJLGFBSnVCLENBQXpCO0lBT012RCxjQUFZLGdCQUFHSixlQUFlLENBQUM7RUFBRUUsZ0JBQWdCLEVBQWhCQTtBQUFGLENBQUQsRSxDQUFBOztJQ0Y5QkEsZ0JBQWdCLEdBQUcsQ0FDdkJpSyxjQUR1QixFQUV2QmxMLGVBRnVCLEVBR3ZCc0UsZUFIdUIsRUFJdkJJLGFBSnVCLEVBS3ZCbkUsUUFMdUIsRUFNdkI2RixNQU51QixFQU92QjhCLGlCQVB1QixFQVF2QnpELE9BUnVCLEVBU3ZCa0csTUFUdUI7SUFZbkJ4SixZQUFZLGdCQUFHSixlQUFlLENBQUM7RUFBRUUsZ0JBQWdCLEVBQWhCQTtBQUFGLENBQUQsRSxDQUFBIiwibmFtZXMiOlsiZ2V0V2luZG93Iiwibm9kZSIsIndpbmRvdyIsInRvU3RyaW5nIiwib3duZXJEb2N1bWVudCIsImRlZmF1bHRWaWV3IiwiaXNFbGVtZW50IiwiT3duRWxlbWVudCIsIkVsZW1lbnQiLCJpc0hUTUxFbGVtZW50IiwiSFRNTEVsZW1lbnQiLCJpc1NoYWRvd1Jvb3QiLCJTaGFkb3dSb290IiwibWF4IiwiTWF0aCIsIm1pbiIsInJvdW5kIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiZWxlbWVudCIsImluY2x1ZGVTY2FsZSIsInJlY3QiLCJzY2FsZVgiLCJzY2FsZVkiLCJvZmZzZXRIZWlnaHQiLCJvZmZzZXRXaWR0aCIsIndpZHRoIiwiaGVpZ2h0IiwidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0IiwieCIsInkiLCJnZXRXaW5kb3dTY3JvbGwiLCJ3aW4iLCJzY3JvbGxMZWZ0IiwicGFnZVhPZmZzZXQiLCJzY3JvbGxUb3AiLCJwYWdlWU9mZnNldCIsImdldEhUTUxFbGVtZW50U2Nyb2xsIiwiZ2V0Tm9kZVNjcm9sbCIsImdldE5vZGVOYW1lIiwibm9kZU5hbWUiLCJ0b0xvd2VyQ2FzZSIsImdldERvY3VtZW50RWxlbWVudCIsImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50IiwiZ2V0V2luZG93U2Nyb2xsQmFyWCIsImdldENvbXB1dGVkU3R5bGUiLCJpc1Njcm9sbFBhcmVudCIsIm92ZXJmbG93Iiwib3ZlcmZsb3dYIiwib3ZlcmZsb3dZIiwidGVzdCIsImlzRWxlbWVudFNjYWxlZCIsImdldENvbXBvc2l0ZVJlY3QiLCJlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCIsIm9mZnNldFBhcmVudCIsImlzRml4ZWQiLCJpc09mZnNldFBhcmVudEFuRWxlbWVudCIsIm9mZnNldFBhcmVudElzU2NhbGVkIiwic2Nyb2xsIiwib2Zmc2V0cyIsImNsaWVudExlZnQiLCJjbGllbnRUb3AiLCJnZXRMYXlvdXRSZWN0IiwiY2xpZW50UmVjdCIsImFicyIsIm9mZnNldExlZnQiLCJvZmZzZXRUb3AiLCJnZXRQYXJlbnROb2RlIiwiYXNzaWduZWRTbG90IiwicGFyZW50Tm9kZSIsImhvc3QiLCJnZXRTY3JvbGxQYXJlbnQiLCJpbmRleE9mIiwiYm9keSIsImxpc3RTY3JvbGxQYXJlbnRzIiwibGlzdCIsInNjcm9sbFBhcmVudCIsImlzQm9keSIsIl9lbGVtZW50JG93bmVyRG9jdW1lbiIsInRhcmdldCIsImNvbmNhdCIsInZpc3VhbFZpZXdwb3J0IiwidXBkYXRlZExpc3QiLCJpc1RhYmxlRWxlbWVudCIsImdldFRydWVPZmZzZXRQYXJlbnQiLCJwb3NpdGlvbiIsImdldENvbnRhaW5pbmdCbG9jayIsImlzRmlyZWZveCIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsImlzSUUiLCJlbGVtZW50Q3NzIiwiY3VycmVudE5vZGUiLCJjc3MiLCJ0cmFuc2Zvcm0iLCJwZXJzcGVjdGl2ZSIsImNvbnRhaW4iLCJ3aWxsQ2hhbmdlIiwiZmlsdGVyIiwiZ2V0T2Zmc2V0UGFyZW50IiwiYXV0byIsImJhc2VQbGFjZW1lbnRzIiwic3RhcnQiLCJlbmQiLCJjbGlwcGluZ1BhcmVudHMiLCJ2aWV3cG9ydCIsInBvcHBlciIsInJlZmVyZW5jZSIsInZhcmlhdGlvblBsYWNlbWVudHMiLCJyZWR1Y2UiLCJhY2MiLCJwbGFjZW1lbnQiLCJwbGFjZW1lbnRzIiwiYmVmb3JlUmVhZCIsInJlYWQiLCJhZnRlclJlYWQiLCJiZWZvcmVNYWluIiwibWFpbiIsImFmdGVyTWFpbiIsImJlZm9yZVdyaXRlIiwid3JpdGUiLCJhZnRlcldyaXRlIiwibW9kaWZpZXJQaGFzZXMiLCJvcmRlciIsIm1vZGlmaWVycyIsIm1hcCIsIk1hcCIsInZpc2l0ZWQiLCJTZXQiLCJyZXN1bHQiLCJmb3JFYWNoIiwic2V0IiwibW9kaWZpZXIiLCJuYW1lIiwic29ydCIsImFkZCIsInJlcXVpcmVzIiwicmVxdWlyZXNJZkV4aXN0cyIsImhhcyIsImRlcCIsImRlcE1vZGlmaWVyIiwiZ2V0IiwicHVzaCIsIm9yZGVyTW9kaWZpZXJzIiwib3JkZXJlZE1vZGlmaWVycyIsInBoYXNlIiwiZGVib3VuY2UiLCJmbiIsInBlbmRpbmciLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJ1bmRlZmluZWQiLCJmb3JtYXQiLCJzdHIiLCJhcmdzIiwiYXJndW1lbnRzIiwicCIsImMiLCJyZXBsYWNlIiwiSU5WQUxJRF9NT0RJRklFUl9FUlJPUiIsIk1JU1NJTkdfREVQRU5ERU5DWV9FUlJPUiIsIlZBTElEX1BST1BFUlRJRVMiLCJ2YWxpZGF0ZU1vZGlmaWVycyIsIk9iamVjdCIsImtleXMiLCJ2YWx1ZSIsImluZGV4Iiwic2VsZiIsImtleSIsImNvbnNvbGUiLCJlcnJvciIsIlN0cmluZyIsImVuYWJsZWQiLCJqb2luIiwiZWZmZWN0IiwiQXJyYXkiLCJpc0FycmF5IiwicyIsInJlcXVpcmVtZW50IiwiZmluZCIsIm1vZCIsInVuaXF1ZUJ5IiwiYXJyIiwiaWRlbnRpZmllcnMiLCJpZGVudGlmaWVyIiwiaXRlbSIsImdldEJhc2VQbGFjZW1lbnQiLCJzcGxpdCIsIm1lcmdlQnlOYW1lIiwibWVyZ2VkIiwiY3VycmVudCIsImV4aXN0aW5nIiwib3B0aW9ucyIsImRhdGEiLCJnZXRWaWV3cG9ydFJlY3QiLCJodG1sIiwiY2xpZW50V2lkdGgiLCJjbGllbnRIZWlnaHQiLCJnZXREb2N1bWVudFJlY3QiLCJ3aW5TY3JvbGwiLCJzY3JvbGxXaWR0aCIsInNjcm9sbEhlaWdodCIsImRpcmVjdGlvbiIsImNvbnRhaW5zIiwicGFyZW50IiwiY2hpbGQiLCJyb290Tm9kZSIsImdldFJvb3ROb2RlIiwibmV4dCIsImlzU2FtZU5vZGUiLCJyZWN0VG9DbGllbnRSZWN0IiwiZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QiLCJnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZSIsImNsaXBwaW5nUGFyZW50IiwiZ2V0Q2xpcHBpbmdQYXJlbnRzIiwiY2FuRXNjYXBlQ2xpcHBpbmciLCJjbGlwcGVyRWxlbWVudCIsImdldENsaXBwaW5nUmVjdCIsImJvdW5kYXJ5Iiwicm9vdEJvdW5kYXJ5IiwibWFpbkNsaXBwaW5nUGFyZW50cyIsImZpcnN0Q2xpcHBpbmdQYXJlbnQiLCJjbGlwcGluZ1JlY3QiLCJhY2NSZWN0IiwiZ2V0VmFyaWF0aW9uIiwiZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IiwiY29tcHV0ZU9mZnNldHMiLCJiYXNlUGxhY2VtZW50IiwidmFyaWF0aW9uIiwiY29tbW9uWCIsImNvbW1vblkiLCJtYWluQXhpcyIsImxlbiIsImdldEZyZXNoU2lkZU9iamVjdCIsIm1lcmdlUGFkZGluZ09iamVjdCIsInBhZGRpbmdPYmplY3QiLCJleHBhbmRUb0hhc2hNYXAiLCJoYXNoTWFwIiwiZGV0ZWN0T3ZlcmZsb3ciLCJzdGF0ZSIsImVsZW1lbnRDb250ZXh0IiwiYWx0Qm91bmRhcnkiLCJwYWRkaW5nIiwiYWx0Q29udGV4dCIsInBvcHBlclJlY3QiLCJyZWN0cyIsImVsZW1lbnRzIiwiY2xpcHBpbmdDbGllbnRSZWN0IiwiY29udGV4dEVsZW1lbnQiLCJyZWZlcmVuY2VDbGllbnRSZWN0IiwicG9wcGVyT2Zmc2V0cyIsInN0cmF0ZWd5IiwicG9wcGVyQ2xpZW50UmVjdCIsImVsZW1lbnRDbGllbnRSZWN0Iiwib3ZlcmZsb3dPZmZzZXRzIiwib2Zmc2V0RGF0YSIsIm1vZGlmaWVyc0RhdGEiLCJvZmZzZXQiLCJtdWx0aXBseSIsImF4aXMiLCJJTlZBTElEX0VMRU1FTlRfRVJST1IiLCJJTkZJTklURV9MT09QX0VSUk9SIiwiREVGQVVMVF9PUFRJT05TIiwiYXJlVmFsaWRFbGVtZW50cyIsInNvbWUiLCJwb3BwZXJHZW5lcmF0b3IiLCJnZW5lcmF0b3JPcHRpb25zIiwiZGVmYXVsdE1vZGlmaWVycyIsImRlZmF1bHRPcHRpb25zIiwiY3JlYXRlUG9wcGVyIiwiYXR0cmlidXRlcyIsInN0eWxlcyIsImVmZmVjdENsZWFudXBGbnMiLCJpc0Rlc3Ryb3llZCIsImluc3RhbmNlIiwic2V0T3B0aW9ucyIsInNldE9wdGlvbnNBY3Rpb24iLCJjbGVhbnVwTW9kaWZpZXJFZmZlY3RzIiwic2Nyb2xsUGFyZW50cyIsIm0iLCJmbGlwTW9kaWZpZXIiLCJtYXJnaW5Ub3AiLCJtYXJnaW5SaWdodCIsIm1hcmdpbkJvdHRvbSIsIm1hcmdpbkxlZnQiLCJtYXJnaW4iLCJwYXJzZUZsb2F0Iiwid2FybiIsInJ1bk1vZGlmaWVyRWZmZWN0cyIsInVwZGF0ZSIsImZvcmNlVXBkYXRlIiwicmVzZXQiLCJfX2RlYnVnX2xvb3BzX18iLCJsZW5ndGgiLCJkZXN0cm95Iiwib25GaXJzdFVwZGF0ZSIsImNsZWFudXBGbiIsIm5vb3BGbiIsInBhc3NpdmUiLCJyZXNpemUiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInVuc2V0U2lkZXMiLCJyb3VuZE9mZnNldHNCeURQUiIsImRwciIsImRldmljZVBpeGVsUmF0aW8iLCJtYXBUb1N0eWxlcyIsImdwdUFjY2VsZXJhdGlvbiIsImFkYXB0aXZlIiwicm91bmRPZmZzZXRzIiwiaGFzWCIsImhhc093blByb3BlcnR5IiwiaGFzWSIsInNpZGVYIiwic2lkZVkiLCJoZWlnaHRQcm9wIiwid2lkdGhQcm9wIiwib2Zmc2V0WSIsIm9mZnNldFgiLCJjb21tb25TdHlsZXMiLCJjb21wdXRlU3R5bGVzIiwidHJhbnNpdGlvblByb3BlcnR5IiwicHJvcGVydHkiLCJhcnJvdyIsImFwcGx5U3R5bGVzIiwic3R5bGUiLCJhc3NpZ24iLCJyZW1vdmVBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJpbml0aWFsU3R5bGVzIiwic3R5bGVQcm9wZXJ0aWVzIiwiYXR0cmlidXRlIiwiZGlzdGFuY2VBbmRTa2lkZGluZ1RvWFkiLCJpbnZlcnREaXN0YW5jZSIsInNraWRkaW5nIiwiZGlzdGFuY2UiLCJoYXNoIiwiZ2V0T3Bwb3NpdGVQbGFjZW1lbnQiLCJtYXRjaGVkIiwiZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQiLCJjb21wdXRlQXV0b1BsYWNlbWVudCIsImZsaXBWYXJpYXRpb25zIiwiYWxsb3dlZEF1dG9QbGFjZW1lbnRzIiwiYWxsUGxhY2VtZW50cyIsImFsbG93ZWRQbGFjZW1lbnRzIiwib3ZlcmZsb3dzIiwiYSIsImIiLCJnZXRFeHBhbmRlZEZhbGxiYWNrUGxhY2VtZW50cyIsIm9wcG9zaXRlUGxhY2VtZW50IiwiZmxpcCIsIl9za2lwIiwiY2hlY2tNYWluQXhpcyIsImFsdEF4aXMiLCJjaGVja0FsdEF4aXMiLCJzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMiLCJmYWxsYmFja1BsYWNlbWVudHMiLCJwcmVmZXJyZWRQbGFjZW1lbnQiLCJpc0Jhc2VQbGFjZW1lbnQiLCJyZWZlcmVuY2VSZWN0IiwiY2hlY2tzTWFwIiwibWFrZUZhbGxiYWNrQ2hlY2tzIiwiZmlyc3RGaXR0aW5nUGxhY2VtZW50IiwiaSIsImlzU3RhcnRWYXJpYXRpb24iLCJpc1ZlcnRpY2FsIiwibWFpblZhcmlhdGlvblNpZGUiLCJhbHRWYXJpYXRpb25TaWRlIiwiY2hlY2tzIiwiZXZlcnkiLCJjaGVjayIsIm51bWJlck9mQ2hlY2tzIiwiZml0dGluZ1BsYWNlbWVudCIsInNsaWNlIiwiZ2V0QWx0QXhpcyIsIndpdGhpbiIsIm1hdGhNYXgiLCJtYXRoTWluIiwid2l0aGluTWF4Q2xhbXAiLCJ2IiwicHJldmVudE92ZXJmbG93IiwidGV0aGVyIiwidGV0aGVyT2Zmc2V0IiwidGV0aGVyT2Zmc2V0VmFsdWUiLCJub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUiLCJvZmZzZXRNb2RpZmllclN0YXRlIiwibWFpblNpZGUiLCJhbHRTaWRlIiwiYWRkaXRpdmUiLCJtaW5MZW4iLCJtYXhMZW4iLCJhcnJvd0VsZW1lbnQiLCJhcnJvd1JlY3QiLCJhcnJvd1BhZGRpbmdPYmplY3QiLCJhcnJvd1BhZGRpbmdNaW4iLCJhcnJvd1BhZGRpbmdNYXgiLCJhcnJvd0xlbiIsIm1pbk9mZnNldCIsIm1heE9mZnNldCIsImFycm93T2Zmc2V0UGFyZW50IiwiY2xpZW50T2Zmc2V0Iiwib2Zmc2V0TW9kaWZpZXJWYWx1ZSIsInRldGhlck1pbiIsInRldGhlck1heCIsInByZXZlbnRlZE9mZnNldCIsImlzT3JpZ2luU2lkZSIsInRvUGFkZGluZ09iamVjdCIsIm1pblByb3AiLCJtYXhQcm9wIiwiZW5kRGlmZiIsInN0YXJ0RGlmZiIsImNsaWVudFNpemUiLCJjZW50ZXJUb1JlZmVyZW5jZSIsImNlbnRlciIsImF4aXNQcm9wIiwiY2VudGVyT2Zmc2V0IiwicXVlcnlTZWxlY3RvciIsImdldFNpZGVPZmZzZXRzIiwicHJldmVudGVkT2Zmc2V0cyIsImlzQW55U2lkZUZ1bGx5Q2xpcHBlZCIsInNpZGUiLCJoaWRlIiwicmVmZXJlbmNlT3ZlcmZsb3ciLCJwb3BwZXJBbHRPdmVyZmxvdyIsInJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyIsInBvcHBlckVzY2FwZU9mZnNldHMiLCJpc1JlZmVyZW5jZUhpZGRlbiIsImhhc1BvcHBlckVzY2FwZWQiLCJldmVudExpc3RlbmVycyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kb20tdXRpbHMvZ2V0V2luZG93LmpzIiwiLi4vLi4vc3JjL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzIiwiLi4vLi4vc3JjL3V0aWxzL21hdGguanMiLCIuLi8uLi9zcmMvZG9tLXV0aWxzL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qcyIsIi4uLy4uL3NyYy9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsLmpzIiwiLi4vLi4vc3JjL2RvbS11dGlscy9nZXRIVE1MRWxlbWVudFNjcm9sbC5qcyIsIi4uLy4uL3NyYy9kb20tdXRpbHMvZ2V0Tm9kZVNjcm9sbC5qcyIsIi4uLy4uL3NyYy9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanMiLCIuLi8uLi9zcmMvZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qcyIsIi4uLy4uL3NyYy9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsQmFyWC5qcyIsIi4uLy4uL3NyYy9kb20tdXRpbHMvZ2V0Q29tcHV0ZWRTdHlsZS5qcyIsIi4uLy4uL3NyYy9kb20tdXRpbHMvaXNTY3JvbGxQYXJlbnQuanMiLCIuLi8uLi9zcmMvZG9tLXV0aWxzL2dldENvbXBvc2l0ZVJlY3QuanMiLCIuLi8uLi9zcmMvZG9tLXV0aWxzL2dldExheW91dFJlY3QuanMiLCIuLi8uLi9zcmMvZG9tLXV0aWxzL2dldFBhcmVudE5vZGUuanMiLCIuLi8uLi9zcmMvZG9tLXV0aWxzL2dldFNjcm9sbFBhcmVudC5qcyIsIi4uLy4uL3NyYy9kb20tdXRpbHMvbGlzdFNjcm9sbFBhcmVudHMuanMiLCIuLi8uLi9zcmMvZG9tLXV0aWxzL2lzVGFibGVFbGVtZW50LmpzIiwiLi4vLi4vc3JjL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanMiLCIuLi8uLi9zcmMvZW51bXMuanMiLCIuLi8uLi9zcmMvdXRpbHMvb3JkZXJNb2RpZmllcnMuanMiLCIuLi8uLi9zcmMvdXRpbHMvZGVib3VuY2UuanMiLCIuLi8uLi9zcmMvdXRpbHMvZm9ybWF0LmpzIiwiLi4vLi4vc3JjL3V0aWxzL3ZhbGlkYXRlTW9kaWZpZXJzLmpzIiwiLi4vLi4vc3JjL3V0aWxzL3VuaXF1ZUJ5LmpzIiwiLi4vLi4vc3JjL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanMiLCIuLi8uLi9zcmMvdXRpbHMvbWVyZ2VCeU5hbWUuanMiLCIuLi8uLi9zcmMvZG9tLXV0aWxzL2dldFZpZXdwb3J0UmVjdC5qcyIsIi4uLy4uL3NyYy9kb20tdXRpbHMvZ2V0RG9jdW1lbnRSZWN0LmpzIiwiLi4vLi4vc3JjL2RvbS11dGlscy9jb250YWlucy5qcyIsIi4uLy4uL3NyYy91dGlscy9yZWN0VG9DbGllbnRSZWN0LmpzIiwiLi4vLi4vc3JjL2RvbS11dGlscy9nZXRDbGlwcGluZ1JlY3QuanMiLCIuLi8uLi9zcmMvdXRpbHMvZ2V0VmFyaWF0aW9uLmpzIiwiLi4vLi4vc3JjL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qcyIsIi4uLy4uL3NyYy91dGlscy9jb21wdXRlT2Zmc2V0cy5qcyIsIi4uLy4uL3NyYy91dGlscy9nZXRGcmVzaFNpZGVPYmplY3QuanMiLCIuLi8uLi9zcmMvdXRpbHMvbWVyZ2VQYWRkaW5nT2JqZWN0LmpzIiwiLi4vLi4vc3JjL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qcyIsIi4uLy4uL3NyYy91dGlscy9kZXRlY3RPdmVyZmxvdy5qcyIsIi4uLy4uL3NyYy9jcmVhdGVQb3BwZXIuanMiLCIuLi8uLi9zcmMvbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzIiwiLi4vLi4vc3JjL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzLmpzIiwiLi4vLi4vc3JjL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzIiwiLi4vLi4vc3JjL21vZGlmaWVycy9hcHBseVN0eWxlcy5qcyIsIi4uLy4uL3NyYy9tb2RpZmllcnMvb2Zmc2V0LmpzIiwiLi4vLi4vc3JjL3V0aWxzL2dldE9wcG9zaXRlUGxhY2VtZW50LmpzIiwiLi4vLi4vc3JjL3V0aWxzL2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50LmpzIiwiLi4vLi4vc3JjL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50LmpzIiwiLi4vLi4vc3JjL21vZGlmaWVycy9mbGlwLmpzIiwiLi4vLi4vc3JjL3V0aWxzL2dldEFsdEF4aXMuanMiLCIuLi8uLi9zcmMvdXRpbHMvd2l0aGluLmpzIiwiLi4vLi4vc3JjL21vZGlmaWVycy9wcmV2ZW50T3ZlcmZsb3cuanMiLCIuLi8uLi9zcmMvbW9kaWZpZXJzL2Fycm93LmpzIiwiLi4vLi4vc3JjL21vZGlmaWVycy9oaWRlLmpzIiwiLi4vLi4vc3JjL3BvcHBlci1saXRlLmpzIiwiLi4vLi4vc3JjL3BvcHBlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBXaW5kb3cgfSBmcm9tICcuLi90eXBlcyc7XG5kZWNsYXJlIGZ1bmN0aW9uIGdldFdpbmRvdyhub2RlOiBOb2RlIHwgV2luZG93KTogV2luZG93O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3cobm9kZSkge1xuICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHdpbmRvdztcbiAgfVxuXG4gIGlmIChub2RlLnRvU3RyaW5nKCkgIT09ICdbb2JqZWN0IFdpbmRvd10nKSB7XG4gICAgY29uc3Qgb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICByZXR1cm4gb3duZXJEb2N1bWVudCA/IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93IDogd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tICcuL2dldFdpbmRvdyc7XG5cbmRlY2xhcmUgZnVuY3Rpb24gaXNFbGVtZW50KG5vZGU6IG1peGVkKTogYm9vbGVhbiAlY2hlY2tzKG5vZGUgaW5zdGFuY2VvZlxuICBFbGVtZW50KTtcbmZ1bmN0aW9uIGlzRWxlbWVudChub2RlKSB7XG4gIGNvbnN0IE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50O1xufVxuXG5kZWNsYXJlIGZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQobm9kZTogbWl4ZWQpOiBib29sZWFuICVjaGVja3Mobm9kZSBpbnN0YW5jZW9mXG4gIEhUTUxFbGVtZW50KTtcbmZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQobm9kZSkge1xuICBjb25zdCBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLkhUTUxFbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50O1xufVxuXG5kZWNsYXJlIGZ1bmN0aW9uIGlzU2hhZG93Um9vdChub2RlOiBtaXhlZCk6IGJvb2xlYW4gJWNoZWNrcyhub2RlIGluc3RhbmNlb2ZcbiAgU2hhZG93Um9vdCk7XG5mdW5jdGlvbiBpc1NoYWRvd1Jvb3Qobm9kZSkge1xuICAvLyBJRSAxMSBoYXMgbm8gU2hhZG93Um9vdFxuICBpZiAodHlwZW9mIFNoYWRvd1Jvb3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuU2hhZG93Um9vdDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290O1xufVxuXG5leHBvcnQgeyBpc0VsZW1lbnQsIGlzSFRNTEVsZW1lbnQsIGlzU2hhZG93Um9vdCB9O1xuIiwiLy8gQGZsb3dcbmV4cG9ydCBjb25zdCBtYXggPSBNYXRoLm1heDtcbmV4cG9ydCBjb25zdCBtaW4gPSBNYXRoLm1pbjtcbmV4cG9ydCBjb25zdCByb3VuZCA9IE1hdGgucm91bmQ7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBDbGllbnRSZWN0T2JqZWN0LCBWaXJ0dWFsRWxlbWVudCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tICcuL2luc3RhbmNlT2YnO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tICcuLi91dGlscy9tYXRoJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KFxuICBlbGVtZW50OiBFbGVtZW50IHwgVmlydHVhbEVsZW1lbnQsXG4gIGluY2x1ZGVTY2FsZTogYm9vbGVhbiA9IGZhbHNlXG4pOiBDbGllbnRSZWN0T2JqZWN0IHtcbiAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGxldCBzY2FsZVggPSAxO1xuICBsZXQgc2NhbGVZID0gMTtcblxuICBpZiAoaXNIVE1MRWxlbWVudChlbGVtZW50KSAmJiBpbmNsdWRlU2NhbGUpIHtcbiAgICBjb25zdCBvZmZzZXRIZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICBjb25zdCBvZmZzZXRXaWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG5cbiAgICAvLyBEbyBub3QgYXR0ZW1wdCB0byBkaXZpZGUgYnkgMCwgb3RoZXJ3aXNlIHdlIGdldCBgSW5maW5pdHlgIGFzIHNjYWxlXG4gICAgLy8gRmFsbGJhY2sgdG8gMSBpbiBjYXNlIGJvdGggdmFsdWVzIGFyZSBgMGBcbiAgICBpZiAob2Zmc2V0V2lkdGggPiAwKSB7XG4gICAgICBzY2FsZVggPSByb3VuZChyZWN0LndpZHRoKSAvIG9mZnNldFdpZHRoIHx8IDE7XG4gICAgfVxuICAgIGlmIChvZmZzZXRIZWlnaHQgPiAwKSB7XG4gICAgICBzY2FsZVkgPSByb3VuZChyZWN0LmhlaWdodCkgLyBvZmZzZXRIZWlnaHQgfHwgMTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiByZWN0LndpZHRoIC8gc2NhbGVYLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHQgLyBzY2FsZVksXG4gICAgdG9wOiByZWN0LnRvcCAvIHNjYWxlWSxcbiAgICByaWdodDogcmVjdC5yaWdodCAvIHNjYWxlWCxcbiAgICBib3R0b206IHJlY3QuYm90dG9tIC8gc2NhbGVZLFxuICAgIGxlZnQ6IHJlY3QubGVmdCAvIHNjYWxlWCxcbiAgICB4OiByZWN0LmxlZnQgLyBzY2FsZVgsXG4gICAgeTogcmVjdC50b3AgLyBzY2FsZVksXG4gIH07XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tICcuL2dldFdpbmRvdyc7XG5pbXBvcnQgdHlwZSB7IFdpbmRvdyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsKG5vZGU6IE5vZGUgfCBXaW5kb3cpIHtcbiAgY29uc3Qgd2luID0gZ2V0V2luZG93KG5vZGUpO1xuICBjb25zdCBzY3JvbGxMZWZ0ID0gd2luLnBhZ2VYT2Zmc2V0O1xuICBjb25zdCBzY3JvbGxUb3AgPSB3aW4ucGFnZVlPZmZzZXQ7XG5cbiAgcmV0dXJuIHtcbiAgICBzY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcCxcbiAgfTtcbn1cbiIsIi8vIEBmbG93XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEhUTUxFbGVtZW50U2Nyb2xsKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogZWxlbWVudC5zY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3AsXG4gIH07XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tICcuL2dldFdpbmRvd1Njcm9sbCc7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gJy4vZ2V0V2luZG93JztcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tICcuL2luc3RhbmNlT2YnO1xuaW1wb3J0IGdldEhUTUxFbGVtZW50U2Nyb2xsIGZyb20gJy4vZ2V0SFRNTEVsZW1lbnRTY3JvbGwnO1xuaW1wb3J0IHR5cGUgeyBXaW5kb3cgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVTY3JvbGwobm9kZTogTm9kZSB8IFdpbmRvdykge1xuICBpZiAobm9kZSA9PT0gZ2V0V2luZG93KG5vZGUpIHx8ICFpc0hUTUxFbGVtZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIGdldFdpbmRvd1Njcm9sbChub2RlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZ2V0SFRNTEVsZW1lbnRTY3JvbGwobm9kZSk7XG4gIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSB7IFdpbmRvdyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Tm9kZU5hbWUoZWxlbWVudDogP05vZGUgfCBXaW5kb3cpOiA/c3RyaW5nIHtcbiAgcmV0dXJuIGVsZW1lbnQgPyAoZWxlbWVudC5ub2RlTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA6IG51bGw7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSAnLi9pbnN0YW5jZU9mJztcbmltcG9ydCB0eXBlIHsgV2luZG93IH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREb2N1bWVudEVsZW1lbnQoXG4gIGVsZW1lbnQ6IEVsZW1lbnQgfCBXaW5kb3dcbik6IEhUTUxFbGVtZW50IHtcbiAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICByZXR1cm4gKFxuICAgIChpc0VsZW1lbnQoZWxlbWVudClcbiAgICAgID8gZWxlbWVudC5vd25lckRvY3VtZW50XG4gICAgICA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgICBlbGVtZW50LmRvY3VtZW50KSB8fCB3aW5kb3cuZG9jdW1lbnRcbiAgKS5kb2N1bWVudEVsZW1lbnQ7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tICcuL2dldEJvdW5kaW5nQ2xpZW50UmVjdCc7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gJy4vZ2V0RG9jdW1lbnRFbGVtZW50JztcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSAnLi9nZXRXaW5kb3dTY3JvbGwnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQ6IEVsZW1lbnQpOiBudW1iZXIge1xuICAvLyBJZiA8aHRtbD4gaGFzIGEgQ1NTIHdpZHRoIGdyZWF0ZXIgdGhhbiB0aGUgdmlld3BvcnQsIHRoZW4gdGhpcyB3aWxsIGJlXG4gIC8vIGluY29ycmVjdCBmb3IgUlRMLlxuICAvLyBQb3BwZXIgMSBpcyBicm9rZW4gaW4gdGhpcyBjYXNlIGFuZCBuZXZlciBoYWQgYSBidWcgcmVwb3J0IHNvIGxldCdzIGFzc3VtZVxuICAvLyBpdCdzIG5vdCBhbiBpc3N1ZS4gSSBkb24ndCB0aGluayBhbnlvbmUgZXZlciBzcGVjaWZpZXMgd2lkdGggb24gPGh0bWw+XG4gIC8vIGFueXdheS5cbiAgLy8gQnJvd3NlcnMgd2hlcmUgdGhlIGxlZnQgc2Nyb2xsYmFyIGRvZXNuJ3QgY2F1c2UgYW4gaXNzdWUgcmVwb3J0IGAwYCBmb3JcbiAgLy8gdGhpcyAoZS5nLiBFZGdlIDIwMTksIElFMTEsIFNhZmFyaSlcbiAgcmV0dXJuIChcbiAgICBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKS5sZWZ0ICtcbiAgICBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCkuc2Nyb2xsTGVmdFxuICApO1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSAnLi9nZXRXaW5kb3cnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKFxuICBlbGVtZW50OiBFbGVtZW50XG4pOiBDU1NTdHlsZURlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIGdldFdpbmRvdyhlbGVtZW50KS5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gJy4vZ2V0Q29tcHV0ZWRTdHlsZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzU2Nyb2xsUGFyZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gIC8vIEZpcmVmb3ggd2FudHMgdXMgdG8gY2hlY2sgYC14YCBhbmQgYC15YCB2YXJpYXRpb25zIGFzIHdlbGxcbiAgY29uc3QgeyBvdmVyZmxvdywgb3ZlcmZsb3dYLCBvdmVyZmxvd1kgfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gIHJldHVybiAvYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW4vLnRlc3Qob3ZlcmZsb3cgKyBvdmVyZmxvd1kgKyBvdmVyZmxvd1gpO1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIHsgUmVjdCwgVmlydHVhbEVsZW1lbnQsIFdpbmRvdyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSAnLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QnO1xuaW1wb3J0IGdldE5vZGVTY3JvbGwgZnJvbSAnLi9nZXROb2RlU2Nyb2xsJztcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tICcuL2dldE5vZGVOYW1lJztcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tICcuL2luc3RhbmNlT2YnO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSAnLi9nZXRXaW5kb3dTY3JvbGxCYXJYJztcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSAnLi9nZXREb2N1bWVudEVsZW1lbnQnO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gJy4vaXNTY3JvbGxQYXJlbnQnO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tICcuLi91dGlscy9tYXRoJztcblxuZnVuY3Rpb24gaXNFbGVtZW50U2NhbGVkKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCBzY2FsZVggPSByb3VuZChyZWN0LndpZHRoKSAvIGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMTtcbiAgY29uc3Qgc2NhbGVZID0gcm91bmQocmVjdC5oZWlnaHQpIC8gZWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgMTtcblxuICByZXR1cm4gc2NhbGVYICE9PSAxIHx8IHNjYWxlWSAhPT0gMTtcbn1cblxuLy8gUmV0dXJucyB0aGUgY29tcG9zaXRlIHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LlxuLy8gQ29tcG9zaXRlIG1lYW5zIGl0IHRha2VzIGludG8gYWNjb3VudCB0cmFuc2Zvcm1zIGFzIHdlbGwgYXMgbGF5b3V0LlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q29tcG9zaXRlUmVjdChcbiAgZWxlbWVudE9yVmlydHVhbEVsZW1lbnQ6IEVsZW1lbnQgfCBWaXJ0dWFsRWxlbWVudCxcbiAgb2Zmc2V0UGFyZW50OiBFbGVtZW50IHwgV2luZG93LFxuICBpc0ZpeGVkOiBib29sZWFuID0gZmFsc2Vcbik6IFJlY3Qge1xuICBjb25zdCBpc09mZnNldFBhcmVudEFuRWxlbWVudCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgY29uc3Qgb2Zmc2V0UGFyZW50SXNTY2FsZWQgPVxuICAgIGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBpc0VsZW1lbnRTY2FsZWQob2Zmc2V0UGFyZW50KTtcbiAgY29uc3QgZG9jdW1lbnRFbGVtZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIGNvbnN0IHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoXG4gICAgZWxlbWVudE9yVmlydHVhbEVsZW1lbnQsXG4gICAgb2Zmc2V0UGFyZW50SXNTY2FsZWRcbiAgKTtcblxuICBsZXQgc2Nyb2xsID0geyBzY3JvbGxMZWZ0OiAwLCBzY3JvbGxUb3A6IDAgfTtcbiAgbGV0IG9mZnNldHMgPSB7IHg6IDAsIHk6IDAgfTtcblxuICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgfHwgKCFpc09mZnNldFBhcmVudEFuRWxlbWVudCAmJiAhaXNGaXhlZCkpIHtcbiAgICBpZiAoXG4gICAgICBnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpICE9PSAnYm9keScgfHxcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTA3OFxuICAgICAgaXNTY3JvbGxQYXJlbnQoZG9jdW1lbnRFbGVtZW50KVxuICAgICkge1xuICAgICAgc2Nyb2xsID0gZ2V0Tm9kZVNjcm9sbChvZmZzZXRQYXJlbnQpO1xuICAgIH1cblxuICAgIGlmIChpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCkpIHtcbiAgICAgIG9mZnNldHMgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qob2Zmc2V0UGFyZW50LCB0cnVlKTtcbiAgICAgIG9mZnNldHMueCArPSBvZmZzZXRQYXJlbnQuY2xpZW50TGVmdDtcbiAgICAgIG9mZnNldHMueSArPSBvZmZzZXRQYXJlbnQuY2xpZW50VG9wO1xuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBvZmZzZXRzLnggPSBnZXRXaW5kb3dTY3JvbGxCYXJYKGRvY3VtZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiByZWN0LmxlZnQgKyBzY3JvbGwuc2Nyb2xsTGVmdCAtIG9mZnNldHMueCxcbiAgICB5OiByZWN0LnRvcCArIHNjcm9sbC5zY3JvbGxUb3AgLSBvZmZzZXRzLnksXG4gICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodCxcbiAgfTtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSB7IFJlY3QgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gJy4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0JztcblxuLy8gUmV0dXJucyB0aGUgbGF5b3V0IHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LiBMYXlvdXRcbi8vIG1lYW5zIGl0IGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgdHJhbnNmb3Jtcy5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldExheW91dFJlY3QoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBSZWN0IHtcbiAgY29uc3QgY2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTtcblxuICAvLyBVc2UgdGhlIGNsaWVudFJlY3Qgc2l6ZXMgaWYgaXQncyBub3QgYmVlbiB0cmFuc2Zvcm1lZC5cbiAgLy8gRml4ZXMgaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy8xMjIzXG4gIGxldCB3aWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIGxldCBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC53aWR0aCAtIHdpZHRoKSA8PSAxKSB7XG4gICAgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3QuaGVpZ2h0IC0gaGVpZ2h0KSA8PSAxKSB7XG4gICAgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IGVsZW1lbnQub2Zmc2V0TGVmdCxcbiAgICB5OiBlbGVtZW50Lm9mZnNldFRvcCxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gIH07XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gJy4vZ2V0Tm9kZU5hbWUnO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tICcuL2dldERvY3VtZW50RWxlbWVudCc7XG5pbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tICcuL2luc3RhbmNlT2YnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRQYXJlbnROb2RlKGVsZW1lbnQ6IE5vZGUgfCBTaGFkb3dSb290KTogTm9kZSB7XG4gIGlmIChnZXROb2RlTmFtZShlbGVtZW50KSA9PT0gJ2h0bWwnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIC8vIHRoaXMgaXMgYSBxdWlja2VyIChidXQgbGVzcyB0eXBlIHNhZmUpIHdheSB0byBzYXZlIHF1aXRlIHNvbWUgYnl0ZXMgZnJvbSB0aGUgYnVuZGxlXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXVxuICAgIC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgIGVsZW1lbnQuYXNzaWduZWRTbG90IHx8IC8vIHN0ZXAgaW50byB0aGUgc2hhZG93IERPTSBvZiB0aGUgcGFyZW50IG9mIGEgc2xvdHRlZCBub2RlXG4gICAgZWxlbWVudC5wYXJlbnROb2RlIHx8IC8vIERPTSBFbGVtZW50IGRldGVjdGVkXG4gICAgKGlzU2hhZG93Um9vdChlbGVtZW50KSA/IGVsZW1lbnQuaG9zdCA6IG51bGwpIHx8IC8vIFNoYWRvd1Jvb3QgZGV0ZWN0ZWRcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogSFRNTEVsZW1lbnQgaXMgYSBOb2RlXG4gICAgZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIC8vIGZhbGxiYWNrXG4gICk7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSAnLi9nZXRQYXJlbnROb2RlJztcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tICcuL2lzU2Nyb2xsUGFyZW50JztcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tICcuL2dldE5vZGVOYW1lJztcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tICcuL2luc3RhbmNlT2YnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTY3JvbGxQYXJlbnQobm9kZTogTm9kZSk6IEhUTUxFbGVtZW50IHtcbiAgaWYgKFsnaHRtbCcsICdib2R5JywgJyNkb2N1bWVudCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUobm9kZSkpID49IDApIHtcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBhc3N1bWUgYm9keSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gICAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudC5ib2R5O1xuICB9XG5cbiAgaWYgKGlzSFRNTEVsZW1lbnQobm9kZSkgJiYgaXNTY3JvbGxQYXJlbnQobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHJldHVybiBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShub2RlKSk7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGdldFNjcm9sbFBhcmVudCBmcm9tICcuL2dldFNjcm9sbFBhcmVudCc7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tICcuL2dldFBhcmVudE5vZGUnO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tICcuL2dldFdpbmRvdyc7XG5pbXBvcnQgdHlwZSB7IFdpbmRvdywgVmlzdWFsVmlld3BvcnQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSAnLi9pc1Njcm9sbFBhcmVudCc7XG5cbi8qXG5naXZlbiBhIERPTSBlbGVtZW50LCByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHNjcm9sbCBwYXJlbnRzLCB1cCB0aGUgbGlzdCBvZiBhbmNlc29yc1xudW50aWwgd2UgZ2V0IHRvIHRoZSB0b3Agd2luZG93IG9iamVjdC4gVGhpcyBsaXN0IGlzIHdoYXQgd2UgYXR0YWNoIHNjcm9sbCBsaXN0ZW5lcnNcbnRvLCBiZWNhdXNlIGlmIGFueSBvZiB0aGVzZSBwYXJlbnQgZWxlbWVudHMgc2Nyb2xsLCB3ZSdsbCBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGVcbnJlZmVyZW5jZSBlbGVtZW50J3MgcG9zaXRpb24uXG4qL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGlzdFNjcm9sbFBhcmVudHMoXG4gIGVsZW1lbnQ6IE5vZGUsXG4gIGxpc3Q6IEFycmF5PEVsZW1lbnQgfCBXaW5kb3c+ID0gW11cbik6IEFycmF5PEVsZW1lbnQgfCBXaW5kb3cgfCBWaXN1YWxWaWV3cG9ydD4ge1xuICBjb25zdCBzY3JvbGxQYXJlbnQgPSBnZXRTY3JvbGxQYXJlbnQoZWxlbWVudCk7XG4gIGNvbnN0IGlzQm9keSA9IHNjcm9sbFBhcmVudCA9PT0gZWxlbWVudC5vd25lckRvY3VtZW50Py5ib2R5O1xuICBjb25zdCB3aW4gPSBnZXRXaW5kb3coc2Nyb2xsUGFyZW50KTtcbiAgY29uc3QgdGFyZ2V0ID0gaXNCb2R5XG4gICAgPyBbd2luXS5jb25jYXQoXG4gICAgICAgIHdpbi52aXN1YWxWaWV3cG9ydCB8fCBbXSxcbiAgICAgICAgaXNTY3JvbGxQYXJlbnQoc2Nyb2xsUGFyZW50KSA/IHNjcm9sbFBhcmVudCA6IFtdXG4gICAgICApXG4gICAgOiBzY3JvbGxQYXJlbnQ7XG4gIGNvbnN0IHVwZGF0ZWRMaXN0ID0gbGlzdC5jb25jYXQodGFyZ2V0KTtcblxuICByZXR1cm4gaXNCb2R5XG4gICAgPyB1cGRhdGVkTGlzdFxuICAgIDogLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FsbF06IGlzQm9keSB0ZWxscyB1cyB0YXJnZXQgd2lsbCBiZSBhbiBIVE1MRWxlbWVudCBoZXJlXG4gICAgICB1cGRhdGVkTGlzdC5jb25jYXQobGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZSh0YXJnZXQpKSk7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gJy4vZ2V0Tm9kZU5hbWUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1RhYmxlRWxlbWVudChlbGVtZW50OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gIHJldHVybiBbJ3RhYmxlJywgJ3RkJywgJ3RoJ10uaW5kZXhPZihnZXROb2RlTmFtZShlbGVtZW50KSkgPj0gMDtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gJy4vZ2V0V2luZG93JztcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tICcuL2dldE5vZGVOYW1lJztcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gJy4vZ2V0Q29tcHV0ZWRTdHlsZSc7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfSBmcm9tICcuL2luc3RhbmNlT2YnO1xuaW1wb3J0IGlzVGFibGVFbGVtZW50IGZyb20gJy4vaXNUYWJsZUVsZW1lbnQnO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSAnLi9nZXRQYXJlbnROb2RlJztcblxuZnVuY3Rpb24gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50OiBFbGVtZW50KTogP0VsZW1lbnQge1xuICBpZiAoXG4gICAgIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHxcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzgzN1xuICAgIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCdcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudC5vZmZzZXRQYXJlbnQ7XG59XG5cbi8vIGAub2Zmc2V0UGFyZW50YCByZXBvcnRzIGBudWxsYCBmb3IgZml4ZWQgZWxlbWVudHMsIHdoaWxlIGFic29sdXRlIGVsZW1lbnRzXG4vLyByZXR1cm4gdGhlIGNvbnRhaW5pbmcgYmxvY2tcbmZ1bmN0aW9uIGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50OiBFbGVtZW50KSB7XG4gIGNvbnN0IGlzRmlyZWZveCA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdmaXJlZm94JykgIT09IC0xO1xuICBjb25zdCBpc0lFID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdUcmlkZW50JykgIT09IC0xO1xuXG4gIGlmIChpc0lFICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAvLyBJbiBJRSA5LCAxMCBhbmQgMTEgZml4ZWQgZWxlbWVudHMgY29udGFpbmluZyBibG9jayBpcyBhbHdheXMgZXN0YWJsaXNoZWQgYnkgdGhlIHZpZXdwb3J0XG4gICAgY29uc3QgZWxlbWVudENzcyA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgaWYgKGVsZW1lbnRDc3MucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGxldCBjdXJyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG5cbiAgaWYgKGlzU2hhZG93Um9vdChjdXJyZW50Tm9kZSkpIHtcbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmhvc3Q7XG4gIH1cblxuICB3aGlsZSAoXG4gICAgaXNIVE1MRWxlbWVudChjdXJyZW50Tm9kZSkgJiZcbiAgICBbJ2h0bWwnLCAnYm9keSddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoY3VycmVudE5vZGUpKSA8IDBcbiAgKSB7XG4gICAgY29uc3QgY3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50Tm9kZSk7XG5cbiAgICAvLyBUaGlzIGlzIG5vbi1leGhhdXN0aXZlIGJ1dCBjb3ZlcnMgdGhlIG1vc3QgY29tbW9uIENTUyBwcm9wZXJ0aWVzIHRoYXRcbiAgICAvLyBjcmVhdGUgYSBjb250YWluaW5nIGJsb2NrLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Db250YWluaW5nX2Jsb2NrI2lkZW50aWZ5aW5nX3RoZV9jb250YWluaW5nX2Jsb2NrXG4gICAgaWYgKFxuICAgICAgY3NzLnRyYW5zZm9ybSAhPT0gJ25vbmUnIHx8XG4gICAgICBjc3MucGVyc3BlY3RpdmUgIT09ICdub25lJyB8fFxuICAgICAgY3NzLmNvbnRhaW4gPT09ICdwYWludCcgfHxcbiAgICAgIFsndHJhbnNmb3JtJywgJ3BlcnNwZWN0aXZlJ10uaW5kZXhPZihjc3Mud2lsbENoYW5nZSkgIT09IC0xIHx8XG4gICAgICAoaXNGaXJlZm94ICYmIGNzcy53aWxsQ2hhbmdlID09PSAnZmlsdGVyJykgfHxcbiAgICAgIChpc0ZpcmVmb3ggJiYgY3NzLmZpbHRlciAmJiBjc3MuZmlsdGVyICE9PSAnbm9uZScpXG4gICAgKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gR2V0cyB0aGUgY2xvc2VzdCBhbmNlc3RvciBwb3NpdGlvbmVkIGVsZW1lbnQuIEhhbmRsZXMgc29tZSBlZGdlIGNhc2VzLFxuLy8gc3VjaCBhcyB0YWJsZSBhbmNlc3RvcnMgYW5kIGNyb3NzIGJyb3dzZXIgYnVncy5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9mZnNldFBhcmVudChlbGVtZW50OiBFbGVtZW50KSB7XG4gIGNvbnN0IHdpbmRvdyA9IGdldFdpbmRvdyhlbGVtZW50KTtcblxuICBsZXQgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KTtcblxuICB3aGlsZSAoXG4gICAgb2Zmc2V0UGFyZW50ICYmXG4gICAgaXNUYWJsZUVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJlxuICAgIGdldENvbXB1dGVkU3R5bGUob2Zmc2V0UGFyZW50KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYydcbiAgKSB7XG4gICAgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChvZmZzZXRQYXJlbnQpO1xuICB9XG5cbiAgaWYgKFxuICAgIG9mZnNldFBhcmVudCAmJlxuICAgIChnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnaHRtbCcgfHxcbiAgICAgIChnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnYm9keScgJiZcbiAgICAgICAgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykpXG4gICkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB8fCB3aW5kb3c7XG59XG4iLCIvLyBAZmxvd1xuZXhwb3J0IGNvbnN0IHRvcDogJ3RvcCcgPSAndG9wJztcbmV4cG9ydCBjb25zdCBib3R0b206ICdib3R0b20nID0gJ2JvdHRvbSc7XG5leHBvcnQgY29uc3QgcmlnaHQ6ICdyaWdodCcgPSAncmlnaHQnO1xuZXhwb3J0IGNvbnN0IGxlZnQ6ICdsZWZ0JyA9ICdsZWZ0JztcbmV4cG9ydCBjb25zdCBhdXRvOiAnYXV0bycgPSAnYXV0byc7XG5leHBvcnQgdHlwZSBCYXNlUGxhY2VtZW50ID1cbiAgfCB0eXBlb2YgdG9wXG4gIHwgdHlwZW9mIGJvdHRvbVxuICB8IHR5cGVvZiByaWdodFxuICB8IHR5cGVvZiBsZWZ0O1xuZXhwb3J0IGNvbnN0IGJhc2VQbGFjZW1lbnRzOiBBcnJheTxCYXNlUGxhY2VtZW50PiA9IFt0b3AsIGJvdHRvbSwgcmlnaHQsIGxlZnRdO1xuXG5leHBvcnQgY29uc3Qgc3RhcnQ6ICdzdGFydCcgPSAnc3RhcnQnO1xuZXhwb3J0IGNvbnN0IGVuZDogJ2VuZCcgPSAnZW5kJztcbmV4cG9ydCB0eXBlIFZhcmlhdGlvbiA9IHR5cGVvZiBzdGFydCB8IHR5cGVvZiBlbmQ7XG5cbmV4cG9ydCBjb25zdCBjbGlwcGluZ1BhcmVudHM6ICdjbGlwcGluZ1BhcmVudHMnID0gJ2NsaXBwaW5nUGFyZW50cyc7XG5leHBvcnQgY29uc3Qgdmlld3BvcnQ6ICd2aWV3cG9ydCcgPSAndmlld3BvcnQnO1xuZXhwb3J0IHR5cGUgQm91bmRhcnkgPSBFbGVtZW50IHwgQXJyYXk8RWxlbWVudD4gfCB0eXBlb2YgY2xpcHBpbmdQYXJlbnRzO1xuZXhwb3J0IHR5cGUgUm9vdEJvdW5kYXJ5ID0gdHlwZW9mIHZpZXdwb3J0IHwgJ2RvY3VtZW50JztcblxuZXhwb3J0IGNvbnN0IHBvcHBlcjogJ3BvcHBlcicgPSAncG9wcGVyJztcbmV4cG9ydCBjb25zdCByZWZlcmVuY2U6ICdyZWZlcmVuY2UnID0gJ3JlZmVyZW5jZSc7XG5leHBvcnQgdHlwZSBDb250ZXh0ID0gdHlwZW9mIHBvcHBlciB8IHR5cGVvZiByZWZlcmVuY2U7XG5cbmV4cG9ydCB0eXBlIFZhcmlhdGlvblBsYWNlbWVudCA9XG4gIHwgJ3RvcC1zdGFydCdcbiAgfCAndG9wLWVuZCdcbiAgfCAnYm90dG9tLXN0YXJ0J1xuICB8ICdib3R0b20tZW5kJ1xuICB8ICdyaWdodC1zdGFydCdcbiAgfCAncmlnaHQtZW5kJ1xuICB8ICdsZWZ0LXN0YXJ0J1xuICB8ICdsZWZ0LWVuZCc7XG5leHBvcnQgdHlwZSBBdXRvUGxhY2VtZW50ID0gJ2F1dG8nIHwgJ2F1dG8tc3RhcnQnIHwgJ2F1dG8tZW5kJztcbmV4cG9ydCB0eXBlIENvbXB1dGVkUGxhY2VtZW50ID0gVmFyaWF0aW9uUGxhY2VtZW50IHwgQmFzZVBsYWNlbWVudDtcbmV4cG9ydCB0eXBlIFBsYWNlbWVudCA9IEF1dG9QbGFjZW1lbnQgfCBCYXNlUGxhY2VtZW50IHwgVmFyaWF0aW9uUGxhY2VtZW50O1xuXG5leHBvcnQgY29uc3QgdmFyaWF0aW9uUGxhY2VtZW50czogQXJyYXk8VmFyaWF0aW9uUGxhY2VtZW50PiA9IGJhc2VQbGFjZW1lbnRzLnJlZHVjZShcbiAgKGFjYzogQXJyYXk8VmFyaWF0aW9uUGxhY2VtZW50PiwgcGxhY2VtZW50OiBCYXNlUGxhY2VtZW50KSA9PlxuICAgIGFjYy5jb25jYXQoWyhgJHtwbGFjZW1lbnR9LSR7c3RhcnR9YDogYW55KSwgKGAke3BsYWNlbWVudH0tJHtlbmR9YDogYW55KV0pLFxuICBbXVxuKTtcbmV4cG9ydCBjb25zdCBwbGFjZW1lbnRzOiBBcnJheTxQbGFjZW1lbnQ+ID0gWy4uLmJhc2VQbGFjZW1lbnRzLCBhdXRvXS5yZWR1Y2UoXG4gIChcbiAgICBhY2M6IEFycmF5PFBsYWNlbWVudD4sXG4gICAgcGxhY2VtZW50OiBCYXNlUGxhY2VtZW50IHwgdHlwZW9mIGF1dG9cbiAgKTogQXJyYXk8UGxhY2VtZW50PiA9PlxuICAgIGFjYy5jb25jYXQoW1xuICAgICAgcGxhY2VtZW50LFxuICAgICAgKGAke3BsYWNlbWVudH0tJHtzdGFydH1gOiBhbnkpLFxuICAgICAgKGAke3BsYWNlbWVudH0tJHtlbmR9YDogYW55KSxcbiAgICBdKSxcbiAgW11cbik7XG5cbi8vIG1vZGlmaWVycyB0aGF0IG5lZWQgdG8gcmVhZCB0aGUgRE9NXG5leHBvcnQgY29uc3QgYmVmb3JlUmVhZDogJ2JlZm9yZVJlYWQnID0gJ2JlZm9yZVJlYWQnO1xuZXhwb3J0IGNvbnN0IHJlYWQ6ICdyZWFkJyA9ICdyZWFkJztcbmV4cG9ydCBjb25zdCBhZnRlclJlYWQ6ICdhZnRlclJlYWQnID0gJ2FmdGVyUmVhZCc7XG4vLyBwdXJlLWxvZ2ljIG1vZGlmaWVyc1xuZXhwb3J0IGNvbnN0IGJlZm9yZU1haW46ICdiZWZvcmVNYWluJyA9ICdiZWZvcmVNYWluJztcbmV4cG9ydCBjb25zdCBtYWluOiAnbWFpbicgPSAnbWFpbic7XG5leHBvcnQgY29uc3QgYWZ0ZXJNYWluOiAnYWZ0ZXJNYWluJyA9ICdhZnRlck1haW4nO1xuLy8gbW9kaWZpZXIgd2l0aCB0aGUgcHVycG9zZSB0byB3cml0ZSB0byB0aGUgRE9NIChvciB3cml0ZSBpbnRvIGEgZnJhbWV3b3JrIHN0YXRlKVxuZXhwb3J0IGNvbnN0IGJlZm9yZVdyaXRlOiAnYmVmb3JlV3JpdGUnID0gJ2JlZm9yZVdyaXRlJztcbmV4cG9ydCBjb25zdCB3cml0ZTogJ3dyaXRlJyA9ICd3cml0ZSc7XG5leHBvcnQgY29uc3QgYWZ0ZXJXcml0ZTogJ2FmdGVyV3JpdGUnID0gJ2FmdGVyV3JpdGUnO1xuZXhwb3J0IGNvbnN0IG1vZGlmaWVyUGhhc2VzOiBBcnJheTxNb2RpZmllclBoYXNlcz4gPSBbXG4gIGJlZm9yZVJlYWQsXG4gIHJlYWQsXG4gIGFmdGVyUmVhZCxcbiAgYmVmb3JlTWFpbixcbiAgbWFpbixcbiAgYWZ0ZXJNYWluLFxuICBiZWZvcmVXcml0ZSxcbiAgd3JpdGUsXG4gIGFmdGVyV3JpdGUsXG5dO1xuXG5leHBvcnQgdHlwZSBNb2RpZmllclBoYXNlcyA9XG4gIHwgdHlwZW9mIGJlZm9yZVJlYWRcbiAgfCB0eXBlb2YgcmVhZFxuICB8IHR5cGVvZiBhZnRlclJlYWRcbiAgfCB0eXBlb2YgYmVmb3JlTWFpblxuICB8IHR5cGVvZiBtYWluXG4gIHwgdHlwZW9mIGFmdGVyTWFpblxuICB8IHR5cGVvZiBiZWZvcmVXcml0ZVxuICB8IHR5cGVvZiB3cml0ZVxuICB8IHR5cGVvZiBhZnRlcldyaXRlO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIHsgTW9kaWZpZXIgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBtb2RpZmllclBoYXNlcyB9IGZyb20gJy4uL2VudW1zJztcblxuLy8gc291cmNlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80OTg3NTI1NVxuZnVuY3Rpb24gb3JkZXIobW9kaWZpZXJzKSB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgbW9kaWZpZXJzLmZvckVhY2gobW9kaWZpZXIgPT4ge1xuICAgIG1hcC5zZXQobW9kaWZpZXIubmFtZSwgbW9kaWZpZXIpO1xuICB9KTtcblxuICAvLyBPbiB2aXNpdGluZyBvYmplY3QsIGNoZWNrIGZvciBpdHMgZGVwZW5kZW5jaWVzIGFuZCB2aXNpdCB0aGVtIHJlY3Vyc2l2ZWx5XG4gIGZ1bmN0aW9uIHNvcnQobW9kaWZpZXI6IE1vZGlmaWVyPGFueSwgYW55Pikge1xuICAgIHZpc2l0ZWQuYWRkKG1vZGlmaWVyLm5hbWUpO1xuXG4gICAgY29uc3QgcmVxdWlyZXMgPSBbXG4gICAgICAuLi4obW9kaWZpZXIucmVxdWlyZXMgfHwgW10pLFxuICAgICAgLi4uKG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMgfHwgW10pLFxuICAgIF07XG5cbiAgICByZXF1aXJlcy5mb3JFYWNoKGRlcCA9PiB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGRlcCkpIHtcbiAgICAgICAgY29uc3QgZGVwTW9kaWZpZXIgPSBtYXAuZ2V0KGRlcCk7XG5cbiAgICAgICAgaWYgKGRlcE1vZGlmaWVyKSB7XG4gICAgICAgICAgc29ydChkZXBNb2RpZmllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlc3VsdC5wdXNoKG1vZGlmaWVyKTtcbiAgfVxuXG4gIG1vZGlmaWVycy5mb3JFYWNoKG1vZGlmaWVyID0+IHtcbiAgICBpZiAoIXZpc2l0ZWQuaGFzKG1vZGlmaWVyLm5hbWUpKSB7XG4gICAgICAvLyBjaGVjayBmb3IgdmlzaXRlZCBvYmplY3RcbiAgICAgIHNvcnQobW9kaWZpZXIpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb3JkZXJNb2RpZmllcnMoXG4gIG1vZGlmaWVyczogQXJyYXk8TW9kaWZpZXI8YW55LCBhbnk+PlxuKTogQXJyYXk8TW9kaWZpZXI8YW55LCBhbnk+PiB7XG4gIC8vIG9yZGVyIGJhc2VkIG9uIGRlcGVuZGVuY2llc1xuICBjb25zdCBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXIobW9kaWZpZXJzKTtcblxuICAvLyBvcmRlciBiYXNlZCBvbiBwaGFzZVxuICByZXR1cm4gbW9kaWZpZXJQaGFzZXMucmVkdWNlKChhY2MsIHBoYXNlKSA9PiB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQoXG4gICAgICBvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihtb2RpZmllciA9PiBtb2RpZmllci5waGFzZSA9PT0gcGhhc2UpXG4gICAgKTtcbiAgfSwgW10pO1xufVxuIiwiLy8gQGZsb3dcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVib3VuY2U8VD4oZm46IEZ1bmN0aW9uKTogKCkgPT4gUHJvbWlzZTxUPiB7XG4gIGxldCBwZW5kaW5nO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGlmICghcGVuZGluZykge1xuICAgICAgcGVuZGluZyA9IG5ldyBQcm9taXNlPFQ+KHJlc29sdmUgPT4ge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICBwZW5kaW5nID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJlc29sdmUoZm4oKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBlbmRpbmc7XG4gIH07XG59XG4iLCIvLyBAZmxvd1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXQoc3RyOiBzdHJpbmcsIC4uLmFyZ3M6IEFycmF5PHN0cmluZz4pIHtcbiAgcmV0dXJuIFsuLi5hcmdzXS5yZWR1Y2UoKHAsIGMpID0+IHAucmVwbGFjZSgvJXMvLCBjKSwgc3RyKTtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgZm9ybWF0IGZyb20gJy4vZm9ybWF0JztcbmltcG9ydCB7IG1vZGlmaWVyUGhhc2VzIH0gZnJvbSAnLi4vZW51bXMnO1xuXG5jb25zdCBJTlZBTElEX01PRElGSUVSX0VSUk9SID1cbiAgJ1BvcHBlcjogbW9kaWZpZXIgXCIlc1wiIHByb3ZpZGVkIGFuIGludmFsaWQgJXMgcHJvcGVydHksIGV4cGVjdGVkICVzIGJ1dCBnb3QgJXMnO1xuY29uc3QgTUlTU0lOR19ERVBFTkRFTkNZX0VSUk9SID1cbiAgJ1BvcHBlcjogbW9kaWZpZXIgXCIlc1wiIHJlcXVpcmVzIFwiJXNcIiwgYnV0IFwiJXNcIiBtb2RpZmllciBpcyBub3QgYXZhaWxhYmxlJztcbmNvbnN0IFZBTElEX1BST1BFUlRJRVMgPSBbXG4gICduYW1lJyxcbiAgJ2VuYWJsZWQnLFxuICAncGhhc2UnLFxuICAnZm4nLFxuICAnZWZmZWN0JyxcbiAgJ3JlcXVpcmVzJyxcbiAgJ29wdGlvbnMnLFxuXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVNb2RpZmllcnMobW9kaWZpZXJzOiBBcnJheTxhbnk+KTogdm9pZCB7XG4gIG1vZGlmaWVycy5mb3JFYWNoKChtb2RpZmllcikgPT4ge1xuICAgIFsuLi5PYmplY3Qua2V5cyhtb2RpZmllciksIC4uLlZBTElEX1BST1BFUlRJRVNdXG4gICAgICAvLyBJRTExLWNvbXBhdGlibGUgcmVwbGFjZW1lbnQgZm9yIGBuZXcgU2V0KGl0ZXJhYmxlKWBcbiAgICAgIC5maWx0ZXIoKHZhbHVlLCBpbmRleCwgc2VsZikgPT4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXgpXG4gICAgICAuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgY2FzZSAnbmFtZSc6XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1vZGlmaWVyLm5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgZm9ybWF0KFxuICAgICAgICAgICAgICAgICAgSU5WQUxJRF9NT0RJRklFUl9FUlJPUixcbiAgICAgICAgICAgICAgICAgIFN0cmluZyhtb2RpZmllci5uYW1lKSxcbiAgICAgICAgICAgICAgICAgICdcIm5hbWVcIicsXG4gICAgICAgICAgICAgICAgICAnXCJzdHJpbmdcIicsXG4gICAgICAgICAgICAgICAgICBgXCIke1N0cmluZyhtb2RpZmllci5uYW1lKX1cImBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdlbmFibGVkJzpcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kaWZpZXIuZW5hYmxlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgZm9ybWF0KFxuICAgICAgICAgICAgICAgICAgSU5WQUxJRF9NT0RJRklFUl9FUlJPUixcbiAgICAgICAgICAgICAgICAgIG1vZGlmaWVyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAnXCJlbmFibGVkXCInLFxuICAgICAgICAgICAgICAgICAgJ1wiYm9vbGVhblwiJyxcbiAgICAgICAgICAgICAgICAgIGBcIiR7U3RyaW5nKG1vZGlmaWVyLmVuYWJsZWQpfVwiYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3BoYXNlJzpcbiAgICAgICAgICAgIGlmIChtb2RpZmllclBoYXNlcy5pbmRleE9mKG1vZGlmaWVyLnBoYXNlKSA8IDApIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBmb3JtYXQoXG4gICAgICAgICAgICAgICAgICBJTlZBTElEX01PRElGSUVSX0VSUk9SLFxuICAgICAgICAgICAgICAgICAgbW9kaWZpZXIubmFtZSxcbiAgICAgICAgICAgICAgICAgICdcInBoYXNlXCInLFxuICAgICAgICAgICAgICAgICAgYGVpdGhlciAke21vZGlmaWVyUGhhc2VzLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgICAgICAgIGBcIiR7U3RyaW5nKG1vZGlmaWVyLnBoYXNlKX1cImBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdmbic6XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1vZGlmaWVyLmZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgZm9ybWF0KFxuICAgICAgICAgICAgICAgICAgSU5WQUxJRF9NT0RJRklFUl9FUlJPUixcbiAgICAgICAgICAgICAgICAgIG1vZGlmaWVyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAnXCJmblwiJyxcbiAgICAgICAgICAgICAgICAgICdcImZ1bmN0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgYFwiJHtTdHJpbmcobW9kaWZpZXIuZm4pfVwiYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2VmZmVjdCc6XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG1vZGlmaWVyLmVmZmVjdCAhPSBudWxsICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBtb2RpZmllci5lZmZlY3QgIT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgIGZvcm1hdChcbiAgICAgICAgICAgICAgICAgIElOVkFMSURfTU9ESUZJRVJfRVJST1IsXG4gICAgICAgICAgICAgICAgICBtb2RpZmllci5uYW1lLFxuICAgICAgICAgICAgICAgICAgJ1wiZWZmZWN0XCInLFxuICAgICAgICAgICAgICAgICAgJ1wiZnVuY3Rpb25cIicsXG4gICAgICAgICAgICAgICAgICBgXCIke1N0cmluZyhtb2RpZmllci5mbil9XCJgXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAncmVxdWlyZXMnOlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBtb2RpZmllci5yZXF1aXJlcyAhPSBudWxsICYmXG4gICAgICAgICAgICAgICFBcnJheS5pc0FycmF5KG1vZGlmaWVyLnJlcXVpcmVzKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgZm9ybWF0KFxuICAgICAgICAgICAgICAgICAgSU5WQUxJRF9NT0RJRklFUl9FUlJPUixcbiAgICAgICAgICAgICAgICAgIG1vZGlmaWVyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAnXCJyZXF1aXJlc1wiJyxcbiAgICAgICAgICAgICAgICAgICdcImFycmF5XCInLFxuICAgICAgICAgICAgICAgICAgYFwiJHtTdHJpbmcobW9kaWZpZXIucmVxdWlyZXMpfVwiYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3JlcXVpcmVzSWZFeGlzdHMnOlxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMpKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgZm9ybWF0KFxuICAgICAgICAgICAgICAgICAgSU5WQUxJRF9NT0RJRklFUl9FUlJPUixcbiAgICAgICAgICAgICAgICAgIG1vZGlmaWVyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAnXCJyZXF1aXJlc0lmRXhpc3RzXCInLFxuICAgICAgICAgICAgICAgICAgJ1wiYXJyYXlcIicsXG4gICAgICAgICAgICAgICAgICBgXCIke1N0cmluZyhtb2RpZmllci5yZXF1aXJlc0lmRXhpc3RzKX1cImBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdvcHRpb25zJzpcbiAgICAgICAgICBjYXNlICdkYXRhJzpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBgUG9wcGVySlM6IGFuIGludmFsaWQgcHJvcGVydHkgaGFzIGJlZW4gcHJvdmlkZWQgdG8gdGhlIFwiJHtcbiAgICAgICAgICAgICAgICBtb2RpZmllci5uYW1lXG4gICAgICAgICAgICAgIH1cIiBtb2RpZmllciwgdmFsaWQgcHJvcGVydGllcyBhcmUgJHtWQUxJRF9QUk9QRVJUSUVTLm1hcChcbiAgICAgICAgICAgICAgICAocykgPT4gYFwiJHtzfVwiYFxuICAgICAgICAgICAgICApLmpvaW4oJywgJyl9OyBidXQgXCIke2tleX1cIiB3YXMgcHJvdmlkZWQuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vZGlmaWVyLnJlcXVpcmVzICYmXG4gICAgICAgICAgbW9kaWZpZXIucmVxdWlyZXMuZm9yRWFjaCgocmVxdWlyZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChtb2RpZmllcnMuZmluZCgobW9kKSA9PiBtb2QubmFtZSA9PT0gcmVxdWlyZW1lbnQpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBmb3JtYXQoXG4gICAgICAgICAgICAgICAgICBNSVNTSU5HX0RFUEVOREVOQ1lfRVJST1IsXG4gICAgICAgICAgICAgICAgICBTdHJpbmcobW9kaWZpZXIubmFtZSksXG4gICAgICAgICAgICAgICAgICByZXF1aXJlbWVudCxcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH0pO1xufVxuIiwiLy8gQGZsb3dcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdW5pcXVlQnk8VD4oYXJyOiBBcnJheTxUPiwgZm46IFQgPT4gYW55KTogQXJyYXk8VD4ge1xuICBjb25zdCBpZGVudGlmaWVycyA9IG5ldyBTZXQoKTtcblxuICByZXR1cm4gYXJyLmZpbHRlcihpdGVtID0+IHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gZm4oaXRlbSk7XG5cbiAgICBpZiAoIWlkZW50aWZpZXJzLmhhcyhpZGVudGlmaWVyKSkge1xuICAgICAgaWRlbnRpZmllcnMuYWRkKGlkZW50aWZpZXIpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9KTtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgeyB0eXBlIEJhc2VQbGFjZW1lbnQsIHR5cGUgUGxhY2VtZW50LCBhdXRvIH0gZnJvbSAnLi4vZW51bXMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCYXNlUGxhY2VtZW50KFxuICBwbGFjZW1lbnQ6IFBsYWNlbWVudCB8IHR5cGVvZiBhdXRvXG4pOiBCYXNlUGxhY2VtZW50IHtcbiAgcmV0dXJuIChwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTogYW55KTtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSB7IE1vZGlmaWVyIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZUJ5TmFtZShcbiAgbW9kaWZpZXJzOiBBcnJheTwkU2hhcGU8TW9kaWZpZXI8YW55LCBhbnk+Pj5cbik6IEFycmF5PCRTaGFwZTxNb2RpZmllcjxhbnksIGFueT4+PiB7XG4gIGNvbnN0IG1lcmdlZCA9IG1vZGlmaWVycy5yZWR1Y2UoKG1lcmdlZCwgY3VycmVudCkgPT4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gbWVyZ2VkW2N1cnJlbnQubmFtZV07XG4gICAgbWVyZ2VkW2N1cnJlbnQubmFtZV0gPSBleGlzdGluZ1xuICAgICAgPyB7XG4gICAgICAgICAgLi4uZXhpc3RpbmcsXG4gICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICBvcHRpb25zOiB7IC4uLmV4aXN0aW5nLm9wdGlvbnMsIC4uLmN1cnJlbnQub3B0aW9ucyB9LFxuICAgICAgICAgIGRhdGE6IHsgLi4uZXhpc3RpbmcuZGF0YSwgLi4uY3VycmVudC5kYXRhIH0sXG4gICAgICAgIH1cbiAgICAgIDogY3VycmVudDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9LCB7fSk7XG5cbiAgLy8gSUUxMSBkb2VzIG5vdCBzdXBwb3J0IE9iamVjdC52YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1lcmdlZCkubWFwKGtleSA9PiBtZXJnZWRba2V5XSk7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tICcuL2dldFdpbmRvdyc7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gJy4vZ2V0RG9jdW1lbnRFbGVtZW50JztcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gJy4vZ2V0V2luZG93U2Nyb2xsQmFyWCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZpZXdwb3J0UmVjdChlbGVtZW50OiBFbGVtZW50KSB7XG4gIGNvbnN0IHdpbiA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgY29uc3QgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgY29uc3QgdmlzdWFsVmlld3BvcnQgPSB3aW4udmlzdWFsVmlld3BvcnQ7XG5cbiAgbGV0IHdpZHRoID0gaHRtbC5jbGllbnRXaWR0aDtcbiAgbGV0IGhlaWdodCA9IGh0bWwuY2xpZW50SGVpZ2h0O1xuICBsZXQgeCA9IDA7XG4gIGxldCB5ID0gMDtcblxuICAvLyBOQjogVGhpcyBpc24ndCBzdXBwb3J0ZWQgb24gaU9TIDw9IDEyLiBJZiB0aGUga2V5Ym9hcmQgaXMgb3BlbiwgdGhlIHBvcHBlclxuICAvLyBjYW4gYmUgb2JzY3VyZWQgdW5kZXJuZWF0aCBpdC5cbiAgLy8gQWxzbywgYGh0bWwuY2xpZW50SGVpZ2h0YCBhZGRzIHRoZSBib3R0b20gYmFyIGhlaWdodCBpbiBTYWZhcmkgaU9TLCBldmVuXG4gIC8vIGlmIGl0IGlzbid0IG9wZW4sIHNvIGlmIHRoaXMgaXNuJ3QgYXZhaWxhYmxlLCB0aGUgcG9wcGVyIHdpbGwgYmUgZGV0ZWN0ZWRcbiAgLy8gdG8gb3ZlcmZsb3cgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuIHRvbyBlYXJseS5cbiAgaWYgKHZpc3VhbFZpZXdwb3J0KSB7XG4gICAgd2lkdGggPSB2aXN1YWxWaWV3cG9ydC53aWR0aDtcbiAgICBoZWlnaHQgPSB2aXN1YWxWaWV3cG9ydC5oZWlnaHQ7XG5cbiAgICAvLyBVc2VzIExheW91dCBWaWV3cG9ydCAobGlrZSBDaHJvbWU7IFNhZmFyaSBkb2VzIG5vdCBjdXJyZW50bHkpXG4gICAgLy8gSW4gQ2hyb21lLCBpdCByZXR1cm5zIGEgdmFsdWUgdmVyeSBjbG9zZSB0byAwICgrLy0pIGJ1dCBjb250YWlucyByb3VuZGluZ1xuICAgIC8vIGVycm9ycyBkdWUgdG8gZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgc28gd2UgbmVlZCB0byBjaGVjayBwcmVjaXNpb24uXG4gICAgLy8gU2FmYXJpIHJldHVybnMgYSBudW1iZXIgPD0gMCwgdXN1YWxseSA8IC0xIHdoZW4gcGluY2gtem9vbWVkXG5cbiAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmYWlscyBpbiBtb2JpbGUgZW11bGF0aW9uIG1vZGUgaW4gQ2hyb21lLlxuICAgIC8vIE1hdGguYWJzKHdpbi5pbm5lcldpZHRoIC8gdmlzdWFsVmlld3BvcnQuc2NhbGUgLSB2aXN1YWxWaWV3cG9ydC53aWR0aCkgPFxuICAgIC8vIDAuMDAxXG4gICAgLy8gRmFsbGJhY2sgaGVyZTogXCJOb3QgU2FmYXJpXCIgdXNlckFnZW50XG4gICAgaWYgKCEvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG4gICAgICB4ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdDtcbiAgICAgIHkgPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3A7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgeDogeCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCksXG4gICAgeSxcbiAgfTtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSB7IFJlY3QgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gJy4vZ2V0RG9jdW1lbnRFbGVtZW50JztcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gJy4vZ2V0Q29tcHV0ZWRTdHlsZSc7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tICcuL2dldFdpbmRvd1Njcm9sbEJhclgnO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tICcuL2dldFdpbmRvd1Njcm9sbCc7XG5pbXBvcnQgeyBtYXggfSBmcm9tICcuLi91dGlscy9tYXRoJztcblxuLy8gR2V0cyB0aGUgZW50aXJlIHNpemUgb2YgdGhlIHNjcm9sbGFibGUgZG9jdW1lbnQgYXJlYSwgZXZlbiBleHRlbmRpbmcgb3V0c2lkZVxuLy8gb2YgdGhlIGA8aHRtbD5gIGFuZCBgPGJvZHk+YCByZWN0IGJvdW5kcyBpZiBob3Jpem9udGFsbHkgc2Nyb2xsYWJsZVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRSZWN0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogUmVjdCB7XG4gIGNvbnN0IGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIGNvbnN0IHdpblNjcm9sbCA9IGdldFdpbmRvd1Njcm9sbChlbGVtZW50KTtcbiAgY29uc3QgYm9keSA9IGVsZW1lbnQub3duZXJEb2N1bWVudD8uYm9keTtcblxuICBjb25zdCB3aWR0aCA9IG1heChcbiAgICBodG1sLnNjcm9sbFdpZHRoLFxuICAgIGh0bWwuY2xpZW50V2lkdGgsXG4gICAgYm9keSA/IGJvZHkuc2Nyb2xsV2lkdGggOiAwLFxuICAgIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMFxuICApO1xuICBjb25zdCBoZWlnaHQgPSBtYXgoXG4gICAgaHRtbC5zY3JvbGxIZWlnaHQsXG4gICAgaHRtbC5jbGllbnRIZWlnaHQsXG4gICAgYm9keSA/IGJvZHkuc2Nyb2xsSGVpZ2h0IDogMCxcbiAgICBib2R5ID8gYm9keS5jbGllbnRIZWlnaHQgOiAwXG4gICk7XG5cbiAgbGV0IHggPSAtd2luU2Nyb2xsLnNjcm9sbExlZnQgKyBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpO1xuICBjb25zdCB5ID0gLXdpblNjcm9sbC5zY3JvbGxUb3A7XG5cbiAgaWYgKGdldENvbXB1dGVkU3R5bGUoYm9keSB8fCBodG1sKS5kaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgeCArPSBtYXgoaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuY2xpZW50V2lkdGggOiAwKSAtIHdpZHRoO1xuICB9XG5cbiAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCwgeCwgeSB9O1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB7IGlzU2hhZG93Um9vdCB9IGZyb20gJy4vaW5zdGFuY2VPZic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudDogRWxlbWVudCwgY2hpbGQ6IEVsZW1lbnQpIHtcbiAgY29uc3Qgcm9vdE5vZGUgPSBjaGlsZC5nZXRSb290Tm9kZSAmJiBjaGlsZC5nZXRSb290Tm9kZSgpO1xuXG4gIC8vIEZpcnN0LCBhdHRlbXB0IHdpdGggZmFzdGVyIG5hdGl2ZSBtZXRob2RcbiAgaWYgKHBhcmVudC5jb250YWlucyhjaGlsZCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyB0aGVuIGZhbGxiYWNrIHRvIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiB3aXRoIFNoYWRvdyBET00gc3VwcG9ydFxuICBlbHNlIGlmIChyb290Tm9kZSAmJiBpc1NoYWRvd1Jvb3Qocm9vdE5vZGUpKSB7XG4gICAgbGV0IG5leHQgPSBjaGlsZDtcbiAgICBkbyB7XG4gICAgICBpZiAobmV4dCAmJiBwYXJlbnQuaXNTYW1lTm9kZShuZXh0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXTogbmVlZCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoaXMuLi5cbiAgICAgIG5leHQgPSBuZXh0LnBhcmVudE5vZGUgfHwgbmV4dC5ob3N0O1xuICAgIH0gd2hpbGUgKG5leHQpO1xuICB9XG5cbiAgLy8gR2l2ZSB1cCwgdGhlIHJlc3VsdCBpcyBmYWxzZVxuICByZXR1cm4gZmFsc2U7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBSZWN0LCBDbGllbnRSZWN0T2JqZWN0IH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWN0VG9DbGllbnRSZWN0KHJlY3Q6IFJlY3QpOiBDbGllbnRSZWN0T2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZWN0LFxuICAgIGxlZnQ6IHJlY3QueCxcbiAgICB0b3A6IHJlY3QueSxcbiAgICByaWdodDogcmVjdC54ICsgcmVjdC53aWR0aCxcbiAgICBib3R0b206IHJlY3QueSArIHJlY3QuaGVpZ2h0LFxuICB9O1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIHsgQ2xpZW50UmVjdE9iamVjdCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQm91bmRhcnksIFJvb3RCb3VuZGFyeSB9IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCB7IHZpZXdwb3J0IH0gZnJvbSAnLi4vZW51bXMnO1xuaW1wb3J0IGdldFZpZXdwb3J0UmVjdCBmcm9tICcuL2dldFZpZXdwb3J0UmVjdCc7XG5pbXBvcnQgZ2V0RG9jdW1lbnRSZWN0IGZyb20gJy4vZ2V0RG9jdW1lbnRSZWN0JztcbmltcG9ydCBsaXN0U2Nyb2xsUGFyZW50cyBmcm9tICcuL2xpc3RTY3JvbGxQYXJlbnRzJztcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSAnLi9nZXRPZmZzZXRQYXJlbnQnO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tICcuL2dldERvY3VtZW50RWxlbWVudCc7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tICcuL2dldENvbXB1dGVkU3R5bGUnO1xuaW1wb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50IH0gZnJvbSAnLi9pbnN0YW5jZU9mJztcbmltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSAnLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QnO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSAnLi9nZXRQYXJlbnROb2RlJztcbmltcG9ydCBjb250YWlucyBmcm9tICcuL2NvbnRhaW5zJztcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tICcuL2dldE5vZGVOYW1lJztcbmltcG9ydCByZWN0VG9DbGllbnRSZWN0IGZyb20gJy4uL3V0aWxzL3JlY3RUb0NsaWVudFJlY3QnO1xuaW1wb3J0IHsgbWF4LCBtaW4gfSBmcm9tICcuLi91dGlscy9tYXRoJztcblxuZnVuY3Rpb24gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudDogRWxlbWVudCkge1xuICBjb25zdCByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpO1xuXG4gIHJlY3QudG9wID0gcmVjdC50b3AgKyBlbGVtZW50LmNsaWVudFRvcDtcbiAgcmVjdC5sZWZ0ID0gcmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0O1xuICByZWN0LmJvdHRvbSA9IHJlY3QudG9wICsgZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudFdpZHRoO1xuICByZWN0LndpZHRoID0gZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgcmVjdC5oZWlnaHQgPSBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmVjdC54ID0gcmVjdC5sZWZ0O1xuICByZWN0LnkgPSByZWN0LnRvcDtcblxuICByZXR1cm4gcmVjdDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoXG4gIGVsZW1lbnQ6IEVsZW1lbnQsXG4gIGNsaXBwaW5nUGFyZW50OiBFbGVtZW50IHwgUm9vdEJvdW5kYXJ5XG4pOiBDbGllbnRSZWN0T2JqZWN0IHtcbiAgcmV0dXJuIGNsaXBwaW5nUGFyZW50ID09PSB2aWV3cG9ydFxuICAgID8gcmVjdFRvQ2xpZW50UmVjdChnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCkpXG4gICAgOiBpc0VsZW1lbnQoY2xpcHBpbmdQYXJlbnQpXG4gICAgPyBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChjbGlwcGluZ1BhcmVudClcbiAgICA6IHJlY3RUb0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkpO1xufVxuXG4vLyBBIFwiY2xpcHBpbmcgcGFyZW50XCIgaXMgYW4gb3ZlcmZsb3dhYmxlIGNvbnRhaW5lciB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpYyBvZlxuLy8gY2xpcHBpbmcgKG9yIGhpZGluZykgb3ZlcmZsb3dpbmcgZWxlbWVudHMgd2l0aCBhIHBvc2l0aW9uIGRpZmZlcmVudCBmcm9tXG4vLyBgaW5pdGlhbGBcbmZ1bmN0aW9uIGdldENsaXBwaW5nUGFyZW50cyhlbGVtZW50OiBFbGVtZW50KTogQXJyYXk8RWxlbWVudD4ge1xuICBjb25zdCBjbGlwcGluZ1BhcmVudHMgPSBsaXN0U2Nyb2xsUGFyZW50cyhnZXRQYXJlbnROb2RlKGVsZW1lbnQpKTtcbiAgY29uc3QgY2FuRXNjYXBlQ2xpcHBpbmcgPVxuICAgIFsnYWJzb2x1dGUnLCAnZml4ZWQnXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24pID49IDA7XG4gIGNvbnN0IGNsaXBwZXJFbGVtZW50ID1cbiAgICBjYW5Fc2NhcGVDbGlwcGluZyAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpXG4gICAgICA/IGdldE9mZnNldFBhcmVudChlbGVtZW50KVxuICAgICAgOiBlbGVtZW50O1xuXG4gIGlmICghaXNFbGVtZW50KGNsaXBwZXJFbGVtZW50KSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8xNDE0XG4gIHJldHVybiBjbGlwcGluZ1BhcmVudHMuZmlsdGVyKFxuICAgIChjbGlwcGluZ1BhcmVudCkgPT5cbiAgICAgIGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkgJiZcbiAgICAgIGNvbnRhaW5zKGNsaXBwaW5nUGFyZW50LCBjbGlwcGVyRWxlbWVudCkgJiZcbiAgICAgIGdldE5vZGVOYW1lKGNsaXBwaW5nUGFyZW50KSAhPT0gJ2JvZHknXG4gICk7XG59XG5cbi8vIEdldHMgdGhlIG1heGltdW0gYXJlYSB0aGF0IHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gZHVlIHRvIGFueSBudW1iZXIgb2Zcbi8vIGNsaXBwaW5nIHBhcmVudHNcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENsaXBwaW5nUmVjdChcbiAgZWxlbWVudDogRWxlbWVudCxcbiAgYm91bmRhcnk6IEJvdW5kYXJ5LFxuICByb290Qm91bmRhcnk6IFJvb3RCb3VuZGFyeVxuKTogQ2xpZW50UmVjdE9iamVjdCB7XG4gIGNvbnN0IG1haW5DbGlwcGluZ1BhcmVudHMgPVxuICAgIGJvdW5kYXJ5ID09PSAnY2xpcHBpbmdQYXJlbnRzJ1xuICAgICAgPyBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudClcbiAgICAgIDogW10uY29uY2F0KGJvdW5kYXJ5KTtcbiAgY29uc3QgY2xpcHBpbmdQYXJlbnRzID0gWy4uLm1haW5DbGlwcGluZ1BhcmVudHMsIHJvb3RCb3VuZGFyeV07XG4gIGNvbnN0IGZpcnN0Q2xpcHBpbmdQYXJlbnQgPSBjbGlwcGluZ1BhcmVudHNbMF07XG5cbiAgY29uc3QgY2xpcHBpbmdSZWN0ID0gY2xpcHBpbmdQYXJlbnRzLnJlZHVjZSgoYWNjUmVjdCwgY2xpcHBpbmdQYXJlbnQpID0+IHtcbiAgICBjb25zdCByZWN0ID0gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQpO1xuXG4gICAgYWNjUmVjdC50b3AgPSBtYXgocmVjdC50b3AsIGFjY1JlY3QudG9wKTtcbiAgICBhY2NSZWN0LnJpZ2h0ID0gbWluKHJlY3QucmlnaHQsIGFjY1JlY3QucmlnaHQpO1xuICAgIGFjY1JlY3QuYm90dG9tID0gbWluKHJlY3QuYm90dG9tLCBhY2NSZWN0LmJvdHRvbSk7XG4gICAgYWNjUmVjdC5sZWZ0ID0gbWF4KHJlY3QubGVmdCwgYWNjUmVjdC5sZWZ0KTtcblxuICAgIHJldHVybiBhY2NSZWN0O1xuICB9LCBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBmaXJzdENsaXBwaW5nUGFyZW50KSk7XG5cbiAgY2xpcHBpbmdSZWN0LndpZHRoID0gY2xpcHBpbmdSZWN0LnJpZ2h0IC0gY2xpcHBpbmdSZWN0LmxlZnQ7XG4gIGNsaXBwaW5nUmVjdC5oZWlnaHQgPSBjbGlwcGluZ1JlY3QuYm90dG9tIC0gY2xpcHBpbmdSZWN0LnRvcDtcbiAgY2xpcHBpbmdSZWN0LnggPSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LnkgPSBjbGlwcGluZ1JlY3QudG9wO1xuXG4gIHJldHVybiBjbGlwcGluZ1JlY3Q7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHsgdHlwZSBWYXJpYXRpb24sIHR5cGUgUGxhY2VtZW50IH0gZnJvbSAnLi4vZW51bXMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWYXJpYXRpb24ocGxhY2VtZW50OiBQbGFjZW1lbnQpOiA/VmFyaWF0aW9uIHtcbiAgcmV0dXJuIChwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTogYW55KTtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSB7IFBsYWNlbWVudCB9IGZyb20gJy4uL2VudW1zJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KFxuICBwbGFjZW1lbnQ6IFBsYWNlbWVudFxuKTogJ3gnIHwgJ3knIHtcbiAgcmV0dXJuIFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSA+PSAwID8gJ3gnIDogJ3knO1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gJy4vZ2V0QmFzZVBsYWNlbWVudCc7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gJy4vZ2V0VmFyaWF0aW9uJztcbmltcG9ydCBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQgZnJvbSAnLi9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQnO1xuaW1wb3J0IHR5cGUge1xuICBSZWN0LFxuICBQb3NpdGlvbmluZ1N0cmF0ZWd5LFxuICBPZmZzZXRzLFxuICBDbGllbnRSZWN0T2JqZWN0LFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHN0YXJ0LCBlbmQsIHR5cGUgUGxhY2VtZW50IH0gZnJvbSAnLi4vZW51bXMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlT2Zmc2V0cyh7XG4gIHJlZmVyZW5jZSxcbiAgZWxlbWVudCxcbiAgcGxhY2VtZW50LFxufToge1xuICByZWZlcmVuY2U6IFJlY3QgfCBDbGllbnRSZWN0T2JqZWN0LFxuICBlbGVtZW50OiBSZWN0IHwgQ2xpZW50UmVjdE9iamVjdCxcbiAgc3RyYXRlZ3k6IFBvc2l0aW9uaW5nU3RyYXRlZ3ksXG4gIHBsYWNlbWVudD86IFBsYWNlbWVudCxcbn0pOiBPZmZzZXRzIHtcbiAgY29uc3QgYmFzZVBsYWNlbWVudCA9IHBsYWNlbWVudCA/IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSA6IG51bGw7XG4gIGNvbnN0IHZhcmlhdGlvbiA9IHBsYWNlbWVudCA/IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIDogbnVsbDtcbiAgY29uc3QgY29tbW9uWCA9IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoIC8gMiAtIGVsZW1lbnQud2lkdGggLyAyO1xuICBjb25zdCBjb21tb25ZID0gcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0IC8gMiAtIGVsZW1lbnQuaGVpZ2h0IC8gMjtcblxuICBsZXQgb2Zmc2V0cztcbiAgc3dpdGNoIChiYXNlUGxhY2VtZW50KSB7XG4gICAgY2FzZSB0b3A6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSAtIGVsZW1lbnQuaGVpZ2h0LFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgYm90dG9tOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0LFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgcmlnaHQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWSxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlIGxlZnQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCAtIGVsZW1lbnQud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vblksXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54LFxuICAgICAgICB5OiByZWZlcmVuY2UueSxcbiAgICAgIH07XG4gIH1cblxuICBjb25zdCBtYWluQXhpcyA9IGJhc2VQbGFjZW1lbnRcbiAgICA/IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KVxuICAgIDogbnVsbDtcblxuICBpZiAobWFpbkF4aXMgIT0gbnVsbCkge1xuICAgIGNvbnN0IGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICBzd2l0Y2ggKHZhcmlhdGlvbikge1xuICAgICAgY2FzZSBzdGFydDpcbiAgICAgICAgb2Zmc2V0c1ttYWluQXhpc10gPVxuICAgICAgICAgIG9mZnNldHNbbWFpbkF4aXNdIC0gKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgZW5kOlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9XG4gICAgICAgICAgb2Zmc2V0c1ttYWluQXhpc10gKyAocmVmZXJlbmNlW2xlbl0gLyAyIC0gZWxlbWVudFtsZW5dIC8gMik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0cztcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSB7IFNpZGVPYmplY3QgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEZyZXNoU2lkZU9iamVjdCgpOiBTaWRlT2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIGxlZnQ6IDAsXG4gIH07XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBTaWRlT2JqZWN0IH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGdldEZyZXNoU2lkZU9iamVjdCBmcm9tICcuL2dldEZyZXNoU2lkZU9iamVjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlUGFkZGluZ09iamVjdChcbiAgcGFkZGluZ09iamVjdDogJFNoYXBlPFNpZGVPYmplY3Q+XG4pOiBTaWRlT2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRGcmVzaFNpZGVPYmplY3QoKSxcbiAgICAuLi5wYWRkaW5nT2JqZWN0LFxuICB9O1xufVxuIiwiLy8gQGZsb3dcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhwYW5kVG9IYXNoTWFwPFxuICBUOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuLFxuICBLOiBzdHJpbmdcbj4odmFsdWU6IFQsIGtleXM6IEFycmF5PEs+KTogeyBba2V5OiBzdHJpbmddOiBUIH0ge1xuICByZXR1cm4ga2V5cy5yZWR1Y2UoKGhhc2hNYXAsIGtleSkgPT4ge1xuICAgIGhhc2hNYXBba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiBoYXNoTWFwO1xuICB9LCB7fSk7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBTdGF0ZSwgU2lkZU9iamVjdCwgUGFkZGluZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgUGxhY2VtZW50LCBCb3VuZGFyeSwgUm9vdEJvdW5kYXJ5LCBDb250ZXh0IH0gZnJvbSAnLi4vZW51bXMnO1xuaW1wb3J0IGdldENsaXBwaW5nUmVjdCBmcm9tICcuLi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0JztcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSAnLi4vZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudCc7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gJy4uL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QnO1xuaW1wb3J0IGNvbXB1dGVPZmZzZXRzIGZyb20gJy4vY29tcHV0ZU9mZnNldHMnO1xuaW1wb3J0IHJlY3RUb0NsaWVudFJlY3QgZnJvbSAnLi9yZWN0VG9DbGllbnRSZWN0JztcbmltcG9ydCB7XG4gIGNsaXBwaW5nUGFyZW50cyxcbiAgcmVmZXJlbmNlLFxuICBwb3BwZXIsXG4gIGJvdHRvbSxcbiAgdG9wLFxuICByaWdodCxcbiAgYmFzZVBsYWNlbWVudHMsXG4gIHZpZXdwb3J0LFxufSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tICcuLi9kb20tdXRpbHMvaW5zdGFuY2VPZic7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gJy4vbWVyZ2VQYWRkaW5nT2JqZWN0JztcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSAnLi9leHBhbmRUb0hhc2hNYXAnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5leHBvcnQgdHlwZSBPcHRpb25zID0ge1xuICBwbGFjZW1lbnQ6IFBsYWNlbWVudCxcbiAgYm91bmRhcnk6IEJvdW5kYXJ5LFxuICByb290Qm91bmRhcnk6IFJvb3RCb3VuZGFyeSxcbiAgZWxlbWVudENvbnRleHQ6IENvbnRleHQsXG4gIGFsdEJvdW5kYXJ5OiBib29sZWFuLFxuICBwYWRkaW5nOiBQYWRkaW5nLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGV0ZWN0T3ZlcmZsb3coXG4gIHN0YXRlOiBTdGF0ZSxcbiAgb3B0aW9uczogJFNoYXBlPE9wdGlvbnM+ID0ge31cbik6IFNpZGVPYmplY3Qge1xuICBjb25zdCB7XG4gICAgcGxhY2VtZW50ID0gc3RhdGUucGxhY2VtZW50LFxuICAgIGJvdW5kYXJ5ID0gY2xpcHBpbmdQYXJlbnRzLFxuICAgIHJvb3RCb3VuZGFyeSA9IHZpZXdwb3J0LFxuICAgIGVsZW1lbnRDb250ZXh0ID0gcG9wcGVyLFxuICAgIGFsdEJvdW5kYXJ5ID0gZmFsc2UsXG4gICAgcGFkZGluZyA9IDAsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IHBhZGRpbmdPYmplY3QgPSBtZXJnZVBhZGRpbmdPYmplY3QoXG4gICAgdHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInXG4gICAgICA/IHBhZGRpbmdcbiAgICAgIDogZXhwYW5kVG9IYXNoTWFwKHBhZGRpbmcsIGJhc2VQbGFjZW1lbnRzKVxuICApO1xuXG4gIGNvbnN0IGFsdENvbnRleHQgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcmVmZXJlbmNlIDogcG9wcGVyO1xuXG4gIGNvbnN0IHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIGNvbnN0IGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1thbHRCb3VuZGFyeSA/IGFsdENvbnRleHQgOiBlbGVtZW50Q29udGV4dF07XG5cbiAgY29uc3QgY2xpcHBpbmdDbGllbnRSZWN0ID0gZ2V0Q2xpcHBpbmdSZWN0KFxuICAgIGlzRWxlbWVudChlbGVtZW50KVxuICAgICAgPyBlbGVtZW50XG4gICAgICA6IGVsZW1lbnQuY29udGV4dEVsZW1lbnQgfHwgZ2V0RG9jdW1lbnRFbGVtZW50KHN0YXRlLmVsZW1lbnRzLnBvcHBlciksXG4gICAgYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5XG4gICk7XG5cbiAgY29uc3QgcmVmZXJlbmNlQ2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChzdGF0ZS5lbGVtZW50cy5yZWZlcmVuY2UpO1xuXG4gIGNvbnN0IHBvcHBlck9mZnNldHMgPSBjb21wdXRlT2Zmc2V0cyh7XG4gICAgcmVmZXJlbmNlOiByZWZlcmVuY2VDbGllbnRSZWN0LFxuICAgIGVsZW1lbnQ6IHBvcHBlclJlY3QsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50LFxuICB9KTtcblxuICBjb25zdCBwb3BwZXJDbGllbnRSZWN0ID0gcmVjdFRvQ2xpZW50UmVjdCh7XG4gICAgLi4ucG9wcGVyUmVjdCxcbiAgICAuLi5wb3BwZXJPZmZzZXRzLFxuICB9KTtcblxuICBjb25zdCBlbGVtZW50Q2xpZW50UmVjdCA9XG4gICAgZWxlbWVudENvbnRleHQgPT09IHBvcHBlciA/IHBvcHBlckNsaWVudFJlY3QgOiByZWZlcmVuY2VDbGllbnRSZWN0O1xuXG4gIC8vIHBvc2l0aXZlID0gb3ZlcmZsb3dpbmcgdGhlIGNsaXBwaW5nIHJlY3RcbiAgLy8gMCBvciBuZWdhdGl2ZSA9IHdpdGhpbiB0aGUgY2xpcHBpbmcgcmVjdFxuICBjb25zdCBvdmVyZmxvd09mZnNldHMgPSB7XG4gICAgdG9wOiBjbGlwcGluZ0NsaWVudFJlY3QudG9wIC0gZWxlbWVudENsaWVudFJlY3QudG9wICsgcGFkZGluZ09iamVjdC50b3AsXG4gICAgYm90dG9tOlxuICAgICAgZWxlbWVudENsaWVudFJlY3QuYm90dG9tIC1cbiAgICAgIGNsaXBwaW5nQ2xpZW50UmVjdC5ib3R0b20gK1xuICAgICAgcGFkZGluZ09iamVjdC5ib3R0b20sXG4gICAgbGVmdDogY2xpcHBpbmdDbGllbnRSZWN0LmxlZnQgLSBlbGVtZW50Q2xpZW50UmVjdC5sZWZ0ICsgcGFkZGluZ09iamVjdC5sZWZ0LFxuICAgIHJpZ2h0OlxuICAgICAgZWxlbWVudENsaWVudFJlY3QucmlnaHQgLSBjbGlwcGluZ0NsaWVudFJlY3QucmlnaHQgKyBwYWRkaW5nT2JqZWN0LnJpZ2h0LFxuICB9O1xuXG4gIGNvbnN0IG9mZnNldERhdGEgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldDtcblxuICAvLyBPZmZzZXRzIGNhbiBiZSBhcHBsaWVkIG9ubHkgdG8gdGhlIHBvcHBlciBlbGVtZW50XG4gIGlmIChlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyICYmIG9mZnNldERhdGEpIHtcbiAgICBjb25zdCBvZmZzZXQgPSBvZmZzZXREYXRhW3BsYWNlbWVudF07XG5cbiAgICBPYmplY3Qua2V5cyhvdmVyZmxvd09mZnNldHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgbXVsdGlwbHkgPSBbcmlnaHQsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAxIDogLTE7XG4gICAgICBjb25zdCBheGlzID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKGtleSkgPj0gMCA/ICd5JyA6ICd4JztcbiAgICAgIG92ZXJmbG93T2Zmc2V0c1trZXldICs9IG9mZnNldFtheGlzXSAqIG11bHRpcGx5O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG92ZXJmbG93T2Zmc2V0cztcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSB7XG4gIFN0YXRlLFxuICBPcHRpb25zR2VuZXJpYyxcbiAgTW9kaWZpZXIsXG4gIEluc3RhbmNlLFxuICBWaXJ0dWFsRWxlbWVudCxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgZ2V0Q29tcG9zaXRlUmVjdCBmcm9tICcuL2RvbS11dGlscy9nZXRDb21wb3NpdGVSZWN0JztcbmltcG9ydCBnZXRMYXlvdXRSZWN0IGZyb20gJy4vZG9tLXV0aWxzL2dldExheW91dFJlY3QnO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gJy4vZG9tLXV0aWxzL2xpc3RTY3JvbGxQYXJlbnRzJztcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSAnLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50JztcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gJy4vZG9tLXV0aWxzL2dldENvbXB1dGVkU3R5bGUnO1xuaW1wb3J0IG9yZGVyTW9kaWZpZXJzIGZyb20gJy4vdXRpbHMvb3JkZXJNb2RpZmllcnMnO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJy4vdXRpbHMvZGVib3VuY2UnO1xuaW1wb3J0IHZhbGlkYXRlTW9kaWZpZXJzIGZyb20gJy4vdXRpbHMvdmFsaWRhdGVNb2RpZmllcnMnO1xuaW1wb3J0IHVuaXF1ZUJ5IGZyb20gJy4vdXRpbHMvdW5pcXVlQnknO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSAnLi91dGlscy9nZXRCYXNlUGxhY2VtZW50JztcbmltcG9ydCBtZXJnZUJ5TmFtZSBmcm9tICcuL3V0aWxzL21lcmdlQnlOYW1lJztcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tICcuL3V0aWxzL2RldGVjdE92ZXJmbG93JztcbmltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gJy4vZG9tLXV0aWxzL2luc3RhbmNlT2YnO1xuaW1wb3J0IHsgYXV0byB9IGZyb20gJy4vZW51bXMnO1xuXG5jb25zdCBJTlZBTElEX0VMRU1FTlRfRVJST1IgPVxuICAnUG9wcGVyOiBJbnZhbGlkIHJlZmVyZW5jZSBvciBwb3BwZXIgYXJndW1lbnQgcHJvdmlkZWQuIFRoZXkgbXVzdCBiZSBlaXRoZXIgYSBET00gZWxlbWVudCBvciB2aXJ0dWFsIGVsZW1lbnQuJztcbmNvbnN0IElORklOSVRFX0xPT1BfRVJST1IgPVxuICAnUG9wcGVyOiBBbiBpbmZpbml0ZSBsb29wIGluIHRoZSBtb2RpZmllcnMgY3ljbGUgaGFzIGJlZW4gZGV0ZWN0ZWQhIFRoZSBjeWNsZSBoYXMgYmVlbiBpbnRlcnJ1cHRlZCB0byBwcmV2ZW50IGEgYnJvd3NlciBjcmFzaC4nO1xuXG5jb25zdCBERUZBVUxUX09QVElPTlM6IE9wdGlvbnNHZW5lcmljPGFueT4gPSB7XG4gIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gIG1vZGlmaWVyczogW10sXG4gIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxufTtcblxudHlwZSBQb3BwZXJHZW5lcmF0b3JBcmdzID0ge1xuICBkZWZhdWx0TW9kaWZpZXJzPzogQXJyYXk8TW9kaWZpZXI8YW55LCBhbnk+PixcbiAgZGVmYXVsdE9wdGlvbnM/OiAkU2hhcGU8T3B0aW9uc0dlbmVyaWM8YW55Pj4sXG59O1xuXG5mdW5jdGlvbiBhcmVWYWxpZEVsZW1lbnRzKC4uLmFyZ3M6IEFycmF5PGFueT4pOiBib29sZWFuIHtcbiAgcmV0dXJuICFhcmdzLnNvbWUoXG4gICAgKGVsZW1lbnQpID0+XG4gICAgICAhKGVsZW1lbnQgJiYgdHlwZW9mIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID09PSAnZnVuY3Rpb24nKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9wcGVyR2VuZXJhdG9yKGdlbmVyYXRvck9wdGlvbnM6IFBvcHBlckdlbmVyYXRvckFyZ3MgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZGVmYXVsdE1vZGlmaWVycyA9IFtdLFxuICAgIGRlZmF1bHRPcHRpb25zID0gREVGQVVMVF9PUFRJT05TLFxuICB9ID0gZ2VuZXJhdG9yT3B0aW9ucztcblxuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlUG9wcGVyPFRNb2RpZmllcjogJFNoYXBlPE1vZGlmaWVyPGFueSwgYW55Pj4+KFxuICAgIHJlZmVyZW5jZTogRWxlbWVudCB8IFZpcnR1YWxFbGVtZW50LFxuICAgIHBvcHBlcjogSFRNTEVsZW1lbnQsXG4gICAgb3B0aW9uczogJFNoYXBlPE9wdGlvbnNHZW5lcmljPFRNb2RpZmllcj4+ID0gZGVmYXVsdE9wdGlvbnNcbiAgKTogSW5zdGFuY2Uge1xuICAgIGxldCBzdGF0ZTogJFNoYXBlPFN0YXRlPiA9IHtcbiAgICAgIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gICAgICBvcmRlcmVkTW9kaWZpZXJzOiBbXSxcbiAgICAgIG9wdGlvbnM6IHsgLi4uREVGQVVMVF9PUFRJT05TLCAuLi5kZWZhdWx0T3B0aW9ucyB9LFxuICAgICAgbW9kaWZpZXJzRGF0YToge30sXG4gICAgICBlbGVtZW50czoge1xuICAgICAgICByZWZlcmVuY2UsXG4gICAgICAgIHBvcHBlcixcbiAgICAgIH0sXG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIHN0eWxlczoge30sXG4gICAgfTtcblxuICAgIGxldCBlZmZlY3RDbGVhbnVwRm5zOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuICAgIGxldCBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgaW5zdGFuY2UgPSB7XG4gICAgICBzdGF0ZSxcbiAgICAgIHNldE9wdGlvbnMoc2V0T3B0aW9uc0FjdGlvbikge1xuICAgICAgICBjb25zdCBvcHRpb25zID1cbiAgICAgICAgICB0eXBlb2Ygc2V0T3B0aW9uc0FjdGlvbiA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBzZXRPcHRpb25zQWN0aW9uKHN0YXRlLm9wdGlvbnMpXG4gICAgICAgICAgICA6IHNldE9wdGlvbnNBY3Rpb247XG5cbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuXG4gICAgICAgIHN0YXRlLm9wdGlvbnMgPSB7XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZVtleHBvbmVudGlhbC1zcHJlYWRdXG4gICAgICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgLi4uc3RhdGUub3B0aW9ucyxcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9O1xuXG4gICAgICAgIHN0YXRlLnNjcm9sbFBhcmVudHMgPSB7XG4gICAgICAgICAgcmVmZXJlbmNlOiBpc0VsZW1lbnQocmVmZXJlbmNlKVxuICAgICAgICAgICAgPyBsaXN0U2Nyb2xsUGFyZW50cyhyZWZlcmVuY2UpXG4gICAgICAgICAgICA6IHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudFxuICAgICAgICAgICAgPyBsaXN0U2Nyb2xsUGFyZW50cyhyZWZlcmVuY2UuY29udGV4dEVsZW1lbnQpXG4gICAgICAgICAgICA6IFtdLFxuICAgICAgICAgIHBvcHBlcjogbGlzdFNjcm9sbFBhcmVudHMocG9wcGVyKSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBPcmRlcnMgdGhlIG1vZGlmaWVycyBiYXNlZCBvbiB0aGVpciBkZXBlbmRlbmNpZXMgYW5kIGBwaGFzZWBcbiAgICAgICAgLy8gcHJvcGVydGllc1xuICAgICAgICBjb25zdCBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXJNb2RpZmllcnMoXG4gICAgICAgICAgbWVyZ2VCeU5hbWUoWy4uLmRlZmF1bHRNb2RpZmllcnMsIC4uLnN0YXRlLm9wdGlvbnMubW9kaWZpZXJzXSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBTdHJpcCBvdXQgZGlzYWJsZWQgbW9kaWZpZXJzXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcigobSkgPT4gbS5lbmFibGVkKTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgcHJvdmlkZWQgbW9kaWZpZXJzIHNvIHRoYXQgdGhlIGNvbnN1bWVyIHdpbGwgZ2V0IHdhcm5lZFxuICAgICAgICAvLyBpZiBvbmUgb2YgdGhlIG1vZGlmaWVycyBpcyBpbnZhbGlkIGZvciBhbnkgcmVhc29uXG4gICAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgY29uc3QgbW9kaWZpZXJzID0gdW5pcXVlQnkoXG4gICAgICAgICAgICBbLi4ub3JkZXJlZE1vZGlmaWVycywgLi4uc3RhdGUub3B0aW9ucy5tb2RpZmllcnNdLFxuICAgICAgICAgICAgKHsgbmFtZSB9KSA9PiBuYW1lXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHZhbGlkYXRlTW9kaWZpZXJzKG1vZGlmaWVycyk7XG5cbiAgICAgICAgICBpZiAoZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5vcHRpb25zLnBsYWNlbWVudCkgPT09IGF1dG8pIHtcbiAgICAgICAgICAgIGNvbnN0IGZsaXBNb2RpZmllciA9IHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZmluZChcbiAgICAgICAgICAgICAgKHsgbmFtZSB9KSA9PiBuYW1lID09PSAnZmxpcCdcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmICghZmxpcE1vZGlmaWVyKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgJ1BvcHBlcjogXCJhdXRvXCIgcGxhY2VtZW50cyByZXF1aXJlIHRoZSBcImZsaXBcIiBtb2RpZmllciBiZScsXG4gICAgICAgICAgICAgICAgICAncHJlc2VudCBhbmQgZW5hYmxlZCB0byB3b3JrLicsXG4gICAgICAgICAgICAgICAgXS5qb2luKCcgJylcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBtYXJnaW5Ub3AsXG4gICAgICAgICAgICBtYXJnaW5SaWdodCxcbiAgICAgICAgICAgIG1hcmdpbkJvdHRvbSxcbiAgICAgICAgICAgIG1hcmdpbkxlZnQsXG4gICAgICAgICAgfSA9IGdldENvbXB1dGVkU3R5bGUocG9wcGVyKTtcblxuICAgICAgICAgIC8vIFdlIG5vIGxvbmdlciB0YWtlIGludG8gYWNjb3VudCBgbWFyZ2luc2Agb24gdGhlIHBvcHBlciwgYW5kIGl0IGNhblxuICAgICAgICAgIC8vIGNhdXNlIGJ1Z3Mgd2l0aCBwb3NpdGlvbmluZywgc28gd2UnbGwgd2FybiB0aGUgY29uc3VtZXJcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBbbWFyZ2luVG9wLCBtYXJnaW5SaWdodCwgbWFyZ2luQm90dG9tLCBtYXJnaW5MZWZ0XS5zb21lKChtYXJnaW4pID0+XG4gICAgICAgICAgICAgIHBhcnNlRmxvYXQobWFyZ2luKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgJ1BvcHBlcjogQ1NTIFwibWFyZ2luXCIgc3R5bGVzIGNhbm5vdCBiZSB1c2VkIHRvIGFwcGx5IHBhZGRpbmcnLFxuICAgICAgICAgICAgICAgICdiZXR3ZWVuIHRoZSBwb3BwZXIgYW5kIGl0cyByZWZlcmVuY2UgZWxlbWVudCBvciBib3VuZGFyeS4nLFxuICAgICAgICAgICAgICAgICdUbyByZXBsaWNhdGUgbWFyZ2luLCB1c2UgdGhlIGBvZmZzZXRgIG1vZGlmaWVyLCBhcyB3ZWxsIGFzJyxcbiAgICAgICAgICAgICAgICAndGhlIGBwYWRkaW5nYCBvcHRpb24gaW4gdGhlIGBwcmV2ZW50T3ZlcmZsb3dgIGFuZCBgZmxpcGAnLFxuICAgICAgICAgICAgICAgICdtb2RpZmllcnMuJyxcbiAgICAgICAgICAgICAgXS5qb2luKCcgJylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcnVuTW9kaWZpZXJFZmZlY3RzKCk7XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgfSxcblxuICAgICAgLy8gU3luYyB1cGRhdGUg4oCTIGl0IHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkLCBldmVuIGlmIG5vdCBuZWNlc3NhcnkuIFRoaXNcbiAgICAgIC8vIGlzIHVzZWZ1bCBmb3IgbG93IGZyZXF1ZW5jeSB1cGRhdGVzIHdoZXJlIHN5bmMgYmVoYXZpb3Igc2ltcGxpZmllcyB0aGVcbiAgICAgIC8vIGxvZ2ljLlxuICAgICAgLy8gRm9yIGhpZ2ggZnJlcXVlbmN5IHVwZGF0ZXMgKGUuZy4gYHJlc2l6ZWAgYW5kIGBzY3JvbGxgIGV2ZW50cyksIGFsd2F5c1xuICAgICAgLy8gcHJlZmVyIHRoZSBhc3luYyBQb3BwZXIjdXBkYXRlIG1ldGhvZFxuICAgICAgZm9yY2VVcGRhdGUoKSB7XG4gICAgICAgIGlmIChpc0Rlc3Ryb3llZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgcmVmZXJlbmNlLCBwb3BwZXIgfSA9IHN0YXRlLmVsZW1lbnRzO1xuXG4gICAgICAgIC8vIERvbid0IHByb2NlZWQgaWYgYHJlZmVyZW5jZWAgb3IgYHBvcHBlcmAgYXJlIG5vdCB2YWxpZCBlbGVtZW50c1xuICAgICAgICAvLyBhbnltb3JlXG4gICAgICAgIGlmICghYXJlVmFsaWRFbGVtZW50cyhyZWZlcmVuY2UsIHBvcHBlcikpIHtcbiAgICAgICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihJTlZBTElEX0VMRU1FTlRfRVJST1IpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSB0aGUgcmVmZXJlbmNlIGFuZCBwb3BwZXIgcmVjdHMgdG8gYmUgcmVhZCBieSBtb2RpZmllcnNcbiAgICAgICAgc3RhdGUucmVjdHMgPSB7XG4gICAgICAgICAgcmVmZXJlbmNlOiBnZXRDb21wb3NpdGVSZWN0KFxuICAgICAgICAgICAgcmVmZXJlbmNlLFxuICAgICAgICAgICAgZ2V0T2Zmc2V0UGFyZW50KHBvcHBlciksXG4gICAgICAgICAgICBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnXG4gICAgICAgICAgKSxcbiAgICAgICAgICBwb3BwZXI6IGdldExheW91dFJlY3QocG9wcGVyKSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byByZXNldCB0aGUgY3VycmVudCB1cGRhdGUgY3ljbGUuIFRoZVxuICAgICAgICAvLyBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0aGUgYGZsaXBgIG1vZGlmaWVyIGNoYW5naW5nIHRoZVxuICAgICAgICAvLyBwbGFjZW1lbnQsIHdoaWNoIHRoZW4gbmVlZHMgdG8gcmUtcnVuIGFsbCB0aGUgbW9kaWZpZXJzLCBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBsb2dpYyB3YXMgcHJldmlvdXNseSByYW4gZm9yIHRoZSBwcmV2aW91cyBwbGFjZW1lbnQgYW5kIGlzIHRoZXJlZm9yZVxuICAgICAgICAvLyBzdGFsZS9pbmNvcnJlY3RcbiAgICAgICAgc3RhdGUucmVzZXQgPSBmYWxzZTtcblxuICAgICAgICBzdGF0ZS5wbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDtcblxuICAgICAgICAvLyBPbiBlYWNoIHVwZGF0ZSBjeWNsZSwgdGhlIGBtb2RpZmllcnNEYXRhYCBwcm9wZXJ0eSBmb3IgZWFjaCBtb2RpZmllclxuICAgICAgICAvLyBpcyBmaWxsZWQgd2l0aCB0aGUgaW5pdGlhbCBkYXRhIHNwZWNpZmllZCBieSB0aGUgbW9kaWZpZXIuIFRoaXMgbWVhbnNcbiAgICAgICAgLy8gaXQgZG9lc24ndCBwZXJzaXN0IGFuZCBpcyBmcmVzaCBvbiBlYWNoIHVwZGF0ZS5cbiAgICAgICAgLy8gVG8gZW5zdXJlIHBlcnNpc3RlbnQgZGF0YSwgdXNlIGAke25hbWV9I3BlcnNpc3RlbnRgXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChcbiAgICAgICAgICAobW9kaWZpZXIpID0+XG4gICAgICAgICAgICAoc3RhdGUubW9kaWZpZXJzRGF0YVttb2RpZmllci5uYW1lXSA9IHtcbiAgICAgICAgICAgICAgLi4ubW9kaWZpZXIuZGF0YSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IF9fZGVidWdfbG9vcHNfXyA9IDA7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgICBfX2RlYnVnX2xvb3BzX18gKz0gMTtcbiAgICAgICAgICAgIGlmIChfX2RlYnVnX2xvb3BzX18gPiAxMDApIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihJTkZJTklURV9MT09QX0VSUk9SKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHN0YXRlLnJlc2V0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHsgZm4sIG9wdGlvbnMgPSB7fSwgbmFtZSB9ID0gc3RhdGUub3JkZXJlZE1vZGlmaWVyc1tpbmRleF07XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IGZuKHsgc3RhdGUsIG9wdGlvbnMsIG5hbWUsIGluc3RhbmNlIH0pIHx8IHN0YXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gQXN5bmMgYW5kIG9wdGltaXN0aWNhbGx5IG9wdGltaXplZCB1cGRhdGUg4oCTIGl0IHdpbGwgbm90IGJlIGV4ZWN1dGVkIGlmXG4gICAgICAvLyBub3QgbmVjZXNzYXJ5IChkZWJvdW5jZWQgdG8gcnVuIGF0IG1vc3Qgb25jZS1wZXItdGljaylcbiAgICAgIHVwZGF0ZTogZGVib3VuY2U8JFNoYXBlPFN0YXRlPj4oXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IFByb21pc2U8JFNoYXBlPFN0YXRlPj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGluc3RhbmNlLmZvcmNlVXBkYXRlKCk7XG4gICAgICAgICAgICByZXNvbHZlKHN0YXRlKTtcbiAgICAgICAgICB9KVxuICAgICAgKSxcblxuICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICBpc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICBjb25zb2xlLmVycm9yKElOVkFMSURfRUxFTUVOVF9FUlJPUik7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgaW5zdGFuY2Uuc2V0T3B0aW9ucyhvcHRpb25zKS50aGVuKChzdGF0ZSkgPT4ge1xuICAgICAgaWYgKCFpc0Rlc3Ryb3llZCAmJiBvcHRpb25zLm9uRmlyc3RVcGRhdGUpIHtcbiAgICAgICAgb3B0aW9ucy5vbkZpcnN0VXBkYXRlKHN0YXRlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvZGUgYmVmb3JlIHRoZSBmaXJzdFxuICAgIC8vIHVwZGF0ZSBjeWNsZSBydW5zLiBUaGV5IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHVwZGF0ZVxuICAgIC8vIGN5Y2xlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGEgbW9kaWZpZXIgYWRkcyBzb21lIHBlcnNpc3RlbnQgZGF0YSB0aGF0XG4gICAgLy8gb3RoZXIgbW9kaWZpZXJzIG5lZWQgdG8gdXNlLCBidXQgdGhlIG1vZGlmaWVyIGlzIHJ1biBhZnRlciB0aGUgZGVwZW5kZW50XG4gICAgLy8gb25lLlxuICAgIGZ1bmN0aW9uIHJ1bk1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaCgoeyBuYW1lLCBvcHRpb25zID0ge30sIGVmZmVjdCB9KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZWZmZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc3QgY2xlYW51cEZuID0gZWZmZWN0KHsgc3RhdGUsIG5hbWUsIGluc3RhbmNlLCBvcHRpb25zIH0pO1xuICAgICAgICAgIGNvbnN0IG5vb3BGbiA9ICgpID0+IHt9O1xuICAgICAgICAgIGVmZmVjdENsZWFudXBGbnMucHVzaChjbGVhbnVwRm4gfHwgbm9vcEZuKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIGVmZmVjdENsZWFudXBGbnMuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuICAgICAgZWZmZWN0Q2xlYW51cEZucyA9IFtdO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVBvcHBlciA9IHBvcHBlckdlbmVyYXRvcigpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5leHBvcnQgeyBkZXRlY3RPdmVyZmxvdyB9O1xuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIHsgTW9kaWZpZXJBcmd1bWVudHMsIE1vZGlmaWVyIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tICcuLi9kb20tdXRpbHMvZ2V0V2luZG93JztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtcbiAgc2Nyb2xsOiBib29sZWFuLFxuICByZXNpemU6IGJvb2xlYW4sXG59O1xuXG5jb25zdCBwYXNzaXZlID0geyBwYXNzaXZlOiB0cnVlIH07XG5cbmZ1bmN0aW9uIGVmZmVjdCh7IHN0YXRlLCBpbnN0YW5jZSwgb3B0aW9ucyB9OiBNb2RpZmllckFyZ3VtZW50czxPcHRpb25zPikge1xuICBjb25zdCB7IHNjcm9sbCA9IHRydWUsIHJlc2l6ZSA9IHRydWUgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3Qgd2luZG93ID0gZ2V0V2luZG93KHN0YXRlLmVsZW1lbnRzLnBvcHBlcik7XG4gIGNvbnN0IHNjcm9sbFBhcmVudHMgPSBbXG4gICAgLi4uc3RhdGUuc2Nyb2xsUGFyZW50cy5yZWZlcmVuY2UsXG4gICAgLi4uc3RhdGUuc2Nyb2xsUGFyZW50cy5wb3BwZXIsXG4gIF07XG5cbiAgaWYgKHNjcm9sbCkge1xuICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChzY3JvbGxQYXJlbnQgPT4ge1xuICAgICAgc2Nyb2xsUGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAocmVzaXplKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gIH1cblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGlmIChzY3JvbGwpIHtcbiAgICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChzY3JvbGxQYXJlbnQgPT4ge1xuICAgICAgICBzY3JvbGxQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChyZXNpemUpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgIH1cbiAgfTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0IHR5cGUgRXZlbnRMaXN0ZW5lcnNNb2RpZmllciA9IE1vZGlmaWVyPCdldmVudExpc3RlbmVycycsIE9wdGlvbnM+O1xuZXhwb3J0IGRlZmF1bHQgKHtcbiAgbmFtZTogJ2V2ZW50TGlzdGVuZXJzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICd3cml0ZScsXG4gIGZuOiAoKSA9PiB7fSxcbiAgZWZmZWN0LFxuICBkYXRhOiB7fSxcbn06IEV2ZW50TGlzdGVuZXJzTW9kaWZpZXIpO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIHsgTW9kaWZpZXJBcmd1bWVudHMsIE1vZGlmaWVyIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGNvbXB1dGVPZmZzZXRzIGZyb20gJy4uL3V0aWxzL2NvbXB1dGVPZmZzZXRzJztcblxuZnVuY3Rpb24gcG9wcGVyT2Zmc2V0cyh7IHN0YXRlLCBuYW1lIH06IE1vZGlmaWVyQXJndW1lbnRzPHt8fH0+KSB7XG4gIC8vIE9mZnNldHMgYXJlIHRoZSBhY3R1YWwgcG9zaXRpb24gdGhlIHBvcHBlciBuZWVkcyB0byBoYXZlIHRvIGJlXG4gIC8vIHByb3Blcmx5IHBvc2l0aW9uZWQgbmVhciBpdHMgcmVmZXJlbmNlIGVsZW1lbnRcbiAgLy8gVGhpcyBpcyB0aGUgbW9zdCBiYXNpYyBwbGFjZW1lbnQsIGFuZCB3aWxsIGJlIGFkanVzdGVkIGJ5XG4gIC8vIHRoZSBtb2RpZmllcnMgaW4gdGhlIG5leHQgc3RlcFxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gY29tcHV0ZU9mZnNldHMoe1xuICAgIHJlZmVyZW5jZTogc3RhdGUucmVjdHMucmVmZXJlbmNlLFxuICAgIGVsZW1lbnQ6IHN0YXRlLnJlY3RzLnBvcHBlcixcbiAgICBzdHJhdGVneTogJ2Fic29sdXRlJyxcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudCxcbiAgfSk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcbmV4cG9ydCB0eXBlIFBvcHBlck9mZnNldHNNb2RpZmllciA9IE1vZGlmaWVyPCdwb3BwZXJPZmZzZXRzJywge3x8fT47XG5leHBvcnQgZGVmYXVsdCAoe1xuICBuYW1lOiAncG9wcGVyT2Zmc2V0cycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAncmVhZCcsXG4gIGZuOiBwb3BwZXJPZmZzZXRzLFxuICBkYXRhOiB7fSxcbn06IFBvcHBlck9mZnNldHNNb2RpZmllcik7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUge1xuICBQb3NpdGlvbmluZ1N0cmF0ZWd5LFxuICBPZmZzZXRzLFxuICBNb2RpZmllcixcbiAgTW9kaWZpZXJBcmd1bWVudHMsXG4gIFJlY3QsXG4gIFdpbmRvdyxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgdHlwZSBCYXNlUGxhY2VtZW50LFxuICB0eXBlIFZhcmlhdGlvbixcbiAgdG9wLFxuICBsZWZ0LFxuICByaWdodCxcbiAgYm90dG9tLFxuICBlbmQsXG59IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSAnLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudCc7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gJy4uL2RvbS11dGlscy9nZXRXaW5kb3cnO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tICcuLi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50JztcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gJy4uL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlJztcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gJy4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQnO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tICcuLi91dGlscy9nZXRWYXJpYXRpb24nO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tICcuLi91dGlscy9tYXRoJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0IHR5cGUgUm91bmRPZmZzZXRzID0gKFxuICBvZmZzZXRzOiAkU2hhcGU8eyB4OiBudW1iZXIsIHk6IG51bWJlciwgY2VudGVyT2Zmc2V0OiBudW1iZXIgfT5cbikgPT4gT2Zmc2V0cztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtcbiAgZ3B1QWNjZWxlcmF0aW9uOiBib29sZWFuLFxuICBhZGFwdGl2ZTogYm9vbGVhbixcbiAgcm91bmRPZmZzZXRzPzogYm9vbGVhbiB8IFJvdW5kT2Zmc2V0cyxcbn07XG5cbmNvbnN0IHVuc2V0U2lkZXMgPSB7XG4gIHRvcDogJ2F1dG8nLFxuICByaWdodDogJ2F1dG8nLFxuICBib3R0b206ICdhdXRvJyxcbiAgbGVmdDogJ2F1dG8nLFxufTtcblxuLy8gUm91bmQgdGhlIG9mZnNldHMgdG8gdGhlIG5lYXJlc3Qgc3VpdGFibGUgc3VicGl4ZWwgYmFzZWQgb24gdGhlIERQUi5cbi8vIFpvb21pbmcgY2FuIGNoYW5nZSB0aGUgRFBSLCBidXQgaXQgc2VlbXMgdG8gcmVwb3J0IGEgdmFsdWUgdGhhdCB3aWxsXG4vLyBjbGVhbmx5IGRpdmlkZSB0aGUgdmFsdWVzIGludG8gdGhlIGFwcHJvcHJpYXRlIHN1YnBpeGVscy5cbmZ1bmN0aW9uIHJvdW5kT2Zmc2V0c0J5RFBSKHsgeCwgeSB9KTogT2Zmc2V0cyB7XG4gIGNvbnN0IHdpbjogV2luZG93ID0gd2luZG93O1xuICBjb25zdCBkcHIgPSB3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuXG4gIHJldHVybiB7XG4gICAgeDogcm91bmQoeCAqIGRwcikgLyBkcHIgfHwgMCxcbiAgICB5OiByb3VuZCh5ICogZHByKSAvIGRwciB8fCAwLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9TdHlsZXMoe1xuICBwb3BwZXIsXG4gIHBvcHBlclJlY3QsXG4gIHBsYWNlbWVudCxcbiAgdmFyaWF0aW9uLFxuICBvZmZzZXRzLFxuICBwb3NpdGlvbixcbiAgZ3B1QWNjZWxlcmF0aW9uLFxuICBhZGFwdGl2ZSxcbiAgcm91bmRPZmZzZXRzLFxuICBpc0ZpeGVkLFxufToge1xuICBwb3BwZXI6IEhUTUxFbGVtZW50LFxuICBwb3BwZXJSZWN0OiBSZWN0LFxuICBwbGFjZW1lbnQ6IEJhc2VQbGFjZW1lbnQsXG4gIHZhcmlhdGlvbjogP1ZhcmlhdGlvbixcbiAgb2Zmc2V0czogJFNoYXBlPHsgeDogbnVtYmVyLCB5OiBudW1iZXIsIGNlbnRlck9mZnNldDogbnVtYmVyIH0+LFxuICBwb3NpdGlvbjogUG9zaXRpb25pbmdTdHJhdGVneSxcbiAgZ3B1QWNjZWxlcmF0aW9uOiBib29sZWFuLFxuICBhZGFwdGl2ZTogYm9vbGVhbixcbiAgcm91bmRPZmZzZXRzOiBib29sZWFuIHwgUm91bmRPZmZzZXRzLFxuICBpc0ZpeGVkOiBib29sZWFuLFxufSkge1xuICBsZXQgeyB4ID0gMCwgeSA9IDAgfSA9IG9mZnNldHM7XG5cbiAgKHsgeCwgeSB9ID1cbiAgICB0eXBlb2Ygcm91bmRPZmZzZXRzID09PSAnZnVuY3Rpb24nXG4gICAgICA/IHJvdW5kT2Zmc2V0cyh7IHgsIHkgfSlcbiAgICAgIDogeyB4LCB5IH0pO1xuXG4gIGNvbnN0IGhhc1ggPSBvZmZzZXRzLmhhc093blByb3BlcnR5KCd4Jyk7XG4gIGNvbnN0IGhhc1kgPSBvZmZzZXRzLmhhc093blByb3BlcnR5KCd5Jyk7XG5cbiAgbGV0IHNpZGVYOiBzdHJpbmcgPSBsZWZ0O1xuICBsZXQgc2lkZVk6IHN0cmluZyA9IHRvcDtcblxuICBjb25zdCB3aW46IFdpbmRvdyA9IHdpbmRvdztcblxuICBpZiAoYWRhcHRpdmUpIHtcbiAgICBsZXQgb2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KHBvcHBlcik7XG4gICAgbGV0IGhlaWdodFByb3AgPSAnY2xpZW50SGVpZ2h0JztcbiAgICBsZXQgd2lkdGhQcm9wID0gJ2NsaWVudFdpZHRoJztcblxuICAgIGlmIChvZmZzZXRQYXJlbnQgPT09IGdldFdpbmRvdyhwb3BwZXIpKSB7XG4gICAgICBvZmZzZXRQYXJlbnQgPSBnZXREb2N1bWVudEVsZW1lbnQocG9wcGVyKTtcblxuICAgICAgaWYgKFxuICAgICAgICBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gIT09ICdzdGF0aWMnICYmXG4gICAgICAgIHBvc2l0aW9uID09PSAnYWJzb2x1dGUnXG4gICAgICApIHtcbiAgICAgICAgaGVpZ2h0UHJvcCA9ICdzY3JvbGxIZWlnaHQnO1xuICAgICAgICB3aWR0aFByb3AgPSAnc2Nyb2xsV2lkdGgnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhc3RdOiBmb3JjZSB0eXBlIHJlZmluZW1lbnQsIHdlIGNvbXBhcmUgb2Zmc2V0UGFyZW50IHdpdGggd2luZG93IGFib3ZlLCBidXQgRmxvdyBkb2Vzbid0IGRldGVjdCBpdFxuICAgIG9mZnNldFBhcmVudCA9IChvZmZzZXRQYXJlbnQ6IEVsZW1lbnQpO1xuXG4gICAgaWYgKFxuICAgICAgcGxhY2VtZW50ID09PSB0b3AgfHxcbiAgICAgICgocGxhY2VtZW50ID09PSBsZWZ0IHx8IHBsYWNlbWVudCA9PT0gcmlnaHQpICYmIHZhcmlhdGlvbiA9PT0gZW5kKVxuICAgICkge1xuICAgICAgc2lkZVkgPSBib3R0b207XG4gICAgICBjb25zdCBvZmZzZXRZID1cbiAgICAgICAgaXNGaXhlZCAmJiBvZmZzZXRQYXJlbnQgPT09IHdpbiAmJiB3aW4udmlzdWFsVmlld3BvcnRcbiAgICAgICAgICA/IHdpbi52aXN1YWxWaWV3cG9ydC5oZWlnaHRcbiAgICAgICAgICA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgICAgICAgb2Zmc2V0UGFyZW50W2hlaWdodFByb3BdO1xuICAgICAgeSAtPSBvZmZzZXRZIC0gcG9wcGVyUmVjdC5oZWlnaHQ7XG4gICAgICB5ICo9IGdwdUFjY2VsZXJhdGlvbiA/IDEgOiAtMTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBwbGFjZW1lbnQgPT09IGxlZnQgfHxcbiAgICAgICgocGxhY2VtZW50ID09PSB0b3AgfHwgcGxhY2VtZW50ID09PSBib3R0b20pICYmIHZhcmlhdGlvbiA9PT0gZW5kKVxuICAgICkge1xuICAgICAgc2lkZVggPSByaWdodDtcbiAgICAgIGNvbnN0IG9mZnNldFggPVxuICAgICAgICBpc0ZpeGVkICYmIG9mZnNldFBhcmVudCA9PT0gd2luICYmIHdpbi52aXN1YWxWaWV3cG9ydFxuICAgICAgICAgID8gd2luLnZpc3VhbFZpZXdwb3J0LndpZHRoXG4gICAgICAgICAgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICAgICAgICAgIG9mZnNldFBhcmVudFt3aWR0aFByb3BdO1xuICAgICAgeCAtPSBvZmZzZXRYIC0gcG9wcGVyUmVjdC53aWR0aDtcbiAgICAgIHggKj0gZ3B1QWNjZWxlcmF0aW9uID8gMSA6IC0xO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbW1vblN0eWxlcyA9IHtcbiAgICBwb3NpdGlvbixcbiAgICAuLi4oYWRhcHRpdmUgJiYgdW5zZXRTaWRlcyksXG4gIH07XG5cbiAgKHsgeCwgeSB9ID1cbiAgICByb3VuZE9mZnNldHMgPT09IHRydWVcbiAgICAgID8gcm91bmRPZmZzZXRzQnlEUFIoeyB4LCB5IH0pXG4gICAgICA6IHsgeCwgeSB9KTtcblxuICBpZiAoZ3B1QWNjZWxlcmF0aW9uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbW1vblN0eWxlcyxcbiAgICAgIFtzaWRlWV06IGhhc1kgPyAnMCcgOiAnJyxcbiAgICAgIFtzaWRlWF06IGhhc1ggPyAnMCcgOiAnJyxcbiAgICAgIC8vIExheWVyIGFjY2VsZXJhdGlvbiBjYW4gZGlzYWJsZSBzdWJwaXhlbCByZW5kZXJpbmcgd2hpY2ggY2F1c2VzIHNsaWdodGx5XG4gICAgICAvLyBibHVycnkgdGV4dCBvbiBsb3cgUFBJIGRpc3BsYXlzLCBzbyB3ZSB3YW50IHRvIHVzZSAyRCB0cmFuc2Zvcm1zXG4gICAgICAvLyBpbnN0ZWFkXG4gICAgICB0cmFuc2Zvcm06XG4gICAgICAgICh3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSA8PSAxXG4gICAgICAgICAgPyBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KWBcbiAgICAgICAgICA6IGB0cmFuc2xhdGUzZCgke3h9cHgsICR7eX1weCwgMClgLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmNvbW1vblN0eWxlcyxcbiAgICBbc2lkZVldOiBoYXNZID8gYCR7eX1weGAgOiAnJyxcbiAgICBbc2lkZVhdOiBoYXNYID8gYCR7eH1weGAgOiAnJyxcbiAgICB0cmFuc2Zvcm06ICcnLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU3R5bGVzKHsgc3RhdGUsIG9wdGlvbnMgfTogTW9kaWZpZXJBcmd1bWVudHM8T3B0aW9ucz4pIHtcbiAgY29uc3Qge1xuICAgIGdwdUFjY2VsZXJhdGlvbiA9IHRydWUsXG4gICAgYWRhcHRpdmUgPSB0cnVlLFxuICAgIC8vIGRlZmF1bHRzIHRvIHVzZSBidWlsdGluIGByb3VuZE9mZnNldHNCeURQUmBcbiAgICByb3VuZE9mZnNldHMgPSB0cnVlLFxuICB9ID0gb3B0aW9ucztcblxuICBpZiAoX19ERVZfXykge1xuICAgIGNvbnN0IHRyYW5zaXRpb25Qcm9wZXJ0eSA9XG4gICAgICBnZXRDb21wdXRlZFN0eWxlKHN0YXRlLmVsZW1lbnRzLnBvcHBlcikudHJhbnNpdGlvblByb3BlcnR5IHx8ICcnO1xuXG4gICAgaWYgKFxuICAgICAgYWRhcHRpdmUgJiZcbiAgICAgIFsndHJhbnNmb3JtJywgJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddLnNvbWUoXG4gICAgICAgIChwcm9wZXJ0eSkgPT4gdHJhbnNpdGlvblByb3BlcnR5LmluZGV4T2YocHJvcGVydHkpID49IDBcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgW1xuICAgICAgICAgICdQb3BwZXI6IERldGVjdGVkIENTUyB0cmFuc2l0aW9ucyBvbiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZycsXG4gICAgICAgICAgJ0NTUyBwcm9wZXJ0aWVzOiBcInRyYW5zZm9ybVwiLCBcInRvcFwiLCBcInJpZ2h0XCIsIFwiYm90dG9tXCIsIFwibGVmdFwiLicsXG4gICAgICAgICAgJ1xcblxcbicsXG4gICAgICAgICAgJ0Rpc2FibGUgdGhlIFwiY29tcHV0ZVN0eWxlc1wiIG1vZGlmaWVyXFwncyBgYWRhcHRpdmVgIG9wdGlvbiB0byBhbGxvdycsXG4gICAgICAgICAgJ2ZvciBzbW9vdGggdHJhbnNpdGlvbnMsIG9yIHJlbW92ZSB0aGVzZSBwcm9wZXJ0aWVzIGZyb20gdGhlIENTUycsXG4gICAgICAgICAgJ3RyYW5zaXRpb24gZGVjbGFyYXRpb24gb24gdGhlIHBvcHBlciBlbGVtZW50IGlmIG9ubHkgdHJhbnNpdGlvbmluZycsXG4gICAgICAgICAgJ29wYWNpdHkgb3IgYmFja2dyb3VuZC1jb2xvciBmb3IgZXhhbXBsZS4nLFxuICAgICAgICAgICdcXG5cXG4nLFxuICAgICAgICAgICdXZSByZWNvbW1lbmQgdXNpbmcgdGhlIHBvcHBlciBlbGVtZW50IGFzIGEgd3JhcHBlciBhcm91bmQgYW4gaW5uZXInLFxuICAgICAgICAgICdlbGVtZW50IHRoYXQgY2FuIGhhdmUgYW55IENTUyBwcm9wZXJ0eSB0cmFuc2l0aW9uZWQgZm9yIGFuaW1hdGlvbnMuJyxcbiAgICAgICAgXS5qb2luKCcgJylcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29tbW9uU3R5bGVzID0ge1xuICAgIHBsYWNlbWVudDogZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpLFxuICAgIHZhcmlhdGlvbjogZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCksXG4gICAgcG9wcGVyOiBzdGF0ZS5lbGVtZW50cy5wb3BwZXIsXG4gICAgcG9wcGVyUmVjdDogc3RhdGUucmVjdHMucG9wcGVyLFxuICAgIGdwdUFjY2VsZXJhdGlvbixcbiAgICBpc0ZpeGVkOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnLFxuICB9O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5wb3BwZXIgPSB7XG4gICAgICAuLi5zdGF0ZS5zdHlsZXMucG9wcGVyLFxuICAgICAgLi4ubWFwVG9TdHlsZXMoe1xuICAgICAgICAuLi5jb21tb25TdHlsZXMsXG4gICAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyxcbiAgICAgICAgcG9zaXRpb246IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICAgIGFkYXB0aXZlLFxuICAgICAgICByb3VuZE9mZnNldHMsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3cgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5hcnJvdyA9IHtcbiAgICAgIC4uLnN0YXRlLnN0eWxlcy5hcnJvdyxcbiAgICAgIC4uLm1hcFRvU3R5bGVzKHtcbiAgICAgICAgLi4uY29tbW9uU3R5bGVzLFxuICAgICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93LFxuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgYWRhcHRpdmU6IGZhbHNlLFxuICAgICAgICByb3VuZE9mZnNldHMsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIgPSB7XG4gICAgLi4uc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIsXG4gICAgJ2RhdGEtcG9wcGVyLXBsYWNlbWVudCc6IHN0YXRlLnBsYWNlbWVudCxcbiAgfTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0IHR5cGUgQ29tcHV0ZVN0eWxlc01vZGlmaWVyID0gTW9kaWZpZXI8J2NvbXB1dGVTdHlsZXMnLCBPcHRpb25zPjtcbmV4cG9ydCBkZWZhdWx0ICh7XG4gIG5hbWU6ICdjb21wdXRlU3R5bGVzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdiZWZvcmVXcml0ZScsXG4gIGZuOiBjb21wdXRlU3R5bGVzLFxuICBkYXRhOiB7fSxcbn06IENvbXB1dGVTdHlsZXNNb2RpZmllcik7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBNb2RpZmllciwgTW9kaWZpZXJBcmd1bWVudHMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSAnLi4vZG9tLXV0aWxzL2dldE5vZGVOYW1lJztcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tICcuLi9kb20tdXRpbHMvaW5zdGFuY2VPZic7XG5cbi8vIFRoaXMgbW9kaWZpZXIgdGFrZXMgdGhlIHN0eWxlcyBwcmVwYXJlZCBieSB0aGUgYGNvbXB1dGVTdHlsZXNgIG1vZGlmaWVyXG4vLyBhbmQgYXBwbGllcyB0aGVtIHRvIHRoZSBIVE1MRWxlbWVudHMgc3VjaCBhcyBwb3BwZXIgYW5kIGFycm93XG5cbmZ1bmN0aW9uIGFwcGx5U3R5bGVzKHsgc3RhdGUgfTogTW9kaWZpZXJBcmd1bWVudHM8e3x8fT4pIHtcbiAgT2JqZWN0LmtleXMoc3RhdGUuZWxlbWVudHMpLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICBjb25zdCBzdHlsZSA9IHN0YXRlLnN0eWxlc1tuYW1lXSB8fCB7fTtcblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBzdGF0ZS5hdHRyaWJ1dGVzW25hbWVdIHx8IHt9O1xuICAgIGNvbnN0IGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTtcblxuICAgIC8vIGFycm93IGlzIG9wdGlvbmFsICsgdmlydHVhbCBlbGVtZW50c1xuICAgIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAhZ2V0Tm9kZU5hbWUoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0byBleHRlbmQgdGhpcyBwcm9wZXJ0eSwgYnV0IGl0J3MgdGhlIG1vc3RcbiAgICAvLyBlZmZlY3RpdmUgd2F5IHRvIGFwcGx5IHN0eWxlcyB0byBhbiBIVE1MRWxlbWVudFxuICAgIC8vICRGbG93Rml4TWVbY2Fubm90LXdyaXRlXVxuICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpO1xuXG4gICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlID09PSB0cnVlID8gJycgOiB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlZmZlY3QoeyBzdGF0ZSB9OiBNb2RpZmllckFyZ3VtZW50czx7fHx9Pikge1xuICBjb25zdCBpbml0aWFsU3R5bGVzID0ge1xuICAgIHBvcHBlcjoge1xuICAgICAgcG9zaXRpb246IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICBsZWZ0OiAnMCcsXG4gICAgICB0b3A6ICcwJyxcbiAgICAgIG1hcmdpbjogJzAnLFxuICAgIH0sXG4gICAgYXJyb3c6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIH0sXG4gICAgcmVmZXJlbmNlOiB7fSxcbiAgfTtcblxuICBPYmplY3QuYXNzaWduKHN0YXRlLmVsZW1lbnRzLnBvcHBlci5zdHlsZSwgaW5pdGlhbFN0eWxlcy5wb3BwZXIpO1xuICBzdGF0ZS5zdHlsZXMgPSBpbml0aWFsU3R5bGVzO1xuXG4gIGlmIChzdGF0ZS5lbGVtZW50cy5hcnJvdykge1xuICAgIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMuYXJyb3cuc3R5bGUsIGluaXRpYWxTdHlsZXMuYXJyb3cpO1xuICB9XG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW25hbWVdO1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHN0YXRlLmF0dHJpYnV0ZXNbbmFtZV0gfHwge307XG5cbiAgICAgIGNvbnN0IHN0eWxlUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKFxuICAgICAgICBzdGF0ZS5zdHlsZXMuaGFzT3duUHJvcGVydHkobmFtZSlcbiAgICAgICAgICA/IHN0YXRlLnN0eWxlc1tuYW1lXVxuICAgICAgICAgIDogaW5pdGlhbFN0eWxlc1tuYW1lXVxuICAgICAgKTtcblxuICAgICAgLy8gU2V0IGFsbCB2YWx1ZXMgdG8gYW4gZW1wdHkgc3RyaW5nIHRvIHVuc2V0IHRoZW1cbiAgICAgIGNvbnN0IHN0eWxlID0gc3R5bGVQcm9wZXJ0aWVzLnJlZHVjZSgoc3R5bGUsIHByb3BlcnR5KSA9PiB7XG4gICAgICAgIHN0eWxlW3Byb3BlcnR5XSA9ICcnO1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIC8vIGFycm93IGlzIG9wdGlvbmFsICsgdmlydHVhbCBlbGVtZW50c1xuICAgICAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8ICFnZXROb2RlTmFtZShlbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpO1xuXG4gICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKChhdHRyaWJ1dGUpID0+IHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5leHBvcnQgdHlwZSBBcHBseVN0eWxlc01vZGlmaWVyID0gTW9kaWZpZXI8J2FwcGx5U3R5bGVzJywge3x8fT47XG5leHBvcnQgZGVmYXVsdCAoe1xuICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGFwcGx5U3R5bGVzLFxuICBlZmZlY3QsXG4gIHJlcXVpcmVzOiBbJ2NvbXB1dGVTdHlsZXMnXSxcbn06IEFwcGx5U3R5bGVzTW9kaWZpZXIpO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIHsgUGxhY2VtZW50IH0gZnJvbSAnLi4vZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBNb2RpZmllckFyZ3VtZW50cywgTW9kaWZpZXIsIFJlY3QsIE9mZnNldHMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tICcuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50JztcbmltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIHBsYWNlbWVudHMgfSBmcm9tICcuLi9lbnVtcyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcbmV4cG9ydCB0eXBlIE9mZnNldHNGdW5jdGlvbiA9ICh7XG4gIHBvcHBlcjogUmVjdCxcbiAgcmVmZXJlbmNlOiBSZWN0LFxuICBwbGFjZW1lbnQ6IFBsYWNlbWVudCxcbn0pID0+IFs/bnVtYmVyLCA/bnVtYmVyXTtcblxudHlwZSBPZmZzZXQgPSBPZmZzZXRzRnVuY3Rpb24gfCBbP251bWJlciwgP251bWJlcl07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcbmV4cG9ydCB0eXBlIE9wdGlvbnMgPSB7XG4gIG9mZnNldDogT2Zmc2V0LFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKFxuICBwbGFjZW1lbnQ6IFBsYWNlbWVudCxcbiAgcmVjdHM6IHsgcG9wcGVyOiBSZWN0LCByZWZlcmVuY2U6IFJlY3QgfSxcbiAgb2Zmc2V0OiBPZmZzZXRcbik6IE9mZnNldHMge1xuICBjb25zdCBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICBjb25zdCBpbnZlcnREaXN0YW5jZSA9IFtsZWZ0LCB0b3BdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IC0xIDogMTtcblxuICBsZXQgW3NraWRkaW5nLCBkaXN0YW5jZV0gPVxuICAgIHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbidcbiAgICAgID8gb2Zmc2V0KHtcbiAgICAgICAgICAuLi5yZWN0cyxcbiAgICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIH0pXG4gICAgICA6IG9mZnNldDtcblxuICBza2lkZGluZyA9IHNraWRkaW5nIHx8IDA7XG4gIGRpc3RhbmNlID0gKGRpc3RhbmNlIHx8IDApICogaW52ZXJ0RGlzdGFuY2U7XG5cbiAgcmV0dXJuIFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwXG4gICAgPyB7IHg6IGRpc3RhbmNlLCB5OiBza2lkZGluZyB9XG4gICAgOiB7IHg6IHNraWRkaW5nLCB5OiBkaXN0YW5jZSB9O1xufVxuXG5mdW5jdGlvbiBvZmZzZXQoeyBzdGF0ZSwgb3B0aW9ucywgbmFtZSB9OiBNb2RpZmllckFyZ3VtZW50czxPcHRpb25zPikge1xuICBjb25zdCB7IG9mZnNldCA9IFswLCAwXSB9ID0gb3B0aW9ucztcblxuICBjb25zdCBkYXRhID0gcGxhY2VtZW50cy5yZWR1Y2UoKGFjYywgcGxhY2VtZW50KSA9PiB7XG4gICAgYWNjW3BsYWNlbWVudF0gPSBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHN0YXRlLnJlY3RzLCBvZmZzZXQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcblxuICBjb25zdCB7IHgsIHkgfSA9IGRhdGFbc3RhdGUucGxhY2VtZW50XTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzICE9IG51bGwpIHtcbiAgICBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueCArPSB4O1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy55ICs9IHk7XG4gIH1cblxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gZGF0YTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0IHR5cGUgT2Zmc2V0TW9kaWZpZXIgPSBNb2RpZmllcjwnb2Zmc2V0JywgT3B0aW9ucz47XG5leHBvcnQgZGVmYXVsdCAoe1xuICBuYW1lOiAnb2Zmc2V0JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICBmbjogb2Zmc2V0LFxufTogT2Zmc2V0TW9kaWZpZXIpO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIHsgUGxhY2VtZW50IH0gZnJvbSAnLi4vZW51bXMnO1xuXG5jb25zdCBoYXNoID0geyBsZWZ0OiAncmlnaHQnLCByaWdodDogJ2xlZnQnLCBib3R0b206ICd0b3AnLCB0b3A6ICdib3R0b20nIH07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudDogUGxhY2VtZW50KTogUGxhY2VtZW50IHtcbiAgcmV0dXJuIChwbGFjZW1lbnQucmVwbGFjZShcbiAgICAvbGVmdHxyaWdodHxib3R0b218dG9wL2csXG4gICAgbWF0Y2hlZCA9PiBoYXNoW21hdGNoZWRdXG4gICk6IGFueSk7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBQbGFjZW1lbnQgfSBmcm9tICcuLi9lbnVtcyc7XG5cbmNvbnN0IGhhc2ggPSB7IHN0YXJ0OiAnZW5kJywgZW5kOiAnc3RhcnQnIH07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KFxuICBwbGFjZW1lbnQ6IFBsYWNlbWVudFxuKTogUGxhY2VtZW50IHtcbiAgcmV0dXJuIChwbGFjZW1lbnQucmVwbGFjZSgvc3RhcnR8ZW5kL2csIG1hdGNoZWQgPT4gaGFzaFttYXRjaGVkXSk6IGFueSk7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBTdGF0ZSwgUGFkZGluZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHtcbiAgUGxhY2VtZW50LFxuICBDb21wdXRlZFBsYWNlbWVudCxcbiAgQm91bmRhcnksXG4gIFJvb3RCb3VuZGFyeSxcbn0gZnJvbSAnLi4vZW51bXMnO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tICcuL2dldFZhcmlhdGlvbic7XG5pbXBvcnQge1xuICB2YXJpYXRpb25QbGFjZW1lbnRzLFxuICBiYXNlUGxhY2VtZW50cyxcbiAgcGxhY2VtZW50cyBhcyBhbGxQbGFjZW1lbnRzLFxufSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSAnLi9kZXRlY3RPdmVyZmxvdyc7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tICcuL2dldEJhc2VQbGFjZW1lbnQnO1xuXG50eXBlIE9wdGlvbnMgPSB7XG4gIHBsYWNlbWVudDogUGxhY2VtZW50LFxuICBwYWRkaW5nOiBQYWRkaW5nLFxuICBib3VuZGFyeTogQm91bmRhcnksXG4gIHJvb3RCb3VuZGFyeTogUm9vdEJvdW5kYXJ5LFxuICBmbGlwVmFyaWF0aW9uczogYm9vbGVhbixcbiAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzPzogQXJyYXk8UGxhY2VtZW50Pixcbn07XG5cbnR5cGUgT3ZlcmZsb3dzTWFwID0geyBbQ29tcHV0ZWRQbGFjZW1lbnRdOiBudW1iZXIgfTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcHV0ZUF1dG9QbGFjZW1lbnQoXG4gIHN0YXRlOiAkU2hhcGU8U3RhdGU+LFxuICBvcHRpb25zOiBPcHRpb25zID0ge31cbik6IEFycmF5PENvbXB1dGVkUGxhY2VtZW50PiB7XG4gIGNvbnN0IHtcbiAgICBwbGFjZW1lbnQsXG4gICAgYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5LFxuICAgIHBhZGRpbmcsXG4gICAgZmxpcFZhcmlhdGlvbnMsXG4gICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzID0gYWxsUGxhY2VtZW50cyxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgdmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCk7XG5cbiAgY29uc3QgcGxhY2VtZW50cyA9IHZhcmlhdGlvblxuICAgID8gZmxpcFZhcmlhdGlvbnNcbiAgICAgID8gdmFyaWF0aW9uUGxhY2VtZW50c1xuICAgICAgOiB2YXJpYXRpb25QbGFjZW1lbnRzLmZpbHRlcihcbiAgICAgICAgICAocGxhY2VtZW50KSA9PiBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSA9PT0gdmFyaWF0aW9uXG4gICAgICAgIClcbiAgICA6IGJhc2VQbGFjZW1lbnRzO1xuXG4gIGxldCBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMuZmlsdGVyKFxuICAgIChwbGFjZW1lbnQpID0+IGFsbG93ZWRBdXRvUGxhY2VtZW50cy5pbmRleE9mKHBsYWNlbWVudCkgPj0gMFxuICApO1xuXG4gIGlmIChhbGxvd2VkUGxhY2VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHM7XG5cbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgW1xuICAgICAgICAgICdQb3BwZXI6IFRoZSBgYWxsb3dlZEF1dG9QbGFjZW1lbnRzYCBvcHRpb24gZGlkIG5vdCBhbGxvdyBhbnknLFxuICAgICAgICAgICdwbGFjZW1lbnRzLiBFbnN1cmUgdGhlIGBwbGFjZW1lbnRgIG9wdGlvbiBtYXRjaGVzIHRoZSB2YXJpYXRpb24nLFxuICAgICAgICAgICdvZiB0aGUgYWxsb3dlZCBwbGFjZW1lbnRzLicsXG4gICAgICAgICAgJ0ZvciBleGFtcGxlLCBcImF1dG9cIiBjYW5ub3QgYmUgdXNlZCB0byBhbGxvdyBcImJvdHRvbS1zdGFydFwiLicsXG4gICAgICAgICAgJ1VzZSBcImF1dG8tc3RhcnRcIiBpbnN0ZWFkLicsXG4gICAgICAgIF0uam9pbignICcpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXR5cGVdOiBGbG93IHNlZW1zIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCB0d28gYXJyYXkgdW5pb25zLi4uXG4gIGNvbnN0IG92ZXJmbG93czogT3ZlcmZsb3dzTWFwID0gYWxsb3dlZFBsYWNlbWVudHMucmVkdWNlKChhY2MsIHBsYWNlbWVudCkgPT4ge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZyxcbiAgICB9KVtnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCldO1xuXG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhvdmVyZmxvd3MpLnNvcnQoKGEsIGIpID0+IG92ZXJmbG93c1thXSAtIG92ZXJmbG93c1tiXSk7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBQbGFjZW1lbnQsIEJvdW5kYXJ5LCBSb290Qm91bmRhcnkgfSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IE1vZGlmaWVyQXJndW1lbnRzLCBNb2RpZmllciwgUGFkZGluZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBnZXRPcHBvc2l0ZVBsYWNlbWVudCBmcm9tICcuLi91dGlscy9nZXRPcHBvc2l0ZVBsYWNlbWVudCc7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tICcuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50JztcbmltcG9ydCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudCBmcm9tICcuLi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudCc7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSAnLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cnO1xuaW1wb3J0IGNvbXB1dGVBdXRvUGxhY2VtZW50IGZyb20gJy4uL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50JztcbmltcG9ydCB7IGJvdHRvbSwgdG9wLCBzdGFydCwgcmlnaHQsIGxlZnQsIGF1dG8gfSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gJy4uL3V0aWxzL2dldFZhcmlhdGlvbic7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcbmV4cG9ydCB0eXBlIE9wdGlvbnMgPSB7XG4gIG1haW5BeGlzOiBib29sZWFuLFxuICBhbHRBeGlzOiBib29sZWFuLFxuICBmYWxsYmFja1BsYWNlbWVudHM6IEFycmF5PFBsYWNlbWVudD4sXG4gIHBhZGRpbmc6IFBhZGRpbmcsXG4gIGJvdW5kYXJ5OiBCb3VuZGFyeSxcbiAgcm9vdEJvdW5kYXJ5OiBSb290Qm91bmRhcnksXG4gIGFsdEJvdW5kYXJ5OiBib29sZWFuLFxuICBmbGlwVmFyaWF0aW9uczogYm9vbGVhbixcbiAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBBcnJheTxQbGFjZW1lbnQ+LFxufTtcblxuZnVuY3Rpb24gZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMocGxhY2VtZW50OiBQbGFjZW1lbnQpOiBBcnJheTxQbGFjZW1lbnQ+IHtcbiAgaWYgKGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSA9PT0gYXV0bykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IG9wcG9zaXRlUGxhY2VtZW50ID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcblxuICByZXR1cm4gW1xuICAgIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCksXG4gICAgb3Bwb3NpdGVQbGFjZW1lbnQsXG4gICAgZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQob3Bwb3NpdGVQbGFjZW1lbnQpLFxuICBdO1xufVxuXG5mdW5jdGlvbiBmbGlwKHsgc3RhdGUsIG9wdGlvbnMsIG5hbWUgfTogTW9kaWZpZXJBcmd1bWVudHM8T3B0aW9ucz4pIHtcbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0uX3NraXApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7XG4gICAgbWFpbkF4aXM6IGNoZWNrTWFpbkF4aXMgPSB0cnVlLFxuICAgIGFsdEF4aXM6IGNoZWNrQWx0QXhpcyA9IHRydWUsXG4gICAgZmFsbGJhY2tQbGFjZW1lbnRzOiBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMsXG4gICAgcGFkZGluZyxcbiAgICBib3VuZGFyeSxcbiAgICByb290Qm91bmRhcnksXG4gICAgYWx0Qm91bmRhcnksXG4gICAgZmxpcFZhcmlhdGlvbnMgPSB0cnVlLFxuICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50cyxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgcHJlZmVycmVkUGxhY2VtZW50ID0gc3RhdGUub3B0aW9ucy5wbGFjZW1lbnQ7XG4gIGNvbnN0IGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHByZWZlcnJlZFBsYWNlbWVudCk7XG4gIGNvbnN0IGlzQmFzZVBsYWNlbWVudCA9IGJhc2VQbGFjZW1lbnQgPT09IHByZWZlcnJlZFBsYWNlbWVudDtcblxuICBjb25zdCBmYWxsYmFja1BsYWNlbWVudHMgPVxuICAgIHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyB8fFxuICAgIChpc0Jhc2VQbGFjZW1lbnQgfHwgIWZsaXBWYXJpYXRpb25zXG4gICAgICA/IFtnZXRPcHBvc2l0ZVBsYWNlbWVudChwcmVmZXJyZWRQbGFjZW1lbnQpXVxuICAgICAgOiBnZXRFeHBhbmRlZEZhbGxiYWNrUGxhY2VtZW50cyhwcmVmZXJyZWRQbGFjZW1lbnQpKTtcblxuICBjb25zdCBwbGFjZW1lbnRzID0gW3ByZWZlcnJlZFBsYWNlbWVudCwgLi4uZmFsbGJhY2tQbGFjZW1lbnRzXS5yZWR1Y2UoXG4gICAgKGFjYywgcGxhY2VtZW50KSA9PiB7XG4gICAgICByZXR1cm4gYWNjLmNvbmNhdChcbiAgICAgICAgZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvXG4gICAgICAgICAgPyBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwge1xuICAgICAgICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgICAgICAgIGJvdW5kYXJ5LFxuICAgICAgICAgICAgICByb290Qm91bmRhcnksXG4gICAgICAgICAgICAgIHBhZGRpbmcsXG4gICAgICAgICAgICAgIGZsaXBWYXJpYXRpb25zLFxuICAgICAgICAgICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogcGxhY2VtZW50XG4gICAgICApO1xuICAgIH0sXG4gICAgW11cbiAgKTtcblxuICBjb25zdCByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICBjb25zdCBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuXG4gIGNvbnN0IGNoZWNrc01hcCA9IG5ldyBNYXAoKTtcbiAgbGV0IG1ha2VGYWxsYmFja0NoZWNrcyA9IHRydWU7XG4gIGxldCBmaXJzdEZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRzWzBdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGxhY2VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHBsYWNlbWVudCA9IHBsYWNlbWVudHNbaV07XG4gICAgY29uc3QgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgICBjb25zdCBpc1N0YXJ0VmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHN0YXJ0O1xuICAgIGNvbnN0IGlzVmVydGljYWwgPSBbdG9wLCBib3R0b21dLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMDtcbiAgICBjb25zdCBsZW4gPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuXG4gICAgY29uc3Qgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcsXG4gICAgfSk7XG5cbiAgICBsZXQgbWFpblZhcmlhdGlvblNpZGU6IGFueSA9IGlzVmVydGljYWxcbiAgICAgID8gaXNTdGFydFZhcmlhdGlvblxuICAgICAgICA/IHJpZ2h0XG4gICAgICAgIDogbGVmdFxuICAgICAgOiBpc1N0YXJ0VmFyaWF0aW9uXG4gICAgICA/IGJvdHRvbVxuICAgICAgOiB0b3A7XG5cbiAgICBpZiAocmVmZXJlbmNlUmVjdFtsZW5dID4gcG9wcGVyUmVjdFtsZW5dKSB7XG4gICAgICBtYWluVmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbHRWYXJpYXRpb25TaWRlOiBhbnkgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChtYWluVmFyaWF0aW9uU2lkZSk7XG5cbiAgICBjb25zdCBjaGVja3MgPSBbXTtcblxuICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChvdmVyZmxvd1tiYXNlUGxhY2VtZW50XSA8PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tBbHRBeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChcbiAgICAgICAgb3ZlcmZsb3dbbWFpblZhcmlhdGlvblNpZGVdIDw9IDAsXG4gICAgICAgIG92ZXJmbG93W2FsdFZhcmlhdGlvblNpZGVdIDw9IDBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrcy5ldmVyeSgoY2hlY2spID0+IGNoZWNrKSkge1xuICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50O1xuICAgICAgbWFrZUZhbGxiYWNrQ2hlY2tzID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjaGVja3NNYXAuc2V0KHBsYWNlbWVudCwgY2hlY2tzKTtcbiAgfVxuXG4gIGlmIChtYWtlRmFsbGJhY2tDaGVja3MpIHtcbiAgICAvLyBgMmAgbWF5IGJlIGRlc2lyZWQgaW4gc29tZSBjYXNlcyDigJMgcmVzZWFyY2ggbGF0ZXJcbiAgICBjb25zdCBudW1iZXJPZkNoZWNrcyA9IGZsaXBWYXJpYXRpb25zID8gMyA6IDE7XG5cbiAgICBmb3IgKGxldCBpID0gbnVtYmVyT2ZDaGVja3M7IGkgPiAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRzLmZpbmQoKHBsYWNlbWVudCkgPT4ge1xuICAgICAgICBjb25zdCBjaGVja3MgPSBjaGVja3NNYXAuZ2V0KHBsYWNlbWVudCk7XG4gICAgICAgIGlmIChjaGVja3MpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tzLnNsaWNlKDAsIGkpLmV2ZXJ5KChjaGVjaykgPT4gY2hlY2spO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGZpdHRpbmdQbGFjZW1lbnQpIHtcbiAgICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gZml0dGluZ1BsYWNlbWVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnBsYWNlbWVudCAhPT0gZmlyc3RGaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCA9IHRydWU7XG4gICAgc3RhdGUucGxhY2VtZW50ID0gZmlyc3RGaXR0aW5nUGxhY2VtZW50O1xuICAgIHN0YXRlLnJlc2V0ID0gdHJ1ZTtcbiAgfVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5leHBvcnQgdHlwZSBGbGlwTW9kaWZpZXIgPSBNb2RpZmllcjwnZmxpcCcsIE9wdGlvbnM+O1xuZXhwb3J0IGRlZmF1bHQgKHtcbiAgbmFtZTogJ2ZsaXAnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogZmxpcCxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXSxcbiAgZGF0YTogeyBfc2tpcDogZmFsc2UgfSxcbn06IEZsaXBNb2RpZmllcik7XG4iLCIvLyBAZmxvd1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRBbHRBeGlzKGF4aXM6ICd4JyB8ICd5Jyk6ICd4JyB8ICd5JyB7XG4gIHJldHVybiBheGlzID09PSAneCcgPyAneScgOiAneCc7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHsgbWF4IGFzIG1hdGhNYXgsIG1pbiBhcyBtYXRoTWluIH0gZnJvbSAnLi9tYXRoJztcblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhpbihtaW46IG51bWJlciwgdmFsdWU6IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gbWF0aE1heChtaW4sIG1hdGhNaW4odmFsdWUsIG1heCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aGluTWF4Q2xhbXAobWluOiBudW1iZXIsIHZhbHVlOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XG4gIGNvbnN0IHYgPSB3aXRoaW4obWluLCB2YWx1ZSwgbWF4KTtcbiAgcmV0dXJuIHYgPiBtYXggPyBtYXggOiB2O1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgc3RhcnQgfSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IFBsYWNlbWVudCwgQm91bmRhcnksIFJvb3RCb3VuZGFyeSB9IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCB0eXBlIHsgUmVjdCwgTW9kaWZpZXJBcmd1bWVudHMsIE1vZGlmaWVyLCBQYWRkaW5nIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSAnLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudCc7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gJy4uL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudCc7XG5pbXBvcnQgZ2V0QWx0QXhpcyBmcm9tICcuLi91dGlscy9nZXRBbHRBeGlzJztcbmltcG9ydCB7IHdpdGhpbiwgd2l0aGluTWF4Q2xhbXAgfSBmcm9tICcuLi91dGlscy93aXRoaW4nO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSAnLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QnO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tICcuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50JztcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tICcuLi91dGlscy9kZXRlY3RPdmVyZmxvdyc7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gJy4uL3V0aWxzL2dldFZhcmlhdGlvbic7XG5pbXBvcnQgZ2V0RnJlc2hTaWRlT2JqZWN0IGZyb20gJy4uL3V0aWxzL2dldEZyZXNoU2lkZU9iamVjdCc7XG5pbXBvcnQgeyBtaW4gYXMgbWF0aE1pbiwgbWF4IGFzIG1hdGhNYXggfSBmcm9tICcuLi91dGlscy9tYXRoJztcblxudHlwZSBUZXRoZXJPZmZzZXQgPVxuICB8ICgoe1xuICAgICAgcG9wcGVyOiBSZWN0LFxuICAgICAgcmVmZXJlbmNlOiBSZWN0LFxuICAgICAgcGxhY2VtZW50OiBQbGFjZW1lbnQsXG4gICAgfSkgPT4gbnVtYmVyIHwgeyBtYWluQXhpczogbnVtYmVyLCBhbHRBeGlzOiBudW1iZXIgfSlcbiAgfCBudW1iZXJcbiAgfCB7IG1haW5BeGlzOiBudW1iZXIsIGFsdEF4aXM6IG51bWJlciB9O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5leHBvcnQgdHlwZSBPcHRpb25zID0ge1xuICAvKiBQcmV2ZW50cyBib3VuZGFyaWVzIG92ZXJmbG93IG9uIHRoZSBtYWluIGF4aXMgKi9cbiAgbWFpbkF4aXM6IGJvb2xlYW4sXG4gIC8qIFByZXZlbnRzIGJvdW5kYXJpZXMgb3ZlcmZsb3cgb24gdGhlIGFsdGVybmF0ZSBheGlzICovXG4gIGFsdEF4aXM6IGJvb2xlYW4sXG4gIC8qIFRoZSBhcmVhIHRvIGNoZWNrIHRoZSBwb3BwZXIgaXMgb3ZlcmZsb3dpbmcgaW4gKi9cbiAgYm91bmRhcnk6IEJvdW5kYXJ5LFxuICAvKiBJZiB0aGUgcG9wcGVyIGlzIG5vdCBvdmVyZmxvd2luZyB0aGUgbWFpbiBhcmVhLCBmYWxsYmFjayB0byB0aGlzIG9uZSAqL1xuICByb290Qm91bmRhcnk6IFJvb3RCb3VuZGFyeSxcbiAgLyogVXNlIHRoZSByZWZlcmVuY2UncyBcImNsaXBwaW5nUGFyZW50c1wiIGJvdW5kYXJ5IGNvbnRleHQgKi9cbiAgYWx0Qm91bmRhcnk6IGJvb2xlYW4sXG4gIC8qKlxuICAgKiBBbGxvd3MgdGhlIHBvcHBlciB0byBvdmVyZmxvdyBmcm9tIGl0cyBib3VuZGFyaWVzIHRvIGtlZXAgaXQgbmVhciBpdHNcbiAgICogcmVmZXJlbmNlIGVsZW1lbnRcbiAgICovXG4gIHRldGhlcjogYm9vbGVhbixcbiAgLyogT2Zmc2V0cyB3aGVuIHRoZSBgdGV0aGVyYCBvcHRpb24gc2hvdWxkIGFjdGl2YXRlICovXG4gIHRldGhlck9mZnNldDogVGV0aGVyT2Zmc2V0LFxuICAvKiBTZXRzIGEgcGFkZGluZyB0byB0aGUgcHJvdmlkZWQgYm91bmRhcnkgKi9cbiAgcGFkZGluZzogUGFkZGluZyxcbn07XG5cbmZ1bmN0aW9uIHByZXZlbnRPdmVyZmxvdyh7IHN0YXRlLCBvcHRpb25zLCBuYW1lIH06IE1vZGlmaWVyQXJndW1lbnRzPE9wdGlvbnM+KSB7XG4gIGNvbnN0IHtcbiAgICBtYWluQXhpczogY2hlY2tNYWluQXhpcyA9IHRydWUsXG4gICAgYWx0QXhpczogY2hlY2tBbHRBeGlzID0gZmFsc2UsXG4gICAgYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5LFxuICAgIGFsdEJvdW5kYXJ5LFxuICAgIHBhZGRpbmcsXG4gICAgdGV0aGVyID0gdHJ1ZSxcbiAgICB0ZXRoZXJPZmZzZXQgPSAwLFxuICB9ID0gb3B0aW9ucztcblxuICBjb25zdCBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5LFxuICAgIHBhZGRpbmcsXG4gICAgYWx0Qm91bmRhcnksXG4gIH0pO1xuICBjb25zdCBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICBjb25zdCB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24oc3RhdGUucGxhY2VtZW50KTtcbiAgY29uc3QgaXNCYXNlUGxhY2VtZW50ID0gIXZhcmlhdGlvbjtcbiAgY29uc3QgbWFpbkF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIGNvbnN0IGFsdEF4aXMgPSBnZXRBbHRBeGlzKG1haW5BeGlzKTtcbiAgY29uc3QgcG9wcGVyT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cztcbiAgY29uc3QgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgY29uc3QgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgY29uc3QgdGV0aGVyT2Zmc2V0VmFsdWUgPVxuICAgIHR5cGVvZiB0ZXRoZXJPZmZzZXQgPT09ICdmdW5jdGlvbidcbiAgICAgID8gdGV0aGVyT2Zmc2V0KHtcbiAgICAgICAgICAuLi5zdGF0ZS5yZWN0cyxcbiAgICAgICAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudCxcbiAgICAgICAgfSlcbiAgICAgIDogdGV0aGVyT2Zmc2V0O1xuICBjb25zdCBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUgPVxuICAgIHR5cGVvZiB0ZXRoZXJPZmZzZXRWYWx1ZSA9PT0gJ251bWJlcidcbiAgICAgID8geyBtYWluQXhpczogdGV0aGVyT2Zmc2V0VmFsdWUsIGFsdEF4aXM6IHRldGhlck9mZnNldFZhbHVlIH1cbiAgICAgIDogeyBtYWluQXhpczogMCwgYWx0QXhpczogMCwgLi4udGV0aGVyT2Zmc2V0VmFsdWUgfTtcbiAgY29uc3Qgb2Zmc2V0TW9kaWZpZXJTdGF0ZSA9IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0XG4gICAgPyBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldFtzdGF0ZS5wbGFjZW1lbnRdXG4gICAgOiBudWxsO1xuXG4gIGNvbnN0IGRhdGEgPSB7IHg6IDAsIHk6IDAgfTtcblxuICBpZiAoIXBvcHBlck9mZnNldHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgIGNvbnN0IG1haW5TaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gICAgY29uc3QgYWx0U2lkZSA9IG1haW5BeGlzID09PSAneScgPyBib3R0b20gOiByaWdodDtcbiAgICBjb25zdCBsZW4gPSBtYWluQXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICAgIGNvbnN0IG9mZnNldCA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdO1xuXG4gICAgY29uc3QgbWluID0gb2Zmc2V0ICsgb3ZlcmZsb3dbbWFpblNpZGVdO1xuICAgIGNvbnN0IG1heCA9IG9mZnNldCAtIG92ZXJmbG93W2FsdFNpZGVdO1xuXG4gICAgY29uc3QgYWRkaXRpdmUgPSB0ZXRoZXIgPyAtcG9wcGVyUmVjdFtsZW5dIC8gMiA6IDA7XG5cbiAgICBjb25zdCBtaW5MZW4gPSB2YXJpYXRpb24gPT09IHN0YXJ0ID8gcmVmZXJlbmNlUmVjdFtsZW5dIDogcG9wcGVyUmVjdFtsZW5dO1xuICAgIGNvbnN0IG1heExlbiA9IHZhcmlhdGlvbiA9PT0gc3RhcnQgPyAtcG9wcGVyUmVjdFtsZW5dIDogLXJlZmVyZW5jZVJlY3RbbGVuXTtcblxuICAgIC8vIFdlIG5lZWQgdG8gaW5jbHVkZSB0aGUgYXJyb3cgaW4gdGhlIGNhbGN1bGF0aW9uIHNvIHRoZSBhcnJvdyBkb2Vzbid0IGdvXG4gICAgLy8gb3V0c2lkZSB0aGUgcmVmZXJlbmNlIGJvdW5kc1xuICAgIGNvbnN0IGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICAgIGNvbnN0IGFycm93UmVjdCA9XG4gICAgICB0ZXRoZXIgJiYgYXJyb3dFbGVtZW50XG4gICAgICAgID8gZ2V0TGF5b3V0UmVjdChhcnJvd0VsZW1lbnQpXG4gICAgICAgIDogeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG4gICAgY29uc3QgYXJyb3dQYWRkaW5nT2JqZWN0ID0gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddXG4gICAgICA/IHN0YXRlLm1vZGlmaWVyc0RhdGFbJ2Fycm93I3BlcnNpc3RlbnQnXS5wYWRkaW5nXG4gICAgICA6IGdldEZyZXNoU2lkZU9iamVjdCgpO1xuICAgIGNvbnN0IGFycm93UGFkZGluZ01pbiA9IGFycm93UGFkZGluZ09iamVjdFttYWluU2lkZV07XG4gICAgY29uc3QgYXJyb3dQYWRkaW5nTWF4ID0gYXJyb3dQYWRkaW5nT2JqZWN0W2FsdFNpZGVdO1xuXG4gICAgLy8gSWYgdGhlIHJlZmVyZW5jZSBsZW5ndGggaXMgc21hbGxlciB0aGFuIHRoZSBhcnJvdyBsZW5ndGgsIHdlIGRvbid0IHdhbnRcbiAgICAvLyB0byBpbmNsdWRlIGl0cyBmdWxsIHNpemUgaW4gdGhlIGNhbGN1bGF0aW9uLiBJZiB0aGUgcmVmZXJlbmNlIGlzIHNtYWxsXG4gICAgLy8gYW5kIG5lYXIgdGhlIGVkZ2Ugb2YgYSBib3VuZGFyeSwgdGhlIHBvcHBlciBjYW4gb3ZlcmZsb3cgZXZlbiBpZiB0aGVcbiAgICAvLyByZWZlcmVuY2UgaXMgbm90IG92ZXJmbG93aW5nIGFzIHdlbGwgKGUuZy4gdmlydHVhbCBlbGVtZW50cyB3aXRoIG5vXG4gICAgLy8gd2lkdGggb3IgaGVpZ2h0KVxuICAgIGNvbnN0IGFycm93TGVuID0gd2l0aGluKDAsIHJlZmVyZW5jZVJlY3RbbGVuXSwgYXJyb3dSZWN0W2xlbl0pO1xuXG4gICAgY29uc3QgbWluT2Zmc2V0ID0gaXNCYXNlUGxhY2VtZW50XG4gICAgICA/IHJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgLVxuICAgICAgICBhZGRpdGl2ZSAtXG4gICAgICAgIGFycm93TGVuIC1cbiAgICAgICAgYXJyb3dQYWRkaW5nTWluIC1cbiAgICAgICAgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzXG4gICAgICA6IG1pbkxlbiAtXG4gICAgICAgIGFycm93TGVuIC1cbiAgICAgICAgYXJyb3dQYWRkaW5nTWluIC1cbiAgICAgICAgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzO1xuICAgIGNvbnN0IG1heE9mZnNldCA9IGlzQmFzZVBsYWNlbWVudFxuICAgICAgPyAtcmVmZXJlbmNlUmVjdFtsZW5dIC8gMiArXG4gICAgICAgIGFkZGl0aXZlICtcbiAgICAgICAgYXJyb3dMZW4gK1xuICAgICAgICBhcnJvd1BhZGRpbmdNYXggK1xuICAgICAgICBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXNcbiAgICAgIDogbWF4TGVuICtcbiAgICAgICAgYXJyb3dMZW4gK1xuICAgICAgICBhcnJvd1BhZGRpbmdNYXggK1xuICAgICAgICBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXM7XG5cbiAgICBjb25zdCBhcnJvd09mZnNldFBhcmVudCA9XG4gICAgICBzdGF0ZS5lbGVtZW50cy5hcnJvdyAmJiBnZXRPZmZzZXRQYXJlbnQoc3RhdGUuZWxlbWVudHMuYXJyb3cpO1xuICAgIGNvbnN0IGNsaWVudE9mZnNldCA9IGFycm93T2Zmc2V0UGFyZW50XG4gICAgICA/IG1haW5BeGlzID09PSAneSdcbiAgICAgICAgPyBhcnJvd09mZnNldFBhcmVudC5jbGllbnRUb3AgfHwgMFxuICAgICAgICA6IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudExlZnQgfHwgMFxuICAgICAgOiAwO1xuXG4gICAgY29uc3Qgb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IG9mZnNldE1vZGlmaWVyU3RhdGU/LlttYWluQXhpc10gPz8gMDtcbiAgICBjb25zdCB0ZXRoZXJNaW4gPSBvZmZzZXQgKyBtaW5PZmZzZXQgLSBvZmZzZXRNb2RpZmllclZhbHVlIC0gY2xpZW50T2Zmc2V0O1xuICAgIGNvbnN0IHRldGhlck1heCA9IG9mZnNldCArIG1heE9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWU7XG5cbiAgICBjb25zdCBwcmV2ZW50ZWRPZmZzZXQgPSB3aXRoaW4oXG4gICAgICB0ZXRoZXIgPyBtYXRoTWluKG1pbiwgdGV0aGVyTWluKSA6IG1pbixcbiAgICAgIG9mZnNldCxcbiAgICAgIHRldGhlciA/IG1hdGhNYXgobWF4LCB0ZXRoZXJNYXgpIDogbWF4XG4gICAgKTtcblxuICAgIHBvcHBlck9mZnNldHNbbWFpbkF4aXNdID0gcHJldmVudGVkT2Zmc2V0O1xuICAgIGRhdGFbbWFpbkF4aXNdID0gcHJldmVudGVkT2Zmc2V0IC0gb2Zmc2V0O1xuICB9XG5cbiAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgIGNvbnN0IG1haW5TaWRlID0gbWFpbkF4aXMgPT09ICd4JyA/IHRvcCA6IGxlZnQ7XG4gICAgY29uc3QgYWx0U2lkZSA9IG1haW5BeGlzID09PSAneCcgPyBib3R0b20gOiByaWdodDtcbiAgICBjb25zdCBvZmZzZXQgPSBwb3BwZXJPZmZzZXRzW2FsdEF4aXNdO1xuXG4gICAgY29uc3QgbGVuID0gYWx0QXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gICAgY29uc3QgbWluID0gb2Zmc2V0ICsgb3ZlcmZsb3dbbWFpblNpZGVdO1xuICAgIGNvbnN0IG1heCA9IG9mZnNldCAtIG92ZXJmbG93W2FsdFNpZGVdO1xuXG4gICAgY29uc3QgaXNPcmlnaW5TaWRlID0gW3RvcCwgbGVmdF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgICBjb25zdCBvZmZzZXRNb2RpZmllclZhbHVlID0gb2Zmc2V0TW9kaWZpZXJTdGF0ZT8uW2FsdEF4aXNdID8/IDA7XG4gICAgY29uc3QgdGV0aGVyTWluID0gaXNPcmlnaW5TaWRlXG4gICAgICA/IG1pblxuICAgICAgOiBvZmZzZXQgLVxuICAgICAgICByZWZlcmVuY2VSZWN0W2xlbl0gLVxuICAgICAgICBwb3BwZXJSZWN0W2xlbl0gLVxuICAgICAgICBvZmZzZXRNb2RpZmllclZhbHVlICtcbiAgICAgICAgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXM7XG4gICAgY29uc3QgdGV0aGVyTWF4ID0gaXNPcmlnaW5TaWRlXG4gICAgICA/IG9mZnNldCArXG4gICAgICAgIHJlZmVyZW5jZVJlY3RbbGVuXSArXG4gICAgICAgIHBvcHBlclJlY3RbbGVuXSAtXG4gICAgICAgIG9mZnNldE1vZGlmaWVyVmFsdWUgLVxuICAgICAgICBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUuYWx0QXhpc1xuICAgICAgOiBtYXg7XG5cbiAgICBjb25zdCBwcmV2ZW50ZWRPZmZzZXQgPVxuICAgICAgdGV0aGVyICYmIGlzT3JpZ2luU2lkZVxuICAgICAgICA/IHdpdGhpbk1heENsYW1wKHRldGhlck1pbiwgb2Zmc2V0LCB0ZXRoZXJNYXgpXG4gICAgICAgIDogd2l0aGluKHRldGhlciA/IHRldGhlck1pbiA6IG1pbiwgb2Zmc2V0LCB0ZXRoZXIgPyB0ZXRoZXJNYXggOiBtYXgpO1xuXG4gICAgcG9wcGVyT2Zmc2V0c1thbHRBeGlzXSA9IHByZXZlbnRlZE9mZnNldDtcbiAgICBkYXRhW2FsdEF4aXNdID0gcHJldmVudGVkT2Zmc2V0IC0gb2Zmc2V0O1xuICB9XG5cbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGRhdGE7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcbmV4cG9ydCB0eXBlIFByZXZlbnRPdmVyZmxvd01vZGlmaWVyID0gTW9kaWZpZXI8J3ByZXZlbnRPdmVyZmxvdycsIE9wdGlvbnM+O1xuZXhwb3J0IGRlZmF1bHQgKHtcbiAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBwcmV2ZW50T3ZlcmZsb3csXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsnb2Zmc2V0J10sXG59OiBQcmV2ZW50T3ZlcmZsb3dNb2RpZmllcik7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBNb2RpZmllciwgTW9kaWZpZXJBcmd1bWVudHMsIFBhZGRpbmcsIFJlY3QgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFBsYWNlbWVudCB9IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gJy4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQnO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSAnLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QnO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gJy4uL2RvbS11dGlscy9jb250YWlucyc7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gJy4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQnO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tICcuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQnO1xuaW1wb3J0IHsgd2l0aGluIH0gZnJvbSAnLi4vdXRpbHMvd2l0aGluJztcbmltcG9ydCBtZXJnZVBhZGRpbmdPYmplY3QgZnJvbSAnLi4vdXRpbHMvbWVyZ2VQYWRkaW5nT2JqZWN0JztcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSAnLi4vdXRpbHMvZXhwYW5kVG9IYXNoTWFwJztcbmltcG9ydCB7IGxlZnQsIHJpZ2h0LCBiYXNlUGxhY2VtZW50cywgdG9wLCBib3R0b20gfSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSAnLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5leHBvcnQgdHlwZSBPcHRpb25zID0ge1xuICBlbGVtZW50OiBIVE1MRWxlbWVudCB8IHN0cmluZyB8IG51bGwsXG4gIHBhZGRpbmc6XG4gICAgfCBQYWRkaW5nXG4gICAgfCAoKHt8XG4gICAgICAgIHBvcHBlcjogUmVjdCxcbiAgICAgICAgcmVmZXJlbmNlOiBSZWN0LFxuICAgICAgICBwbGFjZW1lbnQ6IFBsYWNlbWVudCxcbiAgICAgIHx9KSA9PiBQYWRkaW5nKSxcbn07XG5cbmNvbnN0IHRvUGFkZGluZ09iamVjdCA9IChwYWRkaW5nLCBzdGF0ZSkgPT4ge1xuICBwYWRkaW5nID1cbiAgICB0eXBlb2YgcGFkZGluZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBwYWRkaW5nKHsgLi4uc3RhdGUucmVjdHMsIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50IH0pXG4gICAgICA6IHBhZGRpbmc7XG5cbiAgcmV0dXJuIG1lcmdlUGFkZGluZ09iamVjdChcbiAgICB0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcidcbiAgICAgID8gcGFkZGluZ1xuICAgICAgOiBleHBhbmRUb0hhc2hNYXAocGFkZGluZywgYmFzZVBsYWNlbWVudHMpXG4gICk7XG59O1xuXG5mdW5jdGlvbiBhcnJvdyh7IHN0YXRlLCBuYW1lLCBvcHRpb25zIH06IE1vZGlmaWVyQXJndW1lbnRzPE9wdGlvbnM+KSB7XG4gIGNvbnN0IGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICBjb25zdCBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICBjb25zdCBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICBjb25zdCBheGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpO1xuICBjb25zdCBpc1ZlcnRpY2FsID0gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDA7XG4gIGNvbnN0IGxlbiA9IGlzVmVydGljYWwgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgaWYgKCFhcnJvd0VsZW1lbnQgfHwgIXBvcHBlck9mZnNldHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYWRkaW5nT2JqZWN0ID0gdG9QYWRkaW5nT2JqZWN0KG9wdGlvbnMucGFkZGluZywgc3RhdGUpO1xuICBjb25zdCBhcnJvd1JlY3QgPSBnZXRMYXlvdXRSZWN0KGFycm93RWxlbWVudCk7XG4gIGNvbnN0IG1pblByb3AgPSBheGlzID09PSAneScgPyB0b3AgOiBsZWZ0O1xuICBjb25zdCBtYXhQcm9wID0gYXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG5cbiAgY29uc3QgZW5kRGlmZiA9XG4gICAgc3RhdGUucmVjdHMucmVmZXJlbmNlW2xlbl0gK1xuICAgIHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtheGlzXSAtXG4gICAgcG9wcGVyT2Zmc2V0c1theGlzXSAtXG4gICAgc3RhdGUucmVjdHMucG9wcGVyW2xlbl07XG4gIGNvbnN0IHN0YXJ0RGlmZiA9IHBvcHBlck9mZnNldHNbYXhpc10gLSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc107XG5cbiAgY29uc3QgYXJyb3dPZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQoYXJyb3dFbGVtZW50KTtcbiAgY29uc3QgY2xpZW50U2l6ZSA9IGFycm93T2Zmc2V0UGFyZW50XG4gICAgPyBheGlzID09PSAneSdcbiAgICAgID8gYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50SGVpZ2h0IHx8IDBcbiAgICAgIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50V2lkdGggfHwgMFxuICAgIDogMDtcblxuICBjb25zdCBjZW50ZXJUb1JlZmVyZW5jZSA9IGVuZERpZmYgLyAyIC0gc3RhcnREaWZmIC8gMjtcblxuICAvLyBNYWtlIHN1cmUgdGhlIGFycm93IGRvZXNuJ3Qgb3ZlcmZsb3cgdGhlIHBvcHBlciBpZiB0aGUgY2VudGVyIHBvaW50IGlzXG4gIC8vIG91dHNpZGUgb2YgdGhlIHBvcHBlciBib3VuZHNcbiAgY29uc3QgbWluID0gcGFkZGluZ09iamVjdFttaW5Qcm9wXTtcbiAgY29uc3QgbWF4ID0gY2xpZW50U2l6ZSAtIGFycm93UmVjdFtsZW5dIC0gcGFkZGluZ09iamVjdFttYXhQcm9wXTtcbiAgY29uc3QgY2VudGVyID0gY2xpZW50U2l6ZSAvIDIgLSBhcnJvd1JlY3RbbGVuXSAvIDIgKyBjZW50ZXJUb1JlZmVyZW5jZTtcbiAgY29uc3Qgb2Zmc2V0ID0gd2l0aGluKG1pbiwgY2VudGVyLCBtYXgpO1xuXG4gIC8vIFByZXZlbnRzIGJyZWFraW5nIHN5bnRheCBoaWdobGlnaHRpbmcuLi5cbiAgY29uc3QgYXhpc1Byb3A6IHN0cmluZyA9IGF4aXM7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSB7XG4gICAgW2F4aXNQcm9wXTogb2Zmc2V0LFxuICAgIGNlbnRlck9mZnNldDogb2Zmc2V0IC0gY2VudGVyLFxuICB9O1xufVxuXG5mdW5jdGlvbiBlZmZlY3QoeyBzdGF0ZSwgb3B0aW9ucyB9OiBNb2RpZmllckFyZ3VtZW50czxPcHRpb25zPikge1xuICBsZXQgeyBlbGVtZW50OiBhcnJvd0VsZW1lbnQgPSAnW2RhdGEtcG9wcGVyLWFycm93XScgfSA9IG9wdGlvbnM7XG5cbiAgaWYgKGFycm93RWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ1NTIHNlbGVjdG9yXG4gIGlmICh0eXBlb2YgYXJyb3dFbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLnBvcHBlci5xdWVyeVNlbGVjdG9yKGFycm93RWxlbWVudCk7XG5cbiAgICBpZiAoIWFycm93RWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChfX0RFVl9fKSB7XG4gICAgaWYgKCFpc0hUTUxFbGVtZW50KGFycm93RWxlbWVudCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIFtcbiAgICAgICAgICAnUG9wcGVyOiBcImFycm93XCIgZWxlbWVudCBtdXN0IGJlIGFuIEhUTUxFbGVtZW50IChub3QgYW4gU1ZHRWxlbWVudCkuJyxcbiAgICAgICAgICAnVG8gdXNlIGFuIFNWRyBhcnJvdywgd3JhcCBpdCBpbiBhbiBIVE1MRWxlbWVudCB0aGF0IHdpbGwgYmUgdXNlZCBhcycsXG4gICAgICAgICAgJ3RoZSBhcnJvdy4nLFxuICAgICAgICBdLmpvaW4oJyAnKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbnRhaW5zKHN0YXRlLmVsZW1lbnRzLnBvcHBlciwgYXJyb3dFbGVtZW50KSkge1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBbXG4gICAgICAgICAgJ1BvcHBlcjogXCJhcnJvd1wiIG1vZGlmaWVyXFwncyBgZWxlbWVudGAgbXVzdCBiZSBhIGNoaWxkIG9mIHRoZSBwb3BwZXInLFxuICAgICAgICAgICdlbGVtZW50LicsXG4gICAgICAgIF0uam9pbignICcpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN0YXRlLmVsZW1lbnRzLmFycm93ID0gYXJyb3dFbGVtZW50O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5leHBvcnQgdHlwZSBBcnJvd01vZGlmaWVyID0gTW9kaWZpZXI8J2Fycm93JywgT3B0aW9ucz47XG5leHBvcnQgZGVmYXVsdCAoe1xuICBuYW1lOiAnYXJyb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogYXJyb3csXG4gIGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddLFxufTogQXJyb3dNb2RpZmllcik7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUge1xuICBNb2RpZmllckFyZ3VtZW50cyxcbiAgTW9kaWZpZXIsXG4gIFJlY3QsXG4gIFNpZGVPYmplY3QsXG4gIE9mZnNldHMsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCB9IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tICcuLi91dGlscy9kZXRlY3RPdmVyZmxvdyc7XG5cbmZ1bmN0aW9uIGdldFNpZGVPZmZzZXRzKFxuICBvdmVyZmxvdzogU2lkZU9iamVjdCxcbiAgcmVjdDogUmVjdCxcbiAgcHJldmVudGVkT2Zmc2V0czogT2Zmc2V0cyA9IHsgeDogMCwgeTogMCB9XG4pOiBTaWRlT2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IG92ZXJmbG93LnRvcCAtIHJlY3QuaGVpZ2h0IC0gcHJldmVudGVkT2Zmc2V0cy55LFxuICAgIHJpZ2h0OiBvdmVyZmxvdy5yaWdodCAtIHJlY3Qud2lkdGggKyBwcmV2ZW50ZWRPZmZzZXRzLngsXG4gICAgYm90dG9tOiBvdmVyZmxvdy5ib3R0b20gLSByZWN0LmhlaWdodCArIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICBsZWZ0OiBvdmVyZmxvdy5sZWZ0IC0gcmVjdC53aWR0aCAtIHByZXZlbnRlZE9mZnNldHMueCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG92ZXJmbG93OiBTaWRlT2JqZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBbdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XS5zb21lKChzaWRlKSA9PiBvdmVyZmxvd1tzaWRlXSA+PSAwKTtcbn1cblxuZnVuY3Rpb24gaGlkZSh7IHN0YXRlLCBuYW1lIH06IE1vZGlmaWVyQXJndW1lbnRzPHt8fH0+KSB7XG4gIGNvbnN0IHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIGNvbnN0IHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIGNvbnN0IHByZXZlbnRlZE9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnByZXZlbnRPdmVyZmxvdztcblxuICBjb25zdCByZWZlcmVuY2VPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgZWxlbWVudENvbnRleHQ6ICdyZWZlcmVuY2UnLFxuICB9KTtcbiAgY29uc3QgcG9wcGVyQWx0T3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGFsdEJvdW5kYXJ5OiB0cnVlLFxuICB9KTtcblxuICBjb25zdCByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhcbiAgICByZWZlcmVuY2VPdmVyZmxvdyxcbiAgICByZWZlcmVuY2VSZWN0XG4gICk7XG4gIGNvbnN0IHBvcHBlckVzY2FwZU9mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhcbiAgICBwb3BwZXJBbHRPdmVyZmxvdyxcbiAgICBwb3BwZXJSZWN0LFxuICAgIHByZXZlbnRlZE9mZnNldHNcbiAgKTtcblxuICBjb25zdCBpc1JlZmVyZW5jZUhpZGRlbiA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChyZWZlcmVuY2VDbGlwcGluZ09mZnNldHMpO1xuICBjb25zdCBoYXNQb3BwZXJFc2NhcGVkID0gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKHBvcHBlckVzY2FwZU9mZnNldHMpO1xuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSB7XG4gICAgcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzLFxuICAgIHBvcHBlckVzY2FwZU9mZnNldHMsXG4gICAgaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgaGFzUG9wcGVyRXNjYXBlZCxcbiAgfTtcblxuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IHtcbiAgICAuLi5zdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlcixcbiAgICAnZGF0YS1wb3BwZXItcmVmZXJlbmNlLWhpZGRlbic6IGlzUmVmZXJlbmNlSGlkZGVuLFxuICAgICdkYXRhLXBvcHBlci1lc2NhcGVkJzogaGFzUG9wcGVyRXNjYXBlZCxcbiAgfTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0IHR5cGUgSGlkZU1vZGlmaWVyID0gTW9kaWZpZXI8J2hpZGUnLCB7fHx9PjtcbmV4cG9ydCBkZWZhdWx0ICh7XG4gIG5hbWU6ICdoaWRlJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydwcmV2ZW50T3ZlcmZsb3cnXSxcbiAgZm46IGhpZGUsXG59OiBIaWRlTW9kaWZpZXIpO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB7IHBvcHBlckdlbmVyYXRvciwgZGV0ZWN0T3ZlcmZsb3cgfSBmcm9tICcuL2NyZWF0ZVBvcHBlcic7XG5cbmltcG9ydCBldmVudExpc3RlbmVycyBmcm9tICcuL21vZGlmaWVycy9ldmVudExpc3RlbmVycyc7XG5pbXBvcnQgcG9wcGVyT2Zmc2V0cyBmcm9tICcuL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzJztcbmltcG9ydCBjb21wdXRlU3R5bGVzIGZyb20gJy4vbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMnO1xuaW1wb3J0IGFwcGx5U3R5bGVzIGZyb20gJy4vbW9kaWZpZXJzL2FwcGx5U3R5bGVzJztcblxuZXhwb3J0IHR5cGUgKiBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgZGVmYXVsdE1vZGlmaWVycyA9IFtcbiAgZXZlbnRMaXN0ZW5lcnMsXG4gIHBvcHBlck9mZnNldHMsXG4gIGNvbXB1dGVTdHlsZXMsXG4gIGFwcGx5U3R5bGVzLFxuXTtcblxuY29uc3QgY3JlYXRlUG9wcGVyID0gcG9wcGVyR2VuZXJhdG9yKHsgZGVmYXVsdE1vZGlmaWVycyB9KTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0IHsgY3JlYXRlUG9wcGVyLCBwb3BwZXJHZW5lcmF0b3IsIGRlZmF1bHRNb2RpZmllcnMsIGRldGVjdE92ZXJmbG93IH07XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHsgcG9wcGVyR2VuZXJhdG9yLCBkZXRlY3RPdmVyZmxvdyB9IGZyb20gJy4vY3JlYXRlUG9wcGVyJztcblxuaW1wb3J0IGV2ZW50TGlzdGVuZXJzIGZyb20gJy4vbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzJztcbmltcG9ydCBwb3BwZXJPZmZzZXRzIGZyb20gJy4vbW9kaWZpZXJzL3BvcHBlck9mZnNldHMnO1xuaW1wb3J0IGNvbXB1dGVTdHlsZXMgZnJvbSAnLi9tb2RpZmllcnMvY29tcHV0ZVN0eWxlcyc7XG5pbXBvcnQgYXBwbHlTdHlsZXMgZnJvbSAnLi9tb2RpZmllcnMvYXBwbHlTdHlsZXMnO1xuaW1wb3J0IG9mZnNldCBmcm9tICcuL21vZGlmaWVycy9vZmZzZXQnO1xuaW1wb3J0IGZsaXAgZnJvbSAnLi9tb2RpZmllcnMvZmxpcCc7XG5pbXBvcnQgcHJldmVudE92ZXJmbG93IGZyb20gJy4vbW9kaWZpZXJzL3ByZXZlbnRPdmVyZmxvdyc7XG5pbXBvcnQgYXJyb3cgZnJvbSAnLi9tb2RpZmllcnMvYXJyb3cnO1xuaW1wb3J0IGhpZGUgZnJvbSAnLi9tb2RpZmllcnMvaGlkZSc7XG5cbmV4cG9ydCB0eXBlICogZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IGRlZmF1bHRNb2RpZmllcnMgPSBbXG4gIGV2ZW50TGlzdGVuZXJzLFxuICBwb3BwZXJPZmZzZXRzLFxuICBjb21wdXRlU3R5bGVzLFxuICBhcHBseVN0eWxlcyxcbiAgb2Zmc2V0LFxuICBmbGlwLFxuICBwcmV2ZW50T3ZlcmZsb3csXG4gIGFycm93LFxuICBoaWRlLFxuXTtcblxuY29uc3QgY3JlYXRlUG9wcGVyID0gcG9wcGVyR2VuZXJhdG9yKHsgZGVmYXVsdE1vZGlmaWVycyB9KTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0IHsgY3JlYXRlUG9wcGVyLCBwb3BwZXJHZW5lcmF0b3IsIGRlZmF1bHRNb2RpZmllcnMsIGRldGVjdE92ZXJmbG93IH07XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIgYXMgY3JlYXRlUG9wcGVyTGl0ZSB9IGZyb20gJy4vcG9wcGVyLWxpdGUnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0ICogZnJvbSAnLi9tb2RpZmllcnMnO1xuIl19 }).call(this,require("Zbi7gb")) },{"Zbi7gb":12}],10:[function(require,module,exports){ "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } /*! * Datepicker for Bootstrap v1.9.0 (https://github.com/uxsolutions/bootstrap-datepicker) * * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) */ !function (a) { "function" == typeof define && define.amd ? define(["jquery"], a) : a("object" == (typeof exports === "undefined" ? "undefined" : _typeof(exports)) ? require("jquery") : jQuery); }(function (a, b) { function c() { return new Date(Date.UTC.apply(Date, arguments)); } function d() { var a = new Date(); return c(a.getFullYear(), a.getMonth(), a.getDate()); } function e(a, b) { return a.getUTCFullYear() === b.getUTCFullYear() && a.getUTCMonth() === b.getUTCMonth() && a.getUTCDate() === b.getUTCDate(); } function f(c, d) { return function () { return d !== b && a.fn.datepicker.deprecated(d), this[c].apply(this, arguments); }; } function g(a) { return a && !isNaN(a.getTime()); } function h(b, c) { function d(a, b) { return b.toLowerCase(); } var e, f = a(b).data(), g = {}, h = new RegExp("^" + c.toLowerCase() + "([A-Z])"); c = new RegExp("^" + c.toLowerCase()); for (var i in f) { c.test(i) && (e = i.replace(h, d), g[e] = f[i]); } return g; } function i(b) { var c = {}; if (q[b] || (b = b.split("-")[0], q[b])) { var d = q[b]; return a.each(p, function (a, b) { b in d && (c[b] = d[b]); }), c; } } var j = function () { var b = { get: function get(a) { return this.slice(a)[0]; }, contains: function contains(a) { for (var b = a && a.valueOf(), c = 0, d = this.length; c < d; c++) { if (0 <= this[c].valueOf() - b && this[c].valueOf() - b < 864e5) return c; } return -1; }, remove: function remove(a) { this.splice(a, 1); }, replace: function replace(b) { b && (a.isArray(b) || (b = [b]), this.clear(), this.push.apply(this, b)); }, clear: function clear() { this.length = 0; }, copy: function copy() { var a = new j(); return a.replace(this), a; } }; return function () { var c = []; return c.push.apply(c, arguments), a.extend(c, b), c; }; }(), k = function k(b, c) { a.data(b, "datepicker", this), this._events = [], this._secondaryEvents = [], this._process_options(c), this.dates = new j(), this.viewDate = this.o.defaultViewDate, this.focusDate = null, this.element = a(b), this.isInput = this.element.is("input"), this.inputField = this.isInput ? this.element : this.element.find("input"), this.component = !!this.element.hasClass("date") && this.element.find(".add-on, .input-group-addon, .input-group-append, .input-group-prepend, .btn"), this.component && 0 === this.component.length && (this.component = !1), this.isInline = !this.component && this.element.is("div"), this.picker = a(r.template), this._check_template(this.o.templates.leftArrow) && this.picker.find(".prev").html(this.o.templates.leftArrow), this._check_template(this.o.templates.rightArrow) && this.picker.find(".next").html(this.o.templates.rightArrow), this._buildEvents(), this._attachEvents(), this.isInline ? this.picker.addClass("datepicker-inline").appendTo(this.element) : this.picker.addClass("datepicker-dropdown dropdown-menu"), this.o.rtl && this.picker.addClass("datepicker-rtl"), this.o.calendarWeeks && this.picker.find(".datepicker-days .datepicker-switch, thead .datepicker-title, tfoot .today, tfoot .clear").attr("colspan", function (a, b) { return Number(b) + 1; }), this._process_options({ startDate: this._o.startDate, endDate: this._o.endDate, daysOfWeekDisabled: this.o.daysOfWeekDisabled, daysOfWeekHighlighted: this.o.daysOfWeekHighlighted, datesDisabled: this.o.datesDisabled }), this._allow_update = !1, this.setViewMode(this.o.startView), this._allow_update = !0, this.fillDow(), this.fillMonths(), this.update(), this.isInline && this.show(); }; k.prototype = { constructor: k, _resolveViewName: function _resolveViewName(b) { return a.each(r.viewModes, function (c, d) { if (b === c || -1 !== a.inArray(b, d.names)) return b = c, !1; }), b; }, _resolveDaysOfWeek: function _resolveDaysOfWeek(b) { return a.isArray(b) || (b = b.split(/[,\s]*/)), a.map(b, Number); }, _check_template: function _check_template(c) { try { if (c === b || "" === c) return !1; if ((c.match(/[<>]/g) || []).length <= 0) return !0; return a(c).length > 0; } catch (a) { return !1; } }, _process_options: function _process_options(b) { this._o = a.extend({}, this._o, b); var e = this.o = a.extend({}, this._o), f = e.language; q[f] || (f = f.split("-")[0], q[f] || (f = o.language)), e.language = f, e.startView = this._resolveViewName(e.startView), e.minViewMode = this._resolveViewName(e.minViewMode), e.maxViewMode = this._resolveViewName(e.maxViewMode), e.startView = Math.max(this.o.minViewMode, Math.min(this.o.maxViewMode, e.startView)), !0 !== e.multidate && (e.multidate = Number(e.multidate) || !1, !1 !== e.multidate && (e.multidate = Math.max(0, e.multidate))), e.multidateSeparator = String(e.multidateSeparator), e.weekStart %= 7, e.weekEnd = (e.weekStart + 6) % 7; var g = r.parseFormat(e.format); e.startDate !== -1 / 0 && (e.startDate ? e.startDate instanceof Date ? e.startDate = this._local_to_utc(this._zero_time(e.startDate)) : e.startDate = r.parseDate(e.startDate, g, e.language, e.assumeNearbyYear) : e.startDate = -1 / 0), e.endDate !== 1 / 0 && (e.endDate ? e.endDate instanceof Date ? e.endDate = this._local_to_utc(this._zero_time(e.endDate)) : e.endDate = r.parseDate(e.endDate, g, e.language, e.assumeNearbyYear) : e.endDate = 1 / 0), e.daysOfWeekDisabled = this._resolveDaysOfWeek(e.daysOfWeekDisabled || []), e.daysOfWeekHighlighted = this._resolveDaysOfWeek(e.daysOfWeekHighlighted || []), e.datesDisabled = e.datesDisabled || [], a.isArray(e.datesDisabled) || (e.datesDisabled = e.datesDisabled.split(",")), e.datesDisabled = a.map(e.datesDisabled, function (a) { return r.parseDate(a, g, e.language, e.assumeNearbyYear); }); var h = String(e.orientation).toLowerCase().split(/\s+/g), i = e.orientation.toLowerCase(); if (h = a.grep(h, function (a) { return /^auto|left|right|top|bottom$/.test(a); }), e.orientation = { x: "auto", y: "auto" }, i && "auto" !== i) { if (1 === h.length) switch (h[0]) { case "top": case "bottom": e.orientation.y = h[0]; break; case "left": case "right": e.orientation.x = h[0]; } else i = a.grep(h, function (a) { return /^left|right$/.test(a); }), e.orientation.x = i[0] || "auto", i = a.grep(h, function (a) { return /^top|bottom$/.test(a); }), e.orientation.y = i[0] || "auto"; } else ; if (e.defaultViewDate instanceof Date || "string" == typeof e.defaultViewDate) e.defaultViewDate = r.parseDate(e.defaultViewDate, g, e.language, e.assumeNearbyYear);else if (e.defaultViewDate) { var j = e.defaultViewDate.year || new Date().getFullYear(), k = e.defaultViewDate.month || 0, l = e.defaultViewDate.day || 1; e.defaultViewDate = c(j, k, l); } else e.defaultViewDate = d(); }, _applyEvents: function _applyEvents(a) { for (var c, d, e, f = 0; f < a.length; f++) { c = a[f][0], 2 === a[f].length ? (d = b, e = a[f][1]) : 3 === a[f].length && (d = a[f][1], e = a[f][2]), c.on(e, d); } }, _unapplyEvents: function _unapplyEvents(a) { for (var c, d, e, f = 0; f < a.length; f++) { c = a[f][0], 2 === a[f].length ? (e = b, d = a[f][1]) : 3 === a[f].length && (e = a[f][1], d = a[f][2]), c.off(d, e); } }, _buildEvents: function _buildEvents() { var b = { keyup: a.proxy(function (b) { -1 === a.inArray(b.keyCode, [27, 37, 39, 38, 40, 32, 13, 9]) && this.update(); }, this), keydown: a.proxy(this.keydown, this), paste: a.proxy(this.paste, this) }; !0 === this.o.showOnFocus && (b.focus = a.proxy(this.show, this)), this.isInput ? this._events = [[this.element, b]] : this.component && this.inputField.length ? this._events = [[this.inputField, b], [this.component, { click: a.proxy(this.show, this) }]] : this._events = [[this.element, { click: a.proxy(this.show, this), keydown: a.proxy(this.keydown, this) }]], this._events.push([this.element, "*", { blur: a.proxy(function (a) { this._focused_from = a.target; }, this) }], [this.element, { blur: a.proxy(function (a) { this._focused_from = a.target; }, this) }]), this.o.immediateUpdates && this._events.push([this.element, { "changeYear changeMonth": a.proxy(function (a) { this.update(a.date); }, this) }]), this._secondaryEvents = [[this.picker, { click: a.proxy(this.click, this) }], [this.picker, ".prev, .next", { click: a.proxy(this.navArrowsClick, this) }], [this.picker, ".day:not(.disabled)", { click: a.proxy(this.dayCellClick, this) }], [a(window), { resize: a.proxy(this.place, this) }], [a(document), { "mousedown touchstart": a.proxy(function (a) { this.element.is(a.target) || this.element.find(a.target).length || this.picker.is(a.target) || this.picker.find(a.target).length || this.isInline || this.hide(); }, this) }]]; }, _attachEvents: function _attachEvents() { this._detachEvents(), this._applyEvents(this._events); }, _detachEvents: function _detachEvents() { this._unapplyEvents(this._events); }, _attachSecondaryEvents: function _attachSecondaryEvents() { this._detachSecondaryEvents(), this._applyEvents(this._secondaryEvents); }, _detachSecondaryEvents: function _detachSecondaryEvents() { this._unapplyEvents(this._secondaryEvents); }, _trigger: function _trigger(b, c) { var d = c || this.dates.get(-1), e = this._utc_to_local(d); this.element.trigger({ type: b, date: e, viewMode: this.viewMode, dates: a.map(this.dates, this._utc_to_local), format: a.proxy(function (a, b) { 0 === arguments.length ? (a = this.dates.length - 1, b = this.o.format) : "string" == typeof a && (b = a, a = this.dates.length - 1), b = b || this.o.format; var c = this.dates.get(a); return r.formatDate(c, b, this.o.language); }, this) }); }, show: function show() { if (!(this.inputField.is(":disabled") || this.inputField.prop("readonly") && !1 === this.o.enableOnReadonly)) return this.isInline || this.picker.appendTo(this.o.container), this.place(), this.picker.show(), this._attachSecondaryEvents(), this._trigger("show"), (window.navigator.msMaxTouchPoints || "ontouchstart" in document) && this.o.disableTouchKeyboard && a(this.element).blur(), this; }, hide: function hide() { return this.isInline || !this.picker.is(":visible") ? this : (this.focusDate = null, this.picker.hide().detach(), this._detachSecondaryEvents(), this.setViewMode(this.o.startView), this.o.forceParse && this.inputField.val() && this.setValue(), this._trigger("hide"), this); }, destroy: function destroy() { return this.hide(), this._detachEvents(), this._detachSecondaryEvents(), this.picker.remove(), delete this.element.data().datepicker, this.isInput || delete this.element.data().date, this; }, paste: function paste(b) { var c; if (b.originalEvent.clipboardData && b.originalEvent.clipboardData.types && -1 !== a.inArray("text/plain", b.originalEvent.clipboardData.types)) c = b.originalEvent.clipboardData.getData("text/plain");else { if (!window.clipboardData) return; c = window.clipboardData.getData("Text"); } this.setDate(c), this.update(), b.preventDefault(); }, _utc_to_local: function _utc_to_local(a) { if (!a) return a; var b = new Date(a.getTime() + 6e4 * a.getTimezoneOffset()); return b.getTimezoneOffset() !== a.getTimezoneOffset() && (b = new Date(a.getTime() + 6e4 * b.getTimezoneOffset())), b; }, _local_to_utc: function _local_to_utc(a) { return a && new Date(a.getTime() - 6e4 * a.getTimezoneOffset()); }, _zero_time: function _zero_time(a) { return a && new Date(a.getFullYear(), a.getMonth(), a.getDate()); }, _zero_utc_time: function _zero_utc_time(a) { return a && c(a.getUTCFullYear(), a.getUTCMonth(), a.getUTCDate()); }, getDates: function getDates() { return a.map(this.dates, this._utc_to_local); }, getUTCDates: function getUTCDates() { return a.map(this.dates, function (a) { return new Date(a); }); }, getDate: function getDate() { return this._utc_to_local(this.getUTCDate()); }, getUTCDate: function getUTCDate() { var a = this.dates.get(-1); return a !== b ? new Date(a) : null; }, clearDates: function clearDates() { this.inputField.val(""), this.update(), this._trigger("changeDate"), this.o.autoclose && this.hide(); }, setDates: function setDates() { var b = a.isArray(arguments[0]) ? arguments[0] : arguments; return this.update.apply(this, b), this._trigger("changeDate"), this.setValue(), this; }, setUTCDates: function setUTCDates() { var b = a.isArray(arguments[0]) ? arguments[0] : arguments; return this.setDates.apply(this, a.map(b, this._utc_to_local)), this; }, setDate: f("setDates"), setUTCDate: f("setUTCDates"), remove: f("destroy", "Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead"), setValue: function setValue() { var a = this.getFormattedDate(); return this.inputField.val(a), this; }, getFormattedDate: function getFormattedDate(c) { c === b && (c = this.o.format); var d = this.o.language; return a.map(this.dates, function (a) { return r.formatDate(a, c, d); }).join(this.o.multidateSeparator); }, getStartDate: function getStartDate() { return this.o.startDate; }, setStartDate: function setStartDate(a) { return this._process_options({ startDate: a }), this.update(), this.updateNavArrows(), this; }, getEndDate: function getEndDate() { return this.o.endDate; }, setEndDate: function setEndDate(a) { return this._process_options({ endDate: a }), this.update(), this.updateNavArrows(), this; }, setDaysOfWeekDisabled: function setDaysOfWeekDisabled(a) { return this._process_options({ daysOfWeekDisabled: a }), this.update(), this; }, setDaysOfWeekHighlighted: function setDaysOfWeekHighlighted(a) { return this._process_options({ daysOfWeekHighlighted: a }), this.update(), this; }, setDatesDisabled: function setDatesDisabled(a) { return this._process_options({ datesDisabled: a }), this.update(), this; }, place: function place() { if (this.isInline) return this; var b = this.picker.outerWidth(), c = this.picker.outerHeight(), d = a(this.o.container), e = d.width(), f = "body" === this.o.container ? a(document).scrollTop() : d.scrollTop(), g = d.offset(), h = [0]; this.element.parents().each(function () { var b = a(this).css("z-index"); "auto" !== b && 0 !== Number(b) && h.push(Number(b)); }); var i = Math.max.apply(Math, h) + this.o.zIndexOffset, j = this.component ? this.component.parent().offset() : this.element.offset(), k = this.component ? this.component.outerHeight(!0) : this.element.outerHeight(!1), l = this.component ? this.component.outerWidth(!0) : this.element.outerWidth(!1), m = j.left - g.left, n = j.top - g.top; "body" !== this.o.container && (n += f), this.picker.removeClass("datepicker-orient-top datepicker-orient-bottom datepicker-orient-right datepicker-orient-left"), "auto" !== this.o.orientation.x ? (this.picker.addClass("datepicker-orient-" + this.o.orientation.x), "right" === this.o.orientation.x && (m -= b - l)) : j.left < 0 ? (this.picker.addClass("datepicker-orient-left"), m -= j.left - 10) : m + b > e ? (this.picker.addClass("datepicker-orient-right"), m += l - b) : this.o.rtl ? this.picker.addClass("datepicker-orient-right") : this.picker.addClass("datepicker-orient-left"); var o, p = this.o.orientation.y; if ("auto" === p && (o = -f + n - c, p = o < 0 ? "bottom" : "top"), this.picker.addClass("datepicker-orient-" + p), "top" === p ? n -= c + parseInt(this.picker.css("padding-top")) : n += k, this.o.rtl) { var q = e - (m + l); this.picker.css({ top: n, right: q, zIndex: i }); } else this.picker.css({ top: n, left: m, zIndex: i }); return this; }, _allow_update: !0, update: function update() { if (!this._allow_update) return this; var b = this.dates.copy(), c = [], d = !1; return arguments.length ? (a.each(arguments, a.proxy(function (a, b) { b instanceof Date && (b = this._local_to_utc(b)), c.push(b); }, this)), d = !0) : (c = this.isInput ? this.element.val() : this.element.data("date") || this.inputField.val(), c = c && this.o.multidate ? c.split(this.o.multidateSeparator) : [c], delete this.element.data().date), c = a.map(c, a.proxy(function (a) { return r.parseDate(a, this.o.format, this.o.language, this.o.assumeNearbyYear); }, this)), c = a.grep(c, a.proxy(function (a) { return !this.dateWithinRange(a) || !a; }, this), !0), this.dates.replace(c), this.o.updateViewDate && (this.dates.length ? this.viewDate = new Date(this.dates.get(-1)) : this.viewDate < this.o.startDate ? this.viewDate = new Date(this.o.startDate) : this.viewDate > this.o.endDate ? this.viewDate = new Date(this.o.endDate) : this.viewDate = this.o.defaultViewDate), d ? (this.setValue(), this.element.change()) : this.dates.length && String(b) !== String(this.dates) && d && (this._trigger("changeDate"), this.element.change()), !this.dates.length && b.length && (this._trigger("clearDate"), this.element.change()), this.fill(), this; }, fillDow: function fillDow() { if (this.o.showWeekDays) { var b = this.o.weekStart, c = ""; for (this.o.calendarWeeks && (c += ''); b < this.o.weekStart + 7;) { c += '", this.picker.find(".datepicker-days thead").append(c); } }, fillMonths: function fillMonths() { for (var a, b = this._utc_to_local(this.viewDate), c = "", d = 0; d < 12; d++) { a = b && b.getMonth() === d ? " focused" : "", c += '' + q[this.o.language].monthsShort[d] + ""; } this.picker.find(".datepicker-months td").html(c); }, setRange: function setRange(b) { b && b.length ? this.range = a.map(b, function (a) { return a.valueOf(); }) : delete this.range, this.fill(); }, getClassNames: function getClassNames(b) { var c = [], f = this.viewDate.getUTCFullYear(), g = this.viewDate.getUTCMonth(), h = d(); return b.getUTCFullYear() < f || b.getUTCFullYear() === f && b.getUTCMonth() < g ? c.push("old") : (b.getUTCFullYear() > f || b.getUTCFullYear() === f && b.getUTCMonth() > g) && c.push("new"), this.focusDate && b.valueOf() === this.focusDate.valueOf() && c.push("focused"), this.o.todayHighlight && e(b, h) && c.push("today"), -1 !== this.dates.contains(b) && c.push("active"), this.dateWithinRange(b) || c.push("disabled"), this.dateIsDisabled(b) && c.push("disabled", "disabled-date"), -1 !== a.inArray(b.getUTCDay(), this.o.daysOfWeekHighlighted) && c.push("highlighted"), this.range && (b > this.range[0] && b < this.range[this.range.length - 1] && c.push("range"), -1 !== a.inArray(b.valueOf(), this.range) && c.push("selected"), b.valueOf() === this.range[0] && c.push("range-start"), b.valueOf() === this.range[this.range.length - 1] && c.push("range-end")), c; }, _fill_yearsView: function _fill_yearsView(c, d, e, f, g, h, i) { for (var j, k, l, m = "", n = e / 10, o = this.picker.find(c), p = Math.floor(f / e) * e, q = p + 9 * n, r = Math.floor(this.viewDate.getFullYear() / n) * n, s = a.map(this.dates, function (a) { return Math.floor(a.getUTCFullYear() / n) * n; }), t = p - n; t <= q + n; t += n) { j = [d], k = null, t === p - n ? j.push("old") : t === q + n && j.push("new"), -1 !== a.inArray(t, s) && j.push("active"), (t < g || t > h) && j.push("disabled"), t === r && j.push("focused"), i !== a.noop && (l = i(new Date(t, 0, 1)), l === b ? l = {} : "boolean" == typeof l ? l = { enabled: l } : "string" == typeof l && (l = { classes: l }), !1 === l.enabled && j.push("disabled"), l.classes && (j = j.concat(l.classes.split(/\s+/))), l.tooltip && (k = l.tooltip)), m += '" + t + ""; } o.find(".datepicker-switch").text(p + "-" + q), o.find("td").html(m); }, fill: function fill() { var e, f, g = new Date(this.viewDate), h = g.getUTCFullYear(), i = g.getUTCMonth(), j = this.o.startDate !== -1 / 0 ? this.o.startDate.getUTCFullYear() : -1 / 0, k = this.o.startDate !== -1 / 0 ? this.o.startDate.getUTCMonth() : -1 / 0, l = this.o.endDate !== 1 / 0 ? this.o.endDate.getUTCFullYear() : 1 / 0, m = this.o.endDate !== 1 / 0 ? this.o.endDate.getUTCMonth() : 1 / 0, n = q[this.o.language].today || q.en.today || "", o = q[this.o.language].clear || q.en.clear || "", p = q[this.o.language].titleFormat || q.en.titleFormat, s = d(), t = (!0 === this.o.todayBtn || "linked" === this.o.todayBtn) && s >= this.o.startDate && s <= this.o.endDate && !this.weekOfDateIsDisabled(s); if (!isNaN(h) && !isNaN(i)) { this.picker.find(".datepicker-days .datepicker-switch").text(r.formatDate(g, p, this.o.language)), this.picker.find("tfoot .today").text(n).css("display", t ? "table-cell" : "none"), this.picker.find("tfoot .clear").text(o).css("display", !0 === this.o.clearBtn ? "table-cell" : "none"), this.picker.find("thead .datepicker-title").text(this.o.title).css("display", "string" == typeof this.o.title && "" !== this.o.title ? "table-cell" : "none"), this.updateNavArrows(), this.fillMonths(); var u = c(h, i, 0), v = u.getUTCDate(); u.setUTCDate(v - (u.getUTCDay() - this.o.weekStart + 7) % 7); var w = new Date(u); u.getUTCFullYear() < 100 && w.setUTCFullYear(u.getUTCFullYear()), w.setUTCDate(w.getUTCDate() + 42), w = w.valueOf(); for (var x, y, z = []; u.valueOf() < w;) { if ((x = u.getUTCDay()) === this.o.weekStart && (z.push(""), this.o.calendarWeeks)) { var A = new Date(+u + (this.o.weekStart - x - 7) % 7 * 864e5), B = new Date(Number(A) + (11 - A.getUTCDay()) % 7 * 864e5), C = new Date(Number(C = c(B.getUTCFullYear(), 0, 1)) + (11 - C.getUTCDay()) % 7 * 864e5), D = (B - C) / 864e5 / 7 + 1; z.push('"); } y = this.getClassNames(u), y.push("day"); var E = u.getUTCDate(); this.o.beforeShowDay !== a.noop && (f = this.o.beforeShowDay(this._utc_to_local(u)), f === b ? f = {} : "boolean" == typeof f ? f = { enabled: f } : "string" == typeof f && (f = { classes: f }), !1 === f.enabled && y.push("disabled"), f.classes && (y = y.concat(f.classes.split(/\s+/))), f.tooltip && (e = f.tooltip), f.content && (E = f.content)), y = a.isFunction(a.uniqueSort) ? a.uniqueSort(y) : a.unique(y), z.push('"), e = null, x === this.o.weekEnd && z.push(""), u.setUTCDate(u.getUTCDate() + 1); } this.picker.find(".datepicker-days tbody").html(z.join("")); var F = q[this.o.language].monthsTitle || q.en.monthsTitle || "Months", G = this.picker.find(".datepicker-months").find(".datepicker-switch").text(this.o.maxViewMode < 2 ? F : h).end().find("tbody span").removeClass("active"); if (a.each(this.dates, function (a, b) { b.getUTCFullYear() === h && G.eq(b.getUTCMonth()).addClass("active"); }), (h < j || h > l) && G.addClass("disabled"), h === j && G.slice(0, k).addClass("disabled"), h === l && G.slice(m + 1).addClass("disabled"), this.o.beforeShowMonth !== a.noop) { var H = this; a.each(G, function (c, d) { var e = new Date(h, c, 1), f = H.o.beforeShowMonth(e); f === b ? f = {} : "boolean" == typeof f ? f = { enabled: f } : "string" == typeof f && (f = { classes: f }), !1 !== f.enabled || a(d).hasClass("disabled") || a(d).addClass("disabled"), f.classes && a(d).addClass(f.classes), f.tooltip && a(d).prop("title", f.tooltip); }); } this._fill_yearsView(".datepicker-years", "year", 10, h, j, l, this.o.beforeShowYear), this._fill_yearsView(".datepicker-decades", "decade", 100, h, j, l, this.o.beforeShowDecade), this._fill_yearsView(".datepicker-centuries", "century", 1e3, h, j, l, this.o.beforeShowCentury); } }, updateNavArrows: function updateNavArrows() { if (this._allow_update) { var a, b, c = new Date(this.viewDate), d = c.getUTCFullYear(), e = c.getUTCMonth(), f = this.o.startDate !== -1 / 0 ? this.o.startDate.getUTCFullYear() : -1 / 0, g = this.o.startDate !== -1 / 0 ? this.o.startDate.getUTCMonth() : -1 / 0, h = this.o.endDate !== 1 / 0 ? this.o.endDate.getUTCFullYear() : 1 / 0, i = this.o.endDate !== 1 / 0 ? this.o.endDate.getUTCMonth() : 1 / 0, j = 1; switch (this.viewMode) { case 4: j *= 10; case 3: j *= 10; case 2: j *= 10; case 1: a = Math.floor(d / j) * j <= f, b = Math.floor(d / j) * j + j > h; break; case 0: a = d <= f && e <= g, b = d >= h && e >= i; } this.picker.find(".prev").toggleClass("disabled", a), this.picker.find(".next").toggleClass("disabled", b); } }, click: function click(b) { b.preventDefault(), b.stopPropagation(); var e, f, g, h; e = a(b.target), e.hasClass("datepicker-switch") && this.viewMode !== this.o.maxViewMode && this.setViewMode(this.viewMode + 1), e.hasClass("today") && !e.hasClass("day") && (this.setViewMode(0), this._setDate(d(), "linked" === this.o.todayBtn ? null : "view")), e.hasClass("clear") && this.clearDates(), e.hasClass("disabled") || (e.hasClass("month") || e.hasClass("year") || e.hasClass("decade") || e.hasClass("century")) && (this.viewDate.setUTCDate(1), f = 1, 1 === this.viewMode ? (h = e.parent().find("span").index(e), g = this.viewDate.getUTCFullYear(), this.viewDate.setUTCMonth(h)) : (h = 0, g = Number(e.text()), this.viewDate.setUTCFullYear(g)), this._trigger(r.viewModes[this.viewMode - 1].e, this.viewDate), this.viewMode === this.o.minViewMode ? this._setDate(c(g, h, f)) : (this.setViewMode(this.viewMode - 1), this.fill())), this.picker.is(":visible") && this._focused_from && this._focused_from.focus(), delete this._focused_from; }, dayCellClick: function dayCellClick(b) { var c = a(b.currentTarget), d = c.data("date"), e = new Date(d); this.o.updateViewDate && (e.getUTCFullYear() !== this.viewDate.getUTCFullYear() && this._trigger("changeYear", this.viewDate), e.getUTCMonth() !== this.viewDate.getUTCMonth() && this._trigger("changeMonth", this.viewDate)), this._setDate(e); }, navArrowsClick: function navArrowsClick(b) { var c = a(b.currentTarget), d = c.hasClass("prev") ? -1 : 1; 0 !== this.viewMode && (d *= 12 * r.viewModes[this.viewMode].navStep), this.viewDate = this.moveMonth(this.viewDate, d), this._trigger(r.viewModes[this.viewMode].e, this.viewDate), this.fill(); }, _toggle_multidate: function _toggle_multidate(a) { var b = this.dates.contains(a); if (a || this.dates.clear(), -1 !== b ? (!0 === this.o.multidate || this.o.multidate > 1 || this.o.toggleActive) && this.dates.remove(b) : !1 === this.o.multidate ? (this.dates.clear(), this.dates.push(a)) : this.dates.push(a), "number" == typeof this.o.multidate) for (; this.dates.length > this.o.multidate;) { this.dates.remove(0); } }, _setDate: function _setDate(a, b) { b && "date" !== b || this._toggle_multidate(a && new Date(a)), (!b && this.o.updateViewDate || "view" === b) && (this.viewDate = a && new Date(a)), this.fill(), this.setValue(), b && "view" === b || this._trigger("changeDate"), this.inputField.trigger("change"), !this.o.autoclose || b && "date" !== b || this.hide(); }, moveDay: function moveDay(a, b) { var c = new Date(a); return c.setUTCDate(a.getUTCDate() + b), c; }, moveWeek: function moveWeek(a, b) { return this.moveDay(a, 7 * b); }, moveMonth: function moveMonth(a, b) { if (!g(a)) return this.o.defaultViewDate; if (!b) return a; var c, d, e = new Date(a.valueOf()), f = e.getUTCDate(), h = e.getUTCMonth(), i = Math.abs(b); if (b = b > 0 ? 1 : -1, 1 === i) d = -1 === b ? function () { return e.getUTCMonth() === h; } : function () { return e.getUTCMonth() !== c; }, c = h + b, e.setUTCMonth(c), c = (c + 12) % 12;else { for (var j = 0; j < i; j++) { e = this.moveMonth(e, b); } c = e.getUTCMonth(), e.setUTCDate(f), d = function d() { return c !== e.getUTCMonth(); }; } for (; d();) { e.setUTCDate(--f), e.setUTCMonth(c); } return e; }, moveYear: function moveYear(a, b) { return this.moveMonth(a, 12 * b); }, moveAvailableDate: function moveAvailableDate(a, b, c) { do { if (a = this[c](a, b), !this.dateWithinRange(a)) return !1; c = "moveDay"; } while (this.dateIsDisabled(a)); return a; }, weekOfDateIsDisabled: function weekOfDateIsDisabled(b) { return -1 !== a.inArray(b.getUTCDay(), this.o.daysOfWeekDisabled); }, dateIsDisabled: function dateIsDisabled(b) { return this.weekOfDateIsDisabled(b) || a.grep(this.o.datesDisabled, function (a) { return e(b, a); }).length > 0; }, dateWithinRange: function dateWithinRange(a) { return a >= this.o.startDate && a <= this.o.endDate; }, keydown: function keydown(a) { if (!this.picker.is(":visible")) return void (40 !== a.keyCode && 27 !== a.keyCode || (this.show(), a.stopPropagation())); var b, c, d = !1, e = this.focusDate || this.viewDate; switch (a.keyCode) { case 27: this.focusDate ? (this.focusDate = null, this.viewDate = this.dates.get(-1) || this.viewDate, this.fill()) : this.hide(), a.preventDefault(), a.stopPropagation(); break; case 37: case 38: case 39: case 40: if (!this.o.keyboardNavigation || 7 === this.o.daysOfWeekDisabled.length) break; b = 37 === a.keyCode || 38 === a.keyCode ? -1 : 1, 0 === this.viewMode ? a.ctrlKey ? (c = this.moveAvailableDate(e, b, "moveYear")) && this._trigger("changeYear", this.viewDate) : a.shiftKey ? (c = this.moveAvailableDate(e, b, "moveMonth")) && this._trigger("changeMonth", this.viewDate) : 37 === a.keyCode || 39 === a.keyCode ? c = this.moveAvailableDate(e, b, "moveDay") : this.weekOfDateIsDisabled(e) || (c = this.moveAvailableDate(e, b, "moveWeek")) : 1 === this.viewMode ? (38 !== a.keyCode && 40 !== a.keyCode || (b *= 4), c = this.moveAvailableDate(e, b, "moveMonth")) : 2 === this.viewMode && (38 !== a.keyCode && 40 !== a.keyCode || (b *= 4), c = this.moveAvailableDate(e, b, "moveYear")), c && (this.focusDate = this.viewDate = c, this.setValue(), this.fill(), a.preventDefault()); break; case 13: if (!this.o.forceParse) break; e = this.focusDate || this.dates.get(-1) || this.viewDate, this.o.keyboardNavigation && (this._toggle_multidate(e), d = !0), this.focusDate = null, this.viewDate = this.dates.get(-1) || this.viewDate, this.setValue(), this.fill(), this.picker.is(":visible") && (a.preventDefault(), a.stopPropagation(), this.o.autoclose && this.hide()); break; case 9: this.focusDate = null, this.viewDate = this.dates.get(-1) || this.viewDate, this.fill(), this.hide(); } d && (this.dates.length ? this._trigger("changeDate") : this._trigger("clearDate"), this.inputField.trigger("change")); }, setViewMode: function setViewMode(a) { this.viewMode = a, this.picker.children("div").hide().filter(".datepicker-" + r.viewModes[this.viewMode].clsName).show(), this.updateNavArrows(), this._trigger("changeViewMode", new Date(this.viewDate)); } }; var l = function l(b, c) { a.data(b, "datepicker", this), this.element = a(b), this.inputs = a.map(c.inputs, function (a) { return a.jquery ? a[0] : a; }), delete c.inputs, this.keepEmptyValues = c.keepEmptyValues, delete c.keepEmptyValues, n.call(a(this.inputs), c).on("changeDate", a.proxy(this.dateUpdated, this)), this.pickers = a.map(this.inputs, function (b) { return a.data(b, "datepicker"); }), this.updateDates(); }; l.prototype = { updateDates: function updateDates() { this.dates = a.map(this.pickers, function (a) { return a.getUTCDate(); }), this.updateRanges(); }, updateRanges: function updateRanges() { var b = a.map(this.dates, function (a) { return a.valueOf(); }); a.each(this.pickers, function (a, c) { c.setRange(b); }); }, clearDates: function clearDates() { a.each(this.pickers, function (a, b) { b.clearDates(); }); }, dateUpdated: function dateUpdated(c) { if (!this.updating) { this.updating = !0; var d = a.data(c.target, "datepicker"); if (d !== b) { var e = d.getUTCDate(), f = this.keepEmptyValues, g = a.inArray(c.target, this.inputs), h = g - 1, i = g + 1, j = this.inputs.length; if (-1 !== g) { if (a.each(this.pickers, function (a, b) { b.getUTCDate() || b !== d && f || b.setUTCDate(e); }), e < this.dates[h]) for (; h >= 0 && e < this.dates[h];) { this.pickers[h--].setUTCDate(e); } else if (e > this.dates[i]) for (; i < j && e > this.dates[i];) { this.pickers[i++].setUTCDate(e); } this.updateDates(), delete this.updating; } } } }, destroy: function destroy() { a.map(this.pickers, function (a) { a.destroy(); }), a(this.inputs).off("changeDate", this.dateUpdated), delete this.element.data().datepicker; }, remove: f("destroy", "Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead") }; var m = a.fn.datepicker, n = function n(c) { var d = Array.apply(null, arguments); d.shift(); var e; if (this.each(function () { var b = a(this), f = b.data("datepicker"), g = "object" == _typeof(c) && c; if (!f) { var j = h(this, "date"), m = a.extend({}, o, j, g), n = i(m.language), p = a.extend({}, o, n, j, g); b.hasClass("input-daterange") || p.inputs ? (a.extend(p, { inputs: p.inputs || b.find("input").toArray() }), f = new l(this, p)) : f = new k(this, p), b.data("datepicker", f); } "string" == typeof c && "function" == typeof f[c] && (e = f[c].apply(f, d)); }), e === b || e instanceof k || e instanceof l) return this; if (this.length > 1) throw new Error("Using only allowed for the collection of a single element (" + c + " function)"); return e; }; a.fn.datepicker = n; var o = a.fn.datepicker.defaults = { assumeNearbyYear: !1, autoclose: !1, beforeShowDay: a.noop, beforeShowMonth: a.noop, beforeShowYear: a.noop, beforeShowDecade: a.noop, beforeShowCentury: a.noop, calendarWeeks: !1, clearBtn: !1, toggleActive: !1, daysOfWeekDisabled: [], daysOfWeekHighlighted: [], datesDisabled: [], endDate: 1 / 0, forceParse: !0, format: "mm/dd/yyyy", keepEmptyValues: !1, keyboardNavigation: !0, language: "en", minViewMode: 0, maxViewMode: 4, multidate: !1, multidateSeparator: ",", orientation: "auto", rtl: !1, startDate: -1 / 0, startView: 0, todayBtn: !1, todayHighlight: !1, updateViewDate: !0, weekStart: 0, disableTouchKeyboard: !1, enableOnReadonly: !0, showOnFocus: !0, zIndexOffset: 10, container: "body", immediateUpdates: !1, title: "", templates: { leftArrow: "«", rightArrow: "»" }, showWeekDays: !0 }, p = a.fn.datepicker.locale_opts = ["format", "rtl", "weekStart"]; a.fn.datepicker.Constructor = k; var q = a.fn.datepicker.dates = { en: { days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], today: "Today", clear: "Clear", titleFormat: "MM yyyy" } }, r = { viewModes: [{ names: ["days", "month"], clsName: "days", e: "changeMonth" }, { names: ["months", "year"], clsName: "months", e: "changeYear", navStep: 1 }, { names: ["years", "decade"], clsName: "years", e: "changeDecade", navStep: 10 }, { names: ["decades", "century"], clsName: "decades", e: "changeCentury", navStep: 100 }, { names: ["centuries", "millennium"], clsName: "centuries", e: "changeMillennium", navStep: 1e3 }], validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g, nonpunctuation: /[^ -\/:-@\u5e74\u6708\u65e5\[-`{-~\t\n\r]+/g, parseFormat: function parseFormat(a) { if ("function" == typeof a.toValue && "function" == typeof a.toDisplay) return a; var b = a.replace(this.validParts, "\0").split("\0"), c = a.match(this.validParts); if (!b || !b.length || !c || 0 === c.length) throw new Error("Invalid date format."); return { separators: b, parts: c }; }, parseDate: function parseDate(c, e, f, g) { function h(a, b) { return !0 === b && (b = 10), a < 100 && (a += 2e3) > new Date().getFullYear() + b && (a -= 100), a; } function i() { var a = this.slice(0, j[n].length), b = j[n].slice(0, a.length); return a.toLowerCase() === b.toLowerCase(); } if (!c) return b; if (c instanceof Date) return c; if ("string" == typeof e && (e = r.parseFormat(e)), e.toValue) return e.toValue(c, e, f); var j, l, m, n, o, p = { d: "moveDay", m: "moveMonth", w: "moveWeek", y: "moveYear" }, s = { yesterday: "-1d", today: "+0d", tomorrow: "+1d" }; if (c in s && (c = s[c]), /^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/i.test(c)) { for (j = c.match(/([\-+]\d+)([dmwy])/gi), c = new Date(), n = 0; n < j.length; n++) { l = j[n].match(/([\-+]\d+)([dmwy])/i), m = Number(l[1]), o = p[l[2].toLowerCase()], c = k.prototype[o](c, m); } return k.prototype._zero_utc_time(c); } j = c && c.match(this.nonpunctuation) || []; var t, u, v = {}, w = ["yyyy", "yy", "M", "MM", "m", "mm", "d", "dd"], x = { yyyy: function yyyy(a, b) { return a.setUTCFullYear(g ? h(b, g) : b); }, m: function m(a, b) { if (isNaN(a)) return a; for (b -= 1; b < 0;) { b += 12; } for (b %= 12, a.setUTCMonth(b); a.getUTCMonth() !== b;) { a.setUTCDate(a.getUTCDate() - 1); } return a; }, d: function d(a, b) { return a.setUTCDate(b); } }; x.yy = x.yyyy, x.M = x.MM = x.mm = x.m, x.dd = x.d, c = d(); var y = e.parts.slice(); if (j.length !== y.length && (y = a(y).filter(function (b, c) { return -1 !== a.inArray(c, w); }).toArray()), j.length === y.length) { var z; for (n = 0, z = y.length; n < z; n++) { if (t = parseInt(j[n], 10), l = y[n], isNaN(t)) switch (l) { case "MM": u = a(q[f].months).filter(i), t = a.inArray(u[0], q[f].months) + 1; break; case "M": u = a(q[f].monthsShort).filter(i), t = a.inArray(u[0], q[f].monthsShort) + 1; } v[l] = t; } var A, B; for (n = 0; n < w.length; n++) { (B = w[n]) in v && !isNaN(v[B]) && (A = new Date(c), x[B](A, v[B]), isNaN(A) || (c = A)); } } return c; }, formatDate: function formatDate(b, c, d) { if (!b) return ""; if ("string" == typeof c && (c = r.parseFormat(c)), c.toDisplay) return c.toDisplay(b, c, d); var e = { d: b.getUTCDate(), D: q[d].daysShort[b.getUTCDay()], DD: q[d].days[b.getUTCDay()], m: b.getUTCMonth() + 1, M: q[d].monthsShort[b.getUTCMonth()], MM: q[d].months[b.getUTCMonth()], yy: b.getUTCFullYear().toString().substring(2), yyyy: b.getUTCFullYear() }; e.dd = (e.d < 10 ? "0" : "") + e.d, e.mm = (e.m < 10 ? "0" : "") + e.m, b = []; for (var f = a.extend([], c.separators), g = 0, h = c.parts.length; g <= h; g++) { f.length && b.push(f.shift()), b.push(e[c.parts[g]]); } return b.join(""); }, headTemplate: '", contTemplate: '', footTemplate: '' }; r.template = '
/ elements with colspans. SOLUTION: making individual
_this.frameElRefs = new common.RefMap(); // the fc-daygrid-day-frame _this.fgElRefs = new common.RefMap(); // the fc-daygrid-day-events _this.segHarnessRefs = new common.RefMap(); // indexed by "instanceId:firstCol" _this.rootElRef = common.createRef(); _this.state = { framePositions: null, maxContentHeight: null, eventInstanceHeights: {} }; return _this; } TableRow.prototype.render = function () { var _this = this; var _a = this, props = _a.props, state = _a.state, context = _a.context; var options = context.options; var colCnt = props.cells.length; var businessHoursByCol = splitSegsByFirstCol(props.businessHourSegs, colCnt); var bgEventSegsByCol = splitSegsByFirstCol(props.bgEventSegs, colCnt); var highlightSegsByCol = splitSegsByFirstCol(this.getHighlightSegs(), colCnt); var mirrorSegsByCol = splitSegsByFirstCol(this.getMirrorSegs(), colCnt); var _b = computeFgSegPlacement(common.sortEventSegs(props.fgEventSegs, options.eventOrder), props.dayMaxEvents, props.dayMaxEventRows, options.eventOrderStrict, state.eventInstanceHeights, state.maxContentHeight, props.cells), singleColPlacements = _b.singleColPlacements, multiColPlacements = _b.multiColPlacements, moreCnts = _b.moreCnts, moreMarginTops = _b.moreMarginTops; var isForcedInvisible = // TODO: messy way to compute this props.eventDrag && props.eventDrag.affectedInstances || props.eventResize && props.eventResize.affectedInstances || {}; return common.createElement("tr", { ref: this.rootElRef, role: "row" }, props.renderIntro && props.renderIntro(), props.cells.map(function (cell, col) { var normalFgNodes = _this.renderFgSegs(col, props.forPrint ? singleColPlacements[col] : multiColPlacements[col], props.todayRange, isForcedInvisible); var mirrorFgNodes = _this.renderFgSegs(col, buildMirrorPlacements(mirrorSegsByCol[col], multiColPlacements), props.todayRange, {}, Boolean(props.eventDrag), Boolean(props.eventResize), false); return common.createElement(TableCell, { key: cell.key, elRef: _this.cellElRefs.createRef(cell.key), innerElRef: _this.frameElRefs.createRef(cell.key) /* FF problem, but okay to use for left/right. TODO: rename prop */ , dateProfile: props.dateProfile, date: cell.date, showDayNumber: props.showDayNumbers, showWeekNumber: props.showWeekNumbers && col === 0, forceDayTop: props.showWeekNumbers /* even displaying weeknum for row, not necessarily day */ , todayRange: props.todayRange, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, extraHookProps: cell.extraHookProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, extraDateSpan: cell.extraDateSpan, moreCnt: moreCnts[col], moreMarginTop: moreMarginTops[col], singlePlacements: singleColPlacements[col], fgContentElRef: _this.fgElRefs.createRef(cell.key), fgContent: // Fragment scopes the keys common.createElement(common.Fragment, null, common.createElement(common.Fragment, null, normalFgNodes), common.createElement(common.Fragment, null, mirrorFgNodes)), bgContent: // Fragment scopes the keys common.createElement(common.Fragment, null, _this.renderFillSegs(highlightSegsByCol[col], 'highlight'), _this.renderFillSegs(businessHoursByCol[col], 'non-business'), _this.renderFillSegs(bgEventSegsByCol[col], 'bg-event')) }); })); }; TableRow.prototype.componentDidMount = function () { this.updateSizing(true); }; TableRow.prototype.componentDidUpdate = function (prevProps, prevState) { var currentProps = this.props; this.updateSizing(!common.isPropsEqual(prevProps, currentProps)); }; TableRow.prototype.getHighlightSegs = function () { var props = this.props; if (props.eventDrag && props.eventDrag.segs.length) { // messy check return props.eventDrag.segs; } if (props.eventResize && props.eventResize.segs.length) { // messy check return props.eventResize.segs; } return props.dateSelectionSegs; }; TableRow.prototype.getMirrorSegs = function () { var props = this.props; if (props.eventResize && props.eventResize.segs.length) { // messy check return props.eventResize.segs; } return []; }; TableRow.prototype.renderFgSegs = function (col, segPlacements, todayRange, isForcedInvisible, isDragging, isResizing, isDateSelecting) { var context = this.context; var eventSelection = this.props.eventSelection; var framePositions = this.state.framePositions; var defaultDisplayEventEnd = this.props.cells.length === 1; // colCnt === 1 var isMirror = isDragging || isResizing || isDateSelecting; var nodes = []; if (framePositions) { for (var _i = 0, segPlacements_1 = segPlacements; _i < segPlacements_1.length; _i++) { var placement = segPlacements_1[_i]; var seg = placement.seg; var instanceId = seg.eventRange.instance.instanceId; var key = instanceId + ':' + col; var isVisible = placement.isVisible && !isForcedInvisible[instanceId]; var isAbsolute = placement.isAbsolute; var left = ''; var right = ''; if (isAbsolute) { if (context.isRtl) { right = 0; left = framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol]; } else { left = 0; right = framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol]; } } /* known bug: events that are force to be list-item but span multiple days still take up space in later columns todo: in print view, for multi-day events, don't display title within non-start/end segs */ nodes.push(common.createElement("div", { className: 'fc-daygrid-event-harness' + (isAbsolute ? ' fc-daygrid-event-harness-abs' : ''), key: key, ref: isMirror ? null : this.segHarnessRefs.createRef(key), style: { visibility: isVisible ? '' : 'hidden', marginTop: isAbsolute ? '' : placement.marginTop, top: isAbsolute ? placement.absoluteTop : '', left: left, right: right } }, hasListItemDisplay(seg) ? common.createElement(TableListItemEvent, tslib.__assign({ seg: seg, isDragging: isDragging, isSelected: instanceId === eventSelection, defaultDisplayEventEnd: defaultDisplayEventEnd }, common.getSegMeta(seg, todayRange))) : common.createElement(TableBlockEvent, tslib.__assign({ seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === eventSelection, defaultDisplayEventEnd: defaultDisplayEventEnd }, common.getSegMeta(seg, todayRange))))); } } return nodes; }; TableRow.prototype.renderFillSegs = function (segs, fillType) { var isRtl = this.context.isRtl; var todayRange = this.props.todayRange; var framePositions = this.state.framePositions; var nodes = []; if (framePositions) { for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) { var seg = segs_1[_i]; var leftRightCss = isRtl ? { right: 0, left: framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol] } : { left: 0, right: framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol] }; nodes.push(common.createElement("div", { key: common.buildEventRangeKey(seg.eventRange), className: "fc-daygrid-bg-harness", style: leftRightCss }, fillType === 'bg-event' ? common.createElement(common.BgEvent, tslib.__assign({ seg: seg }, common.getSegMeta(seg, todayRange))) : common.renderFill(fillType))); } } return common.createElement.apply(void 0, tslib.__spreadArray([common.Fragment, {}], nodes)); }; TableRow.prototype.updateSizing = function (isExternalSizingChange) { var _a = this, props = _a.props, frameElRefs = _a.frameElRefs; if (!props.forPrint && props.clientWidth !== null // positioning ready? ) { if (isExternalSizingChange) { var frameEls = props.cells.map(function (cell) { return frameElRefs.currentMap[cell.key]; }); if (frameEls.length) { var originEl = this.rootElRef.current; this.setState({ framePositions: new common.PositionCache(originEl, frameEls, true, // isHorizontal false) }); } } var oldInstanceHeights = this.state.eventInstanceHeights; var newInstanceHeights = this.queryEventInstanceHeights(); var limitByContentHeight = props.dayMaxEvents === true || props.dayMaxEventRows === true; this.safeSetState({ // HACK to prevent oscillations of events being shown/hidden from max-event-rows // Essentially, once you compute an element's height, never null-out. // TODO: always display all events, as visibility:hidden? eventInstanceHeights: tslib.__assign(tslib.__assign({}, oldInstanceHeights), newInstanceHeights), maxContentHeight: limitByContentHeight ? this.computeMaxContentHeight() : null }); } }; TableRow.prototype.queryEventInstanceHeights = function () { var segElMap = this.segHarnessRefs.currentMap; var eventInstanceHeights = {}; // get the max height amongst instance segs for (var key in segElMap) { var height = Math.round(segElMap[key].getBoundingClientRect().height); var instanceId = key.split(':')[0]; // deconstruct how renderFgSegs makes the key eventInstanceHeights[instanceId] = Math.max(eventInstanceHeights[instanceId] || 0, height); } return eventInstanceHeights; }; TableRow.prototype.computeMaxContentHeight = function () { var firstKey = this.props.cells[0].key; var cellEl = this.cellElRefs.currentMap[firstKey]; var fcContainerEl = this.fgElRefs.currentMap[firstKey]; return cellEl.getBoundingClientRect().bottom - fcContainerEl.getBoundingClientRect().top; }; TableRow.prototype.getCellEls = function () { var elMap = this.cellElRefs.currentMap; return this.props.cells.map(function (cell) { return elMap[cell.key]; }); }; return TableRow; }(common.DateComponent); TableRow.addStateEquality({ eventInstanceHeights: common.isPropsEqual }); function buildMirrorPlacements(mirrorSegs, colPlacements) { if (!mirrorSegs.length) { return []; } var topsByInstanceId = buildAbsoluteTopHash(colPlacements); // TODO: cache this at first render? return mirrorSegs.map(function (seg) { return { seg: seg, isVisible: true, isAbsolute: true, absoluteTop: topsByInstanceId[seg.eventRange.instance.instanceId], marginTop: 0 }; }); } function buildAbsoluteTopHash(colPlacements) { var topsByInstanceId = {}; for (var _i = 0, colPlacements_1 = colPlacements; _i < colPlacements_1.length; _i++) { var placements = colPlacements_1[_i]; for (var _a = 0, placements_1 = placements; _a < placements_1.length; _a++) { var placement = placements_1[_a]; topsByInstanceId[placement.seg.eventRange.instance.instanceId] = placement.absoluteTop; } } return topsByInstanceId; } var Table = /** @class */ function (_super) { tslib.__extends(Table, _super); function Table() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.splitBusinessHourSegs = common.memoize(splitSegsByRow); _this.splitBgEventSegs = common.memoize(splitSegsByRow); _this.splitFgEventSegs = common.memoize(splitSegsByRow); _this.splitDateSelectionSegs = common.memoize(splitSegsByRow); _this.splitEventDrag = common.memoize(splitInteractionByRow); _this.splitEventResize = common.memoize(splitInteractionByRow); _this.rowRefs = new common.RefMap(); _this.handleRootEl = function (rootEl) { _this.rootEl = rootEl; if (rootEl) { _this.context.registerInteractiveComponent(_this, { el: rootEl, isHitComboAllowed: _this.props.isHitComboAllowed }); } else { _this.context.unregisterInteractiveComponent(_this); } }; return _this; } Table.prototype.render = function () { var _this = this; var props = this.props; var dateProfile = props.dateProfile, dayMaxEventRows = props.dayMaxEventRows, dayMaxEvents = props.dayMaxEvents, expandRows = props.expandRows; var rowCnt = props.cells.length; var businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, rowCnt); var bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, rowCnt); var fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs, rowCnt); var dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, rowCnt); var eventDragByRow = this.splitEventDrag(props.eventDrag, rowCnt); var eventResizeByRow = this.splitEventResize(props.eventResize, rowCnt); var limitViaBalanced = dayMaxEvents === true || dayMaxEventRows === true; // if rows can't expand to fill fixed height, can't do balanced-height event limit // TODO: best place to normalize these options? if (limitViaBalanced && !expandRows) { limitViaBalanced = false; dayMaxEventRows = null; dayMaxEvents = null; } var classNames = ['fc-daygrid-body', limitViaBalanced ? 'fc-daygrid-body-balanced' : 'fc-daygrid-body-unbalanced', expandRows ? '' : 'fc-daygrid-body-natural' // will height of one row depend on the others? ]; return common.createElement("div", { className: classNames.join(' '), ref: this.handleRootEl, style: { // these props are important to give this wrapper correct dimensions for interactions // TODO: if we set it here, can we avoid giving to inner tables? width: props.clientWidth, minWidth: props.tableMinWidth } }, common.createElement(common.NowTimer, { unit: "day" }, function (nowDate, todayRange) { return common.createElement(common.Fragment, null, common.createElement("table", { role: "presentation", className: "fc-scrollgrid-sync-table", style: { width: props.clientWidth, minWidth: props.tableMinWidth, height: expandRows ? props.clientHeight : '' } }, props.colGroupNode, common.createElement("tbody", { role: "presentation" }, props.cells.map(function (cells, row) { return common.createElement(TableRow, { ref: _this.rowRefs.createRef(row), key: cells.length ? cells[0].date.toISOString() /* best? or put key on cell? or use diff formatter? */ : row // in case there are no cells (like when resource view is loading) , showDayNumbers: rowCnt > 1, showWeekNumbers: props.showWeekNumbers, todayRange: todayRange, dateProfile: dateProfile, cells: cells, renderIntro: props.renderRowIntro, businessHourSegs: businessHourSegsByRow[row], eventSelection: props.eventSelection, bgEventSegs: bgEventSegsByRow[row].filter(isSegAllDay) /* hack */ , fgEventSegs: fgEventSegsByRow[row], dateSelectionSegs: dateSelectionSegsByRow[row], eventDrag: eventDragByRow[row], eventResize: eventResizeByRow[row], dayMaxEvents: dayMaxEvents, dayMaxEventRows: dayMaxEventRows, clientWidth: props.clientWidth, clientHeight: props.clientHeight, forPrint: props.forPrint }); })))); })); }; // Hit System // ---------------------------------------------------------------------------------------------------- Table.prototype.prepareHits = function () { this.rowPositions = new common.PositionCache(this.rootEl, this.rowRefs.collect().map(function (rowObj) { return rowObj.getCellEls()[0]; }), // first cell el in each row. TODO: not optimal false, true); this.colPositions = new common.PositionCache(this.rootEl, this.rowRefs.currentMap[0].getCellEls(), // cell els in first row true, // horizontal false); }; Table.prototype.queryHit = function (positionLeft, positionTop) { var _a = this, colPositions = _a.colPositions, rowPositions = _a.rowPositions; var col = colPositions.leftToIndex(positionLeft); var row = rowPositions.topToIndex(positionTop); if (row != null && col != null) { var cell = this.props.cells[row][col]; return { dateProfile: this.props.dateProfile, dateSpan: tslib.__assign({ range: this.getCellRange(row, col), allDay: true }, cell.extraDateSpan), dayEl: this.getCellEl(row, col), rect: { left: colPositions.lefts[col], right: colPositions.rights[col], top: rowPositions.tops[row], bottom: rowPositions.bottoms[row] }, layer: 0 }; } return null; }; Table.prototype.getCellEl = function (row, col) { return this.rowRefs.currentMap[row].getCellEls()[col]; // TODO: not optimal }; Table.prototype.getCellRange = function (row, col) { var start = this.props.cells[row][col].date; var end = common.addDays(start, 1); return { start: start, end: end }; }; return Table; }(common.DateComponent); function isSegAllDay(seg) { return seg.eventRange.def.allDay; } var DayTableSlicer = /** @class */ function (_super) { tslib.__extends(DayTableSlicer, _super); function DayTableSlicer() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.forceDayIfListItem = true; return _this; } DayTableSlicer.prototype.sliceRange = function (dateRange, dayTableModel) { return dayTableModel.sliceRange(dateRange); }; return DayTableSlicer; }(common.Slicer); var DayTable = /** @class */ function (_super) { tslib.__extends(DayTable, _super); function DayTable() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.slicer = new DayTableSlicer(); _this.tableRef = common.createRef(); return _this; } DayTable.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; return common.createElement(Table, tslib.__assign({ ref: this.tableRef }, this.slicer.sliceProps(props, props.dateProfile, props.nextDayThreshold, context, props.dayTableModel), { dateProfile: props.dateProfile, cells: props.dayTableModel.cells, colGroupNode: props.colGroupNode, tableMinWidth: props.tableMinWidth, renderRowIntro: props.renderRowIntro, dayMaxEvents: props.dayMaxEvents, dayMaxEventRows: props.dayMaxEventRows, showWeekNumbers: props.showWeekNumbers, expandRows: props.expandRows, headerAlignElRef: props.headerAlignElRef, clientWidth: props.clientWidth, clientHeight: props.clientHeight, forPrint: props.forPrint })); }; return DayTable; }(common.DateComponent); var DayTableView = /** @class */ function (_super) { tslib.__extends(DayTableView, _super); function DayTableView() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.buildDayTableModel = common.memoize(buildDayTableModel); _this.headerRef = common.createRef(); _this.tableRef = common.createRef(); return _this; } DayTableView.prototype.render = function () { var _this = this; var _a = this.context, options = _a.options, dateProfileGenerator = _a.dateProfileGenerator; var props = this.props; var dayTableModel = this.buildDayTableModel(props.dateProfile, dateProfileGenerator); var headerContent = options.dayHeaders && common.createElement(common.DayHeader, { ref: this.headerRef, dateProfile: props.dateProfile, dates: dayTableModel.headerDates, datesRepDistinctDays: dayTableModel.rowCnt === 1 }); var bodyContent = function bodyContent(contentArg) { return common.createElement(DayTable, { ref: _this.tableRef, dateProfile: props.dateProfile, dayTableModel: dayTableModel, businessHours: props.businessHours, dateSelection: props.dateSelection, eventStore: props.eventStore, eventUiBases: props.eventUiBases, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, nextDayThreshold: options.nextDayThreshold, colGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, dayMaxEvents: options.dayMaxEvents, dayMaxEventRows: options.dayMaxEventRows, showWeekNumbers: options.weekNumbers, expandRows: !props.isHeightAuto, headerAlignElRef: _this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint }); }; return options.dayMinWidth ? this.renderHScrollLayout(headerContent, bodyContent, dayTableModel.colCnt, options.dayMinWidth) : this.renderSimpleLayout(headerContent, bodyContent); }; return DayTableView; }(TableView); function buildDayTableModel(dateProfile, dateProfileGenerator) { var daySeries = new common.DaySeriesModel(dateProfile.renderRange, dateProfileGenerator); return new common.DayTableModel(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit)); } var TableDateProfileGenerator = /** @class */ function (_super) { tslib.__extends(TableDateProfileGenerator, _super); function TableDateProfileGenerator() { return _super !== null && _super.apply(this, arguments) || this; } // Computes the date range that will be rendered. TableDateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) { var dateEnv = this.props.dateEnv; var renderRange = _super.prototype.buildRenderRange.call(this, currentRange, currentRangeUnit, isRangeAllDay); var start = renderRange.start; var end = renderRange.end; var endOfWeek; // year and month views should be aligned with weeks. this is already done for week if (/^(year|month)$/.test(currentRangeUnit)) { start = dateEnv.startOfWeek(start); // make end-of-week if not already endOfWeek = dateEnv.startOfWeek(end); if (endOfWeek.valueOf() !== end.valueOf()) { end = common.addWeeks(endOfWeek, 1); } } // ensure 6 weeks if (this.props.monthMode && this.props.fixedWeekCount) { var rowCnt = Math.ceil( // could be partial weeks due to hiddenDays common.diffWeeks(start, end)); end = common.addWeeks(end, 6 - rowCnt); } return { start: start, end: end }; }; return TableDateProfileGenerator; }(common.DateProfileGenerator); var main = common.createPlugin({ initialView: 'dayGridMonth', views: { dayGrid: { component: DayTableView, dateProfileGeneratorClass: TableDateProfileGenerator }, dayGridDay: { type: 'dayGrid', duration: { days: 1 } }, dayGridWeek: { type: 'dayGrid', duration: { weeks: 1 } }, dayGridMonth: { type: 'dayGrid', duration: { months: 1 }, monthMode: true, fixedWeekCount: true } } }); exports.DayGridView = DayTableView; exports.DayTable = DayTable; exports.DayTableSlicer = DayTableSlicer; exports.Table = Table; exports.TableView = TableView; exports.buildDayTableModel = buildDayTableModel; exports["default"] = main; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImNvbW1vbiIsInJlcXVpcmUiLCJ0c2xpYiIsIlRhYmxlVmlldyIsIl9zdXBlciIsIl9fZXh0ZW5kcyIsIl90aGlzIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJoZWFkZXJFbFJlZiIsImNyZWF0ZVJlZiIsInByb3RvdHlwZSIsInJlbmRlclNpbXBsZUxheW91dCIsImhlYWRlclJvd0NvbnRlbnQiLCJib2R5Q29udGVudCIsIl9hIiwicHJvcHMiLCJjb250ZXh0Iiwic2VjdGlvbnMiLCJzdGlja3lIZWFkZXJEYXRlcyIsImdldFN0aWNreUhlYWRlckRhdGVzIiwib3B0aW9ucyIsInB1c2giLCJ0eXBlIiwia2V5IiwiaXNTdGlja3kiLCJjaHVuayIsImVsUmVmIiwidGFibGVDbGFzc05hbWUiLCJyb3dDb250ZW50IiwibGlxdWlkIiwiY29udGVudCIsImNyZWF0ZUVsZW1lbnQiLCJWaWV3Um9vdCIsInZpZXdTcGVjIiwicm9vdEVsUmVmIiwiY2xhc3NOYW1lcyIsInJlZiIsImNsYXNzTmFtZSIsImNvbmNhdCIsImpvaW4iLCJTaW1wbGVTY3JvbGxHcmlkIiwiaXNIZWlnaHRBdXRvIiwiZm9yUHJpbnQiLCJjb2xsYXBzaWJsZVdpZHRoIiwiY29scyIsInJlbmRlckhTY3JvbGxMYXlvdXQiLCJjb2xDbnQiLCJkYXlNaW5XaWR0aCIsIlNjcm9sbEdyaWQiLCJwbHVnaW5Ib29rcyIsInNjcm9sbEdyaWRJbXBsIiwiRXJyb3IiLCJzdGlja3lGb290ZXJTY3JvbGxiYXIiLCJnZXRTdGlja3lGb290ZXJTY3JvbGxiYXIiLCJjaHVua3MiLCJyZW5kZXJTY3JvbGxTaGltIiwiY29sR3JvdXBzIiwic3BhbiIsIm1pbldpZHRoIiwiRGF0ZUNvbXBvbmVudCIsInNwbGl0U2Vnc0J5Um93Iiwic2VncyIsInJvd0NudCIsImJ5Um93IiwiaSIsIl9pIiwic2Vnc18xIiwibGVuZ3RoIiwic2VnIiwicm93Iiwic3BsaXRTZWdzQnlGaXJzdENvbCIsImJ5Q29sIiwic2Vnc18yIiwiZmlyc3RDb2wiLCJzcGxpdEludGVyYWN0aW9uQnlSb3ciLCJ1aSIsImFmZmVjdGVkSW5zdGFuY2VzIiwiaXNFdmVudCIsIlRhYmxlQ2VsbFRvcCIsInJlbmRlciIsIm5hdkxpbmtBdHRycyIsImJ1aWxkTmF2TGlua0F0dHJzIiwiZGF0ZSIsIkRheUNlbGxDb250ZW50IiwiZGF0ZVByb2ZpbGUiLCJ0b2RheVJhbmdlIiwic2hvd0RheU51bWJlciIsImV4dHJhSG9va1Byb3BzIiwiZGVmYXVsdENvbnRlbnQiLCJyZW5kZXJUb3BJbm5lciIsImlubmVyRWxSZWYiLCJpbm5lckNvbnRlbnQiLCJmb3JjZURheVRvcCIsIl9fYXNzaWduIiwiaWQiLCJkYXlOdW1iZXJJZCIsIkZyYWdtZW50IiwiQmFzZUNvbXBvbmVudCIsImRheU51bWJlclRleHQiLCJERUZBVUxUX1RBQkxFX0VWRU5UX1RJTUVfRk9STUFUIiwiY3JlYXRlRm9ybWF0dGVyIiwiaG91ciIsIm1pbnV0ZSIsIm9taXRaZXJvTWludXRlIiwibWVyaWRpZW0iLCJoYXNMaXN0SXRlbURpc3BsYXkiLCJkaXNwbGF5IiwiZXZlbnRSYW5nZSIsImRlZiIsImFsbERheSIsImxhc3RDb2wiLCJpc1N0YXJ0IiwiaXNFbmQiLCJUYWJsZUJsb2NrRXZlbnQiLCJTdGFuZGFyZEV2ZW50IiwiZXh0cmFDbGFzc05hbWVzIiwiZGVmYXVsdFRpbWVGb3JtYXQiLCJkZWZhdWx0RGlzcGxheUV2ZW50RW5kIiwiZGlzYWJsZVJlc2l6aW5nIiwiVGFibGVMaXN0SXRlbUV2ZW50IiwidGltZUZvcm1hdCIsImV2ZW50VGltZUZvcm1hdCIsInRpbWVUZXh0IiwiYnVpbGRTZWdUaW1lVGV4dCIsIkV2ZW50Um9vdCIsInJlbmRlcklubmVyQ29udGVudCIsImlzRHJhZ2dpbmciLCJpc1Jlc2l6aW5nIiwiaXNEYXRlU2VsZWN0aW5nIiwiaXNTZWxlY3RlZCIsImlzUGFzdCIsImlzRnV0dXJlIiwiaXNUb2RheSIsImdldFNlZ0FuY2hvckF0dHJzIiwiaW5uZXJQcm9wcyIsInN0eWxlIiwiYm9yZGVyQ29sb3IiLCJiYWNrZ3JvdW5kQ29sb3IiLCJldmVudCIsInRpdGxlIiwiVGFibGVDZWxsTW9yZUxpbmsiLCJjb21waWxlU2VncyIsIm1lbW9pemUiLCJzaW5nbGVQbGFjZW1lbnRzIiwiYWxsU2VncyIsImludmlzaWJsZVNlZ3MiLCJNb3JlTGlua1Jvb3QiLCJhbGxEYXlEYXRlIiwibW9yZUNudCIsImhpZGRlblNlZ3MiLCJhbGlnbm1lbnRFbFJlZiIsImFsaWduR3JpZFRvcCIsImV4dHJhRGF0ZVNwYW4iLCJwb3BvdmVyQ29udGVudCIsImlzRm9yY2VkSW52aXNpYmxlIiwiZXZlbnREcmFnIiwiZXZlbnRSZXNpemUiLCJtYXAiLCJpbnN0YW5jZUlkIiwiaW5zdGFuY2UiLCJ2aXNpYmlsaXR5IiwiZXZlbnRTZWxlY3Rpb24iLCJnZXRTZWdNZXRhIiwiaGFuZGxlQ2xpY2siLCJpc0V4cGFuZGVkIiwicG9wb3ZlcklkIiwiY3JlYXRlQXJpYUNsaWNrQXR0cnMiLCJzaW5nbGVQbGFjZW1lbnRzXzEiLCJwbGFjZW1lbnQiLCJpc1Zpc2libGUiLCJERUZBVUxUX1dFRUtfTlVNX0ZPUk1BVCIsIndlZWsiLCJUYWJsZUNlbGwiLCJzdGF0ZSIsImdldFVuaXF1ZURvbUlkIiwiaGFuZGxlUm9vdEVsIiwiZWwiLCJzZXRSZWYiLCJEYXlDZWxsUm9vdCIsImRheUVsUmVmIiwiZGF5Q2xhc3NOYW1lcyIsInJvb3REYXRhQXR0cnMiLCJpc0Rpc2FibGVkIiwicm9sZSIsImV4dHJhRGF0YUF0dHJzIiwic2hvd1dlZWtOdW1iZXIiLCJXZWVrTnVtYmVyUm9vdCIsImRlZmF1bHRGb3JtYXQiLCJ3ZWVrRWxSZWYiLCJ3ZWVrQ2xhc3NOYW1lcyIsImZnQ29udGVudEVsUmVmIiwiZmdDb250ZW50IiwibWFyZ2luVG9wIiwibW9yZU1hcmdpblRvcCIsImJnQ29udGVudCIsImNvbXB1dGVGZ1NlZ1BsYWNlbWVudCIsImRheU1heEV2ZW50cyIsImRheU1heEV2ZW50Um93cyIsInN0cmljdE9yZGVyIiwiZXZlbnRJbnN0YW5jZUhlaWdodHMiLCJtYXhDb250ZW50SGVpZ2h0IiwiY2VsbHMiLCJoaWVyYXJjaHkiLCJEYXlHcmlkU2VnSGllcmFyY2h5IiwiYWxsb3dSZXNsaWNpbmciLCJtYXhDb29yZCIsImhpZGRlbkNvbnN1bWVzIiwibWF4U3RhY2tDbnQiLCJzZWdJbnB1dHMiLCJ1bmtub3duSGVpZ2h0U2VncyIsImV2ZW50SGVpZ2h0IiwiaW5kZXgiLCJ0aGlja25lc3MiLCJzdGFydCIsImVuZCIsImhpZGRlbkVudHJpZXMiLCJhZGRTZWdzIiwic2VnUmVjdHMiLCJ0b1JlY3RzIiwicGxhY2VSZWN0cyIsInNpbmdsZUNvbFBsYWNlbWVudHMiLCJtdWx0aUNvbFBsYWNlbWVudHMiLCJsZWZ0b3Zlck1hcmdpbnMiLCJtb3JlQ250cyIsIm1vcmVNYXJnaW5Ub3BzIiwidW5rbm93bkhlaWdodFNlZ3NfMSIsImlzQWJzb2x1dGUiLCJhYnNvbHV0ZVRvcCIsImNvbCIsInJlc2xpY2VTZWciLCJfYiIsImhpZGRlbkVudHJpZXNfMSIsImhpZGRlbkVudHJ5IiwiaGlkZGVuU3BhbiIsImFsbFJlY3RzIiwicmVjdHNCeUVhY2hDb2wiLCJncm91cFJlY3RzQnlFYWNoQ29sIiwicmVjdHMiLCJjdXJyZW50SGVpZ2h0IiwiY3VycmVudE1hcmdpblRvcCIsInJlY3RzXzEiLCJyZWN0IiwibGV2ZWxDb29yZCIsIm11bHRpUGxhY2VtZW50cyIsInJlY3RzXzIiLCJpc0ZpcnN0Q29sIiwicmVjdHNfMyIsInNwYW5TdGFydCIsInNwYW5FbmQiLCJvcmlnUmFuZ2UiLCJyYW5nZSIsInNsaWNlZFJhbmdlIiwiaW50ZXJzZWN0UmFuZ2VzIiwiYWRkRGF5cyIsImR1cmF0aW9uRWRpdGFibGUiLCJ2YWx1ZU9mIiwiZm9yY2VIaWRkZW4iLCJjYWxsIiwiZW50cmllc0J5TGV2ZWwiLCJleGNsdWRlSGlkZGVuIiwiZW50cnkiLCJidWlsZEVudHJ5S2V5IiwibGV2ZWwiLCJmaWx0ZXIiLCJoYW5kbGVJbnZhbGlkSW5zZXJ0aW9uIiwiaW5zZXJ0aW9uIiwidG91Y2hpbmdFbnRyeSIsInRvdWNoaW5nTGV2ZWwiLCJ0b3VjaGluZ0xhdGVyYWwiLCJ0b3VjaGluZ0VudHJ5SWQiLCJwbGFjZWhvbGRlckVudHJ5IiwiaW50ZXJzZWN0U3BhbnMiLCJwbGFjZWhvbGRlckVudHJ5SWQiLCJzcGxpdEVudHJ5IiwiU2VnSGllcmFyY2h5IiwiVGFibGVSb3ciLCJjZWxsRWxSZWZzIiwiUmVmTWFwIiwiZnJhbWVFbFJlZnMiLCJmZ0VsUmVmcyIsInNlZ0hhcm5lc3NSZWZzIiwiZnJhbWVQb3NpdGlvbnMiLCJidXNpbmVzc0hvdXJzQnlDb2wiLCJidXNpbmVzc0hvdXJTZWdzIiwiYmdFdmVudFNlZ3NCeUNvbCIsImJnRXZlbnRTZWdzIiwiaGlnaGxpZ2h0U2Vnc0J5Q29sIiwiZ2V0SGlnaGxpZ2h0U2VncyIsIm1pcnJvclNlZ3NCeUNvbCIsImdldE1pcnJvclNlZ3MiLCJzb3J0RXZlbnRTZWdzIiwiZmdFdmVudFNlZ3MiLCJldmVudE9yZGVyIiwiZXZlbnRPcmRlclN0cmljdCIsInJlbmRlckludHJvIiwiY2VsbCIsIm5vcm1hbEZnTm9kZXMiLCJyZW5kZXJGZ1NlZ3MiLCJtaXJyb3JGZ05vZGVzIiwiYnVpbGRNaXJyb3JQbGFjZW1lbnRzIiwiQm9vbGVhbiIsInNob3dEYXlOdW1iZXJzIiwic2hvd1dlZWtOdW1iZXJzIiwicmVuZGVyRmlsbFNlZ3MiLCJjb21wb25lbnREaWRNb3VudCIsInVwZGF0ZVNpemluZyIsImNvbXBvbmVudERpZFVwZGF0ZSIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsImN1cnJlbnRQcm9wcyIsImlzUHJvcHNFcXVhbCIsImRhdGVTZWxlY3Rpb25TZWdzIiwic2VnUGxhY2VtZW50cyIsImlzTWlycm9yIiwibm9kZXMiLCJzZWdQbGFjZW1lbnRzXzEiLCJsZWZ0IiwicmlnaHQiLCJpc1J0bCIsImxlZnRzIiwicmlnaHRzIiwidG9wIiwiZmlsbFR5cGUiLCJsZWZ0UmlnaHRDc3MiLCJidWlsZEV2ZW50UmFuZ2VLZXkiLCJCZ0V2ZW50IiwicmVuZGVyRmlsbCIsIl9fc3ByZWFkQXJyYXkiLCJpc0V4dGVybmFsU2l6aW5nQ2hhbmdlIiwiY2xpZW50V2lkdGgiLCJmcmFtZUVscyIsImN1cnJlbnRNYXAiLCJvcmlnaW5FbCIsImN1cnJlbnQiLCJzZXRTdGF0ZSIsIlBvc2l0aW9uQ2FjaGUiLCJvbGRJbnN0YW5jZUhlaWdodHMiLCJuZXdJbnN0YW5jZUhlaWdodHMiLCJxdWVyeUV2ZW50SW5zdGFuY2VIZWlnaHRzIiwibGltaXRCeUNvbnRlbnRIZWlnaHQiLCJzYWZlU2V0U3RhdGUiLCJjb21wdXRlTWF4Q29udGVudEhlaWdodCIsInNlZ0VsTWFwIiwiaGVpZ2h0IiwiTWF0aCIsInJvdW5kIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwic3BsaXQiLCJtYXgiLCJmaXJzdEtleSIsImNlbGxFbCIsImZjQ29udGFpbmVyRWwiLCJib3R0b20iLCJnZXRDZWxsRWxzIiwiZWxNYXAiLCJhZGRTdGF0ZUVxdWFsaXR5IiwibWlycm9yU2VncyIsImNvbFBsYWNlbWVudHMiLCJ0b3BzQnlJbnN0YW5jZUlkIiwiYnVpbGRBYnNvbHV0ZVRvcEhhc2giLCJjb2xQbGFjZW1lbnRzXzEiLCJwbGFjZW1lbnRzIiwicGxhY2VtZW50c18xIiwiVGFibGUiLCJzcGxpdEJ1c2luZXNzSG91clNlZ3MiLCJzcGxpdEJnRXZlbnRTZWdzIiwic3BsaXRGZ0V2ZW50U2VncyIsInNwbGl0RGF0ZVNlbGVjdGlvblNlZ3MiLCJzcGxpdEV2ZW50RHJhZyIsInNwbGl0RXZlbnRSZXNpemUiLCJyb3dSZWZzIiwicm9vdEVsIiwicmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCIsImlzSGl0Q29tYm9BbGxvd2VkIiwidW5yZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50IiwiZXhwYW5kUm93cyIsImJ1c2luZXNzSG91clNlZ3NCeVJvdyIsImJnRXZlbnRTZWdzQnlSb3ciLCJmZ0V2ZW50U2Vnc0J5Um93IiwiZGF0ZVNlbGVjdGlvblNlZ3NCeVJvdyIsImV2ZW50RHJhZ0J5Um93IiwiZXZlbnRSZXNpemVCeVJvdyIsImxpbWl0VmlhQmFsYW5jZWQiLCJ3aWR0aCIsInRhYmxlTWluV2lkdGgiLCJOb3dUaW1lciIsInVuaXQiLCJub3dEYXRlIiwiY2xpZW50SGVpZ2h0IiwiY29sR3JvdXBOb2RlIiwidG9JU09TdHJpbmciLCJyZW5kZXJSb3dJbnRybyIsImlzU2VnQWxsRGF5IiwicHJlcGFyZUhpdHMiLCJyb3dQb3NpdGlvbnMiLCJjb2xsZWN0Iiwicm93T2JqIiwiY29sUG9zaXRpb25zIiwicXVlcnlIaXQiLCJwb3NpdGlvbkxlZnQiLCJwb3NpdGlvblRvcCIsImxlZnRUb0luZGV4IiwidG9wVG9JbmRleCIsImRhdGVTcGFuIiwiZ2V0Q2VsbFJhbmdlIiwiZGF5RWwiLCJnZXRDZWxsRWwiLCJ0b3BzIiwiYm90dG9tcyIsImxheWVyIiwiRGF5VGFibGVTbGljZXIiLCJmb3JjZURheUlmTGlzdEl0ZW0iLCJzbGljZVJhbmdlIiwiZGF0ZVJhbmdlIiwiZGF5VGFibGVNb2RlbCIsIlNsaWNlciIsIkRheVRhYmxlIiwic2xpY2VyIiwidGFibGVSZWYiLCJzbGljZVByb3BzIiwibmV4dERheVRocmVzaG9sZCIsImhlYWRlckFsaWduRWxSZWYiLCJEYXlUYWJsZVZpZXciLCJidWlsZERheVRhYmxlTW9kZWwiLCJoZWFkZXJSZWYiLCJkYXRlUHJvZmlsZUdlbmVyYXRvciIsImhlYWRlckNvbnRlbnQiLCJkYXlIZWFkZXJzIiwiRGF5SGVhZGVyIiwiZGF0ZXMiLCJoZWFkZXJEYXRlcyIsImRhdGVzUmVwRGlzdGluY3REYXlzIiwiY29udGVudEFyZyIsImJ1c2luZXNzSG91cnMiLCJkYXRlU2VsZWN0aW9uIiwiZXZlbnRTdG9yZSIsImV2ZW50VWlCYXNlcyIsInRhYmxlQ29sR3JvdXBOb2RlIiwid2Vla051bWJlcnMiLCJkYXlTZXJpZXMiLCJEYXlTZXJpZXNNb2RlbCIsInJlbmRlclJhbmdlIiwiRGF5VGFibGVNb2RlbCIsInRlc3QiLCJjdXJyZW50UmFuZ2VVbml0IiwiVGFibGVEYXRlUHJvZmlsZUdlbmVyYXRvciIsImJ1aWxkUmVuZGVyUmFuZ2UiLCJjdXJyZW50UmFuZ2UiLCJpc1JhbmdlQWxsRGF5IiwiZGF0ZUVudiIsImVuZE9mV2VlayIsInN0YXJ0T2ZXZWVrIiwiYWRkV2Vla3MiLCJtb250aE1vZGUiLCJmaXhlZFdlZWtDb3VudCIsImNlaWwiLCJkaWZmV2Vla3MiLCJEYXRlUHJvZmlsZUdlbmVyYXRvciIsIm1haW4iLCJjcmVhdGVQbHVnaW4iLCJpbml0aWFsVmlldyIsInZpZXdzIiwiZGF5R3JpZCIsImNvbXBvbmVudCIsImRhdGVQcm9maWxlR2VuZXJhdG9yQ2xhc3MiLCJkYXlHcmlkRGF5IiwiZHVyYXRpb24iLCJkYXlzIiwiZGF5R3JpZFdlZWsiLCJ3ZWVrcyIsImRheUdyaWRNb250aCIsIm1vbnRocyIsIkRheUdyaWRWaWV3Il0sInNvdXJjZXMiOlsibWFpbi5janMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG5GdWxsQ2FsZW5kYXIgdjUuMTEuMlxuRG9jcyAmIExpY2Vuc2U6IGh0dHBzOi8vZnVsbGNhbGVuZGFyLmlvL1xuKGMpIDIwMjIgQWRhbSBTaGF3XG4qL1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgY29tbW9uID0gcmVxdWlyZSgnQGZ1bGxjYWxlbmRhci9jb21tb24nKTtcbnZhciB0c2xpYiA9IHJlcXVpcmUoJ3RzbGliJyk7XG47XG5cbi8qIEFuIGFic3RyYWN0IGNsYXNzIGZvciB0aGUgZGF5Z3JpZCB2aWV3cywgYXMgd2VsbCBhcyBtb250aCB2aWV3LiBSZW5kZXJzIG9uZSBvciBtb3JlIHJvd3Mgb2YgZGF5IGNlbGxzLlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4vLyBJdCBpcyBhIG1hbmFnZXIgZm9yIGEgVGFibGUgc3ViY29tcG9uZW50LCB3aGljaCBkb2VzIG1vc3Qgb2YgdGhlIGhlYXZ5IGxpZnRpbmcuXG4vLyBJdCBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgd2lkdGgvaGVpZ2h0LlxudmFyIFRhYmxlVmlldyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVGFibGVWaWV3LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRhYmxlVmlldygpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmhlYWRlckVsUmVmID0gY29tbW9uLmNyZWF0ZVJlZigpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFRhYmxlVmlldy5wcm90b3R5cGUucmVuZGVyU2ltcGxlTGF5b3V0ID0gZnVuY3Rpb24gKGhlYWRlclJvd0NvbnRlbnQsIGJvZHlDb250ZW50KSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgc2VjdGlvbnMgPSBbXTtcbiAgICAgICAgdmFyIHN0aWNreUhlYWRlckRhdGVzID0gY29tbW9uLmdldFN0aWNreUhlYWRlckRhdGVzKGNvbnRleHQub3B0aW9ucyk7XG4gICAgICAgIGlmIChoZWFkZXJSb3dDb250ZW50KSB7XG4gICAgICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnaGVhZGVyJyxcbiAgICAgICAgICAgICAgICBrZXk6ICdoZWFkZXInLFxuICAgICAgICAgICAgICAgIGlzU3RpY2t5OiBzdGlja3lIZWFkZXJEYXRlcyxcbiAgICAgICAgICAgICAgICBjaHVuazoge1xuICAgICAgICAgICAgICAgICAgICBlbFJlZjogdGhpcy5oZWFkZXJFbFJlZixcbiAgICAgICAgICAgICAgICAgICAgdGFibGVDbGFzc05hbWU6ICdmYy1jb2wtaGVhZGVyJyxcbiAgICAgICAgICAgICAgICAgICAgcm93Q29udGVudDogaGVhZGVyUm93Q29udGVudCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnYm9keScsXG4gICAgICAgICAgICBrZXk6ICdib2R5JyxcbiAgICAgICAgICAgIGxpcXVpZDogdHJ1ZSxcbiAgICAgICAgICAgIGNodW5rOiB7IGNvbnRlbnQ6IGJvZHlDb250ZW50IH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5WaWV3Um9vdCwgeyB2aWV3U3BlYzogY29udGV4dC52aWV3U3BlYyB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyByZWY6IHJvb3RFbFJlZiwgY2xhc3NOYW1lOiBbJ2ZjLWRheWdyaWQnXS5jb25jYXQoY2xhc3NOYW1lcykuam9pbignICcpIH0sXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uU2ltcGxlU2Nyb2xsR3JpZCwgeyBsaXF1aWQ6ICFwcm9wcy5pc0hlaWdodEF1dG8gJiYgIXByb3BzLmZvclByaW50LCBjb2xsYXBzaWJsZVdpZHRoOiBwcm9wcy5mb3JQcmludCwgY29sczogW10gLyogVE9ETzogbWFrZSBvcHRpb25hbD8gKi8sIHNlY3Rpb25zOiBzZWN0aW9ucyB9KSkpOyB9KSk7XG4gICAgfTtcbiAgICBUYWJsZVZpZXcucHJvdG90eXBlLnJlbmRlckhTY3JvbGxMYXlvdXQgPSBmdW5jdGlvbiAoaGVhZGVyUm93Q29udGVudCwgYm9keUNvbnRlbnQsIGNvbENudCwgZGF5TWluV2lkdGgpIHtcbiAgICAgICAgdmFyIFNjcm9sbEdyaWQgPSB0aGlzLmNvbnRleHQucGx1Z2luSG9va3Muc2Nyb2xsR3JpZEltcGw7XG4gICAgICAgIGlmICghU2Nyb2xsR3JpZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBTY3JvbGxHcmlkIGltcGxlbWVudGF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9hID0gdGhpcywgcHJvcHMgPSBfYS5wcm9wcywgY29udGV4dCA9IF9hLmNvbnRleHQ7XG4gICAgICAgIHZhciBzdGlja3lIZWFkZXJEYXRlcyA9ICFwcm9wcy5mb3JQcmludCAmJiBjb21tb24uZ2V0U3RpY2t5SGVhZGVyRGF0ZXMoY29udGV4dC5vcHRpb25zKTtcbiAgICAgICAgdmFyIHN0aWNreUZvb3RlclNjcm9sbGJhciA9ICFwcm9wcy5mb3JQcmludCAmJiBjb21tb24uZ2V0U3RpY2t5Rm9vdGVyU2Nyb2xsYmFyKGNvbnRleHQub3B0aW9ucyk7XG4gICAgICAgIHZhciBzZWN0aW9ucyA9IFtdO1xuICAgICAgICBpZiAoaGVhZGVyUm93Q29udGVudCkge1xuICAgICAgICAgICAgc2VjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2hlYWRlcicsXG4gICAgICAgICAgICAgICAga2V5OiAnaGVhZGVyJyxcbiAgICAgICAgICAgICAgICBpc1N0aWNreTogc3RpY2t5SGVhZGVyRGF0ZXMsXG4gICAgICAgICAgICAgICAgY2h1bmtzOiBbe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbFJlZjogdGhpcy5oZWFkZXJFbFJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ2xhc3NOYW1lOiAnZmMtY29sLWhlYWRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dDb250ZW50OiBoZWFkZXJSb3dDb250ZW50LFxuICAgICAgICAgICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ2JvZHknLFxuICAgICAgICAgICAga2V5OiAnYm9keScsXG4gICAgICAgICAgICBsaXF1aWQ6IHRydWUsXG4gICAgICAgICAgICBjaHVua3M6IFt7XG4gICAgICAgICAgICAgICAgICAgIGtleTogJ21haW4nLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBib2R5Q29udGVudCxcbiAgICAgICAgICAgICAgICB9XSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzdGlja3lGb290ZXJTY3JvbGxiYXIpIHtcbiAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdmb290ZXInLFxuICAgICAgICAgICAgICAgIGtleTogJ2Zvb3RlcicsXG4gICAgICAgICAgICAgICAgaXNTdGlja3k6IHRydWUsXG4gICAgICAgICAgICAgICAgY2h1bmtzOiBbe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBjb21tb24ucmVuZGVyU2Nyb2xsU2hpbSxcbiAgICAgICAgICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5WaWV3Um9vdCwgeyB2aWV3U3BlYzogY29udGV4dC52aWV3U3BlYyB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyByZWY6IHJvb3RFbFJlZiwgY2xhc3NOYW1lOiBbJ2ZjLWRheWdyaWQnXS5jb25jYXQoY2xhc3NOYW1lcykuam9pbignICcpIH0sXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChTY3JvbGxHcmlkLCB7IGxpcXVpZDogIXByb3BzLmlzSGVpZ2h0QXV0byAmJiAhcHJvcHMuZm9yUHJpbnQsIGNvbGxhcHNpYmxlV2lkdGg6IHByb3BzLmZvclByaW50LCBjb2xHcm91cHM6IFt7IGNvbHM6IFt7IHNwYW46IGNvbENudCwgbWluV2lkdGg6IGRheU1pbldpZHRoIH1dIH1dLCBzZWN0aW9uczogc2VjdGlvbnMgfSkpKTsgfSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFRhYmxlVmlldztcbn0oY29tbW9uLkRhdGVDb21wb25lbnQpKTtcblxuZnVuY3Rpb24gc3BsaXRTZWdzQnlSb3coc2Vncywgcm93Q250KSB7XG4gICAgdmFyIGJ5Um93ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dDbnQ7IGkgKz0gMSkge1xuICAgICAgICBieVJvd1tpXSA9IFtdO1xuICAgIH1cbiAgICBmb3IgKHZhciBfaSA9IDAsIHNlZ3NfMSA9IHNlZ3M7IF9pIDwgc2Vnc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgc2VnID0gc2Vnc18xW19pXTtcbiAgICAgICAgYnlSb3dbc2VnLnJvd10ucHVzaChzZWcpO1xuICAgIH1cbiAgICByZXR1cm4gYnlSb3c7XG59XG5mdW5jdGlvbiBzcGxpdFNlZ3NCeUZpcnN0Q29sKHNlZ3MsIGNvbENudCkge1xuICAgIHZhciBieUNvbCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sQ250OyBpICs9IDEpIHtcbiAgICAgICAgYnlDb2xbaV0gPSBbXTtcbiAgICB9XG4gICAgZm9yICh2YXIgX2kgPSAwLCBzZWdzXzIgPSBzZWdzOyBfaSA8IHNlZ3NfMi5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHNlZyA9IHNlZ3NfMltfaV07XG4gICAgICAgIGJ5Q29sW3NlZy5maXJzdENvbF0ucHVzaChzZWcpO1xuICAgIH1cbiAgICByZXR1cm4gYnlDb2w7XG59XG5mdW5jdGlvbiBzcGxpdEludGVyYWN0aW9uQnlSb3codWksIHJvd0NudCkge1xuICAgIHZhciBieVJvdyA9IFtdO1xuICAgIGlmICghdWkpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dDbnQ7IGkgKz0gMSkge1xuICAgICAgICAgICAgYnlSb3dbaV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd0NudDsgaSArPSAxKSB7XG4gICAgICAgICAgICBieVJvd1tpXSA9IHtcbiAgICAgICAgICAgICAgICBhZmZlY3RlZEluc3RhbmNlczogdWkuYWZmZWN0ZWRJbnN0YW5jZXMsXG4gICAgICAgICAgICAgICAgaXNFdmVudDogdWkuaXNFdmVudCxcbiAgICAgICAgICAgICAgICBzZWdzOiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHVpLnNlZ3M7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgc2VnID0gX2FbX2ldO1xuICAgICAgICAgICAgYnlSb3dbc2VnLnJvd10uc2Vncy5wdXNoKHNlZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ5Um93O1xufVxuXG52YXIgVGFibGVDZWxsVG9wID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhUYWJsZUNlbGxUb3AsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGFibGVDZWxsVG9wKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFRhYmxlQ2VsbFRvcC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgbmF2TGlua0F0dHJzID0gY29tbW9uLmJ1aWxkTmF2TGlua0F0dHJzKHRoaXMuY29udGV4dCwgcHJvcHMuZGF0ZSk7XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkRheUNlbGxDb250ZW50LCB7IGRhdGU6IHByb3BzLmRhdGUsIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSwgc2hvd0RheU51bWJlcjogcHJvcHMuc2hvd0RheU51bWJlciwgZXh0cmFIb29rUHJvcHM6IHByb3BzLmV4dHJhSG9va1Byb3BzLCBkZWZhdWx0Q29udGVudDogcmVuZGVyVG9wSW5uZXIgfSwgZnVuY3Rpb24gKGlubmVyRWxSZWYsIGlubmVyQ29udGVudCkgeyByZXR1cm4gKChpbm5lckNvbnRlbnQgfHwgcHJvcHMuZm9yY2VEYXlUb3ApICYmIChjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1kYXlncmlkLWRheS10b3BcIiwgcmVmOiBpbm5lckVsUmVmIH0sXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImFcIiwgdHNsaWIuX19hc3NpZ24oeyBpZDogcHJvcHMuZGF5TnVtYmVySWQsIGNsYXNzTmFtZTogXCJmYy1kYXlncmlkLWRheS1udW1iZXJcIiB9LCBuYXZMaW5rQXR0cnMpLCBpbm5lckNvbnRlbnQgfHwgY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkZyYWdtZW50LCBudWxsLCBcIlxcdTAwQTBcIikpKSkpOyB9KSk7XG4gICAgfTtcbiAgICByZXR1cm4gVGFibGVDZWxsVG9wO1xufShjb21tb24uQmFzZUNvbXBvbmVudCkpO1xuZnVuY3Rpb24gcmVuZGVyVG9wSW5uZXIocHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMuZGF5TnVtYmVyVGV4dDtcbn1cblxudmFyIERFRkFVTFRfVEFCTEVfRVZFTlRfVElNRV9GT1JNQVQgPSBjb21tb24uY3JlYXRlRm9ybWF0dGVyKHtcbiAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgb21pdFplcm9NaW51dGU6IHRydWUsXG4gICAgbWVyaWRpZW06ICduYXJyb3cnLFxufSk7XG5mdW5jdGlvbiBoYXNMaXN0SXRlbURpc3BsYXkoc2VnKSB7XG4gICAgdmFyIGRpc3BsYXkgPSBzZWcuZXZlbnRSYW5nZS51aS5kaXNwbGF5O1xuICAgIHJldHVybiBkaXNwbGF5ID09PSAnbGlzdC1pdGVtJyB8fCAoZGlzcGxheSA9PT0gJ2F1dG8nICYmXG4gICAgICAgICFzZWcuZXZlbnRSYW5nZS5kZWYuYWxsRGF5ICYmXG4gICAgICAgIHNlZy5maXJzdENvbCA9PT0gc2VnLmxhc3RDb2wgJiYgLy8gY2FuJ3QgYmUgbXVsdGktZGF5XG4gICAgICAgIHNlZy5pc1N0YXJ0ICYmIC8vIFwiXG4gICAgICAgIHNlZy5pc0VuZCAvLyBcIlxuICAgICk7XG59XG5cbnZhciBUYWJsZUJsb2NrRXZlbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFRhYmxlQmxvY2tFdmVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUYWJsZUJsb2NrRXZlbnQoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgVGFibGVCbG9ja0V2ZW50LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLlN0YW5kYXJkRXZlbnQsIHRzbGliLl9fYXNzaWduKHt9LCBwcm9wcywgeyBleHRyYUNsYXNzTmFtZXM6IFsnZmMtZGF5Z3JpZC1ldmVudCcsICdmYy1kYXlncmlkLWJsb2NrLWV2ZW50JywgJ2ZjLWgtZXZlbnQnXSwgZGVmYXVsdFRpbWVGb3JtYXQ6IERFRkFVTFRfVEFCTEVfRVZFTlRfVElNRV9GT1JNQVQsIGRlZmF1bHREaXNwbGF5RXZlbnRFbmQ6IHByb3BzLmRlZmF1bHREaXNwbGF5RXZlbnRFbmQsIGRpc2FibGVSZXNpemluZzogIXByb3BzLnNlZy5ldmVudFJhbmdlLmRlZi5hbGxEYXkgfSkpKTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZUJsb2NrRXZlbnQ7XG59KGNvbW1vbi5CYXNlQ29tcG9uZW50KSk7XG5cbnZhciBUYWJsZUxpc3RJdGVtRXZlbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFRhYmxlTGlzdEl0ZW1FdmVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUYWJsZUxpc3RJdGVtRXZlbnQoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgVGFibGVMaXN0SXRlbUV2ZW50LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgdGltZUZvcm1hdCA9IGNvbnRleHQub3B0aW9ucy5ldmVudFRpbWVGb3JtYXQgfHwgREVGQVVMVF9UQUJMRV9FVkVOVF9USU1FX0ZPUk1BVDtcbiAgICAgICAgdmFyIHRpbWVUZXh0ID0gY29tbW9uLmJ1aWxkU2VnVGltZVRleHQocHJvcHMuc2VnLCB0aW1lRm9ybWF0LCBjb250ZXh0LCB0cnVlLCBwcm9wcy5kZWZhdWx0RGlzcGxheUV2ZW50RW5kKTtcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uRXZlbnRSb290LCB7IHNlZzogcHJvcHMuc2VnLCB0aW1lVGV4dDogdGltZVRleHQsIGRlZmF1bHRDb250ZW50OiByZW5kZXJJbm5lckNvbnRlbnQsIGlzRHJhZ2dpbmc6IHByb3BzLmlzRHJhZ2dpbmcsIGlzUmVzaXppbmc6IGZhbHNlLCBpc0RhdGVTZWxlY3Rpbmc6IGZhbHNlLCBpc1NlbGVjdGVkOiBwcm9wcy5pc1NlbGVjdGVkLCBpc1Bhc3Q6IHByb3BzLmlzUGFzdCwgaXNGdXR1cmU6IHByb3BzLmlzRnV0dXJlLCBpc1RvZGF5OiBwcm9wcy5pc1RvZGF5IH0sIGZ1bmN0aW9uIChyb290RWxSZWYsIGNsYXNzTmFtZXMsIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCkgeyByZXR1cm4gKCAvLyB3ZSBkb24ndCB1c2Ugc3R5bGVzIVxuICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImFcIiwgdHNsaWIuX19hc3NpZ24oeyBjbGFzc05hbWU6IFsnZmMtZGF5Z3JpZC1ldmVudCcsICdmYy1kYXlncmlkLWRvdC1ldmVudCddLmNvbmNhdChjbGFzc05hbWVzKS5qb2luKCcgJyksIHJlZjogcm9vdEVsUmVmIH0sIGNvbW1vbi5nZXRTZWdBbmNob3JBdHRycyhwcm9wcy5zZWcsIGNvbnRleHQpKSwgaW5uZXJDb250ZW50KSk7IH0pKTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZUxpc3RJdGVtRXZlbnQ7XG59KGNvbW1vbi5CYXNlQ29tcG9uZW50KSk7XG5mdW5jdGlvbiByZW5kZXJJbm5lckNvbnRlbnQoaW5uZXJQcm9wcykge1xuICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkZyYWdtZW50LCBudWxsLFxuICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1kYXlncmlkLWV2ZW50LWRvdFwiLCBzdHlsZTogeyBib3JkZXJDb2xvcjogaW5uZXJQcm9wcy5ib3JkZXJDb2xvciB8fCBpbm5lclByb3BzLmJhY2tncm91bmRDb2xvciB9IH0pLFxuICAgICAgICBpbm5lclByb3BzLnRpbWVUZXh0ICYmIChjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1ldmVudC10aW1lXCIgfSwgaW5uZXJQcm9wcy50aW1lVGV4dCkpLFxuICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1ldmVudC10aXRsZVwiIH0sIGlubmVyUHJvcHMuZXZlbnQudGl0bGUgfHwgY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkZyYWdtZW50LCBudWxsLCBcIlxcdTAwQTBcIikpKSk7XG59XG5cbnZhciBUYWJsZUNlbGxNb3JlTGluayA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVGFibGVDZWxsTW9yZUxpbmssIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGFibGVDZWxsTW9yZUxpbmsoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5jb21waWxlU2VncyA9IGNvbW1vbi5tZW1vaXplKGNvbXBpbGVTZWdzKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBUYWJsZUNlbGxNb3JlTGluay5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmNvbXBpbGVTZWdzKHByb3BzLnNpbmdsZVBsYWNlbWVudHMpLCBhbGxTZWdzID0gX2EuYWxsU2VncywgaW52aXNpYmxlU2VncyA9IF9hLmludmlzaWJsZVNlZ3M7XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLk1vcmVMaW5rUm9vdCwgeyBkYXRlUHJvZmlsZTogcHJvcHMuZGF0ZVByb2ZpbGUsIHRvZGF5UmFuZ2U6IHByb3BzLnRvZGF5UmFuZ2UsIGFsbERheURhdGU6IHByb3BzLmFsbERheURhdGUsIG1vcmVDbnQ6IHByb3BzLm1vcmVDbnQsIGFsbFNlZ3M6IGFsbFNlZ3MsIGhpZGRlblNlZ3M6IGludmlzaWJsZVNlZ3MsIGFsaWdubWVudEVsUmVmOiBwcm9wcy5hbGlnbm1lbnRFbFJlZiwgYWxpZ25HcmlkVG9wOiBwcm9wcy5hbGlnbkdyaWRUb3AsIGV4dHJhRGF0ZVNwYW46IHByb3BzLmV4dHJhRGF0ZVNwYW4sIHBvcG92ZXJDb250ZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzRm9yY2VkSW52aXNpYmxlID0gKHByb3BzLmV2ZW50RHJhZyA/IHByb3BzLmV2ZW50RHJhZy5hZmZlY3RlZEluc3RhbmNlcyA6IG51bGwpIHx8XG4gICAgICAgICAgICAgICAgICAgIChwcm9wcy5ldmVudFJlc2l6ZSA/IHByb3BzLmV2ZW50UmVzaXplLmFmZmVjdGVkSW5zdGFuY2VzIDogbnVsbCkgfHxcbiAgICAgICAgICAgICAgICAgICAge307XG4gICAgICAgICAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uRnJhZ21lbnQsIG51bGwsIGFsbFNlZ3MubWFwKGZ1bmN0aW9uIChzZWcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluc3RhbmNlSWQgPSBzZWcuZXZlbnRSYW5nZS5pbnN0YW5jZS5pbnN0YW5jZUlkO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWRheWdyaWQtZXZlbnQtaGFybmVzc1wiLCBrZXk6IGluc3RhbmNlSWQsIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogaXNGb3JjZWRJbnZpc2libGVbaW5zdGFuY2VJZF0gPyAnaGlkZGVuJyA6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCBoYXNMaXN0SXRlbURpc3BsYXkoc2VnKSA/IChjb21tb24uY3JlYXRlRWxlbWVudChUYWJsZUxpc3RJdGVtRXZlbnQsIHRzbGliLl9fYXNzaWduKHsgc2VnOiBzZWcsIGlzRHJhZ2dpbmc6IGZhbHNlLCBpc1NlbGVjdGVkOiBpbnN0YW5jZUlkID09PSBwcm9wcy5ldmVudFNlbGVjdGlvbiwgZGVmYXVsdERpc3BsYXlFdmVudEVuZDogZmFsc2UgfSwgY29tbW9uLmdldFNlZ01ldGEoc2VnLCBwcm9wcy50b2RheVJhbmdlKSkpKSA6IChjb21tb24uY3JlYXRlRWxlbWVudChUYWJsZUJsb2NrRXZlbnQsIHRzbGliLl9fYXNzaWduKHsgc2VnOiBzZWcsIGlzRHJhZ2dpbmc6IGZhbHNlLCBpc1Jlc2l6aW5nOiBmYWxzZSwgaXNEYXRlU2VsZWN0aW5nOiBmYWxzZSwgaXNTZWxlY3RlZDogaW5zdGFuY2VJZCA9PT0gcHJvcHMuZXZlbnRTZWxlY3Rpb24sIGRlZmF1bHREaXNwbGF5RXZlbnRFbmQ6IGZhbHNlIH0sIGNvbW1vbi5nZXRTZWdNZXRhKHNlZywgcHJvcHMudG9kYXlSYW5nZSkpKSkpKTtcbiAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICAgICAgfSB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQsIGhhbmRsZUNsaWNrLCB0aXRsZSwgaXNFeHBhbmRlZCwgcG9wb3ZlcklkKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHRzbGliLl9fYXNzaWduKHsgcmVmOiByb290RWxSZWYsIGNsYXNzTmFtZTogWydmYy1kYXlncmlkLW1vcmUtbGluayddLmNvbmNhdChjbGFzc05hbWVzKS5qb2luKCcgJyksIHRpdGxlOiB0aXRsZSwgXCJhcmlhLWV4cGFuZGVkXCI6IGlzRXhwYW5kZWQsIFwiYXJpYS1jb250cm9sc1wiOiBwb3BvdmVySWQgfSwgY29tbW9uLmNyZWF0ZUFyaWFDbGlja0F0dHJzKGhhbmRsZUNsaWNrKSksIGlubmVyQ29udGVudCkpOyB9KSk7XG4gICAgfTtcbiAgICByZXR1cm4gVGFibGVDZWxsTW9yZUxpbms7XG59KGNvbW1vbi5CYXNlQ29tcG9uZW50KSk7XG5mdW5jdGlvbiBjb21waWxlU2VncyhzaW5nbGVQbGFjZW1lbnRzKSB7XG4gICAgdmFyIGFsbFNlZ3MgPSBbXTtcbiAgICB2YXIgaW52aXNpYmxlU2VncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMCwgc2luZ2xlUGxhY2VtZW50c18xID0gc2luZ2xlUGxhY2VtZW50czsgX2kgPCBzaW5nbGVQbGFjZW1lbnRzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBwbGFjZW1lbnQgPSBzaW5nbGVQbGFjZW1lbnRzXzFbX2ldO1xuICAgICAgICBhbGxTZWdzLnB1c2gocGxhY2VtZW50LnNlZyk7XG4gICAgICAgIGlmICghcGxhY2VtZW50LmlzVmlzaWJsZSkge1xuICAgICAgICAgICAgaW52aXNpYmxlU2Vncy5wdXNoKHBsYWNlbWVudC5zZWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGFsbFNlZ3M6IGFsbFNlZ3MsIGludmlzaWJsZVNlZ3M6IGludmlzaWJsZVNlZ3MgfTtcbn1cblxudmFyIERFRkFVTFRfV0VFS19OVU1fRk9STUFUID0gY29tbW9uLmNyZWF0ZUZvcm1hdHRlcih7IHdlZWs6ICduYXJyb3cnIH0pO1xudmFyIFRhYmxlQ2VsbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVGFibGVDZWxsLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRhYmxlQ2VsbCgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnJvb3RFbFJlZiA9IGNvbW1vbi5jcmVhdGVSZWYoKTtcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBkYXlOdW1iZXJJZDogY29tbW9uLmdldFVuaXF1ZURvbUlkKCksXG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmhhbmRsZVJvb3RFbCA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgICAgY29tbW9uLnNldFJlZihfdGhpcy5yb290RWxSZWYsIGVsKTtcbiAgICAgICAgICAgIGNvbW1vbi5zZXRSZWYoX3RoaXMucHJvcHMuZWxSZWYsIGVsKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBUYWJsZUNlbGwucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgY29udGV4dCA9IF9hLmNvbnRleHQsIHByb3BzID0gX2EucHJvcHMsIHN0YXRlID0gX2Euc3RhdGUsIHJvb3RFbFJlZiA9IF9hLnJvb3RFbFJlZjtcbiAgICAgICAgdmFyIGRhdGUgPSBwcm9wcy5kYXRlLCBkYXRlUHJvZmlsZSA9IHByb3BzLmRhdGVQcm9maWxlO1xuICAgICAgICB2YXIgbmF2TGlua0F0dHJzID0gY29tbW9uLmJ1aWxkTmF2TGlua0F0dHJzKGNvbnRleHQsIGRhdGUsICd3ZWVrJyk7XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkRheUNlbGxSb290LCB7IGRhdGU6IGRhdGUsIGRhdGVQcm9maWxlOiBkYXRlUHJvZmlsZSwgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSwgc2hvd0RheU51bWJlcjogcHJvcHMuc2hvd0RheU51bWJlciwgZXh0cmFIb29rUHJvcHM6IHByb3BzLmV4dHJhSG9va1Byb3BzLCBlbFJlZjogdGhpcy5oYW5kbGVSb290RWwgfSwgZnVuY3Rpb24gKGRheUVsUmVmLCBkYXlDbGFzc05hbWVzLCByb290RGF0YUF0dHJzLCBpc0Rpc2FibGVkKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCB0c2xpYi5fX2Fzc2lnbih7IHJlZjogZGF5RWxSZWYsIHJvbGU6IFwiZ3JpZGNlbGxcIiwgY2xhc3NOYW1lOiBbJ2ZjLWRheWdyaWQtZGF5J10uY29uY2F0KGRheUNsYXNzTmFtZXMsIHByb3BzLmV4dHJhQ2xhc3NOYW1lcyB8fCBbXSkuam9pbignICcpIH0sIHJvb3REYXRhQXR0cnMsIHByb3BzLmV4dHJhRGF0YUF0dHJzLCAocHJvcHMuc2hvd0RheU51bWJlciA/IHsgJ2FyaWEtbGFiZWxsZWRieSc6IHN0YXRlLmRheU51bWJlcklkIH0gOiB7fSkpLFxuICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZGF5Z3JpZC1kYXktZnJhbWUgZmMtc2Nyb2xsZ3JpZC1zeW5jLWlubmVyXCIsIHJlZjogcHJvcHMuaW5uZXJFbFJlZiAvKiBkaWZmZXJlbnQgZnJvbSBob29rIHN5c3RlbSEgUkVOQU1FICovIH0sXG4gICAgICAgICAgICAgICAgcHJvcHMuc2hvd1dlZWtOdW1iZXIgJiYgKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5XZWVrTnVtYmVyUm9vdCwgeyBkYXRlOiBkYXRlLCBkZWZhdWx0Rm9ybWF0OiBERUZBVUxUX1dFRUtfTlVNX0ZPUk1BVCB9LCBmdW5jdGlvbiAod2Vla0VsUmVmLCB3ZWVrQ2xhc3NOYW1lcywgaW5uZXJFbFJlZiwgaW5uZXJDb250ZW50KSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHRzbGliLl9fYXNzaWduKHsgcmVmOiB3ZWVrRWxSZWYsIGNsYXNzTmFtZTogWydmYy1kYXlncmlkLXdlZWstbnVtYmVyJ10uY29uY2F0KHdlZWtDbGFzc05hbWVzKS5qb2luKCcgJykgfSwgbmF2TGlua0F0dHJzKSwgaW5uZXJDb250ZW50KSk7IH0pKSxcbiAgICAgICAgICAgICAgICAhaXNEaXNhYmxlZCAmJiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoVGFibGVDZWxsVG9wLCB7IGRhdGU6IGRhdGUsIGRhdGVQcm9maWxlOiBkYXRlUHJvZmlsZSwgc2hvd0RheU51bWJlcjogcHJvcHMuc2hvd0RheU51bWJlciwgZGF5TnVtYmVySWQ6IHN0YXRlLmRheU51bWJlcklkLCBmb3JjZURheVRvcDogcHJvcHMuZm9yY2VEYXlUb3AsIHRvZGF5UmFuZ2U6IHByb3BzLnRvZGF5UmFuZ2UsIGV4dHJhSG9va1Byb3BzOiBwcm9wcy5leHRyYUhvb2tQcm9wcyB9KSksXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZGF5Z3JpZC1kYXktZXZlbnRzXCIsIHJlZjogcHJvcHMuZmdDb250ZW50RWxSZWYgfSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuZmdDb250ZW50LFxuICAgICAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1kYXlncmlkLWRheS1ib3R0b21cIiwgc3R5bGU6IHsgbWFyZ2luVG9wOiBwcm9wcy5tb3JlTWFyZ2luVG9wIH0gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFRhYmxlQ2VsbE1vcmVMaW5rLCB7IGFsbERheURhdGU6IGRhdGUsIHNpbmdsZVBsYWNlbWVudHM6IHByb3BzLnNpbmdsZVBsYWNlbWVudHMsIG1vcmVDbnQ6IHByb3BzLm1vcmVDbnQsIGFsaWdubWVudEVsUmVmOiByb290RWxSZWYsIGFsaWduR3JpZFRvcDogIXByb3BzLnNob3dEYXlOdW1iZXIsIGV4dHJhRGF0ZVNwYW46IHByb3BzLmV4dHJhRGF0ZVNwYW4sIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgZXZlbnRTZWxlY3Rpb246IHByb3BzLmV2ZW50U2VsZWN0aW9uLCBldmVudERyYWc6IHByb3BzLmV2ZW50RHJhZywgZXZlbnRSZXNpemU6IHByb3BzLmV2ZW50UmVzaXplLCB0b2RheVJhbmdlOiBwcm9wcy50b2RheVJhbmdlIH0pKSksXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZGF5Z3JpZC1kYXktYmdcIiB9LCBwcm9wcy5iZ0NvbnRlbnQpKSkpOyB9KSk7XG4gICAgfTtcbiAgICByZXR1cm4gVGFibGVDZWxsO1xufShjb21tb24uRGF0ZUNvbXBvbmVudCkpO1xuXG5mdW5jdGlvbiBjb21wdXRlRmdTZWdQbGFjZW1lbnQoc2VncywgLy8gYXNzdW1lZCBhbHJlYWR5IHNvcnRlZFxuZGF5TWF4RXZlbnRzLCBkYXlNYXhFdmVudFJvd3MsIHN0cmljdE9yZGVyLCBldmVudEluc3RhbmNlSGVpZ2h0cywgbWF4Q29udGVudEhlaWdodCwgY2VsbHMpIHtcbiAgICB2YXIgaGllcmFyY2h5ID0gbmV3IERheUdyaWRTZWdIaWVyYXJjaHkoKTtcbiAgICBoaWVyYXJjaHkuYWxsb3dSZXNsaWNpbmcgPSB0cnVlO1xuICAgIGhpZXJhcmNoeS5zdHJpY3RPcmRlciA9IHN0cmljdE9yZGVyO1xuICAgIGlmIChkYXlNYXhFdmVudHMgPT09IHRydWUgfHwgZGF5TWF4RXZlbnRSb3dzID09PSB0cnVlKSB7XG4gICAgICAgIGhpZXJhcmNoeS5tYXhDb29yZCA9IG1heENvbnRlbnRIZWlnaHQ7XG4gICAgICAgIGhpZXJhcmNoeS5oaWRkZW5Db25zdW1lcyA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBkYXlNYXhFdmVudHMgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGhpZXJhcmNoeS5tYXhTdGFja0NudCA9IGRheU1heEV2ZW50cztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGRheU1heEV2ZW50Um93cyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaGllcmFyY2h5Lm1heFN0YWNrQ250ID0gZGF5TWF4RXZlbnRSb3dzO1xuICAgICAgICBoaWVyYXJjaHkuaGlkZGVuQ29uc3VtZXMgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBjcmVhdGUgc2VnSW5wdXRzIG9ubHkgZm9yIHNlZ3Mgd2l0aCBrbm93biBoZWlnaHRzXG4gICAgdmFyIHNlZ0lucHV0cyA9IFtdO1xuICAgIHZhciB1bmtub3duSGVpZ2h0U2VncyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgc2VnID0gc2Vnc1tpXTtcbiAgICAgICAgdmFyIGluc3RhbmNlSWQgPSBzZWcuZXZlbnRSYW5nZS5pbnN0YW5jZS5pbnN0YW5jZUlkO1xuICAgICAgICB2YXIgZXZlbnRIZWlnaHQgPSBldmVudEluc3RhbmNlSGVpZ2h0c1tpbnN0YW5jZUlkXTtcbiAgICAgICAgaWYgKGV2ZW50SGVpZ2h0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNlZ0lucHV0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgICAgICB0aGlja25lc3M6IGV2ZW50SGVpZ2h0LFxuICAgICAgICAgICAgICAgIHNwYW46IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHNlZy5maXJzdENvbCxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBzZWcubGFzdENvbCArIDEsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdW5rbm93bkhlaWdodFNlZ3MucHVzaChzZWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBoaWRkZW5FbnRyaWVzID0gaGllcmFyY2h5LmFkZFNlZ3Moc2VnSW5wdXRzKTtcbiAgICB2YXIgc2VnUmVjdHMgPSBoaWVyYXJjaHkudG9SZWN0cygpO1xuICAgIHZhciBfYSA9IHBsYWNlUmVjdHMoc2VnUmVjdHMsIHNlZ3MsIGNlbGxzKSwgc2luZ2xlQ29sUGxhY2VtZW50cyA9IF9hLnNpbmdsZUNvbFBsYWNlbWVudHMsIG11bHRpQ29sUGxhY2VtZW50cyA9IF9hLm11bHRpQ29sUGxhY2VtZW50cywgbGVmdG92ZXJNYXJnaW5zID0gX2EubGVmdG92ZXJNYXJnaW5zO1xuICAgIHZhciBtb3JlQ250cyA9IFtdO1xuICAgIHZhciBtb3JlTWFyZ2luVG9wcyA9IFtdO1xuICAgIC8vIGFkZCBzZWdzIHdpdGggdW5rbm93biBoZWlnaHRzXG4gICAgZm9yICh2YXIgX2kgPSAwLCB1bmtub3duSGVpZ2h0U2Vnc18xID0gdW5rbm93bkhlaWdodFNlZ3M7IF9pIDwgdW5rbm93bkhlaWdodFNlZ3NfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHNlZyA9IHVua25vd25IZWlnaHRTZWdzXzFbX2ldO1xuICAgICAgICBtdWx0aUNvbFBsYWNlbWVudHNbc2VnLmZpcnN0Q29sXS5wdXNoKHtcbiAgICAgICAgICAgIHNlZzogc2VnLFxuICAgICAgICAgICAgaXNWaXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGlzQWJzb2x1dGU6IHRydWUsXG4gICAgICAgICAgICBhYnNvbHV0ZVRvcDogMCxcbiAgICAgICAgICAgIG1hcmdpblRvcDogMCxcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAodmFyIGNvbCA9IHNlZy5maXJzdENvbDsgY29sIDw9IHNlZy5sYXN0Q29sOyBjb2wgKz0gMSkge1xuICAgICAgICAgICAgc2luZ2xlQ29sUGxhY2VtZW50c1tjb2xdLnB1c2goe1xuICAgICAgICAgICAgICAgIHNlZzogcmVzbGljZVNlZyhzZWcsIGNvbCwgY29sICsgMSwgY2VsbHMpLFxuICAgICAgICAgICAgICAgIGlzVmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNBYnNvbHV0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgYWJzb2x1dGVUb3A6IDAsXG4gICAgICAgICAgICAgICAgbWFyZ2luVG9wOiAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYWRkIHRoZSBoaWRkZW4gZW50cmllc1xuICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IGNlbGxzLmxlbmd0aDsgY29sICs9IDEpIHtcbiAgICAgICAgbW9yZUNudHMucHVzaCgwKTtcbiAgICB9XG4gICAgZm9yICh2YXIgX2IgPSAwLCBoaWRkZW5FbnRyaWVzXzEgPSBoaWRkZW5FbnRyaWVzOyBfYiA8IGhpZGRlbkVudHJpZXNfMS5sZW5ndGg7IF9iKyspIHtcbiAgICAgICAgdmFyIGhpZGRlbkVudHJ5ID0gaGlkZGVuRW50cmllc18xW19iXTtcbiAgICAgICAgdmFyIHNlZyA9IHNlZ3NbaGlkZGVuRW50cnkuaW5kZXhdO1xuICAgICAgICB2YXIgaGlkZGVuU3BhbiA9IGhpZGRlbkVudHJ5LnNwYW47XG4gICAgICAgIG11bHRpQ29sUGxhY2VtZW50c1toaWRkZW5TcGFuLnN0YXJ0XS5wdXNoKHtcbiAgICAgICAgICAgIHNlZzogcmVzbGljZVNlZyhzZWcsIGhpZGRlblNwYW4uc3RhcnQsIGhpZGRlblNwYW4uZW5kLCBjZWxscyksXG4gICAgICAgICAgICBpc1Zpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgaXNBYnNvbHV0ZTogdHJ1ZSxcbiAgICAgICAgICAgIGFic29sdXRlVG9wOiAwLFxuICAgICAgICAgICAgbWFyZ2luVG9wOiAwLFxuICAgICAgICB9KTtcbiAgICAgICAgZm9yICh2YXIgY29sID0gaGlkZGVuU3Bhbi5zdGFydDsgY29sIDwgaGlkZGVuU3Bhbi5lbmQ7IGNvbCArPSAxKSB7XG4gICAgICAgICAgICBtb3JlQ250c1tjb2xdICs9IDE7XG4gICAgICAgICAgICBzaW5nbGVDb2xQbGFjZW1lbnRzW2NvbF0ucHVzaCh7XG4gICAgICAgICAgICAgICAgc2VnOiByZXNsaWNlU2VnKHNlZywgY29sLCBjb2wgKyAxLCBjZWxscyksXG4gICAgICAgICAgICAgICAgaXNWaXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0Fic29sdXRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBhYnNvbHV0ZVRvcDogMCxcbiAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IDAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBkZWFsIHdpdGggbGVmdG92ZXIgbWFyZ2luc1xuICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IGNlbGxzLmxlbmd0aDsgY29sICs9IDEpIHtcbiAgICAgICAgbW9yZU1hcmdpblRvcHMucHVzaChsZWZ0b3Zlck1hcmdpbnNbY29sXSk7XG4gICAgfVxuICAgIHJldHVybiB7IHNpbmdsZUNvbFBsYWNlbWVudHM6IHNpbmdsZUNvbFBsYWNlbWVudHMsIG11bHRpQ29sUGxhY2VtZW50czogbXVsdGlDb2xQbGFjZW1lbnRzLCBtb3JlQ250czogbW9yZUNudHMsIG1vcmVNYXJnaW5Ub3BzOiBtb3JlTWFyZ2luVG9wcyB9O1xufVxuLy8gcmVjdHMgb3JkZXJlZCBieSB0b3AgY29vcmQsIHRoZW4gbGVmdFxuZnVuY3Rpb24gcGxhY2VSZWN0cyhhbGxSZWN0cywgc2VncywgY2VsbHMpIHtcbiAgICB2YXIgcmVjdHNCeUVhY2hDb2wgPSBncm91cFJlY3RzQnlFYWNoQ29sKGFsbFJlY3RzLCBjZWxscy5sZW5ndGgpO1xuICAgIHZhciBzaW5nbGVDb2xQbGFjZW1lbnRzID0gW107XG4gICAgdmFyIG11bHRpQ29sUGxhY2VtZW50cyA9IFtdO1xuICAgIHZhciBsZWZ0b3Zlck1hcmdpbnMgPSBbXTtcbiAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCBjZWxscy5sZW5ndGg7IGNvbCArPSAxKSB7XG4gICAgICAgIHZhciByZWN0cyA9IHJlY3RzQnlFYWNoQ29sW2NvbF07XG4gICAgICAgIC8vIGNvbXB1dGUgYWxsIHN0YXRpYyBzZWdzIGluIHNpbmdsZVBsYWNlbWVudHNcbiAgICAgICAgdmFyIHNpbmdsZVBsYWNlbWVudHMgPSBbXTtcbiAgICAgICAgdmFyIGN1cnJlbnRIZWlnaHQgPSAwO1xuICAgICAgICB2YXIgY3VycmVudE1hcmdpblRvcCA9IDA7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgcmVjdHNfMSA9IHJlY3RzOyBfaSA8IHJlY3RzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgcmVjdCA9IHJlY3RzXzFbX2ldO1xuICAgICAgICAgICAgdmFyIHNlZyA9IHNlZ3NbcmVjdC5pbmRleF07XG4gICAgICAgICAgICBzaW5nbGVQbGFjZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHNlZzogcmVzbGljZVNlZyhzZWcsIGNvbCwgY29sICsgMSwgY2VsbHMpLFxuICAgICAgICAgICAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc0Fic29sdXRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBhYnNvbHV0ZVRvcDogcmVjdC5sZXZlbENvb3JkLFxuICAgICAgICAgICAgICAgIG1hcmdpblRvcDogcmVjdC5sZXZlbENvb3JkIC0gY3VycmVudEhlaWdodCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY3VycmVudEhlaWdodCA9IHJlY3QubGV2ZWxDb29yZCArIHJlY3QudGhpY2tuZXNzO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbXB1dGUgbWl4ZWQgc3RhdGljL2Fic29sdXRlIHNlZ3MgaW4gbXVsdGlQbGFjZW1lbnRzXG4gICAgICAgIHZhciBtdWx0aVBsYWNlbWVudHMgPSBbXTtcbiAgICAgICAgY3VycmVudEhlaWdodCA9IDA7XG4gICAgICAgIGN1cnJlbnRNYXJnaW5Ub3AgPSAwO1xuICAgICAgICBmb3IgKHZhciBfYSA9IDAsIHJlY3RzXzIgPSByZWN0czsgX2EgPCByZWN0c18yLmxlbmd0aDsgX2ErKykge1xuICAgICAgICAgICAgdmFyIHJlY3QgPSByZWN0c18yW19hXTtcbiAgICAgICAgICAgIHZhciBzZWcgPSBzZWdzW3JlY3QuaW5kZXhdO1xuICAgICAgICAgICAgdmFyIGlzQWJzb2x1dGUgPSByZWN0LnNwYW4uZW5kIC0gcmVjdC5zcGFuLnN0YXJ0ID4gMTsgLy8gbXVsdGktY29sdW1uP1xuICAgICAgICAgICAgdmFyIGlzRmlyc3RDb2wgPSByZWN0LnNwYW4uc3RhcnQgPT09IGNvbDtcbiAgICAgICAgICAgIGN1cnJlbnRNYXJnaW5Ub3AgKz0gcmVjdC5sZXZlbENvb3JkIC0gY3VycmVudEhlaWdodDsgLy8gYW1vdW50IG9mIHNwYWNlIHNpbmNlIGJvdHRvbSBvZiBwcmV2aW91cyBzZWdcbiAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgPSByZWN0LmxldmVsQ29vcmQgKyByZWN0LnRoaWNrbmVzczsgLy8gaGVpZ2h0IHdpbGwgbm93IGJlIGJvdHRvbSBvZiBjdXJyZW50IHNlZ1xuICAgICAgICAgICAgaWYgKGlzQWJzb2x1dGUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50TWFyZ2luVG9wICs9IHJlY3QudGhpY2tuZXNzO1xuICAgICAgICAgICAgICAgIGlmIChpc0ZpcnN0Q29sKSB7XG4gICAgICAgICAgICAgICAgICAgIG11bHRpUGxhY2VtZW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlZzogcmVzbGljZVNlZyhzZWcsIHJlY3Quc3Bhbi5zdGFydCwgcmVjdC5zcGFuLmVuZCwgY2VsbHMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNBYnNvbHV0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlVG9wOiByZWN0LmxldmVsQ29vcmQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IDAsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRmlyc3RDb2wpIHtcbiAgICAgICAgICAgICAgICBtdWx0aVBsYWNlbWVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHNlZzogcmVzbGljZVNlZyhzZWcsIHJlY3Quc3Bhbi5zdGFydCwgcmVjdC5zcGFuLmVuZCwgY2VsbHMpLFxuICAgICAgICAgICAgICAgICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGlzQWJzb2x1dGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZVRvcDogcmVjdC5sZXZlbENvb3JkLFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IGN1cnJlbnRNYXJnaW5Ub3AsIC8vIGNsYWltIHRoZSBtYXJnaW5cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjdXJyZW50TWFyZ2luVG9wID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzaW5nbGVDb2xQbGFjZW1lbnRzLnB1c2goc2luZ2xlUGxhY2VtZW50cyk7XG4gICAgICAgIG11bHRpQ29sUGxhY2VtZW50cy5wdXNoKG11bHRpUGxhY2VtZW50cyk7XG4gICAgICAgIGxlZnRvdmVyTWFyZ2lucy5wdXNoKGN1cnJlbnRNYXJnaW5Ub3ApO1xuICAgIH1cbiAgICByZXR1cm4geyBzaW5nbGVDb2xQbGFjZW1lbnRzOiBzaW5nbGVDb2xQbGFjZW1lbnRzLCBtdWx0aUNvbFBsYWNlbWVudHM6IG11bHRpQ29sUGxhY2VtZW50cywgbGVmdG92ZXJNYXJnaW5zOiBsZWZ0b3Zlck1hcmdpbnMgfTtcbn1cbmZ1bmN0aW9uIGdyb3VwUmVjdHNCeUVhY2hDb2wocmVjdHMsIGNvbENudCkge1xuICAgIHZhciByZWN0c0J5RWFjaENvbCA9IFtdO1xuICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IGNvbENudDsgY29sICs9IDEpIHtcbiAgICAgICAgcmVjdHNCeUVhY2hDb2wucHVzaChbXSk7XG4gICAgfVxuICAgIGZvciAodmFyIF9pID0gMCwgcmVjdHNfMyA9IHJlY3RzOyBfaSA8IHJlY3RzXzMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciByZWN0ID0gcmVjdHNfM1tfaV07XG4gICAgICAgIGZvciAodmFyIGNvbCA9IHJlY3Quc3Bhbi5zdGFydDsgY29sIDwgcmVjdC5zcGFuLmVuZDsgY29sICs9IDEpIHtcbiAgICAgICAgICAgIHJlY3RzQnlFYWNoQ29sW2NvbF0ucHVzaChyZWN0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVjdHNCeUVhY2hDb2w7XG59XG5mdW5jdGlvbiByZXNsaWNlU2VnKHNlZywgc3BhblN0YXJ0LCBzcGFuRW5kLCBjZWxscykge1xuICAgIGlmIChzZWcuZmlyc3RDb2wgPT09IHNwYW5TdGFydCAmJiBzZWcubGFzdENvbCA9PT0gc3BhbkVuZCAtIDEpIHtcbiAgICAgICAgcmV0dXJuIHNlZztcbiAgICB9XG4gICAgdmFyIGV2ZW50UmFuZ2UgPSBzZWcuZXZlbnRSYW5nZTtcbiAgICB2YXIgb3JpZ1JhbmdlID0gZXZlbnRSYW5nZS5yYW5nZTtcbiAgICB2YXIgc2xpY2VkUmFuZ2UgPSBjb21tb24uaW50ZXJzZWN0UmFuZ2VzKG9yaWdSYW5nZSwge1xuICAgICAgICBzdGFydDogY2VsbHNbc3BhblN0YXJ0XS5kYXRlLFxuICAgICAgICBlbmQ6IGNvbW1vbi5hZGREYXlzKGNlbGxzW3NwYW5FbmQgLSAxXS5kYXRlLCAxKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIHNlZyksIHsgZmlyc3RDb2w6IHNwYW5TdGFydCwgbGFzdENvbDogc3BhbkVuZCAtIDEsIGV2ZW50UmFuZ2U6IHtcbiAgICAgICAgICAgIGRlZjogZXZlbnRSYW5nZS5kZWYsXG4gICAgICAgICAgICB1aTogdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGV2ZW50UmFuZ2UudWkpLCB7IGR1cmF0aW9uRWRpdGFibGU6IGZhbHNlIH0pLFxuICAgICAgICAgICAgaW5zdGFuY2U6IGV2ZW50UmFuZ2UuaW5zdGFuY2UsXG4gICAgICAgICAgICByYW5nZTogc2xpY2VkUmFuZ2UsXG4gICAgICAgIH0sIGlzU3RhcnQ6IHNlZy5pc1N0YXJ0ICYmIHNsaWNlZFJhbmdlLnN0YXJ0LnZhbHVlT2YoKSA9PT0gb3JpZ1JhbmdlLnN0YXJ0LnZhbHVlT2YoKSwgaXNFbmQ6IHNlZy5pc0VuZCAmJiBzbGljZWRSYW5nZS5lbmQudmFsdWVPZigpID09PSBvcmlnUmFuZ2UuZW5kLnZhbHVlT2YoKSB9KTtcbn1cbnZhciBEYXlHcmlkU2VnSGllcmFyY2h5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhEYXlHcmlkU2VnSGllcmFyY2h5LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIERheUdyaWRTZWdIaWVyYXJjaHkoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICAvLyBjb25maWdcbiAgICAgICAgX3RoaXMuaGlkZGVuQ29uc3VtZXMgPSBmYWxzZTtcbiAgICAgICAgLy8gYWxsb3dzIHVzIHRvIGtlZXAgaGlkZGVuIGVudHJpZXMgaW4gdGhlIGhpZXJhcmNoeSBzbyB0aGV5IHRha2UgdXAgc3BhY2VcbiAgICAgICAgX3RoaXMuZm9yY2VIaWRkZW4gPSB7fTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBEYXlHcmlkU2VnSGllcmFyY2h5LnByb3RvdHlwZS5hZGRTZWdzID0gZnVuY3Rpb24gKHNlZ0lucHV0cykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgaGlkZGVuU2VncyA9IF9zdXBlci5wcm90b3R5cGUuYWRkU2Vncy5jYWxsKHRoaXMsIHNlZ0lucHV0cyk7XG4gICAgICAgIHZhciBlbnRyaWVzQnlMZXZlbCA9IHRoaXMuZW50cmllc0J5TGV2ZWw7XG4gICAgICAgIHZhciBleGNsdWRlSGlkZGVuID0gZnVuY3Rpb24gKGVudHJ5KSB7IHJldHVybiAhX3RoaXMuZm9yY2VIaWRkZW5bY29tbW9uLmJ1aWxkRW50cnlLZXkoZW50cnkpXTsgfTtcbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBmb3JjZWQtaGlkZGVuIHNlZ3NcbiAgICAgICAgZm9yICh2YXIgbGV2ZWwgPSAwOyBsZXZlbCA8IGVudHJpZXNCeUxldmVsLmxlbmd0aDsgbGV2ZWwgKz0gMSkge1xuICAgICAgICAgICAgZW50cmllc0J5TGV2ZWxbbGV2ZWxdID0gZW50cmllc0J5TGV2ZWxbbGV2ZWxdLmZpbHRlcihleGNsdWRlSGlkZGVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGlkZGVuU2VncztcbiAgICB9O1xuICAgIERheUdyaWRTZWdIaWVyYXJjaHkucHJvdG90eXBlLmhhbmRsZUludmFsaWRJbnNlcnRpb24gPSBmdW5jdGlvbiAoaW5zZXJ0aW9uLCBlbnRyeSwgaGlkZGVuRW50cmllcykge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBlbnRyaWVzQnlMZXZlbCA9IF9hLmVudHJpZXNCeUxldmVsLCBmb3JjZUhpZGRlbiA9IF9hLmZvcmNlSGlkZGVuO1xuICAgICAgICB2YXIgdG91Y2hpbmdFbnRyeSA9IGluc2VydGlvbi50b3VjaGluZ0VudHJ5LCB0b3VjaGluZ0xldmVsID0gaW5zZXJ0aW9uLnRvdWNoaW5nTGV2ZWwsIHRvdWNoaW5nTGF0ZXJhbCA9IGluc2VydGlvbi50b3VjaGluZ0xhdGVyYWw7XG4gICAgICAgIGlmICh0aGlzLmhpZGRlbkNvbnN1bWVzICYmIHRvdWNoaW5nRW50cnkpIHtcbiAgICAgICAgICAgIHZhciB0b3VjaGluZ0VudHJ5SWQgPSBjb21tb24uYnVpbGRFbnRyeUtleSh0b3VjaGluZ0VudHJ5KTtcbiAgICAgICAgICAgIC8vIGlmIG5vdCBhbHJlYWR5IGhpZGRlblxuICAgICAgICAgICAgaWYgKCFmb3JjZUhpZGRlblt0b3VjaGluZ0VudHJ5SWRdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWxsb3dSZXNsaWNpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBsYWNlaG9sZGVyRW50cnkgPSB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgdG91Y2hpbmdFbnRyeSksIHsgc3BhbjogY29tbW9uLmludGVyc2VjdFNwYW5zKHRvdWNoaW5nRW50cnkuc3BhbiwgZW50cnkuc3BhbikgfSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwbGFjZWhvbGRlckVudHJ5SWQgPSBjb21tb24uYnVpbGRFbnRyeUtleShwbGFjZWhvbGRlckVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgZm9yY2VIaWRkZW5bcGxhY2Vob2xkZXJFbnRyeUlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGVudHJpZXNCeUxldmVsW3RvdWNoaW5nTGV2ZWxdW3RvdWNoaW5nTGF0ZXJhbF0gPSBwbGFjZWhvbGRlckVudHJ5OyAvLyByZXBsYWNlIHRvdWNoaW5nRW50cnkgd2l0aCBvdXIgcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGxpdEVudHJ5KHRvdWNoaW5nRW50cnksIGVudHJ5LCBoaWRkZW5FbnRyaWVzKTsgLy8gc3BsaXQgdXAgdGhlIHRvdWNoaW5nRW50cnksIHJlaW5zZXJ0IGl0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3JjZUhpZGRlblt0b3VjaGluZ0VudHJ5SWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaGlkZGVuRW50cmllcy5wdXNoKHRvdWNoaW5nRW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5oYW5kbGVJbnZhbGlkSW5zZXJ0aW9uLmNhbGwodGhpcywgaW5zZXJ0aW9uLCBlbnRyeSwgaGlkZGVuRW50cmllcyk7XG4gICAgfTtcbiAgICByZXR1cm4gRGF5R3JpZFNlZ0hpZXJhcmNoeTtcbn0oY29tbW9uLlNlZ0hpZXJhcmNoeSkpO1xuXG52YXIgVGFibGVSb3cgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFRhYmxlUm93LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRhYmxlUm93KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY2VsbEVsUmVmcyA9IG5ldyBjb21tb24uUmVmTWFwKCk7IC8vIHRoZSA8dGQ+XG4gICAgICAgIF90aGlzLmZyYW1lRWxSZWZzID0gbmV3IGNvbW1vbi5SZWZNYXAoKTsgLy8gdGhlIGZjLWRheWdyaWQtZGF5LWZyYW1lXG4gICAgICAgIF90aGlzLmZnRWxSZWZzID0gbmV3IGNvbW1vbi5SZWZNYXAoKTsgLy8gdGhlIGZjLWRheWdyaWQtZGF5LWV2ZW50c1xuICAgICAgICBfdGhpcy5zZWdIYXJuZXNzUmVmcyA9IG5ldyBjb21tb24uUmVmTWFwKCk7IC8vIGluZGV4ZWQgYnkgXCJpbnN0YW5jZUlkOmZpcnN0Q29sXCJcbiAgICAgICAgX3RoaXMucm9vdEVsUmVmID0gY29tbW9uLmNyZWF0ZVJlZigpO1xuICAgICAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGZyYW1lUG9zaXRpb25zOiBudWxsLFxuICAgICAgICAgICAgbWF4Q29udGVudEhlaWdodDogbnVsbCxcbiAgICAgICAgICAgIGV2ZW50SW5zdGFuY2VIZWlnaHRzOiB7fSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBUYWJsZVJvdy5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBwcm9wcyA9IF9hLnByb3BzLCBzdGF0ZSA9IF9hLnN0YXRlLCBjb250ZXh0ID0gX2EuY29udGV4dDtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnM7XG4gICAgICAgIHZhciBjb2xDbnQgPSBwcm9wcy5jZWxscy5sZW5ndGg7XG4gICAgICAgIHZhciBidXNpbmVzc0hvdXJzQnlDb2wgPSBzcGxpdFNlZ3NCeUZpcnN0Q29sKHByb3BzLmJ1c2luZXNzSG91clNlZ3MsIGNvbENudCk7XG4gICAgICAgIHZhciBiZ0V2ZW50U2Vnc0J5Q29sID0gc3BsaXRTZWdzQnlGaXJzdENvbChwcm9wcy5iZ0V2ZW50U2VncywgY29sQ250KTtcbiAgICAgICAgdmFyIGhpZ2hsaWdodFNlZ3NCeUNvbCA9IHNwbGl0U2Vnc0J5Rmlyc3RDb2wodGhpcy5nZXRIaWdobGlnaHRTZWdzKCksIGNvbENudCk7XG4gICAgICAgIHZhciBtaXJyb3JTZWdzQnlDb2wgPSBzcGxpdFNlZ3NCeUZpcnN0Q29sKHRoaXMuZ2V0TWlycm9yU2VncygpLCBjb2xDbnQpO1xuICAgICAgICB2YXIgX2IgPSBjb21wdXRlRmdTZWdQbGFjZW1lbnQoY29tbW9uLnNvcnRFdmVudFNlZ3MocHJvcHMuZmdFdmVudFNlZ3MsIG9wdGlvbnMuZXZlbnRPcmRlciksIHByb3BzLmRheU1heEV2ZW50cywgcHJvcHMuZGF5TWF4RXZlbnRSb3dzLCBvcHRpb25zLmV2ZW50T3JkZXJTdHJpY3QsIHN0YXRlLmV2ZW50SW5zdGFuY2VIZWlnaHRzLCBzdGF0ZS5tYXhDb250ZW50SGVpZ2h0LCBwcm9wcy5jZWxscyksIHNpbmdsZUNvbFBsYWNlbWVudHMgPSBfYi5zaW5nbGVDb2xQbGFjZW1lbnRzLCBtdWx0aUNvbFBsYWNlbWVudHMgPSBfYi5tdWx0aUNvbFBsYWNlbWVudHMsIG1vcmVDbnRzID0gX2IubW9yZUNudHMsIG1vcmVNYXJnaW5Ub3BzID0gX2IubW9yZU1hcmdpblRvcHM7XG4gICAgICAgIHZhciBpc0ZvcmNlZEludmlzaWJsZSA9IC8vIFRPRE86IG1lc3N5IHdheSB0byBjb21wdXRlIHRoaXNcbiAgICAgICAgIChwcm9wcy5ldmVudERyYWcgJiYgcHJvcHMuZXZlbnREcmFnLmFmZmVjdGVkSW5zdGFuY2VzKSB8fFxuICAgICAgICAgICAgKHByb3BzLmV2ZW50UmVzaXplICYmIHByb3BzLmV2ZW50UmVzaXplLmFmZmVjdGVkSW5zdGFuY2VzKSB8fFxuICAgICAgICAgICAge307XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCB7IHJlZjogdGhpcy5yb290RWxSZWYsIHJvbGU6IFwicm93XCIgfSxcbiAgICAgICAgICAgIHByb3BzLnJlbmRlckludHJvICYmIHByb3BzLnJlbmRlckludHJvKCksXG4gICAgICAgICAgICBwcm9wcy5jZWxscy5tYXAoZnVuY3Rpb24gKGNlbGwsIGNvbCkge1xuICAgICAgICAgICAgICAgIHZhciBub3JtYWxGZ05vZGVzID0gX3RoaXMucmVuZGVyRmdTZWdzKGNvbCwgcHJvcHMuZm9yUHJpbnQgPyBzaW5nbGVDb2xQbGFjZW1lbnRzW2NvbF0gOiBtdWx0aUNvbFBsYWNlbWVudHNbY29sXSwgcHJvcHMudG9kYXlSYW5nZSwgaXNGb3JjZWRJbnZpc2libGUpO1xuICAgICAgICAgICAgICAgIHZhciBtaXJyb3JGZ05vZGVzID0gX3RoaXMucmVuZGVyRmdTZWdzKGNvbCwgYnVpbGRNaXJyb3JQbGFjZW1lbnRzKG1pcnJvclNlZ3NCeUNvbFtjb2xdLCBtdWx0aUNvbFBsYWNlbWVudHMpLCBwcm9wcy50b2RheVJhbmdlLCB7fSwgQm9vbGVhbihwcm9wcy5ldmVudERyYWcpLCBCb29sZWFuKHByb3BzLmV2ZW50UmVzaXplKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoVGFibGVDZWxsLCB7IGtleTogY2VsbC5rZXksIGVsUmVmOiBfdGhpcy5jZWxsRWxSZWZzLmNyZWF0ZVJlZihjZWxsLmtleSksIGlubmVyRWxSZWY6IF90aGlzLmZyYW1lRWxSZWZzLmNyZWF0ZVJlZihjZWxsLmtleSkgLyogRkYgPHRkPiBwcm9ibGVtLCBidXQgb2theSB0byB1c2UgZm9yIGxlZnQvcmlnaHQuIFRPRE86IHJlbmFtZSBwcm9wICovLCBkYXRlUHJvZmlsZTogcHJvcHMuZGF0ZVByb2ZpbGUsIGRhdGU6IGNlbGwuZGF0ZSwgc2hvd0RheU51bWJlcjogcHJvcHMuc2hvd0RheU51bWJlcnMsIHNob3dXZWVrTnVtYmVyOiBwcm9wcy5zaG93V2Vla051bWJlcnMgJiYgY29sID09PSAwLCBmb3JjZURheVRvcDogcHJvcHMuc2hvd1dlZWtOdW1iZXJzIC8qIGV2ZW4gZGlzcGxheWluZyB3ZWVrbnVtIGZvciByb3csIG5vdCBuZWNlc3NhcmlseSBkYXkgKi8sIHRvZGF5UmFuZ2U6IHByb3BzLnRvZGF5UmFuZ2UsIGV2ZW50U2VsZWN0aW9uOiBwcm9wcy5ldmVudFNlbGVjdGlvbiwgZXZlbnREcmFnOiBwcm9wcy5ldmVudERyYWcsIGV2ZW50UmVzaXplOiBwcm9wcy5ldmVudFJlc2l6ZSwgZXh0cmFIb29rUHJvcHM6IGNlbGwuZXh0cmFIb29rUHJvcHMsIGV4dHJhRGF0YUF0dHJzOiBjZWxsLmV4dHJhRGF0YUF0dHJzLCBleHRyYUNsYXNzTmFtZXM6IGNlbGwuZXh0cmFDbGFzc05hbWVzLCBleHRyYURhdGVTcGFuOiBjZWxsLmV4dHJhRGF0ZVNwYW4sIG1vcmVDbnQ6IG1vcmVDbnRzW2NvbF0sIG1vcmVNYXJnaW5Ub3A6IG1vcmVNYXJnaW5Ub3BzW2NvbF0sIHNpbmdsZVBsYWNlbWVudHM6IHNpbmdsZUNvbFBsYWNlbWVudHNbY29sXSwgZmdDb250ZW50RWxSZWY6IF90aGlzLmZnRWxSZWZzLmNyZWF0ZVJlZihjZWxsLmtleSksIGZnQ29udGVudDogKCAvLyBGcmFnbWVudCBzY29wZXMgdGhlIGtleXNcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkZyYWdtZW50LCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkZyYWdtZW50LCBudWxsLCBub3JtYWxGZ05vZGVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5GcmFnbWVudCwgbnVsbCwgbWlycm9yRmdOb2RlcykpKSwgYmdDb250ZW50OiAoIC8vIEZyYWdtZW50IHNjb3BlcyB0aGUga2V5c1xuICAgICAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uRnJhZ21lbnQsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZW5kZXJGaWxsU2VncyhoaWdobGlnaHRTZWdzQnlDb2xbY29sXSwgJ2hpZ2hsaWdodCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVuZGVyRmlsbFNlZ3MoYnVzaW5lc3NIb3Vyc0J5Q29sW2NvbF0sICdub24tYnVzaW5lc3MnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlckZpbGxTZWdzKGJnRXZlbnRTZWdzQnlDb2xbY29sXSwgJ2JnLWV2ZW50JykpKSB9KSk7XG4gICAgICAgICAgICB9KSkpO1xuICAgIH07XG4gICAgVGFibGVSb3cucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVNpemluZyh0cnVlKTtcbiAgICB9O1xuICAgIFRhYmxlUm93LnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiAocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRQcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHRoaXMudXBkYXRlU2l6aW5nKCFjb21tb24uaXNQcm9wc0VxdWFsKHByZXZQcm9wcywgY3VycmVudFByb3BzKSk7XG4gICAgfTtcbiAgICBUYWJsZVJvdy5wcm90b3R5cGUuZ2V0SGlnaGxpZ2h0U2VncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgaWYgKHByb3BzLmV2ZW50RHJhZyAmJiBwcm9wcy5ldmVudERyYWcuc2Vncy5sZW5ndGgpIHsgLy8gbWVzc3kgY2hlY2tcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5ldmVudERyYWcuc2VncztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcHMuZXZlbnRSZXNpemUgJiYgcHJvcHMuZXZlbnRSZXNpemUuc2Vncy5sZW5ndGgpIHsgLy8gbWVzc3kgY2hlY2tcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5ldmVudFJlc2l6ZS5zZWdzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wcy5kYXRlU2VsZWN0aW9uU2VncztcbiAgICB9O1xuICAgIFRhYmxlUm93LnByb3RvdHlwZS5nZXRNaXJyb3JTZWdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICBpZiAocHJvcHMuZXZlbnRSZXNpemUgJiYgcHJvcHMuZXZlbnRSZXNpemUuc2Vncy5sZW5ndGgpIHsgLy8gbWVzc3kgY2hlY2tcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5ldmVudFJlc2l6ZS5zZWdzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9O1xuICAgIFRhYmxlUm93LnByb3RvdHlwZS5yZW5kZXJGZ1NlZ3MgPSBmdW5jdGlvbiAoY29sLCBzZWdQbGFjZW1lbnRzLCB0b2RheVJhbmdlLCBpc0ZvcmNlZEludmlzaWJsZSwgaXNEcmFnZ2luZywgaXNSZXNpemluZywgaXNEYXRlU2VsZWN0aW5nKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICB2YXIgZXZlbnRTZWxlY3Rpb24gPSB0aGlzLnByb3BzLmV2ZW50U2VsZWN0aW9uO1xuICAgICAgICB2YXIgZnJhbWVQb3NpdGlvbnMgPSB0aGlzLnN0YXRlLmZyYW1lUG9zaXRpb25zO1xuICAgICAgICB2YXIgZGVmYXVsdERpc3BsYXlFdmVudEVuZCA9IHRoaXMucHJvcHMuY2VsbHMubGVuZ3RoID09PSAxOyAvLyBjb2xDbnQgPT09IDFcbiAgICAgICAgdmFyIGlzTWlycm9yID0gaXNEcmFnZ2luZyB8fCBpc1Jlc2l6aW5nIHx8IGlzRGF0ZVNlbGVjdGluZztcbiAgICAgICAgdmFyIG5vZGVzID0gW107XG4gICAgICAgIGlmIChmcmFtZVBvc2l0aW9ucykge1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBzZWdQbGFjZW1lbnRzXzEgPSBzZWdQbGFjZW1lbnRzOyBfaSA8IHNlZ1BsYWNlbWVudHNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcGxhY2VtZW50ID0gc2VnUGxhY2VtZW50c18xW19pXTtcbiAgICAgICAgICAgICAgICB2YXIgc2VnID0gcGxhY2VtZW50LnNlZztcbiAgICAgICAgICAgICAgICB2YXIgaW5zdGFuY2VJZCA9IHNlZy5ldmVudFJhbmdlLmluc3RhbmNlLmluc3RhbmNlSWQ7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGluc3RhbmNlSWQgKyAnOicgKyBjb2w7XG4gICAgICAgICAgICAgICAgdmFyIGlzVmlzaWJsZSA9IHBsYWNlbWVudC5pc1Zpc2libGUgJiYgIWlzRm9yY2VkSW52aXNpYmxlW2luc3RhbmNlSWRdO1xuICAgICAgICAgICAgICAgIHZhciBpc0Fic29sdXRlID0gcGxhY2VtZW50LmlzQWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgdmFyIGxlZnQgPSAnJztcbiAgICAgICAgICAgICAgICB2YXIgcmlnaHQgPSAnJztcbiAgICAgICAgICAgICAgICBpZiAoaXNBYnNvbHV0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5pc1J0bCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGZyYW1lUG9zaXRpb25zLmxlZnRzW3NlZy5sYXN0Q29sXSAtIGZyYW1lUG9zaXRpb25zLmxlZnRzW3NlZy5maXJzdENvbF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gZnJhbWVQb3NpdGlvbnMucmlnaHRzW3NlZy5maXJzdENvbF0gLSBmcmFtZVBvc2l0aW9ucy5yaWdodHNbc2VnLmxhc3RDb2xdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAga25vd24gYnVnOiBldmVudHMgdGhhdCBhcmUgZm9yY2UgdG8gYmUgbGlzdC1pdGVtIGJ1dCBzcGFuIG11bHRpcGxlIGRheXMgc3RpbGwgdGFrZSB1cCBzcGFjZSBpbiBsYXRlciBjb2x1bW5zXG4gICAgICAgICAgICAgICAgdG9kbzogaW4gcHJpbnQgdmlldywgZm9yIG11bHRpLWRheSBldmVudHMsIGRvbid0IGRpc3BsYXkgdGl0bGUgd2l0aGluIG5vbi1zdGFydC9lbmQgc2Vnc1xuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogJ2ZjLWRheWdyaWQtZXZlbnQtaGFybmVzcycgKyAoaXNBYnNvbHV0ZSA/ICcgZmMtZGF5Z3JpZC1ldmVudC1oYXJuZXNzLWFicycgOiAnJyksIGtleToga2V5LCByZWY6IGlzTWlycm9yID8gbnVsbCA6IHRoaXMuc2VnSGFybmVzc1JlZnMuY3JlYXRlUmVmKGtleSksIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiBpc1Zpc2libGUgPyAnJyA6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luVG9wOiBpc0Fic29sdXRlID8gJycgOiBwbGFjZW1lbnQubWFyZ2luVG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBpc0Fic29sdXRlID8gcGxhY2VtZW50LmFic29sdXRlVG9wIDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB9IH0sIGhhc0xpc3RJdGVtRGlzcGxheShzZWcpID8gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFRhYmxlTGlzdEl0ZW1FdmVudCwgdHNsaWIuX19hc3NpZ24oeyBzZWc6IHNlZywgaXNEcmFnZ2luZzogaXNEcmFnZ2luZywgaXNTZWxlY3RlZDogaW5zdGFuY2VJZCA9PT0gZXZlbnRTZWxlY3Rpb24sIGRlZmF1bHREaXNwbGF5RXZlbnRFbmQ6IGRlZmF1bHREaXNwbGF5RXZlbnRFbmQgfSwgY29tbW9uLmdldFNlZ01ldGEoc2VnLCB0b2RheVJhbmdlKSkpKSA6IChjb21tb24uY3JlYXRlRWxlbWVudChUYWJsZUJsb2NrRXZlbnQsIHRzbGliLl9fYXNzaWduKHsgc2VnOiBzZWcsIGlzRHJhZ2dpbmc6IGlzRHJhZ2dpbmcsIGlzUmVzaXppbmc6IGlzUmVzaXppbmcsIGlzRGF0ZVNlbGVjdGluZzogaXNEYXRlU2VsZWN0aW5nLCBpc1NlbGVjdGVkOiBpbnN0YW5jZUlkID09PSBldmVudFNlbGVjdGlvbiwgZGVmYXVsdERpc3BsYXlFdmVudEVuZDogZGVmYXVsdERpc3BsYXlFdmVudEVuZCB9LCBjb21tb24uZ2V0U2VnTWV0YShzZWcsIHRvZGF5UmFuZ2UpKSkpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGVzO1xuICAgIH07XG4gICAgVGFibGVSb3cucHJvdG90eXBlLnJlbmRlckZpbGxTZWdzID0gZnVuY3Rpb24gKHNlZ3MsIGZpbGxUeXBlKSB7XG4gICAgICAgIHZhciBpc1J0bCA9IHRoaXMuY29udGV4dC5pc1J0bDtcbiAgICAgICAgdmFyIHRvZGF5UmFuZ2UgPSB0aGlzLnByb3BzLnRvZGF5UmFuZ2U7XG4gICAgICAgIHZhciBmcmFtZVBvc2l0aW9ucyA9IHRoaXMuc3RhdGUuZnJhbWVQb3NpdGlvbnM7XG4gICAgICAgIHZhciBub2RlcyA9IFtdO1xuICAgICAgICBpZiAoZnJhbWVQb3NpdGlvbnMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgc2Vnc18xID0gc2VnczsgX2kgPCBzZWdzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNlZyA9IHNlZ3NfMVtfaV07XG4gICAgICAgICAgICAgICAgdmFyIGxlZnRSaWdodENzcyA9IGlzUnRsID8ge1xuICAgICAgICAgICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogZnJhbWVQb3NpdGlvbnMubGVmdHNbc2VnLmxhc3RDb2xdIC0gZnJhbWVQb3NpdGlvbnMubGVmdHNbc2VnLmZpcnN0Q29sXSxcbiAgICAgICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgICAgICByaWdodDogZnJhbWVQb3NpdGlvbnMucmlnaHRzW3NlZy5maXJzdENvbF0gLSBmcmFtZVBvc2l0aW9ucy5yaWdodHNbc2VnLmxhc3RDb2xdLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGtleTogY29tbW9uLmJ1aWxkRXZlbnRSYW5nZUtleShzZWcuZXZlbnRSYW5nZSksIGNsYXNzTmFtZTogXCJmYy1kYXlncmlkLWJnLWhhcm5lc3NcIiwgc3R5bGU6IGxlZnRSaWdodENzcyB9LCBmaWxsVHlwZSA9PT0gJ2JnLWV2ZW50JyA/XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5CZ0V2ZW50LCB0c2xpYi5fX2Fzc2lnbih7IHNlZzogc2VnIH0sIGNvbW1vbi5nZXRTZWdNZXRhKHNlZywgdG9kYXlSYW5nZSkpKSA6XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbi5yZW5kZXJGaWxsKGZpbGxUeXBlKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21tb24uY3JlYXRlRWxlbWVudC5hcHBseSh2b2lkIDAsIHRzbGliLl9fc3ByZWFkQXJyYXkoW2NvbW1vbi5GcmFnbWVudCwge31dLCBub2RlcykpO1xuICAgIH07XG4gICAgVGFibGVSb3cucHJvdG90eXBlLnVwZGF0ZVNpemluZyA9IGZ1bmN0aW9uIChpc0V4dGVybmFsU2l6aW5nQ2hhbmdlKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGZyYW1lRWxSZWZzID0gX2EuZnJhbWVFbFJlZnM7XG4gICAgICAgIGlmICghcHJvcHMuZm9yUHJpbnQgJiZcbiAgICAgICAgICAgIHByb3BzLmNsaWVudFdpZHRoICE9PSBudWxsIC8vIHBvc2l0aW9uaW5nIHJlYWR5P1xuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChpc0V4dGVybmFsU2l6aW5nQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyYW1lRWxzID0gcHJvcHMuY2VsbHMubWFwKGZ1bmN0aW9uIChjZWxsKSB7IHJldHVybiBmcmFtZUVsUmVmcy5jdXJyZW50TWFwW2NlbGwua2V5XTsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyYW1lRWxzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb3JpZ2luRWwgPSB0aGlzLnJvb3RFbFJlZi5jdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lUG9zaXRpb25zOiBuZXcgY29tbW9uLlBvc2l0aW9uQ2FjaGUob3JpZ2luRWwsIGZyYW1lRWxzLCB0cnVlLCAvLyBpc0hvcml6b250YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG9sZEluc3RhbmNlSGVpZ2h0cyA9IHRoaXMuc3RhdGUuZXZlbnRJbnN0YW5jZUhlaWdodHM7XG4gICAgICAgICAgICB2YXIgbmV3SW5zdGFuY2VIZWlnaHRzID0gdGhpcy5xdWVyeUV2ZW50SW5zdGFuY2VIZWlnaHRzKCk7XG4gICAgICAgICAgICB2YXIgbGltaXRCeUNvbnRlbnRIZWlnaHQgPSBwcm9wcy5kYXlNYXhFdmVudHMgPT09IHRydWUgfHwgcHJvcHMuZGF5TWF4RXZlbnRSb3dzID09PSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zYWZlU2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIC8vIEhBQ0sgdG8gcHJldmVudCBvc2NpbGxhdGlvbnMgb2YgZXZlbnRzIGJlaW5nIHNob3duL2hpZGRlbiBmcm9tIG1heC1ldmVudC1yb3dzXG4gICAgICAgICAgICAgICAgLy8gRXNzZW50aWFsbHksIG9uY2UgeW91IGNvbXB1dGUgYW4gZWxlbWVudCdzIGhlaWdodCwgbmV2ZXIgbnVsbC1vdXQuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogYWx3YXlzIGRpc3BsYXkgYWxsIGV2ZW50cywgYXMgdmlzaWJpbGl0eTpoaWRkZW4/XG4gICAgICAgICAgICAgICAgZXZlbnRJbnN0YW5jZUhlaWdodHM6IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBvbGRJbnN0YW5jZUhlaWdodHMpLCBuZXdJbnN0YW5jZUhlaWdodHMpLFxuICAgICAgICAgICAgICAgIG1heENvbnRlbnRIZWlnaHQ6IGxpbWl0QnlDb250ZW50SGVpZ2h0ID8gdGhpcy5jb21wdXRlTWF4Q29udGVudEhlaWdodCgpIDogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUYWJsZVJvdy5wcm90b3R5cGUucXVlcnlFdmVudEluc3RhbmNlSGVpZ2h0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNlZ0VsTWFwID0gdGhpcy5zZWdIYXJuZXNzUmVmcy5jdXJyZW50TWFwO1xuICAgICAgICB2YXIgZXZlbnRJbnN0YW5jZUhlaWdodHMgPSB7fTtcbiAgICAgICAgLy8gZ2V0IHRoZSBtYXggaGVpZ2h0IGFtb25nc3QgaW5zdGFuY2Ugc2Vnc1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gc2VnRWxNYXApIHtcbiAgICAgICAgICAgIHZhciBoZWlnaHQgPSBNYXRoLnJvdW5kKHNlZ0VsTWFwW2tleV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KTtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZUlkID0ga2V5LnNwbGl0KCc6JylbMF07IC8vIGRlY29uc3RydWN0IGhvdyByZW5kZXJGZ1NlZ3MgbWFrZXMgdGhlIGtleVxuICAgICAgICAgICAgZXZlbnRJbnN0YW5jZUhlaWdodHNbaW5zdGFuY2VJZF0gPSBNYXRoLm1heChldmVudEluc3RhbmNlSGVpZ2h0c1tpbnN0YW5jZUlkXSB8fCAwLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBldmVudEluc3RhbmNlSGVpZ2h0cztcbiAgICB9O1xuICAgIFRhYmxlUm93LnByb3RvdHlwZS5jb21wdXRlTWF4Q29udGVudEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGZpcnN0S2V5ID0gdGhpcy5wcm9wcy5jZWxsc1swXS5rZXk7XG4gICAgICAgIHZhciBjZWxsRWwgPSB0aGlzLmNlbGxFbFJlZnMuY3VycmVudE1hcFtmaXJzdEtleV07XG4gICAgICAgIHZhciBmY0NvbnRhaW5lckVsID0gdGhpcy5mZ0VsUmVmcy5jdXJyZW50TWFwW2ZpcnN0S2V5XTtcbiAgICAgICAgcmV0dXJuIGNlbGxFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gLSBmY0NvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICB9O1xuICAgIFRhYmxlUm93LnByb3RvdHlwZS5nZXRDZWxsRWxzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZWxNYXAgPSB0aGlzLmNlbGxFbFJlZnMuY3VycmVudE1hcDtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2VsbHMubWFwKGZ1bmN0aW9uIChjZWxsKSB7IHJldHVybiBlbE1hcFtjZWxsLmtleV07IH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFRhYmxlUm93O1xufShjb21tb24uRGF0ZUNvbXBvbmVudCkpO1xuVGFibGVSb3cuYWRkU3RhdGVFcXVhbGl0eSh7XG4gICAgZXZlbnRJbnN0YW5jZUhlaWdodHM6IGNvbW1vbi5pc1Byb3BzRXF1YWwsXG59KTtcbmZ1bmN0aW9uIGJ1aWxkTWlycm9yUGxhY2VtZW50cyhtaXJyb3JTZWdzLCBjb2xQbGFjZW1lbnRzKSB7XG4gICAgaWYgKCFtaXJyb3JTZWdzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHZhciB0b3BzQnlJbnN0YW5jZUlkID0gYnVpbGRBYnNvbHV0ZVRvcEhhc2goY29sUGxhY2VtZW50cyk7IC8vIFRPRE86IGNhY2hlIHRoaXMgYXQgZmlyc3QgcmVuZGVyP1xuICAgIHJldHVybiBtaXJyb3JTZWdzLm1hcChmdW5jdGlvbiAoc2VnKSB7IHJldHVybiAoe1xuICAgICAgICBzZWc6IHNlZyxcbiAgICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgICBpc0Fic29sdXRlOiB0cnVlLFxuICAgICAgICBhYnNvbHV0ZVRvcDogdG9wc0J5SW5zdGFuY2VJZFtzZWcuZXZlbnRSYW5nZS5pbnN0YW5jZS5pbnN0YW5jZUlkXSxcbiAgICAgICAgbWFyZ2luVG9wOiAwLFxuICAgIH0pOyB9KTtcbn1cbmZ1bmN0aW9uIGJ1aWxkQWJzb2x1dGVUb3BIYXNoKGNvbFBsYWNlbWVudHMpIHtcbiAgICB2YXIgdG9wc0J5SW5zdGFuY2VJZCA9IHt9O1xuICAgIGZvciAodmFyIF9pID0gMCwgY29sUGxhY2VtZW50c18xID0gY29sUGxhY2VtZW50czsgX2kgPCBjb2xQbGFjZW1lbnRzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBwbGFjZW1lbnRzID0gY29sUGxhY2VtZW50c18xW19pXTtcbiAgICAgICAgZm9yICh2YXIgX2EgPSAwLCBwbGFjZW1lbnRzXzEgPSBwbGFjZW1lbnRzOyBfYSA8IHBsYWNlbWVudHNfMS5sZW5ndGg7IF9hKyspIHtcbiAgICAgICAgICAgIHZhciBwbGFjZW1lbnQgPSBwbGFjZW1lbnRzXzFbX2FdO1xuICAgICAgICAgICAgdG9wc0J5SW5zdGFuY2VJZFtwbGFjZW1lbnQuc2VnLmV2ZW50UmFuZ2UuaW5zdGFuY2UuaW5zdGFuY2VJZF0gPSBwbGFjZW1lbnQuYWJzb2x1dGVUb3A7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvcHNCeUluc3RhbmNlSWQ7XG59XG5cbnZhciBUYWJsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVGFibGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGFibGUoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zcGxpdEJ1c2luZXNzSG91clNlZ3MgPSBjb21tb24ubWVtb2l6ZShzcGxpdFNlZ3NCeVJvdyk7XG4gICAgICAgIF90aGlzLnNwbGl0QmdFdmVudFNlZ3MgPSBjb21tb24ubWVtb2l6ZShzcGxpdFNlZ3NCeVJvdyk7XG4gICAgICAgIF90aGlzLnNwbGl0RmdFdmVudFNlZ3MgPSBjb21tb24ubWVtb2l6ZShzcGxpdFNlZ3NCeVJvdyk7XG4gICAgICAgIF90aGlzLnNwbGl0RGF0ZVNlbGVjdGlvblNlZ3MgPSBjb21tb24ubWVtb2l6ZShzcGxpdFNlZ3NCeVJvdyk7XG4gICAgICAgIF90aGlzLnNwbGl0RXZlbnREcmFnID0gY29tbW9uLm1lbW9pemUoc3BsaXRJbnRlcmFjdGlvbkJ5Um93KTtcbiAgICAgICAgX3RoaXMuc3BsaXRFdmVudFJlc2l6ZSA9IGNvbW1vbi5tZW1vaXplKHNwbGl0SW50ZXJhY3Rpb25CeVJvdyk7XG4gICAgICAgIF90aGlzLnJvd1JlZnMgPSBuZXcgY29tbW9uLlJlZk1hcCgpO1xuICAgICAgICBfdGhpcy5oYW5kbGVSb290RWwgPSBmdW5jdGlvbiAocm9vdEVsKSB7XG4gICAgICAgICAgICBfdGhpcy5yb290RWwgPSByb290RWw7XG4gICAgICAgICAgICBpZiAocm9vdEVsKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuY29udGV4dC5yZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50KF90aGlzLCB7XG4gICAgICAgICAgICAgICAgICAgIGVsOiByb290RWwsXG4gICAgICAgICAgICAgICAgICAgIGlzSGl0Q29tYm9BbGxvd2VkOiBfdGhpcy5wcm9wcy5pc0hpdENvbWJvQWxsb3dlZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIF90aGlzLmNvbnRleHQudW5yZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50KF90aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBUYWJsZS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgZGF0ZVByb2ZpbGUgPSBwcm9wcy5kYXRlUHJvZmlsZSwgZGF5TWF4RXZlbnRSb3dzID0gcHJvcHMuZGF5TWF4RXZlbnRSb3dzLCBkYXlNYXhFdmVudHMgPSBwcm9wcy5kYXlNYXhFdmVudHMsIGV4cGFuZFJvd3MgPSBwcm9wcy5leHBhbmRSb3dzO1xuICAgICAgICB2YXIgcm93Q250ID0gcHJvcHMuY2VsbHMubGVuZ3RoO1xuICAgICAgICB2YXIgYnVzaW5lc3NIb3VyU2Vnc0J5Um93ID0gdGhpcy5zcGxpdEJ1c2luZXNzSG91clNlZ3MocHJvcHMuYnVzaW5lc3NIb3VyU2Vncywgcm93Q250KTtcbiAgICAgICAgdmFyIGJnRXZlbnRTZWdzQnlSb3cgPSB0aGlzLnNwbGl0QmdFdmVudFNlZ3MocHJvcHMuYmdFdmVudFNlZ3MsIHJvd0NudCk7XG4gICAgICAgIHZhciBmZ0V2ZW50U2Vnc0J5Um93ID0gdGhpcy5zcGxpdEZnRXZlbnRTZWdzKHByb3BzLmZnRXZlbnRTZWdzLCByb3dDbnQpO1xuICAgICAgICB2YXIgZGF0ZVNlbGVjdGlvblNlZ3NCeVJvdyA9IHRoaXMuc3BsaXREYXRlU2VsZWN0aW9uU2Vncyhwcm9wcy5kYXRlU2VsZWN0aW9uU2Vncywgcm93Q250KTtcbiAgICAgICAgdmFyIGV2ZW50RHJhZ0J5Um93ID0gdGhpcy5zcGxpdEV2ZW50RHJhZyhwcm9wcy5ldmVudERyYWcsIHJvd0NudCk7XG4gICAgICAgIHZhciBldmVudFJlc2l6ZUJ5Um93ID0gdGhpcy5zcGxpdEV2ZW50UmVzaXplKHByb3BzLmV2ZW50UmVzaXplLCByb3dDbnQpO1xuICAgICAgICB2YXIgbGltaXRWaWFCYWxhbmNlZCA9IGRheU1heEV2ZW50cyA9PT0gdHJ1ZSB8fCBkYXlNYXhFdmVudFJvd3MgPT09IHRydWU7XG4gICAgICAgIC8vIGlmIHJvd3MgY2FuJ3QgZXhwYW5kIHRvIGZpbGwgZml4ZWQgaGVpZ2h0LCBjYW4ndCBkbyBiYWxhbmNlZC1oZWlnaHQgZXZlbnQgbGltaXRcbiAgICAgICAgLy8gVE9ETzogYmVzdCBwbGFjZSB0byBub3JtYWxpemUgdGhlc2Ugb3B0aW9ucz9cbiAgICAgICAgaWYgKGxpbWl0VmlhQmFsYW5jZWQgJiYgIWV4cGFuZFJvd3MpIHtcbiAgICAgICAgICAgIGxpbWl0VmlhQmFsYW5jZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGRheU1heEV2ZW50Um93cyA9IG51bGw7XG4gICAgICAgICAgICBkYXlNYXhFdmVudHMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjbGFzc05hbWVzID0gW1xuICAgICAgICAgICAgJ2ZjLWRheWdyaWQtYm9keScsXG4gICAgICAgICAgICBsaW1pdFZpYUJhbGFuY2VkID8gJ2ZjLWRheWdyaWQtYm9keS1iYWxhbmNlZCcgOiAnZmMtZGF5Z3JpZC1ib2R5LXVuYmFsYW5jZWQnLFxuICAgICAgICAgICAgZXhwYW5kUm93cyA/ICcnIDogJ2ZjLWRheWdyaWQtYm9keS1uYXR1cmFsJywgLy8gd2lsbCBoZWlnaHQgb2Ygb25lIHJvdyBkZXBlbmQgb24gdGhlIG90aGVycz9cbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy5qb2luKCcgJyksIHJlZjogdGhpcy5oYW5kbGVSb290RWwsIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgLy8gdGhlc2UgcHJvcHMgYXJlIGltcG9ydGFudCB0byBnaXZlIHRoaXMgd3JhcHBlciBjb3JyZWN0IGRpbWVuc2lvbnMgZm9yIGludGVyYWN0aW9uc1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IGlmIHdlIHNldCBpdCBoZXJlLCBjYW4gd2UgYXZvaWQgZ2l2aW5nIHRvIGlubmVyIHRhYmxlcz9cbiAgICAgICAgICAgICAgICB3aWR0aDogcHJvcHMuY2xpZW50V2lkdGgsXG4gICAgICAgICAgICAgICAgbWluV2lkdGg6IHByb3BzLnRhYmxlTWluV2lkdGgsXG4gICAgICAgICAgICB9IH0sXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uTm93VGltZXIsIHsgdW5pdDogXCJkYXlcIiB9LCBmdW5jdGlvbiAobm93RGF0ZSwgdG9kYXlSYW5nZSkgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInRhYmxlXCIsIHsgcm9sZTogXCJwcmVzZW50YXRpb25cIiwgY2xhc3NOYW1lOiBcImZjLXNjcm9sbGdyaWQtc3luYy10YWJsZVwiLCBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHByb3BzLmNsaWVudFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IHByb3BzLnRhYmxlTWluV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGV4cGFuZFJvd3MgPyBwcm9wcy5jbGllbnRIZWlnaHQgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgfSB9LFxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5jb2xHcm91cE5vZGUsXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGJvZHlcIiwgeyByb2xlOiBcInByZXNlbnRhdGlvblwiIH0sIHByb3BzLmNlbGxzLm1hcChmdW5jdGlvbiAoY2VsbHMsIHJvdykgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFRhYmxlUm93LCB7IHJlZjogX3RoaXMucm93UmVmcy5jcmVhdGVSZWYocm93KSwga2V5OiBjZWxscy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNlbGxzWzBdLmRhdGUudG9JU09TdHJpbmcoKSAvKiBiZXN0PyBvciBwdXQga2V5IG9uIGNlbGw/IG9yIHVzZSBkaWZmIGZvcm1hdHRlcj8gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJvdyAvLyBpbiBjYXNlIHRoZXJlIGFyZSBubyBjZWxscyAobGlrZSB3aGVuIHJlc291cmNlIHZpZXcgaXMgbG9hZGluZylcbiAgICAgICAgICAgICAgICAgICAgICAgICwgc2hvd0RheU51bWJlcnM6IHJvd0NudCA+IDEsIHNob3dXZWVrTnVtYmVyczogcHJvcHMuc2hvd1dlZWtOdW1iZXJzLCB0b2RheVJhbmdlOiB0b2RheVJhbmdlLCBkYXRlUHJvZmlsZTogZGF0ZVByb2ZpbGUsIGNlbGxzOiBjZWxscywgcmVuZGVySW50cm86IHByb3BzLnJlbmRlclJvd0ludHJvLCBidXNpbmVzc0hvdXJTZWdzOiBidXNpbmVzc0hvdXJTZWdzQnlSb3dbcm93XSwgZXZlbnRTZWxlY3Rpb246IHByb3BzLmV2ZW50U2VsZWN0aW9uLCBiZ0V2ZW50U2VnczogYmdFdmVudFNlZ3NCeVJvd1tyb3ddLmZpbHRlcihpc1NlZ0FsbERheSkgLyogaGFjayAqLywgZmdFdmVudFNlZ3M6IGZnRXZlbnRTZWdzQnlSb3dbcm93XSwgZGF0ZVNlbGVjdGlvblNlZ3M6IGRhdGVTZWxlY3Rpb25TZWdzQnlSb3dbcm93XSwgZXZlbnREcmFnOiBldmVudERyYWdCeVJvd1tyb3ddLCBldmVudFJlc2l6ZTogZXZlbnRSZXNpemVCeVJvd1tyb3ddLCBkYXlNYXhFdmVudHM6IGRheU1heEV2ZW50cywgZGF5TWF4RXZlbnRSb3dzOiBkYXlNYXhFdmVudFJvd3MsIGNsaWVudFdpZHRoOiBwcm9wcy5jbGllbnRXaWR0aCwgY2xpZW50SGVpZ2h0OiBwcm9wcy5jbGllbnRIZWlnaHQsIGZvclByaW50OiBwcm9wcy5mb3JQcmludCB9KSk7IH0pKSkpKTsgfSkpKTtcbiAgICB9O1xuICAgIC8vIEhpdCBTeXN0ZW1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgVGFibGUucHJvdG90eXBlLnByZXBhcmVIaXRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJvd1Bvc2l0aW9ucyA9IG5ldyBjb21tb24uUG9zaXRpb25DYWNoZSh0aGlzLnJvb3RFbCwgdGhpcy5yb3dSZWZzLmNvbGxlY3QoKS5tYXAoZnVuY3Rpb24gKHJvd09iaikgeyByZXR1cm4gcm93T2JqLmdldENlbGxFbHMoKVswXTsgfSksIC8vIGZpcnN0IGNlbGwgZWwgaW4gZWFjaCByb3cuIFRPRE86IG5vdCBvcHRpbWFsXG4gICAgICAgIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5jb2xQb3NpdGlvbnMgPSBuZXcgY29tbW9uLlBvc2l0aW9uQ2FjaGUodGhpcy5yb290RWwsIHRoaXMucm93UmVmcy5jdXJyZW50TWFwWzBdLmdldENlbGxFbHMoKSwgLy8gY2VsbCBlbHMgaW4gZmlyc3Qgcm93XG4gICAgICAgIHRydWUsIC8vIGhvcml6b250YWxcbiAgICAgICAgZmFsc2UpO1xuICAgIH07XG4gICAgVGFibGUucHJvdG90eXBlLnF1ZXJ5SGl0ID0gZnVuY3Rpb24gKHBvc2l0aW9uTGVmdCwgcG9zaXRpb25Ub3ApIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgY29sUG9zaXRpb25zID0gX2EuY29sUG9zaXRpb25zLCByb3dQb3NpdGlvbnMgPSBfYS5yb3dQb3NpdGlvbnM7XG4gICAgICAgIHZhciBjb2wgPSBjb2xQb3NpdGlvbnMubGVmdFRvSW5kZXgocG9zaXRpb25MZWZ0KTtcbiAgICAgICAgdmFyIHJvdyA9IHJvd1Bvc2l0aW9ucy50b3BUb0luZGV4KHBvc2l0aW9uVG9wKTtcbiAgICAgICAgaWYgKHJvdyAhPSBudWxsICYmIGNvbCAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgY2VsbCA9IHRoaXMucHJvcHMuY2VsbHNbcm93XVtjb2xdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRlUHJvZmlsZTogdGhpcy5wcm9wcy5kYXRlUHJvZmlsZSxcbiAgICAgICAgICAgICAgICBkYXRlU3BhbjogdHNsaWIuX19hc3NpZ24oeyByYW5nZTogdGhpcy5nZXRDZWxsUmFuZ2Uocm93LCBjb2wpLCBhbGxEYXk6IHRydWUgfSwgY2VsbC5leHRyYURhdGVTcGFuKSxcbiAgICAgICAgICAgICAgICBkYXlFbDogdGhpcy5nZXRDZWxsRWwocm93LCBjb2wpLFxuICAgICAgICAgICAgICAgIHJlY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogY29sUG9zaXRpb25zLmxlZnRzW2NvbF0sXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBjb2xQb3NpdGlvbnMucmlnaHRzW2NvbF0sXG4gICAgICAgICAgICAgICAgICAgIHRvcDogcm93UG9zaXRpb25zLnRvcHNbcm93XSxcbiAgICAgICAgICAgICAgICAgICAgYm90dG9tOiByb3dQb3NpdGlvbnMuYm90dG9tc1tyb3ddLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbGF5ZXI6IDAsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgVGFibGUucHJvdG90eXBlLmdldENlbGxFbCA9IGZ1bmN0aW9uIChyb3csIGNvbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dSZWZzLmN1cnJlbnRNYXBbcm93XS5nZXRDZWxsRWxzKClbY29sXTsgLy8gVE9ETzogbm90IG9wdGltYWxcbiAgICB9O1xuICAgIFRhYmxlLnByb3RvdHlwZS5nZXRDZWxsUmFuZ2UgPSBmdW5jdGlvbiAocm93LCBjb2wpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5wcm9wcy5jZWxsc1tyb3ddW2NvbF0uZGF0ZTtcbiAgICAgICAgdmFyIGVuZCA9IGNvbW1vbi5hZGREYXlzKHN0YXJ0LCAxKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9O1xuICAgIH07XG4gICAgcmV0dXJuIFRhYmxlO1xufShjb21tb24uRGF0ZUNvbXBvbmVudCkpO1xuZnVuY3Rpb24gaXNTZWdBbGxEYXkoc2VnKSB7XG4gICAgcmV0dXJuIHNlZy5ldmVudFJhbmdlLmRlZi5hbGxEYXk7XG59XG5cbnZhciBEYXlUYWJsZVNsaWNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoRGF5VGFibGVTbGljZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRGF5VGFibGVTbGljZXIoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5mb3JjZURheUlmTGlzdEl0ZW0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIERheVRhYmxlU2xpY2VyLnByb3RvdHlwZS5zbGljZVJhbmdlID0gZnVuY3Rpb24gKGRhdGVSYW5nZSwgZGF5VGFibGVNb2RlbCkge1xuICAgICAgICByZXR1cm4gZGF5VGFibGVNb2RlbC5zbGljZVJhbmdlKGRhdGVSYW5nZSk7XG4gICAgfTtcbiAgICByZXR1cm4gRGF5VGFibGVTbGljZXI7XG59KGNvbW1vbi5TbGljZXIpKTtcblxudmFyIERheVRhYmxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhEYXlUYWJsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEYXlUYWJsZSgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnNsaWNlciA9IG5ldyBEYXlUYWJsZVNsaWNlcigpO1xuICAgICAgICBfdGhpcy50YWJsZVJlZiA9IGNvbW1vbi5jcmVhdGVSZWYoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBEYXlUYWJsZS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBwcm9wcyA9IF9hLnByb3BzLCBjb250ZXh0ID0gX2EuY29udGV4dDtcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChUYWJsZSwgdHNsaWIuX19hc3NpZ24oeyByZWY6IHRoaXMudGFibGVSZWYgfSwgdGhpcy5zbGljZXIuc2xpY2VQcm9wcyhwcm9wcywgcHJvcHMuZGF0ZVByb2ZpbGUsIHByb3BzLm5leHREYXlUaHJlc2hvbGQsIGNvbnRleHQsIHByb3BzLmRheVRhYmxlTW9kZWwpLCB7IGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgY2VsbHM6IHByb3BzLmRheVRhYmxlTW9kZWwuY2VsbHMsIGNvbEdyb3VwTm9kZTogcHJvcHMuY29sR3JvdXBOb2RlLCB0YWJsZU1pbldpZHRoOiBwcm9wcy50YWJsZU1pbldpZHRoLCByZW5kZXJSb3dJbnRybzogcHJvcHMucmVuZGVyUm93SW50cm8sIGRheU1heEV2ZW50czogcHJvcHMuZGF5TWF4RXZlbnRzLCBkYXlNYXhFdmVudFJvd3M6IHByb3BzLmRheU1heEV2ZW50Um93cywgc2hvd1dlZWtOdW1iZXJzOiBwcm9wcy5zaG93V2Vla051bWJlcnMsIGV4cGFuZFJvd3M6IHByb3BzLmV4cGFuZFJvd3MsIGhlYWRlckFsaWduRWxSZWY6IHByb3BzLmhlYWRlckFsaWduRWxSZWYsIGNsaWVudFdpZHRoOiBwcm9wcy5jbGllbnRXaWR0aCwgY2xpZW50SGVpZ2h0OiBwcm9wcy5jbGllbnRIZWlnaHQsIGZvclByaW50OiBwcm9wcy5mb3JQcmludCB9KSkpO1xuICAgIH07XG4gICAgcmV0dXJuIERheVRhYmxlO1xufShjb21tb24uRGF0ZUNvbXBvbmVudCkpO1xuXG52YXIgRGF5VGFibGVWaWV3ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhEYXlUYWJsZVZpZXcsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRGF5VGFibGVWaWV3KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuYnVpbGREYXlUYWJsZU1vZGVsID0gY29tbW9uLm1lbW9pemUoYnVpbGREYXlUYWJsZU1vZGVsKTtcbiAgICAgICAgX3RoaXMuaGVhZGVyUmVmID0gY29tbW9uLmNyZWF0ZVJlZigpO1xuICAgICAgICBfdGhpcy50YWJsZVJlZiA9IGNvbW1vbi5jcmVhdGVSZWYoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBEYXlUYWJsZVZpZXcucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIF9hID0gdGhpcy5jb250ZXh0LCBvcHRpb25zID0gX2Eub3B0aW9ucywgZGF0ZVByb2ZpbGVHZW5lcmF0b3IgPSBfYS5kYXRlUHJvZmlsZUdlbmVyYXRvcjtcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgdmFyIGRheVRhYmxlTW9kZWwgPSB0aGlzLmJ1aWxkRGF5VGFibGVNb2RlbChwcm9wcy5kYXRlUHJvZmlsZSwgZGF0ZVByb2ZpbGVHZW5lcmF0b3IpO1xuICAgICAgICB2YXIgaGVhZGVyQ29udGVudCA9IG9wdGlvbnMuZGF5SGVhZGVycyAmJiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkRheUhlYWRlciwgeyByZWY6IHRoaXMuaGVhZGVyUmVmLCBkYXRlUHJvZmlsZTogcHJvcHMuZGF0ZVByb2ZpbGUsIGRhdGVzOiBkYXlUYWJsZU1vZGVsLmhlYWRlckRhdGVzLCBkYXRlc1JlcERpc3RpbmN0RGF5czogZGF5VGFibGVNb2RlbC5yb3dDbnQgPT09IDEgfSkpO1xuICAgICAgICB2YXIgYm9keUNvbnRlbnQgPSBmdW5jdGlvbiAoY29udGVudEFyZykgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KERheVRhYmxlLCB7IHJlZjogX3RoaXMudGFibGVSZWYsIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgZGF5VGFibGVNb2RlbDogZGF5VGFibGVNb2RlbCwgYnVzaW5lc3NIb3VyczogcHJvcHMuYnVzaW5lc3NIb3VycywgZGF0ZVNlbGVjdGlvbjogcHJvcHMuZGF0ZVNlbGVjdGlvbiwgZXZlbnRTdG9yZTogcHJvcHMuZXZlbnRTdG9yZSwgZXZlbnRVaUJhc2VzOiBwcm9wcy5ldmVudFVpQmFzZXMsIGV2ZW50U2VsZWN0aW9uOiBwcm9wcy5ldmVudFNlbGVjdGlvbiwgZXZlbnREcmFnOiBwcm9wcy5ldmVudERyYWcsIGV2ZW50UmVzaXplOiBwcm9wcy5ldmVudFJlc2l6ZSwgbmV4dERheVRocmVzaG9sZDogb3B0aW9ucy5uZXh0RGF5VGhyZXNob2xkLCBjb2xHcm91cE5vZGU6IGNvbnRlbnRBcmcudGFibGVDb2xHcm91cE5vZGUsIHRhYmxlTWluV2lkdGg6IGNvbnRlbnRBcmcudGFibGVNaW5XaWR0aCwgZGF5TWF4RXZlbnRzOiBvcHRpb25zLmRheU1heEV2ZW50cywgZGF5TWF4RXZlbnRSb3dzOiBvcHRpb25zLmRheU1heEV2ZW50Um93cywgc2hvd1dlZWtOdW1iZXJzOiBvcHRpb25zLndlZWtOdW1iZXJzLCBleHBhbmRSb3dzOiAhcHJvcHMuaXNIZWlnaHRBdXRvLCBoZWFkZXJBbGlnbkVsUmVmOiBfdGhpcy5oZWFkZXJFbFJlZiwgY2xpZW50V2lkdGg6IGNvbnRlbnRBcmcuY2xpZW50V2lkdGgsIGNsaWVudEhlaWdodDogY29udGVudEFyZy5jbGllbnRIZWlnaHQsIGZvclByaW50OiBwcm9wcy5mb3JQcmludCB9KSk7IH07XG4gICAgICAgIHJldHVybiBvcHRpb25zLmRheU1pbldpZHRoXG4gICAgICAgICAgICA/IHRoaXMucmVuZGVySFNjcm9sbExheW91dChoZWFkZXJDb250ZW50LCBib2R5Q29udGVudCwgZGF5VGFibGVNb2RlbC5jb2xDbnQsIG9wdGlvbnMuZGF5TWluV2lkdGgpXG4gICAgICAgICAgICA6IHRoaXMucmVuZGVyU2ltcGxlTGF5b3V0KGhlYWRlckNvbnRlbnQsIGJvZHlDb250ZW50KTtcbiAgICB9O1xuICAgIHJldHVybiBEYXlUYWJsZVZpZXc7XG59KFRhYmxlVmlldykpO1xuZnVuY3Rpb24gYnVpbGREYXlUYWJsZU1vZGVsKGRhdGVQcm9maWxlLCBkYXRlUHJvZmlsZUdlbmVyYXRvcikge1xuICAgIHZhciBkYXlTZXJpZXMgPSBuZXcgY29tbW9uLkRheVNlcmllc01vZGVsKGRhdGVQcm9maWxlLnJlbmRlclJhbmdlLCBkYXRlUHJvZmlsZUdlbmVyYXRvcik7XG4gICAgcmV0dXJuIG5ldyBjb21tb24uRGF5VGFibGVNb2RlbChkYXlTZXJpZXMsIC95ZWFyfG1vbnRofHdlZWsvLnRlc3QoZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlVW5pdCkpO1xufVxuXG52YXIgVGFibGVEYXRlUHJvZmlsZUdlbmVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVGFibGVEYXRlUHJvZmlsZUdlbmVyYXRvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUYWJsZURhdGVQcm9maWxlR2VuZXJhdG9yKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIC8vIENvbXB1dGVzIHRoZSBkYXRlIHJhbmdlIHRoYXQgd2lsbCBiZSByZW5kZXJlZC5cbiAgICBUYWJsZURhdGVQcm9maWxlR2VuZXJhdG9yLnByb3RvdHlwZS5idWlsZFJlbmRlclJhbmdlID0gZnVuY3Rpb24gKGN1cnJlbnRSYW5nZSwgY3VycmVudFJhbmdlVW5pdCwgaXNSYW5nZUFsbERheSkge1xuICAgICAgICB2YXIgZGF0ZUVudiA9IHRoaXMucHJvcHMuZGF0ZUVudjtcbiAgICAgICAgdmFyIHJlbmRlclJhbmdlID0gX3N1cGVyLnByb3RvdHlwZS5idWlsZFJlbmRlclJhbmdlLmNhbGwodGhpcywgY3VycmVudFJhbmdlLCBjdXJyZW50UmFuZ2VVbml0LCBpc1JhbmdlQWxsRGF5KTtcbiAgICAgICAgdmFyIHN0YXJ0ID0gcmVuZGVyUmFuZ2Uuc3RhcnQ7XG4gICAgICAgIHZhciBlbmQgPSByZW5kZXJSYW5nZS5lbmQ7XG4gICAgICAgIHZhciBlbmRPZldlZWs7XG4gICAgICAgIC8vIHllYXIgYW5kIG1vbnRoIHZpZXdzIHNob3VsZCBiZSBhbGlnbmVkIHdpdGggd2Vla3MuIHRoaXMgaXMgYWxyZWFkeSBkb25lIGZvciB3ZWVrXG4gICAgICAgIGlmICgvXih5ZWFyfG1vbnRoKSQvLnRlc3QoY3VycmVudFJhbmdlVW5pdCkpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gZGF0ZUVudi5zdGFydE9mV2VlayhzdGFydCk7XG4gICAgICAgICAgICAvLyBtYWtlIGVuZC1vZi13ZWVrIGlmIG5vdCBhbHJlYWR5XG4gICAgICAgICAgICBlbmRPZldlZWsgPSBkYXRlRW52LnN0YXJ0T2ZXZWVrKGVuZCk7XG4gICAgICAgICAgICBpZiAoZW5kT2ZXZWVrLnZhbHVlT2YoKSAhPT0gZW5kLnZhbHVlT2YoKSkge1xuICAgICAgICAgICAgICAgIGVuZCA9IGNvbW1vbi5hZGRXZWVrcyhlbmRPZldlZWssIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGVuc3VyZSA2IHdlZWtzXG4gICAgICAgIGlmICh0aGlzLnByb3BzLm1vbnRoTW9kZSAmJlxuICAgICAgICAgICAgdGhpcy5wcm9wcy5maXhlZFdlZWtDb3VudCkge1xuICAgICAgICAgICAgdmFyIHJvd0NudCA9IE1hdGguY2VpbCgvLyBjb3VsZCBiZSBwYXJ0aWFsIHdlZWtzIGR1ZSB0byBoaWRkZW5EYXlzXG4gICAgICAgICAgICBjb21tb24uZGlmZldlZWtzKHN0YXJ0LCBlbmQpKTtcbiAgICAgICAgICAgIGVuZCA9IGNvbW1vbi5hZGRXZWVrcyhlbmQsIDYgLSByb3dDbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQgfTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZURhdGVQcm9maWxlR2VuZXJhdG9yO1xufShjb21tb24uRGF0ZVByb2ZpbGVHZW5lcmF0b3IpKTtcblxudmFyIG1haW4gPSBjb21tb24uY3JlYXRlUGx1Z2luKHtcbiAgICBpbml0aWFsVmlldzogJ2RheUdyaWRNb250aCcsXG4gICAgdmlld3M6IHtcbiAgICAgICAgZGF5R3JpZDoge1xuICAgICAgICAgICAgY29tcG9uZW50OiBEYXlUYWJsZVZpZXcsXG4gICAgICAgICAgICBkYXRlUHJvZmlsZUdlbmVyYXRvckNsYXNzOiBUYWJsZURhdGVQcm9maWxlR2VuZXJhdG9yLFxuICAgICAgICB9LFxuICAgICAgICBkYXlHcmlkRGF5OiB7XG4gICAgICAgICAgICB0eXBlOiAnZGF5R3JpZCcsXG4gICAgICAgICAgICBkdXJhdGlvbjogeyBkYXlzOiAxIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGRheUdyaWRXZWVrOiB7XG4gICAgICAgICAgICB0eXBlOiAnZGF5R3JpZCcsXG4gICAgICAgICAgICBkdXJhdGlvbjogeyB3ZWVrczogMSB9LFxuICAgICAgICB9LFxuICAgICAgICBkYXlHcmlkTW9udGg6IHtcbiAgICAgICAgICAgIHR5cGU6ICdkYXlHcmlkJyxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB7IG1vbnRoczogMSB9LFxuICAgICAgICAgICAgbW9udGhNb2RlOiB0cnVlLFxuICAgICAgICAgICAgZml4ZWRXZWVrQ291bnQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbn0pO1xuXG5leHBvcnRzLkRheUdyaWRWaWV3ID0gRGF5VGFibGVWaWV3O1xuZXhwb3J0cy5EYXlUYWJsZSA9IERheVRhYmxlO1xuZXhwb3J0cy5EYXlUYWJsZVNsaWNlciA9IERheVRhYmxlU2xpY2VyO1xuZXhwb3J0cy5UYWJsZSA9IFRhYmxlO1xuZXhwb3J0cy5UYWJsZVZpZXcgPSBUYWJsZVZpZXc7XG5leHBvcnRzLmJ1aWxkRGF5VGFibGVNb2RlbCA9IGJ1aWxkRGF5VGFibGVNb2RlbDtcbmV4cG9ydHMuZGVmYXVsdCA9IG1haW47XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQUEsTUFBTSxDQUFDQyxjQUFQLENBQXNCQyxPQUF0QixFQUErQixZQUEvQixFQUE2QztFQUFFQyxLQUFLLEVBQUU7QUFBVCxDQUE3Qzs7QUFFQSxJQUFJQyxNQUFNLEdBQUdDLE9BQU8sQ0FBQyxzQkFBRCxDQUFwQjs7QUFDQSxJQUFJQyxLQUFLLEdBQUdELE9BQU8sQ0FBQyxPQUFELENBQW5COztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsSUFBSUUsU0FBUztBQUFHO0FBQWUsVUFBVUMsTUFBVixFQUFrQjtFQUM3Q0YsS0FBSyxDQUFDRyxTQUFOLENBQWdCRixTQUFoQixFQUEyQkMsTUFBM0I7O0VBQ0EsU0FBU0QsU0FBVCxHQUFxQjtJQUNqQixJQUFJRyxLQUFLLEdBQUdGLE1BQU0sS0FBSyxJQUFYLElBQW1CQSxNQUFNLENBQUNHLEtBQVAsQ0FBYSxJQUFiLEVBQW1CQyxTQUFuQixDQUFuQixJQUFvRCxJQUFoRTs7SUFDQUYsS0FBSyxDQUFDRyxXQUFOLEdBQW9CVCxNQUFNLENBQUNVLFNBQVAsRUFBcEI7SUFDQSxPQUFPSixLQUFQO0VBQ0g7O0VBQ0RILFNBQVMsQ0FBQ1EsU0FBVixDQUFvQkMsa0JBQXBCLEdBQXlDLFVBQVVDLGdCQUFWLEVBQTRCQyxXQUE1QixFQUF5QztJQUM5RSxJQUFJQyxFQUFFLEdBQUcsSUFBVDtJQUFBLElBQWVDLEtBQUssR0FBR0QsRUFBRSxDQUFDQyxLQUExQjtJQUFBLElBQWlDQyxPQUFPLEdBQUdGLEVBQUUsQ0FBQ0UsT0FBOUM7O0lBQ0EsSUFBSUMsUUFBUSxHQUFHLEVBQWY7SUFDQSxJQUFJQyxpQkFBaUIsR0FBR25CLE1BQU0sQ0FBQ29CLG9CQUFQLENBQTRCSCxPQUFPLENBQUNJLE9BQXBDLENBQXhCOztJQUNBLElBQUlSLGdCQUFKLEVBQXNCO01BQ2xCSyxRQUFRLENBQUNJLElBQVQsQ0FBYztRQUNWQyxJQUFJLEVBQUUsUUFESTtRQUVWQyxHQUFHLEVBQUUsUUFGSztRQUdWQyxRQUFRLEVBQUVOLGlCQUhBO1FBSVZPLEtBQUssRUFBRTtVQUNIQyxLQUFLLEVBQUUsS0FBS2xCLFdBRFQ7VUFFSG1CLGNBQWMsRUFBRSxlQUZiO1VBR0hDLFVBQVUsRUFBRWhCO1FBSFQ7TUFKRyxDQUFkO0lBVUg7O0lBQ0RLLFFBQVEsQ0FBQ0ksSUFBVCxDQUFjO01BQ1ZDLElBQUksRUFBRSxNQURJO01BRVZDLEdBQUcsRUFBRSxNQUZLO01BR1ZNLE1BQU0sRUFBRSxJQUhFO01BSVZKLEtBQUssRUFBRTtRQUFFSyxPQUFPLEVBQUVqQjtNQUFYO0lBSkcsQ0FBZDtJQU1BLE9BQVFkLE1BQU0sQ0FBQ2dDLGFBQVAsQ0FBcUJoQyxNQUFNLENBQUNpQyxRQUE1QixFQUFzQztNQUFFQyxRQUFRLEVBQUVqQixPQUFPLENBQUNpQjtJQUFwQixDQUF0QyxFQUFzRSxVQUFVQyxTQUFWLEVBQXFCQyxVQUFyQixFQUFpQztNQUFFLE9BQVFwQyxNQUFNLENBQUNnQyxhQUFQLENBQXFCLEtBQXJCLEVBQTRCO1FBQUVLLEdBQUcsRUFBRUYsU0FBUDtRQUFrQkcsU0FBUyxFQUFFLENBQUMsWUFBRCxFQUFlQyxNQUFmLENBQXNCSCxVQUF0QixFQUFrQ0ksSUFBbEMsQ0FBdUMsR0FBdkM7TUFBN0IsQ0FBNUIsRUFDckh4QyxNQUFNLENBQUNnQyxhQUFQLENBQXFCaEMsTUFBTSxDQUFDeUMsZ0JBQTVCLEVBQThDO1FBQUVYLE1BQU0sRUFBRSxDQUFDZCxLQUFLLENBQUMwQixZQUFQLElBQXVCLENBQUMxQixLQUFLLENBQUMyQixRQUF4QztRQUFrREMsZ0JBQWdCLEVBQUU1QixLQUFLLENBQUMyQixRQUExRTtRQUFvRkUsSUFBSSxFQUFFO1FBQUc7UUFBN0Y7UUFBeUgzQixRQUFRLEVBQUVBO01BQW5JLENBQTlDLENBRHFILENBQVI7SUFDb0YsQ0FEN0wsQ0FBUjtFQUVILENBeEJEOztFQXlCQWYsU0FBUyxDQUFDUSxTQUFWLENBQW9CbUMsbUJBQXBCLEdBQTBDLFVBQVVqQyxnQkFBVixFQUE0QkMsV0FBNUIsRUFBeUNpQyxNQUF6QyxFQUFpREMsV0FBakQsRUFBOEQ7SUFDcEcsSUFBSUMsVUFBVSxHQUFHLEtBQUtoQyxPQUFMLENBQWFpQyxXQUFiLENBQXlCQyxjQUExQzs7SUFDQSxJQUFJLENBQUNGLFVBQUwsRUFBaUI7TUFDYixNQUFNLElBQUlHLEtBQUosQ0FBVSw4QkFBVixDQUFOO0lBQ0g7O0lBQ0QsSUFBSXJDLEVBQUUsR0FBRyxJQUFUO0lBQUEsSUFBZUMsS0FBSyxHQUFHRCxFQUFFLENBQUNDLEtBQTFCO0lBQUEsSUFBaUNDLE9BQU8sR0FBR0YsRUFBRSxDQUFDRSxPQUE5Qzs7SUFDQSxJQUFJRSxpQkFBaUIsR0FBRyxDQUFDSCxLQUFLLENBQUMyQixRQUFQLElBQW1CM0MsTUFBTSxDQUFDb0Isb0JBQVAsQ0FBNEJILE9BQU8sQ0FBQ0ksT0FBcEMsQ0FBM0M7SUFDQSxJQUFJZ0MscUJBQXFCLEdBQUcsQ0FBQ3JDLEtBQUssQ0FBQzJCLFFBQVAsSUFBbUIzQyxNQUFNLENBQUNzRCx3QkFBUCxDQUFnQ3JDLE9BQU8sQ0FBQ0ksT0FBeEMsQ0FBL0M7SUFDQSxJQUFJSCxRQUFRLEdBQUcsRUFBZjs7SUFDQSxJQUFJTCxnQkFBSixFQUFzQjtNQUNsQkssUUFBUSxDQUFDSSxJQUFULENBQWM7UUFDVkMsSUFBSSxFQUFFLFFBREk7UUFFVkMsR0FBRyxFQUFFLFFBRks7UUFHVkMsUUFBUSxFQUFFTixpQkFIQTtRQUlWb0MsTUFBTSxFQUFFLENBQUM7VUFDRC9CLEdBQUcsRUFBRSxNQURKO1VBRURHLEtBQUssRUFBRSxLQUFLbEIsV0FGWDtVQUdEbUIsY0FBYyxFQUFFLGVBSGY7VUFJREMsVUFBVSxFQUFFaEI7UUFKWCxDQUFEO01BSkUsQ0FBZDtJQVdIOztJQUNESyxRQUFRLENBQUNJLElBQVQsQ0FBYztNQUNWQyxJQUFJLEVBQUUsTUFESTtNQUVWQyxHQUFHLEVBQUUsTUFGSztNQUdWTSxNQUFNLEVBQUUsSUFIRTtNQUlWeUIsTUFBTSxFQUFFLENBQUM7UUFDRC9CLEdBQUcsRUFBRSxNQURKO1FBRURPLE9BQU8sRUFBRWpCO01BRlIsQ0FBRDtJQUpFLENBQWQ7O0lBU0EsSUFBSXVDLHFCQUFKLEVBQTJCO01BQ3ZCbkMsUUFBUSxDQUFDSSxJQUFULENBQWM7UUFDVkMsSUFBSSxFQUFFLFFBREk7UUFFVkMsR0FBRyxFQUFFLFFBRks7UUFHVkMsUUFBUSxFQUFFLElBSEE7UUFJVjhCLE1BQU0sRUFBRSxDQUFDO1VBQ0QvQixHQUFHLEVBQUUsTUFESjtVQUVETyxPQUFPLEVBQUUvQixNQUFNLENBQUN3RDtRQUZmLENBQUQ7TUFKRSxDQUFkO0lBU0g7O0lBQ0QsT0FBUXhELE1BQU0sQ0FBQ2dDLGFBQVAsQ0FBcUJoQyxNQUFNLENBQUNpQyxRQUE1QixFQUFzQztNQUFFQyxRQUFRLEVBQUVqQixPQUFPLENBQUNpQjtJQUFwQixDQUF0QyxFQUFzRSxVQUFVQyxTQUFWLEVBQXFCQyxVQUFyQixFQUFpQztNQUFFLE9BQVFwQyxNQUFNLENBQUNnQyxhQUFQLENBQXFCLEtBQXJCLEVBQTRCO1FBQUVLLEdBQUcsRUFBRUYsU0FBUDtRQUFrQkcsU0FBUyxFQUFFLENBQUMsWUFBRCxFQUFlQyxNQUFmLENBQXNCSCxVQUF0QixFQUFrQ0ksSUFBbEMsQ0FBdUMsR0FBdkM7TUFBN0IsQ0FBNUIsRUFDckh4QyxNQUFNLENBQUNnQyxhQUFQLENBQXFCaUIsVUFBckIsRUFBaUM7UUFBRW5CLE1BQU0sRUFBRSxDQUFDZCxLQUFLLENBQUMwQixZQUFQLElBQXVCLENBQUMxQixLQUFLLENBQUMyQixRQUF4QztRQUFrREMsZ0JBQWdCLEVBQUU1QixLQUFLLENBQUMyQixRQUExRTtRQUFvRmMsU0FBUyxFQUFFLENBQUM7VUFBRVosSUFBSSxFQUFFLENBQUM7WUFBRWEsSUFBSSxFQUFFWCxNQUFSO1lBQWdCWSxRQUFRLEVBQUVYO1VBQTFCLENBQUQ7UUFBUixDQUFELENBQS9GO1FBQXNKOUIsUUFBUSxFQUFFQTtNQUFoSyxDQUFqQyxDQURxSCxDQUFSO0lBQ29HLENBRDdNLENBQVI7RUFFSCxDQTVDRDs7RUE2Q0EsT0FBT2YsU0FBUDtBQUNILENBOUU4QixDQThFN0JILE1BQU0sQ0FBQzRELGFBOUVzQixDQUEvQjs7QUFnRkEsU0FBU0MsY0FBVCxDQUF3QkMsSUFBeEIsRUFBOEJDLE1BQTlCLEVBQXNDO0VBQ2xDLElBQUlDLEtBQUssR0FBRyxFQUFaOztFQUNBLEtBQUssSUFBSUMsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR0YsTUFBcEIsRUFBNEJFLENBQUMsSUFBSSxDQUFqQyxFQUFvQztJQUNoQ0QsS0FBSyxDQUFDQyxDQUFELENBQUwsR0FBVyxFQUFYO0VBQ0g7O0VBQ0QsS0FBSyxJQUFJQyxFQUFFLEdBQUcsQ0FBVCxFQUFZQyxNQUFNLEdBQUdMLElBQTFCLEVBQWdDSSxFQUFFLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBNUMsRUFBb0RGLEVBQUUsRUFBdEQsRUFBMEQ7SUFDdEQsSUFBSUcsR0FBRyxHQUFHRixNQUFNLENBQUNELEVBQUQsQ0FBaEI7SUFDQUYsS0FBSyxDQUFDSyxHQUFHLENBQUNDLEdBQUwsQ0FBTCxDQUFlaEQsSUFBZixDQUFvQitDLEdBQXBCO0VBQ0g7O0VBQ0QsT0FBT0wsS0FBUDtBQUNIOztBQUNELFNBQVNPLG1CQUFULENBQTZCVCxJQUE3QixFQUFtQ2YsTUFBbkMsRUFBMkM7RUFDdkMsSUFBSXlCLEtBQUssR0FBRyxFQUFaOztFQUNBLEtBQUssSUFBSVAsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR2xCLE1BQXBCLEVBQTRCa0IsQ0FBQyxJQUFJLENBQWpDLEVBQW9DO0lBQ2hDTyxLQUFLLENBQUNQLENBQUQsQ0FBTCxHQUFXLEVBQVg7RUFDSDs7RUFDRCxLQUFLLElBQUlDLEVBQUUsR0FBRyxDQUFULEVBQVlPLE1BQU0sR0FBR1gsSUFBMUIsRUFBZ0NJLEVBQUUsR0FBR08sTUFBTSxDQUFDTCxNQUE1QyxFQUFvREYsRUFBRSxFQUF0RCxFQUEwRDtJQUN0RCxJQUFJRyxHQUFHLEdBQUdJLE1BQU0sQ0FBQ1AsRUFBRCxDQUFoQjtJQUNBTSxLQUFLLENBQUNILEdBQUcsQ0FBQ0ssUUFBTCxDQUFMLENBQW9CcEQsSUFBcEIsQ0FBeUIrQyxHQUF6QjtFQUNIOztFQUNELE9BQU9HLEtBQVA7QUFDSDs7QUFDRCxTQUFTRyxxQkFBVCxDQUErQkMsRUFBL0IsRUFBbUNiLE1BQW5DLEVBQTJDO0VBQ3ZDLElBQUlDLEtBQUssR0FBRyxFQUFaOztFQUNBLElBQUksQ0FBQ1ksRUFBTCxFQUFTO0lBQ0wsS0FBSyxJQUFJWCxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHRixNQUFwQixFQUE0QkUsQ0FBQyxJQUFJLENBQWpDLEVBQW9DO01BQ2hDRCxLQUFLLENBQUNDLENBQUQsQ0FBTCxHQUFXLElBQVg7SUFDSDtFQUNKLENBSkQsTUFLSztJQUNELEtBQUssSUFBSUEsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR0YsTUFBcEIsRUFBNEJFLENBQUMsSUFBSSxDQUFqQyxFQUFvQztNQUNoQ0QsS0FBSyxDQUFDQyxDQUFELENBQUwsR0FBVztRQUNQWSxpQkFBaUIsRUFBRUQsRUFBRSxDQUFDQyxpQkFEZjtRQUVQQyxPQUFPLEVBQUVGLEVBQUUsQ0FBQ0UsT0FGTDtRQUdQaEIsSUFBSSxFQUFFO01BSEMsQ0FBWDtJQUtIOztJQUNELEtBQUssSUFBSUksRUFBRSxHQUFHLENBQVQsRUFBWW5ELEVBQUUsR0FBRzZELEVBQUUsQ0FBQ2QsSUFBekIsRUFBK0JJLEVBQUUsR0FBR25ELEVBQUUsQ0FBQ3FELE1BQXZDLEVBQStDRixFQUFFLEVBQWpELEVBQXFEO01BQ2pELElBQUlHLEdBQUcsR0FBR3RELEVBQUUsQ0FBQ21ELEVBQUQsQ0FBWjtNQUNBRixLQUFLLENBQUNLLEdBQUcsQ0FBQ0MsR0FBTCxDQUFMLENBQWVSLElBQWYsQ0FBb0J4QyxJQUFwQixDQUF5QitDLEdBQXpCO0lBQ0g7RUFDSjs7RUFDRCxPQUFPTCxLQUFQO0FBQ0g7O0FBRUQsSUFBSWUsWUFBWTtBQUFHO0FBQWUsVUFBVTNFLE1BQVYsRUFBa0I7RUFDaERGLEtBQUssQ0FBQ0csU0FBTixDQUFnQjBFLFlBQWhCLEVBQThCM0UsTUFBOUI7O0VBQ0EsU0FBUzJFLFlBQVQsR0FBd0I7SUFDcEIsT0FBTzNFLE1BQU0sS0FBSyxJQUFYLElBQW1CQSxNQUFNLENBQUNHLEtBQVAsQ0FBYSxJQUFiLEVBQW1CQyxTQUFuQixDQUFuQixJQUFvRCxJQUEzRDtFQUNIOztFQUNEdUUsWUFBWSxDQUFDcEUsU0FBYixDQUF1QnFFLE1BQXZCLEdBQWdDLFlBQVk7SUFDeEMsSUFBSWhFLEtBQUssR0FBRyxLQUFLQSxLQUFqQjtJQUNBLElBQUlpRSxZQUFZLEdBQUdqRixNQUFNLENBQUNrRixpQkFBUCxDQUF5QixLQUFLakUsT0FBOUIsRUFBdUNELEtBQUssQ0FBQ21FLElBQTdDLENBQW5CO0lBQ0EsT0FBUW5GLE1BQU0sQ0FBQ2dDLGFBQVAsQ0FBcUJoQyxNQUFNLENBQUNvRixjQUE1QixFQUE0QztNQUFFRCxJQUFJLEVBQUVuRSxLQUFLLENBQUNtRSxJQUFkO01BQW9CRSxXQUFXLEVBQUVyRSxLQUFLLENBQUNxRSxXQUF2QztNQUFvREMsVUFBVSxFQUFFdEUsS0FBSyxDQUFDc0UsVUFBdEU7TUFBa0ZDLGFBQWEsRUFBRXZFLEtBQUssQ0FBQ3VFLGFBQXZHO01BQXNIQyxjQUFjLEVBQUV4RSxLQUFLLENBQUN3RSxjQUE1STtNQUE0SkMsY0FBYyxFQUFFQztJQUE1SyxDQUE1QyxFQUEwTyxVQUFVQyxVQUFWLEVBQXNCQyxZQUF0QixFQUFvQztNQUFFLE9BQVEsQ0FBQ0EsWUFBWSxJQUFJNUUsS0FBSyxDQUFDNkUsV0FBdkIsS0FBd0M3RixNQUFNLENBQUNnQyxhQUFQLENBQXFCLEtBQXJCLEVBQTRCO1FBQUVNLFNBQVMsRUFBRSxvQkFBYjtRQUFtQ0QsR0FBRyxFQUFFc0Q7TUFBeEMsQ0FBNUIsRUFDcFUzRixNQUFNLENBQUNnQyxhQUFQLENBQXFCLEdBQXJCLEVBQTBCOUIsS0FBSyxDQUFDNEYsUUFBTixDQUFlO1FBQUVDLEVBQUUsRUFBRS9FLEtBQUssQ0FBQ2dGLFdBQVo7UUFBeUIxRCxTQUFTLEVBQUU7TUFBcEMsQ0FBZixFQUE4RTJDLFlBQTlFLENBQTFCLEVBQXVIVyxZQUFZLElBQUk1RixNQUFNLENBQUNnQyxhQUFQLENBQXFCaEMsTUFBTSxDQUFDaUcsUUFBNUIsRUFBc0MsSUFBdEMsRUFBNEMsTUFBNUMsQ0FBdkksQ0FEb1UsQ0FBaEQ7SUFDakYsQ0FEL0wsQ0FBUjtFQUVILENBTEQ7O0VBTUEsT0FBT2xCLFlBQVA7QUFDSCxDQVppQyxDQVloQy9FLE1BQU0sQ0FBQ2tHLGFBWnlCLENBQWxDOztBQWFBLFNBQVNSLGNBQVQsQ0FBd0IxRSxLQUF4QixFQUErQjtFQUMzQixPQUFPQSxLQUFLLENBQUNtRixhQUFiO0FBQ0g7O0FBRUQsSUFBSUMsK0JBQStCLEdBQUdwRyxNQUFNLENBQUNxRyxlQUFQLENBQXVCO0VBQ3pEQyxJQUFJLEVBQUUsU0FEbUQ7RUFFekRDLE1BQU0sRUFBRSxTQUZpRDtFQUd6REMsY0FBYyxFQUFFLElBSHlDO0VBSXpEQyxRQUFRLEVBQUU7QUFKK0MsQ0FBdkIsQ0FBdEM7O0FBTUEsU0FBU0Msa0JBQVQsQ0FBNEJyQyxHQUE1QixFQUFpQztFQUM3QixJQUFJc0MsT0FBTyxHQUFHdEMsR0FBRyxDQUFDdUMsVUFBSixDQUFlaEMsRUFBZixDQUFrQitCLE9BQWhDO0VBQ0EsT0FBT0EsT0FBTyxLQUFLLFdBQVosSUFBNEJBLE9BQU8sS0FBSyxNQUFaLElBQy9CLENBQUN0QyxHQUFHLENBQUN1QyxVQUFKLENBQWVDLEdBQWYsQ0FBbUJDLE1BRFcsSUFFL0J6QyxHQUFHLENBQUNLLFFBQUosS0FBaUJMLEdBQUcsQ0FBQzBDLE9BRlUsSUFFQztFQUNoQzFDLEdBQUcsQ0FBQzJDLE9BSDJCLElBR2hCO0VBQ2YzQyxHQUFHLENBQUM0QyxLQUpELENBSU87RUFKZDtBQU1IOztBQUVELElBQUlDLGVBQWU7QUFBRztBQUFlLFVBQVU5RyxNQUFWLEVBQWtCO0VBQ25ERixLQUFLLENBQUNHLFNBQU4sQ0FBZ0I2RyxlQUFoQixFQUFpQzlHLE1BQWpDOztFQUNBLFNBQVM4RyxlQUFULEdBQTJCO0lBQ3ZCLE9BQU85RyxNQUFNLEtBQUssSUFBWCxJQUFtQkEsTUFBTSxDQUFDRyxLQUFQLENBQWEsSUFBYixFQUFtQkMsU0FBbkIsQ0FBbkIsSUFBb0QsSUFBM0Q7RUFDSDs7RUFDRDBHLGVBQWUsQ0FBQ3ZHLFNBQWhCLENBQTBCcUUsTUFBMUIsR0FBbUMsWUFBWTtJQUMzQyxJQUFJaEUsS0FBSyxHQUFHLEtBQUtBLEtBQWpCO0lBQ0EsT0FBUWhCLE1BQU0sQ0FBQ2dDLGFBQVAsQ0FBcUJoQyxNQUFNLENBQUNtSCxhQUE1QixFQUEyQ2pILEtBQUssQ0FBQzRGLFFBQU4sQ0FBZSxFQUFmLEVBQW1COUUsS0FBbkIsRUFBMEI7TUFBRW9HLGVBQWUsRUFBRSxDQUFDLGtCQUFELEVBQXFCLHdCQUFyQixFQUErQyxZQUEvQyxDQUFuQjtNQUFpRkMsaUJBQWlCLEVBQUVqQiwrQkFBcEc7TUFBcUlrQixzQkFBc0IsRUFBRXRHLEtBQUssQ0FBQ3NHLHNCQUFuSztNQUEyTEMsZUFBZSxFQUFFLENBQUN2RyxLQUFLLENBQUNxRCxHQUFOLENBQVV1QyxVQUFWLENBQXFCQyxHQUFyQixDQUF5QkM7SUFBdE8sQ0FBMUIsQ0FBM0MsQ0FBUjtFQUNILENBSEQ7O0VBSUEsT0FBT0ksZUFBUDtBQUNILENBVm9DLENBVW5DbEgsTUFBTSxDQUFDa0csYUFWNEIsQ0FBckM7O0FBWUEsSUFBSXNCLGtCQUFrQjtBQUFHO0FBQWUsVUFBVXBILE1BQVYsRUFBa0I7RUFDdERGLEtBQUssQ0FBQ0csU0FBTixDQUFnQm1ILGtCQUFoQixFQUFvQ3BILE1BQXBDOztFQUNBLFNBQVNvSCxrQkFBVCxHQUE4QjtJQUMxQixPQUFPcEgsTUFBTSxLQUFLLElBQVgsSUFBbUJBLE1BQU0sQ0FBQ0csS0FBUCxDQUFhLElBQWIsRUFBbUJDLFNBQW5CLENBQW5CLElBQW9ELElBQTNEO0VBQ0g7O0VBQ0RnSCxrQkFBa0IsQ0FBQzdHLFNBQW5CLENBQTZCcUUsTUFBN0IsR0FBc0MsWUFBWTtJQUM5QyxJQUFJakUsRUFBRSxHQUFHLElBQVQ7SUFBQSxJQUFlQyxLQUFLLEdBQUdELEVBQUUsQ0FBQ0MsS0FBMUI7SUFBQSxJQUFpQ0MsT0FBTyxHQUFHRixFQUFFLENBQUNFLE9BQTlDOztJQUNBLElBQUl3RyxVQUFVLEdBQUd4RyxPQUFPLENBQUNJLE9BQVIsQ0FBZ0JxRyxlQUFoQixJQUFtQ3RCLCtCQUFwRDtJQUNBLElBQUl1QixRQUFRLEdBQUczSCxNQUFNLENBQUM0SCxnQkFBUCxDQUF3QjVHLEtBQUssQ0FBQ3FELEdBQTlCLEVBQW1Db0QsVUFBbkMsRUFBK0N4RyxPQUEvQyxFQUF3RCxJQUF4RCxFQUE4REQsS0FBSyxDQUFDc0csc0JBQXBFLENBQWY7SUFDQSxPQUFRdEgsTUFBTSxDQUFDZ0MsYUFBUCxDQUFxQmhDLE1BQU0sQ0FBQzZILFNBQTVCLEVBQXVDO01BQUV4RCxHQUFHLEVBQUVyRCxLQUFLLENBQUNxRCxHQUFiO01BQWtCc0QsUUFBUSxFQUFFQSxRQUE1QjtNQUFzQ2xDLGNBQWMsRUFBRXFDLGtCQUF0RDtNQUEwRUMsVUFBVSxFQUFFL0csS0FBSyxDQUFDK0csVUFBNUY7TUFBd0dDLFVBQVUsRUFBRSxLQUFwSDtNQUEySEMsZUFBZSxFQUFFLEtBQTVJO01BQW1KQyxVQUFVLEVBQUVsSCxLQUFLLENBQUNrSCxVQUFySztNQUFpTEMsTUFBTSxFQUFFbkgsS0FBSyxDQUFDbUgsTUFBL0w7TUFBdU1DLFFBQVEsRUFBRXBILEtBQUssQ0FBQ29ILFFBQXZOO01BQWlPQyxPQUFPLEVBQUVySCxLQUFLLENBQUNxSDtJQUFoUCxDQUF2QyxFQUFrUyxVQUFVbEcsU0FBVixFQUFxQkMsVUFBckIsRUFBaUN1RCxVQUFqQyxFQUE2Q0MsWUFBN0MsRUFBMkQ7TUFBRSxPQUFTO1FBQ2hYNUYsTUFBTSxDQUFDZ0MsYUFBUCxDQUFxQixHQUFyQixFQUEwQjlCLEtBQUssQ0FBQzRGLFFBQU4sQ0FBZTtVQUFFeEQsU0FBUyxFQUFFLENBQUMsa0JBQUQsRUFBcUIsc0JBQXJCLEVBQTZDQyxNQUE3QyxDQUFvREgsVUFBcEQsRUFBZ0VJLElBQWhFLENBQXFFLEdBQXJFLENBQWI7VUFBd0ZILEdBQUcsRUFBRUY7UUFBN0YsQ0FBZixFQUF5SG5DLE1BQU0sQ0FBQ3NJLGlCQUFQLENBQXlCdEgsS0FBSyxDQUFDcUQsR0FBL0IsRUFBb0NwRCxPQUFwQyxDQUF6SCxDQUExQixFQUFrTTJFLFlBQWxNO01BRHVXO0lBQ3BKLENBRDNNLENBQVI7RUFFSCxDQU5EOztFQU9BLE9BQU80QixrQkFBUDtBQUNILENBYnVDLENBYXRDeEgsTUFBTSxDQUFDa0csYUFiK0IsQ0FBeEM7O0FBY0EsU0FBUzRCLGtCQUFULENBQTRCUyxVQUE1QixFQUF3QztFQUNwQyxPQUFRdkksTUFBTSxDQUFDZ0MsYUFBUCxDQUFxQmhDLE1BQU0sQ0FBQ2lHLFFBQTVCLEVBQXNDLElBQXRDLEVBQ0pqRyxNQUFNLENBQUNnQyxhQUFQLENBQXFCLEtBQXJCLEVBQTRCO0lBQUVNLFNBQVMsRUFBRSxzQkFBYjtJQUFxQ2tHLEtBQUssRUFBRTtNQUFFQyxXQUFXLEVBQUVGLFVBQVUsQ0FBQ0UsV0FBWCxJQUEwQkYsVUFBVSxDQUFDRztJQUFwRDtFQUE1QyxDQUE1QixDQURJLEVBRUpILFVBQVUsQ0FBQ1osUUFBWCxJQUF3QjNILE1BQU0sQ0FBQ2dDLGFBQVAsQ0FBcUIsS0FBckIsRUFBNEI7SUFBRU0sU0FBUyxFQUFFO0VBQWIsQ0FBNUIsRUFBNERpRyxVQUFVLENBQUNaLFFBQXZFLENBRnBCLEVBR0ozSCxNQUFNLENBQUNnQyxhQUFQLENBQXFCLEtBQXJCLEVBQTRCO0lBQUVNLFNBQVMsRUFBRTtFQUFiLENBQTVCLEVBQTZEaUcsVUFBVSxDQUFDSSxLQUFYLENBQWlCQyxLQUFqQixJQUEwQjVJLE1BQU0sQ0FBQ2dDLGFBQVAsQ0FBcUJoQyxNQUFNLENBQUNpRyxRQUE1QixFQUFzQyxJQUF0QyxFQUE0QyxNQUE1QyxDQUF2RixDQUhJLENBQVI7QUFJSDs7QUFFRCxJQUFJNEMsaUJBQWlCO0FBQUc7QUFBZSxVQUFVekksTUFBVixFQUFrQjtFQUNyREYsS0FBSyxDQUFDRyxTQUFOLENBQWdCd0ksaUJBQWhCLEVBQW1DekksTUFBbkM7O0VBQ0EsU0FBU3lJLGlCQUFULEdBQTZCO0lBQ3pCLElBQUl2SSxLQUFLLEdBQUdGLE1BQU0sS0FBSyxJQUFYLElBQW1CQSxNQUFNLENBQUNHLEtBQVAsQ0FBYSxJQUFiLEVBQW1CQyxTQUFuQixDQUFuQixJQUFvRCxJQUFoRTs7SUFDQUYsS0FBSyxDQUFDd0ksV0FBTixHQUFvQjlJLE1BQU0sQ0FBQytJLE9BQVAsQ0FBZUQsV0FBZixDQUFwQjtJQUNBLE9BQU94SSxLQUFQO0VBQ0g7O0VBQ0R1SSxpQkFBaUIsQ0FBQ2xJLFNBQWxCLENBQTRCcUUsTUFBNUIsR0FBcUMsWUFBWTtJQUM3QyxJQUFJaEUsS0FBSyxHQUFHLEtBQUtBLEtBQWpCOztJQUNBLElBQUlELEVBQUUsR0FBRyxLQUFLK0gsV0FBTCxDQUFpQjlILEtBQUssQ0FBQ2dJLGdCQUF2QixDQUFUO0lBQUEsSUFBbURDLE9BQU8sR0FBR2xJLEVBQUUsQ0FBQ2tJLE9BQWhFO0lBQUEsSUFBeUVDLGFBQWEsR0FBR25JLEVBQUUsQ0FBQ21JLGFBQTVGOztJQUNBLE9BQVFsSixNQUFNLENBQUNnQyxhQUFQLENBQXFCaEMsTUFBTSxDQUFDbUosWUFBNUIsRUFBMEM7TUFBRTlELFdBQVcsRUFBRXJFLEtBQUssQ0FBQ3FFLFdBQXJCO01BQWtDQyxVQUFVLEVBQUV0RSxLQUFLLENBQUNzRSxVQUFwRDtNQUFnRThELFVBQVUsRUFBRXBJLEtBQUssQ0FBQ29JLFVBQWxGO01BQThGQyxPQUFPLEVBQUVySSxLQUFLLENBQUNxSSxPQUE3RztNQUFzSEosT0FBTyxFQUFFQSxPQUEvSDtNQUF3SUssVUFBVSxFQUFFSixhQUFwSjtNQUFtS0ssY0FBYyxFQUFFdkksS0FBSyxDQUFDdUksY0FBekw7TUFBeU1DLFlBQVksRUFBRXhJLEtBQUssQ0FBQ3dJLFlBQTdOO01BQTJPQyxhQUFhLEVBQUV6SSxLQUFLLENBQUN5SSxhQUFoUTtNQUErUUMsY0FBYyxFQUFFLDBCQUFZO1FBQ3JWLElBQUlDLGlCQUFpQixHQUFHLENBQUMzSSxLQUFLLENBQUM0SSxTQUFOLEdBQWtCNUksS0FBSyxDQUFDNEksU0FBTixDQUFnQi9FLGlCQUFsQyxHQUFzRCxJQUF2RCxNQUNuQjdELEtBQUssQ0FBQzZJLFdBQU4sR0FBb0I3SSxLQUFLLENBQUM2SSxXQUFOLENBQWtCaEYsaUJBQXRDLEdBQTBELElBRHZDLEtBRXBCLEVBRko7UUFHQSxPQUFRN0UsTUFBTSxDQUFDZ0MsYUFBUCxDQUFxQmhDLE1BQU0sQ0FBQ2lHLFFBQTVCLEVBQXNDLElBQXRDLEVBQTRDZ0QsT0FBTyxDQUFDYSxHQUFSLENBQVksVUFBVXpGLEdBQVYsRUFBZTtVQUMzRSxJQUFJMEYsVUFBVSxHQUFHMUYsR0FBRyxDQUFDdUMsVUFBSixDQUFlb0QsUUFBZixDQUF3QkQsVUFBekM7VUFDQSxPQUFRL0osTUFBTSxDQUFDZ0MsYUFBUCxDQUFxQixLQUFyQixFQUE0QjtZQUFFTSxTQUFTLEVBQUUsMEJBQWI7WUFBeUNkLEdBQUcsRUFBRXVJLFVBQTlDO1lBQTBEdkIsS0FBSyxFQUFFO2NBQzdGeUIsVUFBVSxFQUFFTixpQkFBaUIsQ0FBQ0ksVUFBRCxDQUFqQixHQUFnQyxRQUFoQyxHQUEyQztZQURzQztVQUFqRSxDQUE1QixFQUVDckQsa0JBQWtCLENBQUNyQyxHQUFELENBQWxCLEdBQTJCckUsTUFBTSxDQUFDZ0MsYUFBUCxDQUFxQndGLGtCQUFyQixFQUF5Q3RILEtBQUssQ0FBQzRGLFFBQU4sQ0FBZTtZQUFFekIsR0FBRyxFQUFFQSxHQUFQO1lBQVkwRCxVQUFVLEVBQUUsS0FBeEI7WUFBK0JHLFVBQVUsRUFBRTZCLFVBQVUsS0FBSy9JLEtBQUssQ0FBQ2tKLGNBQWhFO1lBQWdGNUMsc0JBQXNCLEVBQUU7VUFBeEcsQ0FBZixFQUFnSXRILE1BQU0sQ0FBQ21LLFVBQVAsQ0FBa0I5RixHQUFsQixFQUF1QnJELEtBQUssQ0FBQ3NFLFVBQTdCLENBQWhJLENBQXpDLENBQTNCLEdBQW1QdEYsTUFBTSxDQUFDZ0MsYUFBUCxDQUFxQmtGLGVBQXJCLEVBQXNDaEgsS0FBSyxDQUFDNEYsUUFBTixDQUFlO1lBQUV6QixHQUFHLEVBQUVBLEdBQVA7WUFBWTBELFVBQVUsRUFBRSxLQUF4QjtZQUErQkMsVUFBVSxFQUFFLEtBQTNDO1lBQWtEQyxlQUFlLEVBQUUsS0FBbkU7WUFBMEVDLFVBQVUsRUFBRTZCLFVBQVUsS0FBSy9JLEtBQUssQ0FBQ2tKLGNBQTNHO1lBQTJINUMsc0JBQXNCLEVBQUU7VUFBbkosQ0FBZixFQUEyS3RILE1BQU0sQ0FBQ21LLFVBQVAsQ0FBa0I5RixHQUFsQixFQUF1QnJELEtBQUssQ0FBQ3NFLFVBQTdCLENBQTNLLENBQXRDLENBRnBQLENBQVI7UUFHSCxDQUxtRCxDQUE1QyxDQUFSO01BTUg7SUFWNkMsQ0FBMUMsRUFVQyxVQUFVbkQsU0FBVixFQUFxQkMsVUFBckIsRUFBaUN1RCxVQUFqQyxFQUE2Q0MsWUFBN0MsRUFBMkR3RSxXQUEzRCxFQUF3RXhCLEtBQXhFLEVBQStFeUIsVUFBL0UsRUFBMkZDLFNBQTNGLEVBQXNHO01BQUUsT0FBUXRLLE1BQU0sQ0FBQ2dDLGFBQVAsQ0FBcUIsR0FBckIsRUFBMEI5QixLQUFLLENBQUM0RixRQUFOLENBQWU7UUFBRXpELEdBQUcsRUFBRUYsU0FBUDtRQUFrQkcsU0FBUyxFQUFFLENBQUMsc0JBQUQsRUFBeUJDLE1BQXpCLENBQWdDSCxVQUFoQyxFQUE0Q0ksSUFBNUMsQ0FBaUQsR0FBakQsQ0FBN0I7UUFBb0ZvRyxLQUFLLEVBQUVBLEtBQTNGO1FBQWtHLGlCQUFpQnlCLFVBQW5IO1FBQStILGlCQUFpQkM7TUFBaEosQ0FBZixFQUE0S3RLLE1BQU0sQ0FBQ3VLLG9CQUFQLENBQTRCSCxXQUE1QixDQUE1SyxDQUExQixFQUFpUHhFLFlBQWpQLENBQVI7SUFBMFEsQ0FWblgsQ0FBUjtFQVdILENBZEQ7O0VBZUEsT0FBT2lELGlCQUFQO0FBQ0gsQ0F2QnNDLENBdUJyQzdJLE1BQU0sQ0FBQ2tHLGFBdkI4QixDQUF2Qzs7QUF3QkEsU0FBUzRDLFdBQVQsQ0FBcUJFLGdCQUFyQixFQUF1QztFQUNuQyxJQUFJQyxPQUFPLEdBQUcsRUFBZDtFQUNBLElBQUlDLGFBQWEsR0FBRyxFQUFwQjs7RUFDQSxLQUFLLElBQUloRixFQUFFLEdBQUcsQ0FBVCxFQUFZc0csa0JBQWtCLEdBQUd4QixnQkFBdEMsRUFBd0Q5RSxFQUFFLEdBQUdzRyxrQkFBa0IsQ0FBQ3BHLE1BQWhGLEVBQXdGRixFQUFFLEVBQTFGLEVBQThGO0lBQzFGLElBQUl1RyxTQUFTLEdBQUdELGtCQUFrQixDQUFDdEcsRUFBRCxDQUFsQztJQUNBK0UsT0FBTyxDQUFDM0gsSUFBUixDQUFhbUosU0FBUyxDQUFDcEcsR0FBdkI7O0lBQ0EsSUFBSSxDQUFDb0csU0FBUyxDQUFDQyxTQUFmLEVBQTBCO01BQ3RCeEIsYUFBYSxDQUFDNUgsSUFBZCxDQUFtQm1KLFNBQVMsQ0FBQ3BHLEdBQTdCO0lBQ0g7RUFDSjs7RUFDRCxPQUFPO0lBQUU0RSxPQUFPLEVBQUVBLE9BQVg7SUFBb0JDLGFBQWEsRUFBRUE7RUFBbkMsQ0FBUDtBQUNIOztBQUVELElBQUl5Qix1QkFBdUIsR0FBRzNLLE1BQU0sQ0FBQ3FHLGVBQVAsQ0FBdUI7RUFBRXVFLElBQUksRUFBRTtBQUFSLENBQXZCLENBQTlCOztBQUNBLElBQUlDLFNBQVM7QUFBRztBQUFlLFVBQVV6SyxNQUFWLEVBQWtCO0VBQzdDRixLQUFLLENBQUNHLFNBQU4sQ0FBZ0J3SyxTQUFoQixFQUEyQnpLLE1BQTNCOztFQUNBLFNBQVN5SyxTQUFULEdBQXFCO0lBQ2pCLElBQUl2SyxLQUFLLEdBQUdGLE1BQU0sS0FBSyxJQUFYLElBQW1CQSxNQUFNLENBQUNHLEtBQVAsQ0FBYSxJQUFiLEVBQW1CQyxTQUFuQixDQUFuQixJQUFvRCxJQUFoRTs7SUFDQUYsS0FBSyxDQUFDNkIsU0FBTixHQUFrQm5DLE1BQU0sQ0FBQ1UsU0FBUCxFQUFsQjtJQUNBSixLQUFLLENBQUN3SyxLQUFOLEdBQWM7TUFDVjlFLFdBQVcsRUFBRWhHLE1BQU0sQ0FBQytLLGNBQVA7SUFESCxDQUFkOztJQUdBekssS0FBSyxDQUFDMEssWUFBTixHQUFxQixVQUFVQyxFQUFWLEVBQWM7TUFDL0JqTCxNQUFNLENBQUNrTCxNQUFQLENBQWM1SyxLQUFLLENBQUM2QixTQUFwQixFQUErQjhJLEVBQS9CO01BQ0FqTCxNQUFNLENBQUNrTCxNQUFQLENBQWM1SyxLQUFLLENBQUNVLEtBQU4sQ0FBWVcsS0FBMUIsRUFBaUNzSixFQUFqQztJQUNILENBSEQ7O0lBSUEsT0FBTzNLLEtBQVA7RUFDSDs7RUFDRHVLLFNBQVMsQ0FBQ2xLLFNBQVYsQ0FBb0JxRSxNQUFwQixHQUE2QixZQUFZO0lBQ3JDLElBQUlqRSxFQUFFLEdBQUcsSUFBVDtJQUFBLElBQWVFLE9BQU8sR0FBR0YsRUFBRSxDQUFDRSxPQUE1QjtJQUFBLElBQXFDRCxLQUFLLEdBQUdELEVBQUUsQ0FBQ0MsS0FBaEQ7SUFBQSxJQUF1RDhKLEtBQUssR0FBRy9KLEVBQUUsQ0FBQytKLEtBQWxFO0lBQUEsSUFBeUUzSSxTQUFTLEdBQUdwQixFQUFFLENBQUNvQixTQUF4Rjs7SUFDQSxJQUFJZ0QsSUFBSSxHQUFHbkUsS0FBSyxDQUFDbUUsSUFBakI7SUFBQSxJQUF1QkUsV0FBVyxHQUFHckUsS0FBSyxDQUFDcUUsV0FBM0M7SUFDQSxJQUFJSixZQUFZLEdBQUdqRixNQUFNLENBQUNrRixpQkFBUCxDQUF5QmpFLE9BQXpCLEVBQWtDa0UsSUFBbEMsRUFBd0MsTUFBeEMsQ0FBbkI7SUFDQSxPQUFRbkYsTUFBTSxDQUFDZ0MsYUFBUCxDQUFxQmhDLE1BQU0sQ0FBQ21MLFdBQTVCLEVBQXlDO01BQUVoRyxJQUFJLEVBQUVBLElBQVI7TUFBY0UsV0FBVyxFQUFFQSxXQUEzQjtNQUF3Q0MsVUFBVSxFQUFFdEUsS0FBSyxDQUFDc0UsVUFBMUQ7TUFBc0VDLGFBQWEsRUFBRXZFLEtBQUssQ0FBQ3VFLGFBQTNGO01BQTBHQyxjQUFjLEVBQUV4RSxLQUFLLENBQUN3RSxjQUFoSTtNQUFnSjdELEtBQUssRUFBRSxLQUFLcUo7SUFBNUosQ0FBekMsRUFBcU4sVUFBVUksUUFBVixFQUFvQkMsYUFBcEIsRUFBbUNDLGFBQW5DLEVBQWtEQyxVQUFsRCxFQUE4RDtNQUFFLE9BQVF2TCxNQUFNLENBQUNnQyxhQUFQLENBQXFCLElBQXJCLEVBQTJCOUIsS0FBSyxDQUFDNEYsUUFBTixDQUFlO1FBQUV6RCxHQUFHLEVBQUUrSSxRQUFQO1FBQWlCSSxJQUFJLEVBQUUsVUFBdkI7UUFBbUNsSixTQUFTLEVBQUUsQ0FBQyxnQkFBRCxFQUFtQkMsTUFBbkIsQ0FBMEI4SSxhQUExQixFQUF5Q3JLLEtBQUssQ0FBQ29HLGVBQU4sSUFBeUIsRUFBbEUsRUFBc0U1RSxJQUF0RSxDQUEyRSxHQUEzRTtNQUE5QyxDQUFmLEVBQWdKOEksYUFBaEosRUFBK0p0SyxLQUFLLENBQUN5SyxjQUFySyxFQUFzTHpLLEtBQUssQ0FBQ3VFLGFBQU4sR0FBc0I7UUFBRSxtQkFBbUJ1RixLQUFLLENBQUM5RTtNQUEzQixDQUF0QixHQUFpRSxFQUF2UCxDQUEzQixFQUNqU2hHLE1BQU0sQ0FBQ2dDLGFBQVAsQ0FBcUIsS0FBckIsRUFBNEI7UUFBRU0sU0FBUyxFQUFFLCtDQUFiO1FBQThERCxHQUFHLEVBQUVyQixLQUFLLENBQUMyRTtRQUFXOztNQUFwRixDQUE1QixFQUNJM0UsS0FBSyxDQUFDMEssY0FBTixJQUF5QjFMLE1BQU0sQ0FBQ2dDLGFBQVAsQ0FBcUJoQyxNQUFNLENBQUMyTCxjQUE1QixFQUE0QztRQUFFeEcsSUFBSSxFQUFFQSxJQUFSO1FBQWN5RyxhQUFhLEVBQUVqQjtNQUE3QixDQUE1QyxFQUFvRyxVQUFVa0IsU0FBVixFQUFxQkMsY0FBckIsRUFBcUNuRyxVQUFyQyxFQUFpREMsWUFBakQsRUFBK0Q7UUFBRSxPQUFRNUYsTUFBTSxDQUFDZ0MsYUFBUCxDQUFxQixHQUFyQixFQUEwQjlCLEtBQUssQ0FBQzRGLFFBQU4sQ0FBZTtVQUFFekQsR0FBRyxFQUFFd0osU0FBUDtVQUFrQnZKLFNBQVMsRUFBRSxDQUFDLHdCQUFELEVBQTJCQyxNQUEzQixDQUFrQ3VKLGNBQWxDLEVBQWtEdEosSUFBbEQsQ0FBdUQsR0FBdkQ7UUFBN0IsQ0FBZixFQUEyR3lDLFlBQTNHLENBQTFCLEVBQW9KVyxZQUFwSixDQUFSO01BQTZLLENBQWxWLENBRDdCLEVBRUksQ0FBQzJGLFVBQUQsSUFBZ0J2TCxNQUFNLENBQUNnQyxhQUFQLENBQXFCK0MsWUFBckIsRUFBbUM7UUFBRUksSUFBSSxFQUFFQSxJQUFSO1FBQWNFLFdBQVcsRUFBRUEsV0FBM0I7UUFBd0NFLGFBQWEsRUFBRXZFLEtBQUssQ0FBQ3VFLGFBQTdEO1FBQTRFUyxXQUFXLEVBQUU4RSxLQUFLLENBQUM5RSxXQUEvRjtRQUE0R0gsV0FBVyxFQUFFN0UsS0FBSyxDQUFDNkUsV0FBL0g7UUFBNElQLFVBQVUsRUFBRXRFLEtBQUssQ0FBQ3NFLFVBQTlKO1FBQTBLRSxjQUFjLEVBQUV4RSxLQUFLLENBQUN3RTtNQUFoTSxDQUFuQyxDQUZwQixFQUdJeEYsTUFBTSxDQUFDZ0MsYUFBUCxDQUFxQixLQUFyQixFQUE0QjtRQUFFTSxTQUFTLEVBQUUsdUJBQWI7UUFBc0NELEdBQUcsRUFBRXJCLEtBQUssQ0FBQytLO01BQWpELENBQTVCLEVBQ0kvSyxLQUFLLENBQUNnTCxTQURWLEVBRUloTSxNQUFNLENBQUNnQyxhQUFQLENBQXFCLEtBQXJCLEVBQTRCO1FBQUVNLFNBQVMsRUFBRSx1QkFBYjtRQUFzQ2tHLEtBQUssRUFBRTtVQUFFeUQsU0FBUyxFQUFFakwsS0FBSyxDQUFDa0w7UUFBbkI7TUFBN0MsQ0FBNUIsRUFDSWxNLE1BQU0sQ0FBQ2dDLGFBQVAsQ0FBcUI2RyxpQkFBckIsRUFBd0M7UUFBRU8sVUFBVSxFQUFFakUsSUFBZDtRQUFvQjZELGdCQUFnQixFQUFFaEksS0FBSyxDQUFDZ0ksZ0JBQTVDO1FBQThESyxPQUFPLEVBQUVySSxLQUFLLENBQUNxSSxPQUE3RTtRQUFzRkUsY0FBYyxFQUFFcEgsU0FBdEc7UUFBaUhxSCxZQUFZLEVBQUUsQ0FBQ3hJLEtBQUssQ0FBQ3VFLGFBQXRJO1FBQXFKa0UsYUFBYSxFQUFFekksS0FBSyxDQUFDeUksYUFBMUs7UUFBeUxwRSxXQUFXLEVBQUVyRSxLQUFLLENBQUNxRSxXQUE1TTtRQUF5TjZFLGNBQWMsRUFBRWxKLEtBQUssQ0FBQ2tKLGNBQS9PO1FBQStQTixTQUFTLEVBQUU1SSxLQUFLLENBQUM0SSxTQUFoUjtRQUEyUkMsV0FBVyxFQUFFN0ksS0FBSyxDQUFDNkksV0FBOVM7UUFBMlR2RSxVQUFVLEVBQUV0RSxLQUFLLENBQUNzRTtNQUE3VSxDQUF4QyxDQURKLENBRkosQ0FISixFQU9JdEYsTUFBTSxDQUFDZ0MsYUFBUCxDQUFxQixLQUFyQixFQUE0QjtRQUFFTSxTQUFTLEVBQUU7TUFBYixDQUE1QixFQUFnRXRCLEtBQUssQ0FBQ21MLFNBQXRFLENBUEosQ0FEaVMsQ0FBUjtJQVEvTCxDQVJ0RixDQUFSO0VBU0gsQ0FiRDs7RUFjQSxPQUFPdEIsU0FBUDtBQUNILENBN0I4QixDQTZCN0I3SyxNQUFNLENBQUM0RCxhQTdCc0IsQ0FBL0I7O0FBK0JBLFNBQVN3SSxxQkFBVCxDQUErQnRJLElBQS9CLEVBQXFDO0FBQ3JDdUksWUFEQSxFQUNjQyxlQURkLEVBQytCQyxXQUQvQixFQUM0Q0Msb0JBRDVDLEVBQ2tFQyxnQkFEbEUsRUFDb0ZDLEtBRHBGLEVBQzJGO0VBQ3ZGLElBQUlDLFNBQVMsR0FBRyxJQUFJQyxtQkFBSixFQUFoQjtFQUNBRCxTQUFTLENBQUNFLGNBQVYsR0FBMkIsSUFBM0I7RUFDQUYsU0FBUyxDQUFDSixXQUFWLEdBQXdCQSxXQUF4Qjs7RUFDQSxJQUFJRixZQUFZLEtBQUssSUFBakIsSUFBeUJDLGVBQWUsS0FBSyxJQUFqRCxFQUF1RDtJQUNuREssU0FBUyxDQUFDRyxRQUFWLEdBQXFCTCxnQkFBckI7SUFDQUUsU0FBUyxDQUFDSSxjQUFWLEdBQTJCLElBQTNCO0VBQ0gsQ0FIRCxNQUlLLElBQUksT0FBT1YsWUFBUCxLQUF3QixRQUE1QixFQUFzQztJQUN2Q00sU0FBUyxDQUFDSyxXQUFWLEdBQXdCWCxZQUF4QjtFQUNILENBRkksTUFHQSxJQUFJLE9BQU9DLGVBQVAsS0FBMkIsUUFBL0IsRUFBeUM7SUFDMUNLLFNBQVMsQ0FBQ0ssV0FBVixHQUF3QlYsZUFBeEI7SUFDQUssU0FBUyxDQUFDSSxjQUFWLEdBQTJCLElBQTNCO0VBQ0gsQ0Fkc0YsQ0FldkY7OztFQUNBLElBQUlFLFNBQVMsR0FBRyxFQUFoQjtFQUNBLElBQUlDLGlCQUFpQixHQUFHLEVBQXhCOztFQUNBLEtBQUssSUFBSWpKLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdILElBQUksQ0FBQ00sTUFBekIsRUFBaUNILENBQUMsSUFBSSxDQUF0QyxFQUF5QztJQUNyQyxJQUFJSSxHQUFHLEdBQUdQLElBQUksQ0FBQ0csQ0FBRCxDQUFkO0lBQ0EsSUFBSThGLFVBQVUsR0FBRzFGLEdBQUcsQ0FBQ3VDLFVBQUosQ0FBZW9ELFFBQWYsQ0FBd0JELFVBQXpDO0lBQ0EsSUFBSW9ELFdBQVcsR0FBR1gsb0JBQW9CLENBQUN6QyxVQUFELENBQXRDOztJQUNBLElBQUlvRCxXQUFXLElBQUksSUFBbkIsRUFBeUI7TUFDckJGLFNBQVMsQ0FBQzNMLElBQVYsQ0FBZTtRQUNYOEwsS0FBSyxFQUFFbkosQ0FESTtRQUVYb0osU0FBUyxFQUFFRixXQUZBO1FBR1h6SixJQUFJLEVBQUU7VUFDRjRKLEtBQUssRUFBRWpKLEdBQUcsQ0FBQ0ssUUFEVDtVQUVGNkksR0FBRyxFQUFFbEosR0FBRyxDQUFDMEMsT0FBSixHQUFjO1FBRmpCO01BSEssQ0FBZjtJQVFILENBVEQsTUFVSztNQUNEbUcsaUJBQWlCLENBQUM1TCxJQUFsQixDQUF1QitDLEdBQXZCO0lBQ0g7RUFDSjs7RUFDRCxJQUFJbUosYUFBYSxHQUFHYixTQUFTLENBQUNjLE9BQVYsQ0FBa0JSLFNBQWxCLENBQXBCO0VBQ0EsSUFBSVMsUUFBUSxHQUFHZixTQUFTLENBQUNnQixPQUFWLEVBQWY7O0VBQ0EsSUFBSTVNLEVBQUUsR0FBRzZNLFVBQVUsQ0FBQ0YsUUFBRCxFQUFXNUosSUFBWCxFQUFpQjRJLEtBQWpCLENBQW5CO0VBQUEsSUFBNENtQixtQkFBbUIsR0FBRzlNLEVBQUUsQ0FBQzhNLG1CQUFyRTtFQUFBLElBQTBGQyxrQkFBa0IsR0FBRy9NLEVBQUUsQ0FBQytNLGtCQUFsSDtFQUFBLElBQXNJQyxlQUFlLEdBQUdoTixFQUFFLENBQUNnTixlQUEzSjs7RUFDQSxJQUFJQyxRQUFRLEdBQUcsRUFBZjtFQUNBLElBQUlDLGNBQWMsR0FBRyxFQUFyQixDQXhDdUYsQ0F5Q3ZGOztFQUNBLEtBQUssSUFBSS9KLEVBQUUsR0FBRyxDQUFULEVBQVlnSyxtQkFBbUIsR0FBR2hCLGlCQUF2QyxFQUEwRGhKLEVBQUUsR0FBR2dLLG1CQUFtQixDQUFDOUosTUFBbkYsRUFBMkZGLEVBQUUsRUFBN0YsRUFBaUc7SUFDN0YsSUFBSUcsR0FBRyxHQUFHNkosbUJBQW1CLENBQUNoSyxFQUFELENBQTdCO0lBQ0E0SixrQkFBa0IsQ0FBQ3pKLEdBQUcsQ0FBQ0ssUUFBTCxDQUFsQixDQUFpQ3BELElBQWpDLENBQXNDO01BQ2xDK0MsR0FBRyxFQUFFQSxHQUQ2QjtNQUVsQ3FHLFNBQVMsRUFBRSxLQUZ1QjtNQUdsQ3lELFVBQVUsRUFBRSxJQUhzQjtNQUlsQ0MsV0FBVyxFQUFFLENBSnFCO01BS2xDbkMsU0FBUyxFQUFFO0lBTHVCLENBQXRDOztJQU9BLEtBQUssSUFBSW9DLEdBQUcsR0FBR2hLLEdBQUcsQ0FBQ0ssUUFBbkIsRUFBNkIySixHQUFHLElBQUloSyxHQUFHLENBQUMwQyxPQUF4QyxFQUFpRHNILEdBQUcsSUFBSSxDQUF4RCxFQUEyRDtNQUN2RFIsbUJBQW1CLENBQUNRLEdBQUQsQ0FBbkIsQ0FBeUIvTSxJQUF6QixDQUE4QjtRQUMxQitDLEdBQUcsRUFBRWlLLFVBQVUsQ0FBQ2pLLEdBQUQsRUFBTWdLLEdBQU4sRUFBV0EsR0FBRyxHQUFHLENBQWpCLEVBQW9CM0IsS0FBcEIsQ0FEVztRQUUxQmhDLFNBQVMsRUFBRSxLQUZlO1FBRzFCeUQsVUFBVSxFQUFFLEtBSGM7UUFJMUJDLFdBQVcsRUFBRSxDQUphO1FBSzFCbkMsU0FBUyxFQUFFO01BTGUsQ0FBOUI7SUFPSDtFQUNKLENBNURzRixDQTZEdkY7OztFQUNBLEtBQUssSUFBSW9DLEdBQUcsR0FBRyxDQUFmLEVBQWtCQSxHQUFHLEdBQUczQixLQUFLLENBQUN0SSxNQUE5QixFQUFzQ2lLLEdBQUcsSUFBSSxDQUE3QyxFQUFnRDtJQUM1Q0wsUUFBUSxDQUFDMU0sSUFBVCxDQUFjLENBQWQ7RUFDSDs7RUFDRCxLQUFLLElBQUlpTixFQUFFLEdBQUcsQ0FBVCxFQUFZQyxlQUFlLEdBQUdoQixhQUFuQyxFQUFrRGUsRUFBRSxHQUFHQyxlQUFlLENBQUNwSyxNQUF2RSxFQUErRW1LLEVBQUUsRUFBakYsRUFBcUY7SUFDakYsSUFBSUUsV0FBVyxHQUFHRCxlQUFlLENBQUNELEVBQUQsQ0FBakM7SUFDQSxJQUFJbEssR0FBRyxHQUFHUCxJQUFJLENBQUMySyxXQUFXLENBQUNyQixLQUFiLENBQWQ7SUFDQSxJQUFJc0IsVUFBVSxHQUFHRCxXQUFXLENBQUMvSyxJQUE3QjtJQUNBb0ssa0JBQWtCLENBQUNZLFVBQVUsQ0FBQ3BCLEtBQVosQ0FBbEIsQ0FBcUNoTSxJQUFyQyxDQUEwQztNQUN0QytDLEdBQUcsRUFBRWlLLFVBQVUsQ0FBQ2pLLEdBQUQsRUFBTXFLLFVBQVUsQ0FBQ3BCLEtBQWpCLEVBQXdCb0IsVUFBVSxDQUFDbkIsR0FBbkMsRUFBd0NiLEtBQXhDLENBRHVCO01BRXRDaEMsU0FBUyxFQUFFLEtBRjJCO01BR3RDeUQsVUFBVSxFQUFFLElBSDBCO01BSXRDQyxXQUFXLEVBQUUsQ0FKeUI7TUFLdENuQyxTQUFTLEVBQUU7SUFMMkIsQ0FBMUM7O0lBT0EsS0FBSyxJQUFJb0MsR0FBRyxHQUFHSyxVQUFVLENBQUNwQixLQUExQixFQUFpQ2UsR0FBRyxHQUFHSyxVQUFVLENBQUNuQixHQUFsRCxFQUF1RGMsR0FBRyxJQUFJLENBQTlELEVBQWlFO01BQzdETCxRQUFRLENBQUNLLEdBQUQsQ0FBUixJQUFpQixDQUFqQjtNQUNBUixtQkFBbUIsQ0FBQ1EsR0FBRCxDQUFuQixDQUF5Qi9NLElBQXpCLENBQThCO1FBQzFCK0MsR0FBRyxFQUFFaUssVUFBVSxDQUFDakssR0FBRCxFQUFNZ0ssR0FBTixFQUFXQSxHQUFHLEdBQUcsQ0FBakIsRUFBb0IzQixLQUFwQixDQURXO1FBRTFCaEMsU0FBUyxFQUFFLEtBRmU7UUFHMUJ5RCxVQUFVLEVBQUUsS0FIYztRQUkxQkMsV0FBVyxFQUFFLENBSmE7UUFLMUJuQyxTQUFTLEVBQUU7TUFMZSxDQUE5QjtJQU9IO0VBQ0osQ0F0RnNGLENBdUZ2Rjs7O0VBQ0EsS0FBSyxJQUFJb0MsR0FBRyxHQUFHLENBQWYsRUFBa0JBLEdBQUcsR0FBRzNCLEtBQUssQ0FBQ3RJLE1BQTlCLEVBQXNDaUssR0FBRyxJQUFJLENBQTdDLEVBQWdEO0lBQzVDSixjQUFjLENBQUMzTSxJQUFmLENBQW9CeU0sZUFBZSxDQUFDTSxHQUFELENBQW5DO0VBQ0g7O0VBQ0QsT0FBTztJQUFFUixtQkFBbUIsRUFBRUEsbUJBQXZCO0lBQTRDQyxrQkFBa0IsRUFBRUEsa0JBQWhFO0lBQW9GRSxRQUFRLEVBQUVBLFFBQTlGO0lBQXdHQyxjQUFjLEVBQUVBO0VBQXhILENBQVA7QUFDSCxDLENBQ0Q7OztBQUNBLFNBQVNMLFVBQVQsQ0FBb0JlLFFBQXBCLEVBQThCN0ssSUFBOUIsRUFBb0M0SSxLQUFwQyxFQUEyQztFQUN2QyxJQUFJa0MsY0FBYyxHQUFHQyxtQkFBbUIsQ0FBQ0YsUUFBRCxFQUFXakMsS0FBSyxDQUFDdEksTUFBakIsQ0FBeEM7RUFDQSxJQUFJeUosbUJBQW1CLEdBQUcsRUFBMUI7RUFDQSxJQUFJQyxrQkFBa0IsR0FBRyxFQUF6QjtFQUNBLElBQUlDLGVBQWUsR0FBRyxFQUF0Qjs7RUFDQSxLQUFLLElBQUlNLEdBQUcsR0FBRyxDQUFmLEVBQWtCQSxHQUFHLEdBQUczQixLQUFLLENBQUN0SSxNQUE5QixFQUFzQ2lLLEdBQUcsSUFBSSxDQUE3QyxFQUFnRDtJQUM1QyxJQUFJUyxLQUFLLEdBQUdGLGNBQWMsQ0FBQ1AsR0FBRCxDQUExQixDQUQ0QyxDQUU1Qzs7SUFDQSxJQUFJckYsZ0JBQWdCLEdBQUcsRUFBdkI7SUFDQSxJQUFJK0YsYUFBYSxHQUFHLENBQXBCO0lBQ0EsSUFBSUMsZ0JBQWdCLEdBQUcsQ0FBdkI7O0lBQ0EsS0FBSyxJQUFJOUssRUFBRSxHQUFHLENBQVQsRUFBWStLLE9BQU8sR0FBR0gsS0FBM0IsRUFBa0M1SyxFQUFFLEdBQUcrSyxPQUFPLENBQUM3SyxNQUEvQyxFQUF1REYsRUFBRSxFQUF6RCxFQUE2RDtNQUN6RCxJQUFJZ0wsSUFBSSxHQUFHRCxPQUFPLENBQUMvSyxFQUFELENBQWxCO01BQ0EsSUFBSUcsR0FBRyxHQUFHUCxJQUFJLENBQUNvTCxJQUFJLENBQUM5QixLQUFOLENBQWQ7TUFDQXBFLGdCQUFnQixDQUFDMUgsSUFBakIsQ0FBc0I7UUFDbEIrQyxHQUFHLEVBQUVpSyxVQUFVLENBQUNqSyxHQUFELEVBQU1nSyxHQUFOLEVBQVdBLEdBQUcsR0FBRyxDQUFqQixFQUFvQjNCLEtBQXBCLENBREc7UUFFbEJoQyxTQUFTLEVBQUUsSUFGTztRQUdsQnlELFVBQVUsRUFBRSxLQUhNO1FBSWxCQyxXQUFXLEVBQUVjLElBQUksQ0FBQ0MsVUFKQTtRQUtsQmxELFNBQVMsRUFBRWlELElBQUksQ0FBQ0MsVUFBTCxHQUFrQko7TUFMWCxDQUF0QjtNQU9BQSxhQUFhLEdBQUdHLElBQUksQ0FBQ0MsVUFBTCxHQUFrQkQsSUFBSSxDQUFDN0IsU0FBdkM7SUFDSCxDQWpCMkMsQ0FrQjVDOzs7SUFDQSxJQUFJK0IsZUFBZSxHQUFHLEVBQXRCO0lBQ0FMLGFBQWEsR0FBRyxDQUFoQjtJQUNBQyxnQkFBZ0IsR0FBRyxDQUFuQjs7SUFDQSxLQUFLLElBQUlqTyxFQUFFLEdBQUcsQ0FBVCxFQUFZc08sT0FBTyxHQUFHUCxLQUEzQixFQUFrQy9OLEVBQUUsR0FBR3NPLE9BQU8sQ0FBQ2pMLE1BQS9DLEVBQXVEckQsRUFBRSxFQUF6RCxFQUE2RDtNQUN6RCxJQUFJbU8sSUFBSSxHQUFHRyxPQUFPLENBQUN0TyxFQUFELENBQWxCO01BQ0EsSUFBSXNELEdBQUcsR0FBR1AsSUFBSSxDQUFDb0wsSUFBSSxDQUFDOUIsS0FBTixDQUFkO01BQ0EsSUFBSWUsVUFBVSxHQUFHZSxJQUFJLENBQUN4TCxJQUFMLENBQVU2SixHQUFWLEdBQWdCMkIsSUFBSSxDQUFDeEwsSUFBTCxDQUFVNEosS0FBMUIsR0FBa0MsQ0FBbkQsQ0FIeUQsQ0FHSDs7TUFDdEQsSUFBSWdDLFVBQVUsR0FBR0osSUFBSSxDQUFDeEwsSUFBTCxDQUFVNEosS0FBVixLQUFvQmUsR0FBckM7TUFDQVcsZ0JBQWdCLElBQUlFLElBQUksQ0FBQ0MsVUFBTCxHQUFrQkosYUFBdEMsQ0FMeUQsQ0FLSjs7TUFDckRBLGFBQWEsR0FBR0csSUFBSSxDQUFDQyxVQUFMLEdBQWtCRCxJQUFJLENBQUM3QixTQUF2QyxDQU55RCxDQU1QOztNQUNsRCxJQUFJYyxVQUFKLEVBQWdCO1FBQ1phLGdCQUFnQixJQUFJRSxJQUFJLENBQUM3QixTQUF6Qjs7UUFDQSxJQUFJaUMsVUFBSixFQUFnQjtVQUNaRixlQUFlLENBQUM5TixJQUFoQixDQUFxQjtZQUNqQitDLEdBQUcsRUFBRWlLLFVBQVUsQ0FBQ2pLLEdBQUQsRUFBTTZLLElBQUksQ0FBQ3hMLElBQUwsQ0FBVTRKLEtBQWhCLEVBQXVCNEIsSUFBSSxDQUFDeEwsSUFBTCxDQUFVNkosR0FBakMsRUFBc0NiLEtBQXRDLENBREU7WUFFakJoQyxTQUFTLEVBQUUsSUFGTTtZQUdqQnlELFVBQVUsRUFBRSxJQUhLO1lBSWpCQyxXQUFXLEVBQUVjLElBQUksQ0FBQ0MsVUFKRDtZQUtqQmxELFNBQVMsRUFBRTtVQUxNLENBQXJCO1FBT0g7TUFDSixDQVhELE1BWUssSUFBSXFELFVBQUosRUFBZ0I7UUFDakJGLGVBQWUsQ0FBQzlOLElBQWhCLENBQXFCO1VBQ2pCK0MsR0FBRyxFQUFFaUssVUFBVSxDQUFDakssR0FBRCxFQUFNNkssSUFBSSxDQUFDeEwsSUFBTCxDQUFVNEosS0FBaEIsRUFBdUI0QixJQUFJLENBQUN4TCxJQUFMLENBQVU2SixHQUFqQyxFQUFzQ2IsS0FBdEMsQ0FERTtVQUVqQmhDLFNBQVMsRUFBRSxJQUZNO1VBR2pCeUQsVUFBVSxFQUFFLEtBSEs7VUFJakJDLFdBQVcsRUFBRWMsSUFBSSxDQUFDQyxVQUpEO1VBS2pCbEQsU0FBUyxFQUFFK0MsZ0JBTE0sQ0FLWTs7UUFMWixDQUFyQjtRQU9BQSxnQkFBZ0IsR0FBRyxDQUFuQjtNQUNIO0lBQ0o7O0lBQ0RuQixtQkFBbUIsQ0FBQ3ZNLElBQXBCLENBQXlCMEgsZ0JBQXpCO0lBQ0E4RSxrQkFBa0IsQ0FBQ3hNLElBQW5CLENBQXdCOE4sZUFBeEI7SUFDQXJCLGVBQWUsQ0FBQ3pNLElBQWhCLENBQXFCME4sZ0JBQXJCO0VBQ0g7O0VBQ0QsT0FBTztJQUFFbkIsbUJBQW1CLEVBQUVBLG1CQUF2QjtJQUE0Q0Msa0JBQWtCLEVBQUVBLGtCQUFoRTtJQUFvRkMsZUFBZSxFQUFFQTtFQUFyRyxDQUFQO0FBQ0g7O0FBQ0QsU0FBU2MsbUJBQVQsQ0FBNkJDLEtBQTdCLEVBQW9DL0wsTUFBcEMsRUFBNEM7RUFDeEMsSUFBSTZMLGNBQWMsR0FBRyxFQUFyQjs7RUFDQSxLQUFLLElBQUlQLEdBQUcsR0FBRyxDQUFmLEVBQWtCQSxHQUFHLEdBQUd0TCxNQUF4QixFQUFnQ3NMLEdBQUcsSUFBSSxDQUF2QyxFQUEwQztJQUN0Q08sY0FBYyxDQUFDdE4sSUFBZixDQUFvQixFQUFwQjtFQUNIOztFQUNELEtBQUssSUFBSTRDLEVBQUUsR0FBRyxDQUFULEVBQVlxTCxPQUFPLEdBQUdULEtBQTNCLEVBQWtDNUssRUFBRSxHQUFHcUwsT0FBTyxDQUFDbkwsTUFBL0MsRUFBdURGLEVBQUUsRUFBekQsRUFBNkQ7SUFDekQsSUFBSWdMLElBQUksR0FBR0ssT0FBTyxDQUFDckwsRUFBRCxDQUFsQjs7SUFDQSxLQUFLLElBQUltSyxHQUFHLEdBQUdhLElBQUksQ0FBQ3hMLElBQUwsQ0FBVTRKLEtBQXpCLEVBQWdDZSxHQUFHLEdBQUdhLElBQUksQ0FBQ3hMLElBQUwsQ0FBVTZKLEdBQWhELEVBQXFEYyxHQUFHLElBQUksQ0FBNUQsRUFBK0Q7TUFDM0RPLGNBQWMsQ0FBQ1AsR0FBRCxDQUFkLENBQW9CL00sSUFBcEIsQ0FBeUI0TixJQUF6QjtJQUNIO0VBQ0o7O0VBQ0QsT0FBT04sY0FBUDtBQUNIOztBQUNELFNBQVNOLFVBQVQsQ0FBb0JqSyxHQUFwQixFQUF5Qm1MLFNBQXpCLEVBQW9DQyxPQUFwQyxFQUE2Qy9DLEtBQTdDLEVBQW9EO0VBQ2hELElBQUlySSxHQUFHLENBQUNLLFFBQUosS0FBaUI4SyxTQUFqQixJQUE4Qm5MLEdBQUcsQ0FBQzBDLE9BQUosS0FBZ0IwSSxPQUFPLEdBQUcsQ0FBNUQsRUFBK0Q7SUFDM0QsT0FBT3BMLEdBQVA7RUFDSDs7RUFDRCxJQUFJdUMsVUFBVSxHQUFHdkMsR0FBRyxDQUFDdUMsVUFBckI7RUFDQSxJQUFJOEksU0FBUyxHQUFHOUksVUFBVSxDQUFDK0ksS0FBM0I7RUFDQSxJQUFJQyxXQUFXLEdBQUc1UCxNQUFNLENBQUM2UCxlQUFQLENBQXVCSCxTQUF2QixFQUFrQztJQUNoRHBDLEtBQUssRUFBRVosS0FBSyxDQUFDOEMsU0FBRCxDQUFMLENBQWlCckssSUFEd0I7SUFFaERvSSxHQUFHLEVBQUV2TixNQUFNLENBQUM4UCxPQUFQLENBQWVwRCxLQUFLLENBQUMrQyxPQUFPLEdBQUcsQ0FBWCxDQUFMLENBQW1CdEssSUFBbEMsRUFBd0MsQ0FBeEM7RUFGMkMsQ0FBbEMsQ0FBbEI7RUFJQSxPQUFPakYsS0FBSyxDQUFDNEYsUUFBTixDQUFlNUYsS0FBSyxDQUFDNEYsUUFBTixDQUFlLEVBQWYsRUFBbUJ6QixHQUFuQixDQUFmLEVBQXdDO0lBQUVLLFFBQVEsRUFBRThLLFNBQVo7SUFBdUJ6SSxPQUFPLEVBQUUwSSxPQUFPLEdBQUcsQ0FBMUM7SUFBNkM3SSxVQUFVLEVBQUU7TUFDaEdDLEdBQUcsRUFBRUQsVUFBVSxDQUFDQyxHQURnRjtNQUVoR2pDLEVBQUUsRUFBRTFFLEtBQUssQ0FBQzRGLFFBQU4sQ0FBZTVGLEtBQUssQ0FBQzRGLFFBQU4sQ0FBZSxFQUFmLEVBQW1CYyxVQUFVLENBQUNoQyxFQUE5QixDQUFmLEVBQWtEO1FBQUVtTCxnQkFBZ0IsRUFBRTtNQUFwQixDQUFsRCxDQUY0RjtNQUdoRy9GLFFBQVEsRUFBRXBELFVBQVUsQ0FBQ29ELFFBSDJFO01BSWhHMkYsS0FBSyxFQUFFQztJQUp5RixDQUF6RDtJQUt4QzVJLE9BQU8sRUFBRTNDLEdBQUcsQ0FBQzJDLE9BQUosSUFBZTRJLFdBQVcsQ0FBQ3RDLEtBQVosQ0FBa0IwQyxPQUFsQixPQUFnQ04sU0FBUyxDQUFDcEMsS0FBVixDQUFnQjBDLE9BQWhCLEVBTGhCO0lBSzJDL0ksS0FBSyxFQUFFNUMsR0FBRyxDQUFDNEMsS0FBSixJQUFhMkksV0FBVyxDQUFDckMsR0FBWixDQUFnQnlDLE9BQWhCLE9BQThCTixTQUFTLENBQUNuQyxHQUFWLENBQWN5QyxPQUFkO0VBTDdGLENBQXhDLENBQVA7QUFNSDs7QUFDRCxJQUFJcEQsbUJBQW1CO0FBQUc7QUFBZSxVQUFVeE0sTUFBVixFQUFrQjtFQUN2REYsS0FBSyxDQUFDRyxTQUFOLENBQWdCdU0sbUJBQWhCLEVBQXFDeE0sTUFBckM7O0VBQ0EsU0FBU3dNLG1CQUFULEdBQStCO0lBQzNCLElBQUl0TSxLQUFLLEdBQUdGLE1BQU0sS0FBSyxJQUFYLElBQW1CQSxNQUFNLENBQUNHLEtBQVAsQ0FBYSxJQUFiLEVBQW1CQyxTQUFuQixDQUFuQixJQUFvRCxJQUFoRSxDQUQyQixDQUUzQjs7O0lBQ0FGLEtBQUssQ0FBQ3lNLGNBQU4sR0FBdUIsS0FBdkIsQ0FIMkIsQ0FJM0I7O0lBQ0F6TSxLQUFLLENBQUMyUCxXQUFOLEdBQW9CLEVBQXBCO0lBQ0EsT0FBTzNQLEtBQVA7RUFDSDs7RUFDRHNNLG1CQUFtQixDQUFDak0sU0FBcEIsQ0FBOEI4TSxPQUE5QixHQUF3QyxVQUFVUixTQUFWLEVBQXFCO0lBQ3pELElBQUkzTSxLQUFLLEdBQUcsSUFBWjs7SUFDQSxJQUFJZ0osVUFBVSxHQUFHbEosTUFBTSxDQUFDTyxTQUFQLENBQWlCOE0sT0FBakIsQ0FBeUJ5QyxJQUF6QixDQUE4QixJQUE5QixFQUFvQ2pELFNBQXBDLENBQWpCOztJQUNBLElBQUlrRCxjQUFjLEdBQUcsS0FBS0EsY0FBMUI7O0lBQ0EsSUFBSUMsYUFBYSxHQUFHLFNBQWhCQSxhQUFnQixDQUFVQyxLQUFWLEVBQWlCO01BQUUsT0FBTyxDQUFDL1AsS0FBSyxDQUFDMlAsV0FBTixDQUFrQmpRLE1BQU0sQ0FBQ3NRLGFBQVAsQ0FBcUJELEtBQXJCLENBQWxCLENBQVI7SUFBeUQsQ0FBaEcsQ0FKeUQsQ0FLekQ7OztJQUNBLEtBQUssSUFBSUUsS0FBSyxHQUFHLENBQWpCLEVBQW9CQSxLQUFLLEdBQUdKLGNBQWMsQ0FBQy9MLE1BQTNDLEVBQW1EbU0sS0FBSyxJQUFJLENBQTVELEVBQStEO01BQzNESixjQUFjLENBQUNJLEtBQUQsQ0FBZCxHQUF3QkosY0FBYyxDQUFDSSxLQUFELENBQWQsQ0FBc0JDLE1BQXRCLENBQTZCSixhQUE3QixDQUF4QjtJQUNIOztJQUNELE9BQU85RyxVQUFQO0VBQ0gsQ0FWRDs7RUFXQXNELG1CQUFtQixDQUFDak0sU0FBcEIsQ0FBOEI4UCxzQkFBOUIsR0FBdUQsVUFBVUMsU0FBVixFQUFxQkwsS0FBckIsRUFBNEI3QyxhQUE1QixFQUEyQztJQUM5RixJQUFJek0sRUFBRSxHQUFHLElBQVQ7SUFBQSxJQUFlb1AsY0FBYyxHQUFHcFAsRUFBRSxDQUFDb1AsY0FBbkM7SUFBQSxJQUFtREYsV0FBVyxHQUFHbFAsRUFBRSxDQUFDa1AsV0FBcEU7O0lBQ0EsSUFBSVUsYUFBYSxHQUFHRCxTQUFTLENBQUNDLGFBQTlCO0lBQUEsSUFBNkNDLGFBQWEsR0FBR0YsU0FBUyxDQUFDRSxhQUF2RTtJQUFBLElBQXNGQyxlQUFlLEdBQUdILFNBQVMsQ0FBQ0csZUFBbEg7O0lBQ0EsSUFBSSxLQUFLOUQsY0FBTCxJQUF1QjRELGFBQTNCLEVBQTBDO01BQ3RDLElBQUlHLGVBQWUsR0FBRzlRLE1BQU0sQ0FBQ3NRLGFBQVAsQ0FBcUJLLGFBQXJCLENBQXRCLENBRHNDLENBRXRDOztNQUNBLElBQUksQ0FBQ1YsV0FBVyxDQUFDYSxlQUFELENBQWhCLEVBQW1DO1FBQy9CLElBQUksS0FBS2pFLGNBQVQsRUFBeUI7VUFDckIsSUFBSWtFLGdCQUFnQixHQUFHN1EsS0FBSyxDQUFDNEYsUUFBTixDQUFlNUYsS0FBSyxDQUFDNEYsUUFBTixDQUFlLEVBQWYsRUFBbUI2SyxhQUFuQixDQUFmLEVBQWtEO1lBQUVqTixJQUFJLEVBQUUxRCxNQUFNLENBQUNnUixjQUFQLENBQXNCTCxhQUFhLENBQUNqTixJQUFwQyxFQUEwQzJNLEtBQUssQ0FBQzNNLElBQWhEO1VBQVIsQ0FBbEQsQ0FBdkI7O1VBQ0EsSUFBSXVOLGtCQUFrQixHQUFHalIsTUFBTSxDQUFDc1EsYUFBUCxDQUFxQlMsZ0JBQXJCLENBQXpCO1VBQ0FkLFdBQVcsQ0FBQ2dCLGtCQUFELENBQVgsR0FBa0MsSUFBbEM7VUFDQWQsY0FBYyxDQUFDUyxhQUFELENBQWQsQ0FBOEJDLGVBQTlCLElBQWlERSxnQkFBakQsQ0FKcUIsQ0FJOEM7O1VBQ25FLEtBQUtHLFVBQUwsQ0FBZ0JQLGFBQWhCLEVBQStCTixLQUEvQixFQUFzQzdDLGFBQXRDLEVBTHFCLENBS2lDO1FBQ3pELENBTkQsTUFPSztVQUNEeUMsV0FBVyxDQUFDYSxlQUFELENBQVgsR0FBK0IsSUFBL0I7VUFDQXRELGFBQWEsQ0FBQ2xNLElBQWQsQ0FBbUJxUCxhQUFuQjtRQUNIO01BQ0o7SUFDSjs7SUFDRCxPQUFPdlEsTUFBTSxDQUFDTyxTQUFQLENBQWlCOFAsc0JBQWpCLENBQXdDUCxJQUF4QyxDQUE2QyxJQUE3QyxFQUFtRFEsU0FBbkQsRUFBOERMLEtBQTlELEVBQXFFN0MsYUFBckUsQ0FBUDtFQUNILENBckJEOztFQXNCQSxPQUFPWixtQkFBUDtBQUNILENBNUN3QyxDQTRDdkM1TSxNQUFNLENBQUNtUixZQTVDZ0MsQ0FBekM7O0FBOENBLElBQUlDLFFBQVE7QUFBRztBQUFlLFVBQVVoUixNQUFWLEVBQWtCO0VBQzVDRixLQUFLLENBQUNHLFNBQU4sQ0FBZ0IrUSxRQUFoQixFQUEwQmhSLE1BQTFCOztFQUNBLFNBQVNnUixRQUFULEdBQW9CO0lBQ2hCLElBQUk5USxLQUFLLEdBQUdGLE1BQU0sS0FBSyxJQUFYLElBQW1CQSxNQUFNLENBQUNHLEtBQVAsQ0FBYSxJQUFiLEVBQW1CQyxTQUFuQixDQUFuQixJQUFvRCxJQUFoRTs7SUFDQUYsS0FBSyxDQUFDK1EsVUFBTixHQUFtQixJQUFJclIsTUFBTSxDQUFDc1IsTUFBWCxFQUFuQixDQUZnQixDQUV3Qjs7SUFDeENoUixLQUFLLENBQUNpUixXQUFOLEdBQW9CLElBQUl2UixNQUFNLENBQUNzUixNQUFYLEVBQXBCLENBSGdCLENBR3lCOztJQUN6Q2hSLEtBQUssQ0FBQ2tSLFFBQU4sR0FBaUIsSUFBSXhSLE1BQU0sQ0FBQ3NSLE1BQVgsRUFBakIsQ0FKZ0IsQ0FJc0I7O0lBQ3RDaFIsS0FBSyxDQUFDbVIsY0FBTixHQUF1QixJQUFJelIsTUFBTSxDQUFDc1IsTUFBWCxFQUF2QixDQUxnQixDQUs0Qjs7SUFDNUNoUixLQUFLLENBQUM2QixTQUFOLEdBQWtCbkMsTUFBTSxDQUFDVSxTQUFQLEVBQWxCO0lBQ0FKLEtBQUssQ0FBQ3dLLEtBQU4sR0FBYztNQUNWNEcsY0FBYyxFQUFFLElBRE47TUFFVmpGLGdCQUFnQixFQUFFLElBRlI7TUFHVkQsb0JBQW9CLEVBQUU7SUFIWixDQUFkO0lBS0EsT0FBT2xNLEtBQVA7RUFDSDs7RUFDRDhRLFFBQVEsQ0FBQ3pRLFNBQVQsQ0FBbUJxRSxNQUFuQixHQUE0QixZQUFZO0lBQ3BDLElBQUkxRSxLQUFLLEdBQUcsSUFBWjs7SUFDQSxJQUFJUyxFQUFFLEdBQUcsSUFBVDtJQUFBLElBQWVDLEtBQUssR0FBR0QsRUFBRSxDQUFDQyxLQUExQjtJQUFBLElBQWlDOEosS0FBSyxHQUFHL0osRUFBRSxDQUFDK0osS0FBNUM7SUFBQSxJQUFtRDdKLE9BQU8sR0FBR0YsRUFBRSxDQUFDRSxPQUFoRTs7SUFDQSxJQUFJSSxPQUFPLEdBQUdKLE9BQU8sQ0FBQ0ksT0FBdEI7SUFDQSxJQUFJMEIsTUFBTSxHQUFHL0IsS0FBSyxDQUFDMEwsS0FBTixDQUFZdEksTUFBekI7SUFDQSxJQUFJdU4sa0JBQWtCLEdBQUdwTixtQkFBbUIsQ0FBQ3ZELEtBQUssQ0FBQzRRLGdCQUFQLEVBQXlCN08sTUFBekIsQ0FBNUM7SUFDQSxJQUFJOE8sZ0JBQWdCLEdBQUd0TixtQkFBbUIsQ0FBQ3ZELEtBQUssQ0FBQzhRLFdBQVAsRUFBb0IvTyxNQUFwQixDQUExQztJQUNBLElBQUlnUCxrQkFBa0IsR0FBR3hOLG1CQUFtQixDQUFDLEtBQUt5TixnQkFBTCxFQUFELEVBQTBCalAsTUFBMUIsQ0FBNUM7SUFDQSxJQUFJa1AsZUFBZSxHQUFHMU4sbUJBQW1CLENBQUMsS0FBSzJOLGFBQUwsRUFBRCxFQUF1Qm5QLE1BQXZCLENBQXpDOztJQUNBLElBQUl3TCxFQUFFLEdBQUduQyxxQkFBcUIsQ0FBQ3BNLE1BQU0sQ0FBQ21TLGFBQVAsQ0FBcUJuUixLQUFLLENBQUNvUixXQUEzQixFQUF3Qy9RLE9BQU8sQ0FBQ2dSLFVBQWhELENBQUQsRUFBOERyUixLQUFLLENBQUNxTCxZQUFwRSxFQUFrRnJMLEtBQUssQ0FBQ3NMLGVBQXhGLEVBQXlHakwsT0FBTyxDQUFDaVIsZ0JBQWpILEVBQW1JeEgsS0FBSyxDQUFDMEIsb0JBQXpJLEVBQStKMUIsS0FBSyxDQUFDMkIsZ0JBQXJLLEVBQXVMekwsS0FBSyxDQUFDMEwsS0FBN0wsQ0FBOUI7SUFBQSxJQUFtT21CLG1CQUFtQixHQUFHVSxFQUFFLENBQUNWLG1CQUE1UDtJQUFBLElBQWlSQyxrQkFBa0IsR0FBR1MsRUFBRSxDQUFDVCxrQkFBelM7SUFBQSxJQUE2VEUsUUFBUSxHQUFHTyxFQUFFLENBQUNQLFFBQTNVO0lBQUEsSUFBcVZDLGNBQWMsR0FBR00sRUFBRSxDQUFDTixjQUF6Vzs7SUFDQSxJQUFJdEUsaUJBQWlCLEdBQUc7SUFDdEIzSSxLQUFLLENBQUM0SSxTQUFOLElBQW1CNUksS0FBSyxDQUFDNEksU0FBTixDQUFnQi9FLGlCQUFwQyxJQUNJN0QsS0FBSyxDQUFDNkksV0FBTixJQUFxQjdJLEtBQUssQ0FBQzZJLFdBQU4sQ0FBa0JoRixpQkFEM0MsSUFFRyxFQUhKO0lBSUEsT0FBUTdFLE1BQU0sQ0FBQ2dDLGFBQVAsQ0FBcUIsSUFBckIsRUFBMkI7TUFBRUssR0FBRyxFQUFFLEtBQUtGLFNBQVo7TUFBdUJxSixJQUFJLEVBQUU7SUFBN0IsQ0FBM0IsRUFDSnhLLEtBQUssQ0FBQ3VSLFdBQU4sSUFBcUJ2UixLQUFLLENBQUN1UixXQUFOLEVBRGpCLEVBRUp2UixLQUFLLENBQUMwTCxLQUFOLENBQVk1QyxHQUFaLENBQWdCLFVBQVUwSSxJQUFWLEVBQWdCbkUsR0FBaEIsRUFBcUI7TUFDakMsSUFBSW9FLGFBQWEsR0FBR25TLEtBQUssQ0FBQ29TLFlBQU4sQ0FBbUJyRSxHQUFuQixFQUF3QnJOLEtBQUssQ0FBQzJCLFFBQU4sR0FBaUJrTCxtQkFBbUIsQ0FBQ1EsR0FBRCxDQUFwQyxHQUE0Q1Asa0JBQWtCLENBQUNPLEdBQUQsQ0FBdEYsRUFBNkZyTixLQUFLLENBQUNzRSxVQUFuRyxFQUErR3FFLGlCQUEvRyxDQUFwQjs7TUFDQSxJQUFJZ0osYUFBYSxHQUFHclMsS0FBSyxDQUFDb1MsWUFBTixDQUFtQnJFLEdBQW5CLEVBQXdCdUUscUJBQXFCLENBQUNYLGVBQWUsQ0FBQzVELEdBQUQsQ0FBaEIsRUFBdUJQLGtCQUF2QixDQUE3QyxFQUF5RjlNLEtBQUssQ0FBQ3NFLFVBQS9GLEVBQTJHLEVBQTNHLEVBQStHdU4sT0FBTyxDQUFDN1IsS0FBSyxDQUFDNEksU0FBUCxDQUF0SCxFQUF5SWlKLE9BQU8sQ0FBQzdSLEtBQUssQ0FBQzZJLFdBQVAsQ0FBaEosRUFBcUssS0FBckssQ0FBcEI7O01BQ0EsT0FBUTdKLE1BQU0sQ0FBQ2dDLGFBQVAsQ0FBcUI2SSxTQUFyQixFQUFnQztRQUFFckosR0FBRyxFQUFFZ1IsSUFBSSxDQUFDaFIsR0FBWjtRQUFpQkcsS0FBSyxFQUFFckIsS0FBSyxDQUFDK1EsVUFBTixDQUFpQjNRLFNBQWpCLENBQTJCOFIsSUFBSSxDQUFDaFIsR0FBaEMsQ0FBeEI7UUFBOERtRSxVQUFVLEVBQUVyRixLQUFLLENBQUNpUixXQUFOLENBQWtCN1EsU0FBbEIsQ0FBNEI4UixJQUFJLENBQUNoUixHQUFqQztRQUFzQztRQUFoSDtRQUEwTDZELFdBQVcsRUFBRXJFLEtBQUssQ0FBQ3FFLFdBQTdNO1FBQTBORixJQUFJLEVBQUVxTixJQUFJLENBQUNyTixJQUFyTztRQUEyT0ksYUFBYSxFQUFFdkUsS0FBSyxDQUFDOFIsY0FBaFE7UUFBZ1JwSCxjQUFjLEVBQUUxSyxLQUFLLENBQUMrUixlQUFOLElBQXlCMUUsR0FBRyxLQUFLLENBQWpVO1FBQW9VeEksV0FBVyxFQUFFN0UsS0FBSyxDQUFDK1I7UUFBZ0I7UUFBdlc7UUFBbWF6TixVQUFVLEVBQUV0RSxLQUFLLENBQUNzRSxVQUFyYjtRQUFpYzRFLGNBQWMsRUFBRWxKLEtBQUssQ0FBQ2tKLGNBQXZkO1FBQXVlTixTQUFTLEVBQUU1SSxLQUFLLENBQUM0SSxTQUF4ZjtRQUFtZ0JDLFdBQVcsRUFBRTdJLEtBQUssQ0FBQzZJLFdBQXRoQjtRQUFtaUJyRSxjQUFjLEVBQUVnTixJQUFJLENBQUNoTixjQUF4akI7UUFBd2tCaUcsY0FBYyxFQUFFK0csSUFBSSxDQUFDL0csY0FBN2xCO1FBQTZtQnJFLGVBQWUsRUFBRW9MLElBQUksQ0FBQ3BMLGVBQW5vQjtRQUFvcEJxQyxhQUFhLEVBQUUrSSxJQUFJLENBQUMvSSxhQUF4cUI7UUFBdXJCSixPQUFPLEVBQUUyRSxRQUFRLENBQUNLLEdBQUQsQ0FBeHNCO1FBQStzQm5DLGFBQWEsRUFBRStCLGNBQWMsQ0FBQ0ksR0FBRCxDQUE1dUI7UUFBbXZCckYsZ0JBQWdCLEVBQUU2RSxtQkFBbUIsQ0FBQ1EsR0FBRCxDQUF4eEI7UUFBK3hCdEMsY0FBYyxFQUFFekwsS0FBSyxDQUFDa1IsUUFBTixDQUFlOVEsU0FBZixDQUF5QjhSLElBQUksQ0FBQ2hSLEdBQTlCLENBQS95QjtRQUFtMUJ3SyxTQUFTLEVBQUk7UUFDcDRCaE0sTUFBTSxDQUFDZ0MsYUFBUCxDQUFxQmhDLE1BQU0sQ0FBQ2lHLFFBQTVCLEVBQXNDLElBQXRDLEVBQ0lqRyxNQUFNLENBQUNnQyxhQUFQLENBQXFCaEMsTUFBTSxDQUFDaUcsUUFBNUIsRUFBc0MsSUFBdEMsRUFBNEN3TSxhQUE1QyxDQURKLEVBRUl6UyxNQUFNLENBQUNnQyxhQUFQLENBQXFCaEMsTUFBTSxDQUFDaUcsUUFBNUIsRUFBc0MsSUFBdEMsRUFBNEMwTSxhQUE1QyxDQUZKLENBRG9DO1FBRzhCeEcsU0FBUyxFQUFJO1FBQy9Fbk0sTUFBTSxDQUFDZ0MsYUFBUCxDQUFxQmhDLE1BQU0sQ0FBQ2lHLFFBQTVCLEVBQXNDLElBQXRDLEVBQ0kzRixLQUFLLENBQUMwUyxjQUFOLENBQXFCakIsa0JBQWtCLENBQUMxRCxHQUFELENBQXZDLEVBQThDLFdBQTlDLENBREosRUFFSS9OLEtBQUssQ0FBQzBTLGNBQU4sQ0FBcUJyQixrQkFBa0IsQ0FBQ3RELEdBQUQsQ0FBdkMsRUFBOEMsY0FBOUMsQ0FGSixFQUdJL04sS0FBSyxDQUFDMFMsY0FBTixDQUFxQm5CLGdCQUFnQixDQUFDeEQsR0FBRCxDQUFyQyxFQUE0QyxVQUE1QyxDQUhKO01BSm9DLENBQWhDLENBQVI7SUFRSCxDQVhELENBRkksQ0FBUjtFQWNILENBNUJEOztFQTZCQStDLFFBQVEsQ0FBQ3pRLFNBQVQsQ0FBbUJzUyxpQkFBbkIsR0FBdUMsWUFBWTtJQUMvQyxLQUFLQyxZQUFMLENBQWtCLElBQWxCO0VBQ0gsQ0FGRDs7RUFHQTlCLFFBQVEsQ0FBQ3pRLFNBQVQsQ0FBbUJ3UyxrQkFBbkIsR0FBd0MsVUFBVUMsU0FBVixFQUFxQkMsU0FBckIsRUFBZ0M7SUFDcEUsSUFBSUMsWUFBWSxHQUFHLEtBQUt0UyxLQUF4QjtJQUNBLEtBQUtrUyxZQUFMLENBQWtCLENBQUNsVCxNQUFNLENBQUN1VCxZQUFQLENBQW9CSCxTQUFwQixFQUErQkUsWUFBL0IsQ0FBbkI7RUFDSCxDQUhEOztFQUlBbEMsUUFBUSxDQUFDelEsU0FBVCxDQUFtQnFSLGdCQUFuQixHQUFzQyxZQUFZO0lBQzlDLElBQUloUixLQUFLLEdBQUcsS0FBS0EsS0FBakI7O0lBQ0EsSUFBSUEsS0FBSyxDQUFDNEksU0FBTixJQUFtQjVJLEtBQUssQ0FBQzRJLFNBQU4sQ0FBZ0I5RixJQUFoQixDQUFxQk0sTUFBNUMsRUFBb0Q7TUFBRTtNQUNsRCxPQUFPcEQsS0FBSyxDQUFDNEksU0FBTixDQUFnQjlGLElBQXZCO0lBQ0g7O0lBQ0QsSUFBSTlDLEtBQUssQ0FBQzZJLFdBQU4sSUFBcUI3SSxLQUFLLENBQUM2SSxXQUFOLENBQWtCL0YsSUFBbEIsQ0FBdUJNLE1BQWhELEVBQXdEO01BQUU7TUFDdEQsT0FBT3BELEtBQUssQ0FBQzZJLFdBQU4sQ0FBa0IvRixJQUF6QjtJQUNIOztJQUNELE9BQU85QyxLQUFLLENBQUN3UyxpQkFBYjtFQUNILENBVEQ7O0VBVUFwQyxRQUFRLENBQUN6USxTQUFULENBQW1CdVIsYUFBbkIsR0FBbUMsWUFBWTtJQUMzQyxJQUFJbFIsS0FBSyxHQUFHLEtBQUtBLEtBQWpCOztJQUNBLElBQUlBLEtBQUssQ0FBQzZJLFdBQU4sSUFBcUI3SSxLQUFLLENBQUM2SSxXQUFOLENBQWtCL0YsSUFBbEIsQ0FBdUJNLE1BQWhELEVBQXdEO01BQUU7TUFDdEQsT0FBT3BELEtBQUssQ0FBQzZJLFdBQU4sQ0FBa0IvRixJQUF6QjtJQUNIOztJQUNELE9BQU8sRUFBUDtFQUNILENBTkQ7O0VBT0FzTixRQUFRLENBQUN6USxTQUFULENBQW1CK1IsWUFBbkIsR0FBa0MsVUFBVXJFLEdBQVYsRUFBZW9GLGFBQWYsRUFBOEJuTyxVQUE5QixFQUEwQ3FFLGlCQUExQyxFQUE2RDVCLFVBQTdELEVBQXlFQyxVQUF6RSxFQUFxRkMsZUFBckYsRUFBc0c7SUFDcEksSUFBSWhILE9BQU8sR0FBRyxLQUFLQSxPQUFuQjtJQUNBLElBQUlpSixjQUFjLEdBQUcsS0FBS2xKLEtBQUwsQ0FBV2tKLGNBQWhDO0lBQ0EsSUFBSXdILGNBQWMsR0FBRyxLQUFLNUcsS0FBTCxDQUFXNEcsY0FBaEM7SUFDQSxJQUFJcEssc0JBQXNCLEdBQUcsS0FBS3RHLEtBQUwsQ0FBVzBMLEtBQVgsQ0FBaUJ0SSxNQUFqQixLQUE0QixDQUF6RCxDQUpvSSxDQUl4RTs7SUFDNUQsSUFBSXNQLFFBQVEsR0FBRzNMLFVBQVUsSUFBSUMsVUFBZCxJQUE0QkMsZUFBM0M7SUFDQSxJQUFJMEwsS0FBSyxHQUFHLEVBQVo7O0lBQ0EsSUFBSWpDLGNBQUosRUFBb0I7TUFDaEIsS0FBSyxJQUFJeE4sRUFBRSxHQUFHLENBQVQsRUFBWTBQLGVBQWUsR0FBR0gsYUFBbkMsRUFBa0R2UCxFQUFFLEdBQUcwUCxlQUFlLENBQUN4UCxNQUF2RSxFQUErRUYsRUFBRSxFQUFqRixFQUFxRjtRQUNqRixJQUFJdUcsU0FBUyxHQUFHbUosZUFBZSxDQUFDMVAsRUFBRCxDQUEvQjtRQUNBLElBQUlHLEdBQUcsR0FBR29HLFNBQVMsQ0FBQ3BHLEdBQXBCO1FBQ0EsSUFBSTBGLFVBQVUsR0FBRzFGLEdBQUcsQ0FBQ3VDLFVBQUosQ0FBZW9ELFFBQWYsQ0FBd0JELFVBQXpDO1FBQ0EsSUFBSXZJLEdBQUcsR0FBR3VJLFVBQVUsR0FBRyxHQUFiLEdBQW1Cc0UsR0FBN0I7UUFDQSxJQUFJM0QsU0FBUyxHQUFHRCxTQUFTLENBQUNDLFNBQVYsSUFBdUIsQ0FBQ2YsaUJBQWlCLENBQUNJLFVBQUQsQ0FBekQ7UUFDQSxJQUFJb0UsVUFBVSxHQUFHMUQsU0FBUyxDQUFDMEQsVUFBM0I7UUFDQSxJQUFJMEYsSUFBSSxHQUFHLEVBQVg7UUFDQSxJQUFJQyxLQUFLLEdBQUcsRUFBWjs7UUFDQSxJQUFJM0YsVUFBSixFQUFnQjtVQUNaLElBQUlsTixPQUFPLENBQUM4UyxLQUFaLEVBQW1CO1lBQ2ZELEtBQUssR0FBRyxDQUFSO1lBQ0FELElBQUksR0FBR25DLGNBQWMsQ0FBQ3NDLEtBQWYsQ0FBcUIzUCxHQUFHLENBQUMwQyxPQUF6QixJQUFvQzJLLGNBQWMsQ0FBQ3NDLEtBQWYsQ0FBcUIzUCxHQUFHLENBQUNLLFFBQXpCLENBQTNDO1VBQ0gsQ0FIRCxNQUlLO1lBQ0RtUCxJQUFJLEdBQUcsQ0FBUDtZQUNBQyxLQUFLLEdBQUdwQyxjQUFjLENBQUN1QyxNQUFmLENBQXNCNVAsR0FBRyxDQUFDSyxRQUExQixJQUFzQ2dOLGNBQWMsQ0FBQ3VDLE1BQWYsQ0FBc0I1UCxHQUFHLENBQUMwQyxPQUExQixDQUE5QztVQUNIO1FBQ0o7UUFDRDtBQUNoQjtBQUNBO0FBQ0E7OztRQUNnQjRNLEtBQUssQ0FBQ3JTLElBQU4sQ0FBV3RCLE1BQU0sQ0FBQ2dDLGFBQVAsQ0FBcUIsS0FBckIsRUFBNEI7VUFBRU0sU0FBUyxFQUFFLDhCQUE4QjZMLFVBQVUsR0FBRywrQkFBSCxHQUFxQyxFQUE3RSxDQUFiO1VBQStGM00sR0FBRyxFQUFFQSxHQUFwRztVQUF5R2EsR0FBRyxFQUFFcVIsUUFBUSxHQUFHLElBQUgsR0FBVSxLQUFLakMsY0FBTCxDQUFvQi9RLFNBQXBCLENBQThCYyxHQUE5QixDQUFoSTtVQUFvS2dILEtBQUssRUFBRTtZQUMxTXlCLFVBQVUsRUFBRVMsU0FBUyxHQUFHLEVBQUgsR0FBUSxRQUQ2SztZQUUxTXVCLFNBQVMsRUFBRWtDLFVBQVUsR0FBRyxFQUFILEdBQVExRCxTQUFTLENBQUN3QixTQUZtSztZQUcxTWlJLEdBQUcsRUFBRS9GLFVBQVUsR0FBRzFELFNBQVMsQ0FBQzJELFdBQWIsR0FBMkIsRUFIZ0s7WUFJMU15RixJQUFJLEVBQUVBLElBSm9NO1lBSzFNQyxLQUFLLEVBQUVBO1VBTG1NO1FBQTNLLENBQTVCLEVBTUZwTixrQkFBa0IsQ0FBQ3JDLEdBQUQsQ0FBbEIsR0FBMkJyRSxNQUFNLENBQUNnQyxhQUFQLENBQXFCd0Ysa0JBQXJCLEVBQXlDdEgsS0FBSyxDQUFDNEYsUUFBTixDQUFlO1VBQUV6QixHQUFHLEVBQUVBLEdBQVA7VUFBWTBELFVBQVUsRUFBRUEsVUFBeEI7VUFBb0NHLFVBQVUsRUFBRTZCLFVBQVUsS0FBS0csY0FBL0Q7VUFBK0U1QyxzQkFBc0IsRUFBRUE7UUFBdkcsQ0FBZixFQUFnSnRILE1BQU0sQ0FBQ21LLFVBQVAsQ0FBa0I5RixHQUFsQixFQUF1QmlCLFVBQXZCLENBQWhKLENBQXpDLENBQTNCLEdBQTZQdEYsTUFBTSxDQUFDZ0MsYUFBUCxDQUFxQmtGLGVBQXJCLEVBQXNDaEgsS0FBSyxDQUFDNEYsUUFBTixDQUFlO1VBQUV6QixHQUFHLEVBQUVBLEdBQVA7VUFBWTBELFVBQVUsRUFBRUEsVUFBeEI7VUFBb0NDLFVBQVUsRUFBRUEsVUFBaEQ7VUFBNERDLGVBQWUsRUFBRUEsZUFBN0U7VUFBOEZDLFVBQVUsRUFBRTZCLFVBQVUsS0FBS0csY0FBekg7VUFBeUk1QyxzQkFBc0IsRUFBRUE7UUFBakssQ0FBZixFQUEwTXRILE1BQU0sQ0FBQ21LLFVBQVAsQ0FBa0I5RixHQUFsQixFQUF1QmlCLFVBQXZCLENBQTFNLENBQXRDLENBTjNQLENBQVg7TUFPSDtJQUNKOztJQUNELE9BQU9xTyxLQUFQO0VBQ0gsQ0F6Q0Q7O0VBMENBdkMsUUFBUSxDQUFDelEsU0FBVCxDQUFtQnFTLGNBQW5CLEdBQW9DLFVBQVVsUCxJQUFWLEVBQWdCcVEsUUFBaEIsRUFBMEI7SUFDMUQsSUFBSUosS0FBSyxHQUFHLEtBQUs5UyxPQUFMLENBQWE4UyxLQUF6QjtJQUNBLElBQUl6TyxVQUFVLEdBQUcsS0FBS3RFLEtBQUwsQ0FBV3NFLFVBQTVCO0lBQ0EsSUFBSW9NLGNBQWMsR0FBRyxLQUFLNUcsS0FBTCxDQUFXNEcsY0FBaEM7SUFDQSxJQUFJaUMsS0FBSyxHQUFHLEVBQVo7O0lBQ0EsSUFBSWpDLGNBQUosRUFBb0I7TUFDaEIsS0FBSyxJQUFJeE4sRUFBRSxHQUFHLENBQVQsRUFBWUMsTUFBTSxHQUFHTCxJQUExQixFQUFnQ0ksRUFBRSxHQUFHQyxNQUFNLENBQUNDLE1BQTVDLEVBQW9ERixFQUFFLEVBQXRELEVBQTBEO1FBQ3RELElBQUlHLEdBQUcsR0FBR0YsTUFBTSxDQUFDRCxFQUFELENBQWhCO1FBQ0EsSUFBSWtRLFlBQVksR0FBR0wsS0FBSyxHQUFHO1VBQ3ZCRCxLQUFLLEVBQUUsQ0FEZ0I7VUFFdkJELElBQUksRUFBRW5DLGNBQWMsQ0FBQ3NDLEtBQWYsQ0FBcUIzUCxHQUFHLENBQUMwQyxPQUF6QixJQUFvQzJLLGNBQWMsQ0FBQ3NDLEtBQWYsQ0FBcUIzUCxHQUFHLENBQUNLLFFBQXpCO1FBRm5CLENBQUgsR0FHcEI7VUFDQW1QLElBQUksRUFBRSxDQUROO1VBRUFDLEtBQUssRUFBRXBDLGNBQWMsQ0FBQ3VDLE1BQWYsQ0FBc0I1UCxHQUFHLENBQUNLLFFBQTFCLElBQXNDZ04sY0FBYyxDQUFDdUMsTUFBZixDQUFzQjVQLEdBQUcsQ0FBQzBDLE9BQTFCO1FBRjdDLENBSEo7UUFPQTRNLEtBQUssQ0FBQ3JTLElBQU4sQ0FBV3RCLE1BQU0sQ0FBQ2dDLGFBQVAsQ0FBcUIsS0FBckIsRUFBNEI7VUFBRVIsR0FBRyxFQUFFeEIsTUFBTSxDQUFDcVUsa0JBQVAsQ0FBMEJoUSxHQUFHLENBQUN1QyxVQUE5QixDQUFQO1VBQWtEdEUsU0FBUyxFQUFFLHVCQUE3RDtVQUFzRmtHLEtBQUssRUFBRTRMO1FBQTdGLENBQTVCLEVBQXlJRCxRQUFRLEtBQUssVUFBYixHQUNoSm5VLE1BQU0sQ0FBQ2dDLGFBQVAsQ0FBcUJoQyxNQUFNLENBQUNzVSxPQUE1QixFQUFxQ3BVLEtBQUssQ0FBQzRGLFFBQU4sQ0FBZTtVQUFFekIsR0FBRyxFQUFFQTtRQUFQLENBQWYsRUFBNkJyRSxNQUFNLENBQUNtSyxVQUFQLENBQWtCOUYsR0FBbEIsRUFBdUJpQixVQUF2QixDQUE3QixDQUFyQyxDQURnSixHQUVoSnRGLE1BQU0sQ0FBQ3VVLFVBQVAsQ0FBa0JKLFFBQWxCLENBRk8sQ0FBWDtNQUdIO0lBQ0o7O0lBQ0QsT0FBT25VLE1BQU0sQ0FBQ2dDLGFBQVAsQ0FBcUJ6QixLQUFyQixDQUEyQixLQUFLLENBQWhDLEVBQW1DTCxLQUFLLENBQUNzVSxhQUFOLENBQW9CLENBQUN4VSxNQUFNLENBQUNpRyxRQUFSLEVBQWtCLEVBQWxCLENBQXBCLEVBQTJDME4sS0FBM0MsQ0FBbkMsQ0FBUDtFQUNILENBckJEOztFQXNCQXZDLFFBQVEsQ0FBQ3pRLFNBQVQsQ0FBbUJ1UyxZQUFuQixHQUFrQyxVQUFVdUIsc0JBQVYsRUFBa0M7SUFDaEUsSUFBSTFULEVBQUUsR0FBRyxJQUFUO0lBQUEsSUFBZUMsS0FBSyxHQUFHRCxFQUFFLENBQUNDLEtBQTFCO0lBQUEsSUFBaUN1USxXQUFXLEdBQUd4USxFQUFFLENBQUN3USxXQUFsRDs7SUFDQSxJQUFJLENBQUN2USxLQUFLLENBQUMyQixRQUFQLElBQ0EzQixLQUFLLENBQUMwVCxXQUFOLEtBQXNCLElBRDFCLENBQytCO0lBRC9CLEVBRUU7TUFDRSxJQUFJRCxzQkFBSixFQUE0QjtRQUN4QixJQUFJRSxRQUFRLEdBQUczVCxLQUFLLENBQUMwTCxLQUFOLENBQVk1QyxHQUFaLENBQWdCLFVBQVUwSSxJQUFWLEVBQWdCO1VBQUUsT0FBT2pCLFdBQVcsQ0FBQ3FELFVBQVosQ0FBdUJwQyxJQUFJLENBQUNoUixHQUE1QixDQUFQO1FBQTBDLENBQTVFLENBQWY7O1FBQ0EsSUFBSW1ULFFBQVEsQ0FBQ3ZRLE1BQWIsRUFBcUI7VUFDakIsSUFBSXlRLFFBQVEsR0FBRyxLQUFLMVMsU0FBTCxDQUFlMlMsT0FBOUI7VUFDQSxLQUFLQyxRQUFMLENBQWM7WUFDVnJELGNBQWMsRUFBRSxJQUFJMVIsTUFBTSxDQUFDZ1YsYUFBWCxDQUF5QkgsUUFBekIsRUFBbUNGLFFBQW5DLEVBQTZDLElBQTdDLEVBQW1EO1lBQ25FLEtBRGdCO1VBRE4sQ0FBZDtRQUlIO01BQ0o7O01BQ0QsSUFBSU0sa0JBQWtCLEdBQUcsS0FBS25LLEtBQUwsQ0FBVzBCLG9CQUFwQztNQUNBLElBQUkwSSxrQkFBa0IsR0FBRyxLQUFLQyx5QkFBTCxFQUF6QjtNQUNBLElBQUlDLG9CQUFvQixHQUFHcFUsS0FBSyxDQUFDcUwsWUFBTixLQUF1QixJQUF2QixJQUErQnJMLEtBQUssQ0FBQ3NMLGVBQU4sS0FBMEIsSUFBcEY7TUFDQSxLQUFLK0ksWUFBTCxDQUFrQjtRQUNkO1FBQ0E7UUFDQTtRQUNBN0ksb0JBQW9CLEVBQUV0TSxLQUFLLENBQUM0RixRQUFOLENBQWU1RixLQUFLLENBQUM0RixRQUFOLENBQWUsRUFBZixFQUFtQm1QLGtCQUFuQixDQUFmLEVBQXVEQyxrQkFBdkQsQ0FKUjtRQUtkekksZ0JBQWdCLEVBQUUySSxvQkFBb0IsR0FBRyxLQUFLRSx1QkFBTCxFQUFILEdBQW9DO01BTDVELENBQWxCO0lBT0g7RUFDSixDQTFCRDs7RUEyQkFsRSxRQUFRLENBQUN6USxTQUFULENBQW1Cd1UseUJBQW5CLEdBQStDLFlBQVk7SUFDdkQsSUFBSUksUUFBUSxHQUFHLEtBQUs5RCxjQUFMLENBQW9CbUQsVUFBbkM7SUFDQSxJQUFJcEksb0JBQW9CLEdBQUcsRUFBM0IsQ0FGdUQsQ0FHdkQ7O0lBQ0EsS0FBSyxJQUFJaEwsR0FBVCxJQUFnQitULFFBQWhCLEVBQTBCO01BQ3RCLElBQUlDLE1BQU0sR0FBR0MsSUFBSSxDQUFDQyxLQUFMLENBQVdILFFBQVEsQ0FBQy9ULEdBQUQsQ0FBUixDQUFjbVUscUJBQWQsR0FBc0NILE1BQWpELENBQWI7TUFDQSxJQUFJekwsVUFBVSxHQUFHdkksR0FBRyxDQUFDb1UsS0FBSixDQUFVLEdBQVYsRUFBZSxDQUFmLENBQWpCLENBRnNCLENBRWM7O01BQ3BDcEosb0JBQW9CLENBQUN6QyxVQUFELENBQXBCLEdBQW1DMEwsSUFBSSxDQUFDSSxHQUFMLENBQVNySixvQkFBb0IsQ0FBQ3pDLFVBQUQsQ0FBcEIsSUFBb0MsQ0FBN0MsRUFBZ0R5TCxNQUFoRCxDQUFuQztJQUNIOztJQUNELE9BQU9oSixvQkFBUDtFQUNILENBVkQ7O0VBV0E0RSxRQUFRLENBQUN6USxTQUFULENBQW1CMlUsdUJBQW5CLEdBQTZDLFlBQVk7SUFDckQsSUFBSVEsUUFBUSxHQUFHLEtBQUs5VSxLQUFMLENBQVcwTCxLQUFYLENBQWlCLENBQWpCLEVBQW9CbEwsR0FBbkM7SUFDQSxJQUFJdVUsTUFBTSxHQUFHLEtBQUsxRSxVQUFMLENBQWdCdUQsVUFBaEIsQ0FBMkJrQixRQUEzQixDQUFiO0lBQ0EsSUFBSUUsYUFBYSxHQUFHLEtBQUt4RSxRQUFMLENBQWNvRCxVQUFkLENBQXlCa0IsUUFBekIsQ0FBcEI7SUFDQSxPQUFPQyxNQUFNLENBQUNKLHFCQUFQLEdBQStCTSxNQUEvQixHQUF3Q0QsYUFBYSxDQUFDTCxxQkFBZCxHQUFzQ3pCLEdBQXJGO0VBQ0gsQ0FMRDs7RUFNQTlDLFFBQVEsQ0FBQ3pRLFNBQVQsQ0FBbUJ1VixVQUFuQixHQUFnQyxZQUFZO0lBQ3hDLElBQUlDLEtBQUssR0FBRyxLQUFLOUUsVUFBTCxDQUFnQnVELFVBQTVCO0lBQ0EsT0FBTyxLQUFLNVQsS0FBTCxDQUFXMEwsS0FBWCxDQUFpQjVDLEdBQWpCLENBQXFCLFVBQVUwSSxJQUFWLEVBQWdCO01BQUUsT0FBTzJELEtBQUssQ0FBQzNELElBQUksQ0FBQ2hSLEdBQU4sQ0FBWjtJQUF5QixDQUFoRSxDQUFQO0VBQ0gsQ0FIRDs7RUFJQSxPQUFPNFAsUUFBUDtBQUNILENBdEw2QixDQXNMNUJwUixNQUFNLENBQUM0RCxhQXRMcUIsQ0FBOUI7O0FBdUxBd04sUUFBUSxDQUFDZ0YsZ0JBQVQsQ0FBMEI7RUFDdEI1SixvQkFBb0IsRUFBRXhNLE1BQU0sQ0FBQ3VUO0FBRFAsQ0FBMUI7O0FBR0EsU0FBU1gscUJBQVQsQ0FBK0J5RCxVQUEvQixFQUEyQ0MsYUFBM0MsRUFBMEQ7RUFDdEQsSUFBSSxDQUFDRCxVQUFVLENBQUNqUyxNQUFoQixFQUF3QjtJQUNwQixPQUFPLEVBQVA7RUFDSDs7RUFDRCxJQUFJbVMsZ0JBQWdCLEdBQUdDLG9CQUFvQixDQUFDRixhQUFELENBQTNDLENBSnNELENBSU07O0VBQzVELE9BQU9ELFVBQVUsQ0FBQ3ZNLEdBQVgsQ0FBZSxVQUFVekYsR0FBVixFQUFlO0lBQUUsT0FBUTtNQUMzQ0EsR0FBRyxFQUFFQSxHQURzQztNQUUzQ3FHLFNBQVMsRUFBRSxJQUZnQztNQUczQ3lELFVBQVUsRUFBRSxJQUgrQjtNQUkzQ0MsV0FBVyxFQUFFbUksZ0JBQWdCLENBQUNsUyxHQUFHLENBQUN1QyxVQUFKLENBQWVvRCxRQUFmLENBQXdCRCxVQUF6QixDQUpjO01BSzNDa0MsU0FBUyxFQUFFO0lBTGdDLENBQVI7RUFNbEMsQ0FORSxDQUFQO0FBT0g7O0FBQ0QsU0FBU3VLLG9CQUFULENBQThCRixhQUE5QixFQUE2QztFQUN6QyxJQUFJQyxnQkFBZ0IsR0FBRyxFQUF2Qjs7RUFDQSxLQUFLLElBQUlyUyxFQUFFLEdBQUcsQ0FBVCxFQUFZdVMsZUFBZSxHQUFHSCxhQUFuQyxFQUFrRHBTLEVBQUUsR0FBR3VTLGVBQWUsQ0FBQ3JTLE1BQXZFLEVBQStFRixFQUFFLEVBQWpGLEVBQXFGO0lBQ2pGLElBQUl3UyxVQUFVLEdBQUdELGVBQWUsQ0FBQ3ZTLEVBQUQsQ0FBaEM7O0lBQ0EsS0FBSyxJQUFJbkQsRUFBRSxHQUFHLENBQVQsRUFBWTRWLFlBQVksR0FBR0QsVUFBaEMsRUFBNEMzVixFQUFFLEdBQUc0VixZQUFZLENBQUN2UyxNQUE5RCxFQUFzRXJELEVBQUUsRUFBeEUsRUFBNEU7TUFDeEUsSUFBSTBKLFNBQVMsR0FBR2tNLFlBQVksQ0FBQzVWLEVBQUQsQ0FBNUI7TUFDQXdWLGdCQUFnQixDQUFDOUwsU0FBUyxDQUFDcEcsR0FBVixDQUFjdUMsVUFBZCxDQUF5Qm9ELFFBQXpCLENBQWtDRCxVQUFuQyxDQUFoQixHQUFpRVUsU0FBUyxDQUFDMkQsV0FBM0U7SUFDSDtFQUNKOztFQUNELE9BQU9tSSxnQkFBUDtBQUNIOztBQUVELElBQUlLLEtBQUs7QUFBRztBQUFlLFVBQVV4VyxNQUFWLEVBQWtCO0VBQ3pDRixLQUFLLENBQUNHLFNBQU4sQ0FBZ0J1VyxLQUFoQixFQUF1QnhXLE1BQXZCOztFQUNBLFNBQVN3VyxLQUFULEdBQWlCO0lBQ2IsSUFBSXRXLEtBQUssR0FBR0YsTUFBTSxLQUFLLElBQVgsSUFBbUJBLE1BQU0sQ0FBQ0csS0FBUCxDQUFhLElBQWIsRUFBbUJDLFNBQW5CLENBQW5CLElBQW9ELElBQWhFOztJQUNBRixLQUFLLENBQUN1VyxxQkFBTixHQUE4QjdXLE1BQU0sQ0FBQytJLE9BQVAsQ0FBZWxGLGNBQWYsQ0FBOUI7SUFDQXZELEtBQUssQ0FBQ3dXLGdCQUFOLEdBQXlCOVcsTUFBTSxDQUFDK0ksT0FBUCxDQUFlbEYsY0FBZixDQUF6QjtJQUNBdkQsS0FBSyxDQUFDeVcsZ0JBQU4sR0FBeUIvVyxNQUFNLENBQUMrSSxPQUFQLENBQWVsRixjQUFmLENBQXpCO0lBQ0F2RCxLQUFLLENBQUMwVyxzQkFBTixHQUErQmhYLE1BQU0sQ0FBQytJLE9BQVAsQ0FBZWxGLGNBQWYsQ0FBL0I7SUFDQXZELEtBQUssQ0FBQzJXLGNBQU4sR0FBdUJqWCxNQUFNLENBQUMrSSxPQUFQLENBQWVwRSxxQkFBZixDQUF2QjtJQUNBckUsS0FBSyxDQUFDNFcsZ0JBQU4sR0FBeUJsWCxNQUFNLENBQUMrSSxPQUFQLENBQWVwRSxxQkFBZixDQUF6QjtJQUNBckUsS0FBSyxDQUFDNlcsT0FBTixHQUFnQixJQUFJblgsTUFBTSxDQUFDc1IsTUFBWCxFQUFoQjs7SUFDQWhSLEtBQUssQ0FBQzBLLFlBQU4sR0FBcUIsVUFBVW9NLE1BQVYsRUFBa0I7TUFDbkM5VyxLQUFLLENBQUM4VyxNQUFOLEdBQWVBLE1BQWY7O01BQ0EsSUFBSUEsTUFBSixFQUFZO1FBQ1I5VyxLQUFLLENBQUNXLE9BQU4sQ0FBY29XLDRCQUFkLENBQTJDL1csS0FBM0MsRUFBa0Q7VUFDOUMySyxFQUFFLEVBQUVtTSxNQUQwQztVQUU5Q0UsaUJBQWlCLEVBQUVoWCxLQUFLLENBQUNVLEtBQU4sQ0FBWXNXO1FBRmUsQ0FBbEQ7TUFJSCxDQUxELE1BTUs7UUFDRGhYLEtBQUssQ0FBQ1csT0FBTixDQUFjc1csOEJBQWQsQ0FBNkNqWCxLQUE3QztNQUNIO0lBQ0osQ0FYRDs7SUFZQSxPQUFPQSxLQUFQO0VBQ0g7O0VBQ0RzVyxLQUFLLENBQUNqVyxTQUFOLENBQWdCcUUsTUFBaEIsR0FBeUIsWUFBWTtJQUNqQyxJQUFJMUUsS0FBSyxHQUFHLElBQVo7O0lBQ0EsSUFBSVUsS0FBSyxHQUFHLEtBQUtBLEtBQWpCO0lBQ0EsSUFBSXFFLFdBQVcsR0FBR3JFLEtBQUssQ0FBQ3FFLFdBQXhCO0lBQUEsSUFBcUNpSCxlQUFlLEdBQUd0TCxLQUFLLENBQUNzTCxlQUE3RDtJQUFBLElBQThFRCxZQUFZLEdBQUdyTCxLQUFLLENBQUNxTCxZQUFuRztJQUFBLElBQWlIbUwsVUFBVSxHQUFHeFcsS0FBSyxDQUFDd1csVUFBcEk7SUFDQSxJQUFJelQsTUFBTSxHQUFHL0MsS0FBSyxDQUFDMEwsS0FBTixDQUFZdEksTUFBekI7SUFDQSxJQUFJcVQscUJBQXFCLEdBQUcsS0FBS1oscUJBQUwsQ0FBMkI3VixLQUFLLENBQUM0USxnQkFBakMsRUFBbUQ3TixNQUFuRCxDQUE1QjtJQUNBLElBQUkyVCxnQkFBZ0IsR0FBRyxLQUFLWixnQkFBTCxDQUFzQjlWLEtBQUssQ0FBQzhRLFdBQTVCLEVBQXlDL04sTUFBekMsQ0FBdkI7SUFDQSxJQUFJNFQsZ0JBQWdCLEdBQUcsS0FBS1osZ0JBQUwsQ0FBc0IvVixLQUFLLENBQUNvUixXQUE1QixFQUF5Q3JPLE1BQXpDLENBQXZCO0lBQ0EsSUFBSTZULHNCQUFzQixHQUFHLEtBQUtaLHNCQUFMLENBQTRCaFcsS0FBSyxDQUFDd1MsaUJBQWxDLEVBQXFEelAsTUFBckQsQ0FBN0I7SUFDQSxJQUFJOFQsY0FBYyxHQUFHLEtBQUtaLGNBQUwsQ0FBb0JqVyxLQUFLLENBQUM0SSxTQUExQixFQUFxQzdGLE1BQXJDLENBQXJCO0lBQ0EsSUFBSStULGdCQUFnQixHQUFHLEtBQUtaLGdCQUFMLENBQXNCbFcsS0FBSyxDQUFDNkksV0FBNUIsRUFBeUM5RixNQUF6QyxDQUF2QjtJQUNBLElBQUlnVSxnQkFBZ0IsR0FBRzFMLFlBQVksS0FBSyxJQUFqQixJQUF5QkMsZUFBZSxLQUFLLElBQXBFLENBWGlDLENBWWpDO0lBQ0E7O0lBQ0EsSUFBSXlMLGdCQUFnQixJQUFJLENBQUNQLFVBQXpCLEVBQXFDO01BQ2pDTyxnQkFBZ0IsR0FBRyxLQUFuQjtNQUNBekwsZUFBZSxHQUFHLElBQWxCO01BQ0FELFlBQVksR0FBRyxJQUFmO0lBQ0g7O0lBQ0QsSUFBSWpLLFVBQVUsR0FBRyxDQUNiLGlCQURhLEVBRWIyVixnQkFBZ0IsR0FBRywwQkFBSCxHQUFnQyw0QkFGbkMsRUFHYlAsVUFBVSxHQUFHLEVBQUgsR0FBUSx5QkFITCxDQUdnQztJQUhoQyxDQUFqQjtJQUtBLE9BQVF4WCxNQUFNLENBQUNnQyxhQUFQLENBQXFCLEtBQXJCLEVBQTRCO01BQUVNLFNBQVMsRUFBRUYsVUFBVSxDQUFDSSxJQUFYLENBQWdCLEdBQWhCLENBQWI7TUFBbUNILEdBQUcsRUFBRSxLQUFLMkksWUFBN0M7TUFBMkR4QyxLQUFLLEVBQUU7UUFDOUY7UUFDQTtRQUNBd1AsS0FBSyxFQUFFaFgsS0FBSyxDQUFDMFQsV0FIaUY7UUFJOUYvUSxRQUFRLEVBQUUzQyxLQUFLLENBQUNpWDtNQUo4RTtJQUFsRSxDQUE1QixFQU1KalksTUFBTSxDQUFDZ0MsYUFBUCxDQUFxQmhDLE1BQU0sQ0FBQ2tZLFFBQTVCLEVBQXNDO01BQUVDLElBQUksRUFBRTtJQUFSLENBQXRDLEVBQXVELFVBQVVDLE9BQVYsRUFBbUI5UyxVQUFuQixFQUErQjtNQUFFLE9BQVF0RixNQUFNLENBQUNnQyxhQUFQLENBQXFCaEMsTUFBTSxDQUFDaUcsUUFBNUIsRUFBc0MsSUFBdEMsRUFDNUZqRyxNQUFNLENBQUNnQyxhQUFQLENBQXFCLE9BQXJCLEVBQThCO1FBQUV3SixJQUFJLEVBQUUsY0FBUjtRQUF3QmxKLFNBQVMsRUFBRSwwQkFBbkM7UUFBK0RrRyxLQUFLLEVBQUU7VUFDNUZ3UCxLQUFLLEVBQUVoWCxLQUFLLENBQUMwVCxXQUQrRTtVQUU1Ri9RLFFBQVEsRUFBRTNDLEtBQUssQ0FBQ2lYLGFBRjRFO1VBRzVGekMsTUFBTSxFQUFFZ0MsVUFBVSxHQUFHeFcsS0FBSyxDQUFDcVgsWUFBVCxHQUF3QjtRQUhrRDtNQUF0RSxDQUE5QixFQUtJclgsS0FBSyxDQUFDc1gsWUFMVixFQU1JdFksTUFBTSxDQUFDZ0MsYUFBUCxDQUFxQixPQUFyQixFQUE4QjtRQUFFd0osSUFBSSxFQUFFO01BQVIsQ0FBOUIsRUFBd0R4SyxLQUFLLENBQUMwTCxLQUFOLENBQVk1QyxHQUFaLENBQWdCLFVBQVU0QyxLQUFWLEVBQWlCcEksR0FBakIsRUFBc0I7UUFBRSxPQUFRdEUsTUFBTSxDQUFDZ0MsYUFBUCxDQUFxQm9QLFFBQXJCLEVBQStCO1VBQUUvTyxHQUFHLEVBQUUvQixLQUFLLENBQUM2VyxPQUFOLENBQWN6VyxTQUFkLENBQXdCNEQsR0FBeEIsQ0FBUDtVQUFxQzlDLEdBQUcsRUFBRWtMLEtBQUssQ0FBQ3RJLE1BQU4sR0FDdktzSSxLQUFLLENBQUMsQ0FBRCxDQUFMLENBQVN2SCxJQUFULENBQWNvVCxXQUFkO1VBQTRCO1VBRDJJLEVBRXZLalUsR0FGNkgsQ0FFekg7VUFGeUg7VUFHakl3TyxjQUFjLEVBQUUvTyxNQUFNLEdBQUcsQ0FId0c7VUFHckdnUCxlQUFlLEVBQUUvUixLQUFLLENBQUMrUixlQUg4RTtVQUc3RHpOLFVBQVUsRUFBRUEsVUFIaUQ7VUFHckNELFdBQVcsRUFBRUEsV0FId0I7VUFHWHFILEtBQUssRUFBRUEsS0FISTtVQUdHNkYsV0FBVyxFQUFFdlIsS0FBSyxDQUFDd1gsY0FIdEI7VUFHc0M1RyxnQkFBZ0IsRUFBRTZGLHFCQUFxQixDQUFDblQsR0FBRCxDQUg3RTtVQUdvRjRGLGNBQWMsRUFBRWxKLEtBQUssQ0FBQ2tKLGNBSDFHO1VBRzBINEgsV0FBVyxFQUFFNEYsZ0JBQWdCLENBQUNwVCxHQUFELENBQWhCLENBQXNCa00sTUFBdEIsQ0FBNkJpSSxXQUE3QjtVQUEwQztVQUhqTDtVQUc2THJHLFdBQVcsRUFBRXVGLGdCQUFnQixDQUFDclQsR0FBRCxDQUgxTjtVQUdpT2tQLGlCQUFpQixFQUFFb0Usc0JBQXNCLENBQUN0VCxHQUFELENBSDFRO1VBR2lSc0YsU0FBUyxFQUFFaU8sY0FBYyxDQUFDdlQsR0FBRCxDQUgxUztVQUdpVHVGLFdBQVcsRUFBRWlPLGdCQUFnQixDQUFDeFQsR0FBRCxDQUg5VTtVQUdxVitILFlBQVksRUFBRUEsWUFIblc7VUFHaVhDLGVBQWUsRUFBRUEsZUFIbFk7VUFHbVpvSSxXQUFXLEVBQUUxVCxLQUFLLENBQUMwVCxXQUh0YTtVQUdtYjJELFlBQVksRUFBRXJYLEtBQUssQ0FBQ3FYLFlBSHZjO1VBR3FkMVYsUUFBUSxFQUFFM0IsS0FBSyxDQUFDMkI7UUFIcmUsQ0FBL0IsQ0FBUjtNQUcyaEIsQ0FIbmtCLENBQXhELENBTkosQ0FENEYsQ0FBUjtJQVVtakIsQ0FWM29CLENBTkksQ0FBUjtFQWlCSCxDQXpDRCxDQXpCeUMsQ0FtRXpDO0VBQ0E7OztFQUNBaVUsS0FBSyxDQUFDalcsU0FBTixDQUFnQitYLFdBQWhCLEdBQThCLFlBQVk7SUFDdEMsS0FBS0MsWUFBTCxHQUFvQixJQUFJM1ksTUFBTSxDQUFDZ1YsYUFBWCxDQUF5QixLQUFLb0MsTUFBOUIsRUFBc0MsS0FBS0QsT0FBTCxDQUFheUIsT0FBYixHQUF1QjlPLEdBQXZCLENBQTJCLFVBQVUrTyxNQUFWLEVBQWtCO01BQUUsT0FBT0EsTUFBTSxDQUFDM0MsVUFBUCxHQUFvQixDQUFwQixDQUFQO0lBQWdDLENBQS9FLENBQXRDLEVBQXdIO0lBQzVJLEtBRG9CLEVBQ2IsSUFEYSxDQUFwQjtJQUVBLEtBQUs0QyxZQUFMLEdBQW9CLElBQUk5WSxNQUFNLENBQUNnVixhQUFYLENBQXlCLEtBQUtvQyxNQUE5QixFQUFzQyxLQUFLRCxPQUFMLENBQWF2QyxVQUFiLENBQXdCLENBQXhCLEVBQTJCc0IsVUFBM0IsRUFBdEMsRUFBK0U7SUFDbkcsSUFEb0IsRUFDZDtJQUNOLEtBRm9CLENBQXBCO0VBR0gsQ0FORDs7RUFPQVUsS0FBSyxDQUFDalcsU0FBTixDQUFnQm9ZLFFBQWhCLEdBQTJCLFVBQVVDLFlBQVYsRUFBd0JDLFdBQXhCLEVBQXFDO0lBQzVELElBQUlsWSxFQUFFLEdBQUcsSUFBVDtJQUFBLElBQWUrWCxZQUFZLEdBQUcvWCxFQUFFLENBQUMrWCxZQUFqQztJQUFBLElBQStDSCxZQUFZLEdBQUc1WCxFQUFFLENBQUM0WCxZQUFqRTs7SUFDQSxJQUFJdEssR0FBRyxHQUFHeUssWUFBWSxDQUFDSSxXQUFiLENBQXlCRixZQUF6QixDQUFWO0lBQ0EsSUFBSTFVLEdBQUcsR0FBR3FVLFlBQVksQ0FBQ1EsVUFBYixDQUF3QkYsV0FBeEIsQ0FBVjs7SUFDQSxJQUFJM1UsR0FBRyxJQUFJLElBQVAsSUFBZStKLEdBQUcsSUFBSSxJQUExQixFQUFnQztNQUM1QixJQUFJbUUsSUFBSSxHQUFHLEtBQUt4UixLQUFMLENBQVcwTCxLQUFYLENBQWlCcEksR0FBakIsRUFBc0IrSixHQUF0QixDQUFYO01BQ0EsT0FBTztRQUNIaEosV0FBVyxFQUFFLEtBQUtyRSxLQUFMLENBQVdxRSxXQURyQjtRQUVIK1QsUUFBUSxFQUFFbFosS0FBSyxDQUFDNEYsUUFBTixDQUFlO1VBQUU2SixLQUFLLEVBQUUsS0FBSzBKLFlBQUwsQ0FBa0IvVSxHQUFsQixFQUF1QitKLEdBQXZCLENBQVQ7VUFBc0N2SCxNQUFNLEVBQUU7UUFBOUMsQ0FBZixFQUFxRTBMLElBQUksQ0FBQy9JLGFBQTFFLENBRlA7UUFHSDZQLEtBQUssRUFBRSxLQUFLQyxTQUFMLENBQWVqVixHQUFmLEVBQW9CK0osR0FBcEIsQ0FISjtRQUlIYSxJQUFJLEVBQUU7VUFDRjJFLElBQUksRUFBRWlGLFlBQVksQ0FBQzlFLEtBQWIsQ0FBbUIzRixHQUFuQixDQURKO1VBRUZ5RixLQUFLLEVBQUVnRixZQUFZLENBQUM3RSxNQUFiLENBQW9CNUYsR0FBcEIsQ0FGTDtVQUdGNkYsR0FBRyxFQUFFeUUsWUFBWSxDQUFDYSxJQUFiLENBQWtCbFYsR0FBbEIsQ0FISDtVQUlGMlIsTUFBTSxFQUFFMEMsWUFBWSxDQUFDYyxPQUFiLENBQXFCblYsR0FBckI7UUFKTixDQUpIO1FBVUhvVixLQUFLLEVBQUU7TUFWSixDQUFQO0lBWUg7O0lBQ0QsT0FBTyxJQUFQO0VBQ0gsQ0FwQkQ7O0VBcUJBOUMsS0FBSyxDQUFDalcsU0FBTixDQUFnQjRZLFNBQWhCLEdBQTRCLFVBQVVqVixHQUFWLEVBQWUrSixHQUFmLEVBQW9CO0lBQzVDLE9BQU8sS0FBSzhJLE9BQUwsQ0FBYXZDLFVBQWIsQ0FBd0J0USxHQUF4QixFQUE2QjRSLFVBQTdCLEdBQTBDN0gsR0FBMUMsQ0FBUCxDQUQ0QyxDQUNXO0VBQzFELENBRkQ7O0VBR0F1SSxLQUFLLENBQUNqVyxTQUFOLENBQWdCMFksWUFBaEIsR0FBK0IsVUFBVS9VLEdBQVYsRUFBZStKLEdBQWYsRUFBb0I7SUFDL0MsSUFBSWYsS0FBSyxHQUFHLEtBQUt0TSxLQUFMLENBQVcwTCxLQUFYLENBQWlCcEksR0FBakIsRUFBc0IrSixHQUF0QixFQUEyQmxKLElBQXZDO0lBQ0EsSUFBSW9JLEdBQUcsR0FBR3ZOLE1BQU0sQ0FBQzhQLE9BQVAsQ0FBZXhDLEtBQWYsRUFBc0IsQ0FBdEIsQ0FBVjtJQUNBLE9BQU87TUFBRUEsS0FBSyxFQUFFQSxLQUFUO01BQWdCQyxHQUFHLEVBQUVBO0lBQXJCLENBQVA7RUFDSCxDQUpEOztFQUtBLE9BQU9xSixLQUFQO0FBQ0gsQ0ExRzBCLENBMEd6QjVXLE1BQU0sQ0FBQzRELGFBMUdrQixDQUEzQjs7QUEyR0EsU0FBUzZVLFdBQVQsQ0FBcUJwVSxHQUFyQixFQUEwQjtFQUN0QixPQUFPQSxHQUFHLENBQUN1QyxVQUFKLENBQWVDLEdBQWYsQ0FBbUJDLE1BQTFCO0FBQ0g7O0FBRUQsSUFBSTZTLGNBQWM7QUFBRztBQUFlLFVBQVV2WixNQUFWLEVBQWtCO0VBQ2xERixLQUFLLENBQUNHLFNBQU4sQ0FBZ0JzWixjQUFoQixFQUFnQ3ZaLE1BQWhDOztFQUNBLFNBQVN1WixjQUFULEdBQTBCO0lBQ3RCLElBQUlyWixLQUFLLEdBQUdGLE1BQU0sS0FBSyxJQUFYLElBQW1CQSxNQUFNLENBQUNHLEtBQVAsQ0FBYSxJQUFiLEVBQW1CQyxTQUFuQixDQUFuQixJQUFvRCxJQUFoRTs7SUFDQUYsS0FBSyxDQUFDc1osa0JBQU4sR0FBMkIsSUFBM0I7SUFDQSxPQUFPdFosS0FBUDtFQUNIOztFQUNEcVosY0FBYyxDQUFDaFosU0FBZixDQUF5QmtaLFVBQXpCLEdBQXNDLFVBQVVDLFNBQVYsRUFBcUJDLGFBQXJCLEVBQW9DO0lBQ3RFLE9BQU9BLGFBQWEsQ0FBQ0YsVUFBZCxDQUF5QkMsU0FBekIsQ0FBUDtFQUNILENBRkQ7O0VBR0EsT0FBT0gsY0FBUDtBQUNILENBWG1DLENBV2xDM1osTUFBTSxDQUFDZ2EsTUFYMkIsQ0FBcEM7O0FBYUEsSUFBSUMsUUFBUTtBQUFHO0FBQWUsVUFBVTdaLE1BQVYsRUFBa0I7RUFDNUNGLEtBQUssQ0FBQ0csU0FBTixDQUFnQjRaLFFBQWhCLEVBQTBCN1osTUFBMUI7O0VBQ0EsU0FBUzZaLFFBQVQsR0FBb0I7SUFDaEIsSUFBSTNaLEtBQUssR0FBR0YsTUFBTSxLQUFLLElBQVgsSUFBbUJBLE1BQU0sQ0FBQ0csS0FBUCxDQUFhLElBQWIsRUFBbUJDLFNBQW5CLENBQW5CLElBQW9ELElBQWhFOztJQUNBRixLQUFLLENBQUM0WixNQUFOLEdBQWUsSUFBSVAsY0FBSixFQUFmO0lBQ0FyWixLQUFLLENBQUM2WixRQUFOLEdBQWlCbmEsTUFBTSxDQUFDVSxTQUFQLEVBQWpCO0lBQ0EsT0FBT0osS0FBUDtFQUNIOztFQUNEMlosUUFBUSxDQUFDdFosU0FBVCxDQUFtQnFFLE1BQW5CLEdBQTRCLFlBQVk7SUFDcEMsSUFBSWpFLEVBQUUsR0FBRyxJQUFUO0lBQUEsSUFBZUMsS0FBSyxHQUFHRCxFQUFFLENBQUNDLEtBQTFCO0lBQUEsSUFBaUNDLE9BQU8sR0FBR0YsRUFBRSxDQUFDRSxPQUE5Qzs7SUFDQSxPQUFRakIsTUFBTSxDQUFDZ0MsYUFBUCxDQUFxQjRVLEtBQXJCLEVBQTRCMVcsS0FBSyxDQUFDNEYsUUFBTixDQUFlO01BQUV6RCxHQUFHLEVBQUUsS0FBSzhYO0lBQVosQ0FBZixFQUF1QyxLQUFLRCxNQUFMLENBQVlFLFVBQVosQ0FBdUJwWixLQUF2QixFQUE4QkEsS0FBSyxDQUFDcUUsV0FBcEMsRUFBaURyRSxLQUFLLENBQUNxWixnQkFBdkQsRUFBeUVwWixPQUF6RSxFQUFrRkQsS0FBSyxDQUFDK1ksYUFBeEYsQ0FBdkMsRUFBK0k7TUFBRTFVLFdBQVcsRUFBRXJFLEtBQUssQ0FBQ3FFLFdBQXJCO01BQWtDcUgsS0FBSyxFQUFFMUwsS0FBSyxDQUFDK1ksYUFBTixDQUFvQnJOLEtBQTdEO01BQW9FNEwsWUFBWSxFQUFFdFgsS0FBSyxDQUFDc1gsWUFBeEY7TUFBc0dMLGFBQWEsRUFBRWpYLEtBQUssQ0FBQ2lYLGFBQTNIO01BQTBJTyxjQUFjLEVBQUV4WCxLQUFLLENBQUN3WCxjQUFoSztNQUFnTG5NLFlBQVksRUFBRXJMLEtBQUssQ0FBQ3FMLFlBQXBNO01BQWtOQyxlQUFlLEVBQUV0TCxLQUFLLENBQUNzTCxlQUF6TztNQUEwUHlHLGVBQWUsRUFBRS9SLEtBQUssQ0FBQytSLGVBQWpSO01BQWtTeUUsVUFBVSxFQUFFeFcsS0FBSyxDQUFDd1csVUFBcFQ7TUFBZ1U4QyxnQkFBZ0IsRUFBRXRaLEtBQUssQ0FBQ3NaLGdCQUF4VjtNQUEwVzVGLFdBQVcsRUFBRTFULEtBQUssQ0FBQzBULFdBQTdYO01BQTBZMkQsWUFBWSxFQUFFclgsS0FBSyxDQUFDcVgsWUFBOVo7TUFBNGExVixRQUFRLEVBQUUzQixLQUFLLENBQUMyQjtJQUE1YixDQUEvSSxDQUE1QixDQUFSO0VBQ0gsQ0FIRDs7RUFJQSxPQUFPc1gsUUFBUDtBQUNILENBYjZCLENBYTVCamEsTUFBTSxDQUFDNEQsYUFicUIsQ0FBOUI7O0FBZUEsSUFBSTJXLFlBQVk7QUFBRztBQUFlLFVBQVVuYSxNQUFWLEVBQWtCO0VBQ2hERixLQUFLLENBQUNHLFNBQU4sQ0FBZ0JrYSxZQUFoQixFQUE4Qm5hLE1BQTlCOztFQUNBLFNBQVNtYSxZQUFULEdBQXdCO0lBQ3BCLElBQUlqYSxLQUFLLEdBQUdGLE1BQU0sS0FBSyxJQUFYLElBQW1CQSxNQUFNLENBQUNHLEtBQVAsQ0FBYSxJQUFiLEVBQW1CQyxTQUFuQixDQUFuQixJQUFvRCxJQUFoRTs7SUFDQUYsS0FBSyxDQUFDa2Esa0JBQU4sR0FBMkJ4YSxNQUFNLENBQUMrSSxPQUFQLENBQWV5UixrQkFBZixDQUEzQjtJQUNBbGEsS0FBSyxDQUFDbWEsU0FBTixHQUFrQnphLE1BQU0sQ0FBQ1UsU0FBUCxFQUFsQjtJQUNBSixLQUFLLENBQUM2WixRQUFOLEdBQWlCbmEsTUFBTSxDQUFDVSxTQUFQLEVBQWpCO0lBQ0EsT0FBT0osS0FBUDtFQUNIOztFQUNEaWEsWUFBWSxDQUFDNVosU0FBYixDQUF1QnFFLE1BQXZCLEdBQWdDLFlBQVk7SUFDeEMsSUFBSTFFLEtBQUssR0FBRyxJQUFaOztJQUNBLElBQUlTLEVBQUUsR0FBRyxLQUFLRSxPQUFkO0lBQUEsSUFBdUJJLE9BQU8sR0FBR04sRUFBRSxDQUFDTSxPQUFwQztJQUFBLElBQTZDcVosb0JBQW9CLEdBQUczWixFQUFFLENBQUMyWixvQkFBdkU7SUFDQSxJQUFJMVosS0FBSyxHQUFHLEtBQUtBLEtBQWpCO0lBQ0EsSUFBSStZLGFBQWEsR0FBRyxLQUFLUyxrQkFBTCxDQUF3QnhaLEtBQUssQ0FBQ3FFLFdBQTlCLEVBQTJDcVYsb0JBQTNDLENBQXBCO0lBQ0EsSUFBSUMsYUFBYSxHQUFHdFosT0FBTyxDQUFDdVosVUFBUixJQUF1QjVhLE1BQU0sQ0FBQ2dDLGFBQVAsQ0FBcUJoQyxNQUFNLENBQUM2YSxTQUE1QixFQUF1QztNQUFFeFksR0FBRyxFQUFFLEtBQUtvWSxTQUFaO01BQXVCcFYsV0FBVyxFQUFFckUsS0FBSyxDQUFDcUUsV0FBMUM7TUFBdUR5VixLQUFLLEVBQUVmLGFBQWEsQ0FBQ2dCLFdBQTVFO01BQXlGQyxvQkFBb0IsRUFBRWpCLGFBQWEsQ0FBQ2hXLE1BQWQsS0FBeUI7SUFBeEksQ0FBdkMsQ0FBM0M7O0lBQ0EsSUFBSWpELFdBQVcsR0FBRyxTQUFkQSxXQUFjLENBQVVtYSxVQUFWLEVBQXNCO01BQUUsT0FBUWpiLE1BQU0sQ0FBQ2dDLGFBQVAsQ0FBcUJpWSxRQUFyQixFQUErQjtRQUFFNVgsR0FBRyxFQUFFL0IsS0FBSyxDQUFDNlosUUFBYjtRQUF1QjlVLFdBQVcsRUFBRXJFLEtBQUssQ0FBQ3FFLFdBQTFDO1FBQXVEMFUsYUFBYSxFQUFFQSxhQUF0RTtRQUFxRm1CLGFBQWEsRUFBRWxhLEtBQUssQ0FBQ2thLGFBQTFHO1FBQXlIQyxhQUFhLEVBQUVuYSxLQUFLLENBQUNtYSxhQUE5STtRQUE2SkMsVUFBVSxFQUFFcGEsS0FBSyxDQUFDb2EsVUFBL0s7UUFBMkxDLFlBQVksRUFBRXJhLEtBQUssQ0FBQ3FhLFlBQS9NO1FBQTZOblIsY0FBYyxFQUFFbEosS0FBSyxDQUFDa0osY0FBblA7UUFBbVFOLFNBQVMsRUFBRTVJLEtBQUssQ0FBQzRJLFNBQXBSO1FBQStSQyxXQUFXLEVBQUU3SSxLQUFLLENBQUM2SSxXQUFsVDtRQUErVHdRLGdCQUFnQixFQUFFaFosT0FBTyxDQUFDZ1osZ0JBQXpWO1FBQTJXL0IsWUFBWSxFQUFFMkMsVUFBVSxDQUFDSyxpQkFBcFk7UUFBdVpyRCxhQUFhLEVBQUVnRCxVQUFVLENBQUNoRCxhQUFqYjtRQUFnYzVMLFlBQVksRUFBRWhMLE9BQU8sQ0FBQ2dMLFlBQXRkO1FBQW9lQyxlQUFlLEVBQUVqTCxPQUFPLENBQUNpTCxlQUE3ZjtRQUE4Z0J5RyxlQUFlLEVBQUUxUixPQUFPLENBQUNrYSxXQUF2aUI7UUFBb2pCL0QsVUFBVSxFQUFFLENBQUN4VyxLQUFLLENBQUMwQixZQUF2a0I7UUFBcWxCNFgsZ0JBQWdCLEVBQUVoYSxLQUFLLENBQUNHLFdBQTdtQjtRQUEwbkJpVSxXQUFXLEVBQUV1RyxVQUFVLENBQUN2RyxXQUFscEI7UUFBK3BCMkQsWUFBWSxFQUFFNEMsVUFBVSxDQUFDNUMsWUFBeHJCO1FBQXNzQjFWLFFBQVEsRUFBRTNCLEtBQUssQ0FBQzJCO01BQXR0QixDQUEvQixDQUFSO0lBQTR3QixDQUF0ekI7O0lBQ0EsT0FBT3RCLE9BQU8sQ0FBQzJCLFdBQVIsR0FDRCxLQUFLRixtQkFBTCxDQUF5QjZYLGFBQXpCLEVBQXdDN1osV0FBeEMsRUFBcURpWixhQUFhLENBQUNoWCxNQUFuRSxFQUEyRTFCLE9BQU8sQ0FBQzJCLFdBQW5GLENBREMsR0FFRCxLQUFLcEMsa0JBQUwsQ0FBd0IrWixhQUF4QixFQUF1QzdaLFdBQXZDLENBRk47RUFHSCxDQVZEOztFQVdBLE9BQU95WixZQUFQO0FBQ0gsQ0FyQmlDLENBcUJoQ3BhLFNBckJnQyxDQUFsQzs7QUFzQkEsU0FBU3FhLGtCQUFULENBQTRCblYsV0FBNUIsRUFBeUNxVixvQkFBekMsRUFBK0Q7RUFDM0QsSUFBSWMsU0FBUyxHQUFHLElBQUl4YixNQUFNLENBQUN5YixjQUFYLENBQTBCcFcsV0FBVyxDQUFDcVcsV0FBdEMsRUFBbURoQixvQkFBbkQsQ0FBaEI7RUFDQSxPQUFPLElBQUkxYSxNQUFNLENBQUMyYixhQUFYLENBQXlCSCxTQUF6QixFQUFvQyxrQkFBa0JJLElBQWxCLENBQXVCdlcsV0FBVyxDQUFDd1csZ0JBQW5DLENBQXBDLENBQVA7QUFDSDs7QUFFRCxJQUFJQyx5QkFBeUI7QUFBRztBQUFlLFVBQVUxYixNQUFWLEVBQWtCO0VBQzdERixLQUFLLENBQUNHLFNBQU4sQ0FBZ0J5Yix5QkFBaEIsRUFBMkMxYixNQUEzQzs7RUFDQSxTQUFTMGIseUJBQVQsR0FBcUM7SUFDakMsT0FBTzFiLE1BQU0sS0FBSyxJQUFYLElBQW1CQSxNQUFNLENBQUNHLEtBQVAsQ0FBYSxJQUFiLEVBQW1CQyxTQUFuQixDQUFuQixJQUFvRCxJQUEzRDtFQUNILENBSjRELENBSzdEOzs7RUFDQXNiLHlCQUF5QixDQUFDbmIsU0FBMUIsQ0FBb0NvYixnQkFBcEMsR0FBdUQsVUFBVUMsWUFBVixFQUF3QkgsZ0JBQXhCLEVBQTBDSSxhQUExQyxFQUF5RDtJQUM1RyxJQUFJQyxPQUFPLEdBQUcsS0FBS2xiLEtBQUwsQ0FBV2tiLE9BQXpCOztJQUNBLElBQUlSLFdBQVcsR0FBR3RiLE1BQU0sQ0FBQ08sU0FBUCxDQUFpQm9iLGdCQUFqQixDQUFrQzdMLElBQWxDLENBQXVDLElBQXZDLEVBQTZDOEwsWUFBN0MsRUFBMkRILGdCQUEzRCxFQUE2RUksYUFBN0UsQ0FBbEI7O0lBQ0EsSUFBSTNPLEtBQUssR0FBR29PLFdBQVcsQ0FBQ3BPLEtBQXhCO0lBQ0EsSUFBSUMsR0FBRyxHQUFHbU8sV0FBVyxDQUFDbk8sR0FBdEI7SUFDQSxJQUFJNE8sU0FBSixDQUw0RyxDQU01Rzs7SUFDQSxJQUFJLGlCQUFpQlAsSUFBakIsQ0FBc0JDLGdCQUF0QixDQUFKLEVBQTZDO01BQ3pDdk8sS0FBSyxHQUFHNE8sT0FBTyxDQUFDRSxXQUFSLENBQW9COU8sS0FBcEIsQ0FBUixDQUR5QyxDQUV6Qzs7TUFDQTZPLFNBQVMsR0FBR0QsT0FBTyxDQUFDRSxXQUFSLENBQW9CN08sR0FBcEIsQ0FBWjs7TUFDQSxJQUFJNE8sU0FBUyxDQUFDbk0sT0FBVixPQUF3QnpDLEdBQUcsQ0FBQ3lDLE9BQUosRUFBNUIsRUFBMkM7UUFDdkN6QyxHQUFHLEdBQUd2TixNQUFNLENBQUNxYyxRQUFQLENBQWdCRixTQUFoQixFQUEyQixDQUEzQixDQUFOO01BQ0g7SUFDSixDQWQyRyxDQWU1Rzs7O0lBQ0EsSUFBSSxLQUFLbmIsS0FBTCxDQUFXc2IsU0FBWCxJQUNBLEtBQUt0YixLQUFMLENBQVd1YixjQURmLEVBQytCO01BQzNCLElBQUl4WSxNQUFNLEdBQUcwUixJQUFJLENBQUMrRyxJQUFMLEVBQVU7TUFDdkJ4YyxNQUFNLENBQUN5YyxTQUFQLENBQWlCblAsS0FBakIsRUFBd0JDLEdBQXhCLENBRGEsQ0FBYjtNQUVBQSxHQUFHLEdBQUd2TixNQUFNLENBQUNxYyxRQUFQLENBQWdCOU8sR0FBaEIsRUFBcUIsSUFBSXhKLE1BQXpCLENBQU47SUFDSDs7SUFDRCxPQUFPO01BQUV1SixLQUFLLEVBQUVBLEtBQVQ7TUFBZ0JDLEdBQUcsRUFBRUE7SUFBckIsQ0FBUDtFQUNILENBdkJEOztFQXdCQSxPQUFPdU8seUJBQVA7QUFDSCxDQS9COEMsQ0ErQjdDOWIsTUFBTSxDQUFDMGMsb0JBL0JzQyxDQUEvQzs7QUFpQ0EsSUFBSUMsSUFBSSxHQUFHM2MsTUFBTSxDQUFDNGMsWUFBUCxDQUFvQjtFQUMzQkMsV0FBVyxFQUFFLGNBRGM7RUFFM0JDLEtBQUssRUFBRTtJQUNIQyxPQUFPLEVBQUU7TUFDTEMsU0FBUyxFQUFFekMsWUFETjtNQUVMMEMseUJBQXlCLEVBQUVuQjtJQUZ0QixDQUROO0lBS0hvQixVQUFVLEVBQUU7TUFDUjNiLElBQUksRUFBRSxTQURFO01BRVI0YixRQUFRLEVBQUU7UUFBRUMsSUFBSSxFQUFFO01BQVI7SUFGRixDQUxUO0lBU0hDLFdBQVcsRUFBRTtNQUNUOWIsSUFBSSxFQUFFLFNBREc7TUFFVDRiLFFBQVEsRUFBRTtRQUFFRyxLQUFLLEVBQUU7TUFBVDtJQUZELENBVFY7SUFhSEMsWUFBWSxFQUFFO01BQ1ZoYyxJQUFJLEVBQUUsU0FESTtNQUVWNGIsUUFBUSxFQUFFO1FBQUVLLE1BQU0sRUFBRTtNQUFWLENBRkE7TUFHVmxCLFNBQVMsRUFBRSxJQUhEO01BSVZDLGNBQWMsRUFBRTtJQUpOO0VBYlg7QUFGb0IsQ0FBcEIsQ0FBWDtBQXdCQXpjLE9BQU8sQ0FBQzJkLFdBQVIsR0FBc0JsRCxZQUF0QjtBQUNBemEsT0FBTyxDQUFDbWEsUUFBUixHQUFtQkEsUUFBbkI7QUFDQW5hLE9BQU8sQ0FBQzZaLGNBQVIsR0FBeUJBLGNBQXpCO0FBQ0E3WixPQUFPLENBQUM4VyxLQUFSLEdBQWdCQSxLQUFoQjtBQUNBOVcsT0FBTyxDQUFDSyxTQUFSLEdBQW9CQSxTQUFwQjtBQUNBTCxPQUFPLENBQUMwYSxrQkFBUixHQUE2QkEsa0JBQTdCO0FBQ0ExYSxPQUFPLFdBQVAsR0FBa0I2YyxJQUFsQiJ9 },{"@fullcalendar/common":1,"tslib":32}],6:[function(require,module,exports){ /*! FullCalendar v5.11.2 Docs & License: https://fullcalendar.io/ (c) 2022 Adam Shaw */ 'use strict'; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } Object.defineProperty(exports, '__esModule', { value: true }); var common = require('@fullcalendar/common'); var tslib = require('tslib'); common.config.touchMouseIgnoreWait = 500; var ignoreMouseDepth = 0; var listenerCnt = 0; var isWindowTouchMoveCancelled = false; /* Uses a "pointer" abstraction, which monitors UI events for both mouse and touch. Tracks when the pointer "drags" on a certain element, meaning down+move+up. Also, tracks if there was touch-scrolling. Also, can prevent touch-scrolling from happening. Also, can fire pointermove events when scrolling happens underneath, even when no real pointer movement. emits: - pointerdown - pointermove - pointerup */ var PointerDragging = /** @class */ function () { function PointerDragging(containerEl) { var _this = this; this.subjectEl = null; // options that can be directly assigned by caller this.selector = ''; // will cause subjectEl in all emitted events to be this element this.handleSelector = ''; this.shouldIgnoreMove = false; this.shouldWatchScroll = true; // for simulating pointermove on scroll // internal states this.isDragging = false; this.isTouchDragging = false; this.wasTouchScroll = false; // Mouse // ---------------------------------------------------------------------------------------------------- this.handleMouseDown = function (ev) { if (!_this.shouldIgnoreMouse() && isPrimaryMouseButton(ev) && _this.tryStart(ev)) { var pev = _this.createEventFromMouse(ev, true); _this.emitter.trigger('pointerdown', pev); _this.initScrollWatch(pev); if (!_this.shouldIgnoreMove) { document.addEventListener('mousemove', _this.handleMouseMove); } document.addEventListener('mouseup', _this.handleMouseUp); } }; this.handleMouseMove = function (ev) { var pev = _this.createEventFromMouse(ev); _this.recordCoords(pev); _this.emitter.trigger('pointermove', pev); }; this.handleMouseUp = function (ev) { document.removeEventListener('mousemove', _this.handleMouseMove); document.removeEventListener('mouseup', _this.handleMouseUp); _this.emitter.trigger('pointerup', _this.createEventFromMouse(ev)); _this.cleanup(); // call last so that pointerup has access to props }; // Touch // ---------------------------------------------------------------------------------------------------- this.handleTouchStart = function (ev) { if (_this.tryStart(ev)) { _this.isTouchDragging = true; var pev = _this.createEventFromTouch(ev, true); _this.emitter.trigger('pointerdown', pev); _this.initScrollWatch(pev); // unlike mouse, need to attach to target, not document // https://stackoverflow.com/a/45760014 var targetEl = ev.target; if (!_this.shouldIgnoreMove) { targetEl.addEventListener('touchmove', _this.handleTouchMove); } targetEl.addEventListener('touchend', _this.handleTouchEnd); targetEl.addEventListener('touchcancel', _this.handleTouchEnd); // treat it as a touch end // attach a handler to get called when ANY scroll action happens on the page. // this was impossible to do with normal on/off because 'scroll' doesn't bubble. // http://stackoverflow.com/a/32954565/96342 window.addEventListener('scroll', _this.handleTouchScroll, true); } }; this.handleTouchMove = function (ev) { var pev = _this.createEventFromTouch(ev); _this.recordCoords(pev); _this.emitter.trigger('pointermove', pev); }; this.handleTouchEnd = function (ev) { if (_this.isDragging) { // done to guard against touchend followed by touchcancel var targetEl = ev.target; targetEl.removeEventListener('touchmove', _this.handleTouchMove); targetEl.removeEventListener('touchend', _this.handleTouchEnd); targetEl.removeEventListener('touchcancel', _this.handleTouchEnd); window.removeEventListener('scroll', _this.handleTouchScroll, true); // useCaptured=true _this.emitter.trigger('pointerup', _this.createEventFromTouch(ev)); _this.cleanup(); // call last so that pointerup has access to props _this.isTouchDragging = false; startIgnoringMouse(); } }; this.handleTouchScroll = function () { _this.wasTouchScroll = true; }; this.handleScroll = function (ev) { if (!_this.shouldIgnoreMove) { var pageX = window.pageXOffset - _this.prevScrollX + _this.prevPageX; var pageY = window.pageYOffset - _this.prevScrollY + _this.prevPageY; _this.emitter.trigger('pointermove', { origEvent: ev, isTouch: _this.isTouchDragging, subjectEl: _this.subjectEl, pageX: pageX, pageY: pageY, deltaX: pageX - _this.origPageX, deltaY: pageY - _this.origPageY }); } }; this.containerEl = containerEl; this.emitter = new common.Emitter(); containerEl.addEventListener('mousedown', this.handleMouseDown); containerEl.addEventListener('touchstart', this.handleTouchStart, { passive: true }); listenerCreated(); } PointerDragging.prototype.destroy = function () { this.containerEl.removeEventListener('mousedown', this.handleMouseDown); this.containerEl.removeEventListener('touchstart', this.handleTouchStart, { passive: true }); listenerDestroyed(); }; PointerDragging.prototype.tryStart = function (ev) { var subjectEl = this.querySubjectEl(ev); var downEl = ev.target; if (subjectEl && (!this.handleSelector || common.elementClosest(downEl, this.handleSelector))) { this.subjectEl = subjectEl; this.isDragging = true; // do this first so cancelTouchScroll will work this.wasTouchScroll = false; return true; } return false; }; PointerDragging.prototype.cleanup = function () { isWindowTouchMoveCancelled = false; this.isDragging = false; this.subjectEl = null; // keep wasTouchScroll around for later access this.destroyScrollWatch(); }; PointerDragging.prototype.querySubjectEl = function (ev) { if (this.selector) { return common.elementClosest(ev.target, this.selector); } return this.containerEl; }; PointerDragging.prototype.shouldIgnoreMouse = function () { return ignoreMouseDepth || this.isTouchDragging; }; // can be called by user of this class, to cancel touch-based scrolling for the current drag PointerDragging.prototype.cancelTouchScroll = function () { if (this.isDragging) { isWindowTouchMoveCancelled = true; } }; // Scrolling that simulates pointermoves // ---------------------------------------------------------------------------------------------------- PointerDragging.prototype.initScrollWatch = function (ev) { if (this.shouldWatchScroll) { this.recordCoords(ev); window.addEventListener('scroll', this.handleScroll, true); // useCapture=true } }; PointerDragging.prototype.recordCoords = function (ev) { if (this.shouldWatchScroll) { this.prevPageX = ev.pageX; this.prevPageY = ev.pageY; this.prevScrollX = window.pageXOffset; this.prevScrollY = window.pageYOffset; } }; PointerDragging.prototype.destroyScrollWatch = function () { if (this.shouldWatchScroll) { window.removeEventListener('scroll', this.handleScroll, true); // useCaptured=true } }; // Event Normalization // ---------------------------------------------------------------------------------------------------- PointerDragging.prototype.createEventFromMouse = function (ev, isFirst) { var deltaX = 0; var deltaY = 0; // TODO: repeat code if (isFirst) { this.origPageX = ev.pageX; this.origPageY = ev.pageY; } else { deltaX = ev.pageX - this.origPageX; deltaY = ev.pageY - this.origPageY; } return { origEvent: ev, isTouch: false, subjectEl: this.subjectEl, pageX: ev.pageX, pageY: ev.pageY, deltaX: deltaX, deltaY: deltaY }; }; PointerDragging.prototype.createEventFromTouch = function (ev, isFirst) { var touches = ev.touches; var pageX; var pageY; var deltaX = 0; var deltaY = 0; // if touch coords available, prefer, // because FF would give bad ev.pageX ev.pageY if (touches && touches.length) { pageX = touches[0].pageX; pageY = touches[0].pageY; } else { pageX = ev.pageX; pageY = ev.pageY; } // TODO: repeat code if (isFirst) { this.origPageX = pageX; this.origPageY = pageY; } else { deltaX = pageX - this.origPageX; deltaY = pageY - this.origPageY; } return { origEvent: ev, isTouch: true, subjectEl: this.subjectEl, pageX: pageX, pageY: pageY, deltaX: deltaX, deltaY: deltaY }; }; return PointerDragging; }(); // Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac) function isPrimaryMouseButton(ev) { return ev.button === 0 && !ev.ctrlKey; } // Ignoring fake mouse events generated by touch // ---------------------------------------------------------------------------------------------------- function startIgnoringMouse() { ignoreMouseDepth += 1; setTimeout(function () { ignoreMouseDepth -= 1; }, common.config.touchMouseIgnoreWait); } // We want to attach touchmove as early as possible for Safari // ---------------------------------------------------------------------------------------------------- function listenerCreated() { listenerCnt += 1; if (listenerCnt === 1) { window.addEventListener('touchmove', onWindowTouchMove, { passive: false }); } } function listenerDestroyed() { listenerCnt -= 1; if (!listenerCnt) { window.removeEventListener('touchmove', onWindowTouchMove, { passive: false }); } } function onWindowTouchMove(ev) { if (isWindowTouchMoveCancelled) { ev.preventDefault(); } } /* An effect in which an element follows the movement of a pointer across the screen. The moving element is a clone of some other element. Must call start + handleMove + stop. */ var ElementMirror = /** @class */ function () { function ElementMirror() { this.isVisible = false; // must be explicitly enabled this.sourceEl = null; this.mirrorEl = null; this.sourceElRect = null; // screen coords relative to viewport // options that can be set directly by caller this.parentNode = document.body; // HIGHLY SUGGESTED to set this to sidestep ShadowDOM issues this.zIndex = 9999; this.revertDuration = 0; } ElementMirror.prototype.start = function (sourceEl, pageX, pageY) { this.sourceEl = sourceEl; this.sourceElRect = this.sourceEl.getBoundingClientRect(); this.origScreenX = pageX - window.pageXOffset; this.origScreenY = pageY - window.pageYOffset; this.deltaX = 0; this.deltaY = 0; this.updateElPosition(); }; ElementMirror.prototype.handleMove = function (pageX, pageY) { this.deltaX = pageX - window.pageXOffset - this.origScreenX; this.deltaY = pageY - window.pageYOffset - this.origScreenY; this.updateElPosition(); }; // can be called before start ElementMirror.prototype.setIsVisible = function (bool) { if (bool) { if (!this.isVisible) { if (this.mirrorEl) { this.mirrorEl.style.display = ''; } this.isVisible = bool; // needs to happen before updateElPosition this.updateElPosition(); // because was not updating the position while invisible } } else if (this.isVisible) { if (this.mirrorEl) { this.mirrorEl.style.display = 'none'; } this.isVisible = bool; } }; // always async ElementMirror.prototype.stop = function (needsRevertAnimation, callback) { var _this = this; var done = function done() { _this.cleanup(); callback(); }; if (needsRevertAnimation && this.mirrorEl && this.isVisible && this.revertDuration && ( // if 0, transition won't work this.deltaX || this.deltaY) // if same coords, transition won't work ) { this.doRevertAnimation(done, this.revertDuration); } else { setTimeout(done, 0); } }; ElementMirror.prototype.doRevertAnimation = function (callback, revertDuration) { var mirrorEl = this.mirrorEl; var finalSourceElRect = this.sourceEl.getBoundingClientRect(); // because autoscrolling might have happened mirrorEl.style.transition = 'top ' + revertDuration + 'ms,' + 'left ' + revertDuration + 'ms'; common.applyStyle(mirrorEl, { left: finalSourceElRect.left, top: finalSourceElRect.top }); common.whenTransitionDone(mirrorEl, function () { mirrorEl.style.transition = ''; callback(); }); }; ElementMirror.prototype.cleanup = function () { if (this.mirrorEl) { common.removeElement(this.mirrorEl); this.mirrorEl = null; } this.sourceEl = null; }; ElementMirror.prototype.updateElPosition = function () { if (this.sourceEl && this.isVisible) { common.applyStyle(this.getMirrorEl(), { left: this.sourceElRect.left + this.deltaX, top: this.sourceElRect.top + this.deltaY }); } }; ElementMirror.prototype.getMirrorEl = function () { var sourceElRect = this.sourceElRect; var mirrorEl = this.mirrorEl; if (!mirrorEl) { mirrorEl = this.mirrorEl = this.sourceEl.cloneNode(true); // cloneChildren=true // we don't want long taps or any mouse interaction causing selection/menus. // would use preventSelection(), but that prevents selectstart, causing problems. mirrorEl.classList.add('fc-unselectable'); mirrorEl.classList.add('fc-event-dragging'); common.applyStyle(mirrorEl, { position: 'fixed', zIndex: this.zIndex, visibility: '', boxSizing: 'border-box', width: sourceElRect.right - sourceElRect.left, height: sourceElRect.bottom - sourceElRect.top, right: 'auto', bottom: 'auto', margin: 0 }); this.parentNode.appendChild(mirrorEl); } return mirrorEl; }; return ElementMirror; }(); /* Is a cache for a given element's scroll information (all the info that ScrollController stores) in addition the "client rectangle" of the element.. the area within the scrollbars. The cache can be in one of two modes: - doesListening:false - ignores when the container is scrolled by someone else - doesListening:true - watch for scrolling and update the cache */ var ScrollGeomCache = /** @class */ function (_super) { tslib.__extends(ScrollGeomCache, _super); function ScrollGeomCache(scrollController, doesListening) { var _this = _super.call(this) || this; _this.handleScroll = function () { _this.scrollTop = _this.scrollController.getScrollTop(); _this.scrollLeft = _this.scrollController.getScrollLeft(); _this.handleScrollChange(); }; _this.scrollController = scrollController; _this.doesListening = doesListening; _this.scrollTop = _this.origScrollTop = scrollController.getScrollTop(); _this.scrollLeft = _this.origScrollLeft = scrollController.getScrollLeft(); _this.scrollWidth = scrollController.getScrollWidth(); _this.scrollHeight = scrollController.getScrollHeight(); _this.clientWidth = scrollController.getClientWidth(); _this.clientHeight = scrollController.getClientHeight(); _this.clientRect = _this.computeClientRect(); // do last in case it needs cached values if (_this.doesListening) { _this.getEventTarget().addEventListener('scroll', _this.handleScroll); } return _this; } ScrollGeomCache.prototype.destroy = function () { if (this.doesListening) { this.getEventTarget().removeEventListener('scroll', this.handleScroll); } }; ScrollGeomCache.prototype.getScrollTop = function () { return this.scrollTop; }; ScrollGeomCache.prototype.getScrollLeft = function () { return this.scrollLeft; }; ScrollGeomCache.prototype.setScrollTop = function (top) { this.scrollController.setScrollTop(top); if (!this.doesListening) { // we are not relying on the element to normalize out-of-bounds scroll values // so we need to sanitize ourselves this.scrollTop = Math.max(Math.min(top, this.getMaxScrollTop()), 0); this.handleScrollChange(); } }; ScrollGeomCache.prototype.setScrollLeft = function (top) { this.scrollController.setScrollLeft(top); if (!this.doesListening) { // we are not relying on the element to normalize out-of-bounds scroll values // so we need to sanitize ourselves this.scrollLeft = Math.max(Math.min(top, this.getMaxScrollLeft()), 0); this.handleScrollChange(); } }; ScrollGeomCache.prototype.getClientWidth = function () { return this.clientWidth; }; ScrollGeomCache.prototype.getClientHeight = function () { return this.clientHeight; }; ScrollGeomCache.prototype.getScrollWidth = function () { return this.scrollWidth; }; ScrollGeomCache.prototype.getScrollHeight = function () { return this.scrollHeight; }; ScrollGeomCache.prototype.handleScrollChange = function () {}; return ScrollGeomCache; }(common.ScrollController); var ElementScrollGeomCache = /** @class */ function (_super) { tslib.__extends(ElementScrollGeomCache, _super); function ElementScrollGeomCache(el, doesListening) { return _super.call(this, new common.ElementScrollController(el), doesListening) || this; } ElementScrollGeomCache.prototype.getEventTarget = function () { return this.scrollController.el; }; ElementScrollGeomCache.prototype.computeClientRect = function () { return common.computeInnerRect(this.scrollController.el); }; return ElementScrollGeomCache; }(ScrollGeomCache); var WindowScrollGeomCache = /** @class */ function (_super) { tslib.__extends(WindowScrollGeomCache, _super); function WindowScrollGeomCache(doesListening) { return _super.call(this, new common.WindowScrollController(), doesListening) || this; } WindowScrollGeomCache.prototype.getEventTarget = function () { return window; }; WindowScrollGeomCache.prototype.computeClientRect = function () { return { left: this.scrollLeft, right: this.scrollLeft + this.clientWidth, top: this.scrollTop, bottom: this.scrollTop + this.clientHeight }; }; // the window is the only scroll object that changes it's rectangle relative // to the document's topleft as it scrolls WindowScrollGeomCache.prototype.handleScrollChange = function () { this.clientRect = this.computeClientRect(); }; return WindowScrollGeomCache; }(ScrollGeomCache); // If available we are using native "performance" API instead of "Date" // Read more about it on MDN: // https://developer.mozilla.org/en-US/docs/Web/API/Performance var getTime = typeof performance === 'function' ? performance.now : Date.now; /* For a pointer interaction, automatically scrolls certain scroll containers when the pointer approaches the edge. The caller must call start + handleMove + stop. */ var AutoScroller = /** @class */ function () { function AutoScroller() { var _this = this; // options that can be set by caller this.isEnabled = true; this.scrollQuery = [window, '.fc-scroller']; this.edgeThreshold = 50; // pixels this.maxVelocity = 300; // pixels per second // internal state this.pointerScreenX = null; this.pointerScreenY = null; this.isAnimating = false; this.scrollCaches = null; // protect against the initial pointerdown being too close to an edge and starting the scroll this.everMovedUp = false; this.everMovedDown = false; this.everMovedLeft = false; this.everMovedRight = false; this.animate = function () { if (_this.isAnimating) { // wasn't cancelled between animation calls var edge = _this.computeBestEdge(_this.pointerScreenX + window.pageXOffset, _this.pointerScreenY + window.pageYOffset); if (edge) { var now = getTime(); _this.handleSide(edge, (now - _this.msSinceRequest) / 1000); _this.requestAnimation(now); } else { _this.isAnimating = false; // will stop animation } } }; } AutoScroller.prototype.start = function (pageX, pageY, scrollStartEl) { if (this.isEnabled) { this.scrollCaches = this.buildCaches(scrollStartEl); this.pointerScreenX = null; this.pointerScreenY = null; this.everMovedUp = false; this.everMovedDown = false; this.everMovedLeft = false; this.everMovedRight = false; this.handleMove(pageX, pageY); } }; AutoScroller.prototype.handleMove = function (pageX, pageY) { if (this.isEnabled) { var pointerScreenX = pageX - window.pageXOffset; var pointerScreenY = pageY - window.pageYOffset; var yDelta = this.pointerScreenY === null ? 0 : pointerScreenY - this.pointerScreenY; var xDelta = this.pointerScreenX === null ? 0 : pointerScreenX - this.pointerScreenX; if (yDelta < 0) { this.everMovedUp = true; } else if (yDelta > 0) { this.everMovedDown = true; } if (xDelta < 0) { this.everMovedLeft = true; } else if (xDelta > 0) { this.everMovedRight = true; } this.pointerScreenX = pointerScreenX; this.pointerScreenY = pointerScreenY; if (!this.isAnimating) { this.isAnimating = true; this.requestAnimation(getTime()); } } }; AutoScroller.prototype.stop = function () { if (this.isEnabled) { this.isAnimating = false; // will stop animation for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { var scrollCache = _a[_i]; scrollCache.destroy(); } this.scrollCaches = null; } }; AutoScroller.prototype.requestAnimation = function (now) { this.msSinceRequest = now; requestAnimationFrame(this.animate); }; AutoScroller.prototype.handleSide = function (edge, seconds) { var scrollCache = edge.scrollCache; var edgeThreshold = this.edgeThreshold; var invDistance = edgeThreshold - edge.distance; var velocity = // the closer to the edge, the faster we scroll invDistance * invDistance / (edgeThreshold * edgeThreshold) * // quadratic this.maxVelocity * seconds; var sign = 1; switch (edge.name) { case 'left': sign = -1; // falls through case 'right': scrollCache.setScrollLeft(scrollCache.getScrollLeft() + velocity * sign); break; case 'top': sign = -1; // falls through case 'bottom': scrollCache.setScrollTop(scrollCache.getScrollTop() + velocity * sign); break; } }; // left/top are relative to document topleft AutoScroller.prototype.computeBestEdge = function (left, top) { var edgeThreshold = this.edgeThreshold; var bestSide = null; var scrollCaches = this.scrollCaches || []; for (var _i = 0, scrollCaches_1 = scrollCaches; _i < scrollCaches_1.length; _i++) { var scrollCache = scrollCaches_1[_i]; var rect = scrollCache.clientRect; var leftDist = left - rect.left; var rightDist = rect.right - left; var topDist = top - rect.top; var bottomDist = rect.bottom - top; // completely within the rect? if (leftDist >= 0 && rightDist >= 0 && topDist >= 0 && bottomDist >= 0) { if (topDist <= edgeThreshold && this.everMovedUp && scrollCache.canScrollUp() && (!bestSide || bestSide.distance > topDist)) { bestSide = { scrollCache: scrollCache, name: 'top', distance: topDist }; } if (bottomDist <= edgeThreshold && this.everMovedDown && scrollCache.canScrollDown() && (!bestSide || bestSide.distance > bottomDist)) { bestSide = { scrollCache: scrollCache, name: 'bottom', distance: bottomDist }; } if (leftDist <= edgeThreshold && this.everMovedLeft && scrollCache.canScrollLeft() && (!bestSide || bestSide.distance > leftDist)) { bestSide = { scrollCache: scrollCache, name: 'left', distance: leftDist }; } if (rightDist <= edgeThreshold && this.everMovedRight && scrollCache.canScrollRight() && (!bestSide || bestSide.distance > rightDist)) { bestSide = { scrollCache: scrollCache, name: 'right', distance: rightDist }; } } } return bestSide; }; AutoScroller.prototype.buildCaches = function (scrollStartEl) { return this.queryScrollEls(scrollStartEl).map(function (el) { if (el === window) { return new WindowScrollGeomCache(false); // false = don't listen to user-generated scrolls } return new ElementScrollGeomCache(el, false); // false = don't listen to user-generated scrolls }); }; AutoScroller.prototype.queryScrollEls = function (scrollStartEl) { var els = []; for (var _i = 0, _a = this.scrollQuery; _i < _a.length; _i++) { var query = _a[_i]; if (_typeof(query) === 'object') { els.push(query); } else { els.push.apply(els, Array.prototype.slice.call(common.getElRoot(scrollStartEl).querySelectorAll(query))); } } return els; }; return AutoScroller; }(); /* Monitors dragging on an element. Has a number of high-level features: - minimum distance required before dragging - minimum wait time ("delay") before dragging - a mirror element that follows the pointer */ var FeaturefulElementDragging = /** @class */ function (_super) { tslib.__extends(FeaturefulElementDragging, _super); function FeaturefulElementDragging(containerEl, selector) { var _this = _super.call(this, containerEl) || this; _this.containerEl = containerEl; // options that can be directly set by caller // the caller can also set the PointerDragging's options as well _this.delay = null; _this.minDistance = 0; _this.touchScrollAllowed = true; // prevents drag from starting and blocks scrolling during drag _this.mirrorNeedsRevert = false; _this.isInteracting = false; // is the user validly moving the pointer? lasts until pointerup _this.isDragging = false; // is it INTENTFULLY dragging? lasts until after revert animation _this.isDelayEnded = false; _this.isDistanceSurpassed = false; _this.delayTimeoutId = null; _this.onPointerDown = function (ev) { if (!_this.isDragging) { // so new drag doesn't happen while revert animation is going _this.isInteracting = true; _this.isDelayEnded = false; _this.isDistanceSurpassed = false; common.preventSelection(document.body); common.preventContextMenu(document.body); // prevent links from being visited if there's an eventual drag. // also prevents selection in older browsers (maybe?). // not necessary for touch, besides, browser would complain about passiveness. if (!ev.isTouch) { ev.origEvent.preventDefault(); } _this.emitter.trigger('pointerdown', ev); if (_this.isInteracting && // not destroyed via pointerdown handler !_this.pointer.shouldIgnoreMove) { // actions related to initiating dragstart+dragmove+dragend... _this.mirror.setIsVisible(false); // reset. caller must set-visible _this.mirror.start(ev.subjectEl, ev.pageX, ev.pageY); // must happen on first pointer down _this.startDelay(ev); if (!_this.minDistance) { _this.handleDistanceSurpassed(ev); } } } }; _this.onPointerMove = function (ev) { if (_this.isInteracting) { _this.emitter.trigger('pointermove', ev); if (!_this.isDistanceSurpassed) { var minDistance = _this.minDistance; var distanceSq = void 0; // current distance from the origin, squared var deltaX = ev.deltaX, deltaY = ev.deltaY; distanceSq = deltaX * deltaX + deltaY * deltaY; if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem _this.handleDistanceSurpassed(ev); } } if (_this.isDragging) { // a real pointer move? (not one simulated by scrolling) if (ev.origEvent.type !== 'scroll') { _this.mirror.handleMove(ev.pageX, ev.pageY); _this.autoScroller.handleMove(ev.pageX, ev.pageY); } _this.emitter.trigger('dragmove', ev); } } }; _this.onPointerUp = function (ev) { if (_this.isInteracting) { _this.isInteracting = false; common.allowSelection(document.body); common.allowContextMenu(document.body); _this.emitter.trigger('pointerup', ev); // can potentially set mirrorNeedsRevert if (_this.isDragging) { _this.autoScroller.stop(); _this.tryStopDrag(ev); // which will stop the mirror } if (_this.delayTimeoutId) { clearTimeout(_this.delayTimeoutId); _this.delayTimeoutId = null; } } }; var pointer = _this.pointer = new PointerDragging(containerEl); pointer.emitter.on('pointerdown', _this.onPointerDown); pointer.emitter.on('pointermove', _this.onPointerMove); pointer.emitter.on('pointerup', _this.onPointerUp); if (selector) { pointer.selector = selector; } _this.mirror = new ElementMirror(); _this.autoScroller = new AutoScroller(); return _this; } FeaturefulElementDragging.prototype.destroy = function () { this.pointer.destroy(); // HACK: simulate a pointer-up to end the current drag // TODO: fire 'dragend' directly and stop interaction. discourage use of pointerup event (b/c might not fire) this.onPointerUp({}); }; FeaturefulElementDragging.prototype.startDelay = function (ev) { var _this = this; if (typeof this.delay === 'number') { this.delayTimeoutId = setTimeout(function () { _this.delayTimeoutId = null; _this.handleDelayEnd(ev); }, this.delay); // not assignable to number! } else { this.handleDelayEnd(ev); } }; FeaturefulElementDragging.prototype.handleDelayEnd = function (ev) { this.isDelayEnded = true; this.tryStartDrag(ev); }; FeaturefulElementDragging.prototype.handleDistanceSurpassed = function (ev) { this.isDistanceSurpassed = true; this.tryStartDrag(ev); }; FeaturefulElementDragging.prototype.tryStartDrag = function (ev) { if (this.isDelayEnded && this.isDistanceSurpassed) { if (!this.pointer.wasTouchScroll || this.touchScrollAllowed) { this.isDragging = true; this.mirrorNeedsRevert = false; this.autoScroller.start(ev.pageX, ev.pageY, this.containerEl); this.emitter.trigger('dragstart', ev); if (this.touchScrollAllowed === false) { this.pointer.cancelTouchScroll(); } } } }; FeaturefulElementDragging.prototype.tryStopDrag = function (ev) { // .stop() is ALWAYS asynchronous, which we NEED because we want all pointerup events // that come from the document to fire beforehand. much more convenient this way. this.mirror.stop(this.mirrorNeedsRevert, this.stopDrag.bind(this, ev)); }; FeaturefulElementDragging.prototype.stopDrag = function (ev) { this.isDragging = false; this.emitter.trigger('dragend', ev); }; // fill in the implementations... FeaturefulElementDragging.prototype.setIgnoreMove = function (bool) { this.pointer.shouldIgnoreMove = bool; }; FeaturefulElementDragging.prototype.setMirrorIsVisible = function (bool) { this.mirror.setIsVisible(bool); }; FeaturefulElementDragging.prototype.setMirrorNeedsRevert = function (bool) { this.mirrorNeedsRevert = bool; }; FeaturefulElementDragging.prototype.setAutoScrollEnabled = function (bool) { this.autoScroller.isEnabled = bool; }; return FeaturefulElementDragging; }(common.ElementDragging); /* When this class is instantiated, it records the offset of an element (relative to the document topleft), and continues to monitor scrolling, updating the cached coordinates if it needs to. Does not access the DOM after instantiation, so highly performant. Also keeps track of all scrolling/overflow:hidden containers that are parents of the given element and an determine if a given point is inside the combined clipping rectangle. */ var OffsetTracker = /** @class */ function () { function OffsetTracker(el) { this.origRect = common.computeRect(el); // will work fine for divs that have overflow:hidden this.scrollCaches = common.getClippingParents(el).map(function (scrollEl) { return new ElementScrollGeomCache(scrollEl, true); }); } OffsetTracker.prototype.destroy = function () { for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { var scrollCache = _a[_i]; scrollCache.destroy(); } }; OffsetTracker.prototype.computeLeft = function () { var left = this.origRect.left; for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { var scrollCache = _a[_i]; left += scrollCache.origScrollLeft - scrollCache.getScrollLeft(); } return left; }; OffsetTracker.prototype.computeTop = function () { var top = this.origRect.top; for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { var scrollCache = _a[_i]; top += scrollCache.origScrollTop - scrollCache.getScrollTop(); } return top; }; OffsetTracker.prototype.isWithinClipping = function (pageX, pageY) { var point = { left: pageX, top: pageY }; for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { var scrollCache = _a[_i]; if (!isIgnoredClipping(scrollCache.getEventTarget()) && !common.pointInsideRect(point, scrollCache.clientRect)) { return false; } } return true; }; return OffsetTracker; }(); // certain clipping containers should never constrain interactions, like and // https://github.com/fullcalendar/fullcalendar/issues/3615 function isIgnoredClipping(node) { var tagName = node.tagName; return tagName === 'HTML' || tagName === 'BODY'; } /* Tracks movement over multiple droppable areas (aka "hits") that exist in one or more DateComponents. Relies on an existing draggable. emits: - pointerdown - dragstart - hitchange - fires initially, even if not over a hit - pointerup - (hitchange - again, to null, if ended over a hit) - dragend */ var HitDragging = /** @class */ function () { function HitDragging(dragging, droppableStore) { var _this = this; // options that can be set by caller this.useSubjectCenter = false; this.requireInitial = true; // if doesn't start out on a hit, won't emit any events this.initialHit = null; this.movingHit = null; this.finalHit = null; // won't ever be populated if shouldIgnoreMove this.handlePointerDown = function (ev) { var dragging = _this.dragging; _this.initialHit = null; _this.movingHit = null; _this.finalHit = null; _this.prepareHits(); _this.processFirstCoord(ev); if (_this.initialHit || !_this.requireInitial) { dragging.setIgnoreMove(false); // TODO: fire this before computing processFirstCoord, so listeners can cancel. this gets fired by almost every handler :( _this.emitter.trigger('pointerdown', ev); } else { dragging.setIgnoreMove(true); } }; this.handleDragStart = function (ev) { _this.emitter.trigger('dragstart', ev); _this.handleMove(ev, true); // force = fire even if initially null }; this.handleDragMove = function (ev) { _this.emitter.trigger('dragmove', ev); _this.handleMove(ev); }; this.handlePointerUp = function (ev) { _this.releaseHits(); _this.emitter.trigger('pointerup', ev); }; this.handleDragEnd = function (ev) { if (_this.movingHit) { _this.emitter.trigger('hitupdate', null, true, ev); } _this.finalHit = _this.movingHit; _this.movingHit = null; _this.emitter.trigger('dragend', ev); }; this.droppableStore = droppableStore; dragging.emitter.on('pointerdown', this.handlePointerDown); dragging.emitter.on('dragstart', this.handleDragStart); dragging.emitter.on('dragmove', this.handleDragMove); dragging.emitter.on('pointerup', this.handlePointerUp); dragging.emitter.on('dragend', this.handleDragEnd); this.dragging = dragging; this.emitter = new common.Emitter(); } // sets initialHit // sets coordAdjust HitDragging.prototype.processFirstCoord = function (ev) { var origPoint = { left: ev.pageX, top: ev.pageY }; var adjustedPoint = origPoint; var subjectEl = ev.subjectEl; var subjectRect; if (subjectEl instanceof HTMLElement) { // i.e. not a Document/ShadowRoot subjectRect = common.computeRect(subjectEl); adjustedPoint = common.constrainPoint(adjustedPoint, subjectRect); } var initialHit = this.initialHit = this.queryHitForOffset(adjustedPoint.left, adjustedPoint.top); if (initialHit) { if (this.useSubjectCenter && subjectRect) { var slicedSubjectRect = common.intersectRects(subjectRect, initialHit.rect); if (slicedSubjectRect) { adjustedPoint = common.getRectCenter(slicedSubjectRect); } } this.coordAdjust = common.diffPoints(adjustedPoint, origPoint); } else { this.coordAdjust = { left: 0, top: 0 }; } }; HitDragging.prototype.handleMove = function (ev, forceHandle) { var hit = this.queryHitForOffset(ev.pageX + this.coordAdjust.left, ev.pageY + this.coordAdjust.top); if (forceHandle || !isHitsEqual(this.movingHit, hit)) { this.movingHit = hit; this.emitter.trigger('hitupdate', hit, false, ev); } }; HitDragging.prototype.prepareHits = function () { this.offsetTrackers = common.mapHash(this.droppableStore, function (interactionSettings) { interactionSettings.component.prepareHits(); return new OffsetTracker(interactionSettings.el); }); }; HitDragging.prototype.releaseHits = function () { var offsetTrackers = this.offsetTrackers; for (var id in offsetTrackers) { offsetTrackers[id].destroy(); } this.offsetTrackers = {}; }; HitDragging.prototype.queryHitForOffset = function (offsetLeft, offsetTop) { var _a = this, droppableStore = _a.droppableStore, offsetTrackers = _a.offsetTrackers; var bestHit = null; for (var id in droppableStore) { var component = droppableStore[id].component; var offsetTracker = offsetTrackers[id]; if (offsetTracker && // wasn't destroyed mid-drag offsetTracker.isWithinClipping(offsetLeft, offsetTop)) { var originLeft = offsetTracker.computeLeft(); var originTop = offsetTracker.computeTop(); var positionLeft = offsetLeft - originLeft; var positionTop = offsetTop - originTop; var origRect = offsetTracker.origRect; var width = origRect.right - origRect.left; var height = origRect.bottom - origRect.top; if ( // must be within the element's bounds positionLeft >= 0 && positionLeft < width && positionTop >= 0 && positionTop < height) { var hit = component.queryHit(positionLeft, positionTop, width, height); if (hit && // make sure the hit is within activeRange, meaning it's not a dead cell common.rangeContainsRange(hit.dateProfile.activeRange, hit.dateSpan.range) && (!bestHit || hit.layer > bestHit.layer)) { hit.componentId = id; hit.context = component.context; // TODO: better way to re-orient rectangle hit.rect.left += originLeft; hit.rect.right += originLeft; hit.rect.top += originTop; hit.rect.bottom += originTop; bestHit = hit; } } } } return bestHit; }; return HitDragging; }(); function isHitsEqual(hit0, hit1) { if (!hit0 && !hit1) { return true; } if (Boolean(hit0) !== Boolean(hit1)) { return false; } return common.isDateSpansEqual(hit0.dateSpan, hit1.dateSpan); } function buildDatePointApiWithContext(dateSpan, context) { var props = {}; for (var _i = 0, _a = context.pluginHooks.datePointTransforms; _i < _a.length; _i++) { var transform = _a[_i]; tslib.__assign(props, transform(dateSpan, context)); } tslib.__assign(props, buildDatePointApi(dateSpan, context.dateEnv)); return props; } function buildDatePointApi(span, dateEnv) { return { date: dateEnv.toDate(span.range.start), dateStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }), allDay: span.allDay }; } /* Monitors when the user clicks on a specific date/time of a component. A pointerdown+pointerup on the same "hit" constitutes a click. */ var DateClicking = /** @class */ function (_super) { tslib.__extends(DateClicking, _super); function DateClicking(settings) { var _this = _super.call(this, settings) || this; _this.handlePointerDown = function (pev) { var dragging = _this.dragging; var downEl = pev.origEvent.target; // do this in pointerdown (not dragend) because DOM might be mutated by the time dragend is fired dragging.setIgnoreMove(!_this.component.isValidDateDownEl(downEl)); }; // won't even fire if moving was ignored _this.handleDragEnd = function (ev) { var component = _this.component; var pointer = _this.dragging.pointer; if (!pointer.wasTouchScroll) { var _a = _this.hitDragging, initialHit = _a.initialHit, finalHit = _a.finalHit; if (initialHit && finalHit && isHitsEqual(initialHit, finalHit)) { var context = component.context; var arg = tslib.__assign(tslib.__assign({}, buildDatePointApiWithContext(initialHit.dateSpan, context)), { dayEl: initialHit.dayEl, jsEvent: ev.origEvent, view: context.viewApi || context.calendarApi.view }); context.emitter.trigger('dateClick', arg); } } }; // we DO want to watch pointer moves because otherwise finalHit won't get populated _this.dragging = new FeaturefulElementDragging(settings.el); _this.dragging.autoScroller.isEnabled = false; var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, common.interactionSettingsToStore(settings)); hitDragging.emitter.on('pointerdown', _this.handlePointerDown); hitDragging.emitter.on('dragend', _this.handleDragEnd); return _this; } DateClicking.prototype.destroy = function () { this.dragging.destroy(); }; return DateClicking; }(common.Interaction); /* Tracks when the user selects a portion of time of a component, constituted by a drag over date cells, with a possible delay at the beginning of the drag. */ var DateSelecting = /** @class */ function (_super) { tslib.__extends(DateSelecting, _super); function DateSelecting(settings) { var _this = _super.call(this, settings) || this; _this.dragSelection = null; _this.handlePointerDown = function (ev) { var _a = _this, component = _a.component, dragging = _a.dragging; var options = component.context.options; var canSelect = options.selectable && component.isValidDateDownEl(ev.origEvent.target); // don't bother to watch expensive moves if component won't do selection dragging.setIgnoreMove(!canSelect); // if touch, require user to hold down dragging.delay = ev.isTouch ? getComponentTouchDelay$1(component) : null; }; _this.handleDragStart = function (ev) { _this.component.context.calendarApi.unselect(ev); // unselect previous selections }; _this.handleHitUpdate = function (hit, isFinal) { var context = _this.component.context; var dragSelection = null; var isInvalid = false; if (hit) { var initialHit = _this.hitDragging.initialHit; var disallowed = hit.componentId === initialHit.componentId && _this.isHitComboAllowed && !_this.isHitComboAllowed(initialHit, hit); if (!disallowed) { dragSelection = joinHitsIntoSelection(initialHit, hit, context.pluginHooks.dateSelectionTransformers); } if (!dragSelection || !common.isDateSelectionValid(dragSelection, hit.dateProfile, context)) { isInvalid = true; dragSelection = null; } } if (dragSelection) { context.dispatch({ type: 'SELECT_DATES', selection: dragSelection }); } else if (!isFinal) { // only unselect if moved away while dragging context.dispatch({ type: 'UNSELECT_DATES' }); } if (!isInvalid) { common.enableCursor(); } else { common.disableCursor(); } if (!isFinal) { _this.dragSelection = dragSelection; // only clear if moved away from all hits while dragging } }; _this.handlePointerUp = function (pev) { if (_this.dragSelection) { // selection is already rendered, so just need to report selection common.triggerDateSelect(_this.dragSelection, pev, _this.component.context); _this.dragSelection = null; } }; var component = settings.component; var options = component.context.options; var dragging = _this.dragging = new FeaturefulElementDragging(settings.el); dragging.touchScrollAllowed = false; dragging.minDistance = options.selectMinDistance || 0; dragging.autoScroller.isEnabled = options.dragScroll; var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, common.interactionSettingsToStore(settings)); hitDragging.emitter.on('pointerdown', _this.handlePointerDown); hitDragging.emitter.on('dragstart', _this.handleDragStart); hitDragging.emitter.on('hitupdate', _this.handleHitUpdate); hitDragging.emitter.on('pointerup', _this.handlePointerUp); return _this; } DateSelecting.prototype.destroy = function () { this.dragging.destroy(); }; return DateSelecting; }(common.Interaction); function getComponentTouchDelay$1(component) { var options = component.context.options; var delay = options.selectLongPressDelay; if (delay == null) { delay = options.longPressDelay; } return delay; } function joinHitsIntoSelection(hit0, hit1, dateSelectionTransformers) { var dateSpan0 = hit0.dateSpan; var dateSpan1 = hit1.dateSpan; var ms = [dateSpan0.range.start, dateSpan0.range.end, dateSpan1.range.start, dateSpan1.range.end]; ms.sort(common.compareNumbers); var props = {}; for (var _i = 0, dateSelectionTransformers_1 = dateSelectionTransformers; _i < dateSelectionTransformers_1.length; _i++) { var transformer = dateSelectionTransformers_1[_i]; var res = transformer(hit0, hit1); if (res === false) { return null; } if (res) { tslib.__assign(props, res); } } props.range = { start: ms[0], end: ms[3] }; props.allDay = dateSpan0.allDay; return props; } var EventDragging = /** @class */ function (_super) { tslib.__extends(EventDragging, _super); function EventDragging(settings) { var _this = _super.call(this, settings) || this; // internal state _this.subjectEl = null; _this.subjectSeg = null; // the seg being selected/dragged _this.isDragging = false; _this.eventRange = null; _this.relevantEvents = null; // the events being dragged _this.receivingContext = null; _this.validMutation = null; _this.mutatedRelevantEvents = null; _this.handlePointerDown = function (ev) { var origTarget = ev.origEvent.target; var _a = _this, component = _a.component, dragging = _a.dragging; var mirror = dragging.mirror; var options = component.context.options; var initialContext = component.context; _this.subjectEl = ev.subjectEl; var subjectSeg = _this.subjectSeg = common.getElSeg(ev.subjectEl); var eventRange = _this.eventRange = subjectSeg.eventRange; var eventInstanceId = eventRange.instance.instanceId; _this.relevantEvents = common.getRelevantEvents(initialContext.getCurrentData().eventStore, eventInstanceId); dragging.minDistance = ev.isTouch ? 0 : options.eventDragMinDistance; dragging.delay = // only do a touch delay if touch and this event hasn't been selected yet ev.isTouch && eventInstanceId !== component.props.eventSelection ? getComponentTouchDelay(component) : null; if (options.fixedMirrorParent) { mirror.parentNode = options.fixedMirrorParent; } else { mirror.parentNode = common.elementClosest(origTarget, '.fc'); } mirror.revertDuration = options.dragRevertDuration; var isValid = component.isValidSegDownEl(origTarget) && !common.elementClosest(origTarget, '.fc-event-resizer'); // NOT on a resizer dragging.setIgnoreMove(!isValid); // disable dragging for elements that are resizable (ie, selectable) // but are not draggable _this.isDragging = isValid && ev.subjectEl.classList.contains('fc-event-draggable'); }; _this.handleDragStart = function (ev) { var initialContext = _this.component.context; var eventRange = _this.eventRange; var eventInstanceId = eventRange.instance.instanceId; if (ev.isTouch) { // need to select a different event? if (eventInstanceId !== _this.component.props.eventSelection) { initialContext.dispatch({ type: 'SELECT_EVENT', eventInstanceId: eventInstanceId }); } } else { // if now using mouse, but was previous touch interaction, clear selected event initialContext.dispatch({ type: 'UNSELECT_EVENT' }); } if (_this.isDragging) { initialContext.calendarApi.unselect(ev); // unselect *date* selection initialContext.emitter.trigger('eventDragStart', { el: _this.subjectEl, event: new common.EventApi(initialContext, eventRange.def, eventRange.instance), jsEvent: ev.origEvent, view: initialContext.viewApi }); } }; _this.handleHitUpdate = function (hit, isFinal) { if (!_this.isDragging) { return; } var relevantEvents = _this.relevantEvents; var initialHit = _this.hitDragging.initialHit; var initialContext = _this.component.context; // states based on new hit var receivingContext = null; var mutation = null; var mutatedRelevantEvents = null; var isInvalid = false; var interaction = { affectedEvents: relevantEvents, mutatedEvents: common.createEmptyEventStore(), isEvent: true }; if (hit) { receivingContext = hit.context; var receivingOptions = receivingContext.options; if (initialContext === receivingContext || receivingOptions.editable && receivingOptions.droppable) { mutation = computeEventMutation(initialHit, hit, receivingContext.getCurrentData().pluginHooks.eventDragMutationMassagers); if (mutation) { mutatedRelevantEvents = common.applyMutationToEventStore(relevantEvents, receivingContext.getCurrentData().eventUiBases, mutation, receivingContext); interaction.mutatedEvents = mutatedRelevantEvents; if (!common.isInteractionValid(interaction, hit.dateProfile, receivingContext)) { isInvalid = true; mutation = null; mutatedRelevantEvents = null; interaction.mutatedEvents = common.createEmptyEventStore(); } } } else { receivingContext = null; } } _this.displayDrag(receivingContext, interaction); if (!isInvalid) { common.enableCursor(); } else { common.disableCursor(); } if (!isFinal) { if (initialContext === receivingContext && // TODO: write test for this isHitsEqual(initialHit, hit)) { mutation = null; } _this.dragging.setMirrorNeedsRevert(!mutation); // render the mirror if no already-rendered mirror // TODO: wish we could somehow wait for dispatch to guarantee render _this.dragging.setMirrorIsVisible(!hit || !common.getElRoot(_this.subjectEl).querySelector('.fc-event-mirror')); // assign states based on new hit _this.receivingContext = receivingContext; _this.validMutation = mutation; _this.mutatedRelevantEvents = mutatedRelevantEvents; } }; _this.handlePointerUp = function () { if (!_this.isDragging) { _this.cleanup(); // because handleDragEnd won't fire } }; _this.handleDragEnd = function (ev) { if (_this.isDragging) { var initialContext_1 = _this.component.context; var initialView = initialContext_1.viewApi; var _a = _this, receivingContext_1 = _a.receivingContext, validMutation = _a.validMutation; var eventDef = _this.eventRange.def; var eventInstance = _this.eventRange.instance; var eventApi = new common.EventApi(initialContext_1, eventDef, eventInstance); var relevantEvents_1 = _this.relevantEvents; var mutatedRelevantEvents_1 = _this.mutatedRelevantEvents; var finalHit = _this.hitDragging.finalHit; _this.clearDrag(); // must happen after revert animation initialContext_1.emitter.trigger('eventDragStop', { el: _this.subjectEl, event: eventApi, jsEvent: ev.origEvent, view: initialView }); if (validMutation) { // dropped within same calendar if (receivingContext_1 === initialContext_1) { var updatedEventApi = new common.EventApi(initialContext_1, mutatedRelevantEvents_1.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents_1.instances[eventInstance.instanceId] : null); initialContext_1.dispatch({ type: 'MERGE_EVENTS', eventStore: mutatedRelevantEvents_1 }); var eventChangeArg = { oldEvent: eventApi, event: updatedEventApi, relatedEvents: common.buildEventApis(mutatedRelevantEvents_1, initialContext_1, eventInstance), revert: function revert() { initialContext_1.dispatch({ type: 'MERGE_EVENTS', eventStore: relevantEvents_1 // the pre-change data }); } }; var transformed = {}; for (var _i = 0, _b = initialContext_1.getCurrentData().pluginHooks.eventDropTransformers; _i < _b.length; _i++) { var transformer = _b[_i]; tslib.__assign(transformed, transformer(validMutation, initialContext_1)); } initialContext_1.emitter.trigger('eventDrop', tslib.__assign(tslib.__assign(tslib.__assign({}, eventChangeArg), transformed), { el: ev.subjectEl, delta: validMutation.datesDelta, jsEvent: ev.origEvent, view: initialView })); initialContext_1.emitter.trigger('eventChange', eventChangeArg); // dropped in different calendar } else if (receivingContext_1) { var eventRemoveArg = { event: eventApi, relatedEvents: common.buildEventApis(relevantEvents_1, initialContext_1, eventInstance), revert: function revert() { initialContext_1.dispatch({ type: 'MERGE_EVENTS', eventStore: relevantEvents_1 }); } }; initialContext_1.emitter.trigger('eventLeave', tslib.__assign(tslib.__assign({}, eventRemoveArg), { draggedEl: ev.subjectEl, view: initialView })); initialContext_1.dispatch({ type: 'REMOVE_EVENTS', eventStore: relevantEvents_1 }); initialContext_1.emitter.trigger('eventRemove', eventRemoveArg); var addedEventDef = mutatedRelevantEvents_1.defs[eventDef.defId]; var addedEventInstance = mutatedRelevantEvents_1.instances[eventInstance.instanceId]; var addedEventApi = new common.EventApi(receivingContext_1, addedEventDef, addedEventInstance); receivingContext_1.dispatch({ type: 'MERGE_EVENTS', eventStore: mutatedRelevantEvents_1 }); var eventAddArg = { event: addedEventApi, relatedEvents: common.buildEventApis(mutatedRelevantEvents_1, receivingContext_1, addedEventInstance), revert: function revert() { receivingContext_1.dispatch({ type: 'REMOVE_EVENTS', eventStore: mutatedRelevantEvents_1 }); } }; receivingContext_1.emitter.trigger('eventAdd', eventAddArg); if (ev.isTouch) { receivingContext_1.dispatch({ type: 'SELECT_EVENT', eventInstanceId: eventInstance.instanceId }); } receivingContext_1.emitter.trigger('drop', tslib.__assign(tslib.__assign({}, buildDatePointApiWithContext(finalHit.dateSpan, receivingContext_1)), { draggedEl: ev.subjectEl, jsEvent: ev.origEvent, view: finalHit.context.viewApi })); receivingContext_1.emitter.trigger('eventReceive', tslib.__assign(tslib.__assign({}, eventAddArg), { draggedEl: ev.subjectEl, view: finalHit.context.viewApi })); } } else { initialContext_1.emitter.trigger('_noEventDrop'); } } _this.cleanup(); }; var component = _this.component; var options = component.context.options; var dragging = _this.dragging = new FeaturefulElementDragging(settings.el); dragging.pointer.selector = EventDragging.SELECTOR; dragging.touchScrollAllowed = false; dragging.autoScroller.isEnabled = options.dragScroll; var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, common.interactionSettingsStore); hitDragging.useSubjectCenter = settings.useEventCenter; hitDragging.emitter.on('pointerdown', _this.handlePointerDown); hitDragging.emitter.on('dragstart', _this.handleDragStart); hitDragging.emitter.on('hitupdate', _this.handleHitUpdate); hitDragging.emitter.on('pointerup', _this.handlePointerUp); hitDragging.emitter.on('dragend', _this.handleDragEnd); return _this; } EventDragging.prototype.destroy = function () { this.dragging.destroy(); }; // render a drag state on the next receivingCalendar EventDragging.prototype.displayDrag = function (nextContext, state) { var initialContext = this.component.context; var prevContext = this.receivingContext; // does the previous calendar need to be cleared? if (prevContext && prevContext !== nextContext) { // does the initial calendar need to be cleared? // if so, don't clear all the way. we still need to to hide the affectedEvents if (prevContext === initialContext) { prevContext.dispatch({ type: 'SET_EVENT_DRAG', state: { affectedEvents: state.affectedEvents, mutatedEvents: common.createEmptyEventStore(), isEvent: true } }); // completely clear the old calendar if it wasn't the initial } else { prevContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); } } if (nextContext) { nextContext.dispatch({ type: 'SET_EVENT_DRAG', state: state }); } }; EventDragging.prototype.clearDrag = function () { var initialCalendar = this.component.context; var receivingContext = this.receivingContext; if (receivingContext) { receivingContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); } // the initial calendar might have an dummy drag state from displayDrag if (initialCalendar !== receivingContext) { initialCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' }); } }; EventDragging.prototype.cleanup = function () { this.subjectSeg = null; this.isDragging = false; this.eventRange = null; this.relevantEvents = null; this.receivingContext = null; this.validMutation = null; this.mutatedRelevantEvents = null; }; // TODO: test this in IE11 // QUESTION: why do we need it on the resizable??? EventDragging.SELECTOR = '.fc-event-draggable, .fc-event-resizable'; return EventDragging; }(common.Interaction); function computeEventMutation(hit0, hit1, massagers) { var dateSpan0 = hit0.dateSpan; var dateSpan1 = hit1.dateSpan; var date0 = dateSpan0.range.start; var date1 = dateSpan1.range.start; var standardProps = {}; if (dateSpan0.allDay !== dateSpan1.allDay) { standardProps.allDay = dateSpan1.allDay; standardProps.hasEnd = hit1.context.options.allDayMaintainDuration; if (dateSpan1.allDay) { // means date1 is already start-of-day, // but date0 needs to be converted date0 = common.startOfDay(date0); } } var delta = common.diffDates(date0, date1, hit0.context.dateEnv, hit0.componentId === hit1.componentId ? hit0.largeUnit : null); if (delta.milliseconds) { // has hours/minutes/seconds standardProps.allDay = false; } var mutation = { datesDelta: delta, standardProps: standardProps }; for (var _i = 0, massagers_1 = massagers; _i < massagers_1.length; _i++) { var massager = massagers_1[_i]; massager(mutation, hit0, hit1); } return mutation; } function getComponentTouchDelay(component) { var options = component.context.options; var delay = options.eventLongPressDelay; if (delay == null) { delay = options.longPressDelay; } return delay; } var EventResizing = /** @class */ function (_super) { tslib.__extends(EventResizing, _super); function EventResizing(settings) { var _this = _super.call(this, settings) || this; // internal state _this.draggingSegEl = null; _this.draggingSeg = null; // TODO: rename to resizingSeg? subjectSeg? _this.eventRange = null; _this.relevantEvents = null; _this.validMutation = null; _this.mutatedRelevantEvents = null; _this.handlePointerDown = function (ev) { var component = _this.component; var segEl = _this.querySegEl(ev); var seg = common.getElSeg(segEl); var eventRange = _this.eventRange = seg.eventRange; _this.dragging.minDistance = component.context.options.eventDragMinDistance; // if touch, need to be working with a selected event _this.dragging.setIgnoreMove(!_this.component.isValidSegDownEl(ev.origEvent.target) || ev.isTouch && _this.component.props.eventSelection !== eventRange.instance.instanceId); }; _this.handleDragStart = function (ev) { var context = _this.component.context; var eventRange = _this.eventRange; _this.relevantEvents = common.getRelevantEvents(context.getCurrentData().eventStore, _this.eventRange.instance.instanceId); var segEl = _this.querySegEl(ev); _this.draggingSegEl = segEl; _this.draggingSeg = common.getElSeg(segEl); context.calendarApi.unselect(); context.emitter.trigger('eventResizeStart', { el: segEl, event: new common.EventApi(context, eventRange.def, eventRange.instance), jsEvent: ev.origEvent, view: context.viewApi }); }; _this.handleHitUpdate = function (hit, isFinal, ev) { var context = _this.component.context; var relevantEvents = _this.relevantEvents; var initialHit = _this.hitDragging.initialHit; var eventInstance = _this.eventRange.instance; var mutation = null; var mutatedRelevantEvents = null; var isInvalid = false; var interaction = { affectedEvents: relevantEvents, mutatedEvents: common.createEmptyEventStore(), isEvent: true }; if (hit) { var disallowed = hit.componentId === initialHit.componentId && _this.isHitComboAllowed && !_this.isHitComboAllowed(initialHit, hit); if (!disallowed) { mutation = computeMutation(initialHit, hit, ev.subjectEl.classList.contains('fc-event-resizer-start'), eventInstance.range); } } if (mutation) { mutatedRelevantEvents = common.applyMutationToEventStore(relevantEvents, context.getCurrentData().eventUiBases, mutation, context); interaction.mutatedEvents = mutatedRelevantEvents; if (!common.isInteractionValid(interaction, hit.dateProfile, context)) { isInvalid = true; mutation = null; mutatedRelevantEvents = null; interaction.mutatedEvents = null; } } if (mutatedRelevantEvents) { context.dispatch({ type: 'SET_EVENT_RESIZE', state: interaction }); } else { context.dispatch({ type: 'UNSET_EVENT_RESIZE' }); } if (!isInvalid) { common.enableCursor(); } else { common.disableCursor(); } if (!isFinal) { if (mutation && isHitsEqual(initialHit, hit)) { mutation = null; } _this.validMutation = mutation; _this.mutatedRelevantEvents = mutatedRelevantEvents; } }; _this.handleDragEnd = function (ev) { var context = _this.component.context; var eventDef = _this.eventRange.def; var eventInstance = _this.eventRange.instance; var eventApi = new common.EventApi(context, eventDef, eventInstance); var relevantEvents = _this.relevantEvents; var mutatedRelevantEvents = _this.mutatedRelevantEvents; context.emitter.trigger('eventResizeStop', { el: _this.draggingSegEl, event: eventApi, jsEvent: ev.origEvent, view: context.viewApi }); if (_this.validMutation) { var updatedEventApi = new common.EventApi(context, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null); context.dispatch({ type: 'MERGE_EVENTS', eventStore: mutatedRelevantEvents }); var eventChangeArg = { oldEvent: eventApi, event: updatedEventApi, relatedEvents: common.buildEventApis(mutatedRelevantEvents, context, eventInstance), revert: function revert() { context.dispatch({ type: 'MERGE_EVENTS', eventStore: relevantEvents // the pre-change events }); } }; context.emitter.trigger('eventResize', tslib.__assign(tslib.__assign({}, eventChangeArg), { el: _this.draggingSegEl, startDelta: _this.validMutation.startDelta || common.createDuration(0), endDelta: _this.validMutation.endDelta || common.createDuration(0), jsEvent: ev.origEvent, view: context.viewApi })); context.emitter.trigger('eventChange', eventChangeArg); } else { context.emitter.trigger('_noEventResize'); } // reset all internal state _this.draggingSeg = null; _this.relevantEvents = null; _this.validMutation = null; // okay to keep eventInstance around. useful to set it in handlePointerDown }; var component = settings.component; var dragging = _this.dragging = new FeaturefulElementDragging(settings.el); dragging.pointer.selector = '.fc-event-resizer'; dragging.touchScrollAllowed = false; dragging.autoScroller.isEnabled = component.context.options.dragScroll; var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, common.interactionSettingsToStore(settings)); hitDragging.emitter.on('pointerdown', _this.handlePointerDown); hitDragging.emitter.on('dragstart', _this.handleDragStart); hitDragging.emitter.on('hitupdate', _this.handleHitUpdate); hitDragging.emitter.on('dragend', _this.handleDragEnd); return _this; } EventResizing.prototype.destroy = function () { this.dragging.destroy(); }; EventResizing.prototype.querySegEl = function (ev) { return common.elementClosest(ev.subjectEl, '.fc-event'); }; return EventResizing; }(common.Interaction); function computeMutation(hit0, hit1, isFromStart, instanceRange) { var dateEnv = hit0.context.dateEnv; var date0 = hit0.dateSpan.range.start; var date1 = hit1.dateSpan.range.start; var delta = common.diffDates(date0, date1, dateEnv, hit0.largeUnit); if (isFromStart) { if (dateEnv.add(instanceRange.start, delta) < instanceRange.end) { return { startDelta: delta }; } } else if (dateEnv.add(instanceRange.end, delta) > instanceRange.start) { return { endDelta: delta }; } return null; } var UnselectAuto = /** @class */ function () { function UnselectAuto(context) { var _this = this; this.context = context; this.isRecentPointerDateSelect = false; // wish we could use a selector to detect date selection, but uses hit system this.matchesCancel = false; this.matchesEvent = false; this.onSelect = function (selectInfo) { if (selectInfo.jsEvent) { _this.isRecentPointerDateSelect = true; } }; this.onDocumentPointerDown = function (pev) { var unselectCancel = _this.context.options.unselectCancel; var downEl = common.getEventTargetViaRoot(pev.origEvent); _this.matchesCancel = !!common.elementClosest(downEl, unselectCancel); _this.matchesEvent = !!common.elementClosest(downEl, EventDragging.SELECTOR); // interaction started on an event? }; this.onDocumentPointerUp = function (pev) { var context = _this.context; var documentPointer = _this.documentPointer; var calendarState = context.getCurrentData(); // touch-scrolling should never unfocus any type of selection if (!documentPointer.wasTouchScroll) { if (calendarState.dateSelection && // an existing date selection? !_this.isRecentPointerDateSelect // a new pointer-initiated date selection since last onDocumentPointerUp? ) { var unselectAuto = context.options.unselectAuto; if (unselectAuto && (!unselectAuto || !_this.matchesCancel)) { context.calendarApi.unselect(pev); } } if (calendarState.eventSelection && // an existing event selected? !_this.matchesEvent // interaction DIDN'T start on an event ) { context.dispatch({ type: 'UNSELECT_EVENT' }); } } _this.isRecentPointerDateSelect = false; }; var documentPointer = this.documentPointer = new PointerDragging(document); documentPointer.shouldIgnoreMove = true; documentPointer.shouldWatchScroll = false; documentPointer.emitter.on('pointerdown', this.onDocumentPointerDown); documentPointer.emitter.on('pointerup', this.onDocumentPointerUp); /* TODO: better way to know about whether there was a selection with the pointer */ context.emitter.on('select', this.onSelect); } UnselectAuto.prototype.destroy = function () { this.context.emitter.off('select', this.onSelect); this.documentPointer.destroy(); }; return UnselectAuto; }(); var OPTION_REFINERS = { fixedMirrorParent: common.identity }; var LISTENER_REFINERS = { dateClick: common.identity, eventDragStart: common.identity, eventDragStop: common.identity, eventDrop: common.identity, eventResizeStart: common.identity, eventResizeStop: common.identity, eventResize: common.identity, drop: common.identity, eventReceive: common.identity, eventLeave: common.identity }; /* Given an already instantiated draggable object for one-or-more elements, Interprets any dragging as an attempt to drag an events that lives outside of a calendar onto a calendar. */ var ExternalElementDragging = /** @class */ function () { function ExternalElementDragging(dragging, suppliedDragMeta) { var _this = this; this.receivingContext = null; this.droppableEvent = null; // will exist for all drags, even if create:false this.suppliedDragMeta = null; this.dragMeta = null; this.handleDragStart = function (ev) { _this.dragMeta = _this.buildDragMeta(ev.subjectEl); }; this.handleHitUpdate = function (hit, isFinal, ev) { var dragging = _this.hitDragging.dragging; var receivingContext = null; var droppableEvent = null; var isInvalid = false; var interaction = { affectedEvents: common.createEmptyEventStore(), mutatedEvents: common.createEmptyEventStore(), isEvent: _this.dragMeta.create }; if (hit) { receivingContext = hit.context; if (_this.canDropElOnCalendar(ev.subjectEl, receivingContext)) { droppableEvent = computeEventForDateSpan(hit.dateSpan, _this.dragMeta, receivingContext); interaction.mutatedEvents = common.eventTupleToStore(droppableEvent); isInvalid = !common.isInteractionValid(interaction, hit.dateProfile, receivingContext); if (isInvalid) { interaction.mutatedEvents = common.createEmptyEventStore(); droppableEvent = null; } } } _this.displayDrag(receivingContext, interaction); // show mirror if no already-rendered mirror element OR if we are shutting down the mirror (?) // TODO: wish we could somehow wait for dispatch to guarantee render dragging.setMirrorIsVisible(isFinal || !droppableEvent || !document.querySelector('.fc-event-mirror')); if (!isInvalid) { common.enableCursor(); } else { common.disableCursor(); } if (!isFinal) { dragging.setMirrorNeedsRevert(!droppableEvent); _this.receivingContext = receivingContext; _this.droppableEvent = droppableEvent; } }; this.handleDragEnd = function (pev) { var _a = _this, receivingContext = _a.receivingContext, droppableEvent = _a.droppableEvent; _this.clearDrag(); if (receivingContext && droppableEvent) { var finalHit = _this.hitDragging.finalHit; var finalView = finalHit.context.viewApi; var dragMeta = _this.dragMeta; receivingContext.emitter.trigger('drop', tslib.__assign(tslib.__assign({}, buildDatePointApiWithContext(finalHit.dateSpan, receivingContext)), { draggedEl: pev.subjectEl, jsEvent: pev.origEvent, view: finalView })); if (dragMeta.create) { var addingEvents_1 = common.eventTupleToStore(droppableEvent); receivingContext.dispatch({ type: 'MERGE_EVENTS', eventStore: addingEvents_1 }); if (pev.isTouch) { receivingContext.dispatch({ type: 'SELECT_EVENT', eventInstanceId: droppableEvent.instance.instanceId }); } // signal that an external event landed receivingContext.emitter.trigger('eventReceive', { event: new common.EventApi(receivingContext, droppableEvent.def, droppableEvent.instance), relatedEvents: [], revert: function revert() { receivingContext.dispatch({ type: 'REMOVE_EVENTS', eventStore: addingEvents_1 }); }, draggedEl: pev.subjectEl, view: finalView }); } } _this.receivingContext = null; _this.droppableEvent = null; }; var hitDragging = this.hitDragging = new HitDragging(dragging, common.interactionSettingsStore); hitDragging.requireInitial = false; // will start outside of a component hitDragging.emitter.on('dragstart', this.handleDragStart); hitDragging.emitter.on('hitupdate', this.handleHitUpdate); hitDragging.emitter.on('dragend', this.handleDragEnd); this.suppliedDragMeta = suppliedDragMeta; } ExternalElementDragging.prototype.buildDragMeta = function (subjectEl) { if (_typeof(this.suppliedDragMeta) === 'object') { return common.parseDragMeta(this.suppliedDragMeta); } if (typeof this.suppliedDragMeta === 'function') { return common.parseDragMeta(this.suppliedDragMeta(subjectEl)); } return getDragMetaFromEl(subjectEl); }; ExternalElementDragging.prototype.displayDrag = function (nextContext, state) { var prevContext = this.receivingContext; if (prevContext && prevContext !== nextContext) { prevContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); } if (nextContext) { nextContext.dispatch({ type: 'SET_EVENT_DRAG', state: state }); } }; ExternalElementDragging.prototype.clearDrag = function () { if (this.receivingContext) { this.receivingContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); } }; ExternalElementDragging.prototype.canDropElOnCalendar = function (el, receivingContext) { var dropAccept = receivingContext.options.dropAccept; if (typeof dropAccept === 'function') { return dropAccept.call(receivingContext.calendarApi, el); } if (typeof dropAccept === 'string' && dropAccept) { return Boolean(common.elementMatches(el, dropAccept)); } return true; }; return ExternalElementDragging; }(); // Utils for computing event store from the DragMeta // ---------------------------------------------------------------------------------------------------- function computeEventForDateSpan(dateSpan, dragMeta, context) { var defProps = tslib.__assign({}, dragMeta.leftoverProps); for (var _i = 0, _a = context.pluginHooks.externalDefTransforms; _i < _a.length; _i++) { var transform = _a[_i]; tslib.__assign(defProps, transform(dateSpan, dragMeta)); } var _b = common.refineEventDef(defProps, context), refined = _b.refined, extra = _b.extra; var def = common.parseEventDef(refined, extra, dragMeta.sourceId, dateSpan.allDay, context.options.forceEventDuration || Boolean(dragMeta.duration), // hasEnd context); var start = dateSpan.range.start; // only rely on time info if drop zone is all-day, // otherwise, we already know the time if (dateSpan.allDay && dragMeta.startTime) { start = context.dateEnv.add(start, dragMeta.startTime); } var end = dragMeta.duration ? context.dateEnv.add(start, dragMeta.duration) : common.getDefaultEventEnd(dateSpan.allDay, start, context); var instance = common.createEventInstance(def.defId, { start: start, end: end }); return { def: def, instance: instance }; } // Utils for extracting data from element // ---------------------------------------------------------------------------------------------------- function getDragMetaFromEl(el) { var str = getEmbeddedElData(el, 'event'); var obj = str ? JSON.parse(str) : { create: false }; // if no embedded data, assume no event creation return common.parseDragMeta(obj); } common.config.dataAttrPrefix = ''; function getEmbeddedElData(el, name) { var prefix = common.config.dataAttrPrefix; var prefixedName = (prefix ? prefix + '-' : '') + name; return el.getAttribute('data-' + prefixedName) || ''; } /* Makes an element (that is *external* to any calendar) draggable. Can pass in data that determines how an event will be created when dropped onto a calendar. Leverages FullCalendar's internal drag-n-drop functionality WITHOUT a third-party drag system. */ var ExternalDraggable = /** @class */ function () { function ExternalDraggable(el, settings) { var _this = this; if (settings === void 0) { settings = {}; } this.handlePointerDown = function (ev) { var dragging = _this.dragging; var _a = _this.settings, minDistance = _a.minDistance, longPressDelay = _a.longPressDelay; dragging.minDistance = minDistance != null ? minDistance : ev.isTouch ? 0 : common.BASE_OPTION_DEFAULTS.eventDragMinDistance; dragging.delay = ev.isTouch ? // TODO: eventually read eventLongPressDelay instead vvv longPressDelay != null ? longPressDelay : common.BASE_OPTION_DEFAULTS.longPressDelay : 0; }; this.handleDragStart = function (ev) { if (ev.isTouch && _this.dragging.delay && ev.subjectEl.classList.contains('fc-event')) { _this.dragging.mirror.getMirrorEl().classList.add('fc-event-selected'); } }; this.settings = settings; var dragging = this.dragging = new FeaturefulElementDragging(el); dragging.touchScrollAllowed = false; if (settings.itemSelector != null) { dragging.pointer.selector = settings.itemSelector; } if (settings.appendTo != null) { dragging.mirror.parentNode = settings.appendTo; // TODO: write tests } dragging.emitter.on('pointerdown', this.handlePointerDown); dragging.emitter.on('dragstart', this.handleDragStart); new ExternalElementDragging(dragging, settings.eventData); // eslint-disable-line no-new } ExternalDraggable.prototype.destroy = function () { this.dragging.destroy(); }; return ExternalDraggable; }(); /* Detects when a *THIRD-PARTY* drag-n-drop system interacts with elements. The third-party system is responsible for drawing the visuals effects of the drag. This class simply monitors for pointer movements and fires events. It also has the ability to hide the moving element (the "mirror") during the drag. */ var InferredElementDragging = /** @class */ function (_super) { tslib.__extends(InferredElementDragging, _super); function InferredElementDragging(containerEl) { var _this = _super.call(this, containerEl) || this; _this.shouldIgnoreMove = false; _this.mirrorSelector = ''; _this.currentMirrorEl = null; _this.handlePointerDown = function (ev) { _this.emitter.trigger('pointerdown', ev); if (!_this.shouldIgnoreMove) { // fire dragstart right away. does not support delay or min-distance _this.emitter.trigger('dragstart', ev); } }; _this.handlePointerMove = function (ev) { if (!_this.shouldIgnoreMove) { _this.emitter.trigger('dragmove', ev); } }; _this.handlePointerUp = function (ev) { _this.emitter.trigger('pointerup', ev); if (!_this.shouldIgnoreMove) { // fire dragend right away. does not support a revert animation _this.emitter.trigger('dragend', ev); } }; var pointer = _this.pointer = new PointerDragging(containerEl); pointer.emitter.on('pointerdown', _this.handlePointerDown); pointer.emitter.on('pointermove', _this.handlePointerMove); pointer.emitter.on('pointerup', _this.handlePointerUp); return _this; } InferredElementDragging.prototype.destroy = function () { this.pointer.destroy(); }; InferredElementDragging.prototype.setIgnoreMove = function (bool) { this.shouldIgnoreMove = bool; }; InferredElementDragging.prototype.setMirrorIsVisible = function (bool) { if (bool) { // restore a previously hidden element. // use the reference in case the selector class has already been removed. if (this.currentMirrorEl) { this.currentMirrorEl.style.visibility = ''; this.currentMirrorEl = null; } } else { var mirrorEl = this.mirrorSelector // TODO: somehow query FullCalendars WITHIN shadow-roots ? document.querySelector(this.mirrorSelector) : null; if (mirrorEl) { this.currentMirrorEl = mirrorEl; mirrorEl.style.visibility = 'hidden'; } } }; return InferredElementDragging; }(common.ElementDragging); /* Bridges third-party drag-n-drop systems with FullCalendar. Must be instantiated and destroyed by caller. */ var ThirdPartyDraggable = /** @class */ function () { function ThirdPartyDraggable(containerOrSettings, settings) { var containerEl = document; if ( // wish we could just test instanceof EventTarget, but doesn't work in IE11 containerOrSettings === document || containerOrSettings instanceof Element) { containerEl = containerOrSettings; settings = settings || {}; } else { settings = containerOrSettings || {}; } var dragging = this.dragging = new InferredElementDragging(containerEl); if (typeof settings.itemSelector === 'string') { dragging.pointer.selector = settings.itemSelector; } else if (containerEl === document) { dragging.pointer.selector = '[data-event]'; } if (typeof settings.mirrorSelector === 'string') { dragging.mirrorSelector = settings.mirrorSelector; } new ExternalElementDragging(dragging, settings.eventData); // eslint-disable-line no-new } ThirdPartyDraggable.prototype.destroy = function () { this.dragging.destroy(); }; return ThirdPartyDraggable; }(); var main = common.createPlugin({ componentInteractions: [DateClicking, DateSelecting, EventDragging, EventResizing], calendarInteractions: [UnselectAuto], elementDraggingImpl: FeaturefulElementDragging, optionRefiners: OPTION_REFINERS, listenerRefiners: LISTENER_REFINERS }); exports.Draggable = ExternalDraggable; exports.FeaturefulElementDragging = FeaturefulElementDragging; exports.PointerDragging = PointerDragging; exports.ThirdPartyDraggable = ThirdPartyDraggable; exports["default"] = main; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImNvbW1vbiIsInJlcXVpcmUiLCJ0c2xpYiIsImNvbmZpZyIsInRvdWNoTW91c2VJZ25vcmVXYWl0IiwiaWdub3JlTW91c2VEZXB0aCIsImxpc3RlbmVyQ250IiwiaXNXaW5kb3dUb3VjaE1vdmVDYW5jZWxsZWQiLCJQb2ludGVyRHJhZ2dpbmciLCJjb250YWluZXJFbCIsIl90aGlzIiwic3ViamVjdEVsIiwic2VsZWN0b3IiLCJoYW5kbGVTZWxlY3RvciIsInNob3VsZElnbm9yZU1vdmUiLCJzaG91bGRXYXRjaFNjcm9sbCIsImlzRHJhZ2dpbmciLCJpc1RvdWNoRHJhZ2dpbmciLCJ3YXNUb3VjaFNjcm9sbCIsImhhbmRsZU1vdXNlRG93biIsImV2Iiwic2hvdWxkSWdub3JlTW91c2UiLCJpc1ByaW1hcnlNb3VzZUJ1dHRvbiIsInRyeVN0YXJ0IiwicGV2IiwiY3JlYXRlRXZlbnRGcm9tTW91c2UiLCJlbWl0dGVyIiwidHJpZ2dlciIsImluaXRTY3JvbGxXYXRjaCIsImRvY3VtZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsImhhbmRsZU1vdXNlTW92ZSIsImhhbmRsZU1vdXNlVXAiLCJyZWNvcmRDb29yZHMiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiY2xlYW51cCIsImhhbmRsZVRvdWNoU3RhcnQiLCJjcmVhdGVFdmVudEZyb21Ub3VjaCIsInRhcmdldEVsIiwidGFyZ2V0IiwiaGFuZGxlVG91Y2hNb3ZlIiwiaGFuZGxlVG91Y2hFbmQiLCJ3aW5kb3ciLCJoYW5kbGVUb3VjaFNjcm9sbCIsInN0YXJ0SWdub3JpbmdNb3VzZSIsImhhbmRsZVNjcm9sbCIsInBhZ2VYIiwicGFnZVhPZmZzZXQiLCJwcmV2U2Nyb2xsWCIsInByZXZQYWdlWCIsInBhZ2VZIiwicGFnZVlPZmZzZXQiLCJwcmV2U2Nyb2xsWSIsInByZXZQYWdlWSIsIm9yaWdFdmVudCIsImlzVG91Y2giLCJkZWx0YVgiLCJvcmlnUGFnZVgiLCJkZWx0YVkiLCJvcmlnUGFnZVkiLCJFbWl0dGVyIiwicGFzc2l2ZSIsImxpc3RlbmVyQ3JlYXRlZCIsInByb3RvdHlwZSIsImRlc3Ryb3kiLCJsaXN0ZW5lckRlc3Ryb3llZCIsInF1ZXJ5U3ViamVjdEVsIiwiZG93bkVsIiwiZWxlbWVudENsb3Nlc3QiLCJkZXN0cm95U2Nyb2xsV2F0Y2giLCJjYW5jZWxUb3VjaFNjcm9sbCIsImlzRmlyc3QiLCJ0b3VjaGVzIiwibGVuZ3RoIiwiYnV0dG9uIiwiY3RybEtleSIsInNldFRpbWVvdXQiLCJvbldpbmRvd1RvdWNoTW92ZSIsInByZXZlbnREZWZhdWx0IiwiRWxlbWVudE1pcnJvciIsImlzVmlzaWJsZSIsInNvdXJjZUVsIiwibWlycm9yRWwiLCJzb3VyY2VFbFJlY3QiLCJwYXJlbnROb2RlIiwiYm9keSIsInpJbmRleCIsInJldmVydER1cmF0aW9uIiwic3RhcnQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJvcmlnU2NyZWVuWCIsIm9yaWdTY3JlZW5ZIiwidXBkYXRlRWxQb3NpdGlvbiIsImhhbmRsZU1vdmUiLCJzZXRJc1Zpc2libGUiLCJib29sIiwic3R5bGUiLCJkaXNwbGF5Iiwic3RvcCIsIm5lZWRzUmV2ZXJ0QW5pbWF0aW9uIiwiY2FsbGJhY2siLCJkb25lIiwiZG9SZXZlcnRBbmltYXRpb24iLCJmaW5hbFNvdXJjZUVsUmVjdCIsInRyYW5zaXRpb24iLCJhcHBseVN0eWxlIiwibGVmdCIsInRvcCIsIndoZW5UcmFuc2l0aW9uRG9uZSIsInJlbW92ZUVsZW1lbnQiLCJnZXRNaXJyb3JFbCIsImNsb25lTm9kZSIsImNsYXNzTGlzdCIsImFkZCIsInBvc2l0aW9uIiwidmlzaWJpbGl0eSIsImJveFNpemluZyIsIndpZHRoIiwicmlnaHQiLCJoZWlnaHQiLCJib3R0b20iLCJtYXJnaW4iLCJhcHBlbmRDaGlsZCIsIlNjcm9sbEdlb21DYWNoZSIsIl9zdXBlciIsIl9fZXh0ZW5kcyIsInNjcm9sbENvbnRyb2xsZXIiLCJkb2VzTGlzdGVuaW5nIiwiY2FsbCIsInNjcm9sbFRvcCIsImdldFNjcm9sbFRvcCIsInNjcm9sbExlZnQiLCJnZXRTY3JvbGxMZWZ0IiwiaGFuZGxlU2Nyb2xsQ2hhbmdlIiwib3JpZ1Njcm9sbFRvcCIsIm9yaWdTY3JvbGxMZWZ0Iiwic2Nyb2xsV2lkdGgiLCJnZXRTY3JvbGxXaWR0aCIsInNjcm9sbEhlaWdodCIsImdldFNjcm9sbEhlaWdodCIsImNsaWVudFdpZHRoIiwiZ2V0Q2xpZW50V2lkdGgiLCJjbGllbnRIZWlnaHQiLCJnZXRDbGllbnRIZWlnaHQiLCJjbGllbnRSZWN0IiwiY29tcHV0ZUNsaWVudFJlY3QiLCJnZXRFdmVudFRhcmdldCIsInNldFNjcm9sbFRvcCIsIk1hdGgiLCJtYXgiLCJtaW4iLCJnZXRNYXhTY3JvbGxUb3AiLCJzZXRTY3JvbGxMZWZ0IiwiZ2V0TWF4U2Nyb2xsTGVmdCIsIlNjcm9sbENvbnRyb2xsZXIiLCJFbGVtZW50U2Nyb2xsR2VvbUNhY2hlIiwiZWwiLCJFbGVtZW50U2Nyb2xsQ29udHJvbGxlciIsImNvbXB1dGVJbm5lclJlY3QiLCJXaW5kb3dTY3JvbGxHZW9tQ2FjaGUiLCJXaW5kb3dTY3JvbGxDb250cm9sbGVyIiwiZ2V0VGltZSIsInBlcmZvcm1hbmNlIiwibm93IiwiRGF0ZSIsIkF1dG9TY3JvbGxlciIsImlzRW5hYmxlZCIsInNjcm9sbFF1ZXJ5IiwiZWRnZVRocmVzaG9sZCIsIm1heFZlbG9jaXR5IiwicG9pbnRlclNjcmVlblgiLCJwb2ludGVyU2NyZWVuWSIsImlzQW5pbWF0aW5nIiwic2Nyb2xsQ2FjaGVzIiwiZXZlck1vdmVkVXAiLCJldmVyTW92ZWREb3duIiwiZXZlck1vdmVkTGVmdCIsImV2ZXJNb3ZlZFJpZ2h0IiwiYW5pbWF0ZSIsImVkZ2UiLCJjb21wdXRlQmVzdEVkZ2UiLCJoYW5kbGVTaWRlIiwibXNTaW5jZVJlcXVlc3QiLCJyZXF1ZXN0QW5pbWF0aW9uIiwic2Nyb2xsU3RhcnRFbCIsImJ1aWxkQ2FjaGVzIiwieURlbHRhIiwieERlbHRhIiwiX2kiLCJfYSIsInNjcm9sbENhY2hlIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwic2Vjb25kcyIsImludkRpc3RhbmNlIiwiZGlzdGFuY2UiLCJ2ZWxvY2l0eSIsInNpZ24iLCJuYW1lIiwiYmVzdFNpZGUiLCJzY3JvbGxDYWNoZXNfMSIsInJlY3QiLCJsZWZ0RGlzdCIsInJpZ2h0RGlzdCIsInRvcERpc3QiLCJib3R0b21EaXN0IiwiY2FuU2Nyb2xsVXAiLCJjYW5TY3JvbGxEb3duIiwiY2FuU2Nyb2xsTGVmdCIsImNhblNjcm9sbFJpZ2h0IiwicXVlcnlTY3JvbGxFbHMiLCJtYXAiLCJlbHMiLCJxdWVyeSIsInB1c2giLCJhcHBseSIsIkFycmF5Iiwic2xpY2UiLCJnZXRFbFJvb3QiLCJxdWVyeVNlbGVjdG9yQWxsIiwiRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZyIsImRlbGF5IiwibWluRGlzdGFuY2UiLCJ0b3VjaFNjcm9sbEFsbG93ZWQiLCJtaXJyb3JOZWVkc1JldmVydCIsImlzSW50ZXJhY3RpbmciLCJpc0RlbGF5RW5kZWQiLCJpc0Rpc3RhbmNlU3VycGFzc2VkIiwiZGVsYXlUaW1lb3V0SWQiLCJvblBvaW50ZXJEb3duIiwicHJldmVudFNlbGVjdGlvbiIsInByZXZlbnRDb250ZXh0TWVudSIsInBvaW50ZXIiLCJtaXJyb3IiLCJzdGFydERlbGF5IiwiaGFuZGxlRGlzdGFuY2VTdXJwYXNzZWQiLCJvblBvaW50ZXJNb3ZlIiwiZGlzdGFuY2VTcSIsInR5cGUiLCJhdXRvU2Nyb2xsZXIiLCJvblBvaW50ZXJVcCIsImFsbG93U2VsZWN0aW9uIiwiYWxsb3dDb250ZXh0TWVudSIsInRyeVN0b3BEcmFnIiwiY2xlYXJUaW1lb3V0Iiwib24iLCJoYW5kbGVEZWxheUVuZCIsInRyeVN0YXJ0RHJhZyIsInN0b3BEcmFnIiwiYmluZCIsInNldElnbm9yZU1vdmUiLCJzZXRNaXJyb3JJc1Zpc2libGUiLCJzZXRNaXJyb3JOZWVkc1JldmVydCIsInNldEF1dG9TY3JvbGxFbmFibGVkIiwiRWxlbWVudERyYWdnaW5nIiwiT2Zmc2V0VHJhY2tlciIsIm9yaWdSZWN0IiwiY29tcHV0ZVJlY3QiLCJnZXRDbGlwcGluZ1BhcmVudHMiLCJzY3JvbGxFbCIsImNvbXB1dGVMZWZ0IiwiY29tcHV0ZVRvcCIsImlzV2l0aGluQ2xpcHBpbmciLCJwb2ludCIsImlzSWdub3JlZENsaXBwaW5nIiwicG9pbnRJbnNpZGVSZWN0Iiwibm9kZSIsInRhZ05hbWUiLCJIaXREcmFnZ2luZyIsImRyYWdnaW5nIiwiZHJvcHBhYmxlU3RvcmUiLCJ1c2VTdWJqZWN0Q2VudGVyIiwicmVxdWlyZUluaXRpYWwiLCJpbml0aWFsSGl0IiwibW92aW5nSGl0IiwiZmluYWxIaXQiLCJoYW5kbGVQb2ludGVyRG93biIsInByZXBhcmVIaXRzIiwicHJvY2Vzc0ZpcnN0Q29vcmQiLCJoYW5kbGVEcmFnU3RhcnQiLCJoYW5kbGVEcmFnTW92ZSIsImhhbmRsZVBvaW50ZXJVcCIsInJlbGVhc2VIaXRzIiwiaGFuZGxlRHJhZ0VuZCIsIm9yaWdQb2ludCIsImFkanVzdGVkUG9pbnQiLCJzdWJqZWN0UmVjdCIsIkhUTUxFbGVtZW50IiwiY29uc3RyYWluUG9pbnQiLCJxdWVyeUhpdEZvck9mZnNldCIsInNsaWNlZFN1YmplY3RSZWN0IiwiaW50ZXJzZWN0UmVjdHMiLCJnZXRSZWN0Q2VudGVyIiwiY29vcmRBZGp1c3QiLCJkaWZmUG9pbnRzIiwiZm9yY2VIYW5kbGUiLCJoaXQiLCJpc0hpdHNFcXVhbCIsIm9mZnNldFRyYWNrZXJzIiwibWFwSGFzaCIsImludGVyYWN0aW9uU2V0dGluZ3MiLCJjb21wb25lbnQiLCJpZCIsIm9mZnNldExlZnQiLCJvZmZzZXRUb3AiLCJiZXN0SGl0Iiwib2Zmc2V0VHJhY2tlciIsIm9yaWdpbkxlZnQiLCJvcmlnaW5Ub3AiLCJwb3NpdGlvbkxlZnQiLCJwb3NpdGlvblRvcCIsInF1ZXJ5SGl0IiwicmFuZ2VDb250YWluc1JhbmdlIiwiZGF0ZVByb2ZpbGUiLCJhY3RpdmVSYW5nZSIsImRhdGVTcGFuIiwicmFuZ2UiLCJsYXllciIsImNvbXBvbmVudElkIiwiY29udGV4dCIsImhpdDAiLCJoaXQxIiwiQm9vbGVhbiIsImlzRGF0ZVNwYW5zRXF1YWwiLCJidWlsZERhdGVQb2ludEFwaVdpdGhDb250ZXh0IiwicHJvcHMiLCJwbHVnaW5Ib29rcyIsImRhdGVQb2ludFRyYW5zZm9ybXMiLCJ0cmFuc2Zvcm0iLCJfX2Fzc2lnbiIsImJ1aWxkRGF0ZVBvaW50QXBpIiwiZGF0ZUVudiIsInNwYW4iLCJkYXRlIiwidG9EYXRlIiwiZGF0ZVN0ciIsImZvcm1hdElzbyIsIm9taXRUaW1lIiwiYWxsRGF5IiwiRGF0ZUNsaWNraW5nIiwic2V0dGluZ3MiLCJpc1ZhbGlkRGF0ZURvd25FbCIsImhpdERyYWdnaW5nIiwiYXJnIiwiZGF5RWwiLCJqc0V2ZW50IiwidmlldyIsInZpZXdBcGkiLCJjYWxlbmRhckFwaSIsImludGVyYWN0aW9uU2V0dGluZ3NUb1N0b3JlIiwiSW50ZXJhY3Rpb24iLCJEYXRlU2VsZWN0aW5nIiwiZHJhZ1NlbGVjdGlvbiIsIm9wdGlvbnMiLCJjYW5TZWxlY3QiLCJzZWxlY3RhYmxlIiwiZ2V0Q29tcG9uZW50VG91Y2hEZWxheSQxIiwidW5zZWxlY3QiLCJoYW5kbGVIaXRVcGRhdGUiLCJpc0ZpbmFsIiwiaXNJbnZhbGlkIiwiZGlzYWxsb3dlZCIsImlzSGl0Q29tYm9BbGxvd2VkIiwiam9pbkhpdHNJbnRvU2VsZWN0aW9uIiwiZGF0ZVNlbGVjdGlvblRyYW5zZm9ybWVycyIsImlzRGF0ZVNlbGVjdGlvblZhbGlkIiwiZGlzcGF0Y2giLCJzZWxlY3Rpb24iLCJlbmFibGVDdXJzb3IiLCJkaXNhYmxlQ3Vyc29yIiwidHJpZ2dlckRhdGVTZWxlY3QiLCJzZWxlY3RNaW5EaXN0YW5jZSIsImRyYWdTY3JvbGwiLCJzZWxlY3RMb25nUHJlc3NEZWxheSIsImxvbmdQcmVzc0RlbGF5IiwiZGF0ZVNwYW4wIiwiZGF0ZVNwYW4xIiwibXMiLCJlbmQiLCJzb3J0IiwiY29tcGFyZU51bWJlcnMiLCJkYXRlU2VsZWN0aW9uVHJhbnNmb3JtZXJzXzEiLCJ0cmFuc2Zvcm1lciIsInJlcyIsIkV2ZW50RHJhZ2dpbmciLCJzdWJqZWN0U2VnIiwiZXZlbnRSYW5nZSIsInJlbGV2YW50RXZlbnRzIiwicmVjZWl2aW5nQ29udGV4dCIsInZhbGlkTXV0YXRpb24iLCJtdXRhdGVkUmVsZXZhbnRFdmVudHMiLCJvcmlnVGFyZ2V0IiwiaW5pdGlhbENvbnRleHQiLCJnZXRFbFNlZyIsImV2ZW50SW5zdGFuY2VJZCIsImluc3RhbmNlIiwiaW5zdGFuY2VJZCIsImdldFJlbGV2YW50RXZlbnRzIiwiZ2V0Q3VycmVudERhdGEiLCJldmVudFN0b3JlIiwiZXZlbnREcmFnTWluRGlzdGFuY2UiLCJldmVudFNlbGVjdGlvbiIsImdldENvbXBvbmVudFRvdWNoRGVsYXkiLCJmaXhlZE1pcnJvclBhcmVudCIsImRyYWdSZXZlcnREdXJhdGlvbiIsImlzVmFsaWQiLCJpc1ZhbGlkU2VnRG93bkVsIiwiY29udGFpbnMiLCJldmVudCIsIkV2ZW50QXBpIiwiZGVmIiwibXV0YXRpb24iLCJpbnRlcmFjdGlvbiIsImFmZmVjdGVkRXZlbnRzIiwibXV0YXRlZEV2ZW50cyIsImNyZWF0ZUVtcHR5RXZlbnRTdG9yZSIsImlzRXZlbnQiLCJyZWNlaXZpbmdPcHRpb25zIiwiZWRpdGFibGUiLCJkcm9wcGFibGUiLCJjb21wdXRlRXZlbnRNdXRhdGlvbiIsImV2ZW50RHJhZ011dGF0aW9uTWFzc2FnZXJzIiwiYXBwbHlNdXRhdGlvblRvRXZlbnRTdG9yZSIsImV2ZW50VWlCYXNlcyIsImlzSW50ZXJhY3Rpb25WYWxpZCIsImRpc3BsYXlEcmFnIiwicXVlcnlTZWxlY3RvciIsImluaXRpYWxDb250ZXh0XzEiLCJpbml0aWFsVmlldyIsInJlY2VpdmluZ0NvbnRleHRfMSIsImV2ZW50RGVmIiwiZXZlbnRJbnN0YW5jZSIsImV2ZW50QXBpIiwicmVsZXZhbnRFdmVudHNfMSIsIm11dGF0ZWRSZWxldmFudEV2ZW50c18xIiwiY2xlYXJEcmFnIiwidXBkYXRlZEV2ZW50QXBpIiwiZGVmcyIsImRlZklkIiwiaW5zdGFuY2VzIiwiZXZlbnRDaGFuZ2VBcmciLCJvbGRFdmVudCIsInJlbGF0ZWRFdmVudHMiLCJidWlsZEV2ZW50QXBpcyIsInJldmVydCIsInRyYW5zZm9ybWVkIiwiX2IiLCJldmVudERyb3BUcmFuc2Zvcm1lcnMiLCJkZWx0YSIsImRhdGVzRGVsdGEiLCJldmVudFJlbW92ZUFyZyIsImRyYWdnZWRFbCIsImFkZGVkRXZlbnREZWYiLCJhZGRlZEV2ZW50SW5zdGFuY2UiLCJhZGRlZEV2ZW50QXBpIiwiZXZlbnRBZGRBcmciLCJTRUxFQ1RPUiIsImludGVyYWN0aW9uU2V0dGluZ3NTdG9yZSIsInVzZUV2ZW50Q2VudGVyIiwibmV4dENvbnRleHQiLCJzdGF0ZSIsInByZXZDb250ZXh0IiwiaW5pdGlhbENhbGVuZGFyIiwibWFzc2FnZXJzIiwiZGF0ZTAiLCJkYXRlMSIsInN0YW5kYXJkUHJvcHMiLCJoYXNFbmQiLCJhbGxEYXlNYWludGFpbkR1cmF0aW9uIiwic3RhcnRPZkRheSIsImRpZmZEYXRlcyIsImxhcmdlVW5pdCIsIm1pbGxpc2Vjb25kcyIsIm1hc3NhZ2Vyc18xIiwibWFzc2FnZXIiLCJldmVudExvbmdQcmVzc0RlbGF5IiwiRXZlbnRSZXNpemluZyIsImRyYWdnaW5nU2VnRWwiLCJkcmFnZ2luZ1NlZyIsInNlZ0VsIiwicXVlcnlTZWdFbCIsInNlZyIsImNvbXB1dGVNdXRhdGlvbiIsInN0YXJ0RGVsdGEiLCJjcmVhdGVEdXJhdGlvbiIsImVuZERlbHRhIiwiaXNGcm9tU3RhcnQiLCJpbnN0YW5jZVJhbmdlIiwiVW5zZWxlY3RBdXRvIiwiaXNSZWNlbnRQb2ludGVyRGF0ZVNlbGVjdCIsIm1hdGNoZXNDYW5jZWwiLCJtYXRjaGVzRXZlbnQiLCJvblNlbGVjdCIsInNlbGVjdEluZm8iLCJvbkRvY3VtZW50UG9pbnRlckRvd24iLCJ1bnNlbGVjdENhbmNlbCIsImdldEV2ZW50VGFyZ2V0VmlhUm9vdCIsIm9uRG9jdW1lbnRQb2ludGVyVXAiLCJkb2N1bWVudFBvaW50ZXIiLCJjYWxlbmRhclN0YXRlIiwiZGF0ZVNlbGVjdGlvbiIsInVuc2VsZWN0QXV0byIsIm9mZiIsIk9QVElPTl9SRUZJTkVSUyIsImlkZW50aXR5IiwiTElTVEVORVJfUkVGSU5FUlMiLCJkYXRlQ2xpY2siLCJldmVudERyYWdTdGFydCIsImV2ZW50RHJhZ1N0b3AiLCJldmVudERyb3AiLCJldmVudFJlc2l6ZVN0YXJ0IiwiZXZlbnRSZXNpemVTdG9wIiwiZXZlbnRSZXNpemUiLCJkcm9wIiwiZXZlbnRSZWNlaXZlIiwiZXZlbnRMZWF2ZSIsIkV4dGVybmFsRWxlbWVudERyYWdnaW5nIiwic3VwcGxpZWREcmFnTWV0YSIsImRyb3BwYWJsZUV2ZW50IiwiZHJhZ01ldGEiLCJidWlsZERyYWdNZXRhIiwiY3JlYXRlIiwiY2FuRHJvcEVsT25DYWxlbmRhciIsImNvbXB1dGVFdmVudEZvckRhdGVTcGFuIiwiZXZlbnRUdXBsZVRvU3RvcmUiLCJmaW5hbFZpZXciLCJhZGRpbmdFdmVudHNfMSIsInBhcnNlRHJhZ01ldGEiLCJnZXREcmFnTWV0YUZyb21FbCIsImRyb3BBY2NlcHQiLCJlbGVtZW50TWF0Y2hlcyIsImRlZlByb3BzIiwibGVmdG92ZXJQcm9wcyIsImV4dGVybmFsRGVmVHJhbnNmb3JtcyIsInJlZmluZUV2ZW50RGVmIiwicmVmaW5lZCIsImV4dHJhIiwicGFyc2VFdmVudERlZiIsInNvdXJjZUlkIiwiZm9yY2VFdmVudER1cmF0aW9uIiwiZHVyYXRpb24iLCJzdGFydFRpbWUiLCJnZXREZWZhdWx0RXZlbnRFbmQiLCJjcmVhdGVFdmVudEluc3RhbmNlIiwic3RyIiwiZ2V0RW1iZWRkZWRFbERhdGEiLCJvYmoiLCJKU09OIiwicGFyc2UiLCJkYXRhQXR0clByZWZpeCIsInByZWZpeCIsInByZWZpeGVkTmFtZSIsImdldEF0dHJpYnV0ZSIsIkV4dGVybmFsRHJhZ2dhYmxlIiwiQkFTRV9PUFRJT05fREVGQVVMVFMiLCJpdGVtU2VsZWN0b3IiLCJhcHBlbmRUbyIsImV2ZW50RGF0YSIsIkluZmVycmVkRWxlbWVudERyYWdnaW5nIiwibWlycm9yU2VsZWN0b3IiLCJjdXJyZW50TWlycm9yRWwiLCJoYW5kbGVQb2ludGVyTW92ZSIsIlRoaXJkUGFydHlEcmFnZ2FibGUiLCJjb250YWluZXJPclNldHRpbmdzIiwiRWxlbWVudCIsIm1haW4iLCJjcmVhdGVQbHVnaW4iLCJjb21wb25lbnRJbnRlcmFjdGlvbnMiLCJjYWxlbmRhckludGVyYWN0aW9ucyIsImVsZW1lbnREcmFnZ2luZ0ltcGwiLCJvcHRpb25SZWZpbmVycyIsImxpc3RlbmVyUmVmaW5lcnMiLCJEcmFnZ2FibGUiXSwic291cmNlcyI6WyJtYWluLmNqcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbkZ1bGxDYWxlbmRhciB2NS4xMS4yXG5Eb2NzICYgTGljZW5zZTogaHR0cHM6Ly9mdWxsY2FsZW5kYXIuaW8vXG4oYykgMjAyMiBBZGFtIFNoYXdcbiovXG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciBjb21tb24gPSByZXF1aXJlKCdAZnVsbGNhbGVuZGFyL2NvbW1vbicpO1xudmFyIHRzbGliID0gcmVxdWlyZSgndHNsaWInKTtcblxuY29tbW9uLmNvbmZpZy50b3VjaE1vdXNlSWdub3JlV2FpdCA9IDUwMDtcbnZhciBpZ25vcmVNb3VzZURlcHRoID0gMDtcbnZhciBsaXN0ZW5lckNudCA9IDA7XG52YXIgaXNXaW5kb3dUb3VjaE1vdmVDYW5jZWxsZWQgPSBmYWxzZTtcbi8qXG5Vc2VzIGEgXCJwb2ludGVyXCIgYWJzdHJhY3Rpb24sIHdoaWNoIG1vbml0b3JzIFVJIGV2ZW50cyBmb3IgYm90aCBtb3VzZSBhbmQgdG91Y2guXG5UcmFja3Mgd2hlbiB0aGUgcG9pbnRlciBcImRyYWdzXCIgb24gYSBjZXJ0YWluIGVsZW1lbnQsIG1lYW5pbmcgZG93bittb3ZlK3VwLlxuXG5BbHNvLCB0cmFja3MgaWYgdGhlcmUgd2FzIHRvdWNoLXNjcm9sbGluZy5cbkFsc28sIGNhbiBwcmV2ZW50IHRvdWNoLXNjcm9sbGluZyBmcm9tIGhhcHBlbmluZy5cbkFsc28sIGNhbiBmaXJlIHBvaW50ZXJtb3ZlIGV2ZW50cyB3aGVuIHNjcm9sbGluZyBoYXBwZW5zIHVuZGVybmVhdGgsIGV2ZW4gd2hlbiBubyByZWFsIHBvaW50ZXIgbW92ZW1lbnQuXG5cbmVtaXRzOlxuLSBwb2ludGVyZG93blxuLSBwb2ludGVybW92ZVxuLSBwb2ludGVydXBcbiovXG52YXIgUG9pbnRlckRyYWdnaW5nID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBvaW50ZXJEcmFnZ2luZyhjb250YWluZXJFbCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnN1YmplY3RFbCA9IG51bGw7XG4gICAgICAgIC8vIG9wdGlvbnMgdGhhdCBjYW4gYmUgZGlyZWN0bHkgYXNzaWduZWQgYnkgY2FsbGVyXG4gICAgICAgIHRoaXMuc2VsZWN0b3IgPSAnJzsgLy8gd2lsbCBjYXVzZSBzdWJqZWN0RWwgaW4gYWxsIGVtaXR0ZWQgZXZlbnRzIHRvIGJlIHRoaXMgZWxlbWVudFxuICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdG9yID0gJyc7XG4gICAgICAgIHRoaXMuc2hvdWxkSWdub3JlTW92ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNob3VsZFdhdGNoU2Nyb2xsID0gdHJ1ZTsgLy8gZm9yIHNpbXVsYXRpbmcgcG9pbnRlcm1vdmUgb24gc2Nyb2xsXG4gICAgICAgIC8vIGludGVybmFsIHN0YXRlc1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc1RvdWNoRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy53YXNUb3VjaFNjcm9sbCA9IGZhbHNlO1xuICAgICAgICAvLyBNb3VzZVxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIHRoaXMuaGFuZGxlTW91c2VEb3duID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBpZiAoIV90aGlzLnNob3VsZElnbm9yZU1vdXNlKCkgJiZcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnlNb3VzZUJ1dHRvbihldikgJiZcbiAgICAgICAgICAgICAgICBfdGhpcy50cnlTdGFydChldikpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGV2ID0gX3RoaXMuY3JlYXRlRXZlbnRGcm9tTW91c2UoZXYsIHRydWUpO1xuICAgICAgICAgICAgICAgIF90aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcmRvd24nLCBwZXYpO1xuICAgICAgICAgICAgICAgIF90aGlzLmluaXRTY3JvbGxXYXRjaChwZXYpO1xuICAgICAgICAgICAgICAgIGlmICghX3RoaXMuc2hvdWxkSWdub3JlTW92ZSkge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBfdGhpcy5oYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgX3RoaXMuaGFuZGxlTW91c2VVcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlTW91c2VNb3ZlID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgcGV2ID0gX3RoaXMuY3JlYXRlRXZlbnRGcm9tTW91c2UoZXYpO1xuICAgICAgICAgICAgX3RoaXMucmVjb3JkQ29vcmRzKHBldik7XG4gICAgICAgICAgICBfdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ3BvaW50ZXJtb3ZlJywgcGV2KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVNb3VzZVVwID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBfdGhpcy5oYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIF90aGlzLmhhbmRsZU1vdXNlVXApO1xuICAgICAgICAgICAgX3RoaXMuZW1pdHRlci50cmlnZ2VyKCdwb2ludGVydXAnLCBfdGhpcy5jcmVhdGVFdmVudEZyb21Nb3VzZShldikpO1xuICAgICAgICAgICAgX3RoaXMuY2xlYW51cCgpOyAvLyBjYWxsIGxhc3Qgc28gdGhhdCBwb2ludGVydXAgaGFzIGFjY2VzcyB0byBwcm9wc1xuICAgICAgICB9O1xuICAgICAgICAvLyBUb3VjaFxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIHRoaXMuaGFuZGxlVG91Y2hTdGFydCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgaWYgKF90aGlzLnRyeVN0YXJ0KGV2KSkge1xuICAgICAgICAgICAgICAgIF90aGlzLmlzVG91Y2hEcmFnZ2luZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIHBldiA9IF90aGlzLmNyZWF0ZUV2ZW50RnJvbVRvdWNoKGV2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ3BvaW50ZXJkb3duJywgcGV2KTtcbiAgICAgICAgICAgICAgICBfdGhpcy5pbml0U2Nyb2xsV2F0Y2gocGV2KTtcbiAgICAgICAgICAgICAgICAvLyB1bmxpa2UgbW91c2UsIG5lZWQgdG8gYXR0YWNoIHRvIHRhcmdldCwgbm90IGRvY3VtZW50XG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ1NzYwMDE0XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldEVsID0gZXYudGFyZ2V0O1xuICAgICAgICAgICAgICAgIGlmICghX3RoaXMuc2hvdWxkSWdub3JlTW92ZSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRFbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBfdGhpcy5oYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YXJnZXRFbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIF90aGlzLmhhbmRsZVRvdWNoRW5kKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRFbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIF90aGlzLmhhbmRsZVRvdWNoRW5kKTsgLy8gdHJlYXQgaXQgYXMgYSB0b3VjaCBlbmRcbiAgICAgICAgICAgICAgICAvLyBhdHRhY2ggYSBoYW5kbGVyIHRvIGdldCBjYWxsZWQgd2hlbiBBTlkgc2Nyb2xsIGFjdGlvbiBoYXBwZW5zIG9uIHRoZSBwYWdlLlxuICAgICAgICAgICAgICAgIC8vIHRoaXMgd2FzIGltcG9zc2libGUgdG8gZG8gd2l0aCBub3JtYWwgb24vb2ZmIGJlY2F1c2UgJ3Njcm9sbCcgZG9lc24ndCBidWJibGUuXG4gICAgICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzI5NTQ1NjUvOTYzNDJcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgX3RoaXMuaGFuZGxlVG91Y2hTY3JvbGwsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvdWNoTW92ZSA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgdmFyIHBldiA9IF90aGlzLmNyZWF0ZUV2ZW50RnJvbVRvdWNoKGV2KTtcbiAgICAgICAgICAgIF90aGlzLnJlY29yZENvb3JkcyhwZXYpO1xuICAgICAgICAgICAgX3RoaXMuZW1pdHRlci50cmlnZ2VyKCdwb2ludGVybW92ZScsIHBldik7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlVG91Y2hFbmQgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5pc0RyYWdnaW5nKSB7IC8vIGRvbmUgdG8gZ3VhcmQgYWdhaW5zdCB0b3VjaGVuZCBmb2xsb3dlZCBieSB0b3VjaGNhbmNlbFxuICAgICAgICAgICAgICAgIHZhciB0YXJnZXRFbCA9IGV2LnRhcmdldDtcbiAgICAgICAgICAgICAgICB0YXJnZXRFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBfdGhpcy5oYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgICAgICAgICAgIHRhcmdldEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgX3RoaXMuaGFuZGxlVG91Y2hFbmQpO1xuICAgICAgICAgICAgICAgIHRhcmdldEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgX3RoaXMuaGFuZGxlVG91Y2hFbmQpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBfdGhpcy5oYW5kbGVUb3VjaFNjcm9sbCwgdHJ1ZSk7IC8vIHVzZUNhcHR1cmVkPXRydWVcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ3BvaW50ZXJ1cCcsIF90aGlzLmNyZWF0ZUV2ZW50RnJvbVRvdWNoKGV2KSk7XG4gICAgICAgICAgICAgICAgX3RoaXMuY2xlYW51cCgpOyAvLyBjYWxsIGxhc3Qgc28gdGhhdCBwb2ludGVydXAgaGFzIGFjY2VzcyB0byBwcm9wc1xuICAgICAgICAgICAgICAgIF90aGlzLmlzVG91Y2hEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHN0YXJ0SWdub3JpbmdNb3VzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvdWNoU2Nyb2xsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMud2FzVG91Y2hTY3JvbGwgPSB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgaWYgKCFfdGhpcy5zaG91bGRJZ25vcmVNb3ZlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhZ2VYID0gKHdpbmRvdy5wYWdlWE9mZnNldCAtIF90aGlzLnByZXZTY3JvbGxYKSArIF90aGlzLnByZXZQYWdlWDtcbiAgICAgICAgICAgICAgICB2YXIgcGFnZVkgPSAod2luZG93LnBhZ2VZT2Zmc2V0IC0gX3RoaXMucHJldlNjcm9sbFkpICsgX3RoaXMucHJldlBhZ2VZO1xuICAgICAgICAgICAgICAgIF90aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcm1vdmUnLCB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdFdmVudDogZXYsXG4gICAgICAgICAgICAgICAgICAgIGlzVG91Y2g6IF90aGlzLmlzVG91Y2hEcmFnZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgc3ViamVjdEVsOiBfdGhpcy5zdWJqZWN0RWwsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VYOiBwYWdlWCxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVk6IHBhZ2VZLFxuICAgICAgICAgICAgICAgICAgICBkZWx0YVg6IHBhZ2VYIC0gX3RoaXMub3JpZ1BhZ2VYLFxuICAgICAgICAgICAgICAgICAgICBkZWx0YVk6IHBhZ2VZIC0gX3RoaXMub3JpZ1BhZ2VZLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvbnRhaW5lckVsID0gY29udGFpbmVyRWw7XG4gICAgICAgIHRoaXMuZW1pdHRlciA9IG5ldyBjb21tb24uRW1pdHRlcigpO1xuICAgICAgICBjb250YWluZXJFbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgIGNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgbGlzdGVuZXJDcmVhdGVkKCk7XG4gICAgfVxuICAgIFBvaW50ZXJEcmFnZ2luZy5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuaGFuZGxlVG91Y2hTdGFydCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgICBsaXN0ZW5lckRlc3Ryb3llZCgpO1xuICAgIH07XG4gICAgUG9pbnRlckRyYWdnaW5nLnByb3RvdHlwZS50cnlTdGFydCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICB2YXIgc3ViamVjdEVsID0gdGhpcy5xdWVyeVN1YmplY3RFbChldik7XG4gICAgICAgIHZhciBkb3duRWwgPSBldi50YXJnZXQ7XG4gICAgICAgIGlmIChzdWJqZWN0RWwgJiZcbiAgICAgICAgICAgICghdGhpcy5oYW5kbGVTZWxlY3RvciB8fCBjb21tb24uZWxlbWVudENsb3Nlc3QoZG93bkVsLCB0aGlzLmhhbmRsZVNlbGVjdG9yKSkpIHtcbiAgICAgICAgICAgIHRoaXMuc3ViamVjdEVsID0gc3ViamVjdEVsO1xuICAgICAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTsgLy8gZG8gdGhpcyBmaXJzdCBzbyBjYW5jZWxUb3VjaFNjcm9sbCB3aWxsIHdvcmtcbiAgICAgICAgICAgIHRoaXMud2FzVG91Y2hTY3JvbGwgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIFBvaW50ZXJEcmFnZ2luZy5wcm90b3R5cGUuY2xlYW51cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXNXaW5kb3dUb3VjaE1vdmVDYW5jZWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3ViamVjdEVsID0gbnVsbDtcbiAgICAgICAgLy8ga2VlcCB3YXNUb3VjaFNjcm9sbCBhcm91bmQgZm9yIGxhdGVyIGFjY2Vzc1xuICAgICAgICB0aGlzLmRlc3Ryb3lTY3JvbGxXYXRjaCgpO1xuICAgIH07XG4gICAgUG9pbnRlckRyYWdnaW5nLnByb3RvdHlwZS5xdWVyeVN1YmplY3RFbCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIGNvbW1vbi5lbGVtZW50Q2xvc2VzdChldi50YXJnZXQsIHRoaXMuc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lckVsO1xuICAgIH07XG4gICAgUG9pbnRlckRyYWdnaW5nLnByb3RvdHlwZS5zaG91bGRJZ25vcmVNb3VzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGlnbm9yZU1vdXNlRGVwdGggfHwgdGhpcy5pc1RvdWNoRHJhZ2dpbmc7XG4gICAgfTtcbiAgICAvLyBjYW4gYmUgY2FsbGVkIGJ5IHVzZXIgb2YgdGhpcyBjbGFzcywgdG8gY2FuY2VsIHRvdWNoLWJhc2VkIHNjcm9sbGluZyBmb3IgdGhlIGN1cnJlbnQgZHJhZ1xuICAgIFBvaW50ZXJEcmFnZ2luZy5wcm90b3R5cGUuY2FuY2VsVG91Y2hTY3JvbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgICAgIGlzV2luZG93VG91Y2hNb3ZlQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gU2Nyb2xsaW5nIHRoYXQgc2ltdWxhdGVzIHBvaW50ZXJtb3Zlc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBQb2ludGVyRHJhZ2dpbmcucHJvdG90eXBlLmluaXRTY3JvbGxXYXRjaCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICBpZiAodGhpcy5zaG91bGRXYXRjaFNjcm9sbCkge1xuICAgICAgICAgICAgdGhpcy5yZWNvcmRDb29yZHMoZXYpO1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaGFuZGxlU2Nyb2xsLCB0cnVlKTsgLy8gdXNlQ2FwdHVyZT10cnVlXG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBvaW50ZXJEcmFnZ2luZy5wcm90b3R5cGUucmVjb3JkQ29vcmRzID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZFdhdGNoU2Nyb2xsKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZQYWdlWCA9IGV2LnBhZ2VYO1xuICAgICAgICAgICAgdGhpcy5wcmV2UGFnZVkgPSBldi5wYWdlWTtcbiAgICAgICAgICAgIHRoaXMucHJldlNjcm9sbFggPSB3aW5kb3cucGFnZVhPZmZzZXQ7XG4gICAgICAgICAgICB0aGlzLnByZXZTY3JvbGxZID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQb2ludGVyRHJhZ2dpbmcucHJvdG90eXBlLmRlc3Ryb3lTY3JvbGxXYXRjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkV2F0Y2hTY3JvbGwpIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLmhhbmRsZVNjcm9sbCwgdHJ1ZSk7IC8vIHVzZUNhcHR1cmVkPXRydWVcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gRXZlbnQgTm9ybWFsaXphdGlvblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBQb2ludGVyRHJhZ2dpbmcucHJvdG90eXBlLmNyZWF0ZUV2ZW50RnJvbU1vdXNlID0gZnVuY3Rpb24gKGV2LCBpc0ZpcnN0KSB7XG4gICAgICAgIHZhciBkZWx0YVggPSAwO1xuICAgICAgICB2YXIgZGVsdGFZID0gMDtcbiAgICAgICAgLy8gVE9ETzogcmVwZWF0IGNvZGVcbiAgICAgICAgaWYgKGlzRmlyc3QpIHtcbiAgICAgICAgICAgIHRoaXMub3JpZ1BhZ2VYID0gZXYucGFnZVg7XG4gICAgICAgICAgICB0aGlzLm9yaWdQYWdlWSA9IGV2LnBhZ2VZO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVsdGFYID0gZXYucGFnZVggLSB0aGlzLm9yaWdQYWdlWDtcbiAgICAgICAgICAgIGRlbHRhWSA9IGV2LnBhZ2VZIC0gdGhpcy5vcmlnUGFnZVk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9yaWdFdmVudDogZXYsXG4gICAgICAgICAgICBpc1RvdWNoOiBmYWxzZSxcbiAgICAgICAgICAgIHN1YmplY3RFbDogdGhpcy5zdWJqZWN0RWwsXG4gICAgICAgICAgICBwYWdlWDogZXYucGFnZVgsXG4gICAgICAgICAgICBwYWdlWTogZXYucGFnZVksXG4gICAgICAgICAgICBkZWx0YVg6IGRlbHRhWCxcbiAgICAgICAgICAgIGRlbHRhWTogZGVsdGFZLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgUG9pbnRlckRyYWdnaW5nLnByb3RvdHlwZS5jcmVhdGVFdmVudEZyb21Ub3VjaCA9IGZ1bmN0aW9uIChldiwgaXNGaXJzdCkge1xuICAgICAgICB2YXIgdG91Y2hlcyA9IGV2LnRvdWNoZXM7XG4gICAgICAgIHZhciBwYWdlWDtcbiAgICAgICAgdmFyIHBhZ2VZO1xuICAgICAgICB2YXIgZGVsdGFYID0gMDtcbiAgICAgICAgdmFyIGRlbHRhWSA9IDA7XG4gICAgICAgIC8vIGlmIHRvdWNoIGNvb3JkcyBhdmFpbGFibGUsIHByZWZlcixcbiAgICAgICAgLy8gYmVjYXVzZSBGRiB3b3VsZCBnaXZlIGJhZCBldi5wYWdlWCBldi5wYWdlWVxuICAgICAgICBpZiAodG91Y2hlcyAmJiB0b3VjaGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcGFnZVggPSB0b3VjaGVzWzBdLnBhZ2VYO1xuICAgICAgICAgICAgcGFnZVkgPSB0b3VjaGVzWzBdLnBhZ2VZO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGFnZVggPSBldi5wYWdlWDtcbiAgICAgICAgICAgIHBhZ2VZID0gZXYucGFnZVk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogcmVwZWF0IGNvZGVcbiAgICAgICAgaWYgKGlzRmlyc3QpIHtcbiAgICAgICAgICAgIHRoaXMub3JpZ1BhZ2VYID0gcGFnZVg7XG4gICAgICAgICAgICB0aGlzLm9yaWdQYWdlWSA9IHBhZ2VZO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVsdGFYID0gcGFnZVggLSB0aGlzLm9yaWdQYWdlWDtcbiAgICAgICAgICAgIGRlbHRhWSA9IHBhZ2VZIC0gdGhpcy5vcmlnUGFnZVk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9yaWdFdmVudDogZXYsXG4gICAgICAgICAgICBpc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgc3ViamVjdEVsOiB0aGlzLnN1YmplY3RFbCxcbiAgICAgICAgICAgIHBhZ2VYOiBwYWdlWCxcbiAgICAgICAgICAgIHBhZ2VZOiBwYWdlWSxcbiAgICAgICAgICAgIGRlbHRhWDogZGVsdGFYLFxuICAgICAgICAgICAgZGVsdGFZOiBkZWx0YVksXG4gICAgICAgIH07XG4gICAgfTtcbiAgICByZXR1cm4gUG9pbnRlckRyYWdnaW5nO1xufSgpKTtcbi8vIFJldHVybnMgYSBib29sZWFuIHdoZXRoZXIgdGhpcyB3YXMgYSBsZWZ0IG1vdXNlIGNsaWNrIGFuZCBubyBjdHJsIGtleSAod2hpY2ggbWVhbnMgcmlnaHQgY2xpY2sgb24gTWFjKVxuZnVuY3Rpb24gaXNQcmltYXJ5TW91c2VCdXR0b24oZXYpIHtcbiAgICByZXR1cm4gZXYuYnV0dG9uID09PSAwICYmICFldi5jdHJsS2V5O1xufVxuLy8gSWdub3JpbmcgZmFrZSBtb3VzZSBldmVudHMgZ2VuZXJhdGVkIGJ5IHRvdWNoXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdGFydElnbm9yaW5nTW91c2UoKSB7XG4gICAgaWdub3JlTW91c2VEZXB0aCArPSAxO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZ25vcmVNb3VzZURlcHRoIC09IDE7XG4gICAgfSwgY29tbW9uLmNvbmZpZy50b3VjaE1vdXNlSWdub3JlV2FpdCk7XG59XG4vLyBXZSB3YW50IHRvIGF0dGFjaCB0b3VjaG1vdmUgYXMgZWFybHkgYXMgcG9zc2libGUgZm9yIFNhZmFyaVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gbGlzdGVuZXJDcmVhdGVkKCkge1xuICAgIGxpc3RlbmVyQ250ICs9IDE7XG4gICAgaWYgKGxpc3RlbmVyQ250ID09PSAxKSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvbldpbmRvd1RvdWNoTW92ZSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBsaXN0ZW5lckRlc3Ryb3llZCgpIHtcbiAgICBsaXN0ZW5lckNudCAtPSAxO1xuICAgIGlmICghbGlzdGVuZXJDbnQpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uV2luZG93VG91Y2hNb3ZlLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG9uV2luZG93VG91Y2hNb3ZlKGV2KSB7XG4gICAgaWYgKGlzV2luZG93VG91Y2hNb3ZlQ2FuY2VsbGVkKSB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxufVxuXG4vKlxuQW4gZWZmZWN0IGluIHdoaWNoIGFuIGVsZW1lbnQgZm9sbG93cyB0aGUgbW92ZW1lbnQgb2YgYSBwb2ludGVyIGFjcm9zcyB0aGUgc2NyZWVuLlxuVGhlIG1vdmluZyBlbGVtZW50IGlzIGEgY2xvbmUgb2Ygc29tZSBvdGhlciBlbGVtZW50LlxuTXVzdCBjYWxsIHN0YXJ0ICsgaGFuZGxlTW92ZSArIHN0b3AuXG4qL1xudmFyIEVsZW1lbnRNaXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRWxlbWVudE1pcnJvcigpIHtcbiAgICAgICAgdGhpcy5pc1Zpc2libGUgPSBmYWxzZTsgLy8gbXVzdCBiZSBleHBsaWNpdGx5IGVuYWJsZWRcbiAgICAgICAgdGhpcy5zb3VyY2VFbCA9IG51bGw7XG4gICAgICAgIHRoaXMubWlycm9yRWwgPSBudWxsO1xuICAgICAgICB0aGlzLnNvdXJjZUVsUmVjdCA9IG51bGw7IC8vIHNjcmVlbiBjb29yZHMgcmVsYXRpdmUgdG8gdmlld3BvcnRcbiAgICAgICAgLy8gb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgZGlyZWN0bHkgYnkgY2FsbGVyXG4gICAgICAgIHRoaXMucGFyZW50Tm9kZSA9IGRvY3VtZW50LmJvZHk7IC8vIEhJR0hMWSBTVUdHRVNURUQgdG8gc2V0IHRoaXMgdG8gc2lkZXN0ZXAgU2hhZG93RE9NIGlzc3Vlc1xuICAgICAgICB0aGlzLnpJbmRleCA9IDk5OTk7XG4gICAgICAgIHRoaXMucmV2ZXJ0RHVyYXRpb24gPSAwO1xuICAgIH1cbiAgICBFbGVtZW50TWlycm9yLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uIChzb3VyY2VFbCwgcGFnZVgsIHBhZ2VZKSB7XG4gICAgICAgIHRoaXMuc291cmNlRWwgPSBzb3VyY2VFbDtcbiAgICAgICAgdGhpcy5zb3VyY2VFbFJlY3QgPSB0aGlzLnNvdXJjZUVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLm9yaWdTY3JlZW5YID0gcGFnZVggLSB3aW5kb3cucGFnZVhPZmZzZXQ7XG4gICAgICAgIHRoaXMub3JpZ1NjcmVlblkgPSBwYWdlWSAtIHdpbmRvdy5wYWdlWU9mZnNldDtcbiAgICAgICAgdGhpcy5kZWx0YVggPSAwO1xuICAgICAgICB0aGlzLmRlbHRhWSA9IDA7XG4gICAgICAgIHRoaXMudXBkYXRlRWxQb3NpdGlvbigpO1xuICAgIH07XG4gICAgRWxlbWVudE1pcnJvci5wcm90b3R5cGUuaGFuZGxlTW92ZSA9IGZ1bmN0aW9uIChwYWdlWCwgcGFnZVkpIHtcbiAgICAgICAgdGhpcy5kZWx0YVggPSAocGFnZVggLSB3aW5kb3cucGFnZVhPZmZzZXQpIC0gdGhpcy5vcmlnU2NyZWVuWDtcbiAgICAgICAgdGhpcy5kZWx0YVkgPSAocGFnZVkgLSB3aW5kb3cucGFnZVlPZmZzZXQpIC0gdGhpcy5vcmlnU2NyZWVuWTtcbiAgICAgICAgdGhpcy51cGRhdGVFbFBvc2l0aW9uKCk7XG4gICAgfTtcbiAgICAvLyBjYW4gYmUgY2FsbGVkIGJlZm9yZSBzdGFydFxuICAgIEVsZW1lbnRNaXJyb3IucHJvdG90eXBlLnNldElzVmlzaWJsZSA9IGZ1bmN0aW9uIChib29sKSB7XG4gICAgICAgIGlmIChib29sKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWlycm9yRWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taXJyb3JFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaXNWaXNpYmxlID0gYm9vbDsgLy8gbmVlZHMgdG8gaGFwcGVuIGJlZm9yZSB1cGRhdGVFbFBvc2l0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVFbFBvc2l0aW9uKCk7IC8vIGJlY2F1c2Ugd2FzIG5vdCB1cGRhdGluZyB0aGUgcG9zaXRpb24gd2hpbGUgaW52aXNpYmxlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc1Zpc2libGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1pcnJvckVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5taXJyb3JFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pc1Zpc2libGUgPSBib29sO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBhbHdheXMgYXN5bmNcbiAgICBFbGVtZW50TWlycm9yLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gKG5lZWRzUmV2ZXJ0QW5pbWF0aW9uLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLmNsZWFudXAoKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChuZWVkc1JldmVydEFuaW1hdGlvbiAmJlxuICAgICAgICAgICAgdGhpcy5taXJyb3JFbCAmJlxuICAgICAgICAgICAgdGhpcy5pc1Zpc2libGUgJiZcbiAgICAgICAgICAgIHRoaXMucmV2ZXJ0RHVyYXRpb24gJiYgLy8gaWYgMCwgdHJhbnNpdGlvbiB3b24ndCB3b3JrXG4gICAgICAgICAgICAodGhpcy5kZWx0YVggfHwgdGhpcy5kZWx0YVkpIC8vIGlmIHNhbWUgY29vcmRzLCB0cmFuc2l0aW9uIHdvbid0IHdvcmtcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmRvUmV2ZXJ0QW5pbWF0aW9uKGRvbmUsIHRoaXMucmV2ZXJ0RHVyYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChkb25lLCAwKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRWxlbWVudE1pcnJvci5wcm90b3R5cGUuZG9SZXZlcnRBbmltYXRpb24gPSBmdW5jdGlvbiAoY2FsbGJhY2ssIHJldmVydER1cmF0aW9uKSB7XG4gICAgICAgIHZhciBtaXJyb3JFbCA9IHRoaXMubWlycm9yRWw7XG4gICAgICAgIHZhciBmaW5hbFNvdXJjZUVsUmVjdCA9IHRoaXMuc291cmNlRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IC8vIGJlY2F1c2UgYXV0b3Njcm9sbGluZyBtaWdodCBoYXZlIGhhcHBlbmVkXG4gICAgICAgIG1pcnJvckVsLnN0eWxlLnRyYW5zaXRpb24gPVxuICAgICAgICAgICAgJ3RvcCAnICsgcmV2ZXJ0RHVyYXRpb24gKyAnbXMsJyArXG4gICAgICAgICAgICAgICAgJ2xlZnQgJyArIHJldmVydER1cmF0aW9uICsgJ21zJztcbiAgICAgICAgY29tbW9uLmFwcGx5U3R5bGUobWlycm9yRWwsIHtcbiAgICAgICAgICAgIGxlZnQ6IGZpbmFsU291cmNlRWxSZWN0LmxlZnQsXG4gICAgICAgICAgICB0b3A6IGZpbmFsU291cmNlRWxSZWN0LnRvcCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbW1vbi53aGVuVHJhbnNpdGlvbkRvbmUobWlycm9yRWwsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG1pcnJvckVsLnN0eWxlLnRyYW5zaXRpb24gPSAnJztcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRWxlbWVudE1pcnJvci5wcm90b3R5cGUuY2xlYW51cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMubWlycm9yRWwpIHtcbiAgICAgICAgICAgIGNvbW1vbi5yZW1vdmVFbGVtZW50KHRoaXMubWlycm9yRWwpO1xuICAgICAgICAgICAgdGhpcy5taXJyb3JFbCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zb3VyY2VFbCA9IG51bGw7XG4gICAgfTtcbiAgICBFbGVtZW50TWlycm9yLnByb3RvdHlwZS51cGRhdGVFbFBvc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5zb3VyY2VFbCAmJiB0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgICAgICAgY29tbW9uLmFwcGx5U3R5bGUodGhpcy5nZXRNaXJyb3JFbCgpLCB7XG4gICAgICAgICAgICAgICAgbGVmdDogdGhpcy5zb3VyY2VFbFJlY3QubGVmdCArIHRoaXMuZGVsdGFYLFxuICAgICAgICAgICAgICAgIHRvcDogdGhpcy5zb3VyY2VFbFJlY3QudG9wICsgdGhpcy5kZWx0YVksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRWxlbWVudE1pcnJvci5wcm90b3R5cGUuZ2V0TWlycm9yRWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzb3VyY2VFbFJlY3QgPSB0aGlzLnNvdXJjZUVsUmVjdDtcbiAgICAgICAgdmFyIG1pcnJvckVsID0gdGhpcy5taXJyb3JFbDtcbiAgICAgICAgaWYgKCFtaXJyb3JFbCkge1xuICAgICAgICAgICAgbWlycm9yRWwgPSB0aGlzLm1pcnJvckVsID0gdGhpcy5zb3VyY2VFbC5jbG9uZU5vZGUodHJ1ZSk7IC8vIGNsb25lQ2hpbGRyZW49dHJ1ZVxuICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCBsb25nIHRhcHMgb3IgYW55IG1vdXNlIGludGVyYWN0aW9uIGNhdXNpbmcgc2VsZWN0aW9uL21lbnVzLlxuICAgICAgICAgICAgLy8gd291bGQgdXNlIHByZXZlbnRTZWxlY3Rpb24oKSwgYnV0IHRoYXQgcHJldmVudHMgc2VsZWN0c3RhcnQsIGNhdXNpbmcgcHJvYmxlbXMuXG4gICAgICAgICAgICBtaXJyb3JFbC5jbGFzc0xpc3QuYWRkKCdmYy11bnNlbGVjdGFibGUnKTtcbiAgICAgICAgICAgIG1pcnJvckVsLmNsYXNzTGlzdC5hZGQoJ2ZjLWV2ZW50LWRyYWdnaW5nJyk7XG4gICAgICAgICAgICBjb21tb24uYXBwbHlTdHlsZShtaXJyb3JFbCwge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICAgICAgICAgIHpJbmRleDogdGhpcy56SW5kZXgsXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogJycsXG4gICAgICAgICAgICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHNvdXJjZUVsUmVjdC5yaWdodCAtIHNvdXJjZUVsUmVjdC5sZWZ0LFxuICAgICAgICAgICAgICAgIGhlaWdodDogc291cmNlRWxSZWN0LmJvdHRvbSAtIHNvdXJjZUVsUmVjdC50b3AsXG4gICAgICAgICAgICAgICAgcmlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICBib3R0b206ICdhdXRvJyxcbiAgICAgICAgICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChtaXJyb3JFbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pcnJvckVsO1xuICAgIH07XG4gICAgcmV0dXJuIEVsZW1lbnRNaXJyb3I7XG59KCkpO1xuXG4vKlxuSXMgYSBjYWNoZSBmb3IgYSBnaXZlbiBlbGVtZW50J3Mgc2Nyb2xsIGluZm9ybWF0aW9uIChhbGwgdGhlIGluZm8gdGhhdCBTY3JvbGxDb250cm9sbGVyIHN0b3JlcylcbmluIGFkZGl0aW9uIHRoZSBcImNsaWVudCByZWN0YW5nbGVcIiBvZiB0aGUgZWxlbWVudC4uIHRoZSBhcmVhIHdpdGhpbiB0aGUgc2Nyb2xsYmFycy5cblxuVGhlIGNhY2hlIGNhbiBiZSBpbiBvbmUgb2YgdHdvIG1vZGVzOlxuLSBkb2VzTGlzdGVuaW5nOmZhbHNlIC0gaWdub3JlcyB3aGVuIHRoZSBjb250YWluZXIgaXMgc2Nyb2xsZWQgYnkgc29tZW9uZSBlbHNlXG4tIGRvZXNMaXN0ZW5pbmc6dHJ1ZSAtIHdhdGNoIGZvciBzY3JvbGxpbmcgYW5kIHVwZGF0ZSB0aGUgY2FjaGVcbiovXG52YXIgU2Nyb2xsR2VvbUNhY2hlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhTY3JvbGxHZW9tQ2FjaGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU2Nyb2xsR2VvbUNhY2hlKHNjcm9sbENvbnRyb2xsZXIsIGRvZXNMaXN0ZW5pbmcpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuaGFuZGxlU2Nyb2xsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMuc2Nyb2xsVG9wID0gX3RoaXMuc2Nyb2xsQ29udHJvbGxlci5nZXRTY3JvbGxUb3AoKTtcbiAgICAgICAgICAgIF90aGlzLnNjcm9sbExlZnQgPSBfdGhpcy5zY3JvbGxDb250cm9sbGVyLmdldFNjcm9sbExlZnQoKTtcbiAgICAgICAgICAgIF90aGlzLmhhbmRsZVNjcm9sbENoYW5nZSgpO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5zY3JvbGxDb250cm9sbGVyID0gc2Nyb2xsQ29udHJvbGxlcjtcbiAgICAgICAgX3RoaXMuZG9lc0xpc3RlbmluZyA9IGRvZXNMaXN0ZW5pbmc7XG4gICAgICAgIF90aGlzLnNjcm9sbFRvcCA9IF90aGlzLm9yaWdTY3JvbGxUb3AgPSBzY3JvbGxDb250cm9sbGVyLmdldFNjcm9sbFRvcCgpO1xuICAgICAgICBfdGhpcy5zY3JvbGxMZWZ0ID0gX3RoaXMub3JpZ1Njcm9sbExlZnQgPSBzY3JvbGxDb250cm9sbGVyLmdldFNjcm9sbExlZnQoKTtcbiAgICAgICAgX3RoaXMuc2Nyb2xsV2lkdGggPSBzY3JvbGxDb250cm9sbGVyLmdldFNjcm9sbFdpZHRoKCk7XG4gICAgICAgIF90aGlzLnNjcm9sbEhlaWdodCA9IHNjcm9sbENvbnRyb2xsZXIuZ2V0U2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgIF90aGlzLmNsaWVudFdpZHRoID0gc2Nyb2xsQ29udHJvbGxlci5nZXRDbGllbnRXaWR0aCgpO1xuICAgICAgICBfdGhpcy5jbGllbnRIZWlnaHQgPSBzY3JvbGxDb250cm9sbGVyLmdldENsaWVudEhlaWdodCgpO1xuICAgICAgICBfdGhpcy5jbGllbnRSZWN0ID0gX3RoaXMuY29tcHV0ZUNsaWVudFJlY3QoKTsgLy8gZG8gbGFzdCBpbiBjYXNlIGl0IG5lZWRzIGNhY2hlZCB2YWx1ZXNcbiAgICAgICAgaWYgKF90aGlzLmRvZXNMaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIF90aGlzLmdldEV2ZW50VGFyZ2V0KCkuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgX3RoaXMuaGFuZGxlU2Nyb2xsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFNjcm9sbEdlb21DYWNoZS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZG9lc0xpc3RlbmluZykge1xuICAgICAgICAgICAgdGhpcy5nZXRFdmVudFRhcmdldCgpLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaGFuZGxlU2Nyb2xsKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU2Nyb2xsR2VvbUNhY2hlLnByb3RvdHlwZS5nZXRTY3JvbGxUb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFRvcDtcbiAgICB9O1xuICAgIFNjcm9sbEdlb21DYWNoZS5wcm90b3R5cGUuZ2V0U2Nyb2xsTGVmdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsTGVmdDtcbiAgICB9O1xuICAgIFNjcm9sbEdlb21DYWNoZS5wcm90b3R5cGUuc2V0U2Nyb2xsVG9wID0gZnVuY3Rpb24gKHRvcCkge1xuICAgICAgICB0aGlzLnNjcm9sbENvbnRyb2xsZXIuc2V0U2Nyb2xsVG9wKHRvcCk7XG4gICAgICAgIGlmICghdGhpcy5kb2VzTGlzdGVuaW5nKSB7XG4gICAgICAgICAgICAvLyB3ZSBhcmUgbm90IHJlbHlpbmcgb24gdGhlIGVsZW1lbnQgdG8gbm9ybWFsaXplIG91dC1vZi1ib3VuZHMgc2Nyb2xsIHZhbHVlc1xuICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBzYW5pdGl6ZSBvdXJzZWx2ZXNcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gTWF0aC5tYXgoTWF0aC5taW4odG9wLCB0aGlzLmdldE1heFNjcm9sbFRvcCgpKSwgMCk7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbENoYW5nZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTY3JvbGxHZW9tQ2FjaGUucHJvdG90eXBlLnNldFNjcm9sbExlZnQgPSBmdW5jdGlvbiAodG9wKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udHJvbGxlci5zZXRTY3JvbGxMZWZ0KHRvcCk7XG4gICAgICAgIGlmICghdGhpcy5kb2VzTGlzdGVuaW5nKSB7XG4gICAgICAgICAgICAvLyB3ZSBhcmUgbm90IHJlbHlpbmcgb24gdGhlIGVsZW1lbnQgdG8gbm9ybWFsaXplIG91dC1vZi1ib3VuZHMgc2Nyb2xsIHZhbHVlc1xuICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBzYW5pdGl6ZSBvdXJzZWx2ZXNcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsTGVmdCA9IE1hdGgubWF4KE1hdGgubWluKHRvcCwgdGhpcy5nZXRNYXhTY3JvbGxMZWZ0KCkpLCAwKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2Nyb2xsQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNjcm9sbEdlb21DYWNoZS5wcm90b3R5cGUuZ2V0Q2xpZW50V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudFdpZHRoO1xuICAgIH07XG4gICAgU2Nyb2xsR2VvbUNhY2hlLnByb3RvdHlwZS5nZXRDbGllbnRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudEhlaWdodDtcbiAgICB9O1xuICAgIFNjcm9sbEdlb21DYWNoZS5wcm90b3R5cGUuZ2V0U2Nyb2xsV2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFdpZHRoO1xuICAgIH07XG4gICAgU2Nyb2xsR2VvbUNhY2hlLnByb3RvdHlwZS5nZXRTY3JvbGxIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbEhlaWdodDtcbiAgICB9O1xuICAgIFNjcm9sbEdlb21DYWNoZS5wcm90b3R5cGUuaGFuZGxlU2Nyb2xsQ2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgIH07XG4gICAgcmV0dXJuIFNjcm9sbEdlb21DYWNoZTtcbn0oY29tbW9uLlNjcm9sbENvbnRyb2xsZXIpKTtcblxudmFyIEVsZW1lbnRTY3JvbGxHZW9tQ2FjaGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKEVsZW1lbnRTY3JvbGxHZW9tQ2FjaGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRWxlbWVudFNjcm9sbEdlb21DYWNoZShlbCwgZG9lc0xpc3RlbmluZykge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgbmV3IGNvbW1vbi5FbGVtZW50U2Nyb2xsQ29udHJvbGxlcihlbCksIGRvZXNMaXN0ZW5pbmcpIHx8IHRoaXM7XG4gICAgfVxuICAgIEVsZW1lbnRTY3JvbGxHZW9tQ2FjaGUucHJvdG90eXBlLmdldEV2ZW50VGFyZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxDb250cm9sbGVyLmVsO1xuICAgIH07XG4gICAgRWxlbWVudFNjcm9sbEdlb21DYWNoZS5wcm90b3R5cGUuY29tcHV0ZUNsaWVudFJlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBjb21tb24uY29tcHV0ZUlubmVyUmVjdCh0aGlzLnNjcm9sbENvbnRyb2xsZXIuZWwpO1xuICAgIH07XG4gICAgcmV0dXJuIEVsZW1lbnRTY3JvbGxHZW9tQ2FjaGU7XG59KFNjcm9sbEdlb21DYWNoZSkpO1xuXG52YXIgV2luZG93U2Nyb2xsR2VvbUNhY2hlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhXaW5kb3dTY3JvbGxHZW9tQ2FjaGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gV2luZG93U2Nyb2xsR2VvbUNhY2hlKGRvZXNMaXN0ZW5pbmcpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIG5ldyBjb21tb24uV2luZG93U2Nyb2xsQ29udHJvbGxlcigpLCBkb2VzTGlzdGVuaW5nKSB8fCB0aGlzO1xuICAgIH1cbiAgICBXaW5kb3dTY3JvbGxHZW9tQ2FjaGUucHJvdG90eXBlLmdldEV2ZW50VGFyZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gd2luZG93O1xuICAgIH07XG4gICAgV2luZG93U2Nyb2xsR2VvbUNhY2hlLnByb3RvdHlwZS5jb21wdXRlQ2xpZW50UmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlZnQ6IHRoaXMuc2Nyb2xsTGVmdCxcbiAgICAgICAgICAgIHJpZ2h0OiB0aGlzLnNjcm9sbExlZnQgKyB0aGlzLmNsaWVudFdpZHRoLFxuICAgICAgICAgICAgdG9wOiB0aGlzLnNjcm9sbFRvcCxcbiAgICAgICAgICAgIGJvdHRvbTogdGhpcy5zY3JvbGxUb3AgKyB0aGlzLmNsaWVudEhlaWdodCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8vIHRoZSB3aW5kb3cgaXMgdGhlIG9ubHkgc2Nyb2xsIG9iamVjdCB0aGF0IGNoYW5nZXMgaXQncyByZWN0YW5nbGUgcmVsYXRpdmVcbiAgICAvLyB0byB0aGUgZG9jdW1lbnQncyB0b3BsZWZ0IGFzIGl0IHNjcm9sbHNcbiAgICBXaW5kb3dTY3JvbGxHZW9tQ2FjaGUucHJvdG90eXBlLmhhbmRsZVNjcm9sbENoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jbGllbnRSZWN0ID0gdGhpcy5jb21wdXRlQ2xpZW50UmVjdCgpO1xuICAgIH07XG4gICAgcmV0dXJuIFdpbmRvd1Njcm9sbEdlb21DYWNoZTtcbn0oU2Nyb2xsR2VvbUNhY2hlKSk7XG5cbi8vIElmIGF2YWlsYWJsZSB3ZSBhcmUgdXNpbmcgbmF0aXZlIFwicGVyZm9ybWFuY2VcIiBBUEkgaW5zdGVhZCBvZiBcIkRhdGVcIlxuLy8gUmVhZCBtb3JlIGFib3V0IGl0IG9uIE1ETjpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9QZXJmb3JtYW5jZVxudmFyIGdldFRpbWUgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICdmdW5jdGlvbicgPyBwZXJmb3JtYW5jZS5ub3cgOiBEYXRlLm5vdztcbi8qXG5Gb3IgYSBwb2ludGVyIGludGVyYWN0aW9uLCBhdXRvbWF0aWNhbGx5IHNjcm9sbHMgY2VydGFpbiBzY3JvbGwgY29udGFpbmVycyB3aGVuIHRoZSBwb2ludGVyXG5hcHByb2FjaGVzIHRoZSBlZGdlLlxuXG5UaGUgY2FsbGVyIG11c3QgY2FsbCBzdGFydCArIGhhbmRsZU1vdmUgKyBzdG9wLlxuKi9cbnZhciBBdXRvU2Nyb2xsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXV0b1Njcm9sbGVyKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAvLyBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBieSBjYWxsZXJcbiAgICAgICAgdGhpcy5pc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNjcm9sbFF1ZXJ5ID0gW3dpbmRvdywgJy5mYy1zY3JvbGxlciddO1xuICAgICAgICB0aGlzLmVkZ2VUaHJlc2hvbGQgPSA1MDsgLy8gcGl4ZWxzXG4gICAgICAgIHRoaXMubWF4VmVsb2NpdHkgPSAzMDA7IC8vIHBpeGVscyBwZXIgc2Vjb25kXG4gICAgICAgIC8vIGludGVybmFsIHN0YXRlXG4gICAgICAgIHRoaXMucG9pbnRlclNjcmVlblggPSBudWxsO1xuICAgICAgICB0aGlzLnBvaW50ZXJTY3JlZW5ZID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNjcm9sbENhY2hlcyA9IG51bGw7XG4gICAgICAgIC8vIHByb3RlY3QgYWdhaW5zdCB0aGUgaW5pdGlhbCBwb2ludGVyZG93biBiZWluZyB0b28gY2xvc2UgdG8gYW4gZWRnZSBhbmQgc3RhcnRpbmcgdGhlIHNjcm9sbFxuICAgICAgICB0aGlzLmV2ZXJNb3ZlZFVwID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXZlck1vdmVkRG93biA9IGZhbHNlO1xuICAgICAgICB0aGlzLmV2ZXJNb3ZlZExlZnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ldmVyTW92ZWRSaWdodCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFuaW1hdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMuaXNBbmltYXRpbmcpIHsgLy8gd2Fzbid0IGNhbmNlbGxlZCBiZXR3ZWVuIGFuaW1hdGlvbiBjYWxsc1xuICAgICAgICAgICAgICAgIHZhciBlZGdlID0gX3RoaXMuY29tcHV0ZUJlc3RFZGdlKF90aGlzLnBvaW50ZXJTY3JlZW5YICsgd2luZG93LnBhZ2VYT2Zmc2V0LCBfdGhpcy5wb2ludGVyU2NyZWVuWSArIHdpbmRvdy5wYWdlWU9mZnNldCk7XG4gICAgICAgICAgICAgICAgaWYgKGVkZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5vdyA9IGdldFRpbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuaGFuZGxlU2lkZShlZGdlLCAobm93IC0gX3RoaXMubXNTaW5jZVJlcXVlc3QpIC8gMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlcXVlc3RBbmltYXRpb24obm93KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmlzQW5pbWF0aW5nID0gZmFsc2U7IC8vIHdpbGwgc3RvcCBhbmltYXRpb25cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIEF1dG9TY3JvbGxlci5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAocGFnZVgsIHBhZ2VZLCBzY3JvbGxTdGFydEVsKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxDYWNoZXMgPSB0aGlzLmJ1aWxkQ2FjaGVzKHNjcm9sbFN0YXJ0RWwpO1xuICAgICAgICAgICAgdGhpcy5wb2ludGVyU2NyZWVuWCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnBvaW50ZXJTY3JlZW5ZID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZXZlck1vdmVkVXAgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZXZlck1vdmVkRG93biA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5ldmVyTW92ZWRMZWZ0ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmV2ZXJNb3ZlZFJpZ2h0ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU1vdmUocGFnZVgsIHBhZ2VZKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQXV0b1Njcm9sbGVyLnByb3RvdHlwZS5oYW5kbGVNb3ZlID0gZnVuY3Rpb24gKHBhZ2VYLCBwYWdlWSkge1xuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHZhciBwb2ludGVyU2NyZWVuWCA9IHBhZ2VYIC0gd2luZG93LnBhZ2VYT2Zmc2V0O1xuICAgICAgICAgICAgdmFyIHBvaW50ZXJTY3JlZW5ZID0gcGFnZVkgLSB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gICAgICAgICAgICB2YXIgeURlbHRhID0gdGhpcy5wb2ludGVyU2NyZWVuWSA9PT0gbnVsbCA/IDAgOiBwb2ludGVyU2NyZWVuWSAtIHRoaXMucG9pbnRlclNjcmVlblk7XG4gICAgICAgICAgICB2YXIgeERlbHRhID0gdGhpcy5wb2ludGVyU2NyZWVuWCA9PT0gbnVsbCA/IDAgOiBwb2ludGVyU2NyZWVuWCAtIHRoaXMucG9pbnRlclNjcmVlblg7XG4gICAgICAgICAgICBpZiAoeURlbHRhIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlck1vdmVkVXAgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoeURlbHRhID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlck1vdmVkRG93biA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoeERlbHRhIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlck1vdmVkTGVmdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh4RGVsdGEgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ldmVyTW92ZWRSaWdodCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBvaW50ZXJTY3JlZW5YID0gcG9pbnRlclNjcmVlblg7XG4gICAgICAgICAgICB0aGlzLnBvaW50ZXJTY3JlZW5ZID0gcG9pbnRlclNjcmVlblk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNBbmltYXRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzQW5pbWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RBbmltYXRpb24oZ2V0VGltZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgQXV0b1Njcm9sbGVyLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSBmYWxzZTsgLy8gd2lsbCBzdG9wIGFuaW1hdGlvblxuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRoaXMuc2Nyb2xsQ2FjaGVzOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIHZhciBzY3JvbGxDYWNoZSA9IF9hW19pXTtcbiAgICAgICAgICAgICAgICBzY3JvbGxDYWNoZS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNjcm9sbENhY2hlcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEF1dG9TY3JvbGxlci5wcm90b3R5cGUucmVxdWVzdEFuaW1hdGlvbiA9IGZ1bmN0aW9uIChub3cpIHtcbiAgICAgICAgdGhpcy5tc1NpbmNlUmVxdWVzdCA9IG5vdztcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0ZSk7XG4gICAgfTtcbiAgICBBdXRvU2Nyb2xsZXIucHJvdG90eXBlLmhhbmRsZVNpZGUgPSBmdW5jdGlvbiAoZWRnZSwgc2Vjb25kcykge1xuICAgICAgICB2YXIgc2Nyb2xsQ2FjaGUgPSBlZGdlLnNjcm9sbENhY2hlO1xuICAgICAgICB2YXIgZWRnZVRocmVzaG9sZCA9IHRoaXMuZWRnZVRocmVzaG9sZDtcbiAgICAgICAgdmFyIGludkRpc3RhbmNlID0gZWRnZVRocmVzaG9sZCAtIGVkZ2UuZGlzdGFuY2U7XG4gICAgICAgIHZhciB2ZWxvY2l0eSA9IC8vIHRoZSBjbG9zZXIgdG8gdGhlIGVkZ2UsIHRoZSBmYXN0ZXIgd2Ugc2Nyb2xsXG4gICAgICAgICAoKGludkRpc3RhbmNlICogaW52RGlzdGFuY2UpIC8gKGVkZ2VUaHJlc2hvbGQgKiBlZGdlVGhyZXNob2xkKSkgKiAvLyBxdWFkcmF0aWNcbiAgICAgICAgICAgIHRoaXMubWF4VmVsb2NpdHkgKiBzZWNvbmRzO1xuICAgICAgICB2YXIgc2lnbiA9IDE7XG4gICAgICAgIHN3aXRjaCAoZWRnZS5uYW1lKSB7XG4gICAgICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICAgICAgICBzaWduID0gLTE7XG4gICAgICAgICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICAgICAgc2Nyb2xsQ2FjaGUuc2V0U2Nyb2xsTGVmdChzY3JvbGxDYWNoZS5nZXRTY3JvbGxMZWZ0KCkgKyB2ZWxvY2l0eSAqIHNpZ24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgICAgICBzaWduID0gLTE7XG4gICAgICAgICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAgICAgIHNjcm9sbENhY2hlLnNldFNjcm9sbFRvcChzY3JvbGxDYWNoZS5nZXRTY3JvbGxUb3AoKSArIHZlbG9jaXR5ICogc2lnbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIGxlZnQvdG9wIGFyZSByZWxhdGl2ZSB0byBkb2N1bWVudCB0b3BsZWZ0XG4gICAgQXV0b1Njcm9sbGVyLnByb3RvdHlwZS5jb21wdXRlQmVzdEVkZ2UgPSBmdW5jdGlvbiAobGVmdCwgdG9wKSB7XG4gICAgICAgIHZhciBlZGdlVGhyZXNob2xkID0gdGhpcy5lZGdlVGhyZXNob2xkO1xuICAgICAgICB2YXIgYmVzdFNpZGUgPSBudWxsO1xuICAgICAgICB2YXIgc2Nyb2xsQ2FjaGVzID0gdGhpcy5zY3JvbGxDYWNoZXMgfHwgW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgc2Nyb2xsQ2FjaGVzXzEgPSBzY3JvbGxDYWNoZXM7IF9pIDwgc2Nyb2xsQ2FjaGVzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgc2Nyb2xsQ2FjaGUgPSBzY3JvbGxDYWNoZXNfMVtfaV07XG4gICAgICAgICAgICB2YXIgcmVjdCA9IHNjcm9sbENhY2hlLmNsaWVudFJlY3Q7XG4gICAgICAgICAgICB2YXIgbGVmdERpc3QgPSBsZWZ0IC0gcmVjdC5sZWZ0O1xuICAgICAgICAgICAgdmFyIHJpZ2h0RGlzdCA9IHJlY3QucmlnaHQgLSBsZWZ0O1xuICAgICAgICAgICAgdmFyIHRvcERpc3QgPSB0b3AgLSByZWN0LnRvcDtcbiAgICAgICAgICAgIHZhciBib3R0b21EaXN0ID0gcmVjdC5ib3R0b20gLSB0b3A7XG4gICAgICAgICAgICAvLyBjb21wbGV0ZWx5IHdpdGhpbiB0aGUgcmVjdD9cbiAgICAgICAgICAgIGlmIChsZWZ0RGlzdCA+PSAwICYmIHJpZ2h0RGlzdCA+PSAwICYmIHRvcERpc3QgPj0gMCAmJiBib3R0b21EaXN0ID49IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodG9wRGlzdCA8PSBlZGdlVGhyZXNob2xkICYmIHRoaXMuZXZlck1vdmVkVXAgJiYgc2Nyb2xsQ2FjaGUuY2FuU2Nyb2xsVXAoKSAmJlxuICAgICAgICAgICAgICAgICAgICAoIWJlc3RTaWRlIHx8IGJlc3RTaWRlLmRpc3RhbmNlID4gdG9wRGlzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYmVzdFNpZGUgPSB7IHNjcm9sbENhY2hlOiBzY3JvbGxDYWNoZSwgbmFtZTogJ3RvcCcsIGRpc3RhbmNlOiB0b3BEaXN0IH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChib3R0b21EaXN0IDw9IGVkZ2VUaHJlc2hvbGQgJiYgdGhpcy5ldmVyTW92ZWREb3duICYmIHNjcm9sbENhY2hlLmNhblNjcm9sbERvd24oKSAmJlxuICAgICAgICAgICAgICAgICAgICAoIWJlc3RTaWRlIHx8IGJlc3RTaWRlLmRpc3RhbmNlID4gYm90dG9tRGlzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYmVzdFNpZGUgPSB7IHNjcm9sbENhY2hlOiBzY3JvbGxDYWNoZSwgbmFtZTogJ2JvdHRvbScsIGRpc3RhbmNlOiBib3R0b21EaXN0IH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsZWZ0RGlzdCA8PSBlZGdlVGhyZXNob2xkICYmIHRoaXMuZXZlck1vdmVkTGVmdCAmJiBzY3JvbGxDYWNoZS5jYW5TY3JvbGxMZWZ0KCkgJiZcbiAgICAgICAgICAgICAgICAgICAgKCFiZXN0U2lkZSB8fCBiZXN0U2lkZS5kaXN0YW5jZSA+IGxlZnREaXN0KSkge1xuICAgICAgICAgICAgICAgICAgICBiZXN0U2lkZSA9IHsgc2Nyb2xsQ2FjaGU6IHNjcm9sbENhY2hlLCBuYW1lOiAnbGVmdCcsIGRpc3RhbmNlOiBsZWZ0RGlzdCB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmlnaHREaXN0IDw9IGVkZ2VUaHJlc2hvbGQgJiYgdGhpcy5ldmVyTW92ZWRSaWdodCAmJiBzY3JvbGxDYWNoZS5jYW5TY3JvbGxSaWdodCgpICYmXG4gICAgICAgICAgICAgICAgICAgICghYmVzdFNpZGUgfHwgYmVzdFNpZGUuZGlzdGFuY2UgPiByaWdodERpc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RTaWRlID0geyBzY3JvbGxDYWNoZTogc2Nyb2xsQ2FjaGUsIG5hbWU6ICdyaWdodCcsIGRpc3RhbmNlOiByaWdodERpc3QgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJlc3RTaWRlO1xuICAgIH07XG4gICAgQXV0b1Njcm9sbGVyLnByb3RvdHlwZS5idWlsZENhY2hlcyA9IGZ1bmN0aW9uIChzY3JvbGxTdGFydEVsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2Nyb2xsRWxzKHNjcm9sbFN0YXJ0RWwpLm1hcChmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIGlmIChlbCA9PT0gd2luZG93KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXaW5kb3dTY3JvbGxHZW9tQ2FjaGUoZmFsc2UpOyAvLyBmYWxzZSA9IGRvbid0IGxpc3RlbiB0byB1c2VyLWdlbmVyYXRlZCBzY3JvbGxzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnRTY3JvbGxHZW9tQ2FjaGUoZWwsIGZhbHNlKTsgLy8gZmFsc2UgPSBkb24ndCBsaXN0ZW4gdG8gdXNlci1nZW5lcmF0ZWQgc2Nyb2xsc1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEF1dG9TY3JvbGxlci5wcm90b3R5cGUucXVlcnlTY3JvbGxFbHMgPSBmdW5jdGlvbiAoc2Nyb2xsU3RhcnRFbCkge1xuICAgICAgICB2YXIgZWxzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0aGlzLnNjcm9sbFF1ZXJ5OyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIHF1ZXJ5ID0gX2FbX2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBxdWVyeSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBlbHMucHVzaChxdWVyeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbHMucHVzaC5hcHBseShlbHMsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGNvbW1vbi5nZXRFbFJvb3Qoc2Nyb2xsU3RhcnRFbCkucXVlcnlTZWxlY3RvckFsbChxdWVyeSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxzO1xuICAgIH07XG4gICAgcmV0dXJuIEF1dG9TY3JvbGxlcjtcbn0oKSk7XG5cbi8qXG5Nb25pdG9ycyBkcmFnZ2luZyBvbiBhbiBlbGVtZW50LiBIYXMgYSBudW1iZXIgb2YgaGlnaC1sZXZlbCBmZWF0dXJlczpcbi0gbWluaW11bSBkaXN0YW5jZSByZXF1aXJlZCBiZWZvcmUgZHJhZ2dpbmdcbi0gbWluaW11bSB3YWl0IHRpbWUgKFwiZGVsYXlcIikgYmVmb3JlIGRyYWdnaW5nXG4tIGEgbWlycm9yIGVsZW1lbnQgdGhhdCBmb2xsb3dzIHRoZSBwb2ludGVyXG4qL1xudmFyIEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZyhjb250YWluZXJFbCwgc2VsZWN0b3IpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY29udGFpbmVyRWwpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmNvbnRhaW5lckVsID0gY29udGFpbmVyRWw7XG4gICAgICAgIC8vIG9wdGlvbnMgdGhhdCBjYW4gYmUgZGlyZWN0bHkgc2V0IGJ5IGNhbGxlclxuICAgICAgICAvLyB0aGUgY2FsbGVyIGNhbiBhbHNvIHNldCB0aGUgUG9pbnRlckRyYWdnaW5nJ3Mgb3B0aW9ucyBhcyB3ZWxsXG4gICAgICAgIF90aGlzLmRlbGF5ID0gbnVsbDtcbiAgICAgICAgX3RoaXMubWluRGlzdGFuY2UgPSAwO1xuICAgICAgICBfdGhpcy50b3VjaFNjcm9sbEFsbG93ZWQgPSB0cnVlOyAvLyBwcmV2ZW50cyBkcmFnIGZyb20gc3RhcnRpbmcgYW5kIGJsb2NrcyBzY3JvbGxpbmcgZHVyaW5nIGRyYWdcbiAgICAgICAgX3RoaXMubWlycm9yTmVlZHNSZXZlcnQgPSBmYWxzZTtcbiAgICAgICAgX3RoaXMuaXNJbnRlcmFjdGluZyA9IGZhbHNlOyAvLyBpcyB0aGUgdXNlciB2YWxpZGx5IG1vdmluZyB0aGUgcG9pbnRlcj8gbGFzdHMgdW50aWwgcG9pbnRlcnVwXG4gICAgICAgIF90aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTsgLy8gaXMgaXQgSU5URU5URlVMTFkgZHJhZ2dpbmc/IGxhc3RzIHVudGlsIGFmdGVyIHJldmVydCBhbmltYXRpb25cbiAgICAgICAgX3RoaXMuaXNEZWxheUVuZGVkID0gZmFsc2U7XG4gICAgICAgIF90aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgX3RoaXMuZGVsYXlUaW1lb3V0SWQgPSBudWxsO1xuICAgICAgICBfdGhpcy5vblBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBpZiAoIV90aGlzLmlzRHJhZ2dpbmcpIHsgLy8gc28gbmV3IGRyYWcgZG9lc24ndCBoYXBwZW4gd2hpbGUgcmV2ZXJ0IGFuaW1hdGlvbiBpcyBnb2luZ1xuICAgICAgICAgICAgICAgIF90aGlzLmlzSW50ZXJhY3RpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIF90aGlzLmlzRGVsYXlFbmRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIF90aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb21tb24ucHJldmVudFNlbGVjdGlvbihkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgICAgICAgICBjb21tb24ucHJldmVudENvbnRleHRNZW51KGRvY3VtZW50LmJvZHkpO1xuICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgbGlua3MgZnJvbSBiZWluZyB2aXNpdGVkIGlmIHRoZXJlJ3MgYW4gZXZlbnR1YWwgZHJhZy5cbiAgICAgICAgICAgICAgICAvLyBhbHNvIHByZXZlbnRzIHNlbGVjdGlvbiBpbiBvbGRlciBicm93c2VycyAobWF5YmU/KS5cbiAgICAgICAgICAgICAgICAvLyBub3QgbmVjZXNzYXJ5IGZvciB0b3VjaCwgYmVzaWRlcywgYnJvd3NlciB3b3VsZCBjb21wbGFpbiBhYm91dCBwYXNzaXZlbmVzcy5cbiAgICAgICAgICAgICAgICBpZiAoIWV2LmlzVG91Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgZXYub3JpZ0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF90aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcmRvd24nLCBldik7XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmlzSW50ZXJhY3RpbmcgJiYgLy8gbm90IGRlc3Ryb3llZCB2aWEgcG9pbnRlcmRvd24gaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAhX3RoaXMucG9pbnRlci5zaG91bGRJZ25vcmVNb3ZlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFjdGlvbnMgcmVsYXRlZCB0byBpbml0aWF0aW5nIGRyYWdzdGFydCtkcmFnbW92ZStkcmFnZW5kLi4uXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm1pcnJvci5zZXRJc1Zpc2libGUoZmFsc2UpOyAvLyByZXNldC4gY2FsbGVyIG11c3Qgc2V0LXZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMubWlycm9yLnN0YXJ0KGV2LnN1YmplY3RFbCwgZXYucGFnZVgsIGV2LnBhZ2VZKTsgLy8gbXVzdCBoYXBwZW4gb24gZmlyc3QgcG9pbnRlciBkb3duXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnN0YXJ0RGVsYXkoZXYpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIV90aGlzLm1pbkRpc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5oYW5kbGVEaXN0YW5jZVN1cnBhc3NlZChldik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLm9uUG9pbnRlck1vdmUgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5pc0ludGVyYWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdHRlci50cmlnZ2VyKCdwb2ludGVybW92ZScsIGV2KTtcbiAgICAgICAgICAgICAgICBpZiAoIV90aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1pbkRpc3RhbmNlID0gX3RoaXMubWluRGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkaXN0YW5jZVNxID0gdm9pZCAwOyAvLyBjdXJyZW50IGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbiwgc3F1YXJlZFxuICAgICAgICAgICAgICAgICAgICB2YXIgZGVsdGFYID0gZXYuZGVsdGFYLCBkZWx0YVkgPSBldi5kZWx0YVk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlU3EgPSBkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZVNxID49IG1pbkRpc3RhbmNlICogbWluRGlzdGFuY2UpIHsgLy8gdXNlIHB5dGhhZ29yZWFuIHRoZW9yZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmhhbmRsZURpc3RhbmNlU3VycGFzc2VkKGV2KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAgICAgICAgICAgICAvLyBhIHJlYWwgcG9pbnRlciBtb3ZlPyAobm90IG9uZSBzaW11bGF0ZWQgYnkgc2Nyb2xsaW5nKVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXYub3JpZ0V2ZW50LnR5cGUgIT09ICdzY3JvbGwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5taXJyb3IuaGFuZGxlTW92ZShldi5wYWdlWCwgZXYucGFnZVkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuYXV0b1Njcm9sbGVyLmhhbmRsZU1vdmUoZXYucGFnZVgsIGV2LnBhZ2VZKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ2RyYWdtb3ZlJywgZXYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMub25Qb2ludGVyVXAgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5pc0ludGVyYWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuaXNJbnRlcmFjdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbW1vbi5hbGxvd1NlbGVjdGlvbihkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgICAgICAgICBjb21tb24uYWxsb3dDb250ZXh0TWVudShkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ3BvaW50ZXJ1cCcsIGV2KTsgLy8gY2FuIHBvdGVudGlhbGx5IHNldCBtaXJyb3JOZWVkc1JldmVydFxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmF1dG9TY3JvbGxlci5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnRyeVN0b3BEcmFnKGV2KTsgLy8gd2hpY2ggd2lsbCBzdG9wIHRoZSBtaXJyb3JcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmRlbGF5VGltZW91dElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChfdGhpcy5kZWxheVRpbWVvdXRJZCk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmRlbGF5VGltZW91dElkID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHZhciBwb2ludGVyID0gX3RoaXMucG9pbnRlciA9IG5ldyBQb2ludGVyRHJhZ2dpbmcoY29udGFpbmVyRWwpO1xuICAgICAgICBwb2ludGVyLmVtaXR0ZXIub24oJ3BvaW50ZXJkb3duJywgX3RoaXMub25Qb2ludGVyRG93bik7XG4gICAgICAgIHBvaW50ZXIuZW1pdHRlci5vbigncG9pbnRlcm1vdmUnLCBfdGhpcy5vblBvaW50ZXJNb3ZlKTtcbiAgICAgICAgcG9pbnRlci5lbWl0dGVyLm9uKCdwb2ludGVydXAnLCBfdGhpcy5vblBvaW50ZXJVcCk7XG4gICAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICAgICAgcG9pbnRlci5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIF90aGlzLm1pcnJvciA9IG5ldyBFbGVtZW50TWlycm9yKCk7XG4gICAgICAgIF90aGlzLmF1dG9TY3JvbGxlciA9IG5ldyBBdXRvU2Nyb2xsZXIoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBGZWF0dXJlZnVsRWxlbWVudERyYWdnaW5nLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBvaW50ZXIuZGVzdHJveSgpO1xuICAgICAgICAvLyBIQUNLOiBzaW11bGF0ZSBhIHBvaW50ZXItdXAgdG8gZW5kIHRoZSBjdXJyZW50IGRyYWdcbiAgICAgICAgLy8gVE9ETzogZmlyZSAnZHJhZ2VuZCcgZGlyZWN0bHkgYW5kIHN0b3AgaW50ZXJhY3Rpb24uIGRpc2NvdXJhZ2UgdXNlIG9mIHBvaW50ZXJ1cCBldmVudCAoYi9jIG1pZ2h0IG5vdCBmaXJlKVxuICAgICAgICB0aGlzLm9uUG9pbnRlclVwKHt9KTtcbiAgICB9O1xuICAgIEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcucHJvdG90eXBlLnN0YXJ0RGVsYXkgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRlbGF5ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5kZWxheVRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmRlbGF5VGltZW91dElkID0gbnVsbDtcbiAgICAgICAgICAgICAgICBfdGhpcy5oYW5kbGVEZWxheUVuZChldik7XG4gICAgICAgICAgICB9LCB0aGlzLmRlbGF5KTsgLy8gbm90IGFzc2lnbmFibGUgdG8gbnVtYmVyIVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVEZWxheUVuZChldik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcucHJvdG90eXBlLmhhbmRsZURlbGF5RW5kID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIHRoaXMuaXNEZWxheUVuZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50cnlTdGFydERyYWcoZXYpO1xuICAgIH07XG4gICAgRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZy5wcm90b3R5cGUuaGFuZGxlRGlzdGFuY2VTdXJwYXNzZWQgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgdGhpcy5pc0Rpc3RhbmNlU3VycGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50cnlTdGFydERyYWcoZXYpO1xuICAgIH07XG4gICAgRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZy5wcm90b3R5cGUudHJ5U3RhcnREcmFnID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIGlmICh0aGlzLmlzRGVsYXlFbmRlZCAmJiB0aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5wb2ludGVyLndhc1RvdWNoU2Nyb2xsIHx8IHRoaXMudG91Y2hTY3JvbGxBbGxvd2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLm1pcnJvck5lZWRzUmV2ZXJ0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvU2Nyb2xsZXIuc3RhcnQoZXYucGFnZVgsIGV2LnBhZ2VZLCB0aGlzLmNvbnRhaW5lckVsKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcignZHJhZ3N0YXJ0JywgZXYpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRvdWNoU2Nyb2xsQWxsb3dlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb2ludGVyLmNhbmNlbFRvdWNoU2Nyb2xsKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBGZWF0dXJlZnVsRWxlbWVudERyYWdnaW5nLnByb3RvdHlwZS50cnlTdG9wRHJhZyA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAvLyAuc3RvcCgpIGlzIEFMV0FZUyBhc3luY2hyb25vdXMsIHdoaWNoIHdlIE5FRUQgYmVjYXVzZSB3ZSB3YW50IGFsbCBwb2ludGVydXAgZXZlbnRzXG4gICAgICAgIC8vIHRoYXQgY29tZSBmcm9tIHRoZSBkb2N1bWVudCB0byBmaXJlIGJlZm9yZWhhbmQuIG11Y2ggbW9yZSBjb252ZW5pZW50IHRoaXMgd2F5LlxuICAgICAgICB0aGlzLm1pcnJvci5zdG9wKHRoaXMubWlycm9yTmVlZHNSZXZlcnQsIHRoaXMuc3RvcERyYWcuYmluZCh0aGlzLCBldikpO1xuICAgIH07XG4gICAgRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZy5wcm90b3R5cGUuc3RvcERyYWcgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW1pdHRlci50cmlnZ2VyKCdkcmFnZW5kJywgZXYpO1xuICAgIH07XG4gICAgLy8gZmlsbCBpbiB0aGUgaW1wbGVtZW50YXRpb25zLi4uXG4gICAgRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZy5wcm90b3R5cGUuc2V0SWdub3JlTW92ZSA9IGZ1bmN0aW9uIChib29sKSB7XG4gICAgICAgIHRoaXMucG9pbnRlci5zaG91bGRJZ25vcmVNb3ZlID0gYm9vbDtcbiAgICB9O1xuICAgIEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcucHJvdG90eXBlLnNldE1pcnJvcklzVmlzaWJsZSA9IGZ1bmN0aW9uIChib29sKSB7XG4gICAgICAgIHRoaXMubWlycm9yLnNldElzVmlzaWJsZShib29sKTtcbiAgICB9O1xuICAgIEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcucHJvdG90eXBlLnNldE1pcnJvck5lZWRzUmV2ZXJ0ID0gZnVuY3Rpb24gKGJvb2wpIHtcbiAgICAgICAgdGhpcy5taXJyb3JOZWVkc1JldmVydCA9IGJvb2w7XG4gICAgfTtcbiAgICBGZWF0dXJlZnVsRWxlbWVudERyYWdnaW5nLnByb3RvdHlwZS5zZXRBdXRvU2Nyb2xsRW5hYmxlZCA9IGZ1bmN0aW9uIChib29sKSB7XG4gICAgICAgIHRoaXMuYXV0b1Njcm9sbGVyLmlzRW5hYmxlZCA9IGJvb2w7XG4gICAgfTtcbiAgICByZXR1cm4gRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZztcbn0oY29tbW9uLkVsZW1lbnREcmFnZ2luZykpO1xuXG4vKlxuV2hlbiB0aGlzIGNsYXNzIGlzIGluc3RhbnRpYXRlZCwgaXQgcmVjb3JkcyB0aGUgb2Zmc2V0IG9mIGFuIGVsZW1lbnQgKHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudCB0b3BsZWZ0KSxcbmFuZCBjb250aW51ZXMgdG8gbW9uaXRvciBzY3JvbGxpbmcsIHVwZGF0aW5nIHRoZSBjYWNoZWQgY29vcmRpbmF0ZXMgaWYgaXQgbmVlZHMgdG8uXG5Eb2VzIG5vdCBhY2Nlc3MgdGhlIERPTSBhZnRlciBpbnN0YW50aWF0aW9uLCBzbyBoaWdobHkgcGVyZm9ybWFudC5cblxuQWxzbyBrZWVwcyB0cmFjayBvZiBhbGwgc2Nyb2xsaW5nL292ZXJmbG93OmhpZGRlbiBjb250YWluZXJzIHRoYXQgYXJlIHBhcmVudHMgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbmFuZCBhbiBkZXRlcm1pbmUgaWYgYSBnaXZlbiBwb2ludCBpcyBpbnNpZGUgdGhlIGNvbWJpbmVkIGNsaXBwaW5nIHJlY3RhbmdsZS5cbiovXG52YXIgT2Zmc2V0VHJhY2tlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBPZmZzZXRUcmFja2VyKGVsKSB7XG4gICAgICAgIHRoaXMub3JpZ1JlY3QgPSBjb21tb24uY29tcHV0ZVJlY3QoZWwpO1xuICAgICAgICAvLyB3aWxsIHdvcmsgZmluZSBmb3IgZGl2cyB0aGF0IGhhdmUgb3ZlcmZsb3c6aGlkZGVuXG4gICAgICAgIHRoaXMuc2Nyb2xsQ2FjaGVzID0gY29tbW9uLmdldENsaXBwaW5nUGFyZW50cyhlbCkubWFwKGZ1bmN0aW9uIChzY3JvbGxFbCkgeyByZXR1cm4gbmV3IEVsZW1lbnRTY3JvbGxHZW9tQ2FjaGUoc2Nyb2xsRWwsIHRydWUpOyB9KTtcbiAgICB9XG4gICAgT2Zmc2V0VHJhY2tlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRoaXMuc2Nyb2xsQ2FjaGVzOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIHNjcm9sbENhY2hlID0gX2FbX2ldO1xuICAgICAgICAgICAgc2Nyb2xsQ2FjaGUuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPZmZzZXRUcmFja2VyLnByb3RvdHlwZS5jb21wdXRlTGVmdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGxlZnQgPSB0aGlzLm9yaWdSZWN0LmxlZnQ7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0aGlzLnNjcm9sbENhY2hlczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBzY3JvbGxDYWNoZSA9IF9hW19pXTtcbiAgICAgICAgICAgIGxlZnQgKz0gc2Nyb2xsQ2FjaGUub3JpZ1Njcm9sbExlZnQgLSBzY3JvbGxDYWNoZS5nZXRTY3JvbGxMZWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxlZnQ7XG4gICAgfTtcbiAgICBPZmZzZXRUcmFja2VyLnByb3RvdHlwZS5jb21wdXRlVG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdG9wID0gdGhpcy5vcmlnUmVjdC50b3A7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0aGlzLnNjcm9sbENhY2hlczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBzY3JvbGxDYWNoZSA9IF9hW19pXTtcbiAgICAgICAgICAgIHRvcCArPSBzY3JvbGxDYWNoZS5vcmlnU2Nyb2xsVG9wIC0gc2Nyb2xsQ2FjaGUuZ2V0U2Nyb2xsVG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvcDtcbiAgICB9O1xuICAgIE9mZnNldFRyYWNrZXIucHJvdG90eXBlLmlzV2l0aGluQ2xpcHBpbmcgPSBmdW5jdGlvbiAocGFnZVgsIHBhZ2VZKSB7XG4gICAgICAgIHZhciBwb2ludCA9IHsgbGVmdDogcGFnZVgsIHRvcDogcGFnZVkgfTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRoaXMuc2Nyb2xsQ2FjaGVzOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIHNjcm9sbENhY2hlID0gX2FbX2ldO1xuICAgICAgICAgICAgaWYgKCFpc0lnbm9yZWRDbGlwcGluZyhzY3JvbGxDYWNoZS5nZXRFdmVudFRhcmdldCgpKSAmJlxuICAgICAgICAgICAgICAgICFjb21tb24ucG9pbnRJbnNpZGVSZWN0KHBvaW50LCBzY3JvbGxDYWNoZS5jbGllbnRSZWN0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiBPZmZzZXRUcmFja2VyO1xufSgpKTtcbi8vIGNlcnRhaW4gY2xpcHBpbmcgY29udGFpbmVycyBzaG91bGQgbmV2ZXIgY29uc3RyYWluIGludGVyYWN0aW9ucywgbGlrZSA8aHRtbD4gYW5kIDxib2R5PlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Z1bGxjYWxlbmRhci9mdWxsY2FsZW5kYXIvaXNzdWVzLzM2MTVcbmZ1bmN0aW9uIGlzSWdub3JlZENsaXBwaW5nKG5vZGUpIHtcbiAgICB2YXIgdGFnTmFtZSA9IG5vZGUudGFnTmFtZTtcbiAgICByZXR1cm4gdGFnTmFtZSA9PT0gJ0hUTUwnIHx8IHRhZ05hbWUgPT09ICdCT0RZJztcbn1cblxuLypcblRyYWNrcyBtb3ZlbWVudCBvdmVyIG11bHRpcGxlIGRyb3BwYWJsZSBhcmVhcyAoYWthIFwiaGl0c1wiKVxudGhhdCBleGlzdCBpbiBvbmUgb3IgbW9yZSBEYXRlQ29tcG9uZW50cy5cblJlbGllcyBvbiBhbiBleGlzdGluZyBkcmFnZ2FibGUuXG5cbmVtaXRzOlxuLSBwb2ludGVyZG93blxuLSBkcmFnc3RhcnRcbi0gaGl0Y2hhbmdlIC0gZmlyZXMgaW5pdGlhbGx5LCBldmVuIGlmIG5vdCBvdmVyIGEgaGl0XG4tIHBvaW50ZXJ1cFxuLSAoaGl0Y2hhbmdlIC0gYWdhaW4sIHRvIG51bGwsIGlmIGVuZGVkIG92ZXIgYSBoaXQpXG4tIGRyYWdlbmRcbiovXG52YXIgSGl0RHJhZ2dpbmcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSGl0RHJhZ2dpbmcoZHJhZ2dpbmcsIGRyb3BwYWJsZVN0b3JlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGJ5IGNhbGxlclxuICAgICAgICB0aGlzLnVzZVN1YmplY3RDZW50ZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXF1aXJlSW5pdGlhbCA9IHRydWU7IC8vIGlmIGRvZXNuJ3Qgc3RhcnQgb3V0IG9uIGEgaGl0LCB3b24ndCBlbWl0IGFueSBldmVudHNcbiAgICAgICAgdGhpcy5pbml0aWFsSGl0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5tb3ZpbmdIaXQgPSBudWxsO1xuICAgICAgICB0aGlzLmZpbmFsSGl0ID0gbnVsbDsgLy8gd29uJ3QgZXZlciBiZSBwb3B1bGF0ZWQgaWYgc2hvdWxkSWdub3JlTW92ZVxuICAgICAgICB0aGlzLmhhbmRsZVBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgZHJhZ2dpbmcgPSBfdGhpcy5kcmFnZ2luZztcbiAgICAgICAgICAgIF90aGlzLmluaXRpYWxIaXQgPSBudWxsO1xuICAgICAgICAgICAgX3RoaXMubW92aW5nSGl0ID0gbnVsbDtcbiAgICAgICAgICAgIF90aGlzLmZpbmFsSGl0ID0gbnVsbDtcbiAgICAgICAgICAgIF90aGlzLnByZXBhcmVIaXRzKCk7XG4gICAgICAgICAgICBfdGhpcy5wcm9jZXNzRmlyc3RDb29yZChldik7XG4gICAgICAgICAgICBpZiAoX3RoaXMuaW5pdGlhbEhpdCB8fCAhX3RoaXMucmVxdWlyZUluaXRpYWwpIHtcbiAgICAgICAgICAgICAgICBkcmFnZ2luZy5zZXRJZ25vcmVNb3ZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBmaXJlIHRoaXMgYmVmb3JlIGNvbXB1dGluZyBwcm9jZXNzRmlyc3RDb29yZCwgc28gbGlzdGVuZXJzIGNhbiBjYW5jZWwuIHRoaXMgZ2V0cyBmaXJlZCBieSBhbG1vc3QgZXZlcnkgaGFuZGxlciA6KFxuICAgICAgICAgICAgICAgIF90aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcmRvd24nLCBldik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkcmFnZ2luZy5zZXRJZ25vcmVNb3ZlKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZURyYWdTdGFydCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgX3RoaXMuZW1pdHRlci50cmlnZ2VyKCdkcmFnc3RhcnQnLCBldik7XG4gICAgICAgICAgICBfdGhpcy5oYW5kbGVNb3ZlKGV2LCB0cnVlKTsgLy8gZm9yY2UgPSBmaXJlIGV2ZW4gaWYgaW5pdGlhbGx5IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVEcmFnTW92ZSA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgX3RoaXMuZW1pdHRlci50cmlnZ2VyKCdkcmFnbW92ZScsIGV2KTtcbiAgICAgICAgICAgIF90aGlzLmhhbmRsZU1vdmUoZXYpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVBvaW50ZXJVcCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgX3RoaXMucmVsZWFzZUhpdHMoKTtcbiAgICAgICAgICAgIF90aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcnVwJywgZXYpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZURyYWdFbmQgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5tb3ZpbmdIaXQpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ2hpdHVwZGF0ZScsIG51bGwsIHRydWUsIGV2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF90aGlzLmZpbmFsSGl0ID0gX3RoaXMubW92aW5nSGl0O1xuICAgICAgICAgICAgX3RoaXMubW92aW5nSGl0ID0gbnVsbDtcbiAgICAgICAgICAgIF90aGlzLmVtaXR0ZXIudHJpZ2dlcignZHJhZ2VuZCcsIGV2KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kcm9wcGFibGVTdG9yZSA9IGRyb3BwYWJsZVN0b3JlO1xuICAgICAgICBkcmFnZ2luZy5lbWl0dGVyLm9uKCdwb2ludGVyZG93bicsIHRoaXMuaGFuZGxlUG9pbnRlckRvd24pO1xuICAgICAgICBkcmFnZ2luZy5lbWl0dGVyLm9uKCdkcmFnc3RhcnQnLCB0aGlzLmhhbmRsZURyYWdTdGFydCk7XG4gICAgICAgIGRyYWdnaW5nLmVtaXR0ZXIub24oJ2RyYWdtb3ZlJywgdGhpcy5oYW5kbGVEcmFnTW92ZSk7XG4gICAgICAgIGRyYWdnaW5nLmVtaXR0ZXIub24oJ3BvaW50ZXJ1cCcsIHRoaXMuaGFuZGxlUG9pbnRlclVwKTtcbiAgICAgICAgZHJhZ2dpbmcuZW1pdHRlci5vbignZHJhZ2VuZCcsIHRoaXMuaGFuZGxlRHJhZ0VuZCk7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBkcmFnZ2luZztcbiAgICAgICAgdGhpcy5lbWl0dGVyID0gbmV3IGNvbW1vbi5FbWl0dGVyKCk7XG4gICAgfVxuICAgIC8vIHNldHMgaW5pdGlhbEhpdFxuICAgIC8vIHNldHMgY29vcmRBZGp1c3RcbiAgICBIaXREcmFnZ2luZy5wcm90b3R5cGUucHJvY2Vzc0ZpcnN0Q29vcmQgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgdmFyIG9yaWdQb2ludCA9IHsgbGVmdDogZXYucGFnZVgsIHRvcDogZXYucGFnZVkgfTtcbiAgICAgICAgdmFyIGFkanVzdGVkUG9pbnQgPSBvcmlnUG9pbnQ7XG4gICAgICAgIHZhciBzdWJqZWN0RWwgPSBldi5zdWJqZWN0RWw7XG4gICAgICAgIHZhciBzdWJqZWN0UmVjdDtcbiAgICAgICAgaWYgKHN1YmplY3RFbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7IC8vIGkuZS4gbm90IGEgRG9jdW1lbnQvU2hhZG93Um9vdFxuICAgICAgICAgICAgc3ViamVjdFJlY3QgPSBjb21tb24uY29tcHV0ZVJlY3Qoc3ViamVjdEVsKTtcbiAgICAgICAgICAgIGFkanVzdGVkUG9pbnQgPSBjb21tb24uY29uc3RyYWluUG9pbnQoYWRqdXN0ZWRQb2ludCwgc3ViamVjdFJlY3QpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbml0aWFsSGl0ID0gdGhpcy5pbml0aWFsSGl0ID0gdGhpcy5xdWVyeUhpdEZvck9mZnNldChhZGp1c3RlZFBvaW50LmxlZnQsIGFkanVzdGVkUG9pbnQudG9wKTtcbiAgICAgICAgaWYgKGluaXRpYWxIaXQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnVzZVN1YmplY3RDZW50ZXIgJiYgc3ViamVjdFJlY3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2xpY2VkU3ViamVjdFJlY3QgPSBjb21tb24uaW50ZXJzZWN0UmVjdHMoc3ViamVjdFJlY3QsIGluaXRpYWxIaXQucmVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKHNsaWNlZFN1YmplY3RSZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGFkanVzdGVkUG9pbnQgPSBjb21tb24uZ2V0UmVjdENlbnRlcihzbGljZWRTdWJqZWN0UmVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb29yZEFkanVzdCA9IGNvbW1vbi5kaWZmUG9pbnRzKGFkanVzdGVkUG9pbnQsIG9yaWdQb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvb3JkQWRqdXN0ID0geyBsZWZ0OiAwLCB0b3A6IDAgfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSGl0RHJhZ2dpbmcucHJvdG90eXBlLmhhbmRsZU1vdmUgPSBmdW5jdGlvbiAoZXYsIGZvcmNlSGFuZGxlKSB7XG4gICAgICAgIHZhciBoaXQgPSB0aGlzLnF1ZXJ5SGl0Rm9yT2Zmc2V0KGV2LnBhZ2VYICsgdGhpcy5jb29yZEFkanVzdC5sZWZ0LCBldi5wYWdlWSArIHRoaXMuY29vcmRBZGp1c3QudG9wKTtcbiAgICAgICAgaWYgKGZvcmNlSGFuZGxlIHx8ICFpc0hpdHNFcXVhbCh0aGlzLm1vdmluZ0hpdCwgaGl0KSkge1xuICAgICAgICAgICAgdGhpcy5tb3ZpbmdIaXQgPSBoaXQ7XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcignaGl0dXBkYXRlJywgaGl0LCBmYWxzZSwgZXYpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBIaXREcmFnZ2luZy5wcm90b3R5cGUucHJlcGFyZUhpdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMub2Zmc2V0VHJhY2tlcnMgPSBjb21tb24ubWFwSGFzaCh0aGlzLmRyb3BwYWJsZVN0b3JlLCBmdW5jdGlvbiAoaW50ZXJhY3Rpb25TZXR0aW5ncykge1xuICAgICAgICAgICAgaW50ZXJhY3Rpb25TZXR0aW5ncy5jb21wb25lbnQucHJlcGFyZUhpdHMoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2Zmc2V0VHJhY2tlcihpbnRlcmFjdGlvblNldHRpbmdzLmVsKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBIaXREcmFnZ2luZy5wcm90b3R5cGUucmVsZWFzZUhpdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvZmZzZXRUcmFja2VycyA9IHRoaXMub2Zmc2V0VHJhY2tlcnM7XG4gICAgICAgIGZvciAodmFyIGlkIGluIG9mZnNldFRyYWNrZXJzKSB7XG4gICAgICAgICAgICBvZmZzZXRUcmFja2Vyc1tpZF0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub2Zmc2V0VHJhY2tlcnMgPSB7fTtcbiAgICB9O1xuICAgIEhpdERyYWdnaW5nLnByb3RvdHlwZS5xdWVyeUhpdEZvck9mZnNldCA9IGZ1bmN0aW9uIChvZmZzZXRMZWZ0LCBvZmZzZXRUb3ApIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgZHJvcHBhYmxlU3RvcmUgPSBfYS5kcm9wcGFibGVTdG9yZSwgb2Zmc2V0VHJhY2tlcnMgPSBfYS5vZmZzZXRUcmFja2VycztcbiAgICAgICAgdmFyIGJlc3RIaXQgPSBudWxsO1xuICAgICAgICBmb3IgKHZhciBpZCBpbiBkcm9wcGFibGVTdG9yZSkge1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IGRyb3BwYWJsZVN0b3JlW2lkXS5jb21wb25lbnQ7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0VHJhY2tlciA9IG9mZnNldFRyYWNrZXJzW2lkXTtcbiAgICAgICAgICAgIGlmIChvZmZzZXRUcmFja2VyICYmIC8vIHdhc24ndCBkZXN0cm95ZWQgbWlkLWRyYWdcbiAgICAgICAgICAgICAgICBvZmZzZXRUcmFja2VyLmlzV2l0aGluQ2xpcHBpbmcob2Zmc2V0TGVmdCwgb2Zmc2V0VG9wKSkge1xuICAgICAgICAgICAgICAgIHZhciBvcmlnaW5MZWZ0ID0gb2Zmc2V0VHJhY2tlci5jb21wdXRlTGVmdCgpO1xuICAgICAgICAgICAgICAgIHZhciBvcmlnaW5Ub3AgPSBvZmZzZXRUcmFja2VyLmNvbXB1dGVUb3AoKTtcbiAgICAgICAgICAgICAgICB2YXIgcG9zaXRpb25MZWZ0ID0gb2Zmc2V0TGVmdCAtIG9yaWdpbkxlZnQ7XG4gICAgICAgICAgICAgICAgdmFyIHBvc2l0aW9uVG9wID0gb2Zmc2V0VG9wIC0gb3JpZ2luVG9wO1xuICAgICAgICAgICAgICAgIHZhciBvcmlnUmVjdCA9IG9mZnNldFRyYWNrZXIub3JpZ1JlY3Q7XG4gICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gb3JpZ1JlY3QucmlnaHQgLSBvcmlnUmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSBvcmlnUmVjdC5ib3R0b20gLSBvcmlnUmVjdC50b3A7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgd2l0aGluIHRoZSBlbGVtZW50J3MgYm91bmRzXG4gICAgICAgICAgICAgICAgcG9zaXRpb25MZWZ0ID49IDAgJiYgcG9zaXRpb25MZWZ0IDwgd2lkdGggJiZcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25Ub3AgPj0gMCAmJiBwb3NpdGlvblRvcCA8IGhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGl0ID0gY29tcG9uZW50LnF1ZXJ5SGl0KHBvc2l0aW9uTGVmdCwgcG9zaXRpb25Ub3AsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGl0ICYmIChcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBoaXQgaXMgd2l0aGluIGFjdGl2ZVJhbmdlLCBtZWFuaW5nIGl0J3Mgbm90IGEgZGVhZCBjZWxsXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbi5yYW5nZUNvbnRhaW5zUmFuZ2UoaGl0LmRhdGVQcm9maWxlLmFjdGl2ZVJhbmdlLCBoaXQuZGF0ZVNwYW4ucmFuZ2UpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCFiZXN0SGl0IHx8IGhpdC5sYXllciA+IGJlc3RIaXQubGF5ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoaXQuY29tcG9uZW50SWQgPSBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpdC5jb250ZXh0ID0gY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBiZXR0ZXIgd2F5IHRvIHJlLW9yaWVudCByZWN0YW5nbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpdC5yZWN0LmxlZnQgKz0gb3JpZ2luTGVmdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpdC5yZWN0LnJpZ2h0ICs9IG9yaWdpbkxlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBoaXQucmVjdC50b3AgKz0gb3JpZ2luVG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGl0LnJlY3QuYm90dG9tICs9IG9yaWdpblRvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RIaXQgPSBoaXQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJlc3RIaXQ7XG4gICAgfTtcbiAgICByZXR1cm4gSGl0RHJhZ2dpbmc7XG59KCkpO1xuZnVuY3Rpb24gaXNIaXRzRXF1YWwoaGl0MCwgaGl0MSkge1xuICAgIGlmICghaGl0MCAmJiAhaGl0MSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKEJvb2xlYW4oaGl0MCkgIT09IEJvb2xlYW4oaGl0MSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gY29tbW9uLmlzRGF0ZVNwYW5zRXF1YWwoaGl0MC5kYXRlU3BhbiwgaGl0MS5kYXRlU3Bhbik7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGF0ZVBvaW50QXBpV2l0aENvbnRleHQoZGF0ZVNwYW4sIGNvbnRleHQpIHtcbiAgICB2YXIgcHJvcHMgPSB7fTtcbiAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gY29udGV4dC5wbHVnaW5Ib29rcy5kYXRlUG9pbnRUcmFuc2Zvcm1zOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgdHJhbnNmb3JtID0gX2FbX2ldO1xuICAgICAgICB0c2xpYi5fX2Fzc2lnbihwcm9wcywgdHJhbnNmb3JtKGRhdGVTcGFuLCBjb250ZXh0KSk7XG4gICAgfVxuICAgIHRzbGliLl9fYXNzaWduKHByb3BzLCBidWlsZERhdGVQb2ludEFwaShkYXRlU3BhbiwgY29udGV4dC5kYXRlRW52KSk7XG4gICAgcmV0dXJuIHByb3BzO1xufVxuZnVuY3Rpb24gYnVpbGREYXRlUG9pbnRBcGkoc3BhbiwgZGF0ZUVudikge1xuICAgIHJldHVybiB7XG4gICAgICAgIGRhdGU6IGRhdGVFbnYudG9EYXRlKHNwYW4ucmFuZ2Uuc3RhcnQpLFxuICAgICAgICBkYXRlU3RyOiBkYXRlRW52LmZvcm1hdElzbyhzcGFuLnJhbmdlLnN0YXJ0LCB7IG9taXRUaW1lOiBzcGFuLmFsbERheSB9KSxcbiAgICAgICAgYWxsRGF5OiBzcGFuLmFsbERheSxcbiAgICB9O1xufVxuXG4vKlxuTW9uaXRvcnMgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYSBzcGVjaWZpYyBkYXRlL3RpbWUgb2YgYSBjb21wb25lbnQuXG5BIHBvaW50ZXJkb3duK3BvaW50ZXJ1cCBvbiB0aGUgc2FtZSBcImhpdFwiIGNvbnN0aXR1dGVzIGEgY2xpY2suXG4qL1xudmFyIERhdGVDbGlja2luZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoRGF0ZUNsaWNraW5nLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIERhdGVDbGlja2luZyhzZXR0aW5ncykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzZXR0aW5ncykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuaGFuZGxlUG9pbnRlckRvd24gPSBmdW5jdGlvbiAocGV2KSB7XG4gICAgICAgICAgICB2YXIgZHJhZ2dpbmcgPSBfdGhpcy5kcmFnZ2luZztcbiAgICAgICAgICAgIHZhciBkb3duRWwgPSBwZXYub3JpZ0V2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIC8vIGRvIHRoaXMgaW4gcG9pbnRlcmRvd24gKG5vdCBkcmFnZW5kKSBiZWNhdXNlIERPTSBtaWdodCBiZSBtdXRhdGVkIGJ5IHRoZSB0aW1lIGRyYWdlbmQgaXMgZmlyZWRcbiAgICAgICAgICAgIGRyYWdnaW5nLnNldElnbm9yZU1vdmUoIV90aGlzLmNvbXBvbmVudC5pc1ZhbGlkRGF0ZURvd25FbChkb3duRWwpKTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gd29uJ3QgZXZlbiBmaXJlIGlmIG1vdmluZyB3YXMgaWdub3JlZFxuICAgICAgICBfdGhpcy5oYW5kbGVEcmFnRW5kID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gX3RoaXMuY29tcG9uZW50O1xuICAgICAgICAgICAgdmFyIHBvaW50ZXIgPSBfdGhpcy5kcmFnZ2luZy5wb2ludGVyO1xuICAgICAgICAgICAgaWYgKCFwb2ludGVyLndhc1RvdWNoU2Nyb2xsKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hID0gX3RoaXMuaGl0RHJhZ2dpbmcsIGluaXRpYWxIaXQgPSBfYS5pbml0aWFsSGl0LCBmaW5hbEhpdCA9IF9hLmZpbmFsSGl0O1xuICAgICAgICAgICAgICAgIGlmIChpbml0aWFsSGl0ICYmIGZpbmFsSGl0ICYmIGlzSGl0c0VxdWFsKGluaXRpYWxIaXQsIGZpbmFsSGl0KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGNvbXBvbmVudC5jb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXJnID0gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGJ1aWxkRGF0ZVBvaW50QXBpV2l0aENvbnRleHQoaW5pdGlhbEhpdC5kYXRlU3BhbiwgY29udGV4dCkpLCB7IGRheUVsOiBpbml0aWFsSGl0LmRheUVsLCBqc0V2ZW50OiBldi5vcmlnRXZlbnQsIHZpZXc6IGNvbnRleHQudmlld0FwaSB8fCBjb250ZXh0LmNhbGVuZGFyQXBpLnZpZXcgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdkYXRlQ2xpY2snLCBhcmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gd2UgRE8gd2FudCB0byB3YXRjaCBwb2ludGVyIG1vdmVzIGJlY2F1c2Ugb3RoZXJ3aXNlIGZpbmFsSGl0IHdvbid0IGdldCBwb3B1bGF0ZWRcbiAgICAgICAgX3RoaXMuZHJhZ2dpbmcgPSBuZXcgRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZyhzZXR0aW5ncy5lbCk7XG4gICAgICAgIF90aGlzLmRyYWdnaW5nLmF1dG9TY3JvbGxlci5pc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGhpdERyYWdnaW5nID0gX3RoaXMuaGl0RHJhZ2dpbmcgPSBuZXcgSGl0RHJhZ2dpbmcoX3RoaXMuZHJhZ2dpbmcsIGNvbW1vbi5pbnRlcmFjdGlvblNldHRpbmdzVG9TdG9yZShzZXR0aW5ncykpO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdwb2ludGVyZG93bicsIF90aGlzLmhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbignZHJhZ2VuZCcsIF90aGlzLmhhbmRsZURyYWdFbmQpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIERhdGVDbGlja2luZy5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kcmFnZ2luZy5kZXN0cm95KCk7XG4gICAgfTtcbiAgICByZXR1cm4gRGF0ZUNsaWNraW5nO1xufShjb21tb24uSW50ZXJhY3Rpb24pKTtcblxuLypcblRyYWNrcyB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYSBwb3J0aW9uIG9mIHRpbWUgb2YgYSBjb21wb25lbnQsXG5jb25zdGl0dXRlZCBieSBhIGRyYWcgb3ZlciBkYXRlIGNlbGxzLCB3aXRoIGEgcG9zc2libGUgZGVsYXkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZHJhZy5cbiovXG52YXIgRGF0ZVNlbGVjdGluZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoRGF0ZVNlbGVjdGluZywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEYXRlU2VsZWN0aW5nKHNldHRpbmdzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHNldHRpbmdzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5kcmFnU2VsZWN0aW9uID0gbnVsbDtcbiAgICAgICAgX3RoaXMuaGFuZGxlUG9pbnRlckRvd24gPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IF90aGlzLCBjb21wb25lbnQgPSBfYS5jb21wb25lbnQsIGRyYWdnaW5nID0gX2EuZHJhZ2dpbmc7XG4gICAgICAgICAgICB2YXIgb3B0aW9ucyA9IGNvbXBvbmVudC5jb250ZXh0Lm9wdGlvbnM7XG4gICAgICAgICAgICB2YXIgY2FuU2VsZWN0ID0gb3B0aW9ucy5zZWxlY3RhYmxlICYmXG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmlzVmFsaWREYXRlRG93bkVsKGV2Lm9yaWdFdmVudC50YXJnZXQpO1xuICAgICAgICAgICAgLy8gZG9uJ3QgYm90aGVyIHRvIHdhdGNoIGV4cGVuc2l2ZSBtb3ZlcyBpZiBjb21wb25lbnQgd29uJ3QgZG8gc2VsZWN0aW9uXG4gICAgICAgICAgICBkcmFnZ2luZy5zZXRJZ25vcmVNb3ZlKCFjYW5TZWxlY3QpO1xuICAgICAgICAgICAgLy8gaWYgdG91Y2gsIHJlcXVpcmUgdXNlciB0byBob2xkIGRvd25cbiAgICAgICAgICAgIGRyYWdnaW5nLmRlbGF5ID0gZXYuaXNUb3VjaCA/IGdldENvbXBvbmVudFRvdWNoRGVsYXkkMShjb21wb25lbnQpIDogbnVsbDtcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlRHJhZ1N0YXJ0ID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBfdGhpcy5jb21wb25lbnQuY29udGV4dC5jYWxlbmRhckFwaS51bnNlbGVjdChldik7IC8vIHVuc2VsZWN0IHByZXZpb3VzIHNlbGVjdGlvbnNcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlSGl0VXBkYXRlID0gZnVuY3Rpb24gKGhpdCwgaXNGaW5hbCkge1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBfdGhpcy5jb21wb25lbnQuY29udGV4dDtcbiAgICAgICAgICAgIHZhciBkcmFnU2VsZWN0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIHZhciBpc0ludmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChoaXQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5pdGlhbEhpdCA9IF90aGlzLmhpdERyYWdnaW5nLmluaXRpYWxIaXQ7XG4gICAgICAgICAgICAgICAgdmFyIGRpc2FsbG93ZWQgPSBoaXQuY29tcG9uZW50SWQgPT09IGluaXRpYWxIaXQuY29tcG9uZW50SWRcbiAgICAgICAgICAgICAgICAgICAgJiYgX3RoaXMuaXNIaXRDb21ib0FsbG93ZWRcbiAgICAgICAgICAgICAgICAgICAgJiYgIV90aGlzLmlzSGl0Q29tYm9BbGxvd2VkKGluaXRpYWxIaXQsIGhpdCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkaXNhbGxvd2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRyYWdTZWxlY3Rpb24gPSBqb2luSGl0c0ludG9TZWxlY3Rpb24oaW5pdGlhbEhpdCwgaGl0LCBjb250ZXh0LnBsdWdpbkhvb2tzLmRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWRyYWdTZWxlY3Rpb24gfHwgIWNvbW1vbi5pc0RhdGVTZWxlY3Rpb25WYWxpZChkcmFnU2VsZWN0aW9uLCBoaXQuZGF0ZVByb2ZpbGUsIGNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzSW52YWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGRyYWdTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkcmFnU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7IHR5cGU6ICdTRUxFQ1RfREFURVMnLCBzZWxlY3Rpb246IGRyYWdTZWxlY3Rpb24gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghaXNGaW5hbCkgeyAvLyBvbmx5IHVuc2VsZWN0IGlmIG1vdmVkIGF3YXkgd2hpbGUgZHJhZ2dpbmdcbiAgICAgICAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoKHsgdHlwZTogJ1VOU0VMRUNUX0RBVEVTJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNJbnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgY29tbW9uLmVuYWJsZUN1cnNvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tbW9uLmRpc2FibGVDdXJzb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNGaW5hbCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmRyYWdTZWxlY3Rpb24gPSBkcmFnU2VsZWN0aW9uOyAvLyBvbmx5IGNsZWFyIGlmIG1vdmVkIGF3YXkgZnJvbSBhbGwgaGl0cyB3aGlsZSBkcmFnZ2luZ1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVQb2ludGVyVXAgPSBmdW5jdGlvbiAocGV2KSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMuZHJhZ1NlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBpcyBhbHJlYWR5IHJlbmRlcmVkLCBzbyBqdXN0IG5lZWQgdG8gcmVwb3J0IHNlbGVjdGlvblxuICAgICAgICAgICAgICAgIGNvbW1vbi50cmlnZ2VyRGF0ZVNlbGVjdChfdGhpcy5kcmFnU2VsZWN0aW9uLCBwZXYsIF90aGlzLmNvbXBvbmVudC5jb250ZXh0KTtcbiAgICAgICAgICAgICAgICBfdGhpcy5kcmFnU2VsZWN0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGNvbXBvbmVudCA9IHNldHRpbmdzLmNvbXBvbmVudDtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBjb21wb25lbnQuY29udGV4dC5vcHRpb25zO1xuICAgICAgICB2YXIgZHJhZ2dpbmcgPSBfdGhpcy5kcmFnZ2luZyA9IG5ldyBGZWF0dXJlZnVsRWxlbWVudERyYWdnaW5nKHNldHRpbmdzLmVsKTtcbiAgICAgICAgZHJhZ2dpbmcudG91Y2hTY3JvbGxBbGxvd2VkID0gZmFsc2U7XG4gICAgICAgIGRyYWdnaW5nLm1pbkRpc3RhbmNlID0gb3B0aW9ucy5zZWxlY3RNaW5EaXN0YW5jZSB8fCAwO1xuICAgICAgICBkcmFnZ2luZy5hdXRvU2Nyb2xsZXIuaXNFbmFibGVkID0gb3B0aW9ucy5kcmFnU2Nyb2xsO1xuICAgICAgICB2YXIgaGl0RHJhZ2dpbmcgPSBfdGhpcy5oaXREcmFnZ2luZyA9IG5ldyBIaXREcmFnZ2luZyhfdGhpcy5kcmFnZ2luZywgY29tbW9uLmludGVyYWN0aW9uU2V0dGluZ3NUb1N0b3JlKHNldHRpbmdzKSk7XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ3BvaW50ZXJkb3duJywgX3RoaXMuaGFuZGxlUG9pbnRlckRvd24pO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdkcmFnc3RhcnQnLCBfdGhpcy5oYW5kbGVEcmFnU3RhcnQpO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdoaXR1cGRhdGUnLCBfdGhpcy5oYW5kbGVIaXRVcGRhdGUpO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdwb2ludGVydXAnLCBfdGhpcy5oYW5kbGVQb2ludGVyVXApO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIERhdGVTZWxlY3RpbmcucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcuZGVzdHJveSgpO1xuICAgIH07XG4gICAgcmV0dXJuIERhdGVTZWxlY3Rpbmc7XG59KGNvbW1vbi5JbnRlcmFjdGlvbikpO1xuZnVuY3Rpb24gZ2V0Q29tcG9uZW50VG91Y2hEZWxheSQxKGNvbXBvbmVudCkge1xuICAgIHZhciBvcHRpb25zID0gY29tcG9uZW50LmNvbnRleHQub3B0aW9ucztcbiAgICB2YXIgZGVsYXkgPSBvcHRpb25zLnNlbGVjdExvbmdQcmVzc0RlbGF5O1xuICAgIGlmIChkZWxheSA9PSBudWxsKSB7XG4gICAgICAgIGRlbGF5ID0gb3B0aW9ucy5sb25nUHJlc3NEZWxheTtcbiAgICB9XG4gICAgcmV0dXJuIGRlbGF5O1xufVxuZnVuY3Rpb24gam9pbkhpdHNJbnRvU2VsZWN0aW9uKGhpdDAsIGhpdDEsIGRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnMpIHtcbiAgICB2YXIgZGF0ZVNwYW4wID0gaGl0MC5kYXRlU3BhbjtcbiAgICB2YXIgZGF0ZVNwYW4xID0gaGl0MS5kYXRlU3BhbjtcbiAgICB2YXIgbXMgPSBbXG4gICAgICAgIGRhdGVTcGFuMC5yYW5nZS5zdGFydCxcbiAgICAgICAgZGF0ZVNwYW4wLnJhbmdlLmVuZCxcbiAgICAgICAgZGF0ZVNwYW4xLnJhbmdlLnN0YXJ0LFxuICAgICAgICBkYXRlU3BhbjEucmFuZ2UuZW5kLFxuICAgIF07XG4gICAgbXMuc29ydChjb21tb24uY29tcGFyZU51bWJlcnMpO1xuICAgIHZhciBwcm9wcyA9IHt9O1xuICAgIGZvciAodmFyIF9pID0gMCwgZGF0ZVNlbGVjdGlvblRyYW5zZm9ybWVyc18xID0gZGF0ZVNlbGVjdGlvblRyYW5zZm9ybWVyczsgX2kgPCBkYXRlU2VsZWN0aW9uVHJhbnNmb3JtZXJzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciB0cmFuc2Zvcm1lciA9IGRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnNfMVtfaV07XG4gICAgICAgIHZhciByZXMgPSB0cmFuc2Zvcm1lcihoaXQwLCBoaXQxKTtcbiAgICAgICAgaWYgKHJlcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIHRzbGliLl9fYXNzaWduKHByb3BzLCByZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb3BzLnJhbmdlID0geyBzdGFydDogbXNbMF0sIGVuZDogbXNbM10gfTtcbiAgICBwcm9wcy5hbGxEYXkgPSBkYXRlU3BhbjAuYWxsRGF5O1xuICAgIHJldHVybiBwcm9wcztcbn1cblxudmFyIEV2ZW50RHJhZ2dpbmcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKEV2ZW50RHJhZ2dpbmcsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRXZlbnREcmFnZ2luZyhzZXR0aW5ncykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzZXR0aW5ncykgfHwgdGhpcztcbiAgICAgICAgLy8gaW50ZXJuYWwgc3RhdGVcbiAgICAgICAgX3RoaXMuc3ViamVjdEVsID0gbnVsbDtcbiAgICAgICAgX3RoaXMuc3ViamVjdFNlZyA9IG51bGw7IC8vIHRoZSBzZWcgYmVpbmcgc2VsZWN0ZWQvZHJhZ2dlZFxuICAgICAgICBfdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIF90aGlzLmV2ZW50UmFuZ2UgPSBudWxsO1xuICAgICAgICBfdGhpcy5yZWxldmFudEV2ZW50cyA9IG51bGw7IC8vIHRoZSBldmVudHMgYmVpbmcgZHJhZ2dlZFxuICAgICAgICBfdGhpcy5yZWNlaXZpbmdDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgX3RoaXMudmFsaWRNdXRhdGlvbiA9IG51bGw7XG4gICAgICAgIF90aGlzLm11dGF0ZWRSZWxldmFudEV2ZW50cyA9IG51bGw7XG4gICAgICAgIF90aGlzLmhhbmRsZVBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgb3JpZ1RhcmdldCA9IGV2Lm9yaWdFdmVudC50YXJnZXQ7XG4gICAgICAgICAgICB2YXIgX2EgPSBfdGhpcywgY29tcG9uZW50ID0gX2EuY29tcG9uZW50LCBkcmFnZ2luZyA9IF9hLmRyYWdnaW5nO1xuICAgICAgICAgICAgdmFyIG1pcnJvciA9IGRyYWdnaW5nLm1pcnJvcjtcbiAgICAgICAgICAgIHZhciBvcHRpb25zID0gY29tcG9uZW50LmNvbnRleHQub3B0aW9ucztcbiAgICAgICAgICAgIHZhciBpbml0aWFsQ29udGV4dCA9IGNvbXBvbmVudC5jb250ZXh0O1xuICAgICAgICAgICAgX3RoaXMuc3ViamVjdEVsID0gZXYuc3ViamVjdEVsO1xuICAgICAgICAgICAgdmFyIHN1YmplY3RTZWcgPSBfdGhpcy5zdWJqZWN0U2VnID0gY29tbW9uLmdldEVsU2VnKGV2LnN1YmplY3RFbCk7XG4gICAgICAgICAgICB2YXIgZXZlbnRSYW5nZSA9IF90aGlzLmV2ZW50UmFuZ2UgPSBzdWJqZWN0U2VnLmV2ZW50UmFuZ2U7XG4gICAgICAgICAgICB2YXIgZXZlbnRJbnN0YW5jZUlkID0gZXZlbnRSYW5nZS5pbnN0YW5jZS5pbnN0YW5jZUlkO1xuICAgICAgICAgICAgX3RoaXMucmVsZXZhbnRFdmVudHMgPSBjb21tb24uZ2V0UmVsZXZhbnRFdmVudHMoaW5pdGlhbENvbnRleHQuZ2V0Q3VycmVudERhdGEoKS5ldmVudFN0b3JlLCBldmVudEluc3RhbmNlSWQpO1xuICAgICAgICAgICAgZHJhZ2dpbmcubWluRGlzdGFuY2UgPSBldi5pc1RvdWNoID8gMCA6IG9wdGlvbnMuZXZlbnREcmFnTWluRGlzdGFuY2U7XG4gICAgICAgICAgICBkcmFnZ2luZy5kZWxheSA9XG4gICAgICAgICAgICAgICAgLy8gb25seSBkbyBhIHRvdWNoIGRlbGF5IGlmIHRvdWNoIGFuZCB0aGlzIGV2ZW50IGhhc24ndCBiZWVuIHNlbGVjdGVkIHlldFxuICAgICAgICAgICAgICAgIChldi5pc1RvdWNoICYmIGV2ZW50SW5zdGFuY2VJZCAhPT0gY29tcG9uZW50LnByb3BzLmV2ZW50U2VsZWN0aW9uKSA/XG4gICAgICAgICAgICAgICAgICAgIGdldENvbXBvbmVudFRvdWNoRGVsYXkoY29tcG9uZW50KSA6XG4gICAgICAgICAgICAgICAgICAgIG51bGw7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5maXhlZE1pcnJvclBhcmVudCkge1xuICAgICAgICAgICAgICAgIG1pcnJvci5wYXJlbnROb2RlID0gb3B0aW9ucy5maXhlZE1pcnJvclBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1pcnJvci5wYXJlbnROb2RlID0gY29tbW9uLmVsZW1lbnRDbG9zZXN0KG9yaWdUYXJnZXQsICcuZmMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1pcnJvci5yZXZlcnREdXJhdGlvbiA9IG9wdGlvbnMuZHJhZ1JldmVydER1cmF0aW9uO1xuICAgICAgICAgICAgdmFyIGlzVmFsaWQgPSBjb21wb25lbnQuaXNWYWxpZFNlZ0Rvd25FbChvcmlnVGFyZ2V0KSAmJlxuICAgICAgICAgICAgICAgICFjb21tb24uZWxlbWVudENsb3Nlc3Qob3JpZ1RhcmdldCwgJy5mYy1ldmVudC1yZXNpemVyJyk7IC8vIE5PVCBvbiBhIHJlc2l6ZXJcbiAgICAgICAgICAgIGRyYWdnaW5nLnNldElnbm9yZU1vdmUoIWlzVmFsaWQpO1xuICAgICAgICAgICAgLy8gZGlzYWJsZSBkcmFnZ2luZyBmb3IgZWxlbWVudHMgdGhhdCBhcmUgcmVzaXphYmxlIChpZSwgc2VsZWN0YWJsZSlcbiAgICAgICAgICAgIC8vIGJ1dCBhcmUgbm90IGRyYWdnYWJsZVxuICAgICAgICAgICAgX3RoaXMuaXNEcmFnZ2luZyA9IGlzVmFsaWQgJiZcbiAgICAgICAgICAgICAgICBldi5zdWJqZWN0RWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdmYy1ldmVudC1kcmFnZ2FibGUnKTtcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlRHJhZ1N0YXJ0ID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgaW5pdGlhbENvbnRleHQgPSBfdGhpcy5jb21wb25lbnQuY29udGV4dDtcbiAgICAgICAgICAgIHZhciBldmVudFJhbmdlID0gX3RoaXMuZXZlbnRSYW5nZTtcbiAgICAgICAgICAgIHZhciBldmVudEluc3RhbmNlSWQgPSBldmVudFJhbmdlLmluc3RhbmNlLmluc3RhbmNlSWQ7XG4gICAgICAgICAgICBpZiAoZXYuaXNUb3VjaCkge1xuICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gc2VsZWN0IGEgZGlmZmVyZW50IGV2ZW50P1xuICAgICAgICAgICAgICAgIGlmIChldmVudEluc3RhbmNlSWQgIT09IF90aGlzLmNvbXBvbmVudC5wcm9wcy5ldmVudFNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dC5kaXNwYXRjaCh7IHR5cGU6ICdTRUxFQ1RfRVZFTlQnLCBldmVudEluc3RhbmNlSWQ6IGV2ZW50SW5zdGFuY2VJZCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBub3cgdXNpbmcgbW91c2UsIGJ1dCB3YXMgcHJldmlvdXMgdG91Y2ggaW50ZXJhY3Rpb24sIGNsZWFyIHNlbGVjdGVkIGV2ZW50XG4gICAgICAgICAgICAgICAgaW5pdGlhbENvbnRleHQuZGlzcGF0Y2goeyB0eXBlOiAnVU5TRUxFQ1RfRVZFTlQnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKF90aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dC5jYWxlbmRhckFwaS51bnNlbGVjdChldik7IC8vIHVuc2VsZWN0ICpkYXRlKiBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50RHJhZ1N0YXJ0Jywge1xuICAgICAgICAgICAgICAgICAgICBlbDogX3RoaXMuc3ViamVjdEVsLFxuICAgICAgICAgICAgICAgICAgICBldmVudDogbmV3IGNvbW1vbi5FdmVudEFwaShpbml0aWFsQ29udGV4dCwgZXZlbnRSYW5nZS5kZWYsIGV2ZW50UmFuZ2UuaW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgICAgICBqc0V2ZW50OiBldi5vcmlnRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIHZpZXc6IGluaXRpYWxDb250ZXh0LnZpZXdBcGksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmhhbmRsZUhpdFVwZGF0ZSA9IGZ1bmN0aW9uIChoaXQsIGlzRmluYWwpIHtcbiAgICAgICAgICAgIGlmICghX3RoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByZWxldmFudEV2ZW50cyA9IF90aGlzLnJlbGV2YW50RXZlbnRzO1xuICAgICAgICAgICAgdmFyIGluaXRpYWxIaXQgPSBfdGhpcy5oaXREcmFnZ2luZy5pbml0aWFsSGl0O1xuICAgICAgICAgICAgdmFyIGluaXRpYWxDb250ZXh0ID0gX3RoaXMuY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgICAgICAvLyBzdGF0ZXMgYmFzZWQgb24gbmV3IGhpdFxuICAgICAgICAgICAgdmFyIHJlY2VpdmluZ0NvbnRleHQgPSBudWxsO1xuICAgICAgICAgICAgdmFyIG11dGF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIHZhciBtdXRhdGVkUmVsZXZhbnRFdmVudHMgPSBudWxsO1xuICAgICAgICAgICAgdmFyIGlzSW52YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIGludGVyYWN0aW9uID0ge1xuICAgICAgICAgICAgICAgIGFmZmVjdGVkRXZlbnRzOiByZWxldmFudEV2ZW50cyxcbiAgICAgICAgICAgICAgICBtdXRhdGVkRXZlbnRzOiBjb21tb24uY3JlYXRlRW1wdHlFdmVudFN0b3JlKCksXG4gICAgICAgICAgICAgICAgaXNFdmVudDogdHJ1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoaGl0KSB7XG4gICAgICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dCA9IGhpdC5jb250ZXh0O1xuICAgICAgICAgICAgICAgIHZhciByZWNlaXZpbmdPcHRpb25zID0gcmVjZWl2aW5nQ29udGV4dC5vcHRpb25zO1xuICAgICAgICAgICAgICAgIGlmIChpbml0aWFsQ29udGV4dCA9PT0gcmVjZWl2aW5nQ29udGV4dCB8fFxuICAgICAgICAgICAgICAgICAgICAocmVjZWl2aW5nT3B0aW9ucy5lZGl0YWJsZSAmJiByZWNlaXZpbmdPcHRpb25zLmRyb3BwYWJsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbXV0YXRpb24gPSBjb21wdXRlRXZlbnRNdXRhdGlvbihpbml0aWFsSGl0LCBoaXQsIHJlY2VpdmluZ0NvbnRleHQuZ2V0Q3VycmVudERhdGEoKS5wbHVnaW5Ib29rcy5ldmVudERyYWdNdXRhdGlvbk1hc3NhZ2Vycyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlZFJlbGV2YW50RXZlbnRzID0gY29tbW9uLmFwcGx5TXV0YXRpb25Ub0V2ZW50U3RvcmUocmVsZXZhbnRFdmVudHMsIHJlY2VpdmluZ0NvbnRleHQuZ2V0Q3VycmVudERhdGEoKS5ldmVudFVpQmFzZXMsIG11dGF0aW9uLCByZWNlaXZpbmdDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uLm11dGF0ZWRFdmVudHMgPSBtdXRhdGVkUmVsZXZhbnRFdmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbW1vbi5pc0ludGVyYWN0aW9uVmFsaWQoaW50ZXJhY3Rpb24sIGhpdC5kYXRlUHJvZmlsZSwgcmVjZWl2aW5nQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ludmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGVkUmVsZXZhbnRFdmVudHMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uLm11dGF0ZWRFdmVudHMgPSBjb21tb24uY3JlYXRlRW1wdHlFdmVudFN0b3JlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY2VpdmluZ0NvbnRleHQgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF90aGlzLmRpc3BsYXlEcmFnKHJlY2VpdmluZ0NvbnRleHQsIGludGVyYWN0aW9uKTtcbiAgICAgICAgICAgIGlmICghaXNJbnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgY29tbW9uLmVuYWJsZUN1cnNvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tbW9uLmRpc2FibGVDdXJzb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNGaW5hbCkge1xuICAgICAgICAgICAgICAgIGlmIChpbml0aWFsQ29udGV4dCA9PT0gcmVjZWl2aW5nQ29udGV4dCAmJiAvLyBUT0RPOiB3cml0ZSB0ZXN0IGZvciB0aGlzXG4gICAgICAgICAgICAgICAgICAgIGlzSGl0c0VxdWFsKGluaXRpYWxIaXQsIGhpdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbXV0YXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfdGhpcy5kcmFnZ2luZy5zZXRNaXJyb3JOZWVkc1JldmVydCghbXV0YXRpb24pO1xuICAgICAgICAgICAgICAgIC8vIHJlbmRlciB0aGUgbWlycm9yIGlmIG5vIGFscmVhZHktcmVuZGVyZWQgbWlycm9yXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogd2lzaCB3ZSBjb3VsZCBzb21laG93IHdhaXQgZm9yIGRpc3BhdGNoIHRvIGd1YXJhbnRlZSByZW5kZXJcbiAgICAgICAgICAgICAgICBfdGhpcy5kcmFnZ2luZy5zZXRNaXJyb3JJc1Zpc2libGUoIWhpdCB8fCAhY29tbW9uLmdldEVsUm9vdChfdGhpcy5zdWJqZWN0RWwpLnF1ZXJ5U2VsZWN0b3IoJy5mYy1ldmVudC1taXJyb3InKSk7XG4gICAgICAgICAgICAgICAgLy8gYXNzaWduIHN0YXRlcyBiYXNlZCBvbiBuZXcgaGl0XG4gICAgICAgICAgICAgICAgX3RoaXMucmVjZWl2aW5nQ29udGV4dCA9IHJlY2VpdmluZ0NvbnRleHQ7XG4gICAgICAgICAgICAgICAgX3RoaXMudmFsaWRNdXRhdGlvbiA9IG11dGF0aW9uO1xuICAgICAgICAgICAgICAgIF90aGlzLm11dGF0ZWRSZWxldmFudEV2ZW50cyA9IG11dGF0ZWRSZWxldmFudEV2ZW50cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlUG9pbnRlclVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFfdGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuY2xlYW51cCgpOyAvLyBiZWNhdXNlIGhhbmRsZURyYWdFbmQgd29uJ3QgZmlyZVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVEcmFnRW5kID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAgICAgICAgIHZhciBpbml0aWFsQ29udGV4dF8xID0gX3RoaXMuY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgICAgICAgICAgdmFyIGluaXRpYWxWaWV3ID0gaW5pdGlhbENvbnRleHRfMS52aWV3QXBpO1xuICAgICAgICAgICAgICAgIHZhciBfYSA9IF90aGlzLCByZWNlaXZpbmdDb250ZXh0XzEgPSBfYS5yZWNlaXZpbmdDb250ZXh0LCB2YWxpZE11dGF0aW9uID0gX2EudmFsaWRNdXRhdGlvbjtcbiAgICAgICAgICAgICAgICB2YXIgZXZlbnREZWYgPSBfdGhpcy5ldmVudFJhbmdlLmRlZjtcbiAgICAgICAgICAgICAgICB2YXIgZXZlbnRJbnN0YW5jZSA9IF90aGlzLmV2ZW50UmFuZ2UuaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50QXBpID0gbmV3IGNvbW1vbi5FdmVudEFwaShpbml0aWFsQ29udGV4dF8xLCBldmVudERlZiwgZXZlbnRJbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgdmFyIHJlbGV2YW50RXZlbnRzXzEgPSBfdGhpcy5yZWxldmFudEV2ZW50cztcbiAgICAgICAgICAgICAgICB2YXIgbXV0YXRlZFJlbGV2YW50RXZlbnRzXzEgPSBfdGhpcy5tdXRhdGVkUmVsZXZhbnRFdmVudHM7XG4gICAgICAgICAgICAgICAgdmFyIGZpbmFsSGl0ID0gX3RoaXMuaGl0RHJhZ2dpbmcuZmluYWxIaXQ7XG4gICAgICAgICAgICAgICAgX3RoaXMuY2xlYXJEcmFnKCk7IC8vIG11c3QgaGFwcGVuIGFmdGVyIHJldmVydCBhbmltYXRpb25cbiAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dF8xLmVtaXR0ZXIudHJpZ2dlcignZXZlbnREcmFnU3RvcCcsIHtcbiAgICAgICAgICAgICAgICAgICAgZWw6IF90aGlzLnN1YmplY3RFbCxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50QXBpLFxuICAgICAgICAgICAgICAgICAgICBqc0V2ZW50OiBldi5vcmlnRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIHZpZXc6IGluaXRpYWxWaWV3LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZE11dGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRyb3BwZWQgd2l0aGluIHNhbWUgY2FsZW5kYXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY2VpdmluZ0NvbnRleHRfMSA9PT0gaW5pdGlhbENvbnRleHRfMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVwZGF0ZWRFdmVudEFwaSA9IG5ldyBjb21tb24uRXZlbnRBcGkoaW5pdGlhbENvbnRleHRfMSwgbXV0YXRlZFJlbGV2YW50RXZlbnRzXzEuZGVmc1tldmVudERlZi5kZWZJZF0sIGV2ZW50SW5zdGFuY2UgPyBtdXRhdGVkUmVsZXZhbnRFdmVudHNfMS5pbnN0YW5jZXNbZXZlbnRJbnN0YW5jZS5pbnN0YW5jZUlkXSA6IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbENvbnRleHRfMS5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ01FUkdFX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogbXV0YXRlZFJlbGV2YW50RXZlbnRzXzEsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudENoYW5nZUFyZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRFdmVudDogZXZlbnRBcGksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IHVwZGF0ZWRFdmVudEFwaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkRXZlbnRzOiBjb21tb24uYnVpbGRFdmVudEFwaXMobXV0YXRlZFJlbGV2YW50RXZlbnRzXzEsIGluaXRpYWxDb250ZXh0XzEsIGV2ZW50SW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVydDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dF8xLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdNRVJHRV9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogcmVsZXZhbnRFdmVudHNfMSwgLy8gdGhlIHByZS1jaGFuZ2UgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0cmFuc2Zvcm1lZCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYiA9IGluaXRpYWxDb250ZXh0XzEuZ2V0Q3VycmVudERhdGEoKS5wbHVnaW5Ib29rcy5ldmVudERyb3BUcmFuc2Zvcm1lcnM7IF9pIDwgX2IubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRyYW5zZm9ybWVyID0gX2JbX2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzbGliLl9fYXNzaWduKHRyYW5zZm9ybWVkLCB0cmFuc2Zvcm1lcih2YWxpZE11dGF0aW9uLCBpbml0aWFsQ29udGV4dF8xKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dF8xLmVtaXR0ZXIudHJpZ2dlcignZXZlbnREcm9wJywgdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGV2ZW50Q2hhbmdlQXJnKSwgdHJhbnNmb3JtZWQpLCB7IGVsOiBldi5zdWJqZWN0RWwsIGRlbHRhOiB2YWxpZE11dGF0aW9uLmRhdGVzRGVsdGEsIGpzRXZlbnQ6IGV2Lm9yaWdFdmVudCwgdmlldzogaW5pdGlhbFZpZXcgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbENvbnRleHRfMS5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50Q2hhbmdlJywgZXZlbnRDaGFuZ2VBcmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcHBlZCBpbiBkaWZmZXJlbnQgY2FsZW5kYXJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWNlaXZpbmdDb250ZXh0XzEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudFJlbW92ZUFyZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogZXZlbnRBcGksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZEV2ZW50czogY29tbW9uLmJ1aWxkRXZlbnRBcGlzKHJlbGV2YW50RXZlbnRzXzEsIGluaXRpYWxDb250ZXh0XzEsIGV2ZW50SW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVydDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dF8xLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdNRVJHRV9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogcmVsZXZhbnRFdmVudHNfMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dF8xLmVtaXR0ZXIudHJpZ2dlcignZXZlbnRMZWF2ZScsIHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBldmVudFJlbW92ZUFyZyksIHsgZHJhZ2dlZEVsOiBldi5zdWJqZWN0RWwsIHZpZXc6IGluaXRpYWxWaWV3IH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxDb250ZXh0XzEuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdSRU1PVkVfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFN0b3JlOiByZWxldmFudEV2ZW50c18xLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dF8xLmVtaXR0ZXIudHJpZ2dlcignZXZlbnRSZW1vdmUnLCBldmVudFJlbW92ZUFyZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkZWRFdmVudERlZiA9IG11dGF0ZWRSZWxldmFudEV2ZW50c18xLmRlZnNbZXZlbnREZWYuZGVmSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFkZGVkRXZlbnRJbnN0YW5jZSA9IG11dGF0ZWRSZWxldmFudEV2ZW50c18xLmluc3RhbmNlc1tldmVudEluc3RhbmNlLmluc3RhbmNlSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFkZGVkRXZlbnRBcGkgPSBuZXcgY29tbW9uLkV2ZW50QXBpKHJlY2VpdmluZ0NvbnRleHRfMSwgYWRkZWRFdmVudERlZiwgYWRkZWRFdmVudEluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmluZ0NvbnRleHRfMS5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ01FUkdFX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogbXV0YXRlZFJlbGV2YW50RXZlbnRzXzEsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudEFkZEFyZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogYWRkZWRFdmVudEFwaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkRXZlbnRzOiBjb21tb24uYnVpbGRFdmVudEFwaXMobXV0YXRlZFJlbGV2YW50RXZlbnRzXzEsIHJlY2VpdmluZ0NvbnRleHRfMSwgYWRkZWRFdmVudEluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZlcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dF8xLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdSRU1PVkVfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IG11dGF0ZWRSZWxldmFudEV2ZW50c18xLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmluZ0NvbnRleHRfMS5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50QWRkJywgZXZlbnRBZGRBcmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2LmlzVG91Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0XzEuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnU0VMRUNUX0VWRU5UJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRJbnN0YW5jZUlkOiBldmVudEluc3RhbmNlLmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0XzEuZW1pdHRlci50cmlnZ2VyKCdkcm9wJywgdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGJ1aWxkRGF0ZVBvaW50QXBpV2l0aENvbnRleHQoZmluYWxIaXQuZGF0ZVNwYW4sIHJlY2VpdmluZ0NvbnRleHRfMSkpLCB7IGRyYWdnZWRFbDogZXYuc3ViamVjdEVsLCBqc0V2ZW50OiBldi5vcmlnRXZlbnQsIHZpZXc6IGZpbmFsSGl0LmNvbnRleHQudmlld0FwaSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0XzEuZW1pdHRlci50cmlnZ2VyKCdldmVudFJlY2VpdmUnLCB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgZXZlbnRBZGRBcmcpLCB7IGRyYWdnZWRFbDogZXYuc3ViamVjdEVsLCB2aWV3OiBmaW5hbEhpdC5jb250ZXh0LnZpZXdBcGkgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dF8xLmVtaXR0ZXIudHJpZ2dlcignX25vRXZlbnREcm9wJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3RoaXMuY2xlYW51cCgpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gX3RoaXMuY29tcG9uZW50O1xuICAgICAgICB2YXIgb3B0aW9ucyA9IGNvbXBvbmVudC5jb250ZXh0Lm9wdGlvbnM7XG4gICAgICAgIHZhciBkcmFnZ2luZyA9IF90aGlzLmRyYWdnaW5nID0gbmV3IEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcoc2V0dGluZ3MuZWwpO1xuICAgICAgICBkcmFnZ2luZy5wb2ludGVyLnNlbGVjdG9yID0gRXZlbnREcmFnZ2luZy5TRUxFQ1RPUjtcbiAgICAgICAgZHJhZ2dpbmcudG91Y2hTY3JvbGxBbGxvd2VkID0gZmFsc2U7XG4gICAgICAgIGRyYWdnaW5nLmF1dG9TY3JvbGxlci5pc0VuYWJsZWQgPSBvcHRpb25zLmRyYWdTY3JvbGw7XG4gICAgICAgIHZhciBoaXREcmFnZ2luZyA9IF90aGlzLmhpdERyYWdnaW5nID0gbmV3IEhpdERyYWdnaW5nKF90aGlzLmRyYWdnaW5nLCBjb21tb24uaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcudXNlU3ViamVjdENlbnRlciA9IHNldHRpbmdzLnVzZUV2ZW50Q2VudGVyO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdwb2ludGVyZG93bicsIF90aGlzLmhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbignZHJhZ3N0YXJ0JywgX3RoaXMuaGFuZGxlRHJhZ1N0YXJ0KTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbignaGl0dXBkYXRlJywgX3RoaXMuaGFuZGxlSGl0VXBkYXRlKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbigncG9pbnRlcnVwJywgX3RoaXMuaGFuZGxlUG9pbnRlclVwKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbignZHJhZ2VuZCcsIF90aGlzLmhhbmRsZURyYWdFbmQpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEV2ZW50RHJhZ2dpbmcucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcuZGVzdHJveSgpO1xuICAgIH07XG4gICAgLy8gcmVuZGVyIGEgZHJhZyBzdGF0ZSBvbiB0aGUgbmV4dCByZWNlaXZpbmdDYWxlbmRhclxuICAgIEV2ZW50RHJhZ2dpbmcucHJvdG90eXBlLmRpc3BsYXlEcmFnID0gZnVuY3Rpb24gKG5leHRDb250ZXh0LCBzdGF0ZSkge1xuICAgICAgICB2YXIgaW5pdGlhbENvbnRleHQgPSB0aGlzLmNvbXBvbmVudC5jb250ZXh0O1xuICAgICAgICB2YXIgcHJldkNvbnRleHQgPSB0aGlzLnJlY2VpdmluZ0NvbnRleHQ7XG4gICAgICAgIC8vIGRvZXMgdGhlIHByZXZpb3VzIGNhbGVuZGFyIG5lZWQgdG8gYmUgY2xlYXJlZD9cbiAgICAgICAgaWYgKHByZXZDb250ZXh0ICYmIHByZXZDb250ZXh0ICE9PSBuZXh0Q29udGV4dCkge1xuICAgICAgICAgICAgLy8gZG9lcyB0aGUgaW5pdGlhbCBjYWxlbmRhciBuZWVkIHRvIGJlIGNsZWFyZWQ/XG4gICAgICAgICAgICAvLyBpZiBzbywgZG9uJ3QgY2xlYXIgYWxsIHRoZSB3YXkuIHdlIHN0aWxsIG5lZWQgdG8gdG8gaGlkZSB0aGUgYWZmZWN0ZWRFdmVudHNcbiAgICAgICAgICAgIGlmIChwcmV2Q29udGV4dCA9PT0gaW5pdGlhbENvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBwcmV2Q29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTRVRfRVZFTlRfRFJBRycsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZmZlY3RlZEV2ZW50czogc3RhdGUuYWZmZWN0ZWRFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGVkRXZlbnRzOiBjb21tb24uY3JlYXRlRW1wdHlFdmVudFN0b3JlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0V2ZW50OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlbHkgY2xlYXIgdGhlIG9sZCBjYWxlbmRhciBpZiBpdCB3YXNuJ3QgdGhlIGluaXRpYWxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZXZDb250ZXh0LmRpc3BhdGNoKHsgdHlwZTogJ1VOU0VUX0VWRU5UX0RSQUcnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuZXh0Q29udGV4dCkge1xuICAgICAgICAgICAgbmV4dENvbnRleHQuZGlzcGF0Y2goeyB0eXBlOiAnU0VUX0VWRU5UX0RSQUcnLCBzdGF0ZTogc3RhdGUgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEV2ZW50RHJhZ2dpbmcucHJvdG90eXBlLmNsZWFyRHJhZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluaXRpYWxDYWxlbmRhciA9IHRoaXMuY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgIHZhciByZWNlaXZpbmdDb250ZXh0ID0gdGhpcy5yZWNlaXZpbmdDb250ZXh0O1xuICAgICAgICBpZiAocmVjZWl2aW5nQ29udGV4dCkge1xuICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dC5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFVF9FVkVOVF9EUkFHJyB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGUgaW5pdGlhbCBjYWxlbmRhciBtaWdodCBoYXZlIGFuIGR1bW15IGRyYWcgc3RhdGUgZnJvbSBkaXNwbGF5RHJhZ1xuICAgICAgICBpZiAoaW5pdGlhbENhbGVuZGFyICE9PSByZWNlaXZpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICBpbml0aWFsQ2FsZW5kYXIuZGlzcGF0Y2goeyB0eXBlOiAnVU5TRVRfRVZFTlRfRFJBRycgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEV2ZW50RHJhZ2dpbmcucHJvdG90eXBlLmNsZWFudXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc3ViamVjdFNlZyA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmV2ZW50UmFuZ2UgPSBudWxsO1xuICAgICAgICB0aGlzLnJlbGV2YW50RXZlbnRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWNlaXZpbmdDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgdGhpcy52YWxpZE11dGF0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5tdXRhdGVkUmVsZXZhbnRFdmVudHMgPSBudWxsO1xuICAgIH07XG4gICAgLy8gVE9ETzogdGVzdCB0aGlzIGluIElFMTFcbiAgICAvLyBRVUVTVElPTjogd2h5IGRvIHdlIG5lZWQgaXQgb24gdGhlIHJlc2l6YWJsZT8/P1xuICAgIEV2ZW50RHJhZ2dpbmcuU0VMRUNUT1IgPSAnLmZjLWV2ZW50LWRyYWdnYWJsZSwgLmZjLWV2ZW50LXJlc2l6YWJsZSc7XG4gICAgcmV0dXJuIEV2ZW50RHJhZ2dpbmc7XG59KGNvbW1vbi5JbnRlcmFjdGlvbikpO1xuZnVuY3Rpb24gY29tcHV0ZUV2ZW50TXV0YXRpb24oaGl0MCwgaGl0MSwgbWFzc2FnZXJzKSB7XG4gICAgdmFyIGRhdGVTcGFuMCA9IGhpdDAuZGF0ZVNwYW47XG4gICAgdmFyIGRhdGVTcGFuMSA9IGhpdDEuZGF0ZVNwYW47XG4gICAgdmFyIGRhdGUwID0gZGF0ZVNwYW4wLnJhbmdlLnN0YXJ0O1xuICAgIHZhciBkYXRlMSA9IGRhdGVTcGFuMS5yYW5nZS5zdGFydDtcbiAgICB2YXIgc3RhbmRhcmRQcm9wcyA9IHt9O1xuICAgIGlmIChkYXRlU3BhbjAuYWxsRGF5ICE9PSBkYXRlU3BhbjEuYWxsRGF5KSB7XG4gICAgICAgIHN0YW5kYXJkUHJvcHMuYWxsRGF5ID0gZGF0ZVNwYW4xLmFsbERheTtcbiAgICAgICAgc3RhbmRhcmRQcm9wcy5oYXNFbmQgPSBoaXQxLmNvbnRleHQub3B0aW9ucy5hbGxEYXlNYWludGFpbkR1cmF0aW9uO1xuICAgICAgICBpZiAoZGF0ZVNwYW4xLmFsbERheSkge1xuICAgICAgICAgICAgLy8gbWVhbnMgZGF0ZTEgaXMgYWxyZWFkeSBzdGFydC1vZi1kYXksXG4gICAgICAgICAgICAvLyBidXQgZGF0ZTAgbmVlZHMgdG8gYmUgY29udmVydGVkXG4gICAgICAgICAgICBkYXRlMCA9IGNvbW1vbi5zdGFydE9mRGF5KGRhdGUwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgZGVsdGEgPSBjb21tb24uZGlmZkRhdGVzKGRhdGUwLCBkYXRlMSwgaGl0MC5jb250ZXh0LmRhdGVFbnYsIGhpdDAuY29tcG9uZW50SWQgPT09IGhpdDEuY29tcG9uZW50SWQgP1xuICAgICAgICBoaXQwLmxhcmdlVW5pdCA6XG4gICAgICAgIG51bGwpO1xuICAgIGlmIChkZWx0YS5taWxsaXNlY29uZHMpIHsgLy8gaGFzIGhvdXJzL21pbnV0ZXMvc2Vjb25kc1xuICAgICAgICBzdGFuZGFyZFByb3BzLmFsbERheSA9IGZhbHNlO1xuICAgIH1cbiAgICB2YXIgbXV0YXRpb24gPSB7XG4gICAgICAgIGRhdGVzRGVsdGE6IGRlbHRhLFxuICAgICAgICBzdGFuZGFyZFByb3BzOiBzdGFuZGFyZFByb3BzLFxuICAgIH07XG4gICAgZm9yICh2YXIgX2kgPSAwLCBtYXNzYWdlcnNfMSA9IG1hc3NhZ2VyczsgX2kgPCBtYXNzYWdlcnNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIG1hc3NhZ2VyID0gbWFzc2FnZXJzXzFbX2ldO1xuICAgICAgICBtYXNzYWdlcihtdXRhdGlvbiwgaGl0MCwgaGl0MSk7XG4gICAgfVxuICAgIHJldHVybiBtdXRhdGlvbjtcbn1cbmZ1bmN0aW9uIGdldENvbXBvbmVudFRvdWNoRGVsYXkoY29tcG9uZW50KSB7XG4gICAgdmFyIG9wdGlvbnMgPSBjb21wb25lbnQuY29udGV4dC5vcHRpb25zO1xuICAgIHZhciBkZWxheSA9IG9wdGlvbnMuZXZlbnRMb25nUHJlc3NEZWxheTtcbiAgICBpZiAoZGVsYXkgPT0gbnVsbCkge1xuICAgICAgICBkZWxheSA9IG9wdGlvbnMubG9uZ1ByZXNzRGVsYXk7XG4gICAgfVxuICAgIHJldHVybiBkZWxheTtcbn1cblxudmFyIEV2ZW50UmVzaXppbmcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKEV2ZW50UmVzaXppbmcsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRXZlbnRSZXNpemluZyhzZXR0aW5ncykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzZXR0aW5ncykgfHwgdGhpcztcbiAgICAgICAgLy8gaW50ZXJuYWwgc3RhdGVcbiAgICAgICAgX3RoaXMuZHJhZ2dpbmdTZWdFbCA9IG51bGw7XG4gICAgICAgIF90aGlzLmRyYWdnaW5nU2VnID0gbnVsbDsgLy8gVE9ETzogcmVuYW1lIHRvIHJlc2l6aW5nU2VnPyBzdWJqZWN0U2VnP1xuICAgICAgICBfdGhpcy5ldmVudFJhbmdlID0gbnVsbDtcbiAgICAgICAgX3RoaXMucmVsZXZhbnRFdmVudHMgPSBudWxsO1xuICAgICAgICBfdGhpcy52YWxpZE11dGF0aW9uID0gbnVsbDtcbiAgICAgICAgX3RoaXMubXV0YXRlZFJlbGV2YW50RXZlbnRzID0gbnVsbDtcbiAgICAgICAgX3RoaXMuaGFuZGxlUG9pbnRlckRvd24gPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSBfdGhpcy5jb21wb25lbnQ7XG4gICAgICAgICAgICB2YXIgc2VnRWwgPSBfdGhpcy5xdWVyeVNlZ0VsKGV2KTtcbiAgICAgICAgICAgIHZhciBzZWcgPSBjb21tb24uZ2V0RWxTZWcoc2VnRWwpO1xuICAgICAgICAgICAgdmFyIGV2ZW50UmFuZ2UgPSBfdGhpcy5ldmVudFJhbmdlID0gc2VnLmV2ZW50UmFuZ2U7XG4gICAgICAgICAgICBfdGhpcy5kcmFnZ2luZy5taW5EaXN0YW5jZSA9IGNvbXBvbmVudC5jb250ZXh0Lm9wdGlvbnMuZXZlbnREcmFnTWluRGlzdGFuY2U7XG4gICAgICAgICAgICAvLyBpZiB0b3VjaCwgbmVlZCB0byBiZSB3b3JraW5nIHdpdGggYSBzZWxlY3RlZCBldmVudFxuICAgICAgICAgICAgX3RoaXMuZHJhZ2dpbmcuc2V0SWdub3JlTW92ZSghX3RoaXMuY29tcG9uZW50LmlzVmFsaWRTZWdEb3duRWwoZXYub3JpZ0V2ZW50LnRhcmdldCkgfHxcbiAgICAgICAgICAgICAgICAoZXYuaXNUb3VjaCAmJiBfdGhpcy5jb21wb25lbnQucHJvcHMuZXZlbnRTZWxlY3Rpb24gIT09IGV2ZW50UmFuZ2UuaW5zdGFuY2UuaW5zdGFuY2VJZCkpO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVEcmFnU3RhcnQgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gX3RoaXMuY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgICAgICB2YXIgZXZlbnRSYW5nZSA9IF90aGlzLmV2ZW50UmFuZ2U7XG4gICAgICAgICAgICBfdGhpcy5yZWxldmFudEV2ZW50cyA9IGNvbW1vbi5nZXRSZWxldmFudEV2ZW50cyhjb250ZXh0LmdldEN1cnJlbnREYXRhKCkuZXZlbnRTdG9yZSwgX3RoaXMuZXZlbnRSYW5nZS5pbnN0YW5jZS5pbnN0YW5jZUlkKTtcbiAgICAgICAgICAgIHZhciBzZWdFbCA9IF90aGlzLnF1ZXJ5U2VnRWwoZXYpO1xuICAgICAgICAgICAgX3RoaXMuZHJhZ2dpbmdTZWdFbCA9IHNlZ0VsO1xuICAgICAgICAgICAgX3RoaXMuZHJhZ2dpbmdTZWcgPSBjb21tb24uZ2V0RWxTZWcoc2VnRWwpO1xuICAgICAgICAgICAgY29udGV4dC5jYWxlbmRhckFwaS51bnNlbGVjdCgpO1xuICAgICAgICAgICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50UmVzaXplU3RhcnQnLCB7XG4gICAgICAgICAgICAgICAgZWw6IHNlZ0VsLFxuICAgICAgICAgICAgICAgIGV2ZW50OiBuZXcgY29tbW9uLkV2ZW50QXBpKGNvbnRleHQsIGV2ZW50UmFuZ2UuZGVmLCBldmVudFJhbmdlLmluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICBqc0V2ZW50OiBldi5vcmlnRXZlbnQsXG4gICAgICAgICAgICAgICAgdmlldzogY29udGV4dC52aWV3QXBpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmhhbmRsZUhpdFVwZGF0ZSA9IGZ1bmN0aW9uIChoaXQsIGlzRmluYWwsIGV2KSB7XG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IF90aGlzLmNvbXBvbmVudC5jb250ZXh0O1xuICAgICAgICAgICAgdmFyIHJlbGV2YW50RXZlbnRzID0gX3RoaXMucmVsZXZhbnRFdmVudHM7XG4gICAgICAgICAgICB2YXIgaW5pdGlhbEhpdCA9IF90aGlzLmhpdERyYWdnaW5nLmluaXRpYWxIaXQ7XG4gICAgICAgICAgICB2YXIgZXZlbnRJbnN0YW5jZSA9IF90aGlzLmV2ZW50UmFuZ2UuaW5zdGFuY2U7XG4gICAgICAgICAgICB2YXIgbXV0YXRpb24gPSBudWxsO1xuICAgICAgICAgICAgdmFyIG11dGF0ZWRSZWxldmFudEV2ZW50cyA9IG51bGw7XG4gICAgICAgICAgICB2YXIgaXNJbnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgaW50ZXJhY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgYWZmZWN0ZWRFdmVudHM6IHJlbGV2YW50RXZlbnRzLFxuICAgICAgICAgICAgICAgIG11dGF0ZWRFdmVudHM6IGNvbW1vbi5jcmVhdGVFbXB0eUV2ZW50U3RvcmUoKSxcbiAgICAgICAgICAgICAgICBpc0V2ZW50OiB0cnVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChoaXQpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGlzYWxsb3dlZCA9IGhpdC5jb21wb25lbnRJZCA9PT0gaW5pdGlhbEhpdC5jb21wb25lbnRJZFxuICAgICAgICAgICAgICAgICAgICAmJiBfdGhpcy5pc0hpdENvbWJvQWxsb3dlZFxuICAgICAgICAgICAgICAgICAgICAmJiAhX3RoaXMuaXNIaXRDb21ib0FsbG93ZWQoaW5pdGlhbEhpdCwgaGl0KTtcbiAgICAgICAgICAgICAgICBpZiAoIWRpc2FsbG93ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbXV0YXRpb24gPSBjb21wdXRlTXV0YXRpb24oaW5pdGlhbEhpdCwgaGl0LCBldi5zdWJqZWN0RWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdmYy1ldmVudC1yZXNpemVyLXN0YXJ0JyksIGV2ZW50SW5zdGFuY2UucmFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtdXRhdGlvbikge1xuICAgICAgICAgICAgICAgIG11dGF0ZWRSZWxldmFudEV2ZW50cyA9IGNvbW1vbi5hcHBseU11dGF0aW9uVG9FdmVudFN0b3JlKHJlbGV2YW50RXZlbnRzLCBjb250ZXh0LmdldEN1cnJlbnREYXRhKCkuZXZlbnRVaUJhc2VzLCBtdXRhdGlvbiwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgaW50ZXJhY3Rpb24ubXV0YXRlZEV2ZW50cyA9IG11dGF0ZWRSZWxldmFudEV2ZW50cztcbiAgICAgICAgICAgICAgICBpZiAoIWNvbW1vbi5pc0ludGVyYWN0aW9uVmFsaWQoaW50ZXJhY3Rpb24sIGhpdC5kYXRlUHJvZmlsZSwgY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNJbnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbXV0YXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBtdXRhdGVkUmVsZXZhbnRFdmVudHMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGlvbi5tdXRhdGVkRXZlbnRzID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobXV0YXRlZFJlbGV2YW50RXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTRVRfRVZFTlRfUkVTSVpFJyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IGludGVyYWN0aW9uLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFVF9FVkVOVF9SRVNJWkUnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0ludmFsaWQpIHtcbiAgICAgICAgICAgICAgICBjb21tb24uZW5hYmxlQ3Vyc29yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21tb24uZGlzYWJsZUN1cnNvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0ZpbmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uICYmIGlzSGl0c0VxdWFsKGluaXRpYWxIaXQsIGhpdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbXV0YXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfdGhpcy52YWxpZE11dGF0aW9uID0gbXV0YXRpb247XG4gICAgICAgICAgICAgICAgX3RoaXMubXV0YXRlZFJlbGV2YW50RXZlbnRzID0gbXV0YXRlZFJlbGV2YW50RXZlbnRzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVEcmFnRW5kID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IF90aGlzLmNvbXBvbmVudC5jb250ZXh0O1xuICAgICAgICAgICAgdmFyIGV2ZW50RGVmID0gX3RoaXMuZXZlbnRSYW5nZS5kZWY7XG4gICAgICAgICAgICB2YXIgZXZlbnRJbnN0YW5jZSA9IF90aGlzLmV2ZW50UmFuZ2UuaW5zdGFuY2U7XG4gICAgICAgICAgICB2YXIgZXZlbnRBcGkgPSBuZXcgY29tbW9uLkV2ZW50QXBpKGNvbnRleHQsIGV2ZW50RGVmLCBldmVudEluc3RhbmNlKTtcbiAgICAgICAgICAgIHZhciByZWxldmFudEV2ZW50cyA9IF90aGlzLnJlbGV2YW50RXZlbnRzO1xuICAgICAgICAgICAgdmFyIG11dGF0ZWRSZWxldmFudEV2ZW50cyA9IF90aGlzLm11dGF0ZWRSZWxldmFudEV2ZW50cztcbiAgICAgICAgICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdldmVudFJlc2l6ZVN0b3AnLCB7XG4gICAgICAgICAgICAgICAgZWw6IF90aGlzLmRyYWdnaW5nU2VnRWwsXG4gICAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50QXBpLFxuICAgICAgICAgICAgICAgIGpzRXZlbnQ6IGV2Lm9yaWdFdmVudCxcbiAgICAgICAgICAgICAgICB2aWV3OiBjb250ZXh0LnZpZXdBcGksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChfdGhpcy52YWxpZE11dGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmFyIHVwZGF0ZWRFdmVudEFwaSA9IG5ldyBjb21tb24uRXZlbnRBcGkoY29udGV4dCwgbXV0YXRlZFJlbGV2YW50RXZlbnRzLmRlZnNbZXZlbnREZWYuZGVmSWRdLCBldmVudEluc3RhbmNlID8gbXV0YXRlZFJlbGV2YW50RXZlbnRzLmluc3RhbmNlc1tldmVudEluc3RhbmNlLmluc3RhbmNlSWRdIDogbnVsbCk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdNRVJHRV9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICBldmVudFN0b3JlOiBtdXRhdGVkUmVsZXZhbnRFdmVudHMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50Q2hhbmdlQXJnID0ge1xuICAgICAgICAgICAgICAgICAgICBvbGRFdmVudDogZXZlbnRBcGksXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiB1cGRhdGVkRXZlbnRBcGksXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0ZWRFdmVudHM6IGNvbW1vbi5idWlsZEV2ZW50QXBpcyhtdXRhdGVkUmVsZXZhbnRFdmVudHMsIGNvbnRleHQsIGV2ZW50SW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgICAgICByZXZlcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdNRVJHRV9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IHJlbGV2YW50RXZlbnRzLCAvLyB0aGUgcHJlLWNoYW5nZSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50UmVzaXplJywgdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGV2ZW50Q2hhbmdlQXJnKSwgeyBlbDogX3RoaXMuZHJhZ2dpbmdTZWdFbCwgc3RhcnREZWx0YTogX3RoaXMudmFsaWRNdXRhdGlvbi5zdGFydERlbHRhIHx8IGNvbW1vbi5jcmVhdGVEdXJhdGlvbigwKSwgZW5kRGVsdGE6IF90aGlzLnZhbGlkTXV0YXRpb24uZW5kRGVsdGEgfHwgY29tbW9uLmNyZWF0ZUR1cmF0aW9uKDApLCBqc0V2ZW50OiBldi5vcmlnRXZlbnQsIHZpZXc6IGNvbnRleHQudmlld0FwaSB9KSk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50Q2hhbmdlJywgZXZlbnRDaGFuZ2VBcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ19ub0V2ZW50UmVzaXplJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXNldCBhbGwgaW50ZXJuYWwgc3RhdGVcbiAgICAgICAgICAgIF90aGlzLmRyYWdnaW5nU2VnID0gbnVsbDtcbiAgICAgICAgICAgIF90aGlzLnJlbGV2YW50RXZlbnRzID0gbnVsbDtcbiAgICAgICAgICAgIF90aGlzLnZhbGlkTXV0YXRpb24gPSBudWxsO1xuICAgICAgICAgICAgLy8gb2theSB0byBrZWVwIGV2ZW50SW5zdGFuY2UgYXJvdW5kLiB1c2VmdWwgdG8gc2V0IGl0IGluIGhhbmRsZVBvaW50ZXJEb3duXG4gICAgICAgIH07XG4gICAgICAgIHZhciBjb21wb25lbnQgPSBzZXR0aW5ncy5jb21wb25lbnQ7XG4gICAgICAgIHZhciBkcmFnZ2luZyA9IF90aGlzLmRyYWdnaW5nID0gbmV3IEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcoc2V0dGluZ3MuZWwpO1xuICAgICAgICBkcmFnZ2luZy5wb2ludGVyLnNlbGVjdG9yID0gJy5mYy1ldmVudC1yZXNpemVyJztcbiAgICAgICAgZHJhZ2dpbmcudG91Y2hTY3JvbGxBbGxvd2VkID0gZmFsc2U7XG4gICAgICAgIGRyYWdnaW5nLmF1dG9TY3JvbGxlci5pc0VuYWJsZWQgPSBjb21wb25lbnQuY29udGV4dC5vcHRpb25zLmRyYWdTY3JvbGw7XG4gICAgICAgIHZhciBoaXREcmFnZ2luZyA9IF90aGlzLmhpdERyYWdnaW5nID0gbmV3IEhpdERyYWdnaW5nKF90aGlzLmRyYWdnaW5nLCBjb21tb24uaW50ZXJhY3Rpb25TZXR0aW5nc1RvU3RvcmUoc2V0dGluZ3MpKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbigncG9pbnRlcmRvd24nLCBfdGhpcy5oYW5kbGVQb2ludGVyRG93bik7XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ2RyYWdzdGFydCcsIF90aGlzLmhhbmRsZURyYWdTdGFydCk7XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ2hpdHVwZGF0ZScsIF90aGlzLmhhbmRsZUhpdFVwZGF0ZSk7XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ2RyYWdlbmQnLCBfdGhpcy5oYW5kbGVEcmFnRW5kKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBFdmVudFJlc2l6aW5nLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRyYWdnaW5nLmRlc3Ryb3koKTtcbiAgICB9O1xuICAgIEV2ZW50UmVzaXppbmcucHJvdG90eXBlLnF1ZXJ5U2VnRWwgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgcmV0dXJuIGNvbW1vbi5lbGVtZW50Q2xvc2VzdChldi5zdWJqZWN0RWwsICcuZmMtZXZlbnQnKTtcbiAgICB9O1xuICAgIHJldHVybiBFdmVudFJlc2l6aW5nO1xufShjb21tb24uSW50ZXJhY3Rpb24pKTtcbmZ1bmN0aW9uIGNvbXB1dGVNdXRhdGlvbihoaXQwLCBoaXQxLCBpc0Zyb21TdGFydCwgaW5zdGFuY2VSYW5nZSkge1xuICAgIHZhciBkYXRlRW52ID0gaGl0MC5jb250ZXh0LmRhdGVFbnY7XG4gICAgdmFyIGRhdGUwID0gaGl0MC5kYXRlU3Bhbi5yYW5nZS5zdGFydDtcbiAgICB2YXIgZGF0ZTEgPSBoaXQxLmRhdGVTcGFuLnJhbmdlLnN0YXJ0O1xuICAgIHZhciBkZWx0YSA9IGNvbW1vbi5kaWZmRGF0ZXMoZGF0ZTAsIGRhdGUxLCBkYXRlRW52LCBoaXQwLmxhcmdlVW5pdCk7XG4gICAgaWYgKGlzRnJvbVN0YXJ0KSB7XG4gICAgICAgIGlmIChkYXRlRW52LmFkZChpbnN0YW5jZVJhbmdlLnN0YXJ0LCBkZWx0YSkgPCBpbnN0YW5jZVJhbmdlLmVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnREZWx0YTogZGVsdGEgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChkYXRlRW52LmFkZChpbnN0YW5jZVJhbmdlLmVuZCwgZGVsdGEpID4gaW5zdGFuY2VSYW5nZS5zdGFydCkge1xuICAgICAgICByZXR1cm4geyBlbmREZWx0YTogZGVsdGEgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBVbnNlbGVjdEF1dG8gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVW5zZWxlY3RBdXRvKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5pc1JlY2VudFBvaW50ZXJEYXRlU2VsZWN0ID0gZmFsc2U7IC8vIHdpc2ggd2UgY291bGQgdXNlIGEgc2VsZWN0b3IgdG8gZGV0ZWN0IGRhdGUgc2VsZWN0aW9uLCBidXQgdXNlcyBoaXQgc3lzdGVtXG4gICAgICAgIHRoaXMubWF0Y2hlc0NhbmNlbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1hdGNoZXNFdmVudCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uU2VsZWN0ID0gZnVuY3Rpb24gKHNlbGVjdEluZm8pIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RJbmZvLmpzRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5pc1JlY2VudFBvaW50ZXJEYXRlU2VsZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vbkRvY3VtZW50UG9pbnRlckRvd24gPSBmdW5jdGlvbiAocGV2KSB7XG4gICAgICAgICAgICB2YXIgdW5zZWxlY3RDYW5jZWwgPSBfdGhpcy5jb250ZXh0Lm9wdGlvbnMudW5zZWxlY3RDYW5jZWw7XG4gICAgICAgICAgICB2YXIgZG93bkVsID0gY29tbW9uLmdldEV2ZW50VGFyZ2V0VmlhUm9vdChwZXYub3JpZ0V2ZW50KTtcbiAgICAgICAgICAgIF90aGlzLm1hdGNoZXNDYW5jZWwgPSAhIWNvbW1vbi5lbGVtZW50Q2xvc2VzdChkb3duRWwsIHVuc2VsZWN0Q2FuY2VsKTtcbiAgICAgICAgICAgIF90aGlzLm1hdGNoZXNFdmVudCA9ICEhY29tbW9uLmVsZW1lbnRDbG9zZXN0KGRvd25FbCwgRXZlbnREcmFnZ2luZy5TRUxFQ1RPUik7IC8vIGludGVyYWN0aW9uIHN0YXJ0ZWQgb24gYW4gZXZlbnQ/XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub25Eb2N1bWVudFBvaW50ZXJVcCA9IGZ1bmN0aW9uIChwZXYpIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gX3RoaXMuY29udGV4dDtcbiAgICAgICAgICAgIHZhciBkb2N1bWVudFBvaW50ZXIgPSBfdGhpcy5kb2N1bWVudFBvaW50ZXI7XG4gICAgICAgICAgICB2YXIgY2FsZW5kYXJTdGF0ZSA9IGNvbnRleHQuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgICAgIC8vIHRvdWNoLXNjcm9sbGluZyBzaG91bGQgbmV2ZXIgdW5mb2N1cyBhbnkgdHlwZSBvZiBzZWxlY3Rpb25cbiAgICAgICAgICAgIGlmICghZG9jdW1lbnRQb2ludGVyLndhc1RvdWNoU2Nyb2xsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGVuZGFyU3RhdGUuZGF0ZVNlbGVjdGlvbiAmJiAvLyBhbiBleGlzdGluZyBkYXRlIHNlbGVjdGlvbj9cbiAgICAgICAgICAgICAgICAgICAgIV90aGlzLmlzUmVjZW50UG9pbnRlckRhdGVTZWxlY3QgLy8gYSBuZXcgcG9pbnRlci1pbml0aWF0ZWQgZGF0ZSBzZWxlY3Rpb24gc2luY2UgbGFzdCBvbkRvY3VtZW50UG9pbnRlclVwP1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdW5zZWxlY3RBdXRvID0gY29udGV4dC5vcHRpb25zLnVuc2VsZWN0QXV0bztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuc2VsZWN0QXV0byAmJiAoIXVuc2VsZWN0QXV0byB8fCAhX3RoaXMubWF0Y2hlc0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY2FsZW5kYXJBcGkudW5zZWxlY3QocGV2KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2FsZW5kYXJTdGF0ZS5ldmVudFNlbGVjdGlvbiAmJiAvLyBhbiBleGlzdGluZyBldmVudCBzZWxlY3RlZD9cbiAgICAgICAgICAgICAgICAgICAgIV90aGlzLm1hdGNoZXNFdmVudCAvLyBpbnRlcmFjdGlvbiBESUROJ1Qgc3RhcnQgb24gYW4gZXZlbnRcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFTEVDVF9FVkVOVCcgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3RoaXMuaXNSZWNlbnRQb2ludGVyRGF0ZVNlbGVjdCA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgZG9jdW1lbnRQb2ludGVyID0gdGhpcy5kb2N1bWVudFBvaW50ZXIgPSBuZXcgUG9pbnRlckRyYWdnaW5nKGRvY3VtZW50KTtcbiAgICAgICAgZG9jdW1lbnRQb2ludGVyLnNob3VsZElnbm9yZU1vdmUgPSB0cnVlO1xuICAgICAgICBkb2N1bWVudFBvaW50ZXIuc2hvdWxkV2F0Y2hTY3JvbGwgPSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnRQb2ludGVyLmVtaXR0ZXIub24oJ3BvaW50ZXJkb3duJywgdGhpcy5vbkRvY3VtZW50UG9pbnRlckRvd24pO1xuICAgICAgICBkb2N1bWVudFBvaW50ZXIuZW1pdHRlci5vbigncG9pbnRlcnVwJywgdGhpcy5vbkRvY3VtZW50UG9pbnRlclVwKTtcbiAgICAgICAgLypcbiAgICAgICAgVE9ETzogYmV0dGVyIHdheSB0byBrbm93IGFib3V0IHdoZXRoZXIgdGhlcmUgd2FzIGEgc2VsZWN0aW9uIHdpdGggdGhlIHBvaW50ZXJcbiAgICAgICAgKi9cbiAgICAgICAgY29udGV4dC5lbWl0dGVyLm9uKCdzZWxlY3QnLCB0aGlzLm9uU2VsZWN0KTtcbiAgICB9XG4gICAgVW5zZWxlY3RBdXRvLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNvbnRleHQuZW1pdHRlci5vZmYoJ3NlbGVjdCcsIHRoaXMub25TZWxlY3QpO1xuICAgICAgICB0aGlzLmRvY3VtZW50UG9pbnRlci5kZXN0cm95KCk7XG4gICAgfTtcbiAgICByZXR1cm4gVW5zZWxlY3RBdXRvO1xufSgpKTtcblxudmFyIE9QVElPTl9SRUZJTkVSUyA9IHtcbiAgICBmaXhlZE1pcnJvclBhcmVudDogY29tbW9uLmlkZW50aXR5LFxufTtcbnZhciBMSVNURU5FUl9SRUZJTkVSUyA9IHtcbiAgICBkYXRlQ2xpY2s6IGNvbW1vbi5pZGVudGl0eSxcbiAgICBldmVudERyYWdTdGFydDogY29tbW9uLmlkZW50aXR5LFxuICAgIGV2ZW50RHJhZ1N0b3A6IGNvbW1vbi5pZGVudGl0eSxcbiAgICBldmVudERyb3A6IGNvbW1vbi5pZGVudGl0eSxcbiAgICBldmVudFJlc2l6ZVN0YXJ0OiBjb21tb24uaWRlbnRpdHksXG4gICAgZXZlbnRSZXNpemVTdG9wOiBjb21tb24uaWRlbnRpdHksXG4gICAgZXZlbnRSZXNpemU6IGNvbW1vbi5pZGVudGl0eSxcbiAgICBkcm9wOiBjb21tb24uaWRlbnRpdHksXG4gICAgZXZlbnRSZWNlaXZlOiBjb21tb24uaWRlbnRpdHksXG4gICAgZXZlbnRMZWF2ZTogY29tbW9uLmlkZW50aXR5LFxufTtcblxuLypcbkdpdmVuIGFuIGFscmVhZHkgaW5zdGFudGlhdGVkIGRyYWdnYWJsZSBvYmplY3QgZm9yIG9uZS1vci1tb3JlIGVsZW1lbnRzLFxuSW50ZXJwcmV0cyBhbnkgZHJhZ2dpbmcgYXMgYW4gYXR0ZW1wdCB0byBkcmFnIGFuIGV2ZW50cyB0aGF0IGxpdmVzIG91dHNpZGVcbm9mIGEgY2FsZW5kYXIgb250byBhIGNhbGVuZGFyLlxuKi9cbnZhciBFeHRlcm5hbEVsZW1lbnREcmFnZ2luZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFeHRlcm5hbEVsZW1lbnREcmFnZ2luZyhkcmFnZ2luZywgc3VwcGxpZWREcmFnTWV0YSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnJlY2VpdmluZ0NvbnRleHQgPSBudWxsO1xuICAgICAgICB0aGlzLmRyb3BwYWJsZUV2ZW50ID0gbnVsbDsgLy8gd2lsbCBleGlzdCBmb3IgYWxsIGRyYWdzLCBldmVuIGlmIGNyZWF0ZTpmYWxzZVxuICAgICAgICB0aGlzLnN1cHBsaWVkRHJhZ01ldGEgPSBudWxsO1xuICAgICAgICB0aGlzLmRyYWdNZXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5oYW5kbGVEcmFnU3RhcnQgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIF90aGlzLmRyYWdNZXRhID0gX3RoaXMuYnVpbGREcmFnTWV0YShldi5zdWJqZWN0RWwpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZUhpdFVwZGF0ZSA9IGZ1bmN0aW9uIChoaXQsIGlzRmluYWwsIGV2KSB7XG4gICAgICAgICAgICB2YXIgZHJhZ2dpbmcgPSBfdGhpcy5oaXREcmFnZ2luZy5kcmFnZ2luZztcbiAgICAgICAgICAgIHZhciByZWNlaXZpbmdDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgICAgIHZhciBkcm9wcGFibGVFdmVudCA9IG51bGw7XG4gICAgICAgICAgICB2YXIgaXNJbnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgaW50ZXJhY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgYWZmZWN0ZWRFdmVudHM6IGNvbW1vbi5jcmVhdGVFbXB0eUV2ZW50U3RvcmUoKSxcbiAgICAgICAgICAgICAgICBtdXRhdGVkRXZlbnRzOiBjb21tb24uY3JlYXRlRW1wdHlFdmVudFN0b3JlKCksXG4gICAgICAgICAgICAgICAgaXNFdmVudDogX3RoaXMuZHJhZ01ldGEuY3JlYXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChoaXQpIHtcbiAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0ID0gaGl0LmNvbnRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmNhbkRyb3BFbE9uQ2FsZW5kYXIoZXYuc3ViamVjdEVsLCByZWNlaXZpbmdDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICBkcm9wcGFibGVFdmVudCA9IGNvbXB1dGVFdmVudEZvckRhdGVTcGFuKGhpdC5kYXRlU3BhbiwgX3RoaXMuZHJhZ01ldGEsIHJlY2VpdmluZ0NvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGlvbi5tdXRhdGVkRXZlbnRzID0gY29tbW9uLmV2ZW50VHVwbGVUb1N0b3JlKGRyb3BwYWJsZUV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaXNJbnZhbGlkID0gIWNvbW1vbi5pc0ludGVyYWN0aW9uVmFsaWQoaW50ZXJhY3Rpb24sIGhpdC5kYXRlUHJvZmlsZSwgcmVjZWl2aW5nQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0ludmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uLm11dGF0ZWRFdmVudHMgPSBjb21tb24uY3JlYXRlRW1wdHlFdmVudFN0b3JlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wcGFibGVFdmVudCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5kaXNwbGF5RHJhZyhyZWNlaXZpbmdDb250ZXh0LCBpbnRlcmFjdGlvbik7XG4gICAgICAgICAgICAvLyBzaG93IG1pcnJvciBpZiBubyBhbHJlYWR5LXJlbmRlcmVkIG1pcnJvciBlbGVtZW50IE9SIGlmIHdlIGFyZSBzaHV0dGluZyBkb3duIHRoZSBtaXJyb3IgKD8pXG4gICAgICAgICAgICAvLyBUT0RPOiB3aXNoIHdlIGNvdWxkIHNvbWVob3cgd2FpdCBmb3IgZGlzcGF0Y2ggdG8gZ3VhcmFudGVlIHJlbmRlclxuICAgICAgICAgICAgZHJhZ2dpbmcuc2V0TWlycm9ySXNWaXNpYmxlKGlzRmluYWwgfHwgIWRyb3BwYWJsZUV2ZW50IHx8ICFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmMtZXZlbnQtbWlycm9yJykpO1xuICAgICAgICAgICAgaWYgKCFpc0ludmFsaWQpIHtcbiAgICAgICAgICAgICAgICBjb21tb24uZW5hYmxlQ3Vyc29yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21tb24uZGlzYWJsZUN1cnNvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0ZpbmFsKSB7XG4gICAgICAgICAgICAgICAgZHJhZ2dpbmcuc2V0TWlycm9yTmVlZHNSZXZlcnQoIWRyb3BwYWJsZUV2ZW50KTtcbiAgICAgICAgICAgICAgICBfdGhpcy5yZWNlaXZpbmdDb250ZXh0ID0gcmVjZWl2aW5nQ29udGV4dDtcbiAgICAgICAgICAgICAgICBfdGhpcy5kcm9wcGFibGVFdmVudCA9IGRyb3BwYWJsZUV2ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZURyYWdFbmQgPSBmdW5jdGlvbiAocGV2KSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBfdGhpcywgcmVjZWl2aW5nQ29udGV4dCA9IF9hLnJlY2VpdmluZ0NvbnRleHQsIGRyb3BwYWJsZUV2ZW50ID0gX2EuZHJvcHBhYmxlRXZlbnQ7XG4gICAgICAgICAgICBfdGhpcy5jbGVhckRyYWcoKTtcbiAgICAgICAgICAgIGlmIChyZWNlaXZpbmdDb250ZXh0ICYmIGRyb3BwYWJsZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpbmFsSGl0ID0gX3RoaXMuaGl0RHJhZ2dpbmcuZmluYWxIaXQ7XG4gICAgICAgICAgICAgICAgdmFyIGZpbmFsVmlldyA9IGZpbmFsSGl0LmNvbnRleHQudmlld0FwaTtcbiAgICAgICAgICAgICAgICB2YXIgZHJhZ01ldGEgPSBfdGhpcy5kcmFnTWV0YTtcbiAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0LmVtaXR0ZXIudHJpZ2dlcignZHJvcCcsIHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBidWlsZERhdGVQb2ludEFwaVdpdGhDb250ZXh0KGZpbmFsSGl0LmRhdGVTcGFuLCByZWNlaXZpbmdDb250ZXh0KSksIHsgZHJhZ2dlZEVsOiBwZXYuc3ViamVjdEVsLCBqc0V2ZW50OiBwZXYub3JpZ0V2ZW50LCB2aWV3OiBmaW5hbFZpZXcgfSkpO1xuICAgICAgICAgICAgICAgIGlmIChkcmFnTWV0YS5jcmVhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFkZGluZ0V2ZW50c18xID0gY29tbW9uLmV2ZW50VHVwbGVUb1N0b3JlKGRyb3BwYWJsZUV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTUVSR0VfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IGFkZGluZ0V2ZW50c18xLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBldi5pc1RvdWNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnU0VMRUNUX0VWRU5UJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudEluc3RhbmNlSWQ6IGRyb3BwYWJsZUV2ZW50Lmluc3RhbmNlLmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBzaWduYWwgdGhhdCBhbiBleHRlcm5hbCBldmVudCBsYW5kZWRcbiAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50UmVjZWl2ZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBuZXcgY29tbW9uLkV2ZW50QXBpKHJlY2VpdmluZ0NvbnRleHQsIGRyb3BwYWJsZUV2ZW50LmRlZiwgZHJvcHBhYmxlRXZlbnQuaW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZEV2ZW50czogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICByZXZlcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1JFTU9WRV9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFN0b3JlOiBhZGRpbmdFdmVudHNfMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkRWw6IHBldi5zdWJqZWN0RWwsXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3OiBmaW5hbFZpZXcsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF90aGlzLnJlY2VpdmluZ0NvbnRleHQgPSBudWxsO1xuICAgICAgICAgICAgX3RoaXMuZHJvcHBhYmxlRXZlbnQgPSBudWxsO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgaGl0RHJhZ2dpbmcgPSB0aGlzLmhpdERyYWdnaW5nID0gbmV3IEhpdERyYWdnaW5nKGRyYWdnaW5nLCBjb21tb24uaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcucmVxdWlyZUluaXRpYWwgPSBmYWxzZTsgLy8gd2lsbCBzdGFydCBvdXRzaWRlIG9mIGEgY29tcG9uZW50XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ2RyYWdzdGFydCcsIHRoaXMuaGFuZGxlRHJhZ1N0YXJ0KTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbignaGl0dXBkYXRlJywgdGhpcy5oYW5kbGVIaXRVcGRhdGUpO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdkcmFnZW5kJywgdGhpcy5oYW5kbGVEcmFnRW5kKTtcbiAgICAgICAgdGhpcy5zdXBwbGllZERyYWdNZXRhID0gc3VwcGxpZWREcmFnTWV0YTtcbiAgICB9XG4gICAgRXh0ZXJuYWxFbGVtZW50RHJhZ2dpbmcucHJvdG90eXBlLmJ1aWxkRHJhZ01ldGEgPSBmdW5jdGlvbiAoc3ViamVjdEVsKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zdXBwbGllZERyYWdNZXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbW1vbi5wYXJzZURyYWdNZXRhKHRoaXMuc3VwcGxpZWREcmFnTWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN1cHBsaWVkRHJhZ01ldGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21tb24ucGFyc2VEcmFnTWV0YSh0aGlzLnN1cHBsaWVkRHJhZ01ldGEoc3ViamVjdEVsKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldERyYWdNZXRhRnJvbUVsKHN1YmplY3RFbCk7XG4gICAgfTtcbiAgICBFeHRlcm5hbEVsZW1lbnREcmFnZ2luZy5wcm90b3R5cGUuZGlzcGxheURyYWcgPSBmdW5jdGlvbiAobmV4dENvbnRleHQsIHN0YXRlKSB7XG4gICAgICAgIHZhciBwcmV2Q29udGV4dCA9IHRoaXMucmVjZWl2aW5nQ29udGV4dDtcbiAgICAgICAgaWYgKHByZXZDb250ZXh0ICYmIHByZXZDb250ZXh0ICE9PSBuZXh0Q29udGV4dCkge1xuICAgICAgICAgICAgcHJldkNvbnRleHQuZGlzcGF0Y2goeyB0eXBlOiAnVU5TRVRfRVZFTlRfRFJBRycgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5leHRDb250ZXh0KSB7XG4gICAgICAgICAgICBuZXh0Q29udGV4dC5kaXNwYXRjaCh7IHR5cGU6ICdTRVRfRVZFTlRfRFJBRycsIHN0YXRlOiBzdGF0ZSB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRXh0ZXJuYWxFbGVtZW50RHJhZ2dpbmcucHJvdG90eXBlLmNsZWFyRHJhZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVjZWl2aW5nQ29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5yZWNlaXZpbmdDb250ZXh0LmRpc3BhdGNoKHsgdHlwZTogJ1VOU0VUX0VWRU5UX0RSQUcnIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBFeHRlcm5hbEVsZW1lbnREcmFnZ2luZy5wcm90b3R5cGUuY2FuRHJvcEVsT25DYWxlbmRhciA9IGZ1bmN0aW9uIChlbCwgcmVjZWl2aW5nQ29udGV4dCkge1xuICAgICAgICB2YXIgZHJvcEFjY2VwdCA9IHJlY2VpdmluZ0NvbnRleHQub3B0aW9ucy5kcm9wQWNjZXB0O1xuICAgICAgICBpZiAodHlwZW9mIGRyb3BBY2NlcHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBkcm9wQWNjZXB0LmNhbGwocmVjZWl2aW5nQ29udGV4dC5jYWxlbmRhckFwaSwgZWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZHJvcEFjY2VwdCA9PT0gJ3N0cmluZycgJiYgZHJvcEFjY2VwdCkge1xuICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oY29tbW9uLmVsZW1lbnRNYXRjaGVzKGVsLCBkcm9wQWNjZXB0KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICByZXR1cm4gRXh0ZXJuYWxFbGVtZW50RHJhZ2dpbmc7XG59KCkpO1xuLy8gVXRpbHMgZm9yIGNvbXB1dGluZyBldmVudCBzdG9yZSBmcm9tIHRoZSBEcmFnTWV0YVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gY29tcHV0ZUV2ZW50Rm9yRGF0ZVNwYW4oZGF0ZVNwYW4sIGRyYWdNZXRhLCBjb250ZXh0KSB7XG4gICAgdmFyIGRlZlByb3BzID0gdHNsaWIuX19hc3NpZ24oe30sIGRyYWdNZXRhLmxlZnRvdmVyUHJvcHMpO1xuICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBjb250ZXh0LnBsdWdpbkhvb2tzLmV4dGVybmFsRGVmVHJhbnNmb3JtczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IF9hW19pXTtcbiAgICAgICAgdHNsaWIuX19hc3NpZ24oZGVmUHJvcHMsIHRyYW5zZm9ybShkYXRlU3BhbiwgZHJhZ01ldGEpKTtcbiAgICB9XG4gICAgdmFyIF9iID0gY29tbW9uLnJlZmluZUV2ZW50RGVmKGRlZlByb3BzLCBjb250ZXh0KSwgcmVmaW5lZCA9IF9iLnJlZmluZWQsIGV4dHJhID0gX2IuZXh0cmE7XG4gICAgdmFyIGRlZiA9IGNvbW1vbi5wYXJzZUV2ZW50RGVmKHJlZmluZWQsIGV4dHJhLCBkcmFnTWV0YS5zb3VyY2VJZCwgZGF0ZVNwYW4uYWxsRGF5LCBjb250ZXh0Lm9wdGlvbnMuZm9yY2VFdmVudER1cmF0aW9uIHx8IEJvb2xlYW4oZHJhZ01ldGEuZHVyYXRpb24pLCAvLyBoYXNFbmRcbiAgICBjb250ZXh0KTtcbiAgICB2YXIgc3RhcnQgPSBkYXRlU3Bhbi5yYW5nZS5zdGFydDtcbiAgICAvLyBvbmx5IHJlbHkgb24gdGltZSBpbmZvIGlmIGRyb3Agem9uZSBpcyBhbGwtZGF5LFxuICAgIC8vIG90aGVyd2lzZSwgd2UgYWxyZWFkeSBrbm93IHRoZSB0aW1lXG4gICAgaWYgKGRhdGVTcGFuLmFsbERheSAmJiBkcmFnTWV0YS5zdGFydFRpbWUpIHtcbiAgICAgICAgc3RhcnQgPSBjb250ZXh0LmRhdGVFbnYuYWRkKHN0YXJ0LCBkcmFnTWV0YS5zdGFydFRpbWUpO1xuICAgIH1cbiAgICB2YXIgZW5kID0gZHJhZ01ldGEuZHVyYXRpb24gP1xuICAgICAgICBjb250ZXh0LmRhdGVFbnYuYWRkKHN0YXJ0LCBkcmFnTWV0YS5kdXJhdGlvbikgOlxuICAgICAgICBjb21tb24uZ2V0RGVmYXVsdEV2ZW50RW5kKGRhdGVTcGFuLmFsbERheSwgc3RhcnQsIGNvbnRleHQpO1xuICAgIHZhciBpbnN0YW5jZSA9IGNvbW1vbi5jcmVhdGVFdmVudEluc3RhbmNlKGRlZi5kZWZJZCwgeyBzdGFydDogc3RhcnQsIGVuZDogZW5kIH0pO1xuICAgIHJldHVybiB7IGRlZjogZGVmLCBpbnN0YW5jZTogaW5zdGFuY2UgfTtcbn1cbi8vIFV0aWxzIGZvciBleHRyYWN0aW5nIGRhdGEgZnJvbSBlbGVtZW50XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBnZXREcmFnTWV0YUZyb21FbChlbCkge1xuICAgIHZhciBzdHIgPSBnZXRFbWJlZGRlZEVsRGF0YShlbCwgJ2V2ZW50Jyk7XG4gICAgdmFyIG9iaiA9IHN0ciA/XG4gICAgICAgIEpTT04ucGFyc2Uoc3RyKSA6XG4gICAgICAgIHsgY3JlYXRlOiBmYWxzZSB9OyAvLyBpZiBubyBlbWJlZGRlZCBkYXRhLCBhc3N1bWUgbm8gZXZlbnQgY3JlYXRpb25cbiAgICByZXR1cm4gY29tbW9uLnBhcnNlRHJhZ01ldGEob2JqKTtcbn1cbmNvbW1vbi5jb25maWcuZGF0YUF0dHJQcmVmaXggPSAnJztcbmZ1bmN0aW9uIGdldEVtYmVkZGVkRWxEYXRhKGVsLCBuYW1lKSB7XG4gICAgdmFyIHByZWZpeCA9IGNvbW1vbi5jb25maWcuZGF0YUF0dHJQcmVmaXg7XG4gICAgdmFyIHByZWZpeGVkTmFtZSA9IChwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJykgKyBuYW1lO1xuICAgIHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtJyArIHByZWZpeGVkTmFtZSkgfHwgJyc7XG59XG5cbi8qXG5NYWtlcyBhbiBlbGVtZW50ICh0aGF0IGlzICpleHRlcm5hbCogdG8gYW55IGNhbGVuZGFyKSBkcmFnZ2FibGUuXG5DYW4gcGFzcyBpbiBkYXRhIHRoYXQgZGV0ZXJtaW5lcyBob3cgYW4gZXZlbnQgd2lsbCBiZSBjcmVhdGVkIHdoZW4gZHJvcHBlZCBvbnRvIGEgY2FsZW5kYXIuXG5MZXZlcmFnZXMgRnVsbENhbGVuZGFyJ3MgaW50ZXJuYWwgZHJhZy1uLWRyb3AgZnVuY3Rpb25hbGl0eSBXSVRIT1VUIGEgdGhpcmQtcGFydHkgZHJhZyBzeXN0ZW0uXG4qL1xudmFyIEV4dGVybmFsRHJhZ2dhYmxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEV4dGVybmFsRHJhZ2dhYmxlKGVsLCBzZXR0aW5ncykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoc2V0dGluZ3MgPT09IHZvaWQgMCkgeyBzZXR0aW5ncyA9IHt9OyB9XG4gICAgICAgIHRoaXMuaGFuZGxlUG9pbnRlckRvd24gPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIHZhciBkcmFnZ2luZyA9IF90aGlzLmRyYWdnaW5nO1xuICAgICAgICAgICAgdmFyIF9hID0gX3RoaXMuc2V0dGluZ3MsIG1pbkRpc3RhbmNlID0gX2EubWluRGlzdGFuY2UsIGxvbmdQcmVzc0RlbGF5ID0gX2EubG9uZ1ByZXNzRGVsYXk7XG4gICAgICAgICAgICBkcmFnZ2luZy5taW5EaXN0YW5jZSA9XG4gICAgICAgICAgICAgICAgbWluRGlzdGFuY2UgIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgICAgIG1pbkRpc3RhbmNlIDpcbiAgICAgICAgICAgICAgICAgICAgKGV2LmlzVG91Y2ggPyAwIDogY29tbW9uLkJBU0VfT1BUSU9OX0RFRkFVTFRTLmV2ZW50RHJhZ01pbkRpc3RhbmNlKTtcbiAgICAgICAgICAgIGRyYWdnaW5nLmRlbGF5ID1cbiAgICAgICAgICAgICAgICBldi5pc1RvdWNoID8gLy8gVE9ETzogZXZlbnR1YWxseSByZWFkIGV2ZW50TG9uZ1ByZXNzRGVsYXkgaW5zdGVhZCB2dnZcbiAgICAgICAgICAgICAgICAgICAgKGxvbmdQcmVzc0RlbGF5ICE9IG51bGwgPyBsb25nUHJlc3NEZWxheSA6IGNvbW1vbi5CQVNFX09QVElPTl9ERUZBVUxUUy5sb25nUHJlc3NEZWxheSkgOlxuICAgICAgICAgICAgICAgICAgICAwO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZURyYWdTdGFydCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgaWYgKGV2LmlzVG91Y2ggJiZcbiAgICAgICAgICAgICAgICBfdGhpcy5kcmFnZ2luZy5kZWxheSAmJlxuICAgICAgICAgICAgICAgIGV2LnN1YmplY3RFbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZjLWV2ZW50JykpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5kcmFnZ2luZy5taXJyb3IuZ2V0TWlycm9yRWwoKS5jbGFzc0xpc3QuYWRkKCdmYy1ldmVudC1zZWxlY3RlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgICAgIHZhciBkcmFnZ2luZyA9IHRoaXMuZHJhZ2dpbmcgPSBuZXcgRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZyhlbCk7XG4gICAgICAgIGRyYWdnaW5nLnRvdWNoU2Nyb2xsQWxsb3dlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoc2V0dGluZ3MuaXRlbVNlbGVjdG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRyYWdnaW5nLnBvaW50ZXIuc2VsZWN0b3IgPSBzZXR0aW5ncy5pdGVtU2VsZWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldHRpbmdzLmFwcGVuZFRvICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRyYWdnaW5nLm1pcnJvci5wYXJlbnROb2RlID0gc2V0dGluZ3MuYXBwZW5kVG87IC8vIFRPRE86IHdyaXRlIHRlc3RzXG4gICAgICAgIH1cbiAgICAgICAgZHJhZ2dpbmcuZW1pdHRlci5vbigncG9pbnRlcmRvd24nLCB0aGlzLmhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgICAgZHJhZ2dpbmcuZW1pdHRlci5vbignZHJhZ3N0YXJ0JywgdGhpcy5oYW5kbGVEcmFnU3RhcnQpO1xuICAgICAgICBuZXcgRXh0ZXJuYWxFbGVtZW50RHJhZ2dpbmcoZHJhZ2dpbmcsIHNldHRpbmdzLmV2ZW50RGF0YSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgfVxuICAgIEV4dGVybmFsRHJhZ2dhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRyYWdnaW5nLmRlc3Ryb3koKTtcbiAgICB9O1xuICAgIHJldHVybiBFeHRlcm5hbERyYWdnYWJsZTtcbn0oKSk7XG5cbi8qXG5EZXRlY3RzIHdoZW4gYSAqVEhJUkQtUEFSVFkqIGRyYWctbi1kcm9wIHN5c3RlbSBpbnRlcmFjdHMgd2l0aCBlbGVtZW50cy5cblRoZSB0aGlyZC1wYXJ0eSBzeXN0ZW0gaXMgcmVzcG9uc2libGUgZm9yIGRyYXdpbmcgdGhlIHZpc3VhbHMgZWZmZWN0cyBvZiB0aGUgZHJhZy5cblRoaXMgY2xhc3Mgc2ltcGx5IG1vbml0b3JzIGZvciBwb2ludGVyIG1vdmVtZW50cyBhbmQgZmlyZXMgZXZlbnRzLlxuSXQgYWxzbyBoYXMgdGhlIGFiaWxpdHkgdG8gaGlkZSB0aGUgbW92aW5nIGVsZW1lbnQgKHRoZSBcIm1pcnJvclwiKSBkdXJpbmcgdGhlIGRyYWcuXG4qL1xudmFyIEluZmVycmVkRWxlbWVudERyYWdnaW5nID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhJbmZlcnJlZEVsZW1lbnREcmFnZ2luZywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJbmZlcnJlZEVsZW1lbnREcmFnZ2luZyhjb250YWluZXJFbCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBjb250YWluZXJFbCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc2hvdWxkSWdub3JlTW92ZSA9IGZhbHNlO1xuICAgICAgICBfdGhpcy5taXJyb3JTZWxlY3RvciA9ICcnO1xuICAgICAgICBfdGhpcy5jdXJyZW50TWlycm9yRWwgPSBudWxsO1xuICAgICAgICBfdGhpcy5oYW5kbGVQb2ludGVyRG93biA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgX3RoaXMuZW1pdHRlci50cmlnZ2VyKCdwb2ludGVyZG93bicsIGV2KTtcbiAgICAgICAgICAgIGlmICghX3RoaXMuc2hvdWxkSWdub3JlTW92ZSkge1xuICAgICAgICAgICAgICAgIC8vIGZpcmUgZHJhZ3N0YXJ0IHJpZ2h0IGF3YXkuIGRvZXMgbm90IHN1cHBvcnQgZGVsYXkgb3IgbWluLWRpc3RhbmNlXG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdHRlci50cmlnZ2VyKCdkcmFnc3RhcnQnLCBldik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmhhbmRsZVBvaW50ZXJNb3ZlID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBpZiAoIV90aGlzLnNob3VsZElnbm9yZU1vdmUpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ2RyYWdtb3ZlJywgZXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVQb2ludGVyVXAgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIF90aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcnVwJywgZXYpO1xuICAgICAgICAgICAgaWYgKCFfdGhpcy5zaG91bGRJZ25vcmVNb3ZlKSB7XG4gICAgICAgICAgICAgICAgLy8gZmlyZSBkcmFnZW5kIHJpZ2h0IGF3YXkuIGRvZXMgbm90IHN1cHBvcnQgYSByZXZlcnQgYW5pbWF0aW9uXG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdHRlci50cmlnZ2VyKCdkcmFnZW5kJywgZXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2YXIgcG9pbnRlciA9IF90aGlzLnBvaW50ZXIgPSBuZXcgUG9pbnRlckRyYWdnaW5nKGNvbnRhaW5lckVsKTtcbiAgICAgICAgcG9pbnRlci5lbWl0dGVyLm9uKCdwb2ludGVyZG93bicsIF90aGlzLmhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgICAgcG9pbnRlci5lbWl0dGVyLm9uKCdwb2ludGVybW92ZScsIF90aGlzLmhhbmRsZVBvaW50ZXJNb3ZlKTtcbiAgICAgICAgcG9pbnRlci5lbWl0dGVyLm9uKCdwb2ludGVydXAnLCBfdGhpcy5oYW5kbGVQb2ludGVyVXApO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEluZmVycmVkRWxlbWVudERyYWdnaW5nLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBvaW50ZXIuZGVzdHJveSgpO1xuICAgIH07XG4gICAgSW5mZXJyZWRFbGVtZW50RHJhZ2dpbmcucHJvdG90eXBlLnNldElnbm9yZU1vdmUgPSBmdW5jdGlvbiAoYm9vbCkge1xuICAgICAgICB0aGlzLnNob3VsZElnbm9yZU1vdmUgPSBib29sO1xuICAgIH07XG4gICAgSW5mZXJyZWRFbGVtZW50RHJhZ2dpbmcucHJvdG90eXBlLnNldE1pcnJvcklzVmlzaWJsZSA9IGZ1bmN0aW9uIChib29sKSB7XG4gICAgICAgIGlmIChib29sKSB7XG4gICAgICAgICAgICAvLyByZXN0b3JlIGEgcHJldmlvdXNseSBoaWRkZW4gZWxlbWVudC5cbiAgICAgICAgICAgIC8vIHVzZSB0aGUgcmVmZXJlbmNlIGluIGNhc2UgdGhlIHNlbGVjdG9yIGNsYXNzIGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZC5cbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRNaXJyb3JFbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE1pcnJvckVsLnN0eWxlLnZpc2liaWxpdHkgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRNaXJyb3JFbCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgbWlycm9yRWwgPSB0aGlzLm1pcnJvclNlbGVjdG9yXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogc29tZWhvdyBxdWVyeSBGdWxsQ2FsZW5kYXJzIFdJVEhJTiBzaGFkb3ctcm9vdHNcbiAgICAgICAgICAgICAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5taXJyb3JTZWxlY3RvcilcbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICBpZiAobWlycm9yRWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRNaXJyb3JFbCA9IG1pcnJvckVsO1xuICAgICAgICAgICAgICAgIG1pcnJvckVsLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEluZmVycmVkRWxlbWVudERyYWdnaW5nO1xufShjb21tb24uRWxlbWVudERyYWdnaW5nKSk7XG5cbi8qXG5CcmlkZ2VzIHRoaXJkLXBhcnR5IGRyYWctbi1kcm9wIHN5c3RlbXMgd2l0aCBGdWxsQ2FsZW5kYXIuXG5NdXN0IGJlIGluc3RhbnRpYXRlZCBhbmQgZGVzdHJveWVkIGJ5IGNhbGxlci5cbiovXG52YXIgVGhpcmRQYXJ0eURyYWdnYWJsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUaGlyZFBhcnR5RHJhZ2dhYmxlKGNvbnRhaW5lck9yU2V0dGluZ3MsIHNldHRpbmdzKSB7XG4gICAgICAgIHZhciBjb250YWluZXJFbCA9IGRvY3VtZW50O1xuICAgICAgICBpZiAoXG4gICAgICAgIC8vIHdpc2ggd2UgY291bGQganVzdCB0ZXN0IGluc3RhbmNlb2YgRXZlbnRUYXJnZXQsIGJ1dCBkb2Vzbid0IHdvcmsgaW4gSUUxMVxuICAgICAgICBjb250YWluZXJPclNldHRpbmdzID09PSBkb2N1bWVudCB8fFxuICAgICAgICAgICAgY29udGFpbmVyT3JTZXR0aW5ncyBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lckVsID0gY29udGFpbmVyT3JTZXR0aW5ncztcbiAgICAgICAgICAgIHNldHRpbmdzID0gc2V0dGluZ3MgfHwge307XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXR0aW5ncyA9IChjb250YWluZXJPclNldHRpbmdzIHx8IHt9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZHJhZ2dpbmcgPSB0aGlzLmRyYWdnaW5nID0gbmV3IEluZmVycmVkRWxlbWVudERyYWdnaW5nKGNvbnRhaW5lckVsKTtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXR0aW5ncy5pdGVtU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBkcmFnZ2luZy5wb2ludGVyLnNlbGVjdG9yID0gc2V0dGluZ3MuaXRlbVNlbGVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbnRhaW5lckVsID09PSBkb2N1bWVudCkge1xuICAgICAgICAgICAgZHJhZ2dpbmcucG9pbnRlci5zZWxlY3RvciA9ICdbZGF0YS1ldmVudF0nO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MubWlycm9yU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBkcmFnZ2luZy5taXJyb3JTZWxlY3RvciA9IHNldHRpbmdzLm1pcnJvclNlbGVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIG5ldyBFeHRlcm5hbEVsZW1lbnREcmFnZ2luZyhkcmFnZ2luZywgc2V0dGluZ3MuZXZlbnREYXRhKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICB9XG4gICAgVGhpcmRQYXJ0eURyYWdnYWJsZS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kcmFnZ2luZy5kZXN0cm95KCk7XG4gICAgfTtcbiAgICByZXR1cm4gVGhpcmRQYXJ0eURyYWdnYWJsZTtcbn0oKSk7XG5cbnZhciBtYWluID0gY29tbW9uLmNyZWF0ZVBsdWdpbih7XG4gICAgY29tcG9uZW50SW50ZXJhY3Rpb25zOiBbRGF0ZUNsaWNraW5nLCBEYXRlU2VsZWN0aW5nLCBFdmVudERyYWdnaW5nLCBFdmVudFJlc2l6aW5nXSxcbiAgICBjYWxlbmRhckludGVyYWN0aW9uczogW1Vuc2VsZWN0QXV0b10sXG4gICAgZWxlbWVudERyYWdnaW5nSW1wbDogRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZyxcbiAgICBvcHRpb25SZWZpbmVyczogT1BUSU9OX1JFRklORVJTLFxuICAgIGxpc3RlbmVyUmVmaW5lcnM6IExJU1RFTkVSX1JFRklORVJTLFxufSk7XG5cbmV4cG9ydHMuRHJhZ2dhYmxlID0gRXh0ZXJuYWxEcmFnZ2FibGU7XG5leHBvcnRzLkZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcgPSBGZWF0dXJlZnVsRWxlbWVudERyYWdnaW5nO1xuZXhwb3J0cy5Qb2ludGVyRHJhZ2dpbmcgPSBQb2ludGVyRHJhZ2dpbmc7XG5leHBvcnRzLlRoaXJkUGFydHlEcmFnZ2FibGUgPSBUaGlyZFBhcnR5RHJhZ2dhYmxlO1xuZXhwb3J0cy5kZWZhdWx0ID0gbWFpbjtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBRUFBLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkMsT0FBdEIsRUFBK0IsWUFBL0IsRUFBNkM7RUFBRUMsS0FBSyxFQUFFO0FBQVQsQ0FBN0M7O0FBRUEsSUFBSUMsTUFBTSxHQUFHQyxPQUFPLENBQUMsc0JBQUQsQ0FBcEI7O0FBQ0EsSUFBSUMsS0FBSyxHQUFHRCxPQUFPLENBQUMsT0FBRCxDQUFuQjs7QUFFQUQsTUFBTSxDQUFDRyxNQUFQLENBQWNDLG9CQUFkLEdBQXFDLEdBQXJDO0FBQ0EsSUFBSUMsZ0JBQWdCLEdBQUcsQ0FBdkI7QUFDQSxJQUFJQyxXQUFXLEdBQUcsQ0FBbEI7QUFDQSxJQUFJQywwQkFB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 },{"@fullcalendar/common":1,"tslib":32}],7:[function(require,module,exports){ /*! FullCalendar v5.11.2 Docs & License: https://fullcalendar.io/ (c) 2022 Adam Shaw */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var common = require('@fullcalendar/common'); var tslib = require('tslib'); ; var ListViewHeaderRow = /** @class */ function (_super) { tslib.__extends(ListViewHeaderRow, _super); function ListViewHeaderRow() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.state = { textId: common.getUniqueDomId() }; return _this; } ListViewHeaderRow.prototype.render = function () { var _a = this.context, theme = _a.theme, dateEnv = _a.dateEnv, options = _a.options, viewApi = _a.viewApi; var _b = this.props, cellId = _b.cellId, dayDate = _b.dayDate, todayRange = _b.todayRange; var textId = this.state.textId; var dayMeta = common.getDateMeta(dayDate, todayRange); // will ever be falsy? var text = options.listDayFormat ? dateEnv.format(dayDate, options.listDayFormat) : ''; // will ever be falsy? also, BAD NAME "alt" var sideText = options.listDaySideFormat ? dateEnv.format(dayDate, options.listDaySideFormat) : ''; var hookProps = tslib.__assign({ date: dateEnv.toDate(dayDate), view: viewApi, textId: textId, text: text, sideText: sideText, navLinkAttrs: common.buildNavLinkAttrs(this.context, dayDate), sideNavLinkAttrs: common.buildNavLinkAttrs(this.context, dayDate, 'day', false) }, dayMeta); var classNames = ['fc-list-day'].concat(common.getDayClassNames(dayMeta, theme)); // TODO: make a reusable HOC for dayHeader (used in daygrid/timegrid too) return common.createElement(common.RenderHook, { hookProps: hookProps, classNames: options.dayHeaderClassNames, content: options.dayHeaderContent, defaultContent: renderInnerContent, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return common.createElement("tr", { ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-date": common.formatDayString(dayDate) }, common.createElement("th", { scope: "colgroup", colSpan: 3, id: cellId, "aria-labelledby": textId }, common.createElement("div", { className: 'fc-list-day-cushion ' + theme.getClass('tableCellShaded'), ref: innerElRef }, innerContent))); }); }; return ListViewHeaderRow; }(common.BaseComponent); function renderInnerContent(props) { return common.createElement(common.Fragment, null, props.text && common.createElement("a", tslib.__assign({ id: props.textId, className: "fc-list-day-text" }, props.navLinkAttrs), props.text), props.sideText && /* not keyboard tabbable */ common.createElement("a", tslib.__assign({ "aria-hidden": true, className: "fc-list-day-side-text" }, props.sideNavLinkAttrs), props.sideText)); } var DEFAULT_TIME_FORMAT = common.createFormatter({ hour: 'numeric', minute: '2-digit', meridiem: 'short' }); var ListViewEventRow = /** @class */ function (_super) { tslib.__extends(ListViewEventRow, _super); function ListViewEventRow() { return _super !== null && _super.apply(this, arguments) || this; } ListViewEventRow.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; var seg = props.seg, timeHeaderId = props.timeHeaderId, eventHeaderId = props.eventHeaderId, dateHeaderId = props.dateHeaderId; var timeFormat = context.options.eventTimeFormat || DEFAULT_TIME_FORMAT; return common.createElement(common.EventRoot, { seg: seg, timeText: "" // BAD. because of all-day content , disableDragging: true, disableResizing: true, defaultContent: function defaultContent() { return renderEventInnerContent(seg, context); } /* weird */ , isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday, isSelected: props.isSelected, isDragging: props.isDragging, isResizing: props.isResizing, isDateSelecting: props.isDateSelecting }, function (rootElRef, classNames, innerElRef, innerContent, hookProps) { return common.createElement("tr", { className: ['fc-list-event', hookProps.event.url ? 'fc-event-forced-url' : ''].concat(classNames).join(' '), ref: rootElRef }, buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId), common.createElement("td", { "aria-hidden": true, className: "fc-list-event-graphic" }, common.createElement("span", { className: "fc-list-event-dot", style: { borderColor: hookProps.borderColor || hookProps.backgroundColor } })), common.createElement("td", { ref: innerElRef, headers: eventHeaderId + " " + dateHeaderId, className: "fc-list-event-title" }, innerContent)); }); }; return ListViewEventRow; }(common.BaseComponent); function renderEventInnerContent(seg, context) { var interactiveAttrs = common.getSegAnchorAttrs(seg, context); return common.createElement("a", tslib.__assign({}, interactiveAttrs), seg.eventRange.def.title); } function buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId) { var options = context.options; if (options.displayEventTime !== false) { var eventDef = seg.eventRange.def; var eventInstance = seg.eventRange.instance; var doAllDay = false; var timeText = void 0; if (eventDef.allDay) { doAllDay = true; } else if (common.isMultiDayRange(seg.eventRange.range)) { // TODO: use (!isStart || !isEnd) instead? if (seg.isStart) { timeText = common.buildSegTimeText(seg, timeFormat, context, null, null, eventInstance.range.start, seg.end); } else if (seg.isEnd) { timeText = common.buildSegTimeText(seg, timeFormat, context, null, null, seg.start, eventInstance.range.end); } else { doAllDay = true; } } else { timeText = common.buildSegTimeText(seg, timeFormat, context); } if (doAllDay) { var hookProps = { text: context.options.allDayText, view: context.viewApi }; return common.createElement(common.RenderHook, { hookProps: hookProps, classNames: options.allDayClassNames, content: options.allDayContent, defaultContent: renderAllDayInner, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return common.createElement("td", { ref: rootElRef, headers: timeHeaderId + " " + dateHeaderId, className: ['fc-list-event-time'].concat(classNames).join(' ') }, innerContent); }); } return common.createElement("td", { className: "fc-list-event-time" }, timeText); } return null; } function renderAllDayInner(hookProps) { return hookProps.text; } /* Responsible for the scroller, and forwarding event-related actions into the "grid". */ var ListView = /** @class */ function (_super) { tslib.__extends(ListView, _super); function ListView() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.computeDateVars = common.memoize(computeDateVars); _this.eventStoreToSegs = common.memoize(_this._eventStoreToSegs); _this.state = { timeHeaderId: common.getUniqueDomId(), eventHeaderId: common.getUniqueDomId(), dateHeaderIdRoot: common.getUniqueDomId() }; _this.setRootEl = function (rootEl) { if (rootEl) { _this.context.registerInteractiveComponent(_this, { el: rootEl }); } else { _this.context.unregisterInteractiveComponent(_this); } }; return _this; } ListView.prototype.render = function () { var _this = this; var _a = this, props = _a.props, context = _a.context; var extraClassNames = ['fc-list', context.theme.getClass('table'), context.options.stickyHeaderDates !== false ? 'fc-list-sticky' : '']; var _b = this.computeDateVars(props.dateProfile), dayDates = _b.dayDates, dayRanges = _b.dayRanges; var eventSegs = this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges); return common.createElement(common.ViewRoot, { viewSpec: context.viewSpec, elRef: this.setRootEl }, function (rootElRef, classNames) { return common.createElement("div", { ref: rootElRef, className: extraClassNames.concat(classNames).join(' ') }, common.createElement(common.Scroller, { liquid: !props.isHeightAuto, overflowX: props.isHeightAuto ? 'visible' : 'hidden', overflowY: props.isHeightAuto ? 'visible' : 'auto' }, eventSegs.length > 0 ? _this.renderSegList(eventSegs, dayDates) : _this.renderEmptyMessage())); }); }; ListView.prototype.renderEmptyMessage = function () { var _a = this.context, options = _a.options, viewApi = _a.viewApi; var hookProps = { text: options.noEventsText, view: viewApi }; return common.createElement(common.RenderHook, { hookProps: hookProps, classNames: options.noEventsClassNames, content: options.noEventsContent, defaultContent: renderNoEventsInner, didMount: options.noEventsDidMount, willUnmount: options.noEventsWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return common.createElement("div", { className: ['fc-list-empty'].concat(classNames).join(' '), ref: rootElRef }, common.createElement("div", { className: "fc-list-empty-cushion", ref: innerElRef }, innerContent)); }); }; ListView.prototype.renderSegList = function (allSegs, dayDates) { var _a = this.context, theme = _a.theme, options = _a.options; var _b = this.state, timeHeaderId = _b.timeHeaderId, eventHeaderId = _b.eventHeaderId, dateHeaderIdRoot = _b.dateHeaderIdRoot; var segsByDay = groupSegsByDay(allSegs); // sparse array return common.createElement(common.NowTimer, { unit: "day" }, function (nowDate, todayRange) { var innerNodes = []; for (var dayIndex = 0; dayIndex < segsByDay.length; dayIndex += 1) { var daySegs = segsByDay[dayIndex]; if (daySegs) { // sparse array, so might be undefined var dayStr = common.formatDayString(dayDates[dayIndex]); var dateHeaderId = dateHeaderIdRoot + '-' + dayStr; // append a day header innerNodes.push(common.createElement(ListViewHeaderRow, { key: dayStr, cellId: dateHeaderId, dayDate: dayDates[dayIndex], todayRange: todayRange })); daySegs = common.sortEventSegs(daySegs, options.eventOrder); for (var _i = 0, daySegs_1 = daySegs; _i < daySegs_1.length; _i++) { var seg = daySegs_1[_i]; innerNodes.push(common.createElement(ListViewEventRow, tslib.__assign({ key: dayStr + ':' + seg.eventRange.instance.instanceId /* are multiple segs for an instanceId */ , seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, timeHeaderId: timeHeaderId, eventHeaderId: eventHeaderId, dateHeaderId: dateHeaderId }, common.getSegMeta(seg, todayRange, nowDate)))); } } } return common.createElement("table", { className: 'fc-list-table ' + theme.getClass('table') }, common.createElement("thead", null, common.createElement("tr", null, common.createElement("th", { scope: "col", id: timeHeaderId }, options.timeHint), common.createElement("th", { scope: "col", "aria-hidden": true }), common.createElement("th", { scope: "col", id: eventHeaderId }, options.eventHint))), common.createElement("tbody", null, innerNodes)); }); }; ListView.prototype._eventStoreToSegs = function (eventStore, eventUiBases, dayRanges) { return this.eventRangesToSegs(common.sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.context.options.nextDayThreshold).fg, dayRanges); }; ListView.prototype.eventRangesToSegs = function (eventRanges, dayRanges) { var segs = []; for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) { var eventRange = eventRanges_1[_i]; segs.push.apply(segs, this.eventRangeToSegs(eventRange, dayRanges)); } return segs; }; ListView.prototype.eventRangeToSegs = function (eventRange, dayRanges) { var dateEnv = this.context.dateEnv; var nextDayThreshold = this.context.options.nextDayThreshold; var range = eventRange.range; var allDay = eventRange.def.allDay; var dayIndex; var segRange; var seg; var segs = []; for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex += 1) { segRange = common.intersectRanges(range, dayRanges[dayIndex]); if (segRange) { seg = { component: this, eventRange: eventRange, start: segRange.start, end: segRange.end, isStart: eventRange.isStart && segRange.start.valueOf() === range.start.valueOf(), isEnd: eventRange.isEnd && segRange.end.valueOf() === range.end.valueOf(), dayIndex: dayIndex }; segs.push(seg); // detect when range won't go fully into the next day, // and mutate the latest seg to the be the end. if (!seg.isEnd && !allDay && dayIndex + 1 < dayRanges.length && range.end < dateEnv.add(dayRanges[dayIndex + 1].start, nextDayThreshold)) { seg.end = range.end; seg.isEnd = true; break; } } } return segs; }; return ListView; }(common.DateComponent); function renderNoEventsInner(hookProps) { return hookProps.text; } function computeDateVars(dateProfile) { var dayStart = common.startOfDay(dateProfile.renderRange.start); var viewEnd = dateProfile.renderRange.end; var dayDates = []; var dayRanges = []; while (dayStart < viewEnd) { dayDates.push(dayStart); dayRanges.push({ start: dayStart, end: common.addDays(dayStart, 1) }); dayStart = common.addDays(dayStart, 1); } return { dayDates: dayDates, dayRanges: dayRanges }; } // Returns a sparse array of arrays, segs grouped by their dayIndex function groupSegsByDay(segs) { var segsByDay = []; // sparse array var i; var seg; for (i = 0; i < segs.length; i += 1) { seg = segs[i]; (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = [])).push(seg); } return segsByDay; } var OPTION_REFINERS = { listDayFormat: createFalsableFormatter, listDaySideFormat: createFalsableFormatter, noEventsClassNames: common.identity, noEventsContent: common.identity, noEventsDidMount: common.identity, noEventsWillUnmount: common.identity // noEventsText is defined in base options }; function createFalsableFormatter(input) { return input === false ? null : common.createFormatter(input); } var main = common.createPlugin({ optionRefiners: OPTION_REFINERS, views: { list: { component: ListView, buttonTextKey: 'list', listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' } // like "January 1, 2016" }, listDay: { type: 'list', duration: { days: 1 }, listDayFormat: { weekday: 'long' } // day-of-week is all we need. full date is probably in headerToolbar }, listWeek: { type: 'list', duration: { weeks: 1 }, listDayFormat: { weekday: 'long' }, listDaySideFormat: { month: 'long', day: 'numeric', year: 'numeric' } }, listMonth: { type: 'list', duration: { month: 1 }, listDaySideFormat: { weekday: 'long' } // day-of-week is nice-to-have }, listYear: { type: 'list', duration: { year: 1 }, listDaySideFormat: { weekday: 'long' } // day-of-week is nice-to-have } } }); exports.ListView = ListView; exports["default"] = main; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImNvbW1vbiIsInJlcXVpcmUiLCJ0c2xpYiIsIkxpc3RWaWV3SGVhZGVyUm93IiwiX3N1cGVyIiwiX19leHRlbmRzIiwiX3RoaXMiLCJhcHBseSIsImFyZ3VtZW50cyIsInN0YXRlIiwidGV4dElkIiwiZ2V0VW5pcXVlRG9tSWQiLCJwcm90b3R5cGUiLCJyZW5kZXIiLCJfYSIsImNvbnRleHQiLCJ0aGVtZSIsImRhdGVFbnYiLCJvcHRpb25zIiwidmlld0FwaSIsIl9iIiwicHJvcHMiLCJjZWxsSWQiLCJkYXlEYXRlIiwidG9kYXlSYW5nZSIsImRheU1ldGEiLCJnZXREYXRlTWV0YSIsInRleHQiLCJsaXN0RGF5Rm9ybWF0IiwiZm9ybWF0Iiwic2lkZVRleHQiLCJsaXN0RGF5U2lkZUZvcm1hdCIsImhvb2tQcm9wcyIsIl9fYXNzaWduIiwiZGF0ZSIsInRvRGF0ZSIsInZpZXciLCJuYXZMaW5rQXR0cnMiLCJidWlsZE5hdkxpbmtBdHRycyIsInNpZGVOYXZMaW5rQXR0cnMiLCJjbGFzc05hbWVzIiwiY29uY2F0IiwiZ2V0RGF5Q2xhc3NOYW1lcyIsImNyZWF0ZUVsZW1lbnQiLCJSZW5kZXJIb29rIiwiZGF5SGVhZGVyQ2xhc3NOYW1lcyIsImNvbnRlbnQiLCJkYXlIZWFkZXJDb250ZW50IiwiZGVmYXVsdENvbnRlbnQiLCJyZW5kZXJJbm5lckNvbnRlbnQiLCJkaWRNb3VudCIsImRheUhlYWRlckRpZE1vdW50Iiwid2lsbFVubW91bnQiLCJkYXlIZWFkZXJXaWxsVW5tb3VudCIsInJvb3RFbFJlZiIsImN1c3RvbUNsYXNzTmFtZXMiLCJpbm5lckVsUmVmIiwiaW5uZXJDb250ZW50IiwicmVmIiwiY2xhc3NOYW1lIiwiam9pbiIsImZvcm1hdERheVN0cmluZyIsInNjb3BlIiwiY29sU3BhbiIsImlkIiwiZ2V0Q2xhc3MiLCJCYXNlQ29tcG9uZW50IiwiRnJhZ21lbnQiLCJERUZBVUxUX1RJTUVfRk9STUFUIiwiY3JlYXRlRm9ybWF0dGVyIiwiaG91ciIsIm1pbnV0ZSIsIm1lcmlkaWVtIiwiTGlzdFZpZXdFdmVudFJvdyIsInNlZyIsInRpbWVIZWFkZXJJZCIsImV2ZW50SGVhZGVySWQiLCJkYXRlSGVhZGVySWQiLCJ0aW1lRm9ybWF0IiwiZXZlbnRUaW1lRm9ybWF0IiwiRXZlbnRSb290IiwidGltZVRleHQiLCJkaXNhYmxlRHJhZ2dpbmciLCJkaXNhYmxlUmVzaXppbmciLCJyZW5kZXJFdmVudElubmVyQ29udGVudCIsImlzUGFzdCIsImlzRnV0dXJlIiwiaXNUb2RheSIsImlzU2VsZWN0ZWQiLCJpc0RyYWdnaW5nIiwiaXNSZXNpemluZyIsImlzRGF0ZVNlbGVjdGluZyIsImV2ZW50IiwidXJsIiwiYnVpbGRUaW1lQ29udGVudCIsInN0eWxlIiwiYm9yZGVyQ29sb3IiLCJiYWNrZ3JvdW5kQ29sb3IiLCJoZWFkZXJzIiwiaW50ZXJhY3RpdmVBdHRycyIsImdldFNlZ0FuY2hvckF0dHJzIiwiZXZlbnRSYW5nZSIsImRlZiIsInRpdGxlIiwiZGlzcGxheUV2ZW50VGltZSIsImV2ZW50RGVmIiwiZXZlbnRJbnN0YW5jZSIsImluc3RhbmNlIiwiZG9BbGxEYXkiLCJhbGxEYXkiLCJpc011bHRpRGF5UmFuZ2UiLCJyYW5nZSIsImlzU3RhcnQiLCJidWlsZFNlZ1RpbWVUZXh0Iiwic3RhcnQiLCJlbmQiLCJpc0VuZCIsImFsbERheVRleHQiLCJhbGxEYXlDbGFzc05hbWVzIiwiYWxsRGF5Q29udGVudCIsInJlbmRlckFsbERheUlubmVyIiwiYWxsRGF5RGlkTW91bnQiLCJhbGxEYXlXaWxsVW5tb3VudCIsIkxpc3RWaWV3IiwiY29tcHV0ZURhdGVWYXJzIiwibWVtb2l6ZSIsImV2ZW50U3RvcmVUb1NlZ3MiLCJfZXZlbnRTdG9yZVRvU2VncyIsImRhdGVIZWFkZXJJZFJvb3QiLCJzZXRSb290RWwiLCJyb290RWwiLCJyZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50IiwiZWwiLCJ1bnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQiLCJleHRyYUNsYXNzTmFtZXMiLCJzdGlja3lIZWFkZXJEYXRlcyIsImRhdGVQcm9maWxlIiwiZGF5RGF0ZXMiLCJkYXlSYW5nZXMiLCJldmVudFNlZ3MiLCJldmVudFN0b3JlIiwiZXZlbnRVaUJhc2VzIiwiVmlld1Jvb3QiLCJ2aWV3U3BlYyIsImVsUmVmIiwiU2Nyb2xsZXIiLCJsaXF1aWQiLCJpc0hlaWdodEF1dG8iLCJvdmVyZmxvd1giLCJvdmVyZmxvd1kiLCJsZW5ndGgiLCJyZW5kZXJTZWdMaXN0IiwicmVuZGVyRW1wdHlNZXNzYWdlIiwibm9FdmVudHNUZXh0Iiwibm9FdmVudHNDbGFzc05hbWVzIiwibm9FdmVudHNDb250ZW50IiwicmVuZGVyTm9FdmVudHNJbm5lciIsIm5vRXZlbnRzRGlkTW91bnQiLCJub0V2ZW50c1dpbGxVbm1vdW50IiwiYWxsU2VncyIsInNlZ3NCeURheSIsImdyb3VwU2Vnc0J5RGF5IiwiTm93VGltZXIiLCJ1bml0Iiwibm93RGF0ZSIsImlubmVyTm9kZXMiLCJkYXlJbmRleCIsImRheVNlZ3MiLCJkYXlTdHIiLCJwdXNoIiwia2V5Iiwic29ydEV2ZW50U2VncyIsImV2ZW50T3JkZXIiLCJfaSIsImRheVNlZ3NfMSIsImluc3RhbmNlSWQiLCJnZXRTZWdNZXRhIiwidGltZUhpbnQiLCJldmVudEhpbnQiLCJldmVudFJhbmdlc1RvU2VncyIsInNsaWNlRXZlbnRTdG9yZSIsImFjdGl2ZVJhbmdlIiwibmV4dERheVRocmVzaG9sZCIsImZnIiwiZXZlbnRSYW5nZXMiLCJzZWdzIiwiZXZlbnRSYW5nZXNfMSIsImV2ZW50UmFuZ2VUb1NlZ3MiLCJzZWdSYW5nZSIsImludGVyc2VjdFJhbmdlcyIsImNvbXBvbmVudCIsInZhbHVlT2YiLCJhZGQiLCJEYXRlQ29tcG9uZW50IiwiZGF5U3RhcnQiLCJzdGFydE9mRGF5IiwicmVuZGVyUmFuZ2UiLCJ2aWV3RW5kIiwiYWRkRGF5cyIsImkiLCJPUFRJT05fUkVGSU5FUlMiLCJjcmVhdGVGYWxzYWJsZUZvcm1hdHRlciIsImlkZW50aXR5IiwiaW5wdXQiLCJtYWluIiwiY3JlYXRlUGx1Z2luIiwib3B0aW9uUmVmaW5lcnMiLCJ2aWV3cyIsImxpc3QiLCJidXR0b25UZXh0S2V5IiwibW9udGgiLCJkYXkiLCJ5ZWFyIiwibGlzdERheSIsInR5cGUiLCJkdXJhdGlvbiIsImRheXMiLCJ3ZWVrZGF5IiwibGlzdFdlZWsiLCJ3ZWVrcyIsImxpc3RNb250aCIsImxpc3RZZWFyIl0sInNvdXJjZXMiOlsibWFpbi5janMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG5GdWxsQ2FsZW5kYXIgdjUuMTEuMlxuRG9jcyAmIExpY2Vuc2U6IGh0dHBzOi8vZnVsbGNhbGVuZGFyLmlvL1xuKGMpIDIwMjIgQWRhbSBTaGF3XG4qL1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgY29tbW9uID0gcmVxdWlyZSgnQGZ1bGxjYWxlbmRhci9jb21tb24nKTtcbnZhciB0c2xpYiA9IHJlcXVpcmUoJ3RzbGliJyk7XG47XG5cbnZhciBMaXN0Vmlld0hlYWRlclJvdyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoTGlzdFZpZXdIZWFkZXJSb3csIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTGlzdFZpZXdIZWFkZXJSb3coKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHRleHRJZDogY29tbW9uLmdldFVuaXF1ZURvbUlkKCksXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgTGlzdFZpZXdIZWFkZXJSb3cucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5jb250ZXh0LCB0aGVtZSA9IF9hLnRoZW1lLCBkYXRlRW52ID0gX2EuZGF0ZUVudiwgb3B0aW9ucyA9IF9hLm9wdGlvbnMsIHZpZXdBcGkgPSBfYS52aWV3QXBpO1xuICAgICAgICB2YXIgX2IgPSB0aGlzLnByb3BzLCBjZWxsSWQgPSBfYi5jZWxsSWQsIGRheURhdGUgPSBfYi5kYXlEYXRlLCB0b2RheVJhbmdlID0gX2IudG9kYXlSYW5nZTtcbiAgICAgICAgdmFyIHRleHRJZCA9IHRoaXMuc3RhdGUudGV4dElkO1xuICAgICAgICB2YXIgZGF5TWV0YSA9IGNvbW1vbi5nZXREYXRlTWV0YShkYXlEYXRlLCB0b2RheVJhbmdlKTtcbiAgICAgICAgLy8gd2lsbCBldmVyIGJlIGZhbHN5P1xuICAgICAgICB2YXIgdGV4dCA9IG9wdGlvbnMubGlzdERheUZvcm1hdCA/IGRhdGVFbnYuZm9ybWF0KGRheURhdGUsIG9wdGlvbnMubGlzdERheUZvcm1hdCkgOiAnJztcbiAgICAgICAgLy8gd2lsbCBldmVyIGJlIGZhbHN5PyBhbHNvLCBCQUQgTkFNRSBcImFsdFwiXG4gICAgICAgIHZhciBzaWRlVGV4dCA9IG9wdGlvbnMubGlzdERheVNpZGVGb3JtYXQgPyBkYXRlRW52LmZvcm1hdChkYXlEYXRlLCBvcHRpb25zLmxpc3REYXlTaWRlRm9ybWF0KSA6ICcnO1xuICAgICAgICB2YXIgaG9va1Byb3BzID0gdHNsaWIuX19hc3NpZ24oeyBkYXRlOiBkYXRlRW52LnRvRGF0ZShkYXlEYXRlKSwgdmlldzogdmlld0FwaSwgdGV4dElkOiB0ZXh0SWQsXG4gICAgICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICAgICAgc2lkZVRleHQ6IHNpZGVUZXh0LCBuYXZMaW5rQXR0cnM6IGNvbW1vbi5idWlsZE5hdkxpbmtBdHRycyh0aGlzLmNvbnRleHQsIGRheURhdGUpLCBzaWRlTmF2TGlua0F0dHJzOiBjb21tb24uYnVpbGROYXZMaW5rQXR0cnModGhpcy5jb250ZXh0LCBkYXlEYXRlLCAnZGF5JywgZmFsc2UpIH0sIGRheU1ldGEpO1xuICAgICAgICB2YXIgY2xhc3NOYW1lcyA9IFsnZmMtbGlzdC1kYXknXS5jb25jYXQoY29tbW9uLmdldERheUNsYXNzTmFtZXMoZGF5TWV0YSwgdGhlbWUpKTtcbiAgICAgICAgLy8gVE9ETzogbWFrZSBhIHJldXNhYmxlIEhPQyBmb3IgZGF5SGVhZGVyICh1c2VkIGluIGRheWdyaWQvdGltZWdyaWQgdG9vKVxuICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5SZW5kZXJIb29rLCB7IGhvb2tQcm9wczogaG9va1Byb3BzLCBjbGFzc05hbWVzOiBvcHRpb25zLmRheUhlYWRlckNsYXNzTmFtZXMsIGNvbnRlbnQ6IG9wdGlvbnMuZGF5SGVhZGVyQ29udGVudCwgZGVmYXVsdENvbnRlbnQ6IHJlbmRlcklubmVyQ29udGVudCwgZGlkTW91bnQ6IG9wdGlvbnMuZGF5SGVhZGVyRGlkTW91bnQsIHdpbGxVbm1vdW50OiBvcHRpb25zLmRheUhlYWRlcldpbGxVbm1vdW50IH0sIGZ1bmN0aW9uIChyb290RWxSZWYsIGN1c3RvbUNsYXNzTmFtZXMsIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCkgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidHJcIiwgeyByZWY6IHJvb3RFbFJlZiwgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmNvbmNhdChjdXN0b21DbGFzc05hbWVzKS5qb2luKCcgJyksIFwiZGF0YS1kYXRlXCI6IGNvbW1vbi5mb3JtYXREYXlTdHJpbmcoZGF5RGF0ZSkgfSxcbiAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGhcIiwgeyBzY29wZTogXCJjb2xncm91cFwiLCBjb2xTcGFuOiAzLCBpZDogY2VsbElkLCBcImFyaWEtbGFiZWxsZWRieVwiOiB0ZXh0SWQgfSxcbiAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogJ2ZjLWxpc3QtZGF5LWN1c2hpb24gJyArIHRoZW1lLmdldENsYXNzKCd0YWJsZUNlbGxTaGFkZWQnKSwgcmVmOiBpbm5lckVsUmVmIH0sIGlubmVyQ29udGVudCkpKSk7IH0pKTtcbiAgICB9O1xuICAgIHJldHVybiBMaXN0Vmlld0hlYWRlclJvdztcbn0oY29tbW9uLkJhc2VDb21wb25lbnQpKTtcbmZ1bmN0aW9uIHJlbmRlcklubmVyQ29udGVudChwcm9wcykge1xuICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkZyYWdtZW50LCBudWxsLFxuICAgICAgICBwcm9wcy50ZXh0ICYmIChjb21tb24uY3JlYXRlRWxlbWVudChcImFcIiwgdHNsaWIuX19hc3NpZ24oeyBpZDogcHJvcHMudGV4dElkLCBjbGFzc05hbWU6IFwiZmMtbGlzdC1kYXktdGV4dFwiIH0sIHByb3BzLm5hdkxpbmtBdHRycyksIHByb3BzLnRleHQpKSxcbiAgICAgICAgcHJvcHMuc2lkZVRleHQgJiYgKCAvKiBub3Qga2V5Ym9hcmQgdGFiYmFibGUgKi9jb21tb24uY3JlYXRlRWxlbWVudChcImFcIiwgdHNsaWIuX19hc3NpZ24oeyBcImFyaWEtaGlkZGVuXCI6IHRydWUsIGNsYXNzTmFtZTogXCJmYy1saXN0LWRheS1zaWRlLXRleHRcIiB9LCBwcm9wcy5zaWRlTmF2TGlua0F0dHJzKSwgcHJvcHMuc2lkZVRleHQpKSkpO1xufVxuXG52YXIgREVGQVVMVF9USU1FX0ZPUk1BVCA9IGNvbW1vbi5jcmVhdGVGb3JtYXR0ZXIoe1xuICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICBtZXJpZGllbTogJ3Nob3J0Jyxcbn0pO1xudmFyIExpc3RWaWV3RXZlbnRSb3cgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKExpc3RWaWV3RXZlbnRSb3csIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTGlzdFZpZXdFdmVudFJvdygpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBMaXN0Vmlld0V2ZW50Um93LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgc2VnID0gcHJvcHMuc2VnLCB0aW1lSGVhZGVySWQgPSBwcm9wcy50aW1lSGVhZGVySWQsIGV2ZW50SGVhZGVySWQgPSBwcm9wcy5ldmVudEhlYWRlcklkLCBkYXRlSGVhZGVySWQgPSBwcm9wcy5kYXRlSGVhZGVySWQ7XG4gICAgICAgIHZhciB0aW1lRm9ybWF0ID0gY29udGV4dC5vcHRpb25zLmV2ZW50VGltZUZvcm1hdCB8fCBERUZBVUxUX1RJTUVfRk9STUFUO1xuICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5FdmVudFJvb3QsIHsgc2VnOiBzZWcsIHRpbWVUZXh0OiBcIlwiIC8vIEJBRC4gYmVjYXVzZSBvZiBhbGwtZGF5IGNvbnRlbnRcbiAgICAgICAgICAgICwgZGlzYWJsZURyYWdnaW5nOiB0cnVlLCBkaXNhYmxlUmVzaXppbmc6IHRydWUsIGRlZmF1bHRDb250ZW50OiBmdW5jdGlvbiAoKSB7IHJldHVybiByZW5kZXJFdmVudElubmVyQ29udGVudChzZWcsIGNvbnRleHQpOyB9IC8qIHdlaXJkICovLCBpc1Bhc3Q6IHByb3BzLmlzUGFzdCwgaXNGdXR1cmU6IHByb3BzLmlzRnV0dXJlLCBpc1RvZGF5OiBwcm9wcy5pc1RvZGF5LCBpc1NlbGVjdGVkOiBwcm9wcy5pc1NlbGVjdGVkLCBpc0RyYWdnaW5nOiBwcm9wcy5pc0RyYWdnaW5nLCBpc1Jlc2l6aW5nOiBwcm9wcy5pc1Jlc2l6aW5nLCBpc0RhdGVTZWxlY3Rpbmc6IHByb3BzLmlzRGF0ZVNlbGVjdGluZyB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQsIGhvb2tQcm9wcykgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidHJcIiwgeyBjbGFzc05hbWU6IFsnZmMtbGlzdC1ldmVudCcsIGhvb2tQcm9wcy5ldmVudC51cmwgPyAnZmMtZXZlbnQtZm9yY2VkLXVybCcgOiAnJ10uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSwgcmVmOiByb290RWxSZWYgfSxcbiAgICAgICAgICAgIGJ1aWxkVGltZUNvbnRlbnQoc2VnLCB0aW1lRm9ybWF0LCBjb250ZXh0LCB0aW1lSGVhZGVySWQsIGRhdGVIZWFkZXJJZCksXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInRkXCIsIHsgXCJhcmlhLWhpZGRlblwiOiB0cnVlLCBjbGFzc05hbWU6IFwiZmMtbGlzdC1ldmVudC1ncmFwaGljXCIgfSxcbiAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6IFwiZmMtbGlzdC1ldmVudC1kb3RcIiwgc3R5bGU6IHsgYm9yZGVyQ29sb3I6IGhvb2tQcm9wcy5ib3JkZXJDb2xvciB8fCBob29rUHJvcHMuYmFja2dyb3VuZENvbG9yIH0gfSkpLFxuICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCB7IHJlZjogaW5uZXJFbFJlZiwgaGVhZGVyczogZXZlbnRIZWFkZXJJZCArIFwiIFwiICsgZGF0ZUhlYWRlcklkLCBjbGFzc05hbWU6IFwiZmMtbGlzdC1ldmVudC10aXRsZVwiIH0sIGlubmVyQ29udGVudCkpKTsgfSkpO1xuICAgIH07XG4gICAgcmV0dXJuIExpc3RWaWV3RXZlbnRSb3c7XG59KGNvbW1vbi5CYXNlQ29tcG9uZW50KSk7XG5mdW5jdGlvbiByZW5kZXJFdmVudElubmVyQ29udGVudChzZWcsIGNvbnRleHQpIHtcbiAgICB2YXIgaW50ZXJhY3RpdmVBdHRycyA9IGNvbW1vbi5nZXRTZWdBbmNob3JBdHRycyhzZWcsIGNvbnRleHQpO1xuICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHRzbGliLl9fYXNzaWduKHt9LCBpbnRlcmFjdGl2ZUF0dHJzKSwgc2VnLmV2ZW50UmFuZ2UuZGVmLnRpdGxlKSk7XG59XG5mdW5jdGlvbiBidWlsZFRpbWVDb250ZW50KHNlZywgdGltZUZvcm1hdCwgY29udGV4dCwgdGltZUhlYWRlcklkLCBkYXRlSGVhZGVySWQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGNvbnRleHQub3B0aW9ucztcbiAgICBpZiAob3B0aW9ucy5kaXNwbGF5RXZlbnRUaW1lICE9PSBmYWxzZSkge1xuICAgICAgICB2YXIgZXZlbnREZWYgPSBzZWcuZXZlbnRSYW5nZS5kZWY7XG4gICAgICAgIHZhciBldmVudEluc3RhbmNlID0gc2VnLmV2ZW50UmFuZ2UuaW5zdGFuY2U7XG4gICAgICAgIHZhciBkb0FsbERheSA9IGZhbHNlO1xuICAgICAgICB2YXIgdGltZVRleHQgPSB2b2lkIDA7XG4gICAgICAgIGlmIChldmVudERlZi5hbGxEYXkpIHtcbiAgICAgICAgICAgIGRvQWxsRGF5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb21tb24uaXNNdWx0aURheVJhbmdlKHNlZy5ldmVudFJhbmdlLnJhbmdlKSkgeyAvLyBUT0RPOiB1c2UgKCFpc1N0YXJ0IHx8ICFpc0VuZCkgaW5zdGVhZD9cbiAgICAgICAgICAgIGlmIChzZWcuaXNTdGFydCkge1xuICAgICAgICAgICAgICAgIHRpbWVUZXh0ID0gY29tbW9uLmJ1aWxkU2VnVGltZVRleHQoc2VnLCB0aW1lRm9ybWF0LCBjb250ZXh0LCBudWxsLCBudWxsLCBldmVudEluc3RhbmNlLnJhbmdlLnN0YXJ0LCBzZWcuZW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNlZy5pc0VuZCkge1xuICAgICAgICAgICAgICAgIHRpbWVUZXh0ID0gY29tbW9uLmJ1aWxkU2VnVGltZVRleHQoc2VnLCB0aW1lRm9ybWF0LCBjb250ZXh0LCBudWxsLCBudWxsLCBzZWcuc3RhcnQsIGV2ZW50SW5zdGFuY2UucmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvQWxsRGF5ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRpbWVUZXh0ID0gY29tbW9uLmJ1aWxkU2VnVGltZVRleHQoc2VnLCB0aW1lRm9ybWF0LCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9BbGxEYXkpIHtcbiAgICAgICAgICAgIHZhciBob29rUHJvcHMgPSB7XG4gICAgICAgICAgICAgICAgdGV4dDogY29udGV4dC5vcHRpb25zLmFsbERheVRleHQsXG4gICAgICAgICAgICAgICAgdmlldzogY29udGV4dC52aWV3QXBpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLlJlbmRlckhvb2ssIHsgaG9va1Byb3BzOiBob29rUHJvcHMsIGNsYXNzTmFtZXM6IG9wdGlvbnMuYWxsRGF5Q2xhc3NOYW1lcywgY29udGVudDogb3B0aW9ucy5hbGxEYXlDb250ZW50LCBkZWZhdWx0Q29udGVudDogcmVuZGVyQWxsRGF5SW5uZXIsIGRpZE1vdW50OiBvcHRpb25zLmFsbERheURpZE1vdW50LCB3aWxsVW5tb3VudDogb3B0aW9ucy5hbGxEYXlXaWxsVW5tb3VudCB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQpIHsgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcInRkXCIsIHsgcmVmOiByb290RWxSZWYsIGhlYWRlcnM6IHRpbWVIZWFkZXJJZCArIFwiIFwiICsgZGF0ZUhlYWRlcklkLCBjbGFzc05hbWU6IFsnZmMtbGlzdC1ldmVudC10aW1lJ10uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSB9LCBpbm5lckNvbnRlbnQpKTsgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCB7IGNsYXNzTmFtZTogXCJmYy1saXN0LWV2ZW50LXRpbWVcIiB9LCB0aW1lVGV4dCkpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHJlbmRlckFsbERheUlubmVyKGhvb2tQcm9wcykge1xuICAgIHJldHVybiBob29rUHJvcHMudGV4dDtcbn1cblxuLypcblJlc3BvbnNpYmxlIGZvciB0aGUgc2Nyb2xsZXIsIGFuZCBmb3J3YXJkaW5nIGV2ZW50LXJlbGF0ZWQgYWN0aW9ucyBpbnRvIHRoZSBcImdyaWRcIi5cbiovXG52YXIgTGlzdFZpZXcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKExpc3RWaWV3LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIExpc3RWaWV3KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY29tcHV0ZURhdGVWYXJzID0gY29tbW9uLm1lbW9pemUoY29tcHV0ZURhdGVWYXJzKTtcbiAgICAgICAgX3RoaXMuZXZlbnRTdG9yZVRvU2VncyA9IGNvbW1vbi5tZW1vaXplKF90aGlzLl9ldmVudFN0b3JlVG9TZWdzKTtcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICB0aW1lSGVhZGVySWQ6IGNvbW1vbi5nZXRVbmlxdWVEb21JZCgpLFxuICAgICAgICAgICAgZXZlbnRIZWFkZXJJZDogY29tbW9uLmdldFVuaXF1ZURvbUlkKCksXG4gICAgICAgICAgICBkYXRlSGVhZGVySWRSb290OiBjb21tb24uZ2V0VW5pcXVlRG9tSWQoKSxcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuc2V0Um9vdEVsID0gZnVuY3Rpb24gKHJvb3RFbCkge1xuICAgICAgICAgICAgaWYgKHJvb3RFbCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmNvbnRleHQucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudChfdGhpcywge1xuICAgICAgICAgICAgICAgICAgICBlbDogcm9vdEVsLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuY29udGV4dC51bnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQoX3RoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIExpc3RWaWV3LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgZXh0cmFDbGFzc05hbWVzID0gW1xuICAgICAgICAgICAgJ2ZjLWxpc3QnLFxuICAgICAgICAgICAgY29udGV4dC50aGVtZS5nZXRDbGFzcygndGFibGUnKSxcbiAgICAgICAgICAgIGNvbnRleHQub3B0aW9ucy5zdGlja3lIZWFkZXJEYXRlcyAhPT0gZmFsc2UgPyAnZmMtbGlzdC1zdGlja3knIDogJycsXG4gICAgICAgIF07XG4gICAgICAgIHZhciBfYiA9IHRoaXMuY29tcHV0ZURhdGVWYXJzKHByb3BzLmRhdGVQcm9maWxlKSwgZGF5RGF0ZXMgPSBfYi5kYXlEYXRlcywgZGF5UmFuZ2VzID0gX2IuZGF5UmFuZ2VzO1xuICAgICAgICB2YXIgZXZlbnRTZWdzID0gdGhpcy5ldmVudFN0b3JlVG9TZWdzKHByb3BzLmV2ZW50U3RvcmUsIHByb3BzLmV2ZW50VWlCYXNlcywgZGF5UmFuZ2VzKTtcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uVmlld1Jvb3QsIHsgdmlld1NwZWM6IGNvbnRleHQudmlld1NwZWMsIGVsUmVmOiB0aGlzLnNldFJvb3RFbCB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyByZWY6IHJvb3RFbFJlZiwgY2xhc3NOYW1lOiBleHRyYUNsYXNzTmFtZXMuY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSB9LFxuICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLlNjcm9sbGVyLCB7IGxpcXVpZDogIXByb3BzLmlzSGVpZ2h0QXV0bywgb3ZlcmZsb3dYOiBwcm9wcy5pc0hlaWdodEF1dG8gPyAndmlzaWJsZScgOiAnaGlkZGVuJywgb3ZlcmZsb3dZOiBwcm9wcy5pc0hlaWdodEF1dG8gPyAndmlzaWJsZScgOiAnYXV0bycgfSwgZXZlbnRTZWdzLmxlbmd0aCA+IDAgP1xuICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlclNlZ0xpc3QoZXZlbnRTZWdzLCBkYXlEYXRlcykgOlxuICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlckVtcHR5TWVzc2FnZSgpKSkpOyB9KSk7XG4gICAgfTtcbiAgICBMaXN0Vmlldy5wcm90b3R5cGUucmVuZGVyRW1wdHlNZXNzYWdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmNvbnRleHQsIG9wdGlvbnMgPSBfYS5vcHRpb25zLCB2aWV3QXBpID0gX2Eudmlld0FwaTtcbiAgICAgICAgdmFyIGhvb2tQcm9wcyA9IHtcbiAgICAgICAgICAgIHRleHQ6IG9wdGlvbnMubm9FdmVudHNUZXh0LFxuICAgICAgICAgICAgdmlldzogdmlld0FwaSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uUmVuZGVySG9vaywgeyBob29rUHJvcHM6IGhvb2tQcm9wcywgY2xhc3NOYW1lczogb3B0aW9ucy5ub0V2ZW50c0NsYXNzTmFtZXMsIGNvbnRlbnQ6IG9wdGlvbnMubm9FdmVudHNDb250ZW50LCBkZWZhdWx0Q29udGVudDogcmVuZGVyTm9FdmVudHNJbm5lciwgZGlkTW91bnQ6IG9wdGlvbnMubm9FdmVudHNEaWRNb3VudCwgd2lsbFVubW91bnQ6IG9wdGlvbnMubm9FdmVudHNXaWxsVW5tb3VudCB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQpIHsgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogWydmYy1saXN0LWVtcHR5J10uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSwgcmVmOiByb290RWxSZWYgfSxcbiAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWxpc3QtZW1wdHktY3VzaGlvblwiLCByZWY6IGlubmVyRWxSZWYgfSwgaW5uZXJDb250ZW50KSkpOyB9KSk7XG4gICAgfTtcbiAgICBMaXN0Vmlldy5wcm90b3R5cGUucmVuZGVyU2VnTGlzdCA9IGZ1bmN0aW9uIChhbGxTZWdzLCBkYXlEYXRlcykge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmNvbnRleHQsIHRoZW1lID0gX2EudGhlbWUsIG9wdGlvbnMgPSBfYS5vcHRpb25zO1xuICAgICAgICB2YXIgX2IgPSB0aGlzLnN0YXRlLCB0aW1lSGVhZGVySWQgPSBfYi50aW1lSGVhZGVySWQsIGV2ZW50SGVhZGVySWQgPSBfYi5ldmVudEhlYWRlcklkLCBkYXRlSGVhZGVySWRSb290ID0gX2IuZGF0ZUhlYWRlcklkUm9vdDtcbiAgICAgICAgdmFyIHNlZ3NCeURheSA9IGdyb3VwU2Vnc0J5RGF5KGFsbFNlZ3MpOyAvLyBzcGFyc2UgYXJyYXlcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uTm93VGltZXIsIHsgdW5pdDogXCJkYXlcIiB9LCBmdW5jdGlvbiAobm93RGF0ZSwgdG9kYXlSYW5nZSkge1xuICAgICAgICAgICAgdmFyIGlubmVyTm9kZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGRheUluZGV4ID0gMDsgZGF5SW5kZXggPCBzZWdzQnlEYXkubGVuZ3RoOyBkYXlJbmRleCArPSAxKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRheVNlZ3MgPSBzZWdzQnlEYXlbZGF5SW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChkYXlTZWdzKSB7IC8vIHNwYXJzZSBhcnJheSwgc28gbWlnaHQgYmUgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXlTdHIgPSBjb21tb24uZm9ybWF0RGF5U3RyaW5nKGRheURhdGVzW2RheUluZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRlSGVhZGVySWQgPSBkYXRlSGVhZGVySWRSb290ICsgJy0nICsgZGF5U3RyO1xuICAgICAgICAgICAgICAgICAgICAvLyBhcHBlbmQgYSBkYXkgaGVhZGVyXG4gICAgICAgICAgICAgICAgICAgIGlubmVyTm9kZXMucHVzaChjb21tb24uY3JlYXRlRWxlbWVudChMaXN0Vmlld0hlYWRlclJvdywgeyBrZXk6IGRheVN0ciwgY2VsbElkOiBkYXRlSGVhZGVySWQsIGRheURhdGU6IGRheURhdGVzW2RheUluZGV4XSwgdG9kYXlSYW5nZTogdG9kYXlSYW5nZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgIGRheVNlZ3MgPSBjb21tb24uc29ydEV2ZW50U2VncyhkYXlTZWdzLCBvcHRpb25zLmV2ZW50T3JkZXIpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGRheVNlZ3NfMSA9IGRheVNlZ3M7IF9pIDwgZGF5U2Vnc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlZyA9IGRheVNlZ3NfMVtfaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lck5vZGVzLnB1c2goY29tbW9uLmNyZWF0ZUVsZW1lbnQoTGlzdFZpZXdFdmVudFJvdywgdHNsaWIuX19hc3NpZ24oeyBrZXk6IGRheVN0ciArICc6JyArIHNlZy5ldmVudFJhbmdlLmluc3RhbmNlLmluc3RhbmNlSWQgLyogYXJlIG11bHRpcGxlIHNlZ3MgZm9yIGFuIGluc3RhbmNlSWQgKi8sIHNlZzogc2VnLCBpc0RyYWdnaW5nOiBmYWxzZSwgaXNSZXNpemluZzogZmFsc2UsIGlzRGF0ZVNlbGVjdGluZzogZmFsc2UsIGlzU2VsZWN0ZWQ6IGZhbHNlLCB0aW1lSGVhZGVySWQ6IHRpbWVIZWFkZXJJZCwgZXZlbnRIZWFkZXJJZDogZXZlbnRIZWFkZXJJZCwgZGF0ZUhlYWRlcklkOiBkYXRlSGVhZGVySWQgfSwgY29tbW9uLmdldFNlZ01ldGEoc2VnLCB0b2RheVJhbmdlLCBub3dEYXRlKSkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiLCB7IGNsYXNzTmFtZTogJ2ZjLWxpc3QtdGFibGUgJyArIHRoZW1lLmdldENsYXNzKCd0YWJsZScpIH0sXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0aGVhZFwiLCBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInRyXCIsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInRoXCIsIHsgc2NvcGU6IFwiY29sXCIsIGlkOiB0aW1lSGVhZGVySWQgfSwgb3B0aW9ucy50aW1lSGludCksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInRoXCIsIHsgc2NvcGU6IFwiY29sXCIsIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGhcIiwgeyBzY29wZTogXCJjb2xcIiwgaWQ6IGV2ZW50SGVhZGVySWQgfSwgb3B0aW9ucy5ldmVudEhpbnQpKSksXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0Ym9keVwiLCBudWxsLCBpbm5lck5vZGVzKSkpO1xuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICBMaXN0Vmlldy5wcm90b3R5cGUuX2V2ZW50U3RvcmVUb1NlZ3MgPSBmdW5jdGlvbiAoZXZlbnRTdG9yZSwgZXZlbnRVaUJhc2VzLCBkYXlSYW5nZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRSYW5nZXNUb1NlZ3MoY29tbW9uLnNsaWNlRXZlbnRTdG9yZShldmVudFN0b3JlLCBldmVudFVpQmFzZXMsIHRoaXMucHJvcHMuZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2UsIHRoaXMuY29udGV4dC5vcHRpb25zLm5leHREYXlUaHJlc2hvbGQpLmZnLCBkYXlSYW5nZXMpO1xuICAgIH07XG4gICAgTGlzdFZpZXcucHJvdG90eXBlLmV2ZW50UmFuZ2VzVG9TZWdzID0gZnVuY3Rpb24gKGV2ZW50UmFuZ2VzLCBkYXlSYW5nZXMpIHtcbiAgICAgICAgdmFyIHNlZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBldmVudFJhbmdlc18xID0gZXZlbnRSYW5nZXM7IF9pIDwgZXZlbnRSYW5nZXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBldmVudFJhbmdlID0gZXZlbnRSYW5nZXNfMVtfaV07XG4gICAgICAgICAgICBzZWdzLnB1c2guYXBwbHkoc2VncywgdGhpcy5ldmVudFJhbmdlVG9TZWdzKGV2ZW50UmFuZ2UsIGRheVJhbmdlcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWdzO1xuICAgIH07XG4gICAgTGlzdFZpZXcucHJvdG90eXBlLmV2ZW50UmFuZ2VUb1NlZ3MgPSBmdW5jdGlvbiAoZXZlbnRSYW5nZSwgZGF5UmFuZ2VzKSB7XG4gICAgICAgIHZhciBkYXRlRW52ID0gdGhpcy5jb250ZXh0LmRhdGVFbnY7XG4gICAgICAgIHZhciBuZXh0RGF5VGhyZXNob2xkID0gdGhpcy5jb250ZXh0Lm9wdGlvbnMubmV4dERheVRocmVzaG9sZDtcbiAgICAgICAgdmFyIHJhbmdlID0gZXZlbnRSYW5nZS5yYW5nZTtcbiAgICAgICAgdmFyIGFsbERheSA9IGV2ZW50UmFuZ2UuZGVmLmFsbERheTtcbiAgICAgICAgdmFyIGRheUluZGV4O1xuICAgICAgICB2YXIgc2VnUmFuZ2U7XG4gICAgICAgIHZhciBzZWc7XG4gICAgICAgIHZhciBzZWdzID0gW107XG4gICAgICAgIGZvciAoZGF5SW5kZXggPSAwOyBkYXlJbmRleCA8IGRheVJhbmdlcy5sZW5ndGg7IGRheUluZGV4ICs9IDEpIHtcbiAgICAgICAgICAgIHNlZ1JhbmdlID0gY29tbW9uLmludGVyc2VjdFJhbmdlcyhyYW5nZSwgZGF5UmFuZ2VzW2RheUluZGV4XSk7XG4gICAgICAgICAgICBpZiAoc2VnUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBzZWcgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRSYW5nZTogZXZlbnRSYW5nZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHNlZ1JhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IHNlZ1JhbmdlLmVuZCxcbiAgICAgICAgICAgICAgICAgICAgaXNTdGFydDogZXZlbnRSYW5nZS5pc1N0YXJ0ICYmIHNlZ1JhbmdlLnN0YXJ0LnZhbHVlT2YoKSA9PT0gcmFuZ2Uuc3RhcnQudmFsdWVPZigpLFxuICAgICAgICAgICAgICAgICAgICBpc0VuZDogZXZlbnRSYW5nZS5pc0VuZCAmJiBzZWdSYW5nZS5lbmQudmFsdWVPZigpID09PSByYW5nZS5lbmQudmFsdWVPZigpLFxuICAgICAgICAgICAgICAgICAgICBkYXlJbmRleDogZGF5SW5kZXgsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBzZWdzLnB1c2goc2VnKTtcbiAgICAgICAgICAgICAgICAvLyBkZXRlY3Qgd2hlbiByYW5nZSB3b24ndCBnbyBmdWxseSBpbnRvIHRoZSBuZXh0IGRheSxcbiAgICAgICAgICAgICAgICAvLyBhbmQgbXV0YXRlIHRoZSBsYXRlc3Qgc2VnIHRvIHRoZSBiZSB0aGUgZW5kLlxuICAgICAgICAgICAgICAgIGlmICghc2VnLmlzRW5kICYmICFhbGxEYXkgJiZcbiAgICAgICAgICAgICAgICAgICAgZGF5SW5kZXggKyAxIDwgZGF5UmFuZ2VzLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICByYW5nZS5lbmQgPFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUVudi5hZGQoZGF5UmFuZ2VzW2RheUluZGV4ICsgMV0uc3RhcnQsIG5leHREYXlUaHJlc2hvbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZy5lbmQgPSByYW5nZS5lbmQ7XG4gICAgICAgICAgICAgICAgICAgIHNlZy5pc0VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VncztcbiAgICB9O1xuICAgIHJldHVybiBMaXN0Vmlldztcbn0oY29tbW9uLkRhdGVDb21wb25lbnQpKTtcbmZ1bmN0aW9uIHJlbmRlck5vRXZlbnRzSW5uZXIoaG9va1Byb3BzKSB7XG4gICAgcmV0dXJuIGhvb2tQcm9wcy50ZXh0O1xufVxuZnVuY3Rpb24gY29tcHV0ZURhdGVWYXJzKGRhdGVQcm9maWxlKSB7XG4gICAgdmFyIGRheVN0YXJ0ID0gY29tbW9uLnN0YXJ0T2ZEYXkoZGF0ZVByb2ZpbGUucmVuZGVyUmFuZ2Uuc3RhcnQpO1xuICAgIHZhciB2aWV3RW5kID0gZGF0ZVByb2ZpbGUucmVuZGVyUmFuZ2UuZW5kO1xuICAgIHZhciBkYXlEYXRlcyA9IFtdO1xuICAgIHZhciBkYXlSYW5nZXMgPSBbXTtcbiAgICB3aGlsZSAoZGF5U3RhcnQgPCB2aWV3RW5kKSB7XG4gICAgICAgIGRheURhdGVzLnB1c2goZGF5U3RhcnQpO1xuICAgICAgICBkYXlSYW5nZXMucHVzaCh7XG4gICAgICAgICAgICBzdGFydDogZGF5U3RhcnQsXG4gICAgICAgICAgICBlbmQ6IGNvbW1vbi5hZGREYXlzKGRheVN0YXJ0LCAxKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGRheVN0YXJ0ID0gY29tbW9uLmFkZERheXMoZGF5U3RhcnQsIDEpO1xuICAgIH1cbiAgICByZXR1cm4geyBkYXlEYXRlczogZGF5RGF0ZXMsIGRheVJhbmdlczogZGF5UmFuZ2VzIH07XG59XG4vLyBSZXR1cm5zIGEgc3BhcnNlIGFycmF5IG9mIGFycmF5cywgc2VncyBncm91cGVkIGJ5IHRoZWlyIGRheUluZGV4XG5mdW5jdGlvbiBncm91cFNlZ3NCeURheShzZWdzKSB7XG4gICAgdmFyIHNlZ3NCeURheSA9IFtdOyAvLyBzcGFyc2UgYXJyYXlcbiAgICB2YXIgaTtcbiAgICB2YXIgc2VnO1xuICAgIGZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHNlZyA9IHNlZ3NbaV07XG4gICAgICAgIChzZWdzQnlEYXlbc2VnLmRheUluZGV4XSB8fCAoc2Vnc0J5RGF5W3NlZy5kYXlJbmRleF0gPSBbXSkpXG4gICAgICAgICAgICAucHVzaChzZWcpO1xuICAgIH1cbiAgICByZXR1cm4gc2Vnc0J5RGF5O1xufVxuXG52YXIgT1BUSU9OX1JFRklORVJTID0ge1xuICAgIGxpc3REYXlGb3JtYXQ6IGNyZWF0ZUZhbHNhYmxlRm9ybWF0dGVyLFxuICAgIGxpc3REYXlTaWRlRm9ybWF0OiBjcmVhdGVGYWxzYWJsZUZvcm1hdHRlcixcbiAgICBub0V2ZW50c0NsYXNzTmFtZXM6IGNvbW1vbi5pZGVudGl0eSxcbiAgICBub0V2ZW50c0NvbnRlbnQ6IGNvbW1vbi5pZGVudGl0eSxcbiAgICBub0V2ZW50c0RpZE1vdW50OiBjb21tb24uaWRlbnRpdHksXG4gICAgbm9FdmVudHNXaWxsVW5tb3VudDogY29tbW9uLmlkZW50aXR5LFxuICAgIC8vIG5vRXZlbnRzVGV4dCBpcyBkZWZpbmVkIGluIGJhc2Ugb3B0aW9uc1xufTtcbmZ1bmN0aW9uIGNyZWF0ZUZhbHNhYmxlRm9ybWF0dGVyKGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0ID09PSBmYWxzZSA/IG51bGwgOiBjb21tb24uY3JlYXRlRm9ybWF0dGVyKGlucHV0KTtcbn1cblxudmFyIG1haW4gPSBjb21tb24uY3JlYXRlUGx1Z2luKHtcbiAgICBvcHRpb25SZWZpbmVyczogT1BUSU9OX1JFRklORVJTLFxuICAgIHZpZXdzOiB7XG4gICAgICAgIGxpc3Q6IHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogTGlzdFZpZXcsXG4gICAgICAgICAgICBidXR0b25UZXh0S2V5OiAnbGlzdCcsXG4gICAgICAgICAgICBsaXN0RGF5Rm9ybWF0OiB7IG1vbnRoOiAnbG9uZycsIGRheTogJ251bWVyaWMnLCB5ZWFyOiAnbnVtZXJpYycgfSwgLy8gbGlrZSBcIkphbnVhcnkgMSwgMjAxNlwiXG4gICAgICAgIH0sXG4gICAgICAgIGxpc3REYXk6IHtcbiAgICAgICAgICAgIHR5cGU6ICdsaXN0JyxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB7IGRheXM6IDEgfSxcbiAgICAgICAgICAgIGxpc3REYXlGb3JtYXQ6IHsgd2Vla2RheTogJ2xvbmcnIH0sIC8vIGRheS1vZi13ZWVrIGlzIGFsbCB3ZSBuZWVkLiBmdWxsIGRhdGUgaXMgcHJvYmFibHkgaW4gaGVhZGVyVG9vbGJhclxuICAgICAgICB9LFxuICAgICAgICBsaXN0V2Vlazoge1xuICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxuICAgICAgICAgICAgZHVyYXRpb246IHsgd2Vla3M6IDEgfSxcbiAgICAgICAgICAgIGxpc3REYXlGb3JtYXQ6IHsgd2Vla2RheTogJ2xvbmcnIH0sXG4gICAgICAgICAgICBsaXN0RGF5U2lkZUZvcm1hdDogeyBtb250aDogJ2xvbmcnLCBkYXk6ICdudW1lcmljJywgeWVhcjogJ251bWVyaWMnIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGxpc3RNb250aDoge1xuICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxuICAgICAgICAgICAgZHVyYXRpb246IHsgbW9udGg6IDEgfSxcbiAgICAgICAgICAgIGxpc3REYXlTaWRlRm9ybWF0OiB7IHdlZWtkYXk6ICdsb25nJyB9LCAvLyBkYXktb2Ytd2VlayBpcyBuaWNlLXRvLWhhdmVcbiAgICAgICAgfSxcbiAgICAgICAgbGlzdFllYXI6IHtcbiAgICAgICAgICAgIHR5cGU6ICdsaXN0JyxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB7IHllYXI6IDEgfSxcbiAgICAgICAgICAgIGxpc3REYXlTaWRlRm9ybWF0OiB7IHdlZWtkYXk6ICdsb25nJyB9LCAvLyBkYXktb2Ytd2VlayBpcyBuaWNlLXRvLWhhdmVcbiAgICAgICAgfSxcbiAgICB9LFxufSk7XG5cbmV4cG9ydHMuTGlzdFZpZXcgPSBMaXN0VmlldztcbmV4cG9ydHMuZGVmYXVsdCA9IG1haW47XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQUEsTUFBTSxDQUFDQyxjQUFQLENBQXNCQyxPQUF0QixFQUErQixZQUEvQixFQUE2QztFQUFFQyxLQUFLLEVBQUU7QUFBVCxDQUE3Qzs7QUFFQSxJQUFJQyxNQUFNLEdBQUdDLE9BQU8sQ0FBQyxzQkFBRCxDQUFwQjs7QUFDQSxJQUFJQyxLQUFLLEdBQUdELE9BQU8sQ0FBQyxPQUFELENBQW5COztBQUNBOztBQUVBLElBQUlFLGlCQUFpQjtBQUFHO0FBQWUsVUFBVUMsTUFBVixFQUFrQjtFQUNyREYsS0FBSyxDQUFDRyxTQUFOLENBQWdCRixpQkFBaEIsRUFBbUNDLE1BQW5DOztFQUNB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 },{"@fullcalendar/common":1,"tslib":32}],8:[function(require,module,exports){ /*! FullCalendar v5.11.2 Docs & License: https://fullcalendar.io/ (c) 2022 Adam Shaw */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var common = require('@fullcalendar/common'); var tslib = require('tslib'); var daygrid = require('@fullcalendar/daygrid'); ; var AllDaySplitter = /** @class */ function (_super) { tslib.__extends(AllDaySplitter, _super); function AllDaySplitter() { return _super !== null && _super.apply(this, arguments) || this; } AllDaySplitter.prototype.getKeyInfo = function () { return { allDay: {}, timed: {} }; }; AllDaySplitter.prototype.getKeysForDateSpan = function (dateSpan) { if (dateSpan.allDay) { return ['allDay']; } return ['timed']; }; AllDaySplitter.prototype.getKeysForEventDef = function (eventDef) { if (!eventDef.allDay) { return ['timed']; } if (common.hasBgRendering(eventDef)) { return ['timed', 'allDay']; } return ['allDay']; }; return AllDaySplitter; }(common.Splitter); var DEFAULT_SLAT_LABEL_FORMAT = common.createFormatter({ hour: 'numeric', minute: '2-digit', omitZeroMinute: true, meridiem: 'short' }); function TimeColsAxisCell(props) { var classNames = ['fc-timegrid-slot', 'fc-timegrid-slot-label', props.isLabeled ? 'fc-scrollgrid-shrink' : 'fc-timegrid-slot-minor']; return common.createElement(common.ViewContextType.Consumer, null, function (context) { if (!props.isLabeled) { return common.createElement("td", { className: classNames.join(' '), "data-time": props.isoTimeStr }); } var dateEnv = context.dateEnv, options = context.options, viewApi = context.viewApi; var labelFormat = // TODO: fully pre-parse options.slotLabelFormat == null ? DEFAULT_SLAT_LABEL_FORMAT : Array.isArray(options.slotLabelFormat) ? common.createFormatter(options.slotLabelFormat[0]) : common.createFormatter(options.slotLabelFormat); var hookProps = { level: 0, time: props.time, date: dateEnv.toDate(props.date), view: viewApi, text: dateEnv.format(props.date, labelFormat) }; return common.createElement(common.RenderHook, { hookProps: hookProps, classNames: options.slotLabelClassNames, content: options.slotLabelContent, defaultContent: renderInnerContent, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return common.createElement("td", { ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-time": props.isoTimeStr }, common.createElement("div", { className: "fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame" }, common.createElement("div", { className: "fc-timegrid-slot-label-cushion fc-scrollgrid-shrink-cushion", ref: innerElRef }, innerContent))); }); }); } function renderInnerContent(props) { return props.text; } var TimeBodyAxis = /** @class */ function (_super) { tslib.__extends(TimeBodyAxis, _super); function TimeBodyAxis() { return _super !== null && _super.apply(this, arguments) || this; } TimeBodyAxis.prototype.render = function () { return this.props.slatMetas.map(function (slatMeta) { return common.createElement("tr", { key: slatMeta.key }, common.createElement(TimeColsAxisCell, tslib.__assign({}, slatMeta))); }); }; return TimeBodyAxis; }(common.BaseComponent); var DEFAULT_WEEK_NUM_FORMAT = common.createFormatter({ week: 'short' }); var AUTO_ALL_DAY_MAX_EVENT_ROWS = 5; var TimeColsView = /** @class */ function (_super) { tslib.__extends(TimeColsView, _super); function TimeColsView() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.allDaySplitter = new AllDaySplitter(); // for use by subclasses _this.headerElRef = common.createRef(); _this.rootElRef = common.createRef(); _this.scrollerElRef = common.createRef(); _this.state = { slatCoords: null }; _this.handleScrollTopRequest = function (scrollTop) { var scrollerEl = _this.scrollerElRef.current; if (scrollerEl) { // TODO: not sure how this could ever be null. weirdness with the reducer scrollerEl.scrollTop = scrollTop; } }; /* Header Render Methods ------------------------------------------------------------------------------------------------------------------*/ _this.renderHeadAxis = function (rowKey, frameHeight) { if (frameHeight === void 0) { frameHeight = ''; } var options = _this.context.options; var dateProfile = _this.props.dateProfile; var range = dateProfile.renderRange; var dayCnt = common.diffDays(range.start, range.end); var navLinkAttrs = dayCnt === 1 // only do in day views (to avoid doing in week views that dont need it) ? common.buildNavLinkAttrs(_this.context, range.start, 'week') : {}; if (options.weekNumbers && rowKey === 'day') { return common.createElement(common.WeekNumberRoot, { date: range.start, defaultFormat: DEFAULT_WEEK_NUM_FORMAT }, function (rootElRef, classNames, innerElRef, innerContent) { return common.createElement("th", { ref: rootElRef, "aria-hidden": true, className: ['fc-timegrid-axis', 'fc-scrollgrid-shrink'].concat(classNames).join(' ') }, common.createElement("div", { className: "fc-timegrid-axis-frame fc-scrollgrid-shrink-frame fc-timegrid-axis-frame-liquid", style: { height: frameHeight } }, common.createElement("a", tslib.__assign({ ref: innerElRef, className: "fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner" }, navLinkAttrs), innerContent))); }); } return common.createElement("th", { "aria-hidden": true, className: "fc-timegrid-axis" }, common.createElement("div", { className: "fc-timegrid-axis-frame", style: { height: frameHeight } })); }; /* Table Component Render Methods ------------------------------------------------------------------------------------------------------------------*/ // only a one-way height sync. we don't send the axis inner-content height to the DayGrid, // but DayGrid still needs to have classNames on inner elements in order to measure. _this.renderTableRowAxis = function (rowHeight) { var _a = _this.context, options = _a.options, viewApi = _a.viewApi; var hookProps = { text: options.allDayText, view: viewApi }; return (// TODO: make reusable hook. used in list view too common.createElement(common.RenderHook, { hookProps: hookProps, classNames: options.allDayClassNames, content: options.allDayContent, defaultContent: renderAllDayInner, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return common.createElement("td", { ref: rootElRef, "aria-hidden": true, className: ['fc-timegrid-axis', 'fc-scrollgrid-shrink'].concat(classNames).join(' ') }, common.createElement("div", { className: 'fc-timegrid-axis-frame fc-scrollgrid-shrink-frame' + (rowHeight == null ? ' fc-timegrid-axis-frame-liquid' : ''), style: { height: rowHeight } }, common.createElement("span", { className: "fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner", ref: innerElRef }, innerContent))); }) ); }; _this.handleSlatCoords = function (slatCoords) { _this.setState({ slatCoords: slatCoords }); }; return _this; } // rendering // ---------------------------------------------------------------------------------------------------- TimeColsView.prototype.renderSimpleLayout = function (headerRowContent, allDayContent, timeContent) { var _a = this, context = _a.context, props = _a.props; var sections = []; var stickyHeaderDates = common.getStickyHeaderDates(context.options); if (headerRowContent) { sections.push({ type: 'header', key: 'header', isSticky: stickyHeaderDates, chunk: { elRef: this.headerElRef, tableClassName: 'fc-col-header', rowContent: headerRowContent } }); } if (allDayContent) { sections.push({ type: 'body', key: 'all-day', chunk: { content: allDayContent } }); sections.push({ type: 'body', key: 'all-day-divider', outerContent: // TODO: rename to cellContent so don't need to define
 "; } c += "
' + D + "' + E + "
' + o.templates.leftArrow + '' + o.templates.rightArrow + "
' + r.headTemplate + "" + r.footTemplate + '
", a.fn.datepicker.DPGlobal = r, a.fn.datepicker.noConflict = function () { return a.fn.datepicker = m, this; }, a.fn.datepicker.version = "1.9.0", a.fn.datepicker.deprecated = function (a) { var b = window.console; b && b.warn && b.warn("DEPRECATED: " + a); }, a(document).on("focus.datepicker.data-api click.datepicker.data-api", '[data-provide="datepicker"]', function (b) { var c = a(this); c.data("datepicker") || (b.preventDefault(), n.call(c, "show")); }), a(function () { n.call(a('[data-provide="datepicker-inline"]')); }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhIiwiZGVmaW5lIiwiYW1kIiwiZXhwb3J0cyIsInJlcXVpcmUiLCJqUXVlcnkiLCJiIiwiYyIsIkRhdGUiLCJVVEMiLCJhcHBseSIsImFyZ3VtZW50cyIsImQiLCJnZXRGdWxsWWVhciIsImdldE1vbnRoIiwiZ2V0RGF0ZSIsImUiLCJnZXRVVENGdWxsWWVhciIsImdldFVUQ01vbnRoIiwiZ2V0VVRDRGF0ZSIsImYiLCJmbiIsImRhdGVwaWNrZXIiLCJkZXByZWNhdGVkIiwiZyIsImlzTmFOIiwiZ2V0VGltZSIsImgiLCJ0b0xvd2VyQ2FzZSIsImRhdGEiLCJSZWdFeHAiLCJpIiwidGVzdCIsInJlcGxhY2UiLCJxIiwic3BsaXQiLCJlYWNoIiwicCIsImoiLCJnZXQiLCJzbGljZSIsImNvbnRhaW5zIiwidmFsdWVPZiIsImxlbmd0aCIsInJlbW92ZSIsInNwbGljZSIsImlzQXJyYXkiLCJjbGVhciIsInB1c2giLCJjb3B5IiwiZXh0ZW5kIiwiayIsIl9ldmVudHMiLCJfc2Vjb25kYXJ5RXZlbnRzIiwiX3Byb2Nlc3Nfb3B0aW9ucyIsImRhdGVzIiwidmlld0RhdGUiLCJvIiwiZGVmYXVsdFZpZXdEYXRlIiwiZm9jdXNEYXRlIiwiZWxlbWVudCIsImlzSW5wdXQiLCJpcyIsImlucHV0RmllbGQiLCJmaW5kIiwiY29tcG9uZW50IiwiaGFzQ2xhc3MiLCJpc0lubGluZSIsInBpY2tlciIsInIiLCJ0ZW1wbGF0ZSIsIl9jaGVja190ZW1wbGF0ZSIsInRlbXBsYXRlcyIsImxlZnRBcnJvdyIsImh0bWwiLCJyaWdodEFycm93IiwiX2J1aWxkRXZlbnRzIiwiX2F0dGFjaEV2ZW50cyIsImFkZENsYXNzIiwiYXBwZW5kVG8iLCJydGwiLCJjYWxlbmRhcldlZWtzIiwiYXR0ciIsIk51bWJlciIsInN0YXJ0RGF0ZSIsIl9vIiwiZW5kRGF0ZSIsImRheXNPZldlZWtEaXNhYmxlZCIsImRheXNPZldlZWtIaWdobGlnaHRlZCIsImRhdGVzRGlzYWJsZWQiLCJfYWxsb3dfdXBkYXRlIiwic2V0Vmlld01vZGUiLCJzdGFydFZpZXciLCJmaWxsRG93IiwiZmlsbE1vbnRocyIsInVwZGF0ZSIsInNob3ciLCJwcm90b3R5cGUiLCJjb25zdHJ1Y3RvciIsIl9yZXNvbHZlVmlld05hbWUiLCJ2aWV3TW9kZXMiLCJpbkFycmF5IiwibmFtZXMiLCJfcmVzb2x2ZURheXNPZldlZWsiLCJtYXAiLCJtYXRjaCIsImxhbmd1YWdlIiwibWluVmlld01vZGUiLCJtYXhWaWV3TW9kZSIsIk1hdGgiLCJtYXgiLCJtaW4iLCJtdWx0aWRhdGUiLCJtdWx0aWRhdGVTZXBhcmF0b3IiLCJTdHJpbmciLCJ3ZWVrU3RhcnQiLCJ3ZWVrRW5kIiwicGFyc2VGb3JtYXQiLCJmb3JtYXQiLCJfbG9jYWxfdG9fdXRjIiwiX3plcm9fdGltZSIsInBhcnNlRGF0ZSIsImFzc3VtZU5lYXJieVllYXIiLCJvcmllbnRhdGlvbiIsImdyZXAiLCJ4IiwieSIsInllYXIiLCJtb250aCIsImwiLCJkYXkiLCJfYXBwbHlFdmVudHMiLCJvbiIsIl91bmFwcGx5RXZlbnRzIiwib2ZmIiwia2V5dXAiLCJwcm94eSIsImtleUNvZGUiLCJrZXlkb3duIiwicGFzdGUiLCJzaG93T25Gb2N1cyIsImZvY3VzIiwiY2xpY2siLCJibHVyIiwiX2ZvY3VzZWRfZnJvbSIsInRhcmdldCIsImltbWVkaWF0ZVVwZGF0ZXMiLCJkYXRlIiwibmF2QXJyb3dzQ2xpY2siLCJkYXlDZWxsQ2xpY2siLCJ3aW5kb3ciLCJyZXNpemUiLCJwbGFjZSIsImRvY3VtZW50IiwiaGlkZSIsIl9kZXRhY2hFdmVudHMiLCJfYXR0YWNoU2Vjb25kYXJ5RXZlbnRzIiwiX2RldGFjaFNlY29uZGFyeUV2ZW50cyIsIl90cmlnZ2VyIiwiX3V0Y190b19sb2NhbCIsInRyaWdnZXIiLCJ0eXBlIiwidmlld01vZGUiLCJmb3JtYXREYXRlIiwicHJvcCIsImVuYWJsZU9uUmVhZG9ubHkiLCJjb250YWluZXIiLCJuYXZpZ2F0b3IiLCJtc01heFRvdWNoUG9pbnRzIiwiZGlzYWJsZVRvdWNoS2V5Ym9hcmQiLCJkZXRhY2giLCJmb3JjZVBhcnNlIiwidmFsIiwic2V0VmFsdWUiLCJkZXN0cm95Iiwib3JpZ2luYWxFdmVudCIsImNsaXBib2FyZERhdGEiLCJ0eXBlcyIsImdldERhdGEiLCJzZXREYXRlIiwicHJldmVudERlZmF1bHQiLCJnZXRUaW1lem9uZU9mZnNldCIsIl96ZXJvX3V0Y190aW1lIiwiZ2V0RGF0ZXMiLCJnZXRVVENEYXRlcyIsImNsZWFyRGF0ZXMiLCJhdXRvY2xvc2UiLCJzZXREYXRlcyIsInNldFVUQ0RhdGVzIiwic2V0VVRDRGF0ZSIsImdldEZvcm1hdHRlZERhdGUiLCJqb2luIiwiZ2V0U3RhcnREYXRlIiwic2V0U3RhcnREYXRlIiwidXBkYXRlTmF2QXJyb3dzIiwiZ2V0RW5kRGF0ZSIsInNldEVuZERhdGUiLCJzZXREYXlzT2ZXZWVrRGlzYWJsZWQiLCJzZXREYXlzT2ZXZWVrSGlnaGxpZ2h0ZWQiLCJzZXREYXRlc0Rpc2FibGVkIiwib3V0ZXJXaWR0aCIsIm91dGVySGVpZ2h0Iiwid2lkdGgiLCJzY3JvbGxUb3AiLCJvZmZzZXQiLCJwYXJlbnRzIiwiY3NzIiwiekluZGV4T2Zmc2V0IiwicGFyZW50IiwibSIsImxlZnQiLCJuIiwidG9wIiwicmVtb3ZlQ2xhc3MiLCJwYXJzZUludCIsInJpZ2h0IiwiekluZGV4IiwiZGF0ZVdpdGhpblJhbmdlIiwidXBkYXRlVmlld0RhdGUiLCJjaGFuZ2UiLCJmaWxsIiwic2hvd1dlZWtEYXlzIiwiZGF5c01pbiIsImFwcGVuZCIsIm1vbnRoc1Nob3J0Iiwic2V0UmFuZ2UiLCJyYW5nZSIsImdldENsYXNzTmFtZXMiLCJ0b2RheUhpZ2hsaWdodCIsImRhdGVJc0Rpc2FibGVkIiwiZ2V0VVRDRGF5IiwiX2ZpbGxfeWVhcnNWaWV3IiwiZmxvb3IiLCJzIiwidCIsIm5vb3AiLCJlbmFibGVkIiwiY2xhc3NlcyIsImNvbmNhdCIsInRvb2x0aXAiLCJ0ZXh0IiwidG9kYXkiLCJlbiIsInRpdGxlRm9ybWF0IiwidG9kYXlCdG4iLCJ3ZWVrT2ZEYXRlSXNEaXNhYmxlZCIsImNsZWFyQnRuIiwidGl0bGUiLCJ1IiwidiIsInciLCJzZXRVVENGdWxsWWVhciIsInoiLCJBIiwiQiIsIkMiLCJEIiwiRSIsImJlZm9yZVNob3dEYXkiLCJjb250ZW50IiwiaXNGdW5jdGlvbiIsInVuaXF1ZVNvcnQiLCJ1bmlxdWUiLCJ0b1N0cmluZyIsIkYiLCJtb250aHNUaXRsZSIsIkciLCJlbmQiLCJlcSIsImJlZm9yZVNob3dNb250aCIsIkgiLCJiZWZvcmVTaG93WWVhciIsImJlZm9yZVNob3dEZWNhZGUiLCJiZWZvcmVTaG93Q2VudHVyeSIsInRvZ2dsZUNsYXNzIiwic3RvcFByb3BhZ2F0aW9uIiwiX3NldERhdGUiLCJpbmRleCIsInNldFVUQ01vbnRoIiwiY3VycmVudFRhcmdldCIsIm5hdlN0ZXAiLCJtb3ZlTW9udGgiLCJfdG9nZ2xlX211bHRpZGF0ZSIsInRvZ2dsZUFjdGl2ZSIsIm1vdmVEYXkiLCJtb3ZlV2VlayIsImFicyIsIm1vdmVZZWFyIiwibW92ZUF2YWlsYWJsZURhdGUiLCJrZXlib2FyZE5hdmlnYXRpb24iLCJjdHJsS2V5Iiwic2hpZnRLZXkiLCJjaGlsZHJlbiIsImZpbHRlciIsImNsc05hbWUiLCJpbnB1dHMiLCJqcXVlcnkiLCJrZWVwRW1wdHlWYWx1ZXMiLCJjYWxsIiwiZGF0ZVVwZGF0ZWQiLCJwaWNrZXJzIiwidXBkYXRlRGF0ZXMiLCJ1cGRhdGVSYW5nZXMiLCJ1cGRhdGluZyIsIkFycmF5Iiwic2hpZnQiLCJ0b0FycmF5IiwiRXJyb3IiLCJkZWZhdWx0cyIsImxvY2FsZV9vcHRzIiwiQ29uc3RydWN0b3IiLCJkYXlzIiwiZGF5c1Nob3J0IiwibW9udGhzIiwidmFsaWRQYXJ0cyIsIm5vbnB1bmN0dWF0aW9uIiwidG9WYWx1ZSIsInRvRGlzcGxheSIsInNlcGFyYXRvcnMiLCJwYXJ0cyIsInllc3RlcmRheSIsInRvbW9ycm93IiwieXl5eSIsInl5IiwiTSIsIk1NIiwibW0iLCJkZCIsIkREIiwic3Vic3RyaW5nIiwiaGVhZFRlbXBsYXRlIiwiY29udFRlbXBsYXRlIiwiZm9vdFRlbXBsYXRlIiwiRFBHbG9iYWwiLCJub0NvbmZsaWN0IiwidmVyc2lvbiIsImNvbnNvbGUiLCJ3YXJuIl0sInNvdXJjZXMiOlsiYm9vdHN0cmFwLWRhdGVwaWNrZXIubWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogRGF0ZXBpY2tlciBmb3IgQm9vdHN0cmFwIHYxLjkuMCAoaHR0cHM6Ly9naXRodWIuY29tL3V4c29sdXRpb25zL2Jvb3RzdHJhcC1kYXRlcGlja2VyKVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSB2Mi4wIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG4gKi9cblxuIWZ1bmN0aW9uKGEpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wianF1ZXJ5XCJdLGEpOmEoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/cmVxdWlyZShcImpxdWVyeVwiKTpqUXVlcnkpfShmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXtyZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMuYXBwbHkoRGF0ZSxhcmd1bWVudHMpKX1mdW5jdGlvbiBkKCl7dmFyIGE9bmV3IERhdGU7cmV0dXJuIGMoYS5nZXRGdWxsWWVhcigpLGEuZ2V0TW9udGgoKSxhLmdldERhdGUoKSl9ZnVuY3Rpb24gZShhLGIpe3JldHVybiBhLmdldFVUQ0Z1bGxZZWFyKCk9PT1iLmdldFVUQ0Z1bGxZZWFyKCkmJmEuZ2V0VVRDTW9udGgoKT09PWIuZ2V0VVRDTW9udGgoKSYmYS5nZXRVVENEYXRlKCk9PT1iLmdldFVUQ0RhdGUoKX1mdW5jdGlvbiBmKGMsZCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGQhPT1iJiZhLmZuLmRhdGVwaWNrZXIuZGVwcmVjYXRlZChkKSx0aGlzW2NdLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gZyhhKXtyZXR1cm4gYSYmIWlzTmFOKGEuZ2V0VGltZSgpKX1mdW5jdGlvbiBoKGIsYyl7ZnVuY3Rpb24gZChhLGIpe3JldHVybiBiLnRvTG93ZXJDYXNlKCl9dmFyIGUsZj1hKGIpLmRhdGEoKSxnPXt9LGg9bmV3IFJlZ0V4cChcIl5cIitjLnRvTG93ZXJDYXNlKCkrXCIoW0EtWl0pXCIpO2M9bmV3IFJlZ0V4cChcIl5cIitjLnRvTG93ZXJDYXNlKCkpO2Zvcih2YXIgaSBpbiBmKWMudGVzdChpKSYmKGU9aS5yZXBsYWNlKGgsZCksZ1tlXT1mW2ldKTtyZXR1cm4gZ31mdW5jdGlvbiBpKGIpe3ZhciBjPXt9O2lmKHFbYl18fChiPWIuc3BsaXQoXCItXCIpWzBdLHFbYl0pKXt2YXIgZD1xW2JdO3JldHVybiBhLmVhY2gocCxmdW5jdGlvbihhLGIpe2IgaW4gZCYmKGNbYl09ZFtiXSl9KSxjfX12YXIgaj1mdW5jdGlvbigpe3ZhciBiPXtnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2xpY2UoYSlbMF19LGNvbnRhaW5zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1hJiZhLnZhbHVlT2YoKSxjPTAsZD10aGlzLmxlbmd0aDtjPGQ7YysrKWlmKDA8PXRoaXNbY10udmFsdWVPZigpLWImJnRoaXNbY10udmFsdWVPZigpLWI8ODY0ZTUpcmV0dXJuIGM7cmV0dXJuLTF9LHJlbW92ZTpmdW5jdGlvbihhKXt0aGlzLnNwbGljZShhLDEpfSxyZXBsYWNlOmZ1bmN0aW9uKGIpe2ImJihhLmlzQXJyYXkoYil8fChiPVtiXSksdGhpcy5jbGVhcigpLHRoaXMucHVzaC5hcHBseSh0aGlzLGIpKX0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLmxlbmd0aD0wfSxjb3B5OmZ1bmN0aW9uKCl7dmFyIGE9bmV3IGo7cmV0dXJuIGEucmVwbGFjZSh0aGlzKSxhfX07cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGM9W107cmV0dXJuIGMucHVzaC5hcHBseShjLGFyZ3VtZW50cyksYS5leHRlbmQoYyxiKSxjfX0oKSxrPWZ1bmN0aW9uKGIsYyl7YS5kYXRhKGIsXCJkYXRlcGlja2VyXCIsdGhpcyksdGhpcy5fZXZlbnRzPVtdLHRoaXMuX3NlY29uZGFyeUV2ZW50cz1bXSx0aGlzLl9wcm9jZXNzX29wdGlvbnMoYyksdGhpcy5kYXRlcz1uZXcgaix0aGlzLnZpZXdEYXRlPXRoaXMuby5kZWZhdWx0Vmlld0RhdGUsdGhpcy5mb2N1c0RhdGU9bnVsbCx0aGlzLmVsZW1lbnQ9YShiKSx0aGlzLmlzSW5wdXQ9dGhpcy5lbGVtZW50LmlzKFwiaW5wdXRcIiksdGhpcy5pbnB1dEZpZWxkPXRoaXMuaXNJbnB1dD90aGlzLmVsZW1lbnQ6dGhpcy5lbGVtZW50LmZpbmQoXCJpbnB1dFwiKSx0aGlzLmNvbXBvbmVudD0hIXRoaXMuZWxlbWVudC5oYXNDbGFzcyhcImRhdGVcIikmJnRoaXMuZWxlbWVudC5maW5kKFwiLmFkZC1vbiwgLmlucHV0LWdyb3VwLWFkZG9uLCAuaW5wdXQtZ3JvdXAtYXBwZW5kLCAuaW5wdXQtZ3JvdXAtcHJlcGVuZCwgLmJ0blwiKSx0aGlzLmNvbXBvbmVudCYmMD09PXRoaXMuY29tcG9uZW50Lmxlbmd0aCYmKHRoaXMuY29tcG9uZW50PSExKSx0aGlzLmlzSW5saW5lPSF0aGlzLmNvbXBvbmVudCYmdGhpcy5lbGVtZW50LmlzKFwiZGl2XCIpLHRoaXMucGlja2VyPWEoci50ZW1wbGF0ZSksdGhpcy5fY2hlY2tfdGVtcGxhdGUodGhpcy5vLnRlbXBsYXRlcy5sZWZ0QXJyb3cpJiZ0aGlzLnBpY2tlci5maW5kKFwiLnByZXZcIikuaHRtbCh0aGlzLm8udGVtcGxhdGVzLmxlZnRBcnJvdyksdGhpcy5fY2hlY2tfdGVtcGxhdGUodGhpcy5vLnRlbXBsYXRlcy5yaWdodEFycm93KSYmdGhpcy5waWNrZXIuZmluZChcIi5uZXh0XCIpLmh0bWwodGhpcy5vLnRlbXBsYXRlcy5yaWdodEFycm93KSx0aGlzLl9idWlsZEV2ZW50cygpLHRoaXMuX2F0dGFjaEV2ZW50cygpLHRoaXMuaXNJbmxpbmU/dGhpcy5waWNrZXIuYWRkQ2xhc3MoXCJkYXRlcGlja2VyLWlubGluZVwiKS5hcHBlbmRUbyh0aGlzLmVsZW1lbnQpOnRoaXMucGlja2VyLmFkZENsYXNzKFwiZGF0ZXBpY2tlci1kcm9wZG93biBkcm9wZG93bi1tZW51XCIpLHRoaXMuby5ydGwmJnRoaXMucGlja2VyLmFkZENsYXNzKFwiZGF0ZXBpY2tlci1ydGxcIiksdGhpcy5vLmNhbGVuZGFyV2Vla3MmJnRoaXMucGlja2VyLmZpbmQoXCIuZGF0ZXBpY2tlci1kYXlzIC5kYXRlcGlja2VyLXN3aXRjaCwgdGhlYWQgLmRhdGVwaWNrZXItdGl0bGUsIHRmb290IC50b2RheSwgdGZvb3QgLmNsZWFyXCIpLmF0dHIoXCJjb2xzcGFuXCIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gTnVtYmVyKGIpKzF9KSx0aGlzLl9wcm9jZXNzX29wdGlvbnMoe3N0YXJ0RGF0ZTp0aGlzLl9vLnN0YXJ0RGF0ZSxlbmREYXRlOnRoaXMuX28uZW5kRGF0ZSxkYXlzT2ZXZWVrRGlzYWJsZWQ6dGhpcy5vLmRheXNPZldlZWtEaXNhYmxlZCxkYXlzT2ZXZWVrSGlnaGxpZ2h0ZWQ6dGhpcy5vLmRheXNPZldlZWtIaWdobGlnaHRlZCxkYXRlc0Rpc2FibGVkOnRoaXMuby5kYXRlc0Rpc2FibGVkfSksdGhpcy5fYWxsb3dfdXBkYXRlPSExLHRoaXMuc2V0Vmlld01vZGUodGhpcy5vLnN0YXJ0VmlldyksdGhpcy5fYWxsb3dfdXBkYXRlPSEwLHRoaXMuZmlsbERvdygpLHRoaXMuZmlsbE1vbnRocygpLHRoaXMudXBkYXRlKCksdGhpcy5pc0lubGluZSYmdGhpcy5zaG93KCl9O2sucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjprLF9yZXNvbHZlVmlld05hbWU6ZnVuY3Rpb24oYil7cmV0dXJuIGEuZWFjaChyLnZpZXdNb2RlcyxmdW5jdGlvbihjLGQpe2lmKGI9PT1jfHwtMSE9PWEuaW5BcnJheShiLGQubmFtZXMpKXJldHVybiBiPWMsITF9KSxifSxfcmVzb2x2ZURheXNPZldlZWs6ZnVuY3Rpb24oYil7cmV0dXJuIGEuaXNBcnJheShiKXx8KGI9Yi5zcGxpdCgvWyxcXHNdKi8pKSxhLm1hcChiLE51bWJlcil9LF9jaGVja190ZW1wbGF0ZTpmdW5jdGlvbihjKXt0cnl7aWYoYz09PWJ8fFwiXCI9PT1jKXJldHVybiExO2lmKChjLm1hdGNoKC9bPD5dL2cpfHxbXSkubGVuZ3RoPD0wKXJldHVybiEwO3JldHVybiBhKGMpLmxlbmd0aD4wfWNhdGNoKGEpe3JldHVybiExfX0sX3Byb2Nlc3Nfb3B0aW9uczpmdW5jdGlvbihiKXt0aGlzLl9vPWEuZXh0ZW5kKHt9LHRoaXMuX28sYik7dmFyIGU9dGhpcy5vPWEuZXh0ZW5kKHt9LHRoaXMuX28pLGY9ZS5sYW5ndWFnZTtxW2ZdfHwoZj1mLnNwbGl0KFwiLVwiKVswXSxxW2ZdfHwoZj1vLmxhbmd1YWdlKSksZS5sYW5ndWFnZT1mLGUuc3RhcnRWaWV3PXRoaXMuX3Jlc29sdmVWaWV3TmFtZShlLnN0YXJ0VmlldyksZS5taW5WaWV3TW9kZT10aGlzLl9yZXNvbHZlVmlld05hbWUoZS5taW5WaWV3TW9kZSksZS5tYXhWaWV3TW9kZT10aGlzLl9yZXNvbHZlVmlld05hbWUoZS5tYXhWaWV3TW9kZSksZS5zdGFydFZpZXc9TWF0aC5tYXgodGhpcy5vLm1pblZpZXdNb2RlLE1hdGgubWluKHRoaXMuby5tYXhWaWV3TW9kZSxlLnN0YXJ0VmlldykpLCEwIT09ZS5tdWx0aWRhdGUmJihlLm11bHRpZGF0ZT1OdW1iZXIoZS5tdWx0aWRhdGUpfHwhMSwhMSE9PWUubXVsdGlkYXRlJiYoZS5tdWx0aWRhdGU9TWF0aC5tYXgoMCxlLm11bHRpZGF0ZSkpKSxlLm11bHRpZGF0ZVNlcGFyYXRvcj1TdHJpbmcoZS5tdWx0aWRhdGVTZXBhcmF0b3IpLGUud2Vla1N0YXJ0JT03LGUud2Vla0VuZD0oZS53ZWVrU3RhcnQrNiklNzt2YXIgZz1yLnBhcnNlRm9ybWF0KGUuZm9ybWF0KTtlLnN0YXJ0RGF0ZSE9PS0xLzAmJihlLnN0YXJ0RGF0ZT9lLnN0YXJ0RGF0ZSBpbnN0YW5jZW9mIERhdGU/ZS5zdGFydERhdGU9dGhpcy5fbG9jYWxfdG9fdXRjKHRoaXMuX3plcm9fdGltZShlLnN0YXJ0RGF0ZSkpOmUuc3RhcnREYXRlPXIucGFyc2VEYXRlKGUuc3RhcnREYXRlLGcsZS5sYW5ndWFnZSxlLmFzc3VtZU5lYXJieVllYXIpOmUuc3RhcnREYXRlPS0xLzApLGUuZW5kRGF0ZSE9PTEvMCYmKGUuZW5kRGF0ZT9lLmVuZERhdGUgaW5zdGFuY2VvZiBEYXRlP2UuZW5kRGF0ZT10aGlzLl9sb2NhbF90b191dGModGhpcy5femVyb190aW1lKGUuZW5kRGF0ZSkpOmUuZW5kRGF0ZT1yLnBhcnNlRGF0ZShlLmVuZERhdGUsZyxlLmxhbmd1YWdlLGUuYXNzdW1lTmVhcmJ5WWVhcik6ZS5lbmREYXRlPTEvMCksZS5kYXlzT2ZXZWVrRGlzYWJsZWQ9dGhpcy5fcmVzb2x2ZURheXNPZldlZWsoZS5kYXlzT2ZXZWVrRGlzYWJsZWR8fFtdKSxlLmRheXNPZldlZWtIaWdobGlnaHRlZD10aGlzLl9yZXNvbHZlRGF5c09mV2VlayhlLmRheXNPZldlZWtIaWdobGlnaHRlZHx8W10pLGUuZGF0ZXNEaXNhYmxlZD1lLmRhdGVzRGlzYWJsZWR8fFtdLGEuaXNBcnJheShlLmRhdGVzRGlzYWJsZWQpfHwoZS5kYXRlc0Rpc2FibGVkPWUuZGF0ZXNEaXNhYmxlZC5zcGxpdChcIixcIikpLGUuZGF0ZXNEaXNhYmxlZD1hLm1hcChlLmRhdGVzRGlzYWJsZWQsZnVuY3Rpb24oYSl7cmV0dXJuIHIucGFyc2VEYXRlKGEsZyxlLmxhbmd1YWdlLGUuYXNzdW1lTmVhcmJ5WWVhcil9KTt2YXIgaD1TdHJpbmcoZS5vcmllbnRhdGlvbikudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy9nKSxpPWUub3JpZW50YXRpb24udG9Mb3dlckNhc2UoKTtpZihoPWEuZ3JlcChoLGZ1bmN0aW9uKGEpe3JldHVybi9eYXV0b3xsZWZ0fHJpZ2h0fHRvcHxib3R0b20kLy50ZXN0KGEpfSksZS5vcmllbnRhdGlvbj17eDpcImF1dG9cIix5OlwiYXV0b1wifSxpJiZcImF1dG9cIiE9PWkpaWYoMT09PWgubGVuZ3RoKXN3aXRjaChoWzBdKXtjYXNlXCJ0b3BcIjpjYXNlXCJib3R0b21cIjplLm9yaWVudGF0aW9uLnk9aFswXTticmVhaztjYXNlXCJsZWZ0XCI6Y2FzZVwicmlnaHRcIjplLm9yaWVudGF0aW9uLng9aFswXX1lbHNlIGk9YS5ncmVwKGgsZnVuY3Rpb24oYSl7cmV0dXJuL15sZWZ0fHJpZ2h0JC8udGVzdChhKX0pLGUub3JpZW50YXRpb24ueD1pWzBdfHxcImF1dG9cIixpPWEuZ3JlcChoLGZ1bmN0aW9uKGEpe3JldHVybi9edG9wfGJvdHRvbSQvLnRlc3QoYSl9KSxlLm9yaWVudGF0aW9uLnk9aVswXXx8XCJhdXRvXCI7ZWxzZTtpZihlLmRlZmF1bHRWaWV3RGF0ZSBpbnN0YW5jZW9mIERhdGV8fFwic3RyaW5nXCI9PXR5cGVvZiBlLmRlZmF1bHRWaWV3RGF0ZSllLmRlZmF1bHRWaWV3RGF0ZT1yLnBhcnNlRGF0ZShlLmRlZmF1bHRWaWV3RGF0ZSxnLGUubGFuZ3VhZ2UsZS5hc3N1bWVOZWFyYnlZZWFyKTtlbHNlIGlmKGUuZGVmYXVsdFZpZXdEYXRlKXt2YXIgaj1lLmRlZmF1bHRWaWV3RGF0ZS55ZWFyfHwobmV3IERhdGUpLmdldEZ1bGxZZWFyKCksaz1lLmRlZmF1bHRWaWV3RGF0ZS5tb250aHx8MCxsPWUuZGVmYXVsdFZpZXdEYXRlLmRheXx8MTtlLmRlZmF1bHRWaWV3RGF0ZT1jKGosayxsKX1lbHNlIGUuZGVmYXVsdFZpZXdEYXRlPWQoKX0sX2FwcGx5RXZlbnRzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkLGUsZj0wO2Y8YS5sZW5ndGg7ZisrKWM9YVtmXVswXSwyPT09YVtmXS5sZW5ndGg/KGQ9YixlPWFbZl1bMV0pOjM9PT1hW2ZdLmxlbmd0aCYmKGQ9YVtmXVsxXSxlPWFbZl1bMl0pLGMub24oZSxkKX0sX3VuYXBwbHlFdmVudHM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjLGQsZSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1hW2ZdWzBdLDI9PT1hW2ZdLmxlbmd0aD8oZT1iLGQ9YVtmXVsxXSk6Mz09PWFbZl0ubGVuZ3RoJiYoZT1hW2ZdWzFdLGQ9YVtmXVsyXSksYy5vZmYoZCxlKX0sX2J1aWxkRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIGI9e2tleXVwOmEucHJveHkoZnVuY3Rpb24oYil7LTE9PT1hLmluQXJyYXkoYi5rZXlDb2RlLFsyNywzNywzOSwzOCw0MCwzMiwxMyw5XSkmJnRoaXMudXBkYXRlKCl9LHRoaXMpLGtleWRvd246YS5wcm94eSh0aGlzLmtleWRvd24sdGhpcykscGFzdGU6YS5wcm94eSh0aGlzLnBhc3RlLHRoaXMpfTshMD09PXRoaXMuby5zaG93T25Gb2N1cyYmKGIuZm9jdXM9YS5wcm94eSh0aGlzLnNob3csdGhpcykpLHRoaXMuaXNJbnB1dD90aGlzLl9ldmVudHM9W1t0aGlzLmVsZW1lbnQsYl1dOnRoaXMuY29tcG9uZW50JiZ0aGlzLmlucHV0RmllbGQubGVuZ3RoP3RoaXMuX2V2ZW50cz1bW3RoaXMuaW5wdXRGaWVsZCxiXSxbdGhpcy5jb21wb25lbnQse2NsaWNrOmEucHJveHkodGhpcy5zaG93LHRoaXMpfV1dOnRoaXMuX2V2ZW50cz1bW3RoaXMuZWxlbWVudCx7Y2xpY2s6YS5wcm94eSh0aGlzLnNob3csdGhpcyksa2V5ZG93bjphLnByb3h5KHRoaXMua2V5ZG93bix0aGlzKX1dXSx0aGlzLl9ldmVudHMucHVzaChbdGhpcy5lbGVtZW50LFwiKlwiLHtibHVyOmEucHJveHkoZnVuY3Rpb24oYSl7dGhpcy5fZm9jdXNlZF9mcm9tPWEudGFyZ2V0fSx0aGlzKX1dLFt0aGlzLmVsZW1lbnQse2JsdXI6YS5wcm94eShmdW5jdGlvbihhKXt0aGlzLl9mb2N1c2VkX2Zyb209YS50YXJnZXR9LHRoaXMpfV0pLHRoaXMuby5pbW1lZGlhdGVVcGRhdGVzJiZ0aGlzLl9ldmVudHMucHVzaChbdGhpcy5lbGVtZW50LHtcImNoYW5nZVllYXIgY2hhbmdlTW9udGhcIjphLnByb3h5KGZ1bmN0aW9uKGEpe3RoaXMudXBkYXRlKGEuZGF0ZSl9LHRoaXMpfV0pLHRoaXMuX3NlY29uZGFyeUV2ZW50cz1bW3RoaXMucGlja2VyLHtjbGljazphLnByb3h5KHRoaXMuY2xpY2ssdGhpcyl9XSxbdGhpcy5waWNrZXIsXCIucHJldiwgLm5leHRcIix7Y2xpY2s6YS5wcm94eSh0aGlzLm5hdkFycm93c0NsaWNrLHRoaXMpfV0sW3RoaXMucGlja2VyLFwiLmRheTpub3QoLmRpc2FibGVkKVwiLHtjbGljazphLnByb3h5KHRoaXMuZGF5Q2VsbENsaWNrLHRoaXMpfV0sW2Eod2luZG93KSx7cmVzaXplOmEucHJveHkodGhpcy5wbGFjZSx0aGlzKX1dLFthKGRvY3VtZW50KSx7XCJtb3VzZWRvd24gdG91Y2hzdGFydFwiOmEucHJveHkoZnVuY3Rpb24oYSl7dGhpcy5lbGVtZW50LmlzKGEudGFyZ2V0KXx8dGhpcy5lbGVtZW50LmZpbmQoYS50YXJnZXQpLmxlbmd0aHx8dGhpcy5waWNrZXIuaXMoYS50YXJnZXQpfHx0aGlzLnBpY2tlci5maW5kKGEudGFyZ2V0KS5sZW5ndGh8fHRoaXMuaXNJbmxpbmV8fHRoaXMuaGlkZSgpfSx0aGlzKX1dXX0sX2F0dGFjaEV2ZW50czpmdW5jdGlvbigpe3RoaXMuX2RldGFjaEV2ZW50cygpLHRoaXMuX2FwcGx5RXZlbnRzKHRoaXMuX2V2ZW50cyl9LF9kZXRhY2hFdmVudHM6ZnVuY3Rpb24oKXt0aGlzLl91bmFwcGx5RXZlbnRzKHRoaXMuX2V2ZW50cyl9LF9hdHRhY2hTZWNvbmRhcnlFdmVudHM6ZnVuY3Rpb24oKXt0aGlzLl9kZXRhY2hTZWNvbmRhcnlFdmVudHMoKSx0aGlzLl9hcHBseUV2ZW50cyh0aGlzLl9zZWNvbmRhcnlFdmVudHMpfSxfZGV0YWNoU2Vjb25kYXJ5RXZlbnRzOmZ1bmN0aW9uKCl7dGhpcy5fdW5hcHBseUV2ZW50cyh0aGlzLl9zZWNvbmRhcnlFdmVudHMpfSxfdHJpZ2dlcjpmdW5jdGlvbihiLGMpe3ZhciBkPWN8fHRoaXMuZGF0ZXMuZ2V0KC0xKSxlPXRoaXMuX3V0Y190b19sb2NhbChkKTt0aGlzLmVsZW1lbnQudHJpZ2dlcih7dHlwZTpiLGRhdGU6ZSx2aWV3TW9kZTp0aGlzLnZpZXdNb2RlLGRhdGVzOmEubWFwKHRoaXMuZGF0ZXMsdGhpcy5fdXRjX3RvX2xvY2FsKSxmb3JtYXQ6YS5wcm94eShmdW5jdGlvbihhLGIpezA9PT1hcmd1bWVudHMubGVuZ3RoPyhhPXRoaXMuZGF0ZXMubGVuZ3RoLTEsYj10aGlzLm8uZm9ybWF0KTpcInN0cmluZ1wiPT10eXBlb2YgYSYmKGI9YSxhPXRoaXMuZGF0ZXMubGVuZ3RoLTEpLGI9Ynx8dGhpcy5vLmZvcm1hdDt2YXIgYz10aGlzLmRhdGVzLmdldChhKTtyZXR1cm4gci5mb3JtYXREYXRlKGMsYix0aGlzLm8ubGFuZ3VhZ2UpfSx0aGlzKX0pfSxzaG93OmZ1bmN0aW9uKCl7aWYoISh0aGlzLmlucHV0RmllbGQuaXMoXCI6ZGlzYWJsZWRcIil8fHRoaXMuaW5wdXRGaWVsZC5wcm9wKFwicmVhZG9ubHlcIikmJiExPT09dGhpcy5vLmVuYWJsZU9uUmVhZG9ubHkpKXJldHVybiB0aGlzLmlzSW5saW5lfHx0aGlzLnBpY2tlci5hcHBlbmRUbyh0aGlzLm8uY29udGFpbmVyKSx0aGlzLnBsYWNlKCksdGhpcy5waWNrZXIuc2hvdygpLHRoaXMuX2F0dGFjaFNlY29uZGFyeUV2ZW50cygpLHRoaXMuX3RyaWdnZXIoXCJzaG93XCIpLCh3aW5kb3cubmF2aWdhdG9yLm1zTWF4VG91Y2hQb2ludHN8fFwib250b3VjaHN0YXJ0XCJpbiBkb2N1bWVudCkmJnRoaXMuby5kaXNhYmxlVG91Y2hLZXlib2FyZCYmYSh0aGlzLmVsZW1lbnQpLmJsdXIoKSx0aGlzfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNJbmxpbmV8fCF0aGlzLnBpY2tlci5pcyhcIjp2aXNpYmxlXCIpP3RoaXM6KHRoaXMuZm9jdXNEYXRlPW51bGwsdGhpcy5waWNrZXIuaGlkZSgpLmRldGFjaCgpLHRoaXMuX2RldGFjaFNlY29uZGFyeUV2ZW50cygpLHRoaXMuc2V0Vmlld01vZGUodGhpcy5vLnN0YXJ0VmlldyksdGhpcy5vLmZvcmNlUGFyc2UmJnRoaXMuaW5wdXRGaWVsZC52YWwoKSYmdGhpcy5zZXRWYWx1ZSgpLHRoaXMuX3RyaWdnZXIoXCJoaWRlXCIpLHRoaXMpfSxkZXN0cm95OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGlkZSgpLHRoaXMuX2RldGFjaEV2ZW50cygpLHRoaXMuX2RldGFjaFNlY29uZGFyeUV2ZW50cygpLHRoaXMucGlja2VyLnJlbW92ZSgpLGRlbGV0ZSB0aGlzLmVsZW1lbnQuZGF0YSgpLmRhdGVwaWNrZXIsdGhpcy5pc0lucHV0fHxkZWxldGUgdGhpcy5lbGVtZW50LmRhdGEoKS5kYXRlLHRoaXN9LHBhc3RlOmZ1bmN0aW9uKGIpe3ZhciBjO2lmKGIub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhJiZiLm9yaWdpbmFsRXZlbnQuY2xpcGJvYXJkRGF0YS50eXBlcyYmLTEhPT1hLmluQXJyYXkoXCJ0ZXh0L3BsYWluXCIsYi5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEudHlwZXMpKWM9Yi5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuZ2V0RGF0YShcInRleHQvcGxhaW5cIik7ZWxzZXtpZighd2luZG93LmNsaXBib2FyZERhdGEpcmV0dXJuO2M9d2luZG93LmNsaXBib2FyZERhdGEuZ2V0RGF0YShcIlRleHRcIil9dGhpcy5zZXREYXRlKGMpLHRoaXMudXBkYXRlKCksYi5wcmV2ZW50RGVmYXVsdCgpfSxfdXRjX3RvX2xvY2FsOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiBhO3ZhciBiPW5ldyBEYXRlKGEuZ2V0VGltZSgpKzZlNCphLmdldFRpbWV6b25lT2Zmc2V0KCkpO3JldHVybiBiLmdldFRpbWV6b25lT2Zmc2V0KCkhPT1hLmdldFRpbWV6b25lT2Zmc2V0KCkmJihiPW5ldyBEYXRlKGEuZ2V0VGltZSgpKzZlNCpiLmdldFRpbWV6b25lT2Zmc2V0KCkpKSxifSxfbG9jYWxfdG9fdXRjOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZuZXcgRGF0ZShhLmdldFRpbWUoKS02ZTQqYS5nZXRUaW1lem9uZU9mZnNldCgpKX0sX3plcm9fdGltZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmbmV3IERhdGUoYS5nZXRGdWxsWWVhcigpLGEuZ2V0TW9udGgoKSxhLmdldERhdGUoKSl9LF96ZXJvX3V0Y190aW1lOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZjKGEuZ2V0VVRDRnVsbFllYXIoKSxhLmdldFVUQ01vbnRoKCksYS5nZXRVVENEYXRlKCkpfSxnZXREYXRlczpmdW5jdGlvbigpe3JldHVybiBhLm1hcCh0aGlzLmRhdGVzLHRoaXMuX3V0Y190b19sb2NhbCl9LGdldFVUQ0RhdGVzOmZ1bmN0aW9uKCl7cmV0dXJuIGEubWFwKHRoaXMuZGF0ZXMsZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBEYXRlKGEpfSl9LGdldERhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXRjX3RvX2xvY2FsKHRoaXMuZ2V0VVRDRGF0ZSgpKX0sZ2V0VVRDRGF0ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZGF0ZXMuZ2V0KC0xKTtyZXR1cm4gYSE9PWI/bmV3IERhdGUoYSk6bnVsbH0sY2xlYXJEYXRlczpmdW5jdGlvbigpe3RoaXMuaW5wdXRGaWVsZC52YWwoXCJcIiksdGhpcy51cGRhdGUoKSx0aGlzLl90cmlnZ2VyKFwiY2hhbmdlRGF0ZVwiKSx0aGlzLm8uYXV0b2Nsb3NlJiZ0aGlzLmhpZGUoKX0sc2V0RGF0ZXM6ZnVuY3Rpb24oKXt2YXIgYj1hLmlzQXJyYXkoYXJndW1lbnRzWzBdKT9hcmd1bWVudHNbMF06YXJndW1lbnRzO3JldHVybiB0aGlzLnVwZGF0ZS5hcHBseSh0aGlzLGIpLHRoaXMuX3RyaWdnZXIoXCJjaGFuZ2VEYXRlXCIpLHRoaXMuc2V0VmFsdWUoKSx0aGlzfSxzZXRVVENEYXRlczpmdW5jdGlvbigpe3ZhciBiPWEuaXNBcnJheShhcmd1bWVudHNbMF0pP2FyZ3VtZW50c1swXTphcmd1bWVudHM7cmV0dXJuIHRoaXMuc2V0RGF0ZXMuYXBwbHkodGhpcyxhLm1hcChiLHRoaXMuX3V0Y190b19sb2NhbCkpLHRoaXN9LHNldERhdGU6ZihcInNldERhdGVzXCIpLHNldFVUQ0RhdGU6ZihcInNldFVUQ0RhdGVzXCIpLHJlbW92ZTpmKFwiZGVzdHJveVwiLFwiTWV0aG9kIGByZW1vdmVgIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDIuMC4gVXNlIGBkZXN0cm95YCBpbnN0ZWFkXCIpLHNldFZhbHVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRGb3JtYXR0ZWREYXRlKCk7cmV0dXJuIHRoaXMuaW5wdXRGaWVsZC52YWwoYSksdGhpc30sZ2V0Rm9ybWF0dGVkRGF0ZTpmdW5jdGlvbihjKXtjPT09YiYmKGM9dGhpcy5vLmZvcm1hdCk7dmFyIGQ9dGhpcy5vLmxhbmd1YWdlO3JldHVybiBhLm1hcCh0aGlzLmRhdGVzLGZ1bmN0aW9uKGEpe3JldHVybiByLmZvcm1hdERhdGUoYSxjLGQpfSkuam9pbih0aGlzLm8ubXVsdGlkYXRlU2VwYXJhdG9yKX0sZ2V0U3RhcnREYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuby5zdGFydERhdGV9LHNldFN0YXJ0RGF0ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fcHJvY2Vzc19vcHRpb25zKHtzdGFydERhdGU6YX0pLHRoaXMudXBkYXRlKCksdGhpcy51cGRhdGVOYXZBcnJvd3MoKSx0aGlzfSxnZXRFbmREYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuby5lbmREYXRlfSxzZXRFbmREYXRlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9wcm9jZXNzX29wdGlvbnMoe2VuZERhdGU6YX0pLHRoaXMudXBkYXRlKCksdGhpcy51cGRhdGVOYXZBcnJvd3MoKSx0aGlzfSxzZXREYXlzT2ZXZWVrRGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3Byb2Nlc3Nfb3B0aW9ucyh7ZGF5c09mV2Vla0Rpc2FibGVkOmF9KSx0aGlzLnVwZGF0ZSgpLHRoaXN9LHNldERheXNPZldlZWtIaWdobGlnaHRlZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fcHJvY2Vzc19vcHRpb25zKHtkYXlzT2ZXZWVrSGlnaGxpZ2h0ZWQ6YX0pLHRoaXMudXBkYXRlKCksdGhpc30sc2V0RGF0ZXNEaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fcHJvY2Vzc19vcHRpb25zKHtkYXRlc0Rpc2FibGVkOmF9KSx0aGlzLnVwZGF0ZSgpLHRoaXN9LHBsYWNlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0lubGluZSlyZXR1cm4gdGhpczt2YXIgYj10aGlzLnBpY2tlci5vdXRlcldpZHRoKCksYz10aGlzLnBpY2tlci5vdXRlckhlaWdodCgpLGQ9YSh0aGlzLm8uY29udGFpbmVyKSxlPWQud2lkdGgoKSxmPVwiYm9keVwiPT09dGhpcy5vLmNvbnRhaW5lcj9hKGRvY3VtZW50KS5zY3JvbGxUb3AoKTpkLnNjcm9sbFRvcCgpLGc9ZC5vZmZzZXQoKSxoPVswXTt0aGlzLmVsZW1lbnQucGFyZW50cygpLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLmNzcyhcInotaW5kZXhcIik7XCJhdXRvXCIhPT1iJiYwIT09TnVtYmVyKGIpJiZoLnB1c2goTnVtYmVyKGIpKX0pO3ZhciBpPU1hdGgubWF4LmFwcGx5KE1hdGgsaCkrdGhpcy5vLnpJbmRleE9mZnNldCxqPXRoaXMuY29tcG9uZW50P3RoaXMuY29tcG9uZW50LnBhcmVudCgpLm9mZnNldCgpOnRoaXMuZWxlbWVudC5vZmZzZXQoKSxrPXRoaXMuY29tcG9uZW50P3RoaXMuY29tcG9uZW50Lm91dGVySGVpZ2h0KCEwKTp0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoITEpLGw9dGhpcy5jb21wb25lbnQ/dGhpcy5jb21wb25lbnQub3V0ZXJXaWR0aCghMCk6dGhpcy5lbGVtZW50Lm91dGVyV2lkdGgoITEpLG09ai5sZWZ0LWcubGVmdCxuPWoudG9wLWcudG9wO1wiYm9keVwiIT09dGhpcy5vLmNvbnRhaW5lciYmKG4rPWYpLHRoaXMucGlja2VyLnJlbW92ZUNsYXNzKFwiZGF0ZXBpY2tlci1vcmllbnQtdG9wIGRhdGVwaWNrZXItb3JpZW50LWJvdHRvbSBkYXRlcGlja2VyLW9yaWVudC1yaWdodCBkYXRlcGlja2VyLW9yaWVudC1sZWZ0XCIpLFwiYXV0b1wiIT09dGhpcy5vLm9yaWVudGF0aW9uLng/KHRoaXMucGlja2VyLmFkZENsYXNzKFwiZGF0ZXBpY2tlci1vcmllbnQtXCIrdGhpcy5vLm9yaWVudGF0aW9uLngpLFwicmlnaHRcIj09PXRoaXMuby5vcmllbnRhdGlvbi54JiYobS09Yi1sKSk6ai5sZWZ0PDA/KHRoaXMucGlja2VyLmFkZENsYXNzKFwiZGF0ZXBpY2tlci1vcmllbnQtbGVmdFwiKSxtLT1qLmxlZnQtMTApOm0rYj5lPyh0aGlzLnBpY2tlci5hZGRDbGFzcyhcImRhdGVwaWNrZXItb3JpZW50LXJpZ2h0XCIpLG0rPWwtYik6dGhpcy5vLnJ0bD90aGlzLnBpY2tlci5hZGRDbGFzcyhcImRhdGVwaWNrZXItb3JpZW50LXJpZ2h0XCIpOnRoaXMucGlja2VyLmFkZENsYXNzKFwiZGF0ZXBpY2tlci1vcmllbnQtbGVmdFwiKTt2YXIgbyxwPXRoaXMuby5vcmllbnRhdGlvbi55O2lmKFwiYXV0b1wiPT09cCYmKG89LWYrbi1jLHA9bzwwP1wiYm90dG9tXCI6XCJ0b3BcIiksdGhpcy5waWNrZXIuYWRkQ2xhc3MoXCJkYXRlcGlja2VyLW9yaWVudC1cIitwKSxcInRvcFwiPT09cD9uLT1jK3BhcnNlSW50KHRoaXMucGlja2VyLmNzcyhcInBhZGRpbmctdG9wXCIpKTpuKz1rLHRoaXMuby5ydGwpe3ZhciBxPWUtKG0rbCk7dGhpcy5waWNrZXIuY3NzKHt0b3A6bixyaWdodDpxLHpJbmRleDppfSl9ZWxzZSB0aGlzLnBpY2tlci5jc3Moe3RvcDpuLGxlZnQ6bSx6SW5kZXg6aX0pO3JldHVybiB0aGlzfSxfYWxsb3dfdXBkYXRlOiEwLHVwZGF0ZTpmdW5jdGlvbigpe2lmKCF0aGlzLl9hbGxvd191cGRhdGUpcmV0dXJuIHRoaXM7dmFyIGI9dGhpcy5kYXRlcy5jb3B5KCksYz1bXSxkPSExO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhLmVhY2goYXJndW1lbnRzLGEucHJveHkoZnVuY3Rpb24oYSxiKXtiIGluc3RhbmNlb2YgRGF0ZSYmKGI9dGhpcy5fbG9jYWxfdG9fdXRjKGIpKSxjLnB1c2goYil9LHRoaXMpKSxkPSEwKTooYz10aGlzLmlzSW5wdXQ/dGhpcy5lbGVtZW50LnZhbCgpOnRoaXMuZWxlbWVudC5kYXRhKFwiZGF0ZVwiKXx8dGhpcy5pbnB1dEZpZWxkLnZhbCgpLGM9YyYmdGhpcy5vLm11bHRpZGF0ZT9jLnNwbGl0KHRoaXMuby5tdWx0aWRhdGVTZXBhcmF0b3IpOltjXSxkZWxldGUgdGhpcy5lbGVtZW50LmRhdGEoKS5kYXRlKSxjPWEubWFwKGMsYS5wcm94eShmdW5jdGlvbihhKXtyZXR1cm4gci5wYXJzZURhdGUoYSx0aGlzLm8uZm9ybWF0LHRoaXMuby5sYW5ndWFnZSx0aGlzLm8uYXNzdW1lTmVhcmJ5WWVhcil9LHRoaXMpKSxjPWEuZ3JlcChjLGEucHJveHkoZnVuY3Rpb24oYSl7cmV0dXJuIXRoaXMuZGF0ZVdpdGhpblJhbmdlKGEpfHwhYX0sdGhpcyksITApLHRoaXMuZGF0ZXMucmVwbGFjZShjKSx0aGlzLm8udXBkYXRlVmlld0RhdGUmJih0aGlzLmRhdGVzLmxlbmd0aD90aGlzLnZpZXdEYXRlPW5ldyBEYXRlKHRoaXMuZGF0ZXMuZ2V0KC0xKSk6dGhpcy52aWV3RGF0ZTx0aGlzLm8uc3RhcnREYXRlP3RoaXMudmlld0RhdGU9bmV3IERhdGUodGhpcy5vLnN0YXJ0RGF0ZSk6dGhpcy52aWV3RGF0ZT50aGlzLm8uZW5kRGF0ZT90aGlzLnZpZXdEYXRlPW5ldyBEYXRlKHRoaXMuby5lbmREYXRlKTp0aGlzLnZpZXdEYXRlPXRoaXMuby5kZWZhdWx0Vmlld0RhdGUpLGQ/KHRoaXMuc2V0VmFsdWUoKSx0aGlzLmVsZW1lbnQuY2hhbmdlKCkpOnRoaXMuZGF0ZXMubGVuZ3RoJiZTdHJpbmcoYikhPT1TdHJpbmcodGhpcy5kYXRlcykmJmQmJih0aGlzLl90cmlnZ2VyKFwiY2hhbmdlRGF0ZVwiKSx0aGlzLmVsZW1lbnQuY2hhbmdlKCkpLCF0aGlzLmRhdGVzLmxlbmd0aCYmYi5sZW5ndGgmJih0aGlzLl90cmlnZ2VyKFwiY2xlYXJEYXRlXCIpLHRoaXMuZWxlbWVudC5jaGFuZ2UoKSksdGhpcy5maWxsKCksdGhpc30sZmlsbERvdzpmdW5jdGlvbigpe2lmKHRoaXMuby5zaG93V2Vla0RheXMpe3ZhciBiPXRoaXMuby53ZWVrU3RhcnQsYz1cIjx0cj5cIjtmb3IodGhpcy5vLmNhbGVuZGFyV2Vla3MmJihjKz0nPHRoIGNsYXNzPVwiY3dcIj4mIzE2MDs8L3RoPicpO2I8dGhpcy5vLndlZWtTdGFydCs3OyljKz0nPHRoIGNsYXNzPVwiZG93JywtMSE9PWEuaW5BcnJheShiLHRoaXMuby5kYXlzT2ZXZWVrRGlzYWJsZWQpJiYoYys9XCIgZGlzYWJsZWRcIiksYys9J1wiPicrcVt0aGlzLm8ubGFuZ3VhZ2VdLmRheXNNaW5bYisrJTddK1wiPC90aD5cIjtjKz1cIjwvdHI+XCIsdGhpcy5waWNrZXIuZmluZChcIi5kYXRlcGlja2VyLWRheXMgdGhlYWRcIikuYXBwZW5kKGMpfX0sZmlsbE1vbnRoczpmdW5jdGlvbigpe2Zvcih2YXIgYSxiPXRoaXMuX3V0Y190b19sb2NhbCh0aGlzLnZpZXdEYXRlKSxjPVwiXCIsZD0wO2Q8MTI7ZCsrKWE9YiYmYi5nZXRNb250aCgpPT09ZD9cIiBmb2N1c2VkXCI6XCJcIixjKz0nPHNwYW4gY2xhc3M9XCJtb250aCcrYSsnXCI+JytxW3RoaXMuby5sYW5ndWFnZV0ubW9udGhzU2hvcnRbZF0rXCI8L3NwYW4+XCI7dGhpcy5waWNrZXIuZmluZChcIi5kYXRlcGlja2VyLW1vbnRocyB0ZFwiKS5odG1sKGMpfSxzZXRSYW5nZTpmdW5jdGlvbihiKXtiJiZiLmxlbmd0aD90aGlzLnJhbmdlPWEubWFwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWVPZigpfSk6ZGVsZXRlIHRoaXMucmFuZ2UsdGhpcy5maWxsKCl9LGdldENsYXNzTmFtZXM6ZnVuY3Rpb24oYil7dmFyIGM9W10sZj10aGlzLnZpZXdEYXRlLmdldFVUQ0Z1bGxZZWFyKCksZz10aGlzLnZpZXdEYXRlLmdldFVUQ01vbnRoKCksaD1kKCk7cmV0dXJuIGIuZ2V0VVRDRnVsbFllYXIoKTxmfHxiLmdldFVUQ0Z1bGxZZWFyKCk9PT1mJiZiLmdldFVUQ01vbnRoKCk8Zz9jLnB1c2goXCJvbGRcIik6KGIuZ2V0VVRDRnVsbFllYXIoKT5mfHxiLmdldFVUQ0Z1bGxZZWFyKCk9PT1mJiZiLmdldFVUQ01vbnRoKCk+ZykmJmMucHVzaChcIm5ld1wiKSx0aGlzLmZvY3VzRGF0ZSYmYi52YWx1ZU9mKCk9PT10aGlzLmZvY3VzRGF0ZS52YWx1ZU9mKCkmJmMucHVzaChcImZvY3VzZWRcIiksdGhpcy5vLnRvZGF5SGlnaGxpZ2h0JiZlKGIsaCkmJmMucHVzaChcInRvZGF5XCIpLC0xIT09dGhpcy5kYXRlcy5jb250YWlucyhiKSYmYy5wdXNoKFwiYWN0aXZlXCIpLHRoaXMuZGF0ZVdpdGhpblJhbmdlKGIpfHxjLnB1c2goXCJkaXNhYmxlZFwiKSx0aGlzLmRhdGVJc0Rpc2FibGVkKGIpJiZjLnB1c2goXCJkaXNhYmxlZFwiLFwiZGlzYWJsZWQtZGF0ZVwiKSwtMSE9PWEuaW5BcnJheShiLmdldFVUQ0RheSgpLHRoaXMuby5kYXlzT2ZXZWVrSGlnaGxpZ2h0ZWQpJiZjLnB1c2goXCJoaWdobGlnaHRlZFwiKSx0aGlzLnJhbmdlJiYoYj50aGlzLnJhbmdlWzBdJiZiPHRoaXMucmFuZ2VbdGhpcy5yYW5nZS5sZW5ndGgtMV0mJmMucHVzaChcInJhbmdlXCIpLC0xIT09YS5pbkFycmF5KGIudmFsdWVPZigpLHRoaXMucmFuZ2UpJiZjLnB1c2goXCJzZWxlY3RlZFwiKSxiLnZhbHVlT2YoKT09PXRoaXMucmFuZ2VbMF0mJmMucHVzaChcInJhbmdlLXN0YXJ0XCIpLGIudmFsdWVPZigpPT09dGhpcy5yYW5nZVt0aGlzLnJhbmdlLmxlbmd0aC0xXSYmYy5wdXNoKFwicmFuZ2UtZW5kXCIpKSxjfSxfZmlsbF95ZWFyc1ZpZXc6ZnVuY3Rpb24oYyxkLGUsZixnLGgsaSl7Zm9yKHZhciBqLGssbCxtPVwiXCIsbj1lLzEwLG89dGhpcy5waWNrZXIuZmluZChjKSxwPU1hdGguZmxvb3IoZi9lKSplLHE9cCs5Km4scj1NYXRoLmZsb29yKHRoaXMudmlld0RhdGUuZ2V0RnVsbFllYXIoKS9uKSpuLHM9YS5tYXAodGhpcy5kYXRlcyxmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5mbG9vcihhLmdldFVUQ0Z1bGxZZWFyKCkvbikqbn0pLHQ9cC1uO3Q8PXErbjt0Kz1uKWo9W2RdLGs9bnVsbCx0PT09cC1uP2oucHVzaChcIm9sZFwiKTp0PT09cStuJiZqLnB1c2goXCJuZXdcIiksLTEhPT1hLmluQXJyYXkodCxzKSYmai5wdXNoKFwiYWN0aXZlXCIpLCh0PGd8fHQ+aCkmJmoucHVzaChcImRpc2FibGVkXCIpLHQ9PT1yJiZqLnB1c2goXCJmb2N1c2VkXCIpLGkhPT1hLm5vb3AmJihsPWkobmV3IERhdGUodCwwLDEpKSxsPT09Yj9sPXt9OlwiYm9vbGVhblwiPT10eXBlb2YgbD9sPXtlbmFibGVkOmx9Olwic3RyaW5nXCI9PXR5cGVvZiBsJiYobD17Y2xhc3NlczpsfSksITE9PT1sLmVuYWJsZWQmJmoucHVzaChcImRpc2FibGVkXCIpLGwuY2xhc3NlcyYmKGo9ai5jb25jYXQobC5jbGFzc2VzLnNwbGl0KC9cXHMrLykpKSxsLnRvb2x0aXAmJihrPWwudG9vbHRpcCkpLG0rPSc8c3BhbiBjbGFzcz1cIicrai5qb2luKFwiIFwiKSsnXCInKyhrPycgdGl0bGU9XCInK2srJ1wiJzpcIlwiKStcIj5cIit0K1wiPC9zcGFuPlwiO28uZmluZChcIi5kYXRlcGlja2VyLXN3aXRjaFwiKS50ZXh0KHArXCItXCIrcSksby5maW5kKFwidGRcIikuaHRtbChtKX0sZmlsbDpmdW5jdGlvbigpe3ZhciBlLGYsZz1uZXcgRGF0ZSh0aGlzLnZpZXdEYXRlKSxoPWcuZ2V0VVRDRnVsbFllYXIoKSxpPWcuZ2V0VVRDTW9udGgoKSxqPXRoaXMuby5zdGFydERhdGUhPT0tMS8wP3RoaXMuby5zdGFydERhdGUuZ2V0VVRDRnVsbFllYXIoKTotMS8wLGs9dGhpcy5vLnN0YXJ0RGF0ZSE9PS0xLzA/dGhpcy5vLnN0YXJ0RGF0ZS5nZXRVVENNb250aCgpOi0xLzAsbD10aGlzLm8uZW5kRGF0ZSE9PTEvMD90aGlzLm8uZW5kRGF0ZS5nZXRVVENGdWxsWWVhcigpOjEvMCxtPXRoaXMuby5lbmREYXRlIT09MS8wP3RoaXMuby5lbmREYXRlLmdldFVUQ01vbnRoKCk6MS8wLG49cVt0aGlzLm8ubGFuZ3VhZ2VdLnRvZGF5fHxxLmVuLnRvZGF5fHxcIlwiLG89cVt0aGlzLm8ubGFuZ3VhZ2VdLmNsZWFyfHxxLmVuLmNsZWFyfHxcIlwiLHA9cVt0aGlzLm8ubGFuZ3VhZ2VdLnRpdGxlRm9ybWF0fHxxLmVuLnRpdGxlRm9ybWF0LHM9ZCgpLHQ9KCEwPT09dGhpcy5vLnRvZGF5QnRufHxcImxpbmtlZFwiPT09dGhpcy5vLnRvZGF5QnRuKSYmcz49dGhpcy5vLnN0YXJ0RGF0ZSYmczw9dGhpcy5vLmVuZERhdGUmJiF0aGlzLndlZWtPZkRhdGVJc0Rpc2FibGVkKHMpO2lmKCFpc05hTihoKSYmIWlzTmFOKGkpKXt0aGlzLnBpY2tlci5maW5kKFwiLmRhdGVwaWNrZXItZGF5cyAuZGF0ZXBpY2tlci1zd2l0Y2hcIikudGV4dChyLmZvcm1hdERhdGUoZyxwLHRoaXMuby5sYW5ndWFnZSkpLHRoaXMucGlja2VyLmZpbmQoXCJ0Zm9vdCAudG9kYXlcIikudGV4dChuKS5jc3MoXCJkaXNwbGF5XCIsdD9cInRhYmxlLWNlbGxcIjpcIm5vbmVcIiksdGhpcy5waWNrZXIuZmluZChcInRmb290IC5jbGVhclwiKS50ZXh0KG8pLmNzcyhcImRpc3BsYXlcIiwhMD09PXRoaXMuby5jbGVhckJ0bj9cInRhYmxlLWNlbGxcIjpcIm5vbmVcIiksdGhpcy5waWNrZXIuZmluZChcInRoZWFkIC5kYXRlcGlja2VyLXRpdGxlXCIpLnRleHQodGhpcy5vLnRpdGxlKS5jc3MoXCJkaXNwbGF5XCIsXCJzdHJpbmdcIj09dHlwZW9mIHRoaXMuby50aXRsZSYmXCJcIiE9PXRoaXMuby50aXRsZT9cInRhYmxlLWNlbGxcIjpcIm5vbmVcIiksdGhpcy51cGRhdGVOYXZBcnJvd3MoKSx0aGlzLmZpbGxNb250aHMoKTt2YXIgdT1jKGgsaSwwKSx2PXUuZ2V0VVRDRGF0ZSgpO3Uuc2V0VVRDRGF0ZSh2LSh1LmdldFVUQ0RheSgpLXRoaXMuby53ZWVrU3RhcnQrNyklNyk7dmFyIHc9bmV3IERhdGUodSk7dS5nZXRVVENGdWxsWWVhcigpPDEwMCYmdy5zZXRVVENGdWxsWWVhcih1LmdldFVUQ0Z1bGxZZWFyKCkpLHcuc2V0VVRDRGF0ZSh3LmdldFVUQ0RhdGUoKSs0Miksdz13LnZhbHVlT2YoKTtmb3IodmFyIHgseSx6PVtdO3UudmFsdWVPZigpPHc7KXtpZigoeD11LmdldFVUQ0RheSgpKT09PXRoaXMuby53ZWVrU3RhcnQmJih6LnB1c2goXCI8dHI+XCIpLHRoaXMuby5jYWxlbmRhcldlZWtzKSl7dmFyIEE9bmV3IERhdGUoK3UrKHRoaXMuby53ZWVrU3RhcnQteC03KSU3Kjg2NGU1KSxCPW5ldyBEYXRlKE51bWJlcihBKSsoMTEtQS5nZXRVVENEYXkoKSklNyo4NjRlNSksQz1uZXcgRGF0ZShOdW1iZXIoQz1jKEIuZ2V0VVRDRnVsbFllYXIoKSwwLDEpKSsoMTEtQy5nZXRVVENEYXkoKSklNyo4NjRlNSksRD0oQi1DKS84NjRlNS83KzE7ei5wdXNoKCc8dGQgY2xhc3M9XCJjd1wiPicrRCtcIjwvdGQ+XCIpfXk9dGhpcy5nZXRDbGFzc05hbWVzKHUpLHkucHVzaChcImRheVwiKTt2YXIgRT11LmdldFVUQ0RhdGUoKTt0aGlzLm8uYmVmb3JlU2hvd0RheSE9PWEubm9vcCYmKGY9dGhpcy5vLmJlZm9yZVNob3dEYXkodGhpcy5fdXRjX3RvX2xvY2FsKHUpKSxmPT09Yj9mPXt9OlwiYm9vbGVhblwiPT10eXBlb2YgZj9mPXtlbmFibGVkOmZ9Olwic3RyaW5nXCI9PXR5cGVvZiBmJiYoZj17Y2xhc3NlczpmfSksITE9PT1mLmVuYWJsZWQmJnkucHVzaChcImRpc2FibGVkXCIpLGYuY2xhc3NlcyYmKHk9eS5jb25jYXQoZi5jbGFzc2VzLnNwbGl0KC9cXHMrLykpKSxmLnRvb2x0aXAmJihlPWYudG9vbHRpcCksZi5jb250ZW50JiYoRT1mLmNvbnRlbnQpKSx5PWEuaXNGdW5jdGlvbihhLnVuaXF1ZVNvcnQpP2EudW5pcXVlU29ydCh5KTphLnVuaXF1ZSh5KSx6LnB1c2goJzx0ZCBjbGFzcz1cIicreS5qb2luKFwiIFwiKSsnXCInKyhlPycgdGl0bGU9XCInK2UrJ1wiJzpcIlwiKSsnIGRhdGEtZGF0ZT1cIicrdS5nZXRUaW1lKCkudG9TdHJpbmcoKSsnXCI+JytFK1wiPC90ZD5cIiksZT1udWxsLHg9PT10aGlzLm8ud2Vla0VuZCYmei5wdXNoKFwiPC90cj5cIiksdS5zZXRVVENEYXRlKHUuZ2V0VVRDRGF0ZSgpKzEpfXRoaXMucGlja2VyLmZpbmQoXCIuZGF0ZXBpY2tlci1kYXlzIHRib2R5XCIpLmh0bWwoei5qb2luKFwiXCIpKTt2YXIgRj1xW3RoaXMuby5sYW5ndWFnZV0ubW9udGhzVGl0bGV8fHEuZW4ubW9udGhzVGl0bGV8fFwiTW9udGhzXCIsRz10aGlzLnBpY2tlci5maW5kKFwiLmRhdGVwaWNrZXItbW9udGhzXCIpLmZpbmQoXCIuZGF0ZXBpY2tlci1zd2l0Y2hcIikudGV4dCh0aGlzLm8ubWF4Vmlld01vZGU8Mj9GOmgpLmVuZCgpLmZpbmQoXCJ0Ym9keSBzcGFuXCIpLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO2lmKGEuZWFjaCh0aGlzLmRhdGVzLGZ1bmN0aW9uKGEsYil7Yi5nZXRVVENGdWxsWWVhcigpPT09aCYmRy5lcShiLmdldFVUQ01vbnRoKCkpLmFkZENsYXNzKFwiYWN0aXZlXCIpfSksKGg8anx8aD5sKSYmRy5hZGRDbGFzcyhcImRpc2FibGVkXCIpLGg9PT1qJiZHLnNsaWNlKDAsaykuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKSxoPT09bCYmRy5zbGljZShtKzEpLmFkZENsYXNzKFwiZGlzYWJsZWRcIiksdGhpcy5vLmJlZm9yZVNob3dNb250aCE9PWEubm9vcCl7dmFyIEg9dGhpczthLmVhY2goRyxmdW5jdGlvbihjLGQpe3ZhciBlPW5ldyBEYXRlKGgsYywxKSxmPUguby5iZWZvcmVTaG93TW9udGgoZSk7Zj09PWI/Zj17fTpcImJvb2xlYW5cIj09dHlwZW9mIGY/Zj17ZW5hYmxlZDpmfTpcInN0cmluZ1wiPT10eXBlb2YgZiYmKGY9e2NsYXNzZXM6Zn0pLCExIT09Zi5lbmFibGVkfHxhKGQpLmhhc0NsYXNzKFwiZGlzYWJsZWRcIil8fGEoZCkuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKSxmLmNsYXNzZXMmJmEoZCkuYWRkQ2xhc3MoZi5jbGFzc2VzKSxmLnRvb2x0aXAmJmEoZCkucHJvcChcInRpdGxlXCIsZi50b29sdGlwKX0pfXRoaXMuX2ZpbGxfeWVhcnNWaWV3KFwiLmRhdGVwaWNrZXIteWVhcnNcIixcInllYXJcIiwxMCxoLGosbCx0aGlzLm8uYmVmb3JlU2hvd1llYXIpLHRoaXMuX2ZpbGxfeWVhcnNWaWV3KFwiLmRhdGVwaWNrZXItZGVjYWRlc1wiLFwiZGVjYWRlXCIsMTAwLGgsaixsLHRoaXMuby5iZWZvcmVTaG93RGVjYWRlKSx0aGlzLl9maWxsX3llYXJzVmlldyhcIi5kYXRlcGlja2VyLWNlbnR1cmllc1wiLFwiY2VudHVyeVwiLDFlMyxoLGosbCx0aGlzLm8uYmVmb3JlU2hvd0NlbnR1cnkpfX0sdXBkYXRlTmF2QXJyb3dzOmZ1bmN0aW9uKCl7aWYodGhpcy5fYWxsb3dfdXBkYXRlKXt2YXIgYSxiLGM9bmV3IERhdGUodGhpcy52aWV3RGF0ZSksZD1jLmdldFVUQ0Z1bGxZZWFyKCksZT1jLmdldFVUQ01vbnRoKCksZj10aGlzLm8uc3RhcnREYXRlIT09LTEvMD90aGlzLm8uc3RhcnREYXRlLmdldFVUQ0Z1bGxZZWFyKCk6LTEvMCxnPXRoaXMuby5zdGFydERhdGUhPT0tMS8wP3RoaXMuby5zdGFydERhdGUuZ2V0VVRDTW9udGgoKTotMS8wLGg9dGhpcy5vLmVuZERhdGUhPT0xLzA/dGhpcy5vLmVuZERhdGUuZ2V0VVRDRnVsbFllYXIoKToxLzAsaT10aGlzLm8uZW5kRGF0ZSE9PTEvMD90aGlzLm8uZW5kRGF0ZS5nZXRVVENNb250aCgpOjEvMCxqPTE7c3dpdGNoKHRoaXMudmlld01vZGUpe2Nhc2UgNDpqKj0xMDtjYXNlIDM6aio9MTA7Y2FzZSAyOmoqPTEwO2Nhc2UgMTphPU1hdGguZmxvb3IoZC9qKSpqPD1mLGI9TWF0aC5mbG9vcihkL2opKmoraj5oO2JyZWFrO2Nhc2UgMDphPWQ8PWYmJmU8PWcsYj1kPj1oJiZlPj1pfXRoaXMucGlja2VyLmZpbmQoXCIucHJldlwiKS50b2dnbGVDbGFzcyhcImRpc2FibGVkXCIsYSksdGhpcy5waWNrZXIuZmluZChcIi5uZXh0XCIpLnRvZ2dsZUNsYXNzKFwiZGlzYWJsZWRcIixiKX19LGNsaWNrOmZ1bmN0aW9uKGIpe2IucHJldmVudERlZmF1bHQoKSxiLnN0b3BQcm9wYWdhdGlvbigpO3ZhciBlLGYsZyxoO2U9YShiLnRhcmdldCksZS5oYXNDbGFzcyhcImRhdGVwaWNrZXItc3dpdGNoXCIpJiZ0aGlzLnZpZXdNb2RlIT09dGhpcy5vLm1heFZpZXdNb2RlJiZ0aGlzLnNldFZpZXdNb2RlKHRoaXMudmlld01vZGUrMSksZS5oYXNDbGFzcyhcInRvZGF5XCIpJiYhZS5oYXNDbGFzcyhcImRheVwiKSYmKHRoaXMuc2V0Vmlld01vZGUoMCksdGhpcy5fc2V0RGF0ZShkKCksXCJsaW5rZWRcIj09PXRoaXMuby50b2RheUJ0bj9udWxsOlwidmlld1wiKSksZS5oYXNDbGFzcyhcImNsZWFyXCIpJiZ0aGlzLmNsZWFyRGF0ZXMoKSxlLmhhc0NsYXNzKFwiZGlzYWJsZWRcIil8fChlLmhhc0NsYXNzKFwibW9udGhcIil8fGUuaGFzQ2xhc3MoXCJ5ZWFyXCIpfHxlLmhhc0NsYXNzKFwiZGVjYWRlXCIpfHxlLmhhc0NsYXNzKFwiY2VudHVyeVwiKSkmJih0aGlzLnZpZXdEYXRlLnNldFVUQ0RhdGUoMSksZj0xLDE9PT10aGlzLnZpZXdNb2RlPyhoPWUucGFyZW50KCkuZmluZChcInNwYW5cIikuaW5kZXgoZSksZz10aGlzLnZpZXdEYXRlLmdldFVUQ0Z1bGxZZWFyKCksdGhpcy52aWV3RGF0ZS5zZXRVVENNb250aChoKSk6KGg9MCxnPU51bWJlcihlLnRleHQoKSksdGhpcy52aWV3RGF0ZS5zZXRVVENGdWxsWWVhcihnKSksdGhpcy5fdHJpZ2dlcihyLnZpZXdNb2Rlc1t0aGlzLnZpZXdNb2RlLTFdLmUsdGhpcy52aWV3RGF0ZSksdGhpcy52aWV3TW9kZT09PXRoaXMuby5taW5WaWV3TW9kZT90aGlzLl9zZXREYXRlKGMoZyxoLGYpKToodGhpcy5zZXRWaWV3TW9kZSh0aGlzLnZpZXdNb2RlLTEpLHRoaXMuZmlsbCgpKSksdGhpcy5waWNrZXIuaXMoXCI6dmlzaWJsZVwiKSYmdGhpcy5fZm9jdXNlZF9mcm9tJiZ0aGlzLl9mb2N1c2VkX2Zyb20uZm9jdXMoKSxkZWxldGUgdGhpcy5fZm9jdXNlZF9mcm9tfSxkYXlDZWxsQ2xpY2s6ZnVuY3Rpb24oYil7dmFyIGM9YShiLmN1cnJlbnRUYXJnZXQpLGQ9Yy5kYXRhKFwiZGF0ZVwiKSxlPW5ldyBEYXRlKGQpO3RoaXMuby51cGRhdGVWaWV3RGF0ZSYmKGUuZ2V0VVRDRnVsbFllYXIoKSE9PXRoaXMudmlld0RhdGUuZ2V0VVRDRnVsbFllYXIoKSYmdGhpcy5fdHJpZ2dlcihcImNoYW5nZVllYXJcIix0aGlzLnZpZXdEYXRlKSxlLmdldFVUQ01vbnRoKCkhPT10aGlzLnZpZXdEYXRlLmdldFVUQ01vbnRoKCkmJnRoaXMuX3RyaWdnZXIoXCJjaGFuZ2VNb250aFwiLHRoaXMudmlld0RhdGUpKSx0aGlzLl9zZXREYXRlKGUpfSxuYXZBcnJvd3NDbGljazpmdW5jdGlvbihiKXt2YXIgYz1hKGIuY3VycmVudFRhcmdldCksZD1jLmhhc0NsYXNzKFwicHJldlwiKT8tMToxOzAhPT10aGlzLnZpZXdNb2RlJiYoZCo9MTIqci52aWV3TW9kZXNbdGhpcy52aWV3TW9kZV0ubmF2U3RlcCksdGhpcy52aWV3RGF0ZT10aGlzLm1vdmVNb250aCh0aGlzLnZpZXdEYXRlLGQpLHRoaXMuX3RyaWdnZXIoci52aWV3TW9kZXNbdGhpcy52aWV3TW9kZV0uZSx0aGlzLnZpZXdEYXRlKSx0aGlzLmZpbGwoKX0sX3RvZ2dsZV9tdWx0aWRhdGU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5kYXRlcy5jb250YWlucyhhKTtpZihhfHx0aGlzLmRhdGVzLmNsZWFyKCksLTEhPT1iPyghMD09PXRoaXMuby5tdWx0aWRhdGV8fHRoaXMuby5tdWx0aWRhdGU+MXx8dGhpcy5vLnRvZ2dsZUFjdGl2ZSkmJnRoaXMuZGF0ZXMucmVtb3ZlKGIpOiExPT09dGhpcy5vLm11bHRpZGF0ZT8odGhpcy5kYXRlcy5jbGVhcigpLHRoaXMuZGF0ZXMucHVzaChhKSk6dGhpcy5kYXRlcy5wdXNoKGEpLFwibnVtYmVyXCI9PXR5cGVvZiB0aGlzLm8ubXVsdGlkYXRlKWZvcig7dGhpcy5kYXRlcy5sZW5ndGg+dGhpcy5vLm11bHRpZGF0ZTspdGhpcy5kYXRlcy5yZW1vdmUoMCl9LF9zZXREYXRlOmZ1bmN0aW9uKGEsYil7YiYmXCJkYXRlXCIhPT1ifHx0aGlzLl90b2dnbGVfbXVsdGlkYXRlKGEmJm5ldyBEYXRlKGEpKSwoIWImJnRoaXMuby51cGRhdGVWaWV3RGF0ZXx8XCJ2aWV3XCI9PT1iKSYmKHRoaXMudmlld0RhdGU9YSYmbmV3IERhdGUoYSkpLHRoaXMuZmlsbCgpLHRoaXMuc2V0VmFsdWUoKSxiJiZcInZpZXdcIj09PWJ8fHRoaXMuX3RyaWdnZXIoXCJjaGFuZ2VEYXRlXCIpLHRoaXMuaW5wdXRGaWVsZC50cmlnZ2VyKFwiY2hhbmdlXCIpLCF0aGlzLm8uYXV0b2Nsb3NlfHxiJiZcImRhdGVcIiE9PWJ8fHRoaXMuaGlkZSgpfSxtb3ZlRGF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IERhdGUoYSk7cmV0dXJuIGMuc2V0VVRDRGF0ZShhLmdldFVUQ0RhdGUoKStiKSxjfSxtb3ZlV2VlazpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdmVEYXkoYSw3KmIpfSxtb3ZlTW9udGg6ZnVuY3Rpb24oYSxiKXtpZighZyhhKSlyZXR1cm4gdGhpcy5vLmRlZmF1bHRWaWV3RGF0ZTtpZighYilyZXR1cm4gYTt2YXIgYyxkLGU9bmV3IERhdGUoYS52YWx1ZU9mKCkpLGY9ZS5nZXRVVENEYXRlKCksaD1lLmdldFVUQ01vbnRoKCksaT1NYXRoLmFicyhiKTtpZihiPWI+MD8xOi0xLDE9PT1pKWQ9LTE9PT1iP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZ2V0VVRDTW9udGgoKT09PWh9OmZ1bmN0aW9uKCl7cmV0dXJuIGUuZ2V0VVRDTW9udGgoKSE9PWN9LGM9aCtiLGUuc2V0VVRDTW9udGgoYyksYz0oYysxMiklMTI7ZWxzZXtmb3IodmFyIGo9MDtqPGk7aisrKWU9dGhpcy5tb3ZlTW9udGgoZSxiKTtjPWUuZ2V0VVRDTW9udGgoKSxlLnNldFVUQ0RhdGUoZiksZD1mdW5jdGlvbigpe3JldHVybiBjIT09ZS5nZXRVVENNb250aCgpfX1mb3IoO2QoKTspZS5zZXRVVENEYXRlKC0tZiksZS5zZXRVVENNb250aChjKTtyZXR1cm4gZX0sbW92ZVllYXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3ZlTW9udGgoYSwxMipiKX0sbW92ZUF2YWlsYWJsZURhdGU6ZnVuY3Rpb24oYSxiLGMpe2Rve2lmKGE9dGhpc1tjXShhLGIpLCF0aGlzLmRhdGVXaXRoaW5SYW5nZShhKSlyZXR1cm4hMTtjPVwibW92ZURheVwifXdoaWxlKHRoaXMuZGF0ZUlzRGlzYWJsZWQoYSkpO3JldHVybiBhfSx3ZWVrT2ZEYXRlSXNEaXNhYmxlZDpmdW5jdGlvbihiKXtyZXR1cm4tMSE9PWEuaW5BcnJheShiLmdldFVUQ0RheSgpLHRoaXMuby5kYXlzT2ZXZWVrRGlzYWJsZWQpfSxkYXRlSXNEaXNhYmxlZDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy53ZWVrT2ZEYXRlSXNEaXNhYmxlZChiKXx8YS5ncmVwKHRoaXMuby5kYXRlc0Rpc2FibGVkLGZ1bmN0aW9uKGEpe3JldHVybiBlKGIsYSl9KS5sZW5ndGg+MH0sZGF0ZVdpdGhpblJhbmdlOmZ1bmN0aW9uKGEpe3JldHVybiBhPj10aGlzLm8uc3RhcnREYXRlJiZhPD10aGlzLm8uZW5kRGF0ZX0sa2V5ZG93bjpmdW5jdGlvbihhKXtpZighdGhpcy5waWNrZXIuaXMoXCI6dmlzaWJsZVwiKSlyZXR1cm4gdm9pZCg0MCE9PWEua2V5Q29kZSYmMjchPT1hLmtleUNvZGV8fCh0aGlzLnNob3coKSxhLnN0b3BQcm9wYWdhdGlvbigpKSk7dmFyIGIsYyxkPSExLGU9dGhpcy5mb2N1c0RhdGV8fHRoaXMudmlld0RhdGU7c3dpdGNoKGEua2V5Q29kZSl7Y2FzZSAyNzp0aGlzLmZvY3VzRGF0ZT8odGhpcy5mb2N1c0RhdGU9bnVsbCx0aGlzLnZpZXdEYXRlPXRoaXMuZGF0ZXMuZ2V0KC0xKXx8dGhpcy52aWV3RGF0ZSx0aGlzLmZpbGwoKSk6dGhpcy5oaWRlKCksYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcFByb3BhZ2F0aW9uKCk7YnJlYWs7Y2FzZSAzNzpjYXNlIDM4OmNhc2UgMzk6Y2FzZSA0MDppZighdGhpcy5vLmtleWJvYXJkTmF2aWdhdGlvbnx8Nz09PXRoaXMuby5kYXlzT2ZXZWVrRGlzYWJsZWQubGVuZ3RoKWJyZWFrO2I9Mzc9PT1hLmtleUNvZGV8fDM4PT09YS5rZXlDb2RlPy0xOjEsMD09PXRoaXMudmlld01vZGU/YS5jdHJsS2V5PyhjPXRoaXMubW92ZUF2YWlsYWJsZURhdGUoZSxiLFwibW92ZVllYXJcIikpJiZ0aGlzLl90cmlnZ2VyKFwiY2hhbmdlWWVhclwiLHRoaXMudmlld0RhdGUpOmEuc2hpZnRLZXk/KGM9dGhpcy5tb3ZlQXZhaWxhYmxlRGF0ZShlLGIsXCJtb3ZlTW9udGhcIikpJiZ0aGlzLl90cmlnZ2VyKFwiY2hhbmdlTW9udGhcIix0aGlzLnZpZXdEYXRlKTozNz09PWEua2V5Q29kZXx8Mzk9PT1hLmtleUNvZGU/Yz10aGlzLm1vdmVBdmFpbGFibGVEYXRlKGUsYixcIm1vdmVEYXlcIik6dGhpcy53ZWVrT2ZEYXRlSXNEaXNhYmxlZChlKXx8KGM9dGhpcy5tb3ZlQXZhaWxhYmxlRGF0ZShlLGIsXCJtb3ZlV2Vla1wiKSk6MT09PXRoaXMudmlld01vZGU/KDM4IT09YS5rZXlDb2RlJiY0MCE9PWEua2V5Q29kZXx8KGIqPTQpLGM9dGhpcy5tb3ZlQXZhaWxhYmxlRGF0ZShlLGIsXCJtb3ZlTW9udGhcIikpOjI9PT10aGlzLnZpZXdNb2RlJiYoMzghPT1hLmtleUNvZGUmJjQwIT09YS5rZXlDb2RlfHwoYio9NCksYz10aGlzLm1vdmVBdmFpbGFibGVEYXRlKGUsYixcIm1vdmVZZWFyXCIpKSxjJiYodGhpcy5mb2N1c0RhdGU9dGhpcy52aWV3RGF0ZT1jLHRoaXMuc2V0VmFsdWUoKSx0aGlzLmZpbGwoKSxhLnByZXZlbnREZWZhdWx0KCkpO2JyZWFrO2Nhc2UgMTM6aWYoIXRoaXMuby5mb3JjZVBhcnNlKWJyZWFrO2U9dGhpcy5mb2N1c0RhdGV8fHRoaXMuZGF0ZXMuZ2V0KC0xKXx8dGhpcy52aWV3RGF0ZSx0aGlzLm8ua2V5Ym9hcmROYXZpZ2F0aW9uJiYodGhpcy5fdG9nZ2xlX211bHRpZGF0ZShlKSxkPSEwKSx0aGlzLmZvY3VzRGF0ZT1udWxsLHRoaXMudmlld0RhdGU9dGhpcy5kYXRlcy5nZXQoLTEpfHx0aGlzLnZpZXdEYXRlLHRoaXMuc2V0VmFsdWUoKSx0aGlzLmZpbGwoKSx0aGlzLnBpY2tlci5pcyhcIjp2aXNpYmxlXCIpJiYoYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5vLmF1dG9jbG9zZSYmdGhpcy5oaWRlKCkpO2JyZWFrO2Nhc2UgOTp0aGlzLmZvY3VzRGF0ZT1udWxsLHRoaXMudmlld0RhdGU9dGhpcy5kYXRlcy5nZXQoLTEpfHx0aGlzLnZpZXdEYXRlLHRoaXMuZmlsbCgpLHRoaXMuaGlkZSgpfWQmJih0aGlzLmRhdGVzLmxlbmd0aD90aGlzLl90cmlnZ2VyKFwiY2hhbmdlRGF0ZVwiKTp0aGlzLl90cmlnZ2VyKFwiY2xlYXJEYXRlXCIpLHRoaXMuaW5wdXRGaWVsZC50cmlnZ2VyKFwiY2hhbmdlXCIpKX0sc2V0Vmlld01vZGU6ZnVuY3Rpb24oYSl7dGhpcy52aWV3TW9kZT1hLHRoaXMucGlja2VyLmNoaWxkcmVuKFwiZGl2XCIpLmhpZGUoKS5maWx0ZXIoXCIuZGF0ZXBpY2tlci1cIityLnZpZXdNb2Rlc1t0aGlzLnZpZXdNb2RlXS5jbHNOYW1lKS5zaG93KCksdGhpcy51cGRhdGVOYXZBcnJvd3MoKSx0aGlzLl90cmlnZ2VyKFwiY2hhbmdlVmlld01vZGVcIixuZXcgRGF0ZSh0aGlzLnZpZXdEYXRlKSl9fTt2YXIgbD1mdW5jdGlvbihiLGMpe2EuZGF0YShiLFwiZGF0ZXBpY2tlclwiLHRoaXMpLHRoaXMuZWxlbWVudD1hKGIpLHRoaXMuaW5wdXRzPWEubWFwKGMuaW5wdXRzLGZ1bmN0aW9uKGEpe3JldHVybiBhLmpxdWVyeT9hWzBdOmF9KSxkZWxldGUgYy5pbnB1dHMsdGhpcy5rZWVwRW1wdHlWYWx1ZXM9Yy5rZWVwRW1wdHlWYWx1ZXMsZGVsZXRlIGMua2VlcEVtcHR5VmFsdWVzLG4uY2FsbChhKHRoaXMuaW5wdXRzKSxjKS5vbihcImNoYW5nZURhdGVcIixhLnByb3h5KHRoaXMuZGF0ZVVwZGF0ZWQsdGhpcykpLHRoaXMucGlja2Vycz1hLm1hcCh0aGlzLmlucHV0cyxmdW5jdGlvbihiKXtyZXR1cm4gYS5kYXRhKGIsXCJkYXRlcGlja2VyXCIpfSksdGhpcy51cGRhdGVEYXRlcygpfTtsLnByb3RvdHlwZT17dXBkYXRlRGF0ZXM6ZnVuY3Rpb24oKXt0aGlzLmRhdGVzPWEubWFwKHRoaXMucGlja2VycyxmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRVVENEYXRlKCl9KSx0aGlzLnVwZGF0ZVJhbmdlcygpfSx1cGRhdGVSYW5nZXM6ZnVuY3Rpb24oKXt2YXIgYj1hLm1hcCh0aGlzLmRhdGVzLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlT2YoKX0pO2EuZWFjaCh0aGlzLnBpY2tlcnMsZnVuY3Rpb24oYSxjKXtjLnNldFJhbmdlKGIpfSl9LGNsZWFyRGF0ZXM6ZnVuY3Rpb24oKXthLmVhY2godGhpcy5waWNrZXJzLGZ1bmN0aW9uKGEsYil7Yi5jbGVhckRhdGVzKCl9KX0sZGF0ZVVwZGF0ZWQ6ZnVuY3Rpb24oYyl7aWYoIXRoaXMudXBkYXRpbmcpe3RoaXMudXBkYXRpbmc9ITA7dmFyIGQ9YS5kYXRhKGMudGFyZ2V0LFwiZGF0ZXBpY2tlclwiKTtpZihkIT09Yil7dmFyIGU9ZC5nZXRVVENEYXRlKCksZj10aGlzLmtlZXBFbXB0eVZhbHVlcyxnPWEuaW5BcnJheShjLnRhcmdldCx0aGlzLmlucHV0cyksaD1nLTEsaT1nKzEsaj10aGlzLmlucHV0cy5sZW5ndGg7aWYoLTEhPT1nKXtpZihhLmVhY2godGhpcy5waWNrZXJzLGZ1bmN0aW9uKGEsYil7Yi5nZXRVVENEYXRlKCl8fGIhPT1kJiZmfHxiLnNldFVUQ0RhdGUoZSl9KSxlPHRoaXMuZGF0ZXNbaF0pZm9yKDtoPj0wJiZlPHRoaXMuZGF0ZXNbaF07KXRoaXMucGlja2Vyc1toLS1dLnNldFVUQ0RhdGUoZSk7ZWxzZSBpZihlPnRoaXMuZGF0ZXNbaV0pZm9yKDtpPGomJmU+dGhpcy5kYXRlc1tpXTspdGhpcy5waWNrZXJzW2krK10uc2V0VVRDRGF0ZShlKTt0aGlzLnVwZGF0ZURhdGVzKCksZGVsZXRlIHRoaXMudXBkYXRpbmd9fX19LGRlc3Ryb3k6ZnVuY3Rpb24oKXthLm1hcCh0aGlzLnBpY2tlcnMsZnVuY3Rpb24oYSl7YS5kZXN0cm95KCl9KSxhKHRoaXMuaW5wdXRzKS5vZmYoXCJjaGFuZ2VEYXRlXCIsdGhpcy5kYXRlVXBkYXRlZCksZGVsZXRlIHRoaXMuZWxlbWVudC5kYXRhKCkuZGF0ZXBpY2tlcn0scmVtb3ZlOmYoXCJkZXN0cm95XCIsXCJNZXRob2QgYHJlbW92ZWAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHZlcnNpb24gMi4wLiBVc2UgYGRlc3Ryb3lgIGluc3RlYWRcIil9O3ZhciBtPWEuZm4uZGF0ZXBpY2tlcixuPWZ1bmN0aW9uKGMpe3ZhciBkPUFycmF5LmFwcGx5KG51bGwsYXJndW1lbnRzKTtkLnNoaWZ0KCk7dmFyIGU7aWYodGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKSxmPWIuZGF0YShcImRhdGVwaWNrZXJcIiksZz1cIm9iamVjdFwiPT10eXBlb2YgYyYmYztpZighZil7dmFyIGo9aCh0aGlzLFwiZGF0ZVwiKSxtPWEuZXh0ZW5kKHt9LG8saixnKSxuPWkobS5sYW5ndWFnZSkscD1hLmV4dGVuZCh7fSxvLG4saixnKTtiLmhhc0NsYXNzKFwiaW5wdXQtZGF0ZXJhbmdlXCIpfHxwLmlucHV0cz8oYS5leHRlbmQocCx7aW5wdXRzOnAuaW5wdXRzfHxiLmZpbmQoXCJpbnB1dFwiKS50b0FycmF5KCl9KSxmPW5ldyBsKHRoaXMscCkpOmY9bmV3IGsodGhpcyxwKSxiLmRhdGEoXCJkYXRlcGlja2VyXCIsZil9XCJzdHJpbmdcIj09dHlwZW9mIGMmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGZbY10mJihlPWZbY10uYXBwbHkoZixkKSl9KSxlPT09Ynx8ZSBpbnN0YW5jZW9mIGt8fGUgaW5zdGFuY2VvZiBsKXJldHVybiB0aGlzO2lmKHRoaXMubGVuZ3RoPjEpdGhyb3cgbmV3IEVycm9yKFwiVXNpbmcgb25seSBhbGxvd2VkIGZvciB0aGUgY29sbGVjdGlvbiBvZiBhIHNpbmdsZSBlbGVtZW50IChcIitjK1wiIGZ1bmN0aW9uKVwiKTtyZXR1cm4gZX07YS5mbi5kYXRlcGlja2VyPW47dmFyIG89YS5mbi5kYXRlcGlja2VyLmRlZmF1bHRzPXthc3N1bWVOZWFyYnlZZWFyOiExLGF1dG9jbG9zZTohMSxiZWZvcmVTaG93RGF5OmEubm9vcCxiZWZvcmVTaG93TW9udGg6YS5ub29wLGJlZm9yZVNob3dZZWFyOmEubm9vcCxiZWZvcmVTaG93RGVjYWRlOmEubm9vcCxiZWZvcmVTaG93Q2VudHVyeTphLm5vb3AsY2FsZW5kYXJXZWVrczohMSxjbGVhckJ0bjohMSx0b2dnbGVBY3RpdmU6ITEsZGF5c09mV2Vla0Rpc2FibGVkOltdLGRheXNPZldlZWtIaWdobGlnaHRlZDpbXSxkYXRlc0Rpc2FibGVkOltdLGVuZERhdGU6MS8wLGZvcmNlUGFyc2U6ITAsZm9ybWF0OlwibW0vZGQveXl5eVwiLGtlZXBFbXB0eVZhbHVlczohMSxrZXlib2FyZE5hdmlnYXRpb246ITAsbGFuZ3VhZ2U6XCJlblwiLG1pblZpZXdNb2RlOjAsbWF4Vmlld01vZGU6NCxtdWx0aWRhdGU6ITEsbXVsdGlkYXRlU2VwYXJhdG9yOlwiLFwiLG9yaWVudGF0aW9uOlwiYXV0b1wiLHJ0bDohMSxzdGFydERhdGU6LTEvMCxzdGFydFZpZXc6MCx0b2RheUJ0bjohMSx0b2RheUhpZ2hsaWdodDohMSx1cGRhdGVWaWV3RGF0ZTohMCx3ZWVrU3RhcnQ6MCxkaXNhYmxlVG91Y2hLZXlib2FyZDohMSxlbmFibGVPblJlYWRvbmx5OiEwLHNob3dPbkZvY3VzOiEwLHpJbmRleE9mZnNldDoxMCxjb250YWluZXI6XCJib2R5XCIsaW1tZWRpYXRlVXBkYXRlczohMSx0aXRsZTpcIlwiLHRlbXBsYXRlczp7bGVmdEFycm93OlwiJiN4MDBBQjtcIixyaWdodEFycm93OlwiJiN4MDBCQjtcIn0sc2hvd1dlZWtEYXlzOiEwfSxwPWEuZm4uZGF0ZXBpY2tlci5sb2NhbGVfb3B0cz1bXCJmb3JtYXRcIixcInJ0bFwiLFwid2Vla1N0YXJ0XCJdO2EuZm4uZGF0ZXBpY2tlci5Db25zdHJ1Y3Rvcj1rO3ZhciBxPWEuZm4uZGF0ZXBpY2tlci5kYXRlcz17ZW46e2RheXM6W1wiU3VuZGF5XCIsXCJNb25kYXlcIixcIlR1ZXNkYXlcIixcIldlZG5lc2RheVwiLFwiVGh1cnNkYXlcIixcIkZyaWRheVwiLFwiU2F0dXJkYXlcIl0sZGF5c1Nob3J0OltcIlN1blwiLFwiTW9uXCIsXCJUdWVcIixcIldlZFwiLFwiVGh1XCIsXCJGcmlcIixcIlNhdFwiXSxkYXlzTWluOltcIlN1XCIsXCJNb1wiLFwiVHVcIixcIldlXCIsXCJUaFwiLFwiRnJcIixcIlNhXCJdLG1vbnRoczpbXCJKYW51YXJ5XCIsXCJGZWJydWFyeVwiLFwiTWFyY2hcIixcIkFwcmlsXCIsXCJNYXlcIixcIkp1bmVcIixcIkp1bHlcIixcIkF1Z3VzdFwiLFwiU2VwdGVtYmVyXCIsXCJPY3RvYmVyXCIsXCJOb3ZlbWJlclwiLFwiRGVjZW1iZXJcIl0sbW9udGhzU2hvcnQ6W1wiSmFuXCIsXCJGZWJcIixcIk1hclwiLFwiQXByXCIsXCJNYXlcIixcIkp1blwiLFwiSnVsXCIsXCJBdWdcIixcIlNlcFwiLFwiT2N0XCIsXCJOb3ZcIixcIkRlY1wiXSx0b2RheTpcIlRvZGF5XCIsY2xlYXI6XCJDbGVhclwiLHRpdGxlRm9ybWF0OlwiTU0geXl5eVwifX0scj17dmlld01vZGVzOlt7bmFtZXM6W1wiZGF5c1wiLFwibW9udGhcIl0sY2xzTmFtZTpcImRheXNcIixlOlwiY2hhbmdlTW9udGhcIn0se25hbWVzOltcIm1vbnRoc1wiLFwieWVhclwiXSxjbHNOYW1lOlwibW9udGhzXCIsZTpcImNoYW5nZVllYXJcIixuYXZTdGVwOjF9LHtuYW1lczpbXCJ5ZWFyc1wiLFwiZGVjYWRlXCJdLGNsc05hbWU6XCJ5ZWFyc1wiLGU6XCJjaGFuZ2VEZWNhZGVcIixuYXZTdGVwOjEwfSx7bmFtZXM6W1wiZGVjYWRlc1wiLFwiY2VudHVyeVwiXSxjbHNOYW1lOlwiZGVjYWRlc1wiLGU6XCJjaGFuZ2VDZW50dXJ5XCIsbmF2U3RlcDoxMDB9LHtuYW1lczpbXCJjZW50dXJpZXNcIixcIm1pbGxlbm5pdW1cIl0sY2xzTmFtZTpcImNlbnR1cmllc1wiLGU6XCJjaGFuZ2VNaWxsZW5uaXVtXCIsbmF2U3RlcDoxZTN9XSx2YWxpZFBhcnRzOi9kZD98REQ/fG1tP3xNTT98eXkoPzp5eSk/L2csbm9ucHVuY3R1YXRpb246L1teIC1cXC86LUBcXHU1ZTc0XFx1NjcwOFxcdTY1ZTVcXFstYHstflxcdFxcblxccl0rL2cscGFyc2VGb3JtYXQ6ZnVuY3Rpb24oYSl7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgYS50b1ZhbHVlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLnRvRGlzcGxheSlyZXR1cm4gYTt2YXIgYj1hLnJlcGxhY2UodGhpcy52YWxpZFBhcnRzLFwiXFwwXCIpLnNwbGl0KFwiXFwwXCIpLGM9YS5tYXRjaCh0aGlzLnZhbGlkUGFydHMpO2lmKCFifHwhYi5sZW5ndGh8fCFjfHwwPT09Yy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkYXRlIGZvcm1hdC5cIik7cmV0dXJue3NlcGFyYXRvcnM6YixwYXJ0czpjfX0scGFyc2VEYXRlOmZ1bmN0aW9uKGMsZSxmLGcpe2Z1bmN0aW9uIGgoYSxiKXtyZXR1cm4hMD09PWImJihiPTEwKSxhPDEwMCYmKGErPTJlMyk+KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpK2ImJihhLT0xMDApLGF9ZnVuY3Rpb24gaSgpe3ZhciBhPXRoaXMuc2xpY2UoMCxqW25dLmxlbmd0aCksYj1qW25dLnNsaWNlKDAsYS5sZW5ndGgpO3JldHVybiBhLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9aWYoIWMpcmV0dXJuIGI7aWYoYyBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIGM7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUmJihlPXIucGFyc2VGb3JtYXQoZSkpLGUudG9WYWx1ZSlyZXR1cm4gZS50b1ZhbHVlKGMsZSxmKTt2YXIgaixsLG0sbixvLHA9e2Q6XCJtb3ZlRGF5XCIsbTpcIm1vdmVNb250aFwiLHc6XCJtb3ZlV2Vla1wiLHk6XCJtb3ZlWWVhclwifSxzPXt5ZXN0ZXJkYXk6XCItMWRcIix0b2RheTpcIiswZFwiLHRvbW9ycm93OlwiKzFkXCJ9O2lmKGMgaW4gcyYmKGM9c1tjXSksL15bXFwtK11cXGQrW2Rtd3ldKFtcXHMsXStbXFwtK11cXGQrW2Rtd3ldKSokL2kudGVzdChjKSl7Zm9yKGo9Yy5tYXRjaCgvKFtcXC0rXVxcZCspKFtkbXd5XSkvZ2kpLGM9bmV3IERhdGUsbj0wO248ai5sZW5ndGg7bisrKWw9altuXS5tYXRjaCgvKFtcXC0rXVxcZCspKFtkbXd5XSkvaSksbT1OdW1iZXIobFsxXSksbz1wW2xbMl0udG9Mb3dlckNhc2UoKV0sYz1rLnByb3RvdHlwZVtvXShjLG0pO3JldHVybiBrLnByb3RvdHlwZS5femVyb191dGNfdGltZShjKX1qPWMmJmMubWF0Y2godGhpcy5ub25wdW5jdHVhdGlvbil8fFtdO3ZhciB0LHUsdj17fSx3PVtcInl5eXlcIixcInl5XCIsXCJNXCIsXCJNTVwiLFwibVwiLFwibW1cIixcImRcIixcImRkXCJdLHg9e3l5eXk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zZXRVVENGdWxsWWVhcihnP2goYixnKTpiKX0sbTpmdW5jdGlvbihhLGIpe2lmKGlzTmFOKGEpKXJldHVybiBhO2ZvcihiLT0xO2I8MDspYis9MTI7Zm9yKGIlPTEyLGEuc2V0VVRDTW9udGgoYik7YS5nZXRVVENNb250aCgpIT09YjspYS5zZXRVVENEYXRlKGEuZ2V0VVRDRGF0ZSgpLTEpO3JldHVybiBhfSxkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc2V0VVRDRGF0ZShiKX19O3gueXk9eC55eXl5LHguTT14Lk1NPXgubW09eC5tLHguZGQ9eC5kLGM9ZCgpO3ZhciB5PWUucGFydHMuc2xpY2UoKTtpZihqLmxlbmd0aCE9PXkubGVuZ3RoJiYoeT1hKHkpLmZpbHRlcihmdW5jdGlvbihiLGMpe3JldHVybi0xIT09YS5pbkFycmF5KGMsdyl9KS50b0FycmF5KCkpLGoubGVuZ3RoPT09eS5sZW5ndGgpe3ZhciB6O2ZvcihuPTAsej15Lmxlbmd0aDtuPHo7bisrKXtpZih0PXBhcnNlSW50KGpbbl0sMTApLGw9eVtuXSxpc05hTih0KSlzd2l0Y2gobCl7Y2FzZVwiTU1cIjp1PWEocVtmXS5tb250aHMpLmZpbHRlcihpKSx0PWEuaW5BcnJheSh1WzBdLHFbZl0ubW9udGhzKSsxO2JyZWFrO2Nhc2VcIk1cIjp1PWEocVtmXS5tb250aHNTaG9ydCkuZmlsdGVyKGkpLHQ9YS5pbkFycmF5KHVbMF0scVtmXS5tb250aHNTaG9ydCkrMX12W2xdPXR9dmFyIEEsQjtmb3Iobj0wO248dy5sZW5ndGg7bisrKShCPXdbbl0paW4gdiYmIWlzTmFOKHZbQl0pJiYoQT1uZXcgRGF0ZShjKSx4W0JdKEEsdltCXSksaXNOYU4oQSl8fChjPUEpKX1yZXR1cm4gY30sZm9ybWF0RGF0ZTpmdW5jdGlvbihiLGMsZCl7aWYoIWIpcmV0dXJuXCJcIjtpZihcInN0cmluZ1wiPT10eXBlb2YgYyYmKGM9ci5wYXJzZUZvcm1hdChjKSksYy50b0Rpc3BsYXkpcmV0dXJuIGMudG9EaXNwbGF5KGIsYyxkKTt2YXIgZT17ZDpiLmdldFVUQ0RhdGUoKSxEOnFbZF0uZGF5c1Nob3J0W2IuZ2V0VVRDRGF5KCldLEREOnFbZF0uZGF5c1tiLmdldFVUQ0RheSgpXSxtOmIuZ2V0VVRDTW9udGgoKSsxLE06cVtkXS5tb250aHNTaG9ydFtiLmdldFVUQ01vbnRoKCldLE1NOnFbZF0ubW9udGhzW2IuZ2V0VVRDTW9udGgoKV0seXk6Yi5nZXRVVENGdWxsWWVhcigpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpLHl5eXk6Yi5nZXRVVENGdWxsWWVhcigpfTtlLmRkPShlLmQ8MTA/XCIwXCI6XCJcIikrZS5kLGUubW09KGUubTwxMD9cIjBcIjpcIlwiKStlLm0sYj1bXTtmb3IodmFyIGY9YS5leHRlbmQoW10sYy5zZXBhcmF0b3JzKSxnPTAsaD1jLnBhcnRzLmxlbmd0aDtnPD1oO2crKylmLmxlbmd0aCYmYi5wdXNoKGYuc2hpZnQoKSksYi5wdXNoKGVbYy5wYXJ0c1tnXV0pO3JldHVybiBiLmpvaW4oXCJcIil9LFxuaGVhZFRlbXBsYXRlOic8dGhlYWQ+PHRyPjx0aCBjb2xzcGFuPVwiN1wiIGNsYXNzPVwiZGF0ZXBpY2tlci10aXRsZVwiPjwvdGg+PC90cj48dHI+PHRoIGNsYXNzPVwicHJldlwiPicrby50ZW1wbGF0ZXMubGVmdEFycm93Kyc8L3RoPjx0aCBjb2xzcGFuPVwiNVwiIGNsYXNzPVwiZGF0ZXBpY2tlci1zd2l0Y2hcIj48L3RoPjx0aCBjbGFzcz1cIm5leHRcIj4nK28udGVtcGxhdGVzLnJpZ2h0QXJyb3crXCI8L3RoPjwvdHI+PC90aGVhZD5cIixjb250VGVtcGxhdGU6Jzx0Ym9keT48dHI+PHRkIGNvbHNwYW49XCI3XCI+PC90ZD48L3RyPjwvdGJvZHk+Jyxmb290VGVtcGxhdGU6Jzx0Zm9vdD48dHI+PHRoIGNvbHNwYW49XCI3XCIgY2xhc3M9XCJ0b2RheVwiPjwvdGg+PC90cj48dHI+PHRoIGNvbHNwYW49XCI3XCIgY2xhc3M9XCJjbGVhclwiPjwvdGg+PC90cj48L3Rmb290Pid9O3IudGVtcGxhdGU9JzxkaXYgY2xhc3M9XCJkYXRlcGlja2VyXCI+PGRpdiBjbGFzcz1cImRhdGVwaWNrZXItZGF5c1wiPjx0YWJsZSBjbGFzcz1cInRhYmxlLWNvbmRlbnNlZFwiPicrci5oZWFkVGVtcGxhdGUrXCI8dGJvZHk+PC90Ym9keT5cIityLmZvb3RUZW1wbGF0ZSsnPC90YWJsZT48L2Rpdj48ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlci1tb250aHNcIj48dGFibGUgY2xhc3M9XCJ0YWJsZS1jb25kZW5zZWRcIj4nK3IuaGVhZFRlbXBsYXRlK3IuY29udFRlbXBsYXRlK3IuZm9vdFRlbXBsYXRlKyc8L3RhYmxlPjwvZGl2PjxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLXllYXJzXCI+PHRhYmxlIGNsYXNzPVwidGFibGUtY29uZGVuc2VkXCI+JytyLmhlYWRUZW1wbGF0ZStyLmNvbnRUZW1wbGF0ZStyLmZvb3RUZW1wbGF0ZSsnPC90YWJsZT48L2Rpdj48ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlci1kZWNhZGVzXCI+PHRhYmxlIGNsYXNzPVwidGFibGUtY29uZGVuc2VkXCI+JytyLmhlYWRUZW1wbGF0ZStyLmNvbnRUZW1wbGF0ZStyLmZvb3RUZW1wbGF0ZSsnPC90YWJsZT48L2Rpdj48ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlci1jZW50dXJpZXNcIj48dGFibGUgY2xhc3M9XCJ0YWJsZS1jb25kZW5zZWRcIj4nK3IuaGVhZFRlbXBsYXRlK3IuY29udFRlbXBsYXRlK3IuZm9vdFRlbXBsYXRlK1wiPC90YWJsZT48L2Rpdj48L2Rpdj5cIixhLmZuLmRhdGVwaWNrZXIuRFBHbG9iYWw9cixhLmZuLmRhdGVwaWNrZXIubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLmRhdGVwaWNrZXI9bSx0aGlzfSxhLmZuLmRhdGVwaWNrZXIudmVyc2lvbj1cIjEuOS4wXCIsYS5mbi5kYXRlcGlja2VyLmRlcHJlY2F0ZWQ9ZnVuY3Rpb24oYSl7dmFyIGI9d2luZG93LmNvbnNvbGU7YiYmYi53YXJuJiZiLndhcm4oXCJERVBSRUNBVEVEOiBcIithKX0sYShkb2N1bWVudCkub24oXCJmb2N1cy5kYXRlcGlja2VyLmRhdGEtYXBpIGNsaWNrLmRhdGVwaWNrZXIuZGF0YS1hcGlcIiwnW2RhdGEtcHJvdmlkZT1cImRhdGVwaWNrZXJcIl0nLGZ1bmN0aW9uKGIpe3ZhciBjPWEodGhpcyk7Yy5kYXRhKFwiZGF0ZXBpY2tlclwiKXx8KGIucHJldmVudERlZmF1bHQoKSxuLmNhbGwoYyxcInNob3dcIikpfSksYShmdW5jdGlvbigpe24uY2FsbChhKCdbZGF0YS1wcm92aWRlPVwiZGF0ZXBpY2tlci1pbmxpbmVcIl0nKSl9KX0pOyJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxDQUFDLFVBQVNBLENBQVQsRUFBVztFQUFDLGNBQVksT0FBT0MsTUFBbkIsSUFBMkJBLE1BQU0sQ0FBQ0MsR0FBbEMsR0FBc0NELE1BQU0sQ0FBQyxDQUFDLFFBQUQsQ0FBRCxFQUFZRCxDQUFaLENBQTVDLEdBQTJEQSxDQUFDLENBQUMsb0JBQWlCRyxPQUFqQix5Q0FBaUJBLE9BQWpCLEtBQXlCQyxPQUFPLENBQUMsUUFBRCxDQUFoQyxHQUEyQ0MsTUFBNUMsQ0FBNUQ7QUFBZ0gsQ0FBNUgsQ0FBNkgsVUFBU0wsQ0FBVCxFQUFXTSxDQUFYLEVBQWE7RUFBQyxTQUFTQyxDQUFULEdBQVk7SUFBQyxPQUFPLElBQUlDLElBQUosQ0FBU0EsSUFBSSxDQUFDQyxHQUFMLENBQVNDLEtBQVQsQ0FBZUYsSUFBZixFQUFvQkcsU0FBcEIsQ0FBVCxDQUFQO0VBQWdEOztFQUFBLFNBQVNDLENBQVQsR0FBWTtJQUFDLElBQUlaLENBQUMsR0FBQyxJQUFJ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 },{"jquery":20}],11:[function(require,module,exports){ "use strict"; function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get.bind(); } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } /*! * Bootstrap v5.2.0 (https://getbootstrap.com/) * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { (typeof exports === "undefined" ? "undefined" : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core')) : typeof define === 'function' && define.amd ? define(['@popperjs/core'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrap = factory(global.Popper)); })(void 0, function (Popper) { 'use strict'; var _KEY_TO_DIRECTION; function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null, _defineProperty({}, Symbol.toStringTag, { value: 'Module' })); if (e) { var _loop = function _loop(k) { if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty(n, k, d.get ? d : { enumerable: true, get: function get() { return e[k]; } }); } }; for (var k in e) { _loop(k); } } n["default"] = e; return Object.freeze(n); } var Popper__namespace = /*#__PURE__*/_interopNamespace(Popper); /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): util/index.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ var MAX_UID = 1000000; var MILLISECONDS_MULTIPLIER = 1000; var TRANSITION_END = 'transitionend'; // Shout-out Angus Croll (https://goo.gl/pxwQGp) var toType = function toType(object) { if (object === null || object === undefined) { return "".concat(object); } return Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase(); }; /** * Public Util API */ var getUID = function getUID(prefix) { do { prefix += Math.floor(Math.random() * MAX_UID); } while (document.getElementById(prefix)); return prefix; }; var getSelector = function getSelector(element) { var selector = element.getAttribute('data-bs-target'); if (!selector || selector === '#') { var hrefAttribute = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes, // so everything starting with `#` or `.`. If a "real" URL is used as the selector, // `document.querySelector` will rightfully complain it is invalid. // See https://github.com/twbs/bootstrap/issues/32273 if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) { return null; } // Just in case some CMS puts out a full URL with the anchor appended if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) { hrefAttribute = "#".concat(hrefAttribute.split('#')[1]); } selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null; } return selector; }; var getSelectorFromElement = function getSelectorFromElement(element) { var selector = getSelector(element); if (selector) { return document.querySelector(selector) ? selector : null; } return null; }; var getElementFromSelector = function getElementFromSelector(element) { var selector = getSelector(element); return selector ? document.querySelector(selector) : null; }; var getTransitionDurationFromElement = function getTransitionDurationFromElement(element) { if (!element) { return 0; } // Get transition-duration of the element var _window$getComputedSt = window.getComputedStyle(element), transitionDuration = _window$getComputedSt.transitionDuration, transitionDelay = _window$getComputedSt.transitionDelay; var floatTransitionDuration = Number.parseFloat(transitionDuration); var floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found if (!floatTransitionDuration && !floatTransitionDelay) { return 0; } // If multiple durations are defined, take the first transitionDuration = transitionDuration.split(',')[0]; transitionDelay = transitionDelay.split(',')[0]; return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; }; var triggerTransitionEnd = function triggerTransitionEnd(element) { element.dispatchEvent(new Event(TRANSITION_END)); }; var isElement = function isElement(object) { if (!object || _typeof(object) !== 'object') { return false; } if (typeof object.jquery !== 'undefined') { object = object[0]; } return typeof object.nodeType !== 'undefined'; }; var getElement = function getElement(object) { // it's a jQuery object or a node element if (isElement(object)) { return object.jquery ? object[0] : object; } if (typeof object === 'string' && object.length > 0) { return document.querySelector(object); } return null; }; var isVisible = function isVisible(element) { if (!isElement(element) || element.getClientRects().length === 0) { return false; } var elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'; // Handle `details` element as its content may falsie appear visible when it is closed var closedDetails = element.closest('details:not([open])'); if (!closedDetails) { return elementIsVisible; } if (closedDetails !== element) { var summary = element.closest('summary'); if (summary && summary.parentNode !== closedDetails) { return false; } if (summary === null) { return false; } } return elementIsVisible; }; var isDisabled = function isDisabled(element) { if (!element || element.nodeType !== Node.ELEMENT_NODE) { return true; } if (element.classList.contains('disabled')) { return true; } if (typeof element.disabled !== 'undefined') { return element.disabled; } return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'; }; var findShadowRoot = function findShadowRoot(element) { if (!document.documentElement.attachShadow) { return null; } // Can find the shadow root otherwise it'll return the document if (typeof element.getRootNode === 'function') { var root = element.getRootNode(); return root instanceof ShadowRoot ? root : null; } if (element instanceof ShadowRoot) { return element; } // when we don't find a shadow root if (!element.parentNode) { return null; } return findShadowRoot(element.parentNode); }; var noop = function noop() {}; /** * Trick to restart an element's animation * * @param {HTMLElement} element * @return void * * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation */ var reflow = function reflow(element) { element.offsetHeight; // eslint-disable-line no-unused-expressions }; var getjQuery = function getjQuery() { if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) { return window.jQuery; } return null; }; var DOMContentLoadedCallbacks = []; var onDOMContentLoaded = function onDOMContentLoaded(callback) { if (document.readyState === 'loading') { // add listener on the first call when the document is in loading state if (!DOMContentLoadedCallbacks.length) { document.addEventListener('DOMContentLoaded', function () { var _iterator = _createForOfIteratorHelper(DOMContentLoadedCallbacks), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var _callback = _step.value; _callback(); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } }); } DOMContentLoadedCallbacks.push(callback); } else { callback(); } }; var isRTL = function isRTL() { return document.documentElement.dir === 'rtl'; }; var defineJQueryPlugin = function defineJQueryPlugin(plugin) { onDOMContentLoaded(function () { var $ = getjQuery(); /* istanbul ignore if */ if ($) { var name = plugin.NAME; var JQUERY_NO_CONFLICT = $.fn[name]; $.fn[name] = plugin.jQueryInterface; $.fn[name].Constructor = plugin; $.fn[name].noConflict = function () { $.fn[name] = JQUERY_NO_CONFLICT; return plugin.jQueryInterface; }; } }); }; var execute = function execute(callback) { if (typeof callback === 'function') { callback(); } }; var executeAfterTransition = function executeAfterTransition(callback, transitionElement) { var waitForTransition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; if (!waitForTransition) { execute(callback); return; } var durationPadding = 5; var emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding; var called = false; var handler = function handler(_ref) { var target = _ref.target; if (target !== transitionElement) { return; } called = true; transitionElement.removeEventListener(TRANSITION_END, handler); execute(callback); }; transitionElement.addEventListener(TRANSITION_END, handler); setTimeout(function () { if (!called) { triggerTransitionEnd(transitionElement); } }, emulatedDuration); }; /** * Return the previous/next element of a list. * * @param {array} list The list of elements * @param activeElement The active element * @param shouldGetNext Choose to get next or previous element * @param isCycleAllowed * @return {Element|elem} The proper element */ var getNextActiveElement = function getNextActiveElement(list, activeElement, shouldGetNext, isCycleAllowed) { var listLength = list.length; var index = list.indexOf(activeElement); // if the element does not exist in the list return an element // depending on the direction and if cycle is allowed if (index === -1) { return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]; } index += shouldGetNext ? 1 : -1; if (isCycleAllowed) { index = (index + listLength) % listLength; } return list[Math.max(0, Math.min(index, listLength - 1))]; }; /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): dom/event-handler.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ var namespaceRegex = /[^.]*(?=\..*)\.|.*/; var stripNameRegex = /\..*/; var stripUidRegex = /::\d+$/; var eventRegistry = {}; // Events storage var uidEvent = 1; var customEvents = { mouseenter: 'mouseover', mouseleave: 'mouseout' }; var nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']); /** * Private methods */ function makeEventUid(element, uid) { return uid && "".concat(uid, "::").concat(uidEvent++) || element.uidEvent || uidEvent++; } function getElementEvents(element) { var uid = makeEventUid(element); element.uidEvent = uid; eventRegistry[uid] = eventRegistry[uid] || {}; return eventRegistry[uid]; } function bootstrapHandler(element, fn) { return function handler(event) { hydrateObj(event, { delegateTarget: element }); if (handler.oneOff) { EventHandler.off(element, event.type, fn); } return fn.apply(element, [event]); }; } function bootstrapDelegationHandler(element, selector, fn) { return function handler(event) { var domElements = element.querySelectorAll(selector); for (var target = event.target; target && target !== this; target = target.parentNode) { var _iterator2 = _createForOfIteratorHelper(domElements), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var domElement = _step2.value; if (domElement !== target) { continue; } hydrateObj(event, { delegateTarget: target }); if (handler.oneOff) { EventHandler.off(element, event.type, selector, fn); } return fn.apply(target, [event]); } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } } }; } function findHandler(events, callable) { var delegationSelector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; return Object.values(events).find(function (event) { return event.callable === callable && event.delegationSelector === delegationSelector; }); } function normalizeParameters(originalTypeEvent, handler, delegationFunction) { var isDelegated = typeof handler === 'string'; // todo: tooltip passes `false` instead of selector, so we need to check var callable = isDelegated ? delegationFunction : handler || delegationFunction; var typeEvent = getTypeEvent(originalTypeEvent); if (!nativeEvents.has(typeEvent)) { typeEvent = originalTypeEvent; } return [isDelegated, callable, typeEvent]; } function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) { if (typeof originalTypeEvent !== 'string' || !element) { return; } var _normalizeParameters = normalizeParameters(originalTypeEvent, handler, delegationFunction), _normalizeParameters2 = _slicedToArray(_normalizeParameters, 3), isDelegated = _normalizeParameters2[0], callable = _normalizeParameters2[1], typeEvent = _normalizeParameters2[2]; // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position // this prevents the handler from being dispatched the same way as mouseover or mouseout does if (originalTypeEvent in customEvents) { var wrapFunction = function wrapFunction(fn) { return function (event) { if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) { return fn.call(this, event); } }; }; callable = wrapFunction(callable); } var events = getElementEvents(element); var handlers = events[typeEvent] || (events[typeEvent] = {}); var previousFunction = findHandler(handlers, callable, isDelegated ? handler : null); if (previousFunction) { previousFunction.oneOff = previousFunction.oneOff && oneOff; return; } var uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, '')); var fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable); fn.delegationSelector = isDelegated ? handler : null; fn.callable = callable; fn.oneOff = oneOff; fn.uidEvent = uid; handlers[uid] = fn; element.addEventListener(typeEvent, fn, isDelegated); } function removeHandler(element, events, typeEvent, handler, delegationSelector) { var fn = findHandler(events[typeEvent], handler, delegationSelector); if (!fn) { return; } element.removeEventListener(typeEvent, fn, Boolean(delegationSelector)); delete events[typeEvent][fn.uidEvent]; } function removeNamespacedHandlers(element, events, typeEvent, namespace) { var storeElementEvent = events[typeEvent] || {}; for (var _i2 = 0, _Object$keys = Object.keys(storeElementEvent); _i2 < _Object$keys.length; _i2++) { var handlerKey = _Object$keys[_i2]; if (handlerKey.includes(namespace)) { var event = storeElementEvent[handlerKey]; removeHandler(element, events, typeEvent, event.callable, event.delegationSelector); } } } function getTypeEvent(event) { // allow to get the native events from namespaced events ('click.bs.button' --> 'click') event = event.replace(stripNameRegex, ''); return customEvents[event] || event; } var EventHandler = { on: function on(element, event, handler, delegationFunction) { addHandler(element, event, handler, delegationFunction, false); }, one: function one(element, event, handler, delegationFunction) { addHandler(element, event, handler, delegationFunction, true); }, off: function off(element, originalTypeEvent, handler, delegationFunction) { if (typeof originalTypeEvent !== 'string' || !element) { return; } var _normalizeParameters3 = normalizeParameters(originalTypeEvent, handler, delegationFunction), _normalizeParameters4 = _slicedToArray(_normalizeParameters3, 3), isDelegated = _normalizeParameters4[0], callable = _normalizeParameters4[1], typeEvent = _normalizeParameters4[2]; var inNamespace = typeEvent !== originalTypeEvent; var events = getElementEvents(element); var storeElementEvent = events[typeEvent] || {}; var isNamespace = originalTypeEvent.startsWith('.'); if (typeof callable !== 'undefined') { // Simplest case: handler is passed, remove that listener ONLY. if (!Object.keys(storeElementEvent).length) { return; } removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null); return; } if (isNamespace) { for (var _i3 = 0, _Object$keys2 = Object.keys(events); _i3 < _Object$keys2.length; _i3++) { var elementEvent = _Object$keys2[_i3]; removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1)); } } for (var _i4 = 0, _Object$keys3 = Object.keys(storeElementEvent); _i4 < _Object$keys3.length; _i4++) { var keyHandlers = _Object$keys3[_i4]; var handlerKey = keyHandlers.replace(stripUidRegex, ''); if (!inNamespace || originalTypeEvent.includes(handlerKey)) { var event = storeElementEvent[keyHandlers]; removeHandler(element, events, typeEvent, event.callable, event.delegationSelector); } } }, trigger: function trigger(element, event, args) { if (typeof event !== 'string' || !element) { return null; } var $ = getjQuery(); var typeEvent = getTypeEvent(event); var inNamespace = event !== typeEvent; var jQueryEvent = null; var bubbles = true; var nativeDispatch = true; var defaultPrevented = false; if (inNamespace && $) { jQueryEvent = $.Event(event, args); $(element).trigger(jQueryEvent); bubbles = !jQueryEvent.isPropagationStopped(); nativeDispatch = !jQueryEvent.isImmediatePropagationStopped(); defaultPrevented = jQueryEvent.isDefaultPrevented(); } var evt = new Event(event, { bubbles: bubbles, cancelable: true }); evt = hydrateObj(evt, args); if (defaultPrevented) { evt.preventDefault(); } if (nativeDispatch) { element.dispatchEvent(evt); } if (evt.defaultPrevented && jQueryEvent) { jQueryEvent.preventDefault(); } return evt; } }; function hydrateObj(obj, meta) { var _loop2 = function _loop2() { var _Object$entries$_i = _slicedToArray(_Object$entries[_i5], 2), key = _Object$entries$_i[0], value = _Object$entries$_i[1]; try { obj[key] = value; } catch (_unused) { Object.defineProperty(obj, key, { configurable: true, get: function get() { return value; } }); } }; for (var _i5 = 0, _Object$entries = Object.entries(meta || {}); _i5 < _Object$entries.length; _i5++) { _loop2(); } return obj; } /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): dom/data.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ var elementMap = new Map(); var Data = { set: function set(element, key, instance) { if (!elementMap.has(element)) { elementMap.set(element, new Map()); } var instanceMap = elementMap.get(element); // make it clear we only want one instance per element // can be removed later when multiple key/instances are fine to be used if (!instanceMap.has(key) && instanceMap.size !== 0) { // eslint-disable-next-line no-console console.error("Bootstrap doesn't allow more than one instance per element. Bound instance: ".concat(Array.from(instanceMap.keys())[0], ".")); return; } instanceMap.set(key, instance); }, get: function get(element, key) { if (elementMap.has(element)) { return elementMap.get(element).get(key) || null; } return null; }, remove: function remove(element, key) { if (!elementMap.has(element)) { return; } var instanceMap = elementMap.get(element); instanceMap["delete"](key); // free up element references if there are no instances left for an element if (instanceMap.size === 0) { elementMap["delete"](element); } } }; /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): dom/manipulator.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ function normalizeData(value) { if (value === 'true') { return true; } if (value === 'false') { return false; } if (value === Number(value).toString()) { return Number(value); } if (value === '' || value === 'null') { return null; } if (typeof value !== 'string') { return value; } try { return JSON.parse(decodeURIComponent(value)); } catch (_unused) { return value; } } function normalizeDataKey(key) { return key.replace(/[A-Z]/g, function (chr) { return "-".concat(chr.toLowerCase()); }); } var Manipulator = { setDataAttribute: function setDataAttribute(element, key, value) { element.setAttribute("data-bs-".concat(normalizeDataKey(key)), value); }, removeDataAttribute: function removeDataAttribute(element, key) { element.removeAttribute("data-bs-".concat(normalizeDataKey(key))); }, getDataAttributes: function getDataAttributes(element) { if (!element) { return {}; } var attributes = {}; var bsKeys = Object.keys(element.dataset).filter(function (key) { return key.startsWith('bs') && !key.startsWith('bsConfig'); }); var _iterator3 = _createForOfIteratorHelper(bsKeys), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var key = _step3.value; var pureKey = key.replace(/^bs/, ''); pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length); attributes[pureKey] = normalizeData(element.dataset[key]); } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } return attributes; }, getDataAttribute: function getDataAttribute(element, key) { return normalizeData(element.getAttribute("data-bs-".concat(normalizeDataKey(key)))); } }; /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): util/config.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Class definition */ var Config = /*#__PURE__*/function () { function Config() { _classCallCheck(this, Config); } _createClass(Config, [{ key: "_getConfig", value: function _getConfig(config) { config = this._mergeConfigObj(config); config = this._configAfterMerge(config); this._typeCheckConfig(config); return config; } }, { key: "_configAfterMerge", value: function _configAfterMerge(config) { return config; } }, { key: "_mergeConfigObj", value: function _mergeConfigObj(config, element) { var jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, this.constructor.Default), _typeof(jsonConfig) === 'object' ? jsonConfig : {}), isElement(element) ? Manipulator.getDataAttributes(element) : {}), _typeof(config) === 'object' ? config : {}); } }, { key: "_typeCheckConfig", value: function _typeCheckConfig(config) { var configTypes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.constructor.DefaultType; for (var _i6 = 0, _Object$keys4 = Object.keys(configTypes); _i6 < _Object$keys4.length; _i6++) { var property = _Object$keys4[_i6]; var expectedTypes = configTypes[property]; var value = config[property]; var valueType = isElement(value) ? 'element' : toType(value); if (!new RegExp(expectedTypes).test(valueType)) { throw new TypeError("".concat(this.constructor.NAME.toUpperCase(), ": Option \"").concat(property, "\" provided type \"").concat(valueType, "\" but expected type \"").concat(expectedTypes, "\".")); } } } }], [{ key: "Default", get: // Getters function get() { return {}; } }, { key: "DefaultType", get: function get() { return {}; } }, { key: "NAME", get: function get() { throw new Error('You have to implement the static method "NAME", for each component!'); } }]); return Config; }(); /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): base-component.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ var VERSION = '5.2.0'; /** * Class definition */ var BaseComponent = /*#__PURE__*/function (_Config) { _inherits(BaseComponent, _Config); var _super = _createSuper(BaseComponent); function BaseComponent(element, config) { var _this; _classCallCheck(this, BaseComponent); _this = _super.call(this); element = getElement(element); if (!element) { return _possibleConstructorReturn(_this); } _this._element = element; _this._config = _this._getConfig(config); Data.set(_this._element, _this.constructor.DATA_KEY, _assertThisInitialized(_this)); return _this; } // Public _createClass(BaseComponent, [{ key: "dispose", value: function dispose() { Data.remove(this._element, this.constructor.DATA_KEY); EventHandler.off(this._element, this.constructor.EVENT_KEY); var _iterator4 = _createForOfIteratorHelper(Object.getOwnPropertyNames(this)), _step4; try { for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { var propertyName = _step4.value; this[propertyName] = null; } } catch (err) { _iterator4.e(err); } finally { _iterator4.f(); } } }, { key: "_queueCallback", value: function _queueCallback(callback, element) { var isAnimated = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; executeAfterTransition(callback, element, isAnimated); } }, { key: "_getConfig", value: function _getConfig(config) { config = this._mergeConfigObj(config, this._element); config = this._configAfterMerge(config); this._typeCheckConfig(config); return config; } // Static }], [{ key: "getInstance", value: function getInstance(element) { return Data.get(getElement(element), this.DATA_KEY); } }, { key: "getOrCreateInstance", value: function getOrCreateInstance(element) { var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; return this.getInstance(element) || new this(element, _typeof(config) === 'object' ? config : null); } }, { key: "VERSION", get: function get() { return VERSION; } }, { key: "DATA_KEY", get: function get() { return "bs.".concat(this.NAME); } }, { key: "EVENT_KEY", get: function get() { return ".".concat(this.DATA_KEY); } }, { key: "eventName", value: function eventName(name) { return "".concat(name).concat(this.EVENT_KEY); } }]); return BaseComponent; }(Config); /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): util/component-functions.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ var enableDismissTrigger = function enableDismissTrigger(component) { var method = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'hide'; var clickEvent = "click.dismiss".concat(component.EVENT_KEY); var name = component.NAME; EventHandler.on(document, clickEvent, "[data-bs-dismiss=\"".concat(name, "\"]"), function (event) { if (['A', 'AREA'].includes(this.tagName)) { event.preventDefault(); } if (isDisabled(this)) { return; } var target = getElementFromSelector(this) || this.closest(".".concat(name)); var instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method instance[method](); }); }; /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): alert.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ var NAME$f = 'alert'; var DATA_KEY$a = 'bs.alert'; var EVENT_KEY$b = ".".concat(DATA_KEY$a); var EVENT_CLOSE = "close".concat(EVENT_KEY$b); var EVENT_CLOSED = "closed".concat(EVENT_KEY$b); var CLASS_NAME_FADE$5 = 'fade'; var CLASS_NAME_SHOW$8 = 'show'; /** * Class definition */ var Alert = /*#__PURE__*/function (_BaseComponent) { _inherits(Alert, _BaseComponent); var _super2 = _createSuper(Alert); function Alert() { _classCallCheck(this, Alert); return _super2.apply(this, arguments); } _createClass(Alert, [{ key: "close", value: // Public function close() { var _this2 = this; var closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE); if (closeEvent.defaultPrevented) { return; } this._element.classList.remove(CLASS_NAME_SHOW$8); var isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5); this._queueCallback(function () { return _this2._destroyElement(); }, this._element, isAnimated); } // Private }, { key: "_destroyElement", value: function _destroyElement() { this._element.remove(); EventHandler.trigger(this._element, EVENT_CLOSED); this.dispose(); } // Static }], [{ key: "NAME", get: // Getters function get() { return NAME$f; } }, { key: "jQueryInterface", value: function jQueryInterface(config) { return this.each(function () { var data = Alert.getOrCreateInstance(this); if (typeof config !== 'string') { return; } if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { throw new TypeError("No method named \"".concat(config, "\"")); } data[config](this); }); } }]); return Alert; }(BaseComponent); /** * Data API implementation */ enableDismissTrigger(Alert, 'close'); /** * jQuery */ defineJQueryPlugin(Alert); /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): button.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ var NAME$e = 'button'; var DATA_KEY$9 = 'bs.button'; var EVENT_KEY$a = ".".concat(DATA_KEY$9); var DATA_API_KEY$6 = '.data-api'; var CLASS_NAME_ACTIVE$3 = 'active'; var SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]'; var EVENT_CLICK_DATA_API$6 = "click".concat(EVENT_KEY$a).concat(DATA_API_KEY$6); /** * Class definition */ var Button = /*#__PURE__*/function (_BaseComponent2) { _inherits(Button, _BaseComponent2); var _super3 = _createSuper(Button); function Button() { _classCallCheck(this, Button); return _super3.apply(this, arguments); } _createClass(Button, [{ key: "toggle", value: // Public function toggle() { // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3)); } // Static }], [{ key: "NAME", get: // Getters function get() { return NAME$e; } }, { key: "jQueryInterface", value: function jQueryInterface(config) { return this.each(function () { var data = Button.getOrCreateInstance(this); if (config === 'toggle') { data[config](); } }); } }]); return Button; }(BaseComponent); /** * Data API implementation */ EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, function (event) { event.preventDefault(); var button = event.target.closest(SELECTOR_DATA_TOGGLE$5); var data = Button.getOrCreateInstance(button); data.toggle(); }); /** * jQuery */ defineJQueryPlugin(Button); /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): dom/selector-engine.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ var SelectorEngine = { find: function find(selector) { var _ref2; var element = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document.documentElement; return (_ref2 = []).concat.apply(_ref2, _toConsumableArray(Element.prototype.querySelectorAll.call(element, selector))); }, findOne: function findOne(selector) { var element = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document.documentElement; return Element.prototype.querySelector.call(element, selector); }, children: function children(element, selector) { var _ref3; return (_ref3 = []).concat.apply(_ref3, _toConsumableArray(element.children)).filter(function (child) { return child.matches(selector); }); }, parents: function parents(element, selector) { var parents = []; var ancestor = element.parentNode.closest(selector); while (ancestor) { parents.push(ancestor); ancestor = ancestor.parentNode.closest(selector); } return parents; }, prev: function prev(element, selector) { var previous = element.previousElementSibling; while (previous) { if (previous.matches(selector)) { return [previous]; } previous = previous.previousElementSibling; } return []; }, // TODO: this is now unused; remove later along with prev() next: function next(element, selector) { var next = element.nextElementSibling; while (next) { if (next.matches(selector)) { return [next]; } next = next.nextElementSibling; } return []; }, focusableChildren: function focusableChildren(element) { var focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(function (selector) { return "".concat(selector, ":not([tabindex^=\"-\"])"); }).join(','); return this.find(focusables, element).filter(function (el) { return !isDisabled(el) && isVisible(el); }); } }; /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): util/swipe.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ var NAME$d = 'swipe'; var EVENT_KEY$9 = '.bs.swipe'; var EVENT_TOUCHSTART = "touchstart".concat(EVENT_KEY$9); var EVENT_TOUCHMOVE = "touchmove".concat(EVENT_KEY$9); var EVENT_TOUCHEND = "touchend".concat(EVENT_KEY$9); var EVENT_POINTERDOWN = "pointerdown".concat(EVENT_KEY$9); var EVENT_POINTERUP = "pointerup".concat(EVENT_KEY$9); var POINTER_TYPE_TOUCH = 'touch'; var POINTER_TYPE_PEN = 'pen'; var CLASS_NAME_POINTER_EVENT = 'pointer-event'; var SWIPE_THRESHOLD = 40; var Default$c = { endCallback: null, leftCallback: null, rightCallback: null }; var DefaultType$c = { endCallback: '(function|null)', leftCallback: '(function|null)', rightCallback: '(function|null)' }; /** * Class definition */ var Swipe = /*#__PURE__*/function (_Config2) { _inherits(Swipe, _Config2); var _super4 = _createSuper(Swipe); function Swipe(element, config) { var _this3; _classCallCheck(this, Swipe); _this3 = _super4.call(this); _this3._element = element; if (!element || !Swipe.isSupported()) { return _possibleConstructorReturn(_this3); } _this3._config = _this3._getConfig(config); _this3._deltaX = 0; _this3._supportPointerEvents = Boolean(window.PointerEvent); _this3._initEvents(); return _this3; } // Getters _createClass(Swipe, [{ key: "dispose", value: // Public function dispose() { EventHandler.off(this._element, EVENT_KEY$9); } // Private }, { key: "_start", value: function _start(event) { if (!this._supportPointerEvents) { this._deltaX = event.touches[0].clientX; return; } if (this._eventIsPointerPenTouch(event)) { this._deltaX = event.clientX; } } }, { key: "_end", value: function _end(event) { if (this._eventIsPointerPenTouch(event)) { this._deltaX = event.clientX - this._deltaX; } this._handleSwipe(); execute(this._config.endCallback); } }, { key: "_move", value: function _move(event) { this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX; } }, { key: "_handleSwipe", value: function _handleSwipe() { var absDeltaX = Math.abs(this._deltaX); if (absDeltaX <= SWIPE_THRESHOLD) { return; } var direction = absDeltaX / this._deltaX; this._deltaX = 0; if (!direction) { return; } execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback); } }, { key: "_initEvents", value: function _initEvents() { var _this4 = this; if (this._supportPointerEvents) { EventHandler.on(this._element, EVENT_POINTERDOWN, function (event) { return _this4._start(event); }); EventHandler.on(this._element, EVENT_POINTERUP, function (event) { return _this4._end(event); }); this._element.classList.add(CLASS_NAME_POINTER_EVENT); } else { EventHandler.on(this._element, EVENT_TOUCHSTART, function (event) { return _this4._start(event); }); EventHandler.on(this._element, EVENT_TOUCHMOVE, function (event) { return _this4._move(event); }); EventHandler.on(this._element, EVENT_TOUCHEND, function (event) { return _this4._end(event); }); } } }, { key: "_eventIsPointerPenTouch", value: function _eventIsPointerPenTouch(event) { return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH); } // Static }], [{ key: "Default", get: function get() { return Default$c; } }, { key: "DefaultType", get: function get() { return DefaultType$c; } }, { key: "NAME", get: function get() { return NAME$d; } }, { key: "isSupported", value: function isSupported() { return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0; } }]); return Swipe; }(Config); /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): carousel.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ var NAME$c = 'carousel'; var DATA_KEY$8 = 'bs.carousel'; var EVENT_KEY$8 = ".".concat(DATA_KEY$8); var DATA_API_KEY$5 = '.data-api'; var ARROW_LEFT_KEY$1 = 'ArrowLeft'; var ARROW_RIGHT_KEY$1 = 'ArrowRight'; var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch var ORDER_NEXT = 'next'; var ORDER_PREV = 'prev'; var DIRECTION_LEFT = 'left'; var DIRECTION_RIGHT = 'right'; var EVENT_SLIDE = "slide".concat(EVENT_KEY$8); var EVENT_SLID = "slid".concat(EVENT_KEY$8); var EVENT_KEYDOWN$1 = "keydown".concat(EVENT_KEY$8); var EVENT_MOUSEENTER$1 = "mouseenter".concat(EVENT_KEY$8); var EVENT_MOUSELEAVE$1 = "mouseleave".concat(EVENT_KEY$8); var EVENT_DRAG_START = "dragstart".concat(EVENT_KEY$8); var EVENT_LOAD_DATA_API$3 = "load".concat(EVENT_KEY$8).concat(DATA_API_KEY$5); var EVENT_CLICK_DATA_API$5 = "click".concat(EVENT_KEY$8).concat(DATA_API_KEY$5); var CLASS_NAME_CAROUSEL = 'carousel'; var CLASS_NAME_ACTIVE$2 = 'active'; var CLASS_NAME_SLIDE = 'slide'; var CLASS_NAME_END = 'carousel-item-end'; var CLASS_NAME_START = 'carousel-item-start'; var CLASS_NAME_NEXT = 'carousel-item-next'; var CLASS_NAME_PREV = 'carousel-item-prev'; var SELECTOR_ACTIVE = '.active'; var SELECTOR_ITEM = '.carousel-item'; var SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM; var SELECTOR_ITEM_IMG = '.carousel-item img'; var SELECTOR_INDICATORS = '.carousel-indicators'; var SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'; var SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]'; var KEY_TO_DIRECTION = (_KEY_TO_DIRECTION = {}, _defineProperty(_KEY_TO_DIRECTION, ARROW_LEFT_KEY$1, DIRECTION_RIGHT), _defineProperty(_KEY_TO_DIRECTION, ARROW_RIGHT_KEY$1, DIRECTION_LEFT), _KEY_TO_DIRECTION); var Default$b = { interval: 5000, keyboard: true, pause: 'hover', ride: false, touch: true, wrap: true }; var DefaultType$b = { interval: '(number|boolean)', // TODO:v6 remove boolean support keyboard: 'boolean', pause: '(string|boolean)', ride: '(boolean|string)', touch: 'boolean', wrap: 'boolean' }; /** * Class definition */ var Carousel = /*#__PURE__*/function (_BaseComponent3) { _inherits(Carousel, _BaseComponent3); var _super5 = _createSuper(Carousel); function Carousel(element, config) { var _this5; _classCallCheck(this, Carousel); _this5 = _super5.call(this, element, config); _this5._interval = null; _this5._activeElement = null; _this5._isSliding = false; _this5.touchTimeout = null; _this5._swipeHelper = null; _this5._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, _this5._element); _this5._addEventListeners(); if (_this5._config.ride === CLASS_NAME_CAROUSEL) { _this5.cycle(); } return _this5; } // Getters _createClass(Carousel, [{ key: "next", value: // Public function next() { this._slide(ORDER_NEXT); } }, { key: "nextWhenVisible", value: function nextWhenVisible() { // FIXME TODO use `document.visibilityState` // Don't call next when the page isn't visible // or the carousel or its parent isn't visible if (!document.hidden && isVisible(this._element)) { this.next(); } } }, { key: "prev", value: function prev() { this._slide(ORDER_PREV); } }, { key: "pause", value: function pause() { if (this._isSliding) { triggerTransitionEnd(this._element); } this._clearInterval(); } }, { key: "cycle", value: function cycle() { var _this6 = this; this._clearInterval(); this._updateInterval(); this._interval = setInterval(function () { return _this6.nextWhenVisible(); }, this._config.interval); } }, { key: "_maybeEnableCycle", value: function _maybeEnableCycle() { var _this7 = this; if (!this._config.ride) { return; } if (this._isSliding) { EventHandler.one(this._element, EVENT_SLID, function () { return _this7.cycle(); }); return; } this.cycle(); } }, { key: "to", value: function to(index) { var _this8 = this; var items = this._getItems(); if (index > items.length - 1 || index < 0) { return; } if (this._isSliding) { EventHandler.one(this._element, EVENT_SLID, function () { return _this8.to(index); }); return; } var activeIndex = this._getItemIndex(this._getActive()); if (activeIndex === index) { return; } var order = index > activeIndex ? ORDER_NEXT : ORDER_PREV; this._slide(order, items[index]); } }, { key: "dispose", value: function dispose() { if (this._swipeHelper) { this._swipeHelper.dispose(); } _get(_getPrototypeOf(Carousel.prototype), "dispose", this).call(this); } // Private }, { key: "_configAfterMerge", value: function _configAfterMerge(config) { config.defaultInterval = config.interval; return config; } }, { key: "_addEventListeners", value: function _addEventListeners() { var _this9 = this; if (this._config.keyboard) { EventHandler.on(this._element, EVENT_KEYDOWN$1, function (event) { return _this9._keydown(event); }); } if (this._config.pause === 'hover') { EventHandler.on(this._element, EVENT_MOUSEENTER$1, function () { return _this9.pause(); }); EventHandler.on(this._element, EVENT_MOUSELEAVE$1, function () { return _this9._maybeEnableCycle(); }); } if (this._config.touch && Swipe.isSupported()) { this._addTouchEventListeners(); } } }, { key: "_addTouchEventListeners", value: function _addTouchEventListeners() { var _this10 = this; var _iterator5 = _createForOfIteratorHelper(SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)), _step5; try { for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { var img = _step5.value; EventHandler.on(img, EVENT_DRAG_START, function (event) { return event.preventDefault(); }); } } catch (err) { _iterator5.e(err); } finally { _iterator5.f(); } var endCallBack = function endCallBack() { if (_this10._config.pause !== 'hover') { return; } // If it's a touch-enabled device, mouseenter/leave are fired as // part of the mouse compatibility events on first tap - the carousel // would stop cycling until user tapped out of it; // here, we listen for touchend, explicitly pause the carousel // (as if it's the second time we tap on it, mouseenter compat event // is NOT fired) and after a timeout (to allow for mouse compatibility // events to fire) we explicitly restart cycling _this10.pause(); if (_this10.touchTimeout) { clearTimeout(_this10.touchTimeout); } _this10.touchTimeout = setTimeout(function () { return _this10._maybeEnableCycle(); }, TOUCHEVENT_COMPAT_WAIT + _this10._config.interval); }; var swipeConfig = { leftCallback: function leftCallback() { return _this10._slide(_this10._directionToOrder(DIRECTION_LEFT)); }, rightCallback: function rightCallback() { return _this10._slide(_this10._directionToOrder(DIRECTION_RIGHT)); }, endCallback: endCallBack }; this._swipeHelper = new Swipe(this._element, swipeConfig); } }, { key: "_keydown", value: function _keydown(event) { if (/input|textarea/i.test(event.target.tagName)) { return; } var direction = KEY_TO_DIRECTION[event.key]; if (direction) { event.preventDefault(); this._slide(this._directionToOrder(direction)); } } }, { key: "_getItemIndex", value: function _getItemIndex(element) { return this._getItems().indexOf(element); } }, { key: "_setActiveIndicatorElement", value: function _setActiveIndicatorElement(index) { if (!this._indicatorsElement) { return; } var activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement); activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2); activeIndicator.removeAttribute('aria-current'); var newActiveIndicator = SelectorEngine.findOne("[data-bs-slide-to=\"".concat(index, "\"]"), this._indicatorsElement); if (newActiveIndicator) { newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2); newActiveIndicator.setAttribute('aria-current', 'true'); } } }, { key: "_updateInterval", value: function _updateInterval() { var element = this._activeElement || this._getActive(); if (!element) { return; } var elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10); this._config.interval = elementInterval || this._config.defaultInterval; } }, { key: "_slide", value: function _slide(order) { var _this11 = this; var element = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; if (this._isSliding) { return; } var activeElement = this._getActive(); var isNext = order === ORDER_NEXT; var nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap); if (nextElement === activeElement) { return; } var nextElementIndex = this._getItemIndex(nextElement); var triggerEvent = function triggerEvent(eventName) { return EventHandler.trigger(_this11._element, eventName, { relatedTarget: nextElement, direction: _this11._orderToDirection(order), from: _this11._getItemIndex(activeElement), to: nextElementIndex }); }; var slideEvent = triggerEvent(EVENT_SLIDE); if (slideEvent.defaultPrevented) { return; } if (!activeElement || !nextElement) { // Some weirdness is happening, so we bail // todo: change tests that use empty divs to avoid this check return; } var isCycling = Boolean(this._interval); this.pause(); this._isSliding = true; this._setActiveIndicatorElement(nextElementIndex); this._activeElement = nextElement; var directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END; var orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV; nextElement.classList.add(orderClassName); reflow(nextElement); activeElement.classList.add(directionalClassName); nextElement.classList.add(directionalClassName); var completeCallBack = function completeCallBack() { nextElement.classList.remove(directionalClassName, orderClassName); nextElement.classList.add(CLASS_NAME_ACTIVE$2); activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName); _this11._isSliding = false; triggerEvent(EVENT_SLID); }; this._queueCallback(completeCallBack, activeElement, this._isAnimated()); if (isCycling) { this.cycle(); } } }, { key: "_isAnimated", value: function _isAnimated() { return this._element.classList.contains(CLASS_NAME_SLIDE); } }, { key: "_getActive", value: function _getActive() { return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element); } }, { key: "_getItems", value: function _getItems() { return SelectorEngine.find(SELECTOR_ITEM, this._element); } }, { key: "_clearInterval", value: function _clearInterval() { if (this._interval) { clearInterval(this._interval); this._interval = null; } } }, { key: "_directionToOrder", value: function _directionToOrder(direction) { if (isRTL()) { return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT; } return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV; } }, { key: "_orderToDirection", value: function _orderToDirection(order) { if (isRTL()) { return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT; } return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT; } // Static }], [{ key: "Default", get: function get() { return Default$b; } }, { key: "DefaultType", get: function get() { return DefaultType$b; } }, { key: "NAME", get: function get() { return NAME$c; } }, { key: "jQueryInterface", value: function jQueryInterface(config) { return this.each(function () { var data = Carousel.getOrCreateInstance(this, config); if (typeof config === 'number') { data.to(config); return; } if (typeof config === 'string') { if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { throw new TypeError("No method named \"".concat(config, "\"")); } data[config](); } }); } }]); return Carousel; }(BaseComponent); /** * Data API implementation */ EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) { var target = getElementFromSelector(this); if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) { return; } event.preventDefault(); var carousel = Carousel.getOrCreateInstance(target); var slideIndex = this.getAttribute('data-bs-slide-to'); if (slideIndex) { carousel.to(slideIndex); carousel._maybeEnableCycle(); return; } if (Manipulator.getDataAttribute(this, 'slide') === 'next') { carousel.next(); carousel._maybeEnableCycle(); return; } carousel.prev(); carousel._maybeEnableCycle(); }); EventHandler.on(window, EVENT_LOAD_DATA_API$3, function () { var carousels = SelectorEngine.find(SELECTOR_DATA_RIDE); var _iterator6 = _createForOfIteratorHelper(carousels), _step6; try { for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) { var carousel = _step6.value; Carousel.getOrCreateInstance(carousel); } } catch (err) { _iterator6.e(err); } finally { _iterator6.f(); } }); /** * jQuery */ defineJQueryPlugin(Carousel); /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): collapse.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ var NAME$b = 'collapse'; var DATA_KEY$7 = 'bs.collapse'; var EVENT_KEY$7 = ".".concat(DATA_KEY$7); var DATA_API_KEY$4 = '.data-api'; var EVENT_SHOW$6 = "show".concat(EVENT_KEY$7); var EVENT_SHOWN$6 = "shown".concat(EVENT_KEY$7); var EVENT_HIDE$6 = "hide".concat(EVENT_KEY$7); var EVENT_HIDDEN$6 = "hidden".concat(EVENT_KEY$7); var EVENT_CLICK_DATA_API$4 = "click".concat(EVENT_KEY$7).concat(DATA_API_KEY$4); var CLASS_NAME_SHOW$7 = 'show'; var CLASS_NAME_COLLAPSE = 'collapse'; var CLASS_NAME_COLLAPSING = 'collapsing'; var CLASS_NAME_COLLAPSED = 'collapsed'; var CLASS_NAME_DEEPER_CHILDREN = ":scope .".concat(CLASS_NAME_COLLAPSE, " .").concat(CLASS_NAME_COLLAPSE); var CLASS_NAME_HORIZONTAL = 'collapse-horizontal'; var WIDTH = 'width'; var HEIGHT = 'height'; var SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'; var SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle="collapse"]'; var Default$a = { parent: null, toggle: true }; var DefaultType$a = { parent: '(null|element)', toggle: 'boolean' }; /** * Class definition */ var Collapse = /*#__PURE__*/function (_BaseComponent4) { _inherits(Collapse, _BaseComponent4); var _super6 = _createSuper(Collapse); function Collapse(element, config) { var _this12; _classCallCheck(this, Collapse); _this12 = _super6.call(this, element, config); _this12._isTransitioning = false; _this12._triggerArray = []; var toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4); var _iterator7 = _createForOfIteratorHelper(toggleList), _step7; try { for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) { var elem = _step7.value; var selector = getSelectorFromElement(elem); var filterElement = SelectorEngine.find(selector).filter(function (foundElement) { return foundElement === _this12._element; }); if (selector !== null && filterElement.length) { _this12._triggerArray.push(elem); } } } catch (err) { _iterator7.e(err); } finally { _iterator7.f(); } _this12._initializeChildren(); if (!_this12._config.parent) { _this12._addAriaAndCollapsedClass(_this12._triggerArray, _this12._isShown()); } if (_this12._config.toggle) { _this12.toggle(); } return _this12; } // Getters _createClass(Collapse, [{ key: "toggle", value: // Public function toggle() { if (this._isShown()) { this.hide(); } else { this.show(); } } }, { key: "show", value: function show() { var _this13 = this; if (this._isTransitioning || this._isShown()) { return; } var activeChildren = []; // find active children if (this._config.parent) { activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(function (element) { return element !== _this13._element; }).map(function (element) { return Collapse.getOrCreateInstance(element, { toggle: false }); }); } if (activeChildren.length && activeChildren[0]._isTransitioning) { return; } var startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6); if (startEvent.defaultPrevented) { return; } var _iterator8 = _createForOfIteratorHelper(activeChildren), _step8; try { for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) { var activeInstance = _step8.value; activeInstance.hide(); } } catch (err) { _iterator8.e(err); } finally { _iterator8.f(); } var dimension = this._getDimension(); this._element.classList.remove(CLASS_NAME_COLLAPSE); this._element.classList.add(CLASS_NAME_COLLAPSING); this._element.style[dimension] = 0; this._addAriaAndCollapsedClass(this._triggerArray, true); this._isTransitioning = true; var complete = function complete() { _this13._isTransitioning = false; _this13._element.classList.remove(CLASS_NAME_COLLAPSING); _this13._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7); _this13._element.style[dimension] = ''; EventHandler.trigger(_this13._element, EVENT_SHOWN$6); }; var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); var scrollSize = "scroll".concat(capitalizedDimension); this._queueCallback(complete, this._element, true); this._element.style[dimension] = "".concat(this._element[scrollSize], "px"); } }, { key: "hide", value: function hide() { var _this14 = this; if (this._isTransitioning || !this._isShown()) { return; } var startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6); if (startEvent.defaultPrevented) { return; } var dimension = this._getDimension(); this._element.style[dimension] = "".concat(this._element.getBoundingClientRect()[dimension], "px"); reflow(this._element); this._element.classList.add(CLASS_NAME_COLLAPSING); this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7); var _iterator9 = _createForOfIteratorHelper(this._triggerArray), _step9; try { for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) { var trigger = _step9.value; var element = getElementFromSelector(trigger); if (element && !this._isShown(element)) { this._addAriaAndCollapsedClass([trigger], false); } } } catch (err) { _iterator9.e(err); } finally { _iterator9.f(); } this._isTransitioning = true; var complete = function complete() { _this14._isTransitioning = false; _this14._element.classList.remove(CLASS_NAME_COLLAPSING); _this14._element.classList.add(CLASS_NAME_COLLAPSE); EventHandler.trigger(_this14._element, EVENT_HIDDEN$6); }; this._element.style[dimension] = ''; this._queueCallback(complete, this._element, true); } }, { key: "_isShown", value: function _isShown() { var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._element; return element.classList.contains(CLASS_NAME_SHOW$7); } // Private }, { key: "_configAfterMerge", value: function _configAfterMerge(config) { config.toggle = Boolean(config.toggle); // Coerce string values config.parent = getElement(config.parent); return config; } }, { key: "_getDimension", value: function _getDimension() { return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT; } }, { key: "_initializeChildren", value: function _initializeChildren() { if (!this._config.parent) { return; } var children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4); var _iterator10 = _createForOfIteratorHelper(children), _step10; try { for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) { var element = _step10.value; var selected = getElementFromSelector(element); if (selected) { this._addAriaAndCollapsedClass([element], this._isShown(selected)); } } } catch (err) { _iterator10.e(err); } finally { _iterator10.f(); } } }, { key: "_getFirstLevelChildren", value: function _getFirstLevelChildren(selector) { var children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent); // remove children if greater depth return SelectorEngine.find(selector, this._config.parent).filter(function (element) { return !children.includes(element); }); } }, { key: "_addAriaAndCollapsedClass", value: function _addAriaAndCollapsedClass(triggerArray, isOpen) { if (!triggerArray.length) { return; } var _iterator11 = _createForOfIteratorHelper(triggerArray), _step11; try { for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) { var element = _step11.value; element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen); element.setAttribute('aria-expanded', isOpen); } } catch (err) { _iterator11.e(err); } finally { _iterator11.f(); } } // Static }], [{ key: "Default", get: function get() { return Default$a; } }, { key: "DefaultType", get: function get() { return DefaultType$a; } }, { key: "NAME", get: function get() { return NAME$b; } }, { key: "jQueryInterface", value: function jQueryInterface(config) { var _config = {}; if (typeof config === 'string' && /show|hide/.test(config)) { _config.toggle = false; } return this.each(function () { var data = Collapse.getOrCreateInstance(this, _config); if (typeof config === 'string') { if (typeof data[config] === 'undefined') { throw new TypeError("No method named \"".concat(config, "\"")); } data[config](); } }); } }]); return Collapse; }(BaseComponent); /** * Data API implementation */ EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) { // preventDefault only for elements (which change the URL) not inside the collapsible element if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') { event.preventDefault(); } var selector = getSelectorFromElement(this); var selectorElements = SelectorEngine.find(selector); var _iterator12 = _createForOfIteratorHelper(selectorElements), _step12; try { for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) { var element = _step12.value; Collapse.getOrCreateInstance(element, { toggle: false }).toggle(); } } catch (err) { _iterator12.e(err); } finally { _iterator12.f(); } }); /** * jQuery */ defineJQueryPlugin(Collapse); /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): dropdown.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ var NAME$a = 'dropdown'; var DATA_KEY$6 = 'bs.dropdown'; var EVENT_KEY$6 = ".".concat(DATA_KEY$6); var DATA_API_KEY$3 = '.data-api'; var ESCAPE_KEY$2 = 'Escape'; var TAB_KEY$1 = 'Tab'; var ARROW_UP_KEY$1 = 'ArrowUp'; var ARROW_DOWN_KEY$1 = 'ArrowDown'; var RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button var EVENT_HIDE$5 = "hide".concat(EVENT_KEY$6); var EVENT_HIDDEN$5 = "hidden".concat(EVENT_KEY$6); var EVENT_SHOW$5 = "show".concat(EVENT_KEY$6); var EVENT_SHOWN$5 = "shown".concat(EVENT_KEY$6); var EVENT_CLICK_DATA_API$3 = "click".concat(EVENT_KEY$6).concat(DATA_API_KEY$3); var EVENT_KEYDOWN_DATA_API = "keydown".concat(EVENT_KEY$6).concat(DATA_API_KEY$3); var EVENT_KEYUP_DATA_API = "keyup".concat(EVENT_KEY$6).concat(DATA_API_KEY$3); var CLASS_NAME_SHOW$6 = 'show'; var CLASS_NAME_DROPUP = 'dropup'; var CLASS_NAME_DROPEND = 'dropend'; var CLASS_NAME_DROPSTART = 'dropstart'; var CLASS_NAME_DROPUP_CENTER = 'dropup-center'; var CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'; var SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)'; var SELECTOR_DATA_TOGGLE_SHOWN = "".concat(SELECTOR_DATA_TOGGLE$3, ".").concat(CLASS_NAME_SHOW$6); var SELECTOR_MENU = '.dropdown-menu'; var SELECTOR_NAVBAR = '.navbar'; var SELECTOR_NAVBAR_NAV = '.navbar-nav'; var SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'; var PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'; var PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'; var PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'; var PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'; var PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'; var PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'; var PLACEMENT_TOPCENTER = 'top'; var PLACEMENT_BOTTOMCENTER = 'bottom'; var Default$9 = { autoClose: true, boundary: 'clippingParents', display: 'dynamic', offset: [0, 2], popperConfig: null, reference: 'toggle' }; var DefaultType$9 = { autoClose: '(boolean|string)', boundary: '(string|element)', display: 'string', offset: '(array|string|function)', popperConfig: '(null|object|function)', reference: '(string|element|object)' }; /** * Class definition */ var Dropdown = /*#__PURE__*/function (_BaseComponent5) { _inherits(Dropdown, _BaseComponent5); var _super7 = _createSuper(Dropdown); function Dropdown(element, config) { var _this15; _classCallCheck(this, Dropdown); _this15 = _super7.call(this, element, config); _this15._popper = null; _this15._parent = _this15._element.parentNode; // dropdown wrapper _this15._menu = SelectorEngine.findOne(SELECTOR_MENU, _this15._parent); _this15._inNavbar = _this15._detectNavbar(); return _this15; } // Getters _createClass(Dropdown, [{ key: "toggle", value: // Public function toggle() { return this._isShown() ? this.hide() : this.show(); } }, { key: "show", value: function show() { if (isDisabled(this._element) || this._isShown()) { return; } var relatedTarget = { relatedTarget: this._element }; var showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget); if (showEvent.defaultPrevented) { return; } this._createPopper(); // If this is a touch-enabled device we add extra // empty mouseover listeners to the body's immediate children; // only needed because of broken event delegation on iOS // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) { var _ref4; var _iterator13 = _createForOfIteratorHelper((_ref4 = []).concat.apply(_ref4, _toConsumableArray(document.body.children))), _step13; try { for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) { var element = _step13.value; EventHandler.on(element, 'mouseover', noop); } } catch (err) { _iterator13.e(err); } finally { _iterator13.f(); } } this._element.focus(); this._element.setAttribute('aria-expanded', true); this._menu.classList.add(CLASS_NAME_SHOW$6); this._element.classList.add(CLASS_NAME_SHOW$6); EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget); } }, { key: "hide", value: function hide() { if (isDisabled(this._element) || !this._isShown()) { return; } var relatedTarget = { relatedTarget: this._element }; this._completeHide(relatedTarget); } }, { key: "dispose", value: function dispose() { if (this._popper) { this._popper.destroy(); } _get(_getPrototypeOf(Dropdown.prototype), "dispose", this).call(this); } }, { key: "update", value: function update() { this._inNavbar = this._detectNavbar(); if (this._popper) { this._popper.update(); } } // Private }, { key: "_completeHide", value: function _completeHide(relatedTarget) { var hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget); if (hideEvent.defaultPrevented) { return; } // If this is a touch-enabled device we remove the extra // empty mouseover listeners we added for iOS support if ('ontouchstart' in document.documentElement) { var _ref5; var _iterator14 = _createForOfIteratorHelper((_ref5 = []).concat.apply(_ref5, _toConsumableArray(document.body.children))), _step14; try { for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) { var element = _step14.value; EventHandler.off(element, 'mouseover', noop); } } catch (err) { _iterator14.e(err); } finally { _iterator14.f(); } } if (this._popper) { this._popper.destroy(); } this._menu.classList.remove(CLASS_NAME_SHOW$6); this._element.classList.remove(CLASS_NAME_SHOW$6); this._element.setAttribute('aria-expanded', 'false'); Manipulator.removeDataAttribute(this._menu, 'popper'); EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget); } }, { key: "_getConfig", value: function _getConfig(config) { config = _get(_getPrototypeOf(Dropdown.prototype), "_getConfig", this).call(this, config); if (_typeof(config.reference) === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') { // Popper virtual elements require a getBoundingClientRect method throw new TypeError("".concat(NAME$a.toUpperCase(), ": Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.")); } return config; } }, { key: "_createPopper", value: function _createPopper() { if (typeof Popper__namespace === 'undefined') { throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)'); } var referenceElement = this._element; if (this._config.reference === 'parent') { referenceElement = this._parent; } else if (isElement(this._config.reference)) { referenceElement = getElement(this._config.reference); } else if (_typeof(this._config.reference) === 'object') { referenceElement = this._config.reference; } var popperConfig = this._getPopperConfig(); this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig); } }, { key: "_isShown", value: function _isShown() { return this._menu.classList.contains(CLASS_NAME_SHOW$6); } }, { key: "_getPlacement", value: function _getPlacement() { var parentDropdown = this._parent; if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) { return PLACEMENT_RIGHT; } if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) { return PLACEMENT_LEFT; } if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) { return PLACEMENT_TOPCENTER; } if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) { return PLACEMENT_BOTTOMCENTER; } // We need to trim the value because custom properties can also include spaces var isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'; if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) { return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP; } return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM; } }, { key: "_detectNavbar", value: function _detectNavbar() { return this._element.closest(SELECTOR_NAVBAR) !== null; } }, { key: "_getOffset", value: function _getOffset() { var _this16 = this; var offset = this._config.offset; if (typeof offset === 'string') { return offset.split(',').map(function (value) { return Number.parseInt(value, 10); }); } if (typeof offset === 'function') { return function (popperData) { return offset(popperData, _this16._element); }; } return offset; } }, { key: "_getPopperConfig", value: function _getPopperConfig() { var defaultBsPopperConfig = { placement: this._getPlacement(), modifiers: [{ name: 'preventOverflow', options: { boundary: this._config.boundary } }, { name: 'offset', options: { offset: this._getOffset() } }] }; // Disable Popper if we have a static display or Dropdown is in Navbar if (this._inNavbar || this._config.display === 'static') { Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // todo:v6 remove defaultBsPopperConfig.modifiers = [{ name: 'applyStyles', enabled: false }]; } return _objectSpread(_objectSpread({}, defaultBsPopperConfig), typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig); } }, { key: "_selectMenuItem", value: function _selectMenuItem(_ref6) { var key = _ref6.key, target = _ref6.target; var items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(function (element) { return isVisible(element); }); if (!items.length) { return; } // if target isn't included in items (e.g. when expanding the dropdown) // allow cycling to get the last item in case key equals ARROW_UP_KEY getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus(); } // Static }], [{ key: "Default", get: function get() { return Default$9; } }, { key: "DefaultType", get: function get() { return DefaultType$9; } }, { key: "NAME", get: function get() { return NAME$a; } }, { key: "jQueryInterface", value: function jQueryInterface(config) { return this.each(function () { var data = Dropdown.getOrCreateInstance(this, config); if (typeof config !== 'string') { return; } if (typeof data[config] === 'undefined') { throw new TypeError("No method named \"".concat(config, "\"")); } data[config](); }); } }, { key: "clearMenus", value: function clearMenus(event) { if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) { return; } var openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN); var _iterator15 = _createForOfIteratorHelper(openToggles), _step15; try { for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) { var toggle = _step15.value; var context = Dropdown.getInstance(toggle); if (!context || context._config.autoClose === false) { continue; } var composedPath = event.composedPath(); var isMenuTarget = composedPath.includes(context._menu); if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) { continue; } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) { continue; } var relatedTarget = { relatedTarget: context._element }; if (event.type === 'click') { relatedTarget.clickEvent = event; } context._completeHide(relatedTarget); } } catch (err) { _iterator15.e(err); } finally { _iterator15.f(); } } }, { key: "dataApiKeydownHandler", value: function dataApiKeydownHandler(event) { // If not an UP | DOWN | ESCAPE key => not a dropdown command // If input/textarea && if key is other than ESCAPE => not a dropdown command var isInput = /input|textarea/i.test(event.target.tagName); var isEscapeEvent = event.key === ESCAPE_KEY$2; var isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key); if (!isUpOrDownEvent && !isEscapeEvent) { return; } if (isInput && !isEscapeEvent) { return; } event.preventDefault(); var getToggleButton = SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode); var instance = Dropdown.getOrCreateInstance(getToggleButton); if (isUpOrDownEvent) { event.stopPropagation(); instance.show(); instance._selectMenuItem(event); return; } if (instance._isShown()) { // else is escape and we check if it is shown event.stopPropagation(); instance.hide(); getToggleButton.focus(); } } }]); return Dropdown; }(BaseComponent); /** * Data API implementation */ EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler); EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler); EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus); EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus); EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) { event.preventDefault(); Dropdown.getOrCreateInstance(this).toggle(); }); /** * jQuery */ defineJQueryPlugin(Dropdown); /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): util/scrollBar.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ var SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'; var SELECTOR_STICKY_CONTENT = '.sticky-top'; var PROPERTY_PADDING = 'padding-right'; var PROPERTY_MARGIN = 'margin-right'; /** * Class definition */ var ScrollBarHelper = /*#__PURE__*/function () { function ScrollBarHelper() { _classCallCheck(this, ScrollBarHelper); this._element = document.body; } // Public _createClass(ScrollBarHelper, [{ key: "getWidth", value: function getWidth() { // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes var documentWidth = document.documentElement.clientWidth; return Math.abs(window.innerWidth - documentWidth); } }, { key: "hide", value: function hide() { var width = this.getWidth(); this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width this._setElementAttributes(this._element, PROPERTY_PADDING, function (calculatedValue) { return calculatedValue + width; }); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, function (calculatedValue) { return calculatedValue + width; }); this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, function (calculatedValue) { return calculatedValue - width; }); } }, { key: "reset", value: function reset() { this._resetElementAttributes(this._element, 'overflow'); this._resetElementAttributes(this._element, PROPERTY_PADDING); this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING); this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN); } }, { key: "isOverflowing", value: function isOverflowing() { return this.getWidth() > 0; } // Private }, { key: "_disableOverFlow", value: function _disableOverFlow() { this._saveInitialAttribute(this._element, 'overflow'); this._element.style.overflow = 'hidden'; } }, { key: "_setElementAttributes", value: function _setElementAttributes(selector, styleProperty, callback) { var _this17 = this; var scrollbarWidth = this.getWidth(); var manipulationCallBack = function manipulationCallBack(element) { if (element !== _this17._element && window.innerWidth > element.clientWidth + scrollbarWidth) { return; } _this17._saveInitialAttribute(element, styleProperty); var calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty); element.style.setProperty(styleProperty, "".concat(callback(Number.parseFloat(calculatedValue)), "px")); }; this._applyManipulationCallback(selector, manipulationCallBack); } }, { key: "_saveInitialAttribute", value: function _saveInitialAttribute(element, styleProperty) { var actualValue = element.style.getPropertyValue(styleProperty); if (actualValue) { Manipulator.setDataAttribute(element, styleProperty, actualValue); } } }, { key: "_resetElementAttributes", value: function _resetElementAttributes(selector, styleProperty) { var manipulationCallBack = function manipulationCallBack(element) { var value = Manipulator.getDataAttribute(element, styleProperty); // We only want to remove the property if the value is `null`; the value can also be zero if (value === null) { element.style.removeProperty(styleProperty); return; } Manipulator.removeDataAttribute(element, styleProperty); element.style.setProperty(styleProperty, value); }; this._applyManipulationCallback(selector, manipulationCallBack); } }, { key: "_applyManipulationCallback", value: function _applyManipulationCallback(selector, callBack) { if (isElement(selector)) { callBack(selector); return; } var _iterator16 = _createForOfIteratorHelper(SelectorEngine.find(selector, this._element)), _step16; try { for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) { var sel = _step16.value; callBack(sel); } } catch (err) { _iterator16.e(err); } finally { _iterator16.f(); } } }]); return ScrollBarHelper; }(); /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): util/backdrop.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ var NAME$9 = 'backdrop'; var CLASS_NAME_FADE$4 = 'fade'; var CLASS_NAME_SHOW$5 = 'show'; var EVENT_MOUSEDOWN = "mousedown.bs.".concat(NAME$9); var Default$8 = { className: 'modal-backdrop', clickCallback: null, isAnimated: false, isVisible: true, // if false, we use the backdrop helper without adding any element to the dom rootElement: 'body' // give the choice to place backdrop under different elements }; var DefaultType$8 = { className: 'string', clickCallback: '(function|null)', isAnimated: 'boolean', isVisible: 'boolean', rootElement: '(element|string)' }; /** * Class definition */ var Backdrop = /*#__PURE__*/function (_Config3) { _inherits(Backdrop, _Config3); var _super8 = _createSuper(Backdrop); function Backdrop(config) { var _this18; _classCallCheck(this, Backdrop); _this18 = _super8.call(this); _this18._config = _this18._getConfig(config); _this18._isAppended = false; _this18._element = null; return _this18; } // Getters _createClass(Backdrop, [{ key: "show", value: // Public function show(callback) { if (!this._config.isVisible) { execute(callback); return; } this._append(); var element = this._getElement(); if (this._config.isAnimated) { reflow(element); } element.classList.add(CLASS_NAME_SHOW$5); this._emulateAnimation(function () { execute(callback); }); } }, { key: "hide", value: function hide(callback) { var _this19 = this; if (!this._config.isVisible) { execute(callback); return; } this._getElement().classList.remove(CLASS_NAME_SHOW$5); this._emulateAnimation(function () { _this19.dispose(); execute(callback); }); } }, { key: "dispose", value: function dispose() { if (!this._isAppended) { return; } EventHandler.off(this._element, EVENT_MOUSEDOWN); this._element.remove(); this._isAppended = false; } // Private }, { key: "_getElement", value: function _getElement() { if (!this._element) { var backdrop = document.createElement('div'); backdrop.className = this._config.className; if (this._config.isAnimated) { backdrop.classList.add(CLASS_NAME_FADE$4); } this._element = backdrop; } return this._element; } }, { key: "_configAfterMerge", value: function _configAfterMerge(config) { // use getElement() with the default "body" to get a fresh Element on each instantiation config.rootElement = getElement(config.rootElement); return config; } }, { key: "_append", value: function _append() { var _this20 = this; if (this._isAppended) { return; } var element = this._getElement(); this._config.rootElement.append(element); EventHandler.on(element, EVENT_MOUSEDOWN, function () { execute(_this20._config.clickCallback); }); this._isAppended = true; } }, { key: "_emulateAnimation", value: function _emulateAnimation(callback) { executeAfterTransition(callback, this._getElement(), this._config.isAnimated); } }], [{ key: "Default", get: function get() { return Default$8; } }, { key: "DefaultType", get: function get() { return DefaultType$8; } }, { key: "NAME", get: function get() { return NAME$9; } }]); return Backdrop; }(Config); /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): util/focustrap.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ var NAME$8 = 'focustrap'; var DATA_KEY$5 = 'bs.focustrap'; var EVENT_KEY$5 = ".".concat(DATA_KEY$5); var EVENT_FOCUSIN$2 = "focusin".concat(EVENT_KEY$5); var EVENT_KEYDOWN_TAB = "keydown.tab".concat(EVENT_KEY$5); var TAB_KEY = 'Tab'; var TAB_NAV_FORWARD = 'forward'; var TAB_NAV_BACKWARD = 'backward'; var Default$7 = { autofocus: true, trapElement: null // The element to trap focus inside of }; var DefaultType$7 = { autofocus: 'boolean', trapElement: 'element' }; /** * Class definition */ var FocusTrap = /*#__PURE__*/function (_Config4) { _inherits(FocusTrap, _Config4); var _super9 = _createSuper(FocusTrap); function FocusTrap(config) { var _this21; _classCallCheck(this, FocusTrap); _this21 = _super9.call(this); _this21._config = _this21._getConfig(config); _this21._isActive = false; _this21._lastTabNavDirection = null; return _this21; } // Getters _createClass(FocusTrap, [{ key: "activate", value: // Public function activate() { var _this22 = this; if (this._isActive) { return; } if (this._config.autofocus) { this._config.trapElement.focus(); } EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop EventHandler.on(document, EVENT_FOCUSIN$2, function (event) { return _this22._handleFocusin(event); }); EventHandler.on(document, EVENT_KEYDOWN_TAB, function (event) { return _this22._handleKeydown(event); }); this._isActive = true; } }, { key: "deactivate", value: function deactivate() { if (!this._isActive) { return; } this._isActive = false; EventHandler.off(document, EVENT_KEY$5); } // Private }, { key: "_handleFocusin", value: function _handleFocusin(event) { var trapElement = this._config.trapElement; if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) { return; } var elements = SelectorEngine.focusableChildren(trapElement); if (elements.length === 0) { trapElement.focus(); } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) { elements[elements.length - 1].focus(); } else { elements[0].focus(); } } }, { key: "_handleKeydown", value: function _handleKeydown(event) { if (event.key !== TAB_KEY) { return; } this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD; } }], [{ key: "Default", get: function get() { return Default$7; } }, { key: "DefaultType", get: function get() { return DefaultType$7; } }, { key: "NAME", get: function get() { return NAME$8; } }]); return FocusTrap; }(Config); /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): modal.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ var NAME$7 = 'modal'; var DATA_KEY$4 = 'bs.modal'; var EVENT_KEY$4 = ".".concat(DATA_KEY$4); var DATA_API_KEY$2 = '.data-api'; var ESCAPE_KEY$1 = 'Escape'; var EVENT_HIDE$4 = "hide".concat(EVENT_KEY$4); var EVENT_HIDE_PREVENTED$1 = "hidePrevented".concat(EVENT_KEY$4); var EVENT_HIDDEN$4 = "hidden".concat(EVENT_KEY$4); var EVENT_SHOW$4 = "show".concat(EVENT_KEY$4); var EVENT_SHOWN$4 = "shown".concat(EVENT_KEY$4); var EVENT_RESIZE$1 = "resize".concat(EVENT_KEY$4); var EVENT_MOUSEDOWN_DISMISS = "mousedown.dismiss".concat(EVENT_KEY$4); var EVENT_KEYDOWN_DISMISS$1 = "keydown.dismiss".concat(EVENT_KEY$4); var EVENT_CLICK_DATA_API$2 = "click".concat(EVENT_KEY$4).concat(DATA_API_KEY$2); var CLASS_NAME_OPEN = 'modal-open'; var CLASS_NAME_FADE$3 = 'fade'; var CLASS_NAME_SHOW$4 = 'show'; var CLASS_NAME_STATIC = 'modal-static'; var OPEN_SELECTOR$1 = '.modal.show'; var SELECTOR_DIALOG = '.modal-dialog'; var SELECTOR_MODAL_BODY = '.modal-body'; var SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]'; var Default$6 = { backdrop: true, focus: true, keyboard: true }; var DefaultType$6 = { backdrop: '(boolean|string)', focus: 'boolean', keyboard: 'boolean' }; /** * Class definition */ var Modal = /*#__PURE__*/function (_BaseComponent6) { _inherits(Modal, _BaseComponent6); var _super10 = _createSuper(Modal); function Modal(element, config) { var _this23; _classCallCheck(this, Modal); _this23 = _super10.call(this, element, config); _this23._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, _this23._element); _this23._backdrop = _this23._initializeBackDrop(); _this23._focustrap = _this23._initializeFocusTrap(); _this23._isShown = false; _this23._isTransitioning = false; _this23._scrollBar = new ScrollBarHelper(); _this23._addEventListeners(); return _this23; } // Getters _createClass(Modal, [{ key: "toggle", value: // Public function toggle(relatedTarget) { return this._isShown ? this.hide() : this.show(relatedTarget); } }, { key: "show", value: function show(relatedTarget) { var _this24 = this; if (this._isShown || this._isTransitioning) { return; } var showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, { relatedTarget: relatedTarget }); if (showEvent.defaultPrevented) { return; } this._isShown = true; this._isTransitioning = true; this._scrollBar.hide(); document.body.classList.add(CLASS_NAME_OPEN); this._adjustDialog(); this._backdrop.show(function () { return _this24._showElement(relatedTarget); }); } }, { key: "hide", value: function hide() { var _this25 = this; if (!this._isShown || this._isTransitioning) { return; } var hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4); if (hideEvent.defaultPrevented) { return; } this._isShown = false; this._isTransitioning = true; this._focustrap.deactivate(); this._element.classList.remove(CLASS_NAME_SHOW$4); this._queueCallback(function () { return _this25._hideModal(); }, this._element, this._isAnimated()); } }, { key: "dispose", value: function dispose() { for (var _i7 = 0, _arr2 = [window, this._dialog]; _i7 < _arr2.length; _i7++) { var htmlElement = _arr2[_i7]; EventHandler.off(htmlElement, EVENT_KEY$4); } this._backdrop.dispose(); this._focustrap.deactivate(); _get(_getPrototypeOf(Modal.prototype), "dispose", this).call(this); } }, { key: "handleUpdate", value: function handleUpdate() { this._adjustDialog(); } // Private }, { key: "_initializeBackDrop", value: function _initializeBackDrop() { return new Backdrop({ isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value, isAnimated: this._isAnimated() }); } }, { key: "_initializeFocusTrap", value: function _initializeFocusTrap() { return new FocusTrap({ trapElement: this._element }); } }, { key: "_showElement", value: function _showElement(relatedTarget) { var _this26 = this; // try to append dynamic modal if (!document.body.contains(this._element)) { document.body.append(this._element); } this._element.style.display = 'block'; this._element.removeAttribute('aria-hidden'); this._element.setAttribute('aria-modal', true); this._element.setAttribute('role', 'dialog'); this._element.scrollTop = 0; var modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog); if (modalBody) { modalBody.scrollTop = 0; } reflow(this._element); this._element.classList.add(CLASS_NAME_SHOW$4); var transitionComplete = function transitionComplete() { if (_this26._config.focus) { _this26._focustrap.activate(); } _this26._isTransitioning = false; EventHandler.trigger(_this26._element, EVENT_SHOWN$4, { relatedTarget: relatedTarget }); }; this._queueCallback(transitionComplete, this._dialog, this._isAnimated()); } }, { key: "_addEventListeners", value: function _addEventListeners() { var _this27 = this; EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, function (event) { if (event.key !== ESCAPE_KEY$1) { return; } if (_this27._config.keyboard) { event.preventDefault(); _this27.hide(); return; } _this27._triggerBackdropTransition(); }); EventHandler.on(window, EVENT_RESIZE$1, function () { if (_this27._isShown && !_this27._isTransitioning) { _this27._adjustDialog(); } }); EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, function (event) { if (event.target !== event.currentTarget) { // click is inside modal-dialog return; } if (_this27._config.backdrop === 'static') { _this27._triggerBackdropTransition(); return; } if (_this27._config.backdrop) { _this27.hide(); } }); } }, { key: "_hideModal", value: function _hideModal() { var _this28 = this; this._element.style.display = 'none'; this._element.setAttribute('aria-hidden', true); this._element.removeAttribute('aria-modal'); this._element.removeAttribute('role'); this._isTransitioning = false; this._backdrop.hide(function () { document.body.classList.remove(CLASS_NAME_OPEN); _this28._resetAdjustments(); _this28._scrollBar.reset(); EventHandler.trigger(_this28._element, EVENT_HIDDEN$4); }); } }, { key: "_isAnimated", value: function _isAnimated() { return this._element.classList.contains(CLASS_NAME_FADE$3); } }, { key: "_triggerBackdropTransition", value: function _triggerBackdropTransition() { var _this29 = this; var hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1); if (hideEvent.defaultPrevented) { return; } var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; var initialOverflowY = this._element.style.overflowY; // return if the following background transition hasn't yet completed if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) { return; } if (!isModalOverflowing) { this._element.style.overflowY = 'hidden'; } this._element.classList.add(CLASS_NAME_STATIC); this._queueCallback(function () { _this29._element.classList.remove(CLASS_NAME_STATIC); _this29._queueCallback(function () { _this29._element.style.overflowY = initialOverflowY; }, _this29._dialog); }, this._dialog); this._element.focus(); } /** * The following methods are used to handle overflowing modals */ }, { key: "_adjustDialog", value: function _adjustDialog() { var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; var scrollbarWidth = this._scrollBar.getWidth(); var isBodyOverflowing = scrollbarWidth > 0; if (isBodyOverflowing && !isModalOverflowing) { var property = isRTL() ? 'paddingLeft' : 'paddingRight'; this._element.style[property] = "".concat(scrollbarWidth, "px"); } if (!isBodyOverflowing && isModalOverflowing) { var _property = isRTL() ? 'paddingRight' : 'paddingLeft'; this._element.style[_property] = "".concat(scrollbarWidth, "px"); } } }, { key: "_resetAdjustments", value: function _resetAdjustments() { this._element.style.paddingLeft = ''; this._element.style.paddingRight = ''; } // Static }], [{ key: "Default", get: function get() { return Default$6; } }, { key: "DefaultType", get: function get() { return DefaultType$6; } }, { key: "NAME", get: function get() { return NAME$7; } }, { key: "jQueryInterface", value: function jQueryInterface(config, relatedTarget) { return this.each(function () { var data = Modal.getOrCreateInstance(this, config); if (typeof config !== 'string') { return; } if (typeof data[config] === 'undefined') { throw new TypeError("No method named \"".concat(config, "\"")); } data[config](relatedTarget); }); } }]); return Modal; }(BaseComponent); /** * Data API implementation */ EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) { var _this30 = this; var target = getElementFromSelector(this); if (['A', 'AREA'].includes(this.tagName)) { event.preventDefault(); } EventHandler.one(target, EVENT_SHOW$4, function (showEvent) { if (showEvent.defaultPrevented) { // only register focus restorer if modal will actually get shown return; } EventHandler.one(target, EVENT_HIDDEN$4, function () { if (isVisible(_this30)) { _this30.focus(); } }); }); // avoid conflict when clicking modal toggler while another one is open var alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1); if (alreadyOpen) { Modal.getInstance(alreadyOpen).hide(); } var data = Modal.getOrCreateInstance(target); data.toggle(this); }); enableDismissTrigger(Modal); /** * jQuery */ defineJQueryPlugin(Modal); /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): offcanvas.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ var NAME$6 = 'offcanvas'; var DATA_KEY$3 = 'bs.offcanvas'; var EVENT_KEY$3 = ".".concat(DATA_KEY$3); var DATA_API_KEY$1 = '.data-api'; var EVENT_LOAD_DATA_API$2 = "load".concat(EVENT_KEY$3).concat(DATA_API_KEY$1); var ESCAPE_KEY = 'Escape'; var CLASS_NAME_SHOW$3 = 'show'; var CLASS_NAME_SHOWING$1 = 'showing'; var CLASS_NAME_HIDING = 'hiding'; var CLASS_NAME_BACKDROP = 'offcanvas-backdrop'; var OPEN_SELECTOR = '.offcanvas.show'; var EVENT_SHOW$3 = "show".concat(EVENT_KEY$3); var EVENT_SHOWN$3 = "shown".concat(EVENT_KEY$3); var EVENT_HIDE$3 = "hide".concat(EVENT_KEY$3); var EVENT_HIDE_PREVENTED = "hidePrevented".concat(EVENT_KEY$3); var EVENT_HIDDEN$3 = "hidden".concat(EVENT_KEY$3); var EVENT_RESIZE = "resize".concat(EVENT_KEY$3); var EVENT_CLICK_DATA_API$1 = "click".concat(EVENT_KEY$3).concat(DATA_API_KEY$1); var EVENT_KEYDOWN_DISMISS = "keydown.dismiss".concat(EVENT_KEY$3); var SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]'; var Default$5 = { backdrop: true, keyboard: true, scroll: false }; var DefaultType$5 = { backdrop: '(boolean|string)', keyboard: 'boolean', scroll: 'boolean' }; /** * Class definition */ var Offcanvas = /*#__PURE__*/function (_BaseComponent7) { _inherits(Offcanvas, _BaseComponent7); var _super11 = _createSuper(Offcanvas); function Offcanvas(element, config) { var _this31; _classCallCheck(this, Offcanvas); _this31 = _super11.call(this, element, config); _this31._isShown = false; _this31._backdrop = _this31._initializeBackDrop(); _this31._focustrap = _this31._initializeFocusTrap(); _this31._addEventListeners(); return _this31; } // Getters _createClass(Offcanvas, [{ key: "toggle", value: // Public function toggle(relatedTarget) { return this._isShown ? this.hide() : this.show(relatedTarget); } }, { key: "show", value: function show(relatedTarget) { var _this32 = this; if (this._isShown) { return; } var showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, { relatedTarget: relatedTarget }); if (showEvent.defaultPrevented) { return; } this._isShown = true; this._backdrop.show(); if (!this._config.scroll) { new ScrollBarHelper().hide(); } this._element.setAttribute('aria-modal', true); this._element.setAttribute('role', 'dialog'); this._element.classList.add(CLASS_NAME_SHOWING$1); var completeCallBack = function completeCallBack() { if (!_this32._config.scroll || _this32._config.backdrop) { _this32._focustrap.activate(); } _this32._element.classList.add(CLASS_NAME_SHOW$3); _this32._element.classList.remove(CLASS_NAME_SHOWING$1); EventHandler.trigger(_this32._element, EVENT_SHOWN$3, { relatedTarget: relatedTarget }); }; this._queueCallback(completeCallBack, this._element, true); } }, { key: "hide", value: function hide() { var _this33 = this; if (!this._isShown) { return; } var hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3); if (hideEvent.defaultPrevented) { return; } this._focustrap.deactivate(); this._element.blur(); this._isShown = false; this._element.classList.add(CLASS_NAME_HIDING); this._backdrop.hide(); var completeCallback = function completeCallback() { _this33._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING); _this33._element.removeAttribute('aria-modal'); _this33._element.removeAttribute('role'); if (!_this33._config.scroll) { new ScrollBarHelper().reset(); } EventHandler.trigger(_this33._element, EVENT_HIDDEN$3); }; this._queueCallback(completeCallback, this._element, true); } }, { key: "dispose", value: function dispose() { this._backdrop.dispose(); this._focustrap.deactivate(); _get(_getPrototypeOf(Offcanvas.prototype), "dispose", this).call(this); } // Private }, { key: "_initializeBackDrop", value: function _initializeBackDrop() { var _this34 = this; var clickCallback = function clickCallback() { if (_this34._config.backdrop === 'static') { EventHandler.trigger(_this34._element, EVENT_HIDE_PREVENTED); return; } _this34.hide(); }; // 'static' option will be translated to true, and booleans will keep their value var isVisible = Boolean(this._config.backdrop); return new Backdrop({ className: CLASS_NAME_BACKDROP, isVisible: isVisible, isAnimated: true, rootElement: this._element.parentNode, clickCallback: isVisible ? clickCallback : null }); } }, { key: "_initializeFocusTrap", value: function _initializeFocusTrap() { return new FocusTrap({ trapElement: this._element }); } }, { key: "_addEventListeners", value: function _addEventListeners() { var _this35 = this; EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, function (event) { if (event.key !== ESCAPE_KEY) { return; } if (!_this35._config.keyboard) { EventHandler.trigger(_this35._element, EVENT_HIDE_PREVENTED); return; } _this35.hide(); }); } // Static }], [{ key: "Default", get: function get() { return Default$5; } }, { key: "DefaultType", get: function get() { return DefaultType$5; } }, { key: "NAME", get: function get() { return NAME$6; } }, { key: "jQueryInterface", value: function jQueryInterface(config) { return this.each(function () { var data = Offcanvas.getOrCreateInstance(this, config); if (typeof config !== 'string') { return; } if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { throw new TypeError("No method named \"".concat(config, "\"")); } data[config](this); }); } }]); return Offcanvas; }(BaseComponent); /** * Data API implementation */ EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) { var _this36 = this; var target = getElementFromSelector(this); if (['A', 'AREA'].includes(this.tagName)) { event.preventDefault(); } if (isDisabled(this)) { return; } EventHandler.one(target, EVENT_HIDDEN$3, function () { // focus on trigger when it is closed if (isVisible(_this36)) { _this36.focus(); } }); // avoid conflict when clicking a toggler of an offcanvas, while another is open var alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR); if (alreadyOpen && alreadyOpen !== target) { Offcanvas.getInstance(alreadyOpen).hide(); } var data = Offcanvas.getOrCreateInstance(target); data.toggle(this); }); EventHandler.on(window, EVENT_LOAD_DATA_API$2, function () { var _iterator17 = _createForOfIteratorHelper(SelectorEngine.find(OPEN_SELECTOR)), _step17; try { for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) { var selector = _step17.value; Offcanvas.getOrCreateInstance(selector).show(); } } catch (err) { _iterator17.e(err); } finally { _iterator17.f(); } }); EventHandler.on(window, EVENT_RESIZE, function () { var _iterator18 = _createForOfIteratorHelper(SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')), _step18; try { for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) { var element = _step18.value; if (getComputedStyle(element).position !== 'fixed') { Offcanvas.getOrCreateInstance(element).hide(); } } } catch (err) { _iterator18.e(err); } finally { _iterator18.f(); } }); enableDismissTrigger(Offcanvas); /** * jQuery */ defineJQueryPlugin(Offcanvas); /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): util/sanitizer.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ var uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']); var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; /** * A pattern that recognizes a commonly useful subset of URLs that are safe. * * Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts */ var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i; /** * A pattern that matches safe data URLs. Only matches image, video and audio types. * * Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts */ var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i; var allowedAttribute = function allowedAttribute(attribute, allowedAttributeList) { var attributeName = attribute.nodeName.toLowerCase(); if (allowedAttributeList.includes(attributeName)) { if (uriAttributes.has(attributeName)) { return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue)); } return true; } // Check if a regular expression validates the attribute. return allowedAttributeList.filter(function (attributeRegex) { return attributeRegex instanceof RegExp; }).some(function (regex) { return regex.test(attributeName); }); }; var DefaultAllowlist = { // Global attributes allowed on any supplied element below. '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], a: ['target', 'href', 'title', 'rel'], area: [], b: [], br: [], col: [], code: [], div: [], em: [], hr: [], h1: [], h2: [], h3: [], h4: [], h5: [], h6: [], i: [], img: ['src', 'srcset', 'alt', 'title', 'width', 'height'], li: [], ol: [], p: [], pre: [], s: [], small: [], span: [], sub: [], sup: [], strong: [], u: [], ul: [] }; function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) { var _ref7; if (!unsafeHtml.length) { return unsafeHtml; } if (sanitizeFunction && typeof sanitizeFunction === 'function') { return sanitizeFunction(unsafeHtml); } var domParser = new window.DOMParser(); var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html'); var elements = (_ref7 = []).concat.apply(_ref7, _toConsumableArray(createdDocument.body.querySelectorAll('*'))); var _iterator19 = _createForOfIteratorHelper(elements), _step19; try { for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) { var _ref8; var element = _step19.value; var elementName = element.nodeName.toLowerCase(); if (!Object.keys(allowList).includes(elementName)) { element.remove(); continue; } var attributeList = (_ref8 = []).concat.apply(_ref8, _toConsumableArray(element.attributes)); var allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []); var _iterator20 = _createForOfIteratorHelper(attributeList), _step20; try { for (_iterator20.s(); !(_step20 = _iterator20.n()).done;) { var attribute = _step20.value; if (!allowedAttribute(attribute, allowedAttributes)) { element.removeAttribute(attribute.nodeName); } } } catch (err) { _iterator20.e(err); } finally { _iterator20.f(); } } } catch (err) { _iterator19.e(err); } finally { _iterator19.f(); } return createdDocument.body.innerHTML; } /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): util/template-factory.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ var NAME$5 = 'TemplateFactory'; var Default$4 = { allowList: DefaultAllowlist, content: {}, // { selector : text , selector2 : text2 , } extraClass: '', html: false, sanitize: true, sanitizeFn: null, template: '
' }; var DefaultType$4 = { allowList: 'object', content: 'object', extraClass: '(string|function)', html: 'boolean', sanitize: 'boolean', sanitizeFn: '(null|function)', template: 'string' }; var DefaultContentType = { entry: '(string|element|function|null)', selector: '(string|element)' }; /** * Class definition */ var TemplateFactory = /*#__PURE__*/function (_Config5) { _inherits(TemplateFactory, _Config5); var _super12 = _createSuper(TemplateFactory); function TemplateFactory(config) { var _this37; _classCallCheck(this, TemplateFactory); _this37 = _super12.call(this); _this37._config = _this37._getConfig(config); return _this37; } // Getters _createClass(TemplateFactory, [{ key: "getContent", value: // Public function getContent() { var _this38 = this; return Object.values(this._config.content).map(function (config) { return _this38._resolvePossibleFunction(config); }).filter(Boolean); } }, { key: "hasContent", value: function hasContent() { return this.getContent().length > 0; } }, { key: "changeContent", value: function changeContent(content) { this._checkContent(content); this._config.content = _objectSpread(_objectSpread({}, this._config.content), content); return this; } }, { key: "toHtml", value: function toHtml() { var templateWrapper = document.createElement('div'); templateWrapper.innerHTML = this._maybeSanitize(this._config.template); for (var _i8 = 0, _Object$entries2 = Object.entries(this._config.content); _i8 < _Object$entries2.length; _i8++) { var _Object$entries2$_i = _slicedToArray(_Object$entries2[_i8], 2), selector = _Object$entries2$_i[0], text = _Object$entries2$_i[1]; this._setContent(templateWrapper, text, selector); } var template = templateWrapper.children[0]; var extraClass = this._resolvePossibleFunction(this._config.extraClass); if (extraClass) { var _template$classList; (_template$classList = template.classList).add.apply(_template$classList, _toConsumableArray(extraClass.split(' '))); } return template; } // Private }, { key: "_typeCheckConfig", value: function _typeCheckConfig(config) { _get(_getPrototypeOf(TemplateFactory.prototype), "_typeCheckConfig", this).call(this, config); this._checkContent(config.content); } }, { key: "_checkContent", value: function _checkContent(arg) { for (var _i9 = 0, _Object$entries3 = Object.entries(arg); _i9 < _Object$entries3.length; _i9++) { var _Object$entries3$_i = _slicedToArray(_Object$entries3[_i9], 2), selector = _Object$entries3$_i[0], content = _Object$entries3$_i[1]; _get(_getPrototypeOf(TemplateFactory.prototype), "_typeCheckConfig", this).call(this, { selector: selector, entry: content }, DefaultContentType); } } }, { key: "_setContent", value: function _setContent(template, content, selector) { var templateElement = SelectorEngine.findOne(selector, template); if (!templateElement) { return; } content = this._resolvePossibleFunction(content); if (!content) { templateElement.remove(); return; } if (isElement(content)) { this._putElementInTemplate(getElement(content), templateElement); return; } if (this._config.html) { templateElement.innerHTML = this._maybeSanitize(content); return; } templateElement.textContent = content; } }, { key: "_maybeSanitize", value: function _maybeSanitize(arg) { return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg; } }, { key: "_resolvePossibleFunction", value: function _resolvePossibleFunction(arg) { return typeof arg === 'function' ? arg(this) : arg; } }, { key: "_putElementInTemplate", value: function _putElementInTemplate(element, templateElement) { if (this._config.html) { templateElement.innerHTML = ''; templateElement.append(element); return; } templateElement.textContent = element.textContent; } }], [{ key: "Default", get: function get() { return Default$4; } }, { key: "DefaultType", get: function get() { return DefaultType$4; } }, { key: "NAME", get: function get() { return NAME$5; } }]); return TemplateFactory; }(Config); /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): tooltip.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ var NAME$4 = 'tooltip'; var DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']); var CLASS_NAME_FADE$2 = 'fade'; var CLASS_NAME_MODAL = 'modal'; var CLASS_NAME_SHOW$2 = 'show'; var SELECTOR_TOOLTIP_INNER = '.tooltip-inner'; var SELECTOR_MODAL = ".".concat(CLASS_NAME_MODAL); var EVENT_MODAL_HIDE = 'hide.bs.modal'; var TRIGGER_HOVER = 'hover'; var TRIGGER_FOCUS = 'focus'; var TRIGGER_CLICK = 'click'; var TRIGGER_MANUAL = 'manual'; var EVENT_HIDE$2 = 'hide'; var EVENT_HIDDEN$2 = 'hidden'; var EVENT_SHOW$2 = 'show'; var EVENT_SHOWN$2 = 'shown'; var EVENT_INSERTED = 'inserted'; var EVENT_CLICK$1 = 'click'; var EVENT_FOCUSIN$1 = 'focusin'; var EVENT_FOCUSOUT$1 = 'focusout'; var EVENT_MOUSEENTER = 'mouseenter'; var EVENT_MOUSELEAVE = 'mouseleave'; var AttachmentMap = { AUTO: 'auto', TOP: 'top', RIGHT: isRTL() ? 'left' : 'right', BOTTOM: 'bottom', LEFT: isRTL() ? 'right' : 'left' }; var Default$3 = { allowList: DefaultAllowlist, animation: true, boundary: 'clippingParents', container: false, customClass: '', delay: 0, fallbackPlacements: ['top', 'right', 'bottom', 'left'], html: false, offset: [0, 0], placement: 'top', popperConfig: null, sanitize: true, sanitizeFn: null, selector: false, template: '', title: '', trigger: 'hover focus' }; var DefaultType$3 = { allowList: 'object', animation: 'boolean', boundary: '(string|element)', container: '(string|element|boolean)', customClass: '(string|function)', delay: '(number|object)', fallbackPlacements: 'array', html: 'boolean', offset: '(array|string|function)', placement: '(string|function)', popperConfig: '(null|object|function)', sanitize: 'boolean', sanitizeFn: '(null|function)', selector: '(string|boolean)', template: 'string', title: '(string|element|function)', trigger: 'string' }; /** * Class definition */ var Tooltip = /*#__PURE__*/function (_BaseComponent8) { _inherits(Tooltip, _BaseComponent8); var _super13 = _createSuper(Tooltip); function Tooltip(element, config) { var _this39; _classCallCheck(this, Tooltip); if (typeof Popper__namespace === 'undefined') { throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)'); } _this39 = _super13.call(this, element, config); // Private _this39._isEnabled = true; _this39._timeout = 0; _this39._isHovered = false; _this39._activeTrigger = {}; _this39._popper = null; _this39._templateFactory = null; _this39._newContent = null; // Protected _this39.tip = null; _this39._setListeners(); return _this39; } // Getters _createClass(Tooltip, [{ key: "enable", value: // Public function enable() { this._isEnabled = true; } }, { key: "disable", value: function disable() { this._isEnabled = false; } }, { key: "toggleEnabled", value: function toggleEnabled() { this._isEnabled = !this._isEnabled; } }, { key: "toggle", value: function toggle(event) { if (!this._isEnabled) { return; } if (event) { var context = this._initializeOnDelegatedTarget(event); context._activeTrigger.click = !context._activeTrigger.click; if (context._isWithActiveTrigger()) { context._enter(); } else { context._leave(); } return; } if (this._isShown()) { this._leave(); return; } this._enter(); } }, { key: "dispose", value: function dispose() { clearTimeout(this._timeout); EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); if (this.tip) { this.tip.remove(); } this._disposePopper(); _get(_getPrototypeOf(Tooltip.prototype), "dispose", this).call(this); } }, { key: "show", value: function show() { var _this40 = this; if (this._element.style.display === 'none') { throw new Error('Please use show on visible elements'); } if (!(this._isWithContent() && this._isEnabled)) { return; } var showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2)); var shadowRoot = findShadowRoot(this._element); var isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element); if (showEvent.defaultPrevented || !isInTheDom) { return; } // todo v6 remove this OR make it optional if (this.tip) { this.tip.remove(); this.tip = null; } var tip = this._getTipElement(); this._element.setAttribute('aria-describedby', tip.getAttribute('id')); var container = this._config.container; if (!this._element.ownerDocument.documentElement.contains(this.tip)) { container.append(tip); EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED)); } if (this._popper) { this._popper.update(); } else { this._popper = this._createPopper(tip); } tip.classList.add(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we add extra // empty mouseover listeners to the body's immediate children; // only needed because of broken event delegation on iOS // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html if ('ontouchstart' in document.documentElement) { var _ref9; var _iterator21 = _createForOfIteratorHelper((_ref9 = []).concat.apply(_ref9, _toConsumableArray(document.body.children))), _step21; try { for (_iterator21.s(); !(_step21 = _iterator21.n()).done;) { var element = _step21.value; EventHandler.on(element, 'mouseover', noop); } } catch (err) { _iterator21.e(err); } finally { _iterator21.f(); } } var complete = function complete() { var previousHoverState = _this40._isHovered; _this40._isHovered = false; EventHandler.trigger(_this40._element, _this40.constructor.eventName(EVENT_SHOWN$2)); if (previousHoverState) { _this40._leave(); } }; this._queueCallback(complete, this.tip, this._isAnimated()); } }, { key: "hide", value: function hide() { var _this41 = this; if (!this._isShown()) { return; } var hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2)); if (hideEvent.defaultPrevented) { return; } var tip = this._getTipElement(); tip.classList.remove(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we remove the extra // empty mouseover listeners we added for iOS support if ('ontouchstart' in document.documentElement) { var _ref10; var _iterator22 = _createForOfIteratorHelper((_ref10 = []).concat.apply(_ref10, _toConsumableArray(document.body.children))), _step22; try { for (_iterator22.s(); !(_step22 = _iterator22.n()).done;) { var element = _step22.value; EventHandler.off(element, 'mouseover', noop); } } catch (err) { _iterator22.e(err); } finally { _iterator22.f(); } } this._activeTrigger[TRIGGER_CLICK] = false; this._activeTrigger[TRIGGER_FOCUS] = false; this._activeTrigger[TRIGGER_HOVER] = false; this._isHovered = false; var complete = function complete() { if (_this41._isWithActiveTrigger()) { return; } if (!_this41._isHovered) { tip.remove(); } _this41._element.removeAttribute('aria-describedby'); EventHandler.trigger(_this41._element, _this41.constructor.eventName(EVENT_HIDDEN$2)); _this41._disposePopper(); }; this._queueCallback(complete, this.tip, this._isAnimated()); } }, { key: "update", value: function update() { if (this._popper) { this._popper.update(); } } // Protected }, { key: "_isWithContent", value: function _isWithContent() { return Boolean(this._getTitle()); } }, { key: "_getTipElement", value: function _getTipElement() { if (!this.tip) { this.tip = this._createTipElement(this._newContent || this._getContentForTemplate()); } return this.tip; } }, { key: "_createTipElement", value: function _createTipElement(content) { var tip = this._getTemplateFactory(content).toHtml(); // todo: remove this check on v6 if (!tip) { return null; } tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2); // todo: on v6 the following can be achieved with CSS only tip.classList.add("bs-".concat(this.constructor.NAME, "-auto")); var tipId = getUID(this.constructor.NAME).toString(); tip.setAttribute('id', tipId); if (this._isAnimated()) { tip.classList.add(CLASS_NAME_FADE$2); } return tip; } }, { key: "setContent", value: function setContent(content) { this._newContent = content; if (this._isShown()) { this._disposePopper(); this.show(); } } }, { key: "_getTemplateFactory", value: function _getTemplateFactory(content) { if (this._templateFactory) { this._templateFactory.changeContent(content); } else { this._templateFactory = new TemplateFactory(_objectSpread(_objectSpread({}, this._config), {}, { // the `content` var has to be after `this._config` // to override config.content in case of popover content: content, extraClass: this._resolvePossibleFunction(this._config.customClass) })); } return this._templateFactory; } }, { key: "_getContentForTemplate", value: function _getContentForTemplate() { return _defineProperty({}, SELECTOR_TOOLTIP_INNER, this._getTitle()); } }, { key: "_getTitle", value: function _getTitle() { return this._resolvePossibleFunction(this._config.title) || this._config.originalTitle; } // Private }, { key: "_initializeOnDelegatedTarget", value: function _initializeOnDelegatedTarget(event) { return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig()); } }, { key: "_isAnimated", value: function _isAnimated() { return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2); } }, { key: "_isShown", value: function _isShown() { return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2); } }, { key: "_createPopper", value: function _createPopper(tip) { var placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement; var attachment = AttachmentMap[placement.toUpperCase()]; return Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment)); } }, { key: "_getOffset", value: function _getOffset() { var _this42 = this; var offset = this._config.offset; if (typeof offset === 'string') { return offset.split(',').map(function (value) { return Number.parseInt(value, 10); }); } if (typeof offset === 'function') { return function (popperData) { return offset(popperData, _this42._element); }; } return offset; } }, { key: "_resolvePossibleFunction", value: function _resolvePossibleFunction(arg) { return typeof arg === 'function' ? arg.call(this._element) : arg; } }, { key: "_getPopperConfig", value: function _getPopperConfig(attachment) { var _this43 = this; var defaultBsPopperConfig = { placement: attachment, modifiers: [{ name: 'flip', options: { fallbackPlacements: this._config.fallbackPlacements } }, { name: 'offset', options: { offset: this._getOffset() } }, { name: 'preventOverflow', options: { boundary: this._config.boundary } }, { name: 'arrow', options: { element: ".".concat(this.constructor.NAME, "-arrow") } }, { name: 'preSetPlacement', enabled: true, phase: 'beforeMain', fn: function fn(data) { // Pre-set Popper's placement attribute in order to read the arrow sizes properly. // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement _this43._getTipElement().setAttribute('data-popper-placement', data.state.placement); } }] }; return _objectSpread(_objectSpread({}, defaultBsPopperConfig), typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig); } }, { key: "_setListeners", value: function _setListeners() { var _this44 = this; var triggers = this._config.trigger.split(' '); var _iterator23 = _createForOfIteratorHelper(triggers), _step23; try { for (_iterator23.s(); !(_step23 = _iterator23.n()).done;) { var trigger = _step23.value; if (trigger === 'click') { EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, function (event) { return _this44.toggle(event); }); } else if (trigger !== TRIGGER_MANUAL) { var eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1); var eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1); EventHandler.on(this._element, eventIn, this._config.selector, function (event) { var context = _this44._initializeOnDelegatedTarget(event); context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true; context._enter(); }); EventHandler.on(this._element, eventOut, this._config.selector, function (event) { var context = _this44._initializeOnDelegatedTarget(event); context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget); context._leave(); }); } } } catch (err) { _iterator23.e(err); } finally { _iterator23.f(); } this._hideModalHandler = function () { if (_this44._element) { _this44.hide(); } }; EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); if (this._config.selector) { this._config = _objectSpread(_objectSpread({}, this._config), {}, { trigger: 'manual', selector: '' }); } else { this._fixTitle(); } } }, { key: "_fixTitle", value: function _fixTitle() { var title = this._config.originalTitle; if (!title) { return; } if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) { this._element.setAttribute('aria-label', title); } this._element.removeAttribute('title'); } }, { key: "_enter", value: function _enter() { var _this45 = this; if (this._isShown() || this._isHovered) { this._isHovered = true; return; } this._isHovered = true; this._setTimeout(function () { if (_this45._isHovered) { _this45.show(); } }, this._config.delay.show); } }, { key: "_leave", value: function _leave() { var _this46 = this; if (this._isWithActiveTrigger()) { return; } this._isHovered = false; this._setTimeout(function () { if (!_this46._isHovered) { _this46.hide(); } }, this._config.delay.hide); } }, { key: "_setTimeout", value: function _setTimeout(handler, timeout) { clearTimeout(this._timeout); this._timeout = setTimeout(handler, timeout); } }, { key: "_isWithActiveTrigger", value: function _isWithActiveTrigger() { return Object.values(this._activeTrigger).includes(true); } }, { key: "_getConfig", value: function _getConfig(config) { var dataAttributes = Manipulator.getDataAttributes(this._element); for (var _i10 = 0, _Object$keys5 = Object.keys(dataAttributes); _i10 < _Object$keys5.length; _i10++) { var dataAttribute = _Object$keys5[_i10]; if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) { delete dataAttributes[dataAttribute]; } } config = _objectSpread(_objectSpread({}, dataAttributes), _typeof(config) === 'object' && config ? config : {}); config = this._mergeConfigObj(config); config = this._configAfterMerge(config); this._typeCheckConfig(config); return config; } }, { key: "_configAfterMerge", value: function _configAfterMerge(config) { config.container = config.container === false ? document.body : getElement(config.container); if (typeof config.delay === 'number') { config.delay = { show: config.delay, hide: config.delay }; } config.originalTitle = this._element.getAttribute('title') || ''; if (typeof config.title === 'number') { config.title = config.title.toString(); } if (typeof config.content === 'number') { config.content = config.content.toString(); } return config; } }, { key: "_getDelegateConfig", value: function _getDelegateConfig() { var config = {}; for (var key in this._config) { if (this.constructor.Default[key] !== this._config[key]) { config[key] = this._config[key]; } } // In the future can be replaced with: // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]]) // `Object.fromEntries(keysWithDifferentValues)` return config; } }, { key: "_disposePopper", value: function _disposePopper() { if (this._popper) { this._popper.destroy(); this._popper = null; } } // Static }], [{ key: "Default", get: function get() { return Default$3; } }, { key: "DefaultType", get: function get() { return DefaultType$3; } }, { key: "NAME", get: function get() { return NAME$4; } }, { key: "jQueryInterface", value: function jQueryInterface(config) { return this.each(function () { var data = Tooltip.getOrCreateInstance(this, config); if (typeof config !== 'string') { return; } if (typeof data[config] === 'undefined') { throw new TypeError("No method named \"".concat(config, "\"")); } data[config](); }); } }]); return Tooltip; }(BaseComponent); /** * jQuery */ defineJQueryPlugin(Tooltip); /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): popover.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ var NAME$3 = 'popover'; var SELECTOR_TITLE = '.popover-header'; var SELECTOR_CONTENT = '.popover-body'; var Default$2 = _objectSpread(_objectSpread({}, Tooltip.Default), {}, { content: '', offset: [0, 8], placement: 'right', template: '', trigger: 'click' }); var DefaultType$2 = _objectSpread(_objectSpread({}, Tooltip.DefaultType), {}, { content: '(null|string|element|function)' }); /** * Class definition */ var Popover = /*#__PURE__*/function (_Tooltip) { _inherits(Popover, _Tooltip); var _super14 = _createSuper(Popover); function Popover() { _classCallCheck(this, Popover); return _super14.apply(this, arguments); } _createClass(Popover, [{ key: "_isWithContent", value: // Overrides function _isWithContent() { return this._getTitle() || this._getContent(); } // Private }, { key: "_getContentForTemplate", value: function _getContentForTemplate() { var _ref12; return _ref12 = {}, _defineProperty(_ref12, SELECTOR_TITLE, this._getTitle()), _defineProperty(_ref12, SELECTOR_CONTENT, this._getContent()), _ref12; } }, { key: "_getContent", value: function _getContent() { return this._resolvePossibleFunction(this._config.content); } // Static }], [{ key: "Default", get: // Getters function get() { return Default$2; } }, { key: "DefaultType", get: function get() { return DefaultType$2; } }, { key: "NAME", get: function get() { return NAME$3; } }, { key: "jQueryInterface", value: function jQueryInterface(config) { return this.each(function () { var data = Popover.getOrCreateInstance(this, config); if (typeof config !== 'string') { return; } if (typeof data[config] === 'undefined') { throw new TypeError("No method named \"".concat(config, "\"")); } data[config](); }); } }]); return Popover; }(Tooltip); /** * jQuery */ defineJQueryPlugin(Popover); /** * -------------------------------------------------------------------------- * Bootstrap (v5.2.0): scrollspy.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ var NAME$2 = 'scrollspy'; var DATA_KEY$2 = 'bs.scrollspy'; var EVENT_KEY$2 = ".".concat(DATA_KEY$2); var DATA_API_KEY = '.data-api'; var EVENT_ACTIVATE = "activate".concat(EVENT_KEY$2); var EVENT_CLICK = "click".concat(EVENT_KEY$2); var EVENT_LOAD_DATA_API$1 = "load".concat(EVENT_KEY$2).concat(DATA_API_KEY); var CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'; var CLASS_NAME_ACTIVE$1 = 'active'; var SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]'; var SELECTOR_TARGET_LINKS = '[href]'; var SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'; var SELECTOR_NAV_LINKS = '.nav-link'; var SELECTOR_NAV_ITEMS = '.nav-item'; var SELECTOR_LIST_ITEMS = '.list-group-item'; var SELECTOR_LINK_ITEMS = "".concat(SELECTOR_NAV_LINKS, ", ").concat(SELECTOR_NAV_ITEMS, " > ").concat(SELECTOR_NAV_LINKS, ", ").concat(SELECTOR_LIST_ITEMS); var SELECTOR_DROPDOWN = '.dropdown'; var SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle'; var Default$1 = { offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons rootMargin: '0px 0px -25%', smoothScroll: false, target: null }; var DefaultType$1 = { offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons rootMargin: 'string', smoothScroll: 'boolean', target: 'element' }; /** * Class definition */ var ScrollSpy = /*#__PURE__*/function (_BaseComponent9) { _inherits(ScrollSpy, _BaseComponent9); var _super15 = _createSuper(ScrollSpy); function ScrollSpy(element, config) { var _this47; _classCallCheck(this, ScrollSpy); _this47 = _super15.call(this, element, config); // this._element is the observablesContainer and config.target the menu links wrapper _this47._targetLinks = new Map(); _this47._observableSections = new Map(); _this47._rootElement = getComputedStyle(_this47._element).overflowY === 'visible' ? null : _this47._element; _this47._activeTarget = null; _this47._observer = null; _this47._previousScrollData = { visibleEntryTop: 0, parentScrollTop: 0 }; _this47.refresh(); // initialize return _this47; } // Getters _createClass(ScrollSpy, [{ key: "refresh", value: // Public function refresh() { this._initializeTargetsAndObservables(); this._maybeEnableSmoothScroll(); if (this._observer) { this._observer.disconnect(); } else { this._observer = this._getNewObserver(); } var _iterator24 = _createForOfIteratorHelper(this._observableSections.values()), _step24; try { for (_iterator24.s(); !(_step24 = _iterator24.n()).done;) { var section = _step24.value; this._observer.observe(section); } } catch (err) { _iterator24.e(err); } finally { _iterator24.f(); } } }, { key: "dispose", value: function dispose() { this._observer.disconnect(); _get(_getPrototypeOf(ScrollSpy.prototype), "dispose", this).call(this); } // Private }, { key: "_configAfterMerge", value: function _configAfterMerge(config) { // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case config.target = getElement(config.target) || document.body; return config; } }, { key: "_maybeEnableSmoothScroll", value: function _maybeEnableSmoothScroll() { var _this48 = this; if (!this._config.smoothScroll) { return; } // unregister any previous listeners EventHandler.off(this._config.target, EVENT_CLICK); EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, function (event) { var observableSection = _this48._observableSections.get(event.target.hash); if (observableSection) { event.preventDefault(); var root = _this48._rootElement || window; var height = observableSection.offsetTop - _this48._element.offsetTop; if (root.scrollTo) { root.scrollTo({ top: height, behavior: 'smooth' }); return; } // Chrome 60 doesn't support `scrollTo` root.scrollTop = height; } }); } }, { key: "_getNewObserver", value: function _getNewObserver() { var _this49 = this; var options = { root: this._rootElement, threshold: [0.1, 0.5, 1], rootMargin: this._getRootMargin() }; return new IntersectionObserver(function (entries) { return _this49._observerCallback(entries); }, options); } // The logic of selection }, { key: "_observerCallback", value: function _observerCallback(entries) { var _this50 = this; var targetElement = function targetElement(entry) { return _this50._targetLinks.get("#".concat(entry.target.id)); }; var activate = function activate(entry) { _this50._previousScrollData.visibleEntryTop = entry.target.offsetTop; _this50._process(targetElement(entry)); }; var parentScrollTop = (this._rootElement || document.documentElement).scrollTop; var userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop; this._previousScrollData.parentScrollTop = parentScrollTop; var _iterator25 = _createForOfIteratorHelper(entries), _step25; try { for (_iterator25.s(); !(_step25 = _iterator25.n()).done;) { var entry = _step25.value; if (!entry.isIntersecting) { this._activeTarget = null; this._clearActiveClass(targetElement(entry)); continue; } var entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop; // if we are scrolling down, pick the bigger offsetTop if (userScrollsDown && entryIsLowerThanPrevious) { activate(entry); // if parent isn't scrolled, let's keep the first visible item, breaking the iteration if (!parentScrollTop) { return; } continue; } // if we are scrolling up, pick the smallest offsetTop if (!userScrollsDown && !entryIsLowerThanPrevious) { activate(entry); } } } catch (err) { _iterator25.e(err); } finally { _iterator25.f(); } } // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only }, { key: "_getRootMargin", value: function _getRootMargin() { return this._config.offset ? "".concat(this._config.offset, "px 0px -30%") : this._config.rootMargin; } }, { key: "_initializeTargetsAndObservables", value: function _initializeTargetsAndObservables() { this._targetLinks = new Map(); this._observableSections = new Map(); var targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target); var _iterator26 = _createForOfIteratorHelper(targetLinks), _step26; try { for (_iterator26.s(); !(_step26 = _iterator26.n()).done;) { var anchor = _step26.value; // ensure that the anchor has an id and is not disabled if (!anchor.hash || isDisabled(anchor)) { continue; } var observableSection = SelectorEngine.findOne(anchor.hash, this._element); // ensure that the observableSection exists & is visible if (isVisible(observableSection)) { this._targetLinks.set(anchor.hash, anchor); this._observableSections.set(anchor.hash, observableSection); } } } catch (err) { _iterator26.e(err); } finally { _iterator26.f(); } } }, { key: "_process", value: function _process(target) { if (this._activeTarget === target) { return; } this._clearActiveClass(this._config.target); this._activeTarget = target; target.classList.add(CLASS_NAME_ACTIVE$1); this._activateParents(target); EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target }); } }, { key: "_activateParents", value: function _activateParents(target) { // Activate dropdown parents if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) { SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1); return; } var _iterator27 = _createForOfIteratorHelper(SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)), _step27; try { for (_iterator27.s(); !(_step27 = _iterator27.n()).done;) { var listGroup = _step27.value; // Set triggered links parents as active // With both
    and