You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

10604 lines
930 KiB

(global["webpackJsonp"] = global["webpackJsonp"] || []).push([["common/vendor"],[
/* 0 */,
/* 1 */
/*!********************************************************!*\
!*** ./node_modules/@dcloudio/uni-mp-jd/dist/index.js ***!
\********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(global) {
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 3);
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createApp = createApp;
exports.createComponent = createComponent;
exports.createPage = createPage;
exports.createPlugin = createPlugin;
exports.createSubpackageApp = createSubpackageApp;
exports.default = void 0;
var _slicedToArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ 4));
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ 10));
var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ 11));
var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ 15));
var _construct2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/construct */ 16));
var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ 19));
var _typeof2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/typeof */ 13));
var _uniI18n = __webpack_require__(/*! @dcloudio/uni-i18n */ 23);
var _vue = _interopRequireDefault(__webpack_require__(/*! vue */ 24));
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) { (0, _defineProperty2.default)(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; }
var realAtob;
var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
var b64re = /^(?:[A-Za-z\d+/]{4})*?(?:[A-Za-z\d+/]{2}(?:==)?|[A-Za-z\d+/]{3}=?)?$/;
if (typeof atob !== 'function') {
realAtob = function realAtob(str) {
str = String(str).replace(/[\t\n\f\r ]+/g, '');
if (!b64re.test(str)) {
throw new Error("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.");
}
// Adding the padding if missing, for semplicity
str += '=='.slice(2 - (str.length & 3));
var bitmap;
var result = '';
var r1;
var r2;
var i = 0;
for (; i < str.length;) {
bitmap = b64.indexOf(str.charAt(i++)) << 18 | b64.indexOf(str.charAt(i++)) << 12 | (r1 = b64.indexOf(str.charAt(i++))) << 6 | (r2 = b64.indexOf(str.charAt(i++)));
result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255) : r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255) : String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255);
}
return result;
};
} else {
// 注意atob只能在全局对象上调用,例如:`const Base64 = {atob};Base64.atob('xxxx')`是错误的用法
realAtob = atob;
}
function b64DecodeUnicode(str) {
return decodeURIComponent(realAtob(str).split('').map(function (c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
}
function getCurrentUserInfo() {
var token = jd.getStorageSync('uni_id_token') || '';
var tokenArr = token.split('.');
if (!token || tokenArr.length !== 3) {
return {
uid: null,
role: [],
permission: [],
tokenExpired: 0
};
}
var userInfo;
try {
userInfo = JSON.parse(b64DecodeUnicode(tokenArr[1]));
} catch (error) {
throw new Error('获取当前用户信息出错,详细错误信息为:' + error.message);
}
userInfo.tokenExpired = userInfo.exp * 1000;
delete userInfo.exp;
delete userInfo.iat;
return userInfo;
}
function uniIdMixin(Vue) {
Vue.prototype.uniIDHasRole = function (roleId) {
var _getCurrentUserInfo = getCurrentUserInfo(),
role = _getCurrentUserInfo.role;
return role.indexOf(roleId) > -1;
};
Vue.prototype.uniIDHasPermission = function (permissionId) {
var _getCurrentUserInfo2 = getCurrentUserInfo(),
permission = _getCurrentUserInfo2.permission;
return this.uniIDHasRole('admin') || permission.indexOf(permissionId) > -1;
};
Vue.prototype.uniIDTokenValid = function () {
var _getCurrentUserInfo3 = getCurrentUserInfo(),
tokenExpired = _getCurrentUserInfo3.tokenExpired;
return tokenExpired > Date.now();
};
}
var _toString = Object.prototype.toString;
var hasOwnProperty = Object.prototype.hasOwnProperty;
function isFn(fn) {
return typeof fn === 'function';
}
function isStr(str) {
return typeof str === 'string';
}
function isObject(obj) {
return obj !== null && (0, _typeof2.default)(obj) === 'object';
}
function isPlainObject(obj) {
return _toString.call(obj) === '[object Object]';
}
function hasOwn(obj, key) {
return hasOwnProperty.call(obj, key);
}
function noop() {}
/**
* Create a cached version of a pure function.
*/
function cached(fn) {
var cache = Object.create(null);
return function cachedFn(str) {
var hit = cache[str];
return hit || (cache[str] = fn(str));
};
}
/**
* Camelize a hyphen-delimited string.
*/
var camelizeRE = /-(\w)/g;
var camelize = cached(function (str) {
return str.replace(camelizeRE, function (_, c) {
return c ? c.toUpperCase() : '';
});
});
var HOOKS = ['invoke', 'success', 'fail', 'complete', 'returnValue'];
var globalInterceptors = {};
var scopedInterceptors = {};
function mergeHook(parentVal, childVal) {
var res = childVal ? parentVal ? parentVal.concat(childVal) : Array.isArray(childVal) ? childVal : [childVal] : parentVal;
return res ? dedupeHooks(res) : res;
}
function dedupeHooks(hooks) {
var res = [];
for (var i = 0; i < hooks.length; i++) {
if (res.indexOf(hooks[i]) === -1) {
res.push(hooks[i]);
}
}
return res;
}
function removeHook(hooks, hook) {
var index = hooks.indexOf(hook);
if (index !== -1) {
hooks.splice(index, 1);
}
}
function mergeInterceptorHook(interceptor, option) {
Object.keys(option).forEach(function (hook) {
if (HOOKS.indexOf(hook) !== -1 && isFn(option[hook])) {
interceptor[hook] = mergeHook(interceptor[hook], option[hook]);
}
});
}
function removeInterceptorHook(interceptor, option) {
if (!interceptor || !option) {
return;
}
Object.keys(option).forEach(function (hook) {
if (HOOKS.indexOf(hook) !== -1 && isFn(option[hook])) {
removeHook(interceptor[hook], option[hook]);
}
});
}
function addInterceptor(method, option) {
if (typeof method === 'string' && isPlainObject(option)) {
mergeInterceptorHook(scopedInterceptors[method] || (scopedInterceptors[method] = {}), option);
} else if (isPlainObject(method)) {
mergeInterceptorHook(globalInterceptors, method);
}
}
function removeInterceptor(method, option) {
if (typeof method === 'string') {
if (isPlainObject(option)) {
removeInterceptorHook(scopedInterceptors[method], option);
} else {
delete scopedInterceptors[method];
}
} else if (isPlainObject(method)) {
removeInterceptorHook(globalInterceptors, method);
}
}
function wrapperHook(hook) {
return function (data) {
return hook(data) || data;
};
}
function isPromise(obj) {
return !!obj && ((0, _typeof2.default)(obj) === 'object' || typeof obj === 'function') && typeof obj.then === 'function';
}
function queue(hooks, data) {
var promise = false;
for (var i = 0; i < hooks.length; i++) {
var hook = hooks[i];
if (promise) {
promise = Promise.resolve(wrapperHook(hook));
} else {
var res = hook(data);
if (isPromise(res)) {
promise = Promise.resolve(res);
}
if (res === false) {
return {
then: function then() {}
};
}
}
}
return promise || {
then: function then(callback) {
return callback(data);
}
};
}
function wrapperOptions(interceptor) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
['success', 'fail', 'complete'].forEach(function (name) {
if (Array.isArray(interceptor[name])) {
var oldCallback = options[name];
options[name] = function callbackInterceptor(res) {
queue(interceptor[name], res).then(function (res) {
/* eslint-disable no-mixed-operators */
return isFn(oldCallback) && oldCallback(res) || res;
});
};
}
});
return options;
}
function wrapperReturnValue(method, returnValue) {
var returnValueHooks = [];
if (Array.isArray(globalInterceptors.returnValue)) {
returnValueHooks.push.apply(returnValueHooks, (0, _toConsumableArray2.default)(globalInterceptors.returnValue));
}
var interceptor = scopedInterceptors[method];
if (interceptor && Array.isArray(interceptor.returnValue)) {
returnValueHooks.push.apply(returnValueHooks, (0, _toConsumableArray2.default)(interceptor.returnValue));
}
returnValueHooks.forEach(function (hook) {
returnValue = hook(returnValue) || returnValue;
});
return returnValue;
}
function getApiInterceptorHooks(method) {
var interceptor = Object.create(null);
Object.keys(globalInterceptors).forEach(function (hook) {
if (hook !== 'returnValue') {
interceptor[hook] = globalInterceptors[hook].slice();
}
});
var scopedInterceptor = scopedInterceptors[method];
if (scopedInterceptor) {
Object.keys(scopedInterceptor).forEach(function (hook) {
if (hook !== 'returnValue') {
interceptor[hook] = (interceptor[hook] || []).concat(scopedInterceptor[hook]);
}
});
}
return interceptor;
}
function invokeApi(method, api, options) {
for (var _len = arguments.length, params = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
params[_key - 3] = arguments[_key];
}
var interceptor = getApiInterceptorHooks(method);
if (interceptor && Object.keys(interceptor).length) {
if (Array.isArray(interceptor.invoke)) {
var res = queue(interceptor.invoke, options);
return res.then(function (options) {
return api.apply(void 0, [wrapperOptions(interceptor, options)].concat(params));
});
} else {
return api.apply(void 0, [wrapperOptions(interceptor, options)].concat(params));
}
}
return api.apply(void 0, [options].concat(params));
}
var promiseInterceptor = {
returnValue: function returnValue(res) {
if (!isPromise(res)) {
return res;
}
return new Promise(function (resolve, reject) {
res.then(function (res) {
if (res[0]) {
reject(res[0]);
} else {
resolve(res[1]);
}
});
});
}
};
var SYNC_API_RE = /^\$|Window$|WindowStyle$|sendHostEvent|sendNativeEvent|restoreGlobal|requireGlobal|getCurrentSubNVue|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64|getLocale|setLocale|invokePushCallback|getWindowInfo|getDeviceInfo|getAppBaseInfo|getSystemSetting|getAppAuthorizeSetting/;
var CONTEXT_API_RE = /^create|Manager$/;
// Context例外情况
var CONTEXT_API_RE_EXC = ['createBLEConnection'];
// 同步例外情况
var ASYNC_API = ['createBLEConnection', 'createPushMessage'];
var CALLBACK_API_RE = /^on|^off/;
function isContextApi(name) {
return CONTEXT_API_RE.test(name) && CONTEXT_API_RE_EXC.indexOf(name) === -1;
}
function isSyncApi(name) {
return SYNC_API_RE.test(name) && ASYNC_API.indexOf(name) === -1;
}
function isCallbackApi(name) {
return CALLBACK_API_RE.test(name) && name !== 'onPush';
}
function handlePromise(promise) {
return promise.then(function (data) {
return [null, data];
}).catch(function (err) {
return [err];
});
}
function shouldPromise(name) {
if (isContextApi(name) || isSyncApi(name) || isCallbackApi(name)) {
return false;
}
return true;
}
/* eslint-disable no-extend-native */
if (!Promise.prototype.finally) {
Promise.prototype.finally = function (callback) {
var promise = this.constructor;
return this.then(function (value) {
return promise.resolve(callback()).then(function () {
return value;
});
}, function (reason) {
return promise.resolve(callback()).then(function () {
throw reason;
});
});
};
}
function promisify(name, api) {
if (!shouldPromise(name) || !isFn(api)) {
return api;
}
return function promiseApi() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
for (var _len2 = arguments.length, params = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
params[_key2 - 1] = arguments[_key2];
}
if (isFn(options.success) || isFn(options.fail) || isFn(options.complete)) {
return wrapperReturnValue(name, invokeApi.apply(void 0, [name, api, options].concat(params)));
}
return wrapperReturnValue(name, handlePromise(new Promise(function (resolve, reject) {
invokeApi.apply(void 0, [name, api, Object.assign({}, options, {
success: resolve,
fail: reject
})].concat(params));
})));
};
}
var EPS = 1e-4;
var BASE_DEVICE_WIDTH = 750;
var isIOS = false;
var deviceWidth = 0;
var deviceDPR = 0;
function checkDeviceWidth() {
var _jd$getSystemInfoSync = jd.getSystemInfoSync(),
platform = _jd$getSystemInfoSync.platform,
pixelRatio = _jd$getSystemInfoSync.pixelRatio,
windowWidth = _jd$getSystemInfoSync.windowWidth; // uni=>jd runtime 编译目标是 uni 对象,内部不允许直接使用 uni
deviceWidth = windowWidth;
deviceDPR = pixelRatio;
isIOS = platform === 'ios';
}
function upx2px(number, newDeviceWidth) {
if (deviceWidth === 0) {
checkDeviceWidth();
}
number = Number(number);
if (number === 0) {
return 0;
}
var result = number / BASE_DEVICE_WIDTH * (newDeviceWidth || deviceWidth);
if (result < 0) {
result = -result;
}
result = Math.floor(result + EPS);
if (result === 0) {
if (deviceDPR === 1 || !isIOS) {
result = 1;
} else {
result = 0.5;
}
}
return number < 0 ? -result : result;
}
var LOCALE_ZH_HANS = 'zh-Hans';
var LOCALE_ZH_HANT = 'zh-Hant';
var LOCALE_EN = 'en';
var LOCALE_FR = 'fr';
var LOCALE_ES = 'es';
var messages = {};
var locale;
{
locale = normalizeLocale(jd.getSystemInfoSync().language) || LOCALE_EN;
}
function initI18nMessages() {
if (!isEnableLocale()) {
return;
}
var localeKeys = Object.keys(__uniConfig.locales);
if (localeKeys.length) {
localeKeys.forEach(function (locale) {
var curMessages = messages[locale];
var userMessages = __uniConfig.locales[locale];
if (curMessages) {
Object.assign(curMessages, userMessages);
} else {
messages[locale] = userMessages;
}
});
}
}
initI18nMessages();
var i18n = (0, _uniI18n.initVueI18n)(locale, {});
var t = i18n.t;
var i18nMixin = i18n.mixin = {
beforeCreate: function beforeCreate() {
var _this = this;
var unwatch = i18n.i18n.watchLocale(function () {
_this.$forceUpdate();
});
this.$once('hook:beforeDestroy', function () {
unwatch();
});
},
methods: {
$$t: function $$t(key, values) {
return t(key, values);
}
}
};
var setLocale = i18n.setLocale;
var getLocale = i18n.getLocale;
function initAppLocale(Vue, appVm, locale) {
var state = Vue.observable({
locale: locale || i18n.getLocale()
});
var localeWatchers = [];
appVm.$watchLocale = function (fn) {
localeWatchers.push(fn);
};
Object.defineProperty(appVm, '$locale', {
get: function get() {
return state.locale;
},
set: function set(v) {
state.locale = v;
localeWatchers.forEach(function (watch) {
return watch(v);
});
}
});
}
function isEnableLocale() {
return typeof __uniConfig !== 'undefined' && __uniConfig.locales && !!Object.keys(__uniConfig.locales).length;
}
function include(str, parts) {
return !!parts.find(function (part) {
return str.indexOf(part) !== -1;
});
}
function startsWith(str, parts) {
return parts.find(function (part) {
return str.indexOf(part) === 0;
});
}
function normalizeLocale(locale, messages) {
if (!locale) {
return;
}
locale = locale.trim().replace(/_/g, '-');
if (messages && messages[locale]) {
return locale;
}
locale = locale.toLowerCase();
if (locale === 'chinese') {
// 支付宝
return LOCALE_ZH_HANS;
}
if (locale.indexOf('zh') === 0) {
if (locale.indexOf('-hans') > -1) {
return LOCALE_ZH_HANS;
}
if (locale.indexOf('-hant') > -1) {
return LOCALE_ZH_HANT;
}
if (include(locale, ['-tw', '-hk', '-mo', '-cht'])) {
return LOCALE_ZH_HANT;
}
return LOCALE_ZH_HANS;
}
var lang = startsWith(locale, [LOCALE_EN, LOCALE_FR, LOCALE_ES]);
if (lang) {
return lang;
}
}
// export function initI18n() {
// const localeKeys = Object.keys(__uniConfig.locales || {})
// if (localeKeys.length) {
// localeKeys.forEach((locale) =>
// i18n.add(locale, __uniConfig.locales[locale])
// )
// }
// }
function getLocale$1() {
// 优先使用 $locale
if (isFn(getApp)) {
var app = getApp({
allowDefault: true
});
if (app && app.$vm) {
return app.$vm.$locale;
}
}
return normalizeLocale(jd.getSystemInfoSync().language) || LOCALE_EN;
}
function setLocale$1(locale) {
var app = isFn(getApp) ? getApp() : false;
if (!app) {
return false;
}
var oldLocale = app.$vm.$locale;
if (oldLocale !== locale) {
app.$vm.$locale = locale;
onLocaleChangeCallbacks.forEach(function (fn) {
return fn({
locale: locale
});
});
return true;
}
return false;
}
var onLocaleChangeCallbacks = [];
function onLocaleChange(fn) {
if (onLocaleChangeCallbacks.indexOf(fn) === -1) {
onLocaleChangeCallbacks.push(fn);
}
}
if (typeof global !== 'undefined') {
global.getLocale = getLocale$1;
}
var interceptors = {
promiseInterceptor: promiseInterceptor
};
var baseApi = /*#__PURE__*/Object.freeze({
__proto__: null,
upx2px: upx2px,
getLocale: getLocale$1,
setLocale: setLocale$1,
onLocaleChange: onLocaleChange,
addInterceptor: addInterceptor,
removeInterceptor: removeInterceptor,
interceptors: interceptors
});
var UUID_KEY = '__DC_STAT_UUID';
var deviceId;
function useDeviceId(result) {
deviceId = deviceId || jd.getStorageSync(UUID_KEY);
if (!deviceId) {
deviceId = Date.now() + '' + Math.floor(Math.random() * 1e7);
jd.setStorage({
key: UUID_KEY,
data: deviceId
});
}
result.deviceId = deviceId;
}
function addSafeAreaInsets(result) {
if (result.safeArea) {
var safeArea = result.safeArea;
result.safeAreaInsets = {
top: safeArea.top,
left: safeArea.left,
right: result.windowWidth - safeArea.right,
bottom: result.screenHeight - safeArea.bottom
};
}
}
function populateParameters(result) {
var _result$brand = result.brand,
brand = _result$brand === void 0 ? '' : _result$brand,
_result$model = result.model,
model = _result$model === void 0 ? '' : _result$model,
_result$system = result.system,
system = _result$system === void 0 ? '' : _result$system,
_result$language = result.language,
language = _result$language === void 0 ? '' : _result$language,
theme = result.theme,
version = result.version,
platform = result.platform,
fontSizeSetting = result.fontSizeSetting,
SDKVersion = result.SDKVersion,
pixelRatio = result.pixelRatio,
deviceOrientation = result.deviceOrientation;
// const isQuickApp = "mp-jd".indexOf('quickapp-webview') !== -1
// osName osVersion
var osName = '';
var osVersion = '';
{
osName = system.split(' ')[0] || '';
osVersion = system.split(' ')[1] || '';
}
var hostVersion = version;
{
hostVersion = result.hostVersionName;
}
// deviceType
var deviceType = getGetDeviceType(result, model);
// deviceModel
var deviceBrand = getDeviceBrand(brand);
// hostName
var _hostName = getHostName(result);
// deviceOrientation
var _deviceOrientation = deviceOrientation; // 仅 微信 百度 支持
// devicePixelRatio
var _devicePixelRatio = pixelRatio;
// SDKVersion
var _SDKVersion = SDKVersion;
// hostLanguage
var hostLanguage = language.replace(/_/g, '-');
// wx.getAccountInfoSync
var parameters = {
appId: "__UNI__A3B5DFA",
appName: "易加蓝牙助手",
appVersion: "1.0.0",
appVersionCode: "100",
appLanguage: getAppLanguage(hostLanguage),
uniCompileVersion: "3.6.18",
uniRuntimeVersion: "3.6.18",
uniPlatform: undefined || "mp-jd",
deviceBrand: deviceBrand,
deviceModel: model,
deviceType: deviceType,
devicePixelRatio: _devicePixelRatio,
deviceOrientation: _deviceOrientation,
osName: osName.toLocaleLowerCase(),
osVersion: osVersion,
hostTheme: theme,
hostVersion: hostVersion,
hostLanguage: hostLanguage,
hostName: _hostName,
hostSDKVersion: _SDKVersion,
hostFontSizeSetting: fontSizeSetting,
windowTop: 0,
windowBottom: 0,
// TODO
osLanguage: undefined,
osTheme: undefined,
ua: undefined,
hostPackageName: undefined,
browserName: undefined,
browserVersion: undefined
};
Object.assign(result, parameters);
}
function getGetDeviceType(result, model) {
var deviceType = result.deviceType || 'phone';
{
var deviceTypeMaps = {
ipad: 'pad',
windows: 'pc',
mac: 'pc'
};
var deviceTypeMapsKeys = Object.keys(deviceTypeMaps);
var _model = model.toLocaleLowerCase();
for (var index = 0; index < deviceTypeMapsKeys.length; index++) {
var _m = deviceTypeMapsKeys[index];
if (_model.indexOf(_m) !== -1) {
deviceType = deviceTypeMaps[_m];
break;
}
}
}
return deviceType;
}
function getDeviceBrand(brand) {
var deviceBrand = brand;
if (deviceBrand) {
deviceBrand = brand.toLocaleLowerCase();
}
return deviceBrand;
}
function getAppLanguage(defaultLanguage) {
return getLocale$1 ? getLocale$1() : defaultLanguage;
}
function getHostName(result) {
var _platform = "mp-jd".split('-')[1];
var _hostName = result.hostName || _platform; // mp-jd
return _hostName;
}
var getSystemInfo = {
returnValue: function returnValue(result) {
useDeviceId(result);
addSafeAreaInsets(result);
populateParameters(result);
}
};
// import navigateTo from 'uni-helpers/navigate-to'
// import getUserProfile from '../../../mp-weixin/helpers/get-user-profile'
// 需要做转换的 API 列表
var protocols = {
// navigateTo,
// redirectTo,
// previewImage,
getSystemInfo: getSystemInfo,
getSystemInfoSync: getSystemInfo
// getUserProfile
};
// 不支持的 API 列表
var todos = ['getSelectedTextRange'];
// 存在兼容性的 API 列表
var canIUses = [];
var CALLBACKS = ['success', 'fail', 'cancel', 'complete'];
function processCallback(methodName, method, returnValue) {
return function (res) {
return method(processReturnValue(methodName, res, returnValue));
};
}
function processArgs(methodName, fromArgs) {
var argsOption = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var returnValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
var keepFromArgs = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
if (isPlainObject(fromArgs)) {
// 一般 api 的参数解析
var toArgs = keepFromArgs === true ? fromArgs : {}; // returnValue 为 false 时,说明是格式化返回值,直接在返回值对象上修改赋值
if (isFn(argsOption)) {
argsOption = argsOption(fromArgs, toArgs) || {};
}
for (var key in fromArgs) {
if (hasOwn(argsOption, key)) {
var keyOption = argsOption[key];
if (isFn(keyOption)) {
keyOption = keyOption(fromArgs[key], fromArgs, toArgs);
}
if (!keyOption) {
// 不支持的参数
console.warn("The '".concat(methodName, "' method of platform '\u4EAC\u4E1C\u5C0F\u7A0B\u5E8F' does not support option '").concat(key, "'"));
} else if (isStr(keyOption)) {
// 重写参数 key
toArgs[keyOption] = fromArgs[key];
} else if (isPlainObject(keyOption)) {
// {name:newName,value:value}可重新指定参数 key:value
toArgs[keyOption.name ? keyOption.name : key] = keyOption.value;
}
} else if (CALLBACKS.indexOf(key) !== -1) {
if (isFn(fromArgs[key])) {
toArgs[key] = processCallback(methodName, fromArgs[key], returnValue);
}
} else {
if (!keepFromArgs) {
toArgs[key] = fromArgs[key];
}
}
}
return toArgs;
} else if (isFn(fromArgs)) {
fromArgs = processCallback(methodName, fromArgs, returnValue);
}
return fromArgs;
}
function processReturnValue(methodName, res, returnValue) {
var keepReturnValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
if (isFn(protocols.returnValue)) {
// 处理通用 returnValue
res = protocols.returnValue(methodName, res);
}
return processArgs(methodName, res, returnValue, {}, keepReturnValue);
}
function wrapper(methodName, method) {
if (hasOwn(protocols, methodName)) {
var protocol = protocols[methodName];
if (!protocol) {
// 暂不支持的 api
return function () {
console.error("Platform '\u4EAC\u4E1C\u5C0F\u7A0B\u5E8F' does not support '".concat(methodName, "'."));
};
}
return function (arg1, arg2) {
// 目前 api 最多两个参数
var options = protocol;
if (isFn(protocol)) {
options = protocol(arg1);
}
arg1 = processArgs(methodName, arg1, options.args, options.returnValue);
var args = [arg1];
if (typeof arg2 !== 'undefined') {
args.push(arg2);
}
if (isFn(options.name)) {
methodName = options.name(arg1);
} else if (isStr(options.name)) {
methodName = options.name;
}
var returnValue = jd[methodName].apply(jd, args);
if (isSyncApi(methodName)) {
// 同步 api
return processReturnValue(methodName, returnValue, options.returnValue, isContextApi(methodName));
}
return returnValue;
};
}
return method;
}
var todoApis = Object.create(null);
var TODOS = ['onTabBarMidButtonTap', 'subscribePush', 'unsubscribePush', 'onPush', 'offPush', 'share'];
function createTodoApi(name) {
return function todoApi(_ref) {
var fail = _ref.fail,
complete = _ref.complete;
var res = {
errMsg: "".concat(name, ":fail method '").concat(name, "' not supported")
};
isFn(fail) && fail(res);
isFn(complete) && complete(res);
};
}
TODOS.forEach(function (name) {
todoApis[name] = createTodoApi(name);
});
var providers = {
oauth: ['jd'],
share: ['jd'],
payment: ['jd'],
push: ['jd']
};
function getProvider(_ref2) {
var service = _ref2.service,
success = _ref2.success,
fail = _ref2.fail,
complete = _ref2.complete;
var res = false;
if (providers[service]) {
res = {
errMsg: 'getProvider:ok',
service: service,
provider: providers[service]
};
isFn(success) && success(res);
} else {
res = {
errMsg: 'getProvider:fail service not found'
};
isFn(fail) && fail(res);
}
isFn(complete) && complete(res);
}
var extraApi = /*#__PURE__*/Object.freeze({
__proto__: null,
getProvider: getProvider
});
var getEmitter = function () {
var Emitter;
return function getUniEmitter() {
if (!Emitter) {
Emitter = new _vue.default();
}
return Emitter;
};
}();
function apply(ctx, method, args) {
return ctx[method].apply(ctx, args);
}
function $on() {
return apply(getEmitter(), '$on', Array.prototype.slice.call(arguments));
}
function $off() {
return apply(getEmitter(), '$off', Array.prototype.slice.call(arguments));
}
function $once() {
return apply(getEmitter(), '$once', Array.prototype.slice.call(arguments));
}
function $emit() {
return apply(getEmitter(), '$emit', Array.prototype.slice.call(arguments));
}
var eventApi = /*#__PURE__*/Object.freeze({
__proto__: null,
$on: $on,
$off: $off,
$once: $once,
$emit: $emit
});
/**
* 框架内 try-catch
*/
/**
* 开发者 try-catch
*/
function tryCatch(fn) {
return function () {
try {
return fn.apply(fn, arguments);
} catch (e) {
// TODO
console.error(e);
}
};
}
function getApiCallbacks(params) {
var apiCallbacks = {};
for (var name in params) {
var param = params[name];
if (isFn(param)) {
apiCallbacks[name] = tryCatch(param);
delete params[name];
}
}
return apiCallbacks;
}
var cid;
var cidErrMsg;
var enabled;
function normalizePushMessage(message) {
try {
return JSON.parse(message);
} catch (e) {}
return message;
}
function invokePushCallback(args) {
if (args.type === 'enabled') {
enabled = true;
} else if (args.type === 'clientId') {
cid = args.cid;
cidErrMsg = args.errMsg;
invokeGetPushCidCallbacks(cid, args.errMsg);
} else if (args.type === 'pushMsg') {
var message = {
type: 'receive',
data: normalizePushMessage(args.message)
};
for (var i = 0; i < onPushMessageCallbacks.length; i++) {
var callback = onPushMessageCallbacks[i];
callback(message);
// 该消息已被阻止
if (message.stopped) {
break;
}
}
} else if (args.type === 'click') {
onPushMessageCallbacks.forEach(function (callback) {
callback({
type: 'click',
data: normalizePushMessage(args.message)
});
});
}
}
var getPushCidCallbacks = [];
function invokeGetPushCidCallbacks(cid, errMsg) {
getPushCidCallbacks.forEach(function (callback) {
callback(cid, errMsg);
});
getPushCidCallbacks.length = 0;
}
function getPushClientId(args) {
if (!isPlainObject(args)) {
args = {};
}
var _getApiCallbacks = getApiCallbacks(args),
success = _getApiCallbacks.success,
fail = _getApiCallbacks.fail,
complete = _getApiCallbacks.complete;
var hasSuccess = isFn(success);
var hasFail = isFn(fail);
var hasComplete = isFn(complete);
Promise.resolve().then(function () {
if (typeof enabled === 'undefined') {
enabled = false;
cid = '';
cidErrMsg = 'uniPush is not enabled';
}
getPushCidCallbacks.push(function (cid, errMsg) {
var res;
if (cid) {
res = {
errMsg: 'getPushClientId:ok',
cid: cid
};
hasSuccess && success(res);
} else {
res = {
errMsg: 'getPushClientId:fail' + (errMsg ? ' ' + errMsg : '')
};
hasFail && fail(res);
}
hasComplete && complete(res);
});
if (typeof cid !== 'undefined') {
invokeGetPushCidCallbacks(cid, cidErrMsg);
}
});
}
var onPushMessageCallbacks = [];
// 不使用 defineOnApi 实现,是因为 defineOnApi 依赖 UniServiceJSBridge ,该对象目前在小程序上未提供,故简单实现
var onPushMessage = function onPushMessage(fn) {
if (onPushMessageCallbacks.indexOf(fn) === -1) {
onPushMessageCallbacks.push(fn);
}
};
var offPushMessage = function offPushMessage(fn) {
if (!fn) {
onPushMessageCallbacks.length = 0;
} else {
var index = onPushMessageCallbacks.indexOf(fn);
if (index > -1) {
onPushMessageCallbacks.splice(index, 1);
}
}
};
var api = /*#__PURE__*/Object.freeze({
__proto__: null,
getPushClientId: getPushClientId,
onPushMessage: onPushMessage,
offPushMessage: offPushMessage,
invokePushCallback: invokePushCallback
});
var mocks = ['__route__', '__wxExparserNodeId__', '__wxWebviewId__'];
function findVmByVueId(vm, vuePid) {
var $children = vm.$children;
// 优先查找直属(反向查找:https://github.com/dcloudio/uni-app/issues/1200)
for (var i = $children.length - 1; i >= 0; i--) {
var childVm = $children[i];
if (childVm.$scope._$vueId === vuePid) {
return childVm;
}
}
// 反向递归查找
var parentVm;
for (var _i = $children.length - 1; _i >= 0; _i--) {
parentVm = findVmByVueId($children[_i], vuePid);
if (parentVm) {
return parentVm;
}
}
}
function initBehavior(options) {
return Behavior(options);
}
function isPage() {
return !!this.route;
}
function initRelation(detail) {
this.triggerEvent('__l', detail);
}
function selectAllComponents(mpInstance, selector, $refs) {
var components = mpInstance.selectAllComponents(selector) || [];
components.forEach(function (component) {
var ref = component.dataset.ref;
$refs[ref] = component.$vm || toSkip(component);
});
}
function syncRefs(refs, newRefs) {
var oldKeys = (0, _construct2.default)(Set, (0, _toConsumableArray2.default)(Object.keys(refs)));
var newKeys = Object.keys(newRefs);
newKeys.forEach(function (key) {
var oldValue = refs[key];
var newValue = newRefs[key];
if (Array.isArray(oldValue) && Array.isArray(newValue) && oldValue.length === newValue.length && newValue.every(function (value) {
return oldValue.includes(value);
})) {
return;
}
refs[key] = newValue;
oldKeys.delete(key);
});
oldKeys.forEach(function (key) {
delete refs[key];
});
return refs;
}
function initRefs(vm) {
var mpInstance = vm.$scope;
var refs = {};
Object.defineProperty(vm, '$refs', {
get: function get() {
var $refs = {};
selectAllComponents(mpInstance, '.vue-ref', $refs);
// TODO 暂不考虑 for 中的 scoped
var forComponents = mpInstance.selectAllComponents('.vue-ref-in-for') || [];
forComponents.forEach(function (component) {
var ref = component.dataset.ref;
if (!$refs[ref]) {
$refs[ref] = [];
}
$refs[ref].push(component.$vm || toSkip(component));
});
return syncRefs(refs, $refs);
}
});
}
function handleLink(event) {
var _ref3 = event.detail || event.value,
vuePid = _ref3.vuePid,
vueOptions = _ref3.vueOptions; // detail 是微信,value 是百度(dipatch)
var parentVm;
if (vuePid) {
parentVm = findVmByVueId(this.$vm, vuePid);
}
if (!parentVm) {
parentVm = this.$vm;
}
vueOptions.parent = parentVm;
}
function markMPComponent(component) {
// 在 Vue 中标记为小程序组件
var IS_MP = '__v_isMPComponent';
Object.defineProperty(component, IS_MP, {
configurable: true,
enumerable: false,
value: true
});
return component;
}
function toSkip(obj) {
var OB = '__ob__';
var SKIP = '__v_skip';
if (isObject(obj) && Object.isExtensible(obj)) {
// 避免被 @vue/composition-api 观测
Object.defineProperty(obj, OB, {
configurable: true,
enumerable: false,
value: (0, _defineProperty2.default)({}, SKIP, true)
});
}
return obj;
}
var MPPage = Page;
var MPComponent = Component;
var customizeRE = /:/g;
var customize = cached(function (str) {
return camelize(str.replace(customizeRE, '-'));
});
function initTriggerEvent(mpInstance) {
var oldTriggerEvent = mpInstance.triggerEvent;
var newTriggerEvent = function newTriggerEvent(event) {
// 事件名统一转驼峰格式,仅处理:当前组件为 vue 组件、当前组件为 vue 组件子组件
if (this.$vm || this.dataset && this.dataset.comType) {
event = customize(event);
}
for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
args[_key3 - 1] = arguments[_key3];
}
return oldTriggerEvent.apply(this, [event].concat(args));
};
try {
// 京东小程序 triggerEvent 为只读
mpInstance.triggerEvent = newTriggerEvent;
} catch (error) {
mpInstance._triggerEvent = newTriggerEvent;
}
}
function initHook(name, options, isComponent) {
var oldHook = options[name];
options[name] = function () {
markMPComponent(this);
initTriggerEvent(this);
if (oldHook) {
for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
args[_key4] = arguments[_key4];
}
return oldHook.apply(this, args);
}
};
}
if (!MPPage.__$wrappered) {
MPPage.__$wrappered = true;
Page = function Page() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
initHook('onLoad', options);
return MPPage(options);
};
Page.after = MPPage.after;
Component = function Component() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
initHook('created', options);
return MPComponent(options);
};
}
var PAGE_EVENT_HOOKS = ['onPullDownRefresh', 'onReachBottom', 'onAddToFavorites', 'onShareTimeline', 'onShareAppMessage', 'onPageScroll', 'onResize', 'onTabItemTap'];
function initMocks(vm, mocks) {
var mpInstance = vm.$mp[vm.mpType];
mocks.forEach(function (mock) {
if (hasOwn(mpInstance, mock)) {
vm[mock] = mpInstance[mock];
}
});
}
function hasHook(hook, vueOptions) {
if (!vueOptions) {
return true;
}
if (_vue.default.options && Array.isArray(_vue.default.options[hook])) {
return true;
}
vueOptions = vueOptions.default || vueOptions;
if (isFn(vueOptions)) {
if (isFn(vueOptions.extendOptions[hook])) {
return true;
}
if (vueOptions.super && vueOptions.super.options && Array.isArray(vueOptions.super.options[hook])) {
return true;
}
return false;
}
if (isFn(vueOptions[hook]) || Array.isArray(vueOptions[hook])) {
return true;
}
var mixins = vueOptions.mixins;
if (Array.isArray(mixins)) {
return !!mixins.find(function (mixin) {
return hasHook(hook, mixin);
});
}
}
function initHooks(mpOptions, hooks, vueOptions) {
hooks.forEach(function (hook) {
if (hasHook(hook, vueOptions)) {
mpOptions[hook] = function (args) {
return this.$vm && this.$vm.__call_hook(hook, args);
};
}
});
}
function initUnknownHooks(mpOptions, vueOptions) {
var excludes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
findHooks(vueOptions).forEach(function (hook) {
return initHook$1(mpOptions, hook, excludes);
});
}
function findHooks(vueOptions) {
var hooks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
if (vueOptions) {
Object.keys(vueOptions).forEach(function (name) {
if (name.indexOf('on') === 0 && isFn(vueOptions[name])) {
hooks.push(name);
}
});
}
return hooks;
}
function initHook$1(mpOptions, hook, excludes) {
if (excludes.indexOf(hook) === -1 && !hasOwn(mpOptions, hook)) {
mpOptions[hook] = function (args) {
return this.$vm && this.$vm.__call_hook(hook, args);
};
}
}
function initVueComponent(Vue, vueOptions) {
vueOptions = vueOptions.default || vueOptions;
var VueComponent;
if (isFn(vueOptions)) {
VueComponent = vueOptions;
} else {
VueComponent = Vue.extend(vueOptions);
}
vueOptions = VueComponent.options;
return [VueComponent, vueOptions];
}
function initSlots(vm, vueSlots) {
if (Array.isArray(vueSlots) && vueSlots.length) {
var $slots = Object.create(null);
vueSlots.forEach(function (slotName) {
$slots[slotName] = true;
});
vm.$scopedSlots = vm.$slots = $slots;
}
}
function initVueIds(vueIds, mpInstance) {
vueIds = (vueIds || '').split(',');
var len = vueIds.length;
if (len === 1) {
mpInstance._$vueId = vueIds[0];
} else if (len === 2) {
mpInstance._$vueId = vueIds[0];
mpInstance._$vuePid = vueIds[1];
}
}
function initData(vueOptions, context) {
var data = vueOptions.data || {};
var methods = vueOptions.methods || {};
if (typeof data === 'function') {
try {
data = data.call(context); // 支持 Vue.prototype 上挂的数据
} catch (e) {
if (Object({"NODE_ENV":"development","VUE_APP_DARK_MODE":"false","VUE_APP_NAME":"易加蓝牙助手","VUE_APP_PLATFORM":"mp-jd","BASE_URL":"/"}).VUE_APP_DEBUG) {
console.warn('根据 Vue 的 data 函数初始化小程序 data 失败,请尽量确保 data 函数中不访问 vm 对象,否则可能影响首次数据渲染速度。', data);
}
}
} else {
try {
// 对 data 格式化
data = JSON.parse(JSON.stringify(data));
} catch (e) {}
}
if (!isPlainObject(data)) {
data = {};
}
Object.keys(methods).forEach(function (methodName) {
if (context.__lifecycle_hooks__.indexOf(methodName) === -1 && !hasOwn(data, methodName)) {
data[methodName] = methods[methodName];
}
});
return data;
}
var PROP_TYPES = [String, Number, Boolean, Object, Array, null];
function createObserver(name) {
return function observer(newVal, oldVal) {
if (this.$vm) {
this.$vm[name] = newVal; // 为了触发其他非 render watcher
}
};
}
function initBehaviors(vueOptions, initBehavior) {
var vueBehaviors = vueOptions.behaviors;
var vueExtends = vueOptions.extends;
var vueMixins = vueOptions.mixins;
var vueProps = vueOptions.props;
if (!vueProps) {
vueOptions.props = vueProps = [];
}
var behaviors = [];
if (Array.isArray(vueBehaviors)) {
vueBehaviors.forEach(function (behavior) {
behaviors.push(behavior.replace('uni://', "jd".concat("://")));
if (behavior === 'uni://form-field') {
if (Array.isArray(vueProps)) {
vueProps.push('name');
vueProps.push('value');
} else {
vueProps.name = {
type: String,
default: ''
};
vueProps.value = {
type: [String, Number, Boolean, Array, Object, Date],
default: ''
};
}
}
});
}
if (isPlainObject(vueExtends) && vueExtends.props) {
behaviors.push(initBehavior({
properties: initProperties(vueExtends.props, true)
}));
}
if (Array.isArray(vueMixins)) {
vueMixins.forEach(function (vueMixin) {
if (isPlainObject(vueMixin) && vueMixin.props) {
behaviors.push(initBehavior({
properties: initProperties(vueMixin.props, true)
}));
}
});
}
return behaviors;
}
function parsePropType(key, type, defaultValue, file) {
// [String]=>String
if (Array.isArray(type) && type.length === 1) {
return type[0];
}
return type;
}
function initProperties(props) {
var isBehavior = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
var file = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
var options = arguments.length > 3 ? arguments[3] : undefined;
var properties = {};
if (!isBehavior) {
properties.vueId = {
type: String,
value: ''
};
// scopedSlotsCompiler auto
properties.scopedSlotsCompiler = {
type: String,
value: ''
};
properties.vueSlots = {
// 小程序不能直接定义 $slots 的 props,所以通过 vueSlots 转换到 $slots
type: null,
value: [],
observer: function observer(newVal, oldVal) {
var $slots = Object.create(null);
newVal.forEach(function (slotName) {
$slots[slotName] = true;
});
this.setData({
$slots: $slots
});
}
};
}
if (Array.isArray(props)) {
// ['title']
props.forEach(function (key) {
properties[key] = {
type: null,
observer: createObserver(key)
};
});
} else if (isPlainObject(props)) {
// {title:{type:String,default:''},content:String}
Object.keys(props).forEach(function (key) {
var opts = props[key];
if (isPlainObject(opts)) {
// title:{type:String,default:''}
var value = opts.default;
if (isFn(value)) {
value = value();
}
opts.type = parsePropType(key, opts.type);
properties[key] = {
type: PROP_TYPES.indexOf(opts.type) !== -1 ? opts.type : null,
value: value,
observer: createObserver(key)
};
} else {
// content:String
var type = parsePropType(key, opts);
properties[key] = {
type: PROP_TYPES.indexOf(type) !== -1 ? type : null,
observer: createObserver(key)
};
}
});
}
return properties;
}
function wrapper$1(event) {
// TODO 又得兼容 mpvue 的 mp 对象
try {
event.mp = JSON.parse(JSON.stringify(event));
} catch (e) {}
event.stopPropagation = noop;
event.preventDefault = noop;
event.target = event.target || {};
if (!hasOwn(event, 'detail')) {
event.detail = {};
}
if (hasOwn(event, 'markerId')) {
event.detail = (0, _typeof2.default)(event.detail) === 'object' ? event.detail : {};
event.detail.markerId = event.markerId;
}
if (isPlainObject(event.detail)) {
event.target = Object.assign({}, event.target, event.detail);
}
return event;
}
function getExtraValue(vm, dataPathsArray) {
var context = vm;
dataPathsArray.forEach(function (dataPathArray) {
var dataPath = dataPathArray[0];
var value = dataPathArray[2];
if (dataPath || typeof value !== 'undefined') {
// ['','',index,'disable']
var propPath = dataPathArray[1];
var valuePath = dataPathArray[3];
var vFor;
if (Number.isInteger(dataPath)) {
vFor = dataPath;
} else if (!dataPath) {
vFor = context;
} else if (typeof dataPath === 'string' && dataPath) {
if (dataPath.indexOf('#s#') === 0) {
vFor = dataPath.substr(3);
} else {
vFor = vm.__get_value(dataPath, context);
}
}
if (Number.isInteger(vFor)) {
context = value;
} else if (!propPath) {
context = vFor[value];
} else {
if (Array.isArray(vFor)) {
context = vFor.find(function (vForItem) {
return vm.__get_value(propPath, vForItem) === value;
});
} else if (isPlainObject(vFor)) {
context = Object.keys(vFor).find(function (vForKey) {
return vm.__get_value(propPath, vFor[vForKey]) === value;
});
} else {
console.error('v-for 暂不支持循环数据:', vFor);
}
}
if (valuePath) {
context = vm.__get_value(valuePath, context);
}
}
});
return context;
}
function processEventExtra(vm, extra, event, __args__) {
var extraObj = {};
if (Array.isArray(extra) && extra.length) {
/**
*[
* ['data.items', 'data.id', item.data.id],
* ['metas', 'id', meta.id]
*],
*[
* ['data.items', 'data.id', item.data.id],
* ['metas', 'id', meta.id]
*],
*'test'
*/
extra.forEach(function (dataPath, index) {
if (typeof dataPath === 'string') {
if (!dataPath) {
// model,prop.sync
extraObj['$' + index] = vm;
} else {
if (dataPath === '$event') {
// $event
extraObj['$' + index] = event;
} else if (dataPath === 'arguments') {
extraObj['$' + index] = event.detail ? event.detail.__args__ || __args__ : __args__;
} else if (dataPath.indexOf('$event.') === 0) {
// $event.target.value
extraObj['$' + index] = vm.__get_value(dataPath.replace('$event.', ''), event);
} else {
extraObj['$' + index] = vm.__get_value(dataPath);
}
}
} else {
extraObj['$' + index] = getExtraValue(vm, dataPath);
}
});
}
return extraObj;
}
function getObjByArray(arr) {
var obj = {};
for (var i = 1; i < arr.length; i++) {
var element = arr[i];
obj[element[0]] = element[1];
}
return obj;
}
function processEventArgs(vm, event) {
var args = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
var extra = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
var isCustom = arguments.length > 4 ? arguments[4] : undefined;
var methodName = arguments.length > 5 ? arguments[5] : undefined;
var isCustomMPEvent = false; // wxcomponent 组件,传递原始 event 对象
// fixed 用户直接触发 mpInstance.triggerEvent
var __args__ = isPlainObject(event.detail) ? event.detail.__args__ || [event.detail] : [event.detail];
if (isCustom) {
// 自定义事件
isCustomMPEvent = event.currentTarget && event.currentTarget.dataset && event.currentTarget.dataset.comType === 'wx';
if (!args.length) {
// 无参数,直接传入 event 或 detail 数组
if (isCustomMPEvent) {
return [event];
}
return __args__;
}
}
var extraObj = processEventExtra(vm, extra, event, __args__);
var ret = [];
args.forEach(function (arg) {
if (arg === '$event') {
if (methodName === '__set_model' && !isCustom) {
// input v-model value
ret.push(event.target.value);
} else {
if (isCustom && !isCustomMPEvent) {
ret.push(__args__[0]);
} else {
// wxcomponent 组件或内置组件
ret.push(event);
}
}
} else {
if (Array.isArray(arg) && arg[0] === 'o') {
ret.push(getObjByArray(arg));
} else if (typeof arg === 'string' && hasOwn(extraObj, arg)) {
ret.push(extraObj[arg]);
} else {
ret.push(arg);
}
}
});
return ret;
}
var ONCE = '~';
var CUSTOM = '^';
function isMatchEventType(eventType, optType) {
return eventType === optType || optType === 'regionchange' && (eventType === 'begin' || eventType === 'end');
}
function getContextVm(vm) {
var $parent = vm.$parent;
// 父组件是 scoped slots 或者其他自定义组件时继续查找
while ($parent && $parent.$parent && ($parent.$options.generic || $parent.$parent.$options.generic || $parent.$scope._$vuePid)) {
$parent = $parent.$parent;
}
return $parent && $parent.$parent;
}
function handleEvent(event) {
var _this2 = this;
event = wrapper$1(event);
// [['tap',[['handle',[1,2,a]],['handle1',[1,2,a]]]]]
var dataset = (event.currentTarget || event.target).dataset;
if (!dataset) {
return console.warn('事件信息不存在');
}
var eventOpts = dataset.eventOpts || dataset['event-opts']; // 支付宝 web-view 组件 dataset 非驼峰
if (!eventOpts) {
return console.warn('事件信息不存在');
}
// [['handle',[1,2,a]],['handle1',[1,2,a]]]
var eventType = event.type;
var ret = [];
eventOpts.forEach(function (eventOpt) {
var type = eventOpt[0];
var eventsArray = eventOpt[1];
var isCustom = type.charAt(0) === CUSTOM;
type = isCustom ? type.slice(1) : type;
var isOnce = type.charAt(0) === ONCE;
type = isOnce ? type.slice(1) : type;
if (eventsArray && isMatchEventType(eventType, type)) {
eventsArray.forEach(function (eventArray) {
var methodName = eventArray[0];
if (methodName) {
var handlerCtx = _this2.$vm;
if (handlerCtx.$options.generic) {
// mp-weixin,mp-toutiao 抽象节点模拟 scoped slots
handlerCtx = getContextVm(handlerCtx) || handlerCtx;
}
if (methodName === '$emit') {
handlerCtx.$emit.apply(handlerCtx, processEventArgs(_this2.$vm, event, eventArray[1], eventArray[2], isCustom, methodName));
return;
}
var handler = handlerCtx[methodName];
if (!isFn(handler)) {
var _type = _this2.$vm.mpType === 'page' ? 'Page' : 'Component';
var path = _this2.route || _this2.is;
throw new Error("".concat(_type, " \"").concat(path, "\" does not have a method \"").concat(methodName, "\""));
}
if (isOnce) {
if (handler.once) {
return;
}
handler.once = true;
}
var params = processEventArgs(_this2.$vm, event, eventArray[1], eventArray[2], isCustom, methodName);
params = Array.isArray(params) ? params : [];
// 参数尾部增加原始事件对象用于复杂表达式内获取额外数据
if (/=\s*\S+\.eventParams\s*\|\|\s*\S+\[['"]event-params['"]\]/.test(handler.toString())) {
// eslint-disable-next-line no-sparse-arrays
params = params.concat([,,,,,,,,,, event]);
}
ret.push(handler.apply(handlerCtx, params));
}
});
}
});
if (eventType === 'input' && ret.length === 1 && typeof ret[0] !== 'undefined') {
return ret[0];
}
}
var EventChannel = /*#__PURE__*/function () {
function EventChannel(id, events) {
var _this3 = this;
(0, _classCallCheck2.default)(this, EventChannel);
this.id = id;
this.listener = {};
this.emitCache = {};
if (events) {
Object.keys(events).forEach(function (name) {
_this3.on(name, events[name]);
});
}
}
(0, _createClass2.default)(EventChannel, [{
key: "emit",
value: function emit(eventName) {
for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {
args[_key5 - 1] = arguments[_key5];
}
var fns = this.listener[eventName];
if (!fns) {
return (this.emitCache[eventName] || (this.emitCache[eventName] = [])).push(args);
}
fns.forEach(function (opt) {
opt.fn.apply(opt.fn, args);
});
this.listener[eventName] = fns.filter(function (opt) {
return opt.type !== 'once';
});
}
}, {
key: "on",
value: function on(eventName, fn) {
this._addListener(eventName, 'on', fn);
this._clearCache(eventName);
}
}, {
key: "once",
value: function once(eventName, fn) {
this._addListener(eventName, 'once', fn);
this._clearCache(eventName);
}
}, {
key: "off",
value: function off(eventName, fn) {
var fns = this.listener[eventName];
if (!fns) {
return;
}
if (fn) {
for (var i = 0; i < fns.length;) {
if (fns[i].fn === fn) {
fns.splice(i, 1);
i--;
}
i++;
}
} else {
delete this.listener[eventName];
}
}
}, {
key: "_clearCache",
value: function _clearCache(eventName) {
var cacheArgs = this.emitCache[eventName];
if (cacheArgs) {
for (; cacheArgs.length > 0;) {
this.emit.apply(this, [eventName].concat(cacheArgs.shift()));
}
}
}
}, {
key: "_addListener",
value: function _addListener(eventName, type, fn) {
(this.listener[eventName] || (this.listener[eventName] = [])).push({
fn: fn,
type: type
});
}
}]);
return EventChannel;
}();
var eventChannels = {};
var eventChannelStack = [];
function getEventChannel(id) {
if (id) {
var eventChannel = eventChannels[id];
delete eventChannels[id];
return eventChannel;
}
return eventChannelStack.shift();
}
var hooks = ['onShow', 'onHide', 'onError', 'onPageNotFound', 'onThemeChange', 'onUnhandledRejection'];
function initEventChannel() {
_vue.default.prototype.getOpenerEventChannel = function () {
if (!this.__eventChannel__) {
this.__eventChannel__ = new EventChannel();
}
return this.__eventChannel__;
};
var callHook = _vue.default.prototype.__call_hook;
_vue.default.prototype.__call_hook = function (hook, args) {
if (hook === 'onLoad' && args && args.__id__) {
this.__eventChannel__ = getEventChannel(args.__id__);
delete args.__id__;
}
return callHook.call(this, hook, args);
};
}
function initScopedSlotsParams() {
var center = {};
var parents = {};
_vue.default.prototype.$hasScopedSlotsParams = function (vueId) {
var has = center[vueId];
if (!has) {
parents[vueId] = this;
this.$on('hook:destroyed', function () {
delete parents[vueId];
});
}
return has;
};
_vue.default.prototype.$getScopedSlotsParams = function (vueId, name, key) {
var data = center[vueId];
if (data) {
var object = data[name] || {};
return key ? object[key] : object;
} else {
parents[vueId] = this;
this.$on('hook:destroyed', function () {
delete parents[vueId];
});
}
};
_vue.default.prototype.$setScopedSlotsParams = function (name, value) {
var vueIds = this.$options.propsData.vueId;
if (vueIds) {
var vueId = vueIds.split(',')[0];
var object = center[vueId] = center[vueId] || {};
object[name] = value;
if (parents[vueId]) {
parents[vueId].$forceUpdate();
}
}
};
_vue.default.mixin({
destroyed: function destroyed() {
var propsData = this.$options.propsData;
var vueId = propsData && propsData.vueId;
if (vueId) {
delete center[vueId];
delete parents[vueId];
}
}
});
}
function parseBaseApp(vm, _ref4) {
var mocks = _ref4.mocks,
initRefs = _ref4.initRefs;
initEventChannel();
{
initScopedSlotsParams();
}
if (vm.$options.store) {
_vue.default.prototype.$store = vm.$options.store;
}
uniIdMixin(_vue.default);
_vue.default.prototype.mpHost = "mp-jd";
_vue.default.mixin({
beforeCreate: function beforeCreate() {
if (!this.$options.mpType) {
return;
}
this.mpType = this.$options.mpType;
this.$mp = (0, _defineProperty2.default)({
data: {}
}, this.mpType, this.$options.mpInstance);
this.$scope = this.$options.mpInstance;
delete this.$options.mpType;
delete this.$options.mpInstance;
if (this.mpType === 'page' && typeof getApp === 'function') {
// hack vue-i18n
var app = getApp();
if (app.$vm && app.$vm.$i18n) {
this._i18n = app.$vm.$i18n;
}
}
if (this.mpType !== 'app') {
initRefs(this);
initMocks(this, mocks);
}
}
});
var appOptions = {
onLaunch: function onLaunch(args) {
if (this.$vm) {
// 已经初始化过了,主要是为了百度,百度 onShow 在 onLaunch 之前
return;
}
this.$vm = vm;
this.$vm.$mp = {
app: this
};
this.$vm.$scope = this;
// vm 上也挂载 globalData
this.$vm.globalData = this.globalData;
this.$vm._isMounted = true;
this.$vm.__call_hook('mounted', args);
this.$vm.__call_hook('onLaunch', args);
}
};
// 兼容旧版本 globalData
appOptions.globalData = vm.$options.globalData || {};
// 将 methods 中的方法挂在 getApp() 中
var methods = vm.$options.methods;
if (methods) {
Object.keys(methods).forEach(function (name) {
appOptions[name] = methods[name];
});
}
initAppLocale(_vue.default, vm, normalizeLocale(jd.getSystemInfoSync().language) || LOCALE_EN);
initHooks(appOptions, hooks);
initUnknownHooks(appOptions, vm.$options);
return appOptions;
}
function parseApp(vm) {
return parseBaseApp(vm, {
mocks: mocks,
initRefs: initRefs
});
}
function parseApp$1(vm) {
return parseApp(vm);
}
function createApp(vm) {
App(parseApp$1(vm));
return vm;
}
var encodeReserveRE = /[!'()*]/g;
var encodeReserveReplacer = function encodeReserveReplacer(c) {
return '%' + c.charCodeAt(0).toString(16);
};
var commaRE = /%2C/g;
// fixed encodeURIComponent which is more conformant to RFC3986:
// - escapes [!'()*]
// - preserve commas
var encode = function encode(str) {
return encodeURIComponent(str).replace(encodeReserveRE, encodeReserveReplacer).replace(commaRE, ',');
};
function stringifyQuery(obj) {
var encodeStr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : encode;
var res = obj ? Object.keys(obj).map(function (key) {
var val = obj[key];
if (val === undefined) {
return '';
}
if (val === null) {
return encodeStr(key);
}
if (Array.isArray(val)) {
var result = [];
val.forEach(function (val2) {
if (val2 === undefined) {
return;
}
if (val2 === null) {
result.push(encodeStr(key));
} else {
result.push(encodeStr(key) + '=' + encodeStr(val2));
}
});
return result.join('&');
}
return encodeStr(key) + '=' + encodeStr(val);
}).filter(function (x) {
return x.length > 0;
}).join('&') : null;
return res ? "?".concat(res) : '';
}
function parseBaseComponent(vueComponentOptions) {
var _ref5 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
isPage = _ref5.isPage,
initRelation = _ref5.initRelation;
var needVueOptions = arguments.length > 2 ? arguments[2] : undefined;
var _initVueComponent = initVueComponent(_vue.default, vueComponentOptions),
_initVueComponent2 = (0, _slicedToArray2.default)(_initVueComponent, 2),
VueComponent = _initVueComponent2[0],
vueOptions = _initVueComponent2[1];
var options = _objectSpread({
multipleSlots: true,
addGlobalClass: true
}, vueOptions.options || {});
var componentOptions = {
options: options,
data: initData(vueOptions, _vue.default.prototype),
behaviors: initBehaviors(vueOptions, initBehavior),
properties: initProperties(vueOptions.props, false, vueOptions.__file),
lifetimes: {
attached: function attached() {
var properties = this.properties;
var options = {
mpType: isPage.call(this) ? 'page' : 'component',
mpInstance: this,
propsData: properties
};
initVueIds(properties.vueId, this);
// 处理父子关系
initRelation.call(this, {
vuePid: this._$vuePid,
vueOptions: options
});
// 初始化 vue 实例
this.$vm = new VueComponent(options);
// 处理$slots,$scopedSlots(暂不支持动态变化$slots)
initSlots(this.$vm, properties.vueSlots);
// 触发首次 setData
this.$vm.$mount();
},
ready: function ready() {
// 当组件 props 默认值为 true,初始化时传入 false 会导致 created,ready 触发, 但 attached 不触发
// https://developers.weixin.qq.com/community/develop/doc/00066ae2844cc0f8eb883e2a557800
if (this.$vm) {
this.$vm._isMounted = true;
this.$vm.__call_hook('mounted');
this.$vm.__call_hook('onReady');
}
},
detached: function detached() {
this.$vm && this.$vm.$destroy();
}
},
pageLifetimes: {
show: function show(args) {
this.$vm && this.$vm.__call_hook('onPageShow', args);
},
hide: function hide() {
this.$vm && this.$vm.__call_hook('onPageHide');
},
resize: function resize(size) {
this.$vm && this.$vm.__call_hook('onPageResize', size);
}
},
methods: {
__l: handleLink,
__e: handleEvent
}
};
// externalClasses
if (vueOptions.externalClasses) {
componentOptions.externalClasses = vueOptions.externalClasses;
}
if (Array.isArray(vueOptions.wxsCallMethods)) {
vueOptions.wxsCallMethods.forEach(function (callMethod) {
componentOptions.methods[callMethod] = function (args) {
return this.$vm[callMethod](args);
};
});
}
if (needVueOptions) {
return [componentOptions, vueOptions, VueComponent];
}
if (isPage) {
return componentOptions;
}
return [componentOptions, VueComponent];
}
function parseComponent(vueComponentOptions, needVueOptions) {
return parseBaseComponent(vueComponentOptions, {
isPage: isPage,
initRelation: initRelation
}, needVueOptions);
}
function parseComponent$1(vueComponentOptions, needVueOptions) {
var _parseComponent = parseComponent(vueComponentOptions, true),
_parseComponent2 = (0, _slicedToArray2.default)(_parseComponent, 2),
componentOptions = _parseComponent2[0],
vueOptions = _parseComponent2[1];
// 京东小程序 lifetimes 存在兼容问题
var lifetimes = componentOptions.lifetimes;
Object.keys(lifetimes).forEach(function (key) {
componentOptions[key] = lifetimes[key];
});
return needVueOptions ? [componentOptions, vueOptions] : componentOptions;
}
var hooks$1 = ['onShow', 'onHide', 'onUnload'];
hooks$1.push.apply(hooks$1, PAGE_EVENT_HOOKS);
function parseBasePage(vuePageOptions) {
var _parseComponent$ = parseComponent$1(vuePageOptions, true),
_parseComponent$2 = (0, _slicedToArray2.default)(_parseComponent$, 2),
pageOptions = _parseComponent$2[0],
vueOptions = _parseComponent$2[1];
initHooks(pageOptions.methods, hooks$1, vueOptions);
pageOptions.methods.onLoad = function (query) {
this.options = query;
var copyQuery = Object.assign({}, query);
delete copyQuery.__id__;
this.$page = {
fullPath: '/' + (this.route || this.is) + stringifyQuery(copyQuery)
};
this.$vm.$mp.query = query; // 兼容 mpvue
this.$vm.__call_hook('onLoad', query);
};
{
initUnknownHooks(pageOptions.methods, vuePageOptions, ['onReady']);
}
return pageOptions;
}
function parsePage(vuePageOptions) {
return parseBasePage(vuePageOptions);
}
function parsePage$1(vuePageOptions) {
return parsePage(vuePageOptions);
}
function createPage(vuePageOptions) {
{
return Component(parsePage$1(vuePageOptions));
}
}
function createComponent(vueOptions) {
{
return Component(parseComponent$1(vueOptions));
}
}
function createSubpackageApp(vm) {
var appOptions = parseApp$1(vm);
var app = getApp({
allowDefault: true
});
vm.$scope = app;
var globalData = app.globalData;
if (globalData) {
Object.keys(appOptions.globalData).forEach(function (name) {
if (!hasOwn(globalData, name)) {
globalData[name] = appOptions.globalData[name];
}
});
}
Object.keys(appOptions).forEach(function (name) {
if (!hasOwn(app, name)) {
app[name] = appOptions[name];
}
});
if (isFn(appOptions.onShow) && jd.onAppShow) {
jd.onAppShow(function () {
for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
args[_key6] = arguments[_key6];
}
vm.__call_hook('onShow', args);
});
}
if (isFn(appOptions.onHide) && jd.onAppHide) {
jd.onAppHide(function () {
for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
args[_key7] = arguments[_key7];
}
vm.__call_hook('onHide', args);
});
}
if (isFn(appOptions.onLaunch)) {
var args = jd.getLaunchOptionsSync && jd.getLaunchOptionsSync();
vm.__call_hook('onLaunch', args);
}
return vm;
}
function createPlugin(vm) {
var appOptions = parseApp$1(vm);
if (isFn(appOptions.onShow) && jd.onAppShow) {
jd.onAppShow(function () {
for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
args[_key8] = arguments[_key8];
}
vm.__call_hook('onShow', args);
});
}
if (isFn(appOptions.onHide) && jd.onAppHide) {
jd.onAppHide(function () {
for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
args[_key9] = arguments[_key9];
}
vm.__call_hook('onHide', args);
});
}
if (isFn(appOptions.onLaunch)) {
var args = jd.getLaunchOptionsSync && jd.getLaunchOptionsSync();
vm.__call_hook('onLaunch', args);
}
return vm;
}
todos.forEach(function (todoApi) {
protocols[todoApi] = false;
});
canIUses.forEach(function (canIUseApi) {
var apiName = protocols[canIUseApi] && protocols[canIUseApi].name ? protocols[canIUseApi].name : canIUseApi;
if (!jd.canIUse(apiName)) {
protocols[canIUseApi] = false;
}
});
var uni = {};
if (typeof Proxy !== 'undefined' && "mp-jd" !== 'app-plus') {
uni = new Proxy({}, {
get: function get(target, name) {
if (hasOwn(target, name)) {
return target[name];
}
if (baseApi[name]) {
return baseApi[name];
}
if (api[name]) {
return promisify(name, api[name]);
}
{
if (extraApi[name]) {
return promisify(name, extraApi[name]);
}
if (todoApis[name]) {
return promisify(name, todoApis[name]);
}
}
if (eventApi[name]) {
return eventApi[name];
}
return promisify(name, wrapper(name, jd[name]));
},
set: function set(target, name, value) {
target[name] = value;
return true;
}
});
} else {
Object.keys(baseApi).forEach(function (name) {
uni[name] = baseApi[name];
});
{
Object.keys(todoApis).forEach(function (name) {
uni[name] = promisify(name, todoApis[name]);
});
Object.keys(extraApi).forEach(function (name) {
uni[name] = promisify(name, todoApis[name]);
});
}
Object.keys(eventApi).forEach(function (name) {
uni[name] = eventApi[name];
});
Object.keys(api).forEach(function (name) {
uni[name] = promisify(name, api[name]);
});
Object.keys(jd).forEach(function (name) {
if (hasOwn(jd, name) || hasOwn(protocols, name)) {
uni[name] = promisify(name, wrapper(name, jd[name]));
}
});
}
jd.createApp = createApp;
jd.createPage = createPage;
jd.createComponent = createComponent;
jd.createSubpackageApp = createSubpackageApp;
jd.createPlugin = createPlugin;
var uni$1 = uni;
var _default = uni$1;
exports.default = _default;
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../webpack/buildin/global.js */ 2)))
/***/ }),
/* 2 */
/*!***********************************!*\
!*** (webpack)/buildin/global.js ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports) {
var g;
// This works in non-strict mode
g = (function() {
return this;
})();
try {
// This works if eval is allowed (see CSP)
g = g || new Function("return this")();
} catch (e) {
// This works if the window reference is available
if (typeof window === "object") g = window;
}
// g can still be undefined, but nothing to do about it...
// We return undefined, instead of nothing here, so it's
// easier to handle this case. if(!global) { ...}
module.exports = g;
/***/ }),
/* 3 */
/*!**********************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/interopRequireDefault.js ***!
\**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
"default": obj
};
}
module.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 4 */
/*!**************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/slicedToArray.js ***!
\**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var arrayWithHoles = __webpack_require__(/*! ./arrayWithHoles.js */ 5);
var iterableToArrayLimit = __webpack_require__(/*! ./iterableToArrayLimit.js */ 6);
var unsupportedIterableToArray = __webpack_require__(/*! ./unsupportedIterableToArray.js */ 7);
var nonIterableRest = __webpack_require__(/*! ./nonIterableRest.js */ 9);
function _slicedToArray(arr, i) {
return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();
}
module.exports = _slicedToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 5 */
/*!***************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/arrayWithHoles.js ***!
\***************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
function _arrayWithHoles(arr) {
if (Array.isArray(arr)) return arr;
}
module.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 6 */
/*!*********************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/iterableToArrayLimit.js ***!
\*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
function _iterableToArrayLimit(arr, i) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s,
_e,
_x,
_r,
_arr = [],
_n = !0,
_d = !1;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i) {
if (Object(_i) !== _i) return;
_n = !1;
} else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0) {
;
}
} catch (err) {
_d = !0, _e = err;
} finally {
try {
if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return;
} finally {
if (_d) throw _e;
}
}
return _arr;
}
}
module.exports = _iterableToArrayLimit, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 7 */
/*!***************************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js ***!
\***************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var arrayLikeToArray = __webpack_require__(/*! ./arrayLikeToArray.js */ 8);
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);
}
module.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 8 */
/*!*****************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/arrayLikeToArray.js ***!
\*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
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;
}
module.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 9 */
/*!****************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/nonIterableRest.js ***!
\****************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
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.");
}
module.exports = _nonIterableRest, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 10 */
/*!***************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/classCallCheck.js ***!
\***************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
module.exports = _classCallCheck, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 11 */
/*!************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/createClass.js ***!
\************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var toPropertyKey = __webpack_require__(/*! ./toPropertyKey.js */ 12);
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, toPropertyKey(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;
}
module.exports = _createClass, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 12 */
/*!**************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/toPropertyKey.js ***!
\**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var _typeof = __webpack_require__(/*! ./typeof.js */ 13)["default"];
var toPrimitive = __webpack_require__(/*! ./toPrimitive.js */ 14);
function _toPropertyKey(arg) {
var key = toPrimitive(arg, "string");
return _typeof(key) === "symbol" ? key : String(key);
}
module.exports = _toPropertyKey, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 13 */
/*!*******************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/typeof.js ***!
\*******************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
function _typeof(obj) {
"@babel/helpers - typeof";
return (module.exports = _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;
}, module.exports.__esModule = true, module.exports["default"] = module.exports), _typeof(obj);
}
module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 14 */
/*!************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/toPrimitive.js ***!
\************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var _typeof = __webpack_require__(/*! ./typeof.js */ 13)["default"];
function _toPrimitive(input, hint) {
if (_typeof(input) !== "object" || input === null) return input;
var prim = input[Symbol.toPrimitive];
if (prim !== undefined) {
var res = prim.call(input, hint || "default");
if (_typeof(res) !== "object") return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
module.exports = _toPrimitive, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 15 */
/*!***************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/defineProperty.js ***!
\***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var toPropertyKey = __webpack_require__(/*! ./toPropertyKey.js */ 12);
function _defineProperty(obj, key, value) {
key = toPropertyKey(key);
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
module.exports = _defineProperty, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 16 */
/*!**********************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/construct.js ***!
\**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var setPrototypeOf = __webpack_require__(/*! ./setPrototypeOf.js */ 17);
var isNativeReflectConstruct = __webpack_require__(/*! ./isNativeReflectConstruct.js */ 18);
function _construct(Parent, args, Class) {
if (isNativeReflectConstruct()) {
module.exports = _construct = Reflect.construct.bind(), module.exports.__esModule = true, module.exports["default"] = module.exports;
} else {
module.exports = _construct = function _construct(Parent, args, Class) {
var a = [null];
a.push.apply(a, args);
var Constructor = Function.bind.apply(Parent, a);
var instance = new Constructor();
if (Class) setPrototypeOf(instance, Class.prototype);
return instance;
}, module.exports.__esModule = true, module.exports["default"] = module.exports;
}
return _construct.apply(null, arguments);
}
module.exports = _construct, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 17 */
/*!***************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/setPrototypeOf.js ***!
\***************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
function _setPrototypeOf(o, p) {
module.exports = _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
}, module.exports.__esModule = true, module.exports["default"] = module.exports;
return _setPrototypeOf(o, p);
}
module.exports = _setPrototypeOf, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 18 */
/*!*************************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/isNativeReflectConstruct.js ***!
\*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
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;
}
}
module.exports = _isNativeReflectConstruct, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 19 */
/*!******************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/toConsumableArray.js ***!
\******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var arrayWithoutHoles = __webpack_require__(/*! ./arrayWithoutHoles.js */ 20);
var iterableToArray = __webpack_require__(/*! ./iterableToArray.js */ 21);
var unsupportedIterableToArray = __webpack_require__(/*! ./unsupportedIterableToArray.js */ 7);
var nonIterableSpread = __webpack_require__(/*! ./nonIterableSpread.js */ 22);
function _toConsumableArray(arr) {
return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();
}
module.exports = _toConsumableArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 20 */
/*!******************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js ***!
\******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var arrayLikeToArray = __webpack_require__(/*! ./arrayLikeToArray.js */ 8);
function _arrayWithoutHoles(arr) {
if (Array.isArray(arr)) return arrayLikeToArray(arr);
}
module.exports = _arrayWithoutHoles, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 21 */
/*!****************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/iterableToArray.js ***!
\****************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
function _iterableToArray(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
}
module.exports = _iterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 22 */
/*!******************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/nonIterableSpread.js ***!
\******************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
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.");
}
module.exports = _nonIterableSpread, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 23 */
/*!*************************************************************!*\
!*** ./node_modules/@dcloudio/uni-i18n/dist/uni-i18n.es.js ***!
\*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(uni, global) {
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 3);
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.LOCALE_ZH_HANT = exports.LOCALE_ZH_HANS = exports.LOCALE_FR = exports.LOCALE_ES = exports.LOCALE_EN = exports.I18n = exports.Formatter = void 0;
exports.compileI18nJsonStr = compileI18nJsonStr;
exports.hasI18nJson = hasI18nJson;
exports.initVueI18n = initVueI18n;
exports.isI18nStr = isI18nStr;
exports.isString = void 0;
exports.normalizeLocale = normalizeLocale;
exports.parseI18nJson = parseI18nJson;
exports.resolveLocale = resolveLocale;
var _slicedToArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ 4));
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ 10));
var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ 11));
var _typeof2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/typeof */ 13));
var isArray = Array.isArray;
var isObject = function isObject(val) {
return val !== null && (0, _typeof2.default)(val) === 'object';
};
var defaultDelimiters = ['{', '}'];
var BaseFormatter = /*#__PURE__*/function () {
function BaseFormatter() {
(0, _classCallCheck2.default)(this, BaseFormatter);
this._caches = Object.create(null);
}
(0, _createClass2.default)(BaseFormatter, [{
key: "interpolate",
value: function interpolate(message, values) {
var delimiters = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultDelimiters;
if (!values) {
return [message];
}
var tokens = this._caches[message];
if (!tokens) {
tokens = parse(message, delimiters);
this._caches[message] = tokens;
}
return compile(tokens, values);
}
}]);
return BaseFormatter;
}();
exports.Formatter = BaseFormatter;
var RE_TOKEN_LIST_VALUE = /^(?:\d)+/;
var RE_TOKEN_NAMED_VALUE = /^(?:\w)+/;
function parse(format, _ref) {
var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
startDelimiter = _ref2[0],
endDelimiter = _ref2[1];
var tokens = [];
var position = 0;
var text = '';
while (position < format.length) {
var char = format[position++];
if (char === startDelimiter) {
if (text) {
tokens.push({
type: 'text',
value: text
});
}
text = '';
var sub = '';
char = format[position++];
while (char !== undefined && char !== endDelimiter) {
sub += char;
char = format[position++];
}
var isClosed = char === endDelimiter;
var type = RE_TOKEN_LIST_VALUE.test(sub) ? 'list' : isClosed && RE_TOKEN_NAMED_VALUE.test(sub) ? 'named' : 'unknown';
tokens.push({
value: sub,
type: type
});
}
// else if (char === '%') {
// // when found rails i18n syntax, skip text capture
// if (format[position] !== '{') {
// text += char
// }
// }
else {
text += char;
}
}
text && tokens.push({
type: 'text',
value: text
});
return tokens;
}
function compile(tokens, values) {
var compiled = [];
var index = 0;
var mode = isArray(values) ? 'list' : isObject(values) ? 'named' : 'unknown';
if (mode === 'unknown') {
return compiled;
}
while (index < tokens.length) {
var token = tokens[index];
switch (token.type) {
case 'text':
compiled.push(token.value);
break;
case 'list':
compiled.push(values[parseInt(token.value, 10)]);
break;
case 'named':
if (mode === 'named') {
compiled.push(values[token.value]);
} else {
if (true) {
console.warn("Type of token '".concat(token.type, "' and format of value '").concat(mode, "' don't match!"));
}
}
break;
case 'unknown':
if (true) {
console.warn("Detect 'unknown' type of token!");
}
break;
}
index++;
}
return compiled;
}
var LOCALE_ZH_HANS = 'zh-Hans';
exports.LOCALE_ZH_HANS = LOCALE_ZH_HANS;
var LOCALE_ZH_HANT = 'zh-Hant';
exports.LOCALE_ZH_HANT = LOCALE_ZH_HANT;
var LOCALE_EN = 'en';
exports.LOCALE_EN = LOCALE_EN;
var LOCALE_FR = 'fr';
exports.LOCALE_FR = LOCALE_FR;
var LOCALE_ES = 'es';
exports.LOCALE_ES = LOCALE_ES;
var hasOwnProperty = Object.prototype.hasOwnProperty;
var hasOwn = function hasOwn(val, key) {
return hasOwnProperty.call(val, key);
};
var defaultFormatter = new BaseFormatter();
function include(str, parts) {
return !!parts.find(function (part) {
return str.indexOf(part) !== -1;
});
}
function startsWith(str, parts) {
return parts.find(function (part) {
return str.indexOf(part) === 0;
});
}
function normalizeLocale(locale, messages) {
if (!locale) {
return;
}
locale = locale.trim().replace(/_/g, '-');
if (messages && messages[locale]) {
return locale;
}
locale = locale.toLowerCase();
if (locale.indexOf('zh') === 0) {
if (locale.indexOf('-hans') > -1) {
return LOCALE_ZH_HANS;
}
if (locale.indexOf('-hant') > -1) {
return LOCALE_ZH_HANT;
}
if (include(locale, ['-tw', '-hk', '-mo', '-cht'])) {
return LOCALE_ZH_HANT;
}
return LOCALE_ZH_HANS;
}
var lang = startsWith(locale, [LOCALE_EN, LOCALE_FR, LOCALE_ES]);
if (lang) {
return lang;
}
}
var I18n = /*#__PURE__*/function () {
function I18n(_ref3) {
var locale = _ref3.locale,
fallbackLocale = _ref3.fallbackLocale,
messages = _ref3.messages,
watcher = _ref3.watcher,
formater = _ref3.formater;
(0, _classCallCheck2.default)(this, I18n);
this.locale = LOCALE_EN;
this.fallbackLocale = LOCALE_EN;
this.message = {};
this.messages = {};
this.watchers = [];
if (fallbackLocale) {
this.fallbackLocale = fallbackLocale;
}
this.formater = formater || defaultFormatter;
this.messages = messages || {};
this.setLocale(locale || LOCALE_EN);
if (watcher) {
this.watchLocale(watcher);
}
}
(0, _createClass2.default)(I18n, [{
key: "setLocale",
value: function setLocale(locale) {
var _this = this;
var oldLocale = this.locale;
this.locale = normalizeLocale(locale, this.messages) || this.fallbackLocale;
if (!this.messages[this.locale]) {
// 可能初始化时不存在
this.messages[this.locale] = {};
}
this.message = this.messages[this.locale];
// 仅发生变化时,通知
if (oldLocale !== this.locale) {
this.watchers.forEach(function (watcher) {
watcher(_this.locale, oldLocale);
});
}
}
}, {
key: "getLocale",
value: function getLocale() {
return this.locale;
}
}, {
key: "watchLocale",
value: function watchLocale(fn) {
var _this2 = this;
var index = this.watchers.push(fn) - 1;
return function () {
_this2.watchers.splice(index, 1);
};
}
}, {
key: "add",
value: function add(locale, message) {
var override = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
var curMessages = this.messages[locale];
if (curMessages) {
if (override) {
Object.assign(curMessages, message);
} else {
Object.keys(message).forEach(function (key) {
if (!hasOwn(curMessages, key)) {
curMessages[key] = message[key];
}
});
}
} else {
this.messages[locale] = message;
}
}
}, {
key: "f",
value: function f(message, values, delimiters) {
return this.formater.interpolate(message, values, delimiters).join('');
}
}, {
key: "t",
value: function t(key, locale, values) {
var message = this.message;
if (typeof locale === 'string') {
locale = normalizeLocale(locale, this.messages);
locale && (message = this.messages[locale]);
} else {
values = locale;
}
if (!hasOwn(message, key)) {
console.warn("Cannot translate the value of keypath ".concat(key, ". Use the value of keypath as default."));
return key;
}
return this.formater.interpolate(message[key], values).join('');
}
}]);
return I18n;
}();
exports.I18n = I18n;
function watchAppLocale(appVm, i18n) {
// 需要保证 watch 的触发在组件渲染之前
if (appVm.$watchLocale) {
// vue2
appVm.$watchLocale(function (newLocale) {
i18n.setLocale(newLocale);
});
} else {
appVm.$watch(function () {
return appVm.$locale;
}, function (newLocale) {
i18n.setLocale(newLocale);
});
}
}
function getDefaultLocale() {
if (typeof uni !== 'undefined' && uni.getLocale) {
return uni.getLocale();
}
// 小程序平台,uni 和 uni-i18n 互相引用,导致访问不到 uni,故在 global 上挂了 getLocale
if (typeof global !== 'undefined' && global.getLocale) {
return global.getLocale();
}
return LOCALE_EN;
}
function initVueI18n(locale) {
var messages = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var fallbackLocale = arguments.length > 2 ? arguments[2] : undefined;
var watcher = arguments.length > 3 ? arguments[3] : undefined;
// 兼容旧版本入参
if (typeof locale !== 'string') {
var _ref4 = [messages, locale];
locale = _ref4[0];
messages = _ref4[1];
}
if (typeof locale !== 'string') {
// 因为小程序平台,uni-i18n 和 uni 互相引用,导致此时访问 uni 时,为 undefined
locale = getDefaultLocale();
}
if (typeof fallbackLocale !== 'string') {
fallbackLocale = typeof __uniConfig !== 'undefined' && __uniConfig.fallbackLocale || LOCALE_EN;
}
var i18n = new I18n({
locale: locale,
fallbackLocale: fallbackLocale,
messages: messages,
watcher: watcher
});
var _t = function t(key, values) {
if (typeof getApp !== 'function') {
// app view
/* eslint-disable no-func-assign */
_t = function t(key, values) {
return i18n.t(key, values);
};
} else {
var isWatchedAppLocale = false;
_t = function t(key, values) {
var appVm = getApp().$vm;
// 可能$vm还不存在,比如在支付宝小程序中,组件定义较早,在props的default里使用了t()函数(如uni-goods-nav),此时app还未初始化
// options: {
// type: Array,
// default () {
// return [{
// icon: 'shop',
// text: t("uni-goods-nav.options.shop"),
// }, {
// icon: 'cart',
// text: t("uni-goods-nav.options.cart")
// }]
// }
// },
if (appVm) {
// 触发响应式
appVm.$locale;
if (!isWatchedAppLocale) {
isWatchedAppLocale = true;
watchAppLocale(appVm, i18n);
}
}
return i18n.t(key, values);
};
}
return _t(key, values);
};
return {
i18n: i18n,
f: function f(message, values, delimiters) {
return i18n.f(message, values, delimiters);
},
t: function t(key, values) {
return _t(key, values);
},
add: function add(locale, message) {
var override = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
return i18n.add(locale, message, override);
},
watch: function watch(fn) {
return i18n.watchLocale(fn);
},
getLocale: function getLocale() {
return i18n.getLocale();
},
setLocale: function setLocale(newLocale) {
return i18n.setLocale(newLocale);
}
};
}
var isString = function isString(val) {
return typeof val === 'string';
};
exports.isString = isString;
var formater;
function hasI18nJson(jsonObj, delimiters) {
if (!formater) {
formater = new BaseFormatter();
}
return walkJsonObj(jsonObj, function (jsonObj, key) {
var value = jsonObj[key];
if (isString(value)) {
if (isI18nStr(value, delimiters)) {
return true;
}
} else {
return hasI18nJson(value, delimiters);
}
});
}
function parseI18nJson(jsonObj, values, delimiters) {
if (!formater) {
formater = new BaseFormatter();
}
walkJsonObj(jsonObj, function (jsonObj, key) {
var value = jsonObj[key];
if (isString(value)) {
if (isI18nStr(value, delimiters)) {
jsonObj[key] = compileStr(value, values, delimiters);
}
} else {
parseI18nJson(value, values, delimiters);
}
});
return jsonObj;
}
function compileI18nJsonStr(jsonStr, _ref5) {
var locale = _ref5.locale,
locales = _ref5.locales,
delimiters = _ref5.delimiters;
if (!isI18nStr(jsonStr, delimiters)) {
return jsonStr;
}
if (!formater) {
formater = new BaseFormatter();
}
var localeValues = [];
Object.keys(locales).forEach(function (name) {
if (name !== locale) {
localeValues.push({
locale: name,
values: locales[name]
});
}
});
localeValues.unshift({
locale: locale,
values: locales[locale]
});
try {
return JSON.stringify(compileJsonObj(JSON.parse(jsonStr), localeValues, delimiters), null, 2);
} catch (e) {}
return jsonStr;
}
function isI18nStr(value, delimiters) {
return value.indexOf(delimiters[0]) > -1;
}
function compileStr(value, values, delimiters) {
return formater.interpolate(value, values, delimiters).join('');
}
function compileValue(jsonObj, key, localeValues, delimiters) {
var value = jsonObj[key];
if (isString(value)) {
// 存在国际化
if (isI18nStr(value, delimiters)) {
jsonObj[key] = compileStr(value, localeValues[0].values, delimiters);
if (localeValues.length > 1) {
// 格式化国际化语言
var valueLocales = jsonObj[key + 'Locales'] = {};
localeValues.forEach(function (localValue) {
valueLocales[localValue.locale] = compileStr(value, localValue.values, delimiters);
});
}
}
} else {
compileJsonObj(value, localeValues, delimiters);
}
}
function compileJsonObj(jsonObj, localeValues, delimiters) {
walkJsonObj(jsonObj, function (jsonObj, key) {
compileValue(jsonObj, key, localeValues, delimiters);
});
return jsonObj;
}
function walkJsonObj(jsonObj, walk) {
if (isArray(jsonObj)) {
for (var i = 0; i < jsonObj.length; i++) {
if (walk(jsonObj, i)) {
return true;
}
}
} else if (isObject(jsonObj)) {
for (var key in jsonObj) {
if (walk(jsonObj, key)) {
return true;
}
}
}
return false;
}
function resolveLocale(locales) {
return function (locale) {
if (!locale) {
return locale;
}
locale = normalizeLocale(locale) || locale;
return resolveLocaleChain(locale).find(function (locale) {
return locales.indexOf(locale) > -1;
});
};
}
function resolveLocaleChain(locale) {
var chain = [];
var tokens = locale.split('-');
while (tokens.length) {
chain.push(tokens.join('-'));
tokens.pop();
}
return chain;
}
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-jd/dist/index.js */ 1)["default"], __webpack_require__(/*! ./../../../webpack/buildin/global.js */ 2)))
/***/ }),
/* 24 */
/*!******************************************************************************************!*\
!*** ./node_modules/@dcloudio/vue-cli-plugin-uni/packages/mp-vue/dist/mp.runtime.esm.js ***!
\******************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* WEBPACK VAR INJECTION */(function(global) {/*!
* Vue.js v2.6.11
* (c) 2014-2022 Evan You
* Released under the MIT License.
*/
/* */
var emptyObject = Object.freeze({});
// These helpers produce better VM code in JS engines due to their
// explicitness and function inlining.
function isUndef (v) {
return v === undefined || v === null
}
function isDef (v) {
return v !== undefined && v !== null
}
function isTrue (v) {
return v === true
}
function isFalse (v) {
return v === false
}
/**
* Check if value is primitive.
*/
function isPrimitive (value) {
return (
typeof value === 'string' ||
typeof value === 'number' ||
// $flow-disable-line
typeof value === 'symbol' ||
typeof value === 'boolean'
)
}
/**
* Quick object check - this is primarily used to tell
* Objects from primitive values when we know the value
* is a JSON-compliant type.
*/
function isObject (obj) {
return obj !== null && typeof obj === 'object'
}
/**
* Get the raw type string of a value, e.g., [object Object].
*/
var _toString = Object.prototype.toString;
function toRawType (value) {
return _toString.call(value).slice(8, -1)
}
/**
* Strict object type check. Only returns true
* for plain JavaScript objects.
*/
function isPlainObject (obj) {
return _toString.call(obj) === '[object Object]'
}
function isRegExp (v) {
return _toString.call(v) === '[object RegExp]'
}
/**
* Check if val is a valid array index.
*/
function isValidArrayIndex (val) {
var n = parseFloat(String(val));
return n >= 0 && Math.floor(n) === n && isFinite(val)
}
function isPromise (val) {
return (
isDef(val) &&
typeof val.then === 'function' &&
typeof val.catch === 'function'
)
}
/**
* Convert a value to a string that is actually rendered.
*/
function toString (val) {
return val == null
? ''
: Array.isArray(val) || (isPlainObject(val) && val.toString === _toString)
? JSON.stringify(val, null, 2)
: String(val)
}
/**
* Convert an input value to a number for persistence.
* If the conversion fails, return original string.
*/
function toNumber (val) {
var n = parseFloat(val);
return isNaN(n) ? val : n
}
/**
* Make a map and return a function for checking if a key
* is in that map.
*/
function makeMap (
str,
expectsLowerCase
) {
var map = Object.create(null);
var list = str.split(',');
for (var i = 0; i < list.length; i++) {
map[list[i]] = true;
}
return expectsLowerCase
? function (val) { return map[val.toLowerCase()]; }
: function (val) { return map[val]; }
}
/**
* Check if a tag is a built-in tag.
*/
var isBuiltInTag = makeMap('slot,component', true);
/**
* Check if an attribute is a reserved attribute.
*/
var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');
/**
* Remove an item from an array.
*/
function remove (arr, item) {
if (arr.length) {
var index = arr.indexOf(item);
if (index > -1) {
return arr.splice(index, 1)
}
}
}
/**
* Check whether an object has the property.
*/
var hasOwnProperty = Object.prototype.hasOwnProperty;
function hasOwn (obj, key) {
return hasOwnProperty.call(obj, key)
}
/**
* Create a cached version of a pure function.
*/
function cached (fn) {
var cache = Object.create(null);
return (function cachedFn (str) {
var hit = cache[str];
return hit || (cache[str] = fn(str))
})
}
/**
* Camelize a hyphen-delimited string.
*/
var camelizeRE = /-(\w)/g;
var camelize = cached(function (str) {
return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })
});
/**
* Capitalize a string.
*/
var capitalize = cached(function (str) {
return str.charAt(0).toUpperCase() + str.slice(1)
});
/**
* Hyphenate a camelCase string.
*/
var hyphenateRE = /\B([A-Z])/g;
var hyphenate = cached(function (str) {
return str.replace(hyphenateRE, '-$1').toLowerCase()
});
/**
* Simple bind polyfill for environments that do not support it,
* e.g., PhantomJS 1.x. Technically, we don't need this anymore
* since native bind is now performant enough in most browsers.
* But removing it would mean breaking code that was able to run in
* PhantomJS 1.x, so this must be kept for backward compatibility.
*/
/* istanbul ignore next */
function polyfillBind (fn, ctx) {
function boundFn (a) {
var l = arguments.length;
return l
? l > 1
? fn.apply(ctx, arguments)
: fn.call(ctx, a)
: fn.call(ctx)
}
boundFn._length = fn.length;
return boundFn
}
function nativeBind (fn, ctx) {
return fn.bind(ctx)
}
var bind = Function.prototype.bind
? nativeBind
: polyfillBind;
/**
* Convert an Array-like object to a real Array.
*/
function toArray (list, start) {
start = start || 0;
var i = list.length - start;
var ret = new Array(i);
while (i--) {
ret[i] = list[i + start];
}
return ret
}
/**
* Mix properties into target object.
*/
function extend (to, _from) {
for (var key in _from) {
to[key] = _from[key];
}
return to
}
/**
* Merge an Array of Objects into a single Object.
*/
function toObject (arr) {
var res = {};
for (var i = 0; i < arr.length; i++) {
if (arr[i]) {
extend(res, arr[i]);
}
}
return res
}
/* eslint-disable no-unused-vars */
/**
* Perform no operation.
* Stubbing args to make Flow happy without leaving useless transpiled code
* with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/).
*/
function noop (a, b, c) {}
/**
* Always return false.
*/
var no = function (a, b, c) { return false; };
/* eslint-enable no-unused-vars */
/**
* Return the same value.
*/
var identity = function (_) { return _; };
/**
* Check if two values are loosely equal - that is,
* if they are plain objects, do they have the same shape?
*/
function looseEqual (a, b) {
if (a === b) { return true }
var isObjectA = isObject(a);
var isObjectB = isObject(b);
if (isObjectA && isObjectB) {
try {
var isArrayA = Array.isArray(a);
var isArrayB = Array.isArray(b);
if (isArrayA && isArrayB) {
return a.length === b.length && a.every(function (e, i) {
return looseEqual(e, b[i])
})
} else if (a instanceof Date && b instanceof Date) {
return a.getTime() === b.getTime()
} else if (!isArrayA && !isArrayB) {
var keysA = Object.keys(a);
var keysB = Object.keys(b);
return keysA.length === keysB.length && keysA.every(function (key) {
return looseEqual(a[key], b[key])
})
} else {
/* istanbul ignore next */
return false
}
} catch (e) {
/* istanbul ignore next */
return false
}
} else if (!isObjectA && !isObjectB) {
return String(a) === String(b)
} else {
return false
}
}
/**
* Return the first index at which a loosely equal value can be
* found in the array (if value is a plain object, the array must
* contain an object of the same shape), or -1 if it is not present.
*/
function looseIndexOf (arr, val) {
for (var i = 0; i < arr.length; i++) {
if (looseEqual(arr[i], val)) { return i }
}
return -1
}
/**
* Ensure a function is called only once.
*/
function once (fn) {
var called = false;
return function () {
if (!called) {
called = true;
fn.apply(this, arguments);
}
}
}
var ASSET_TYPES = [
'component',
'directive',
'filter'
];
var LIFECYCLE_HOOKS = [
'beforeCreate',
'created',
'beforeMount',
'mounted',
'beforeUpdate',
'updated',
'beforeDestroy',
'destroyed',
'activated',
'deactivated',
'errorCaptured',
'serverPrefetch'
];
/* */
var config = ({
/**
* Option merge strategies (used in core/util/options)
*/
// $flow-disable-line
optionMergeStrategies: Object.create(null),
/**
* Whether to suppress warnings.
*/
silent: false,
/**
* Show production mode tip message on boot?
*/
productionTip: "development" !== 'production',
/**
* Whether to enable devtools
*/
devtools: "development" !== 'production',
/**
* Whether to record perf
*/
performance: false,
/**
* Error handler for watcher errors
*/
errorHandler: null,
/**
* Warn handler for watcher warns
*/
warnHandler: null,
/**
* Ignore certain custom elements
*/
ignoredElements: [],
/**
* Custom user key aliases for v-on
*/
// $flow-disable-line
keyCodes: Object.create(null),
/**
* Check if a tag is reserved so that it cannot be registered as a
* component. This is platform-dependent and may be overwritten.
*/
isReservedTag: no,
/**
* Check if an attribute is reserved so that it cannot be used as a component
* prop. This is platform-dependent and may be overwritten.
*/
isReservedAttr: no,
/**
* Check if a tag is an unknown element.
* Platform-dependent.
*/
isUnknownElement: no,
/**
* Get the namespace of an element
*/
getTagNamespace: noop,
/**
* Parse the real tag name for the specific platform.
*/
parsePlatformTagName: identity,
/**
* Check if an attribute must be bound using property, e.g. value
* Platform-dependent.
*/
mustUseProp: no,
/**
* Perform updates asynchronously. Intended to be used by Vue Test Utils
* This will significantly reduce performance if set to false.
*/
async: true,
/**
* Exposed for legacy reasons
*/
_lifecycleHooks: LIFECYCLE_HOOKS
});
/* */
/**
* unicode letters used for parsing html tags, component names and property paths.
* using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname
* skipping \u10000-\uEFFFF due to it freezing up PhantomJS
*/
var unicodeRegExp = /a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/;
/**
* Check if a string starts with $ or _
*/
function isReserved (str) {
var c = (str + '').charCodeAt(0);
return c === 0x24 || c === 0x5F
}
/**
* Define a property.
*/
function def (obj, key, val, enumerable) {
Object.defineProperty(obj, key, {
value: val,
enumerable: !!enumerable,
writable: true,
configurable: true
});
}
/**
* Parse simple path.
*/
var bailRE = new RegExp(("[^" + (unicodeRegExp.source) + ".$_\\d]"));
function parsePath (path) {
if (bailRE.test(path)) {
return
}
var segments = path.split('.');
return function (obj) {
for (var i = 0; i < segments.length; i++) {
if (!obj) { return }
obj = obj[segments[i]];
}
return obj
}
}
/* */
// can we use __proto__?
var hasProto = '__proto__' in {};
// Browser environment sniffing
var inBrowser = typeof window !== 'undefined';
var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;
var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();
var UA = inBrowser && window.navigator.userAgent.toLowerCase();
var isIE = UA && /msie|trident/.test(UA);
var isIE9 = UA && UA.indexOf('msie 9.0') > 0;
var isEdge = UA && UA.indexOf('edge/') > 0;
var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');
var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');
var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge;
var isPhantomJS = UA && /phantomjs/.test(UA);
var isFF = UA && UA.match(/firefox\/(\d+)/);
// Firefox has a "watch" function on Object.prototype...
var nativeWatch = ({}).watch;
if (inBrowser) {
try {
var opts = {};
Object.defineProperty(opts, 'passive', ({
get: function get () {
}
})); // https://github.com/facebook/flow/issues/285
window.addEventListener('test-passive', null, opts);
} catch (e) {}
}
// this needs to be lazy-evaled because vue may be required before
// vue-server-renderer can set VUE_ENV
var _isServer;
var isServerRendering = function () {
if (_isServer === undefined) {
/* istanbul ignore if */
if (!inBrowser && !inWeex && typeof global !== 'undefined') {
// detect presence of vue-server-renderer and avoid
// Webpack shimming the process
_isServer = global['process'] && global['process'].env.VUE_ENV === 'server';
} else {
_isServer = false;
}
}
return _isServer
};
// detect devtools
var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
/* istanbul ignore next */
function isNative (Ctor) {
return typeof Ctor === 'function' && /native code/.test(Ctor.toString())
}
var hasSymbol =
typeof Symbol !== 'undefined' && isNative(Symbol) &&
typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);
var _Set;
/* istanbul ignore if */ // $flow-disable-line
if (typeof Set !== 'undefined' && isNative(Set)) {
// use native Set when available.
_Set = Set;
} else {
// a non-standard Set polyfill that only works with primitive keys.
_Set = /*@__PURE__*/(function () {
function Set () {
this.set = Object.create(null);
}
Set.prototype.has = function has (key) {
return this.set[key] === true
};
Set.prototype.add = function add (key) {
this.set[key] = true;
};
Set.prototype.clear = function clear () {
this.set = Object.create(null);
};
return Set;
}());
}
/* */
var warn = noop;
var tip = noop;
var generateComponentTrace = (noop); // work around flow check
var formatComponentName = (noop);
if (true) {
var hasConsole = typeof console !== 'undefined';
var classifyRE = /(?:^|[-_])(\w)/g;
var classify = function (str) { return str
.replace(classifyRE, function (c) { return c.toUpperCase(); })
.replace(/[-_]/g, ''); };
warn = function (msg, vm) {
var trace = vm ? generateComponentTrace(vm) : '';
if (config.warnHandler) {
config.warnHandler.call(null, msg, vm, trace);
} else if (hasConsole && (!config.silent)) {
console.error(("[Vue warn]: " + msg + trace));
}
};
tip = function (msg, vm) {
if (hasConsole && (!config.silent)) {
console.warn("[Vue tip]: " + msg + (
vm ? generateComponentTrace(vm) : ''
));
}
};
formatComponentName = function (vm, includeFile) {
if (vm.$root === vm) {
if (vm.$options && vm.$options.__file) { // fixed by xxxxxx
return ('') + vm.$options.__file
}
return '<Root>'
}
var options = typeof vm === 'function' && vm.cid != null
? vm.options
: vm._isVue
? vm.$options || vm.constructor.options
: vm;
var name = options.name || options._componentTag;
var file = options.__file;
if (!name && file) {
var match = file.match(/([^/\\]+)\.vue$/);
name = match && match[1];
}
return (
(name ? ("<" + (classify(name)) + ">") : "<Anonymous>") +
(file && includeFile !== false ? (" at " + file) : '')
)
};
var repeat = function (str, n) {
var res = '';
while (n) {
if (n % 2 === 1) { res += str; }
if (n > 1) { str += str; }
n >>= 1;
}
return res
};
generateComponentTrace = function (vm) {
if (vm._isVue && vm.$parent) {
var tree = [];
var currentRecursiveSequence = 0;
while (vm && vm.$options.name !== 'PageBody') {
if (tree.length > 0) {
var last = tree[tree.length - 1];
if (last.constructor === vm.constructor) {
currentRecursiveSequence++;
vm = vm.$parent;
continue
} else if (currentRecursiveSequence > 0) {
tree[tree.length - 1] = [last, currentRecursiveSequence];
currentRecursiveSequence = 0;
}
}
!vm.$options.isReserved && tree.push(vm);
vm = vm.$parent;
}
return '\n\nfound in\n\n' + tree
.map(function (vm, i) { return ("" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)
? ((formatComponentName(vm[0])) + "... (" + (vm[1]) + " recursive calls)")
: formatComponentName(vm))); })
.join('\n')
} else {
return ("\n\n(found in " + (formatComponentName(vm)) + ")")
}
};
}
/* */
var uid = 0;
/**
* A dep is an observable that can have multiple
* directives subscribing to it.
*/
var Dep = function Dep () {
this.id = uid++;
this.subs = [];
};
Dep.prototype.addSub = function addSub (sub) {
this.subs.push(sub);
};
Dep.prototype.removeSub = function removeSub (sub) {
remove(this.subs, sub);
};
Dep.prototype.depend = function depend () {
if (Dep.SharedObject.target) {
Dep.SharedObject.target.addDep(this);
}
};
Dep.prototype.notify = function notify () {
// stabilize the subscriber list first
var subs = this.subs.slice();
if ( true && !config.async) {
// subs aren't sorted in scheduler if not running async
// we need to sort them now to make sure they fire in correct
// order
subs.sort(function (a, b) { return a.id - b.id; });
}
for (var i = 0, l = subs.length; i < l; i++) {
subs[i].update();
}
};
// The current target watcher being evaluated.
// This is globally unique because only one watcher
// can be evaluated at a time.
// fixed by xxxxxx (nvue shared vuex)
/* eslint-disable no-undef */
Dep.SharedObject = {};
Dep.SharedObject.target = null;
Dep.SharedObject.targetStack = [];
function pushTarget (target) {
Dep.SharedObject.targetStack.push(target);
Dep.SharedObject.target = target;
Dep.target = target;
}
function popTarget () {
Dep.SharedObject.targetStack.pop();
Dep.SharedObject.target = Dep.SharedObject.targetStack[Dep.SharedObject.targetStack.length - 1];
Dep.target = Dep.SharedObject.target;
}
/* */
var VNode = function VNode (
tag,
data,
children,
text,
elm,
context,
componentOptions,
asyncFactory
) {
this.tag = tag;
this.data = data;
this.children = children;
this.text = text;
this.elm = elm;
this.ns = undefined;
this.context = context;
this.fnContext = undefined;
this.fnOptions = undefined;
this.fnScopeId = undefined;
this.key = data && data.key;
this.componentOptions = componentOptions;
this.componentInstance = undefined;
this.parent = undefined;
this.raw = false;
this.isStatic = false;
this.isRootInsert = true;
this.isComment = false;
this.isCloned = false;
this.isOnce = false;
this.asyncFactory = asyncFactory;
this.asyncMeta = undefined;
this.isAsyncPlaceholder = false;
};
var prototypeAccessors = { child: { configurable: true } };
// DEPRECATED: alias for componentInstance for backwards compat.
/* istanbul ignore next */
prototypeAccessors.child.get = function () {
return this.componentInstance
};
Object.defineProperties( VNode.prototype, prototypeAccessors );
var createEmptyVNode = function (text) {
if ( text === void 0 ) text = '';
var node = new VNode();
node.text = text;
node.isComment = true;
return node
};
function createTextVNode (val) {
return new VNode(undefined, undefined, undefined, String(val))
}
// optimized shallow clone
// used for static nodes and slot nodes because they may be reused across
// multiple renders, cloning them avoids errors when DOM manipulations rely
// on their elm reference.
function cloneVNode (vnode) {
var cloned = new VNode(
vnode.tag,
vnode.data,
// #7975
// clone children array to avoid mutating original in case of cloning
// a child.
vnode.children && vnode.children.slice(),
vnode.text,
vnode.elm,
vnode.context,
vnode.componentOptions,
vnode.asyncFactory
);
cloned.ns = vnode.ns;
cloned.isStatic = vnode.isStatic;
cloned.key = vnode.key;
cloned.isComment = vnode.isComment;
cloned.fnContext = vnode.fnContext;
cloned.fnOptions = vnode.fnOptions;
cloned.fnScopeId = vnode.fnScopeId;
cloned.asyncMeta = vnode.asyncMeta;
cloned.isCloned = true;
return cloned
}
/*
* not type checking this file because flow doesn't play well with
* dynamically accessing methods on Array prototype
*/
var arrayProto = Array.prototype;
var arrayMethods = Object.create(arrayProto);
var methodsToPatch = [
'push',
'pop',
'shift',
'unshift',
'splice',
'sort',
'reverse'
];
/**
* Intercept mutating methods and emit events
*/
methodsToPatch.forEach(function (method) {
// cache original method
var original = arrayProto[method];
def(arrayMethods, method, function mutator () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
var result = original.apply(this, args);
var ob = this.__ob__;
var inserted;
switch (method) {
case 'push':
case 'unshift':
inserted = args;
break
case 'splice':
inserted = args.slice(2);
break
}
if (inserted) { ob.observeArray(inserted); }
// notify change
ob.dep.notify();
return result
});
});
/* */
var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
/**
* In some cases we may want to disable observation inside a component's
* update computation.
*/
var shouldObserve = true;
function toggleObserving (value) {
shouldObserve = value;
}
/**
* Observer class that is attached to each observed
* object. Once attached, the observer converts the target
* object's property keys into getter/setters that
* collect dependencies and dispatch updates.
*/
var Observer = function Observer (value) {
this.value = value;
this.dep = new Dep();
this.vmCount = 0;
def(value, '__ob__', this);
if (Array.isArray(value)) {
if (hasProto) {
{// fixed by xxxxxx 微信小程序使用 plugins 之后,数组方法被直接挂载到了数组对象上,需要执行 copyAugment 逻辑
if(value.push !== value.__proto__.push){
copyAugment(value, arrayMethods, arrayKeys);
} else {
protoAugment(value, arrayMethods);
}
}
} else {
copyAugment(value, arrayMethods, arrayKeys);
}
this.observeArray(value);
} else {
this.walk(value);
}
};
/**
* Walk through all properties and convert them into
* getter/setters. This method should only be called when
* value type is Object.
*/
Observer.prototype.walk = function walk (obj) {
var keys = Object.keys(obj);
for (var i = 0; i < keys.length; i++) {
defineReactive$$1(obj, keys[i]);
}
};
/**
* Observe a list of Array items.
*/
Observer.prototype.observeArray = function observeArray (items) {
for (var i = 0, l = items.length; i < l; i++) {
observe(items[i]);
}
};
// helpers
/**
* Augment a target Object or Array by intercepting
* the prototype chain using __proto__
*/
function protoAugment (target, src) {
/* eslint-disable no-proto */
target.__proto__ = src;
/* eslint-enable no-proto */
}
/**
* Augment a target Object or Array by defining
* hidden properties.
*/
/* istanbul ignore next */
function copyAugment (target, src, keys) {
for (var i = 0, l = keys.length; i < l; i++) {
var key = keys[i];
def(target, key, src[key]);
}
}
/**
* Attempt to create an observer instance for a value,
* returns the new observer if successfully observed,
* or the existing observer if the value already has one.
*/
function observe (value, asRootData) {
if (!isObject(value) || value instanceof VNode) {
return
}
var ob;
if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
ob = value.__ob__;
} else if (
shouldObserve &&
!isServerRendering() &&
(Array.isArray(value) || isPlainObject(value)) &&
Object.isExtensible(value) &&
!value._isVue &&
!value.__v_isMPComponent
) {
ob = new Observer(value);
}
if (asRootData && ob) {
ob.vmCount++;
}
return ob
}
/**
* Define a reactive property on an Object.
*/
function defineReactive$$1 (
obj,
key,
val,
customSetter,
shallow
) {
var dep = new Dep();
var property = Object.getOwnPropertyDescriptor(obj, key);
if (property && property.configurable === false) {
return
}
// cater for pre-defined getter/setters
var getter = property && property.get;
var setter = property && property.set;
if ((!getter || setter) && arguments.length === 2) {
val = obj[key];
}
var childOb = !shallow && observe(val);
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: function reactiveGetter () {
var value = getter ? getter.call(obj) : val;
if (Dep.SharedObject.target) { // fixed by xxxxxx
dep.depend();
if (childOb) {
childOb.dep.depend();
if (Array.isArray(value)) {
dependArray(value);
}
}
}
return value
},
set: function reactiveSetter (newVal) {
var value = getter ? getter.call(obj) : val;
/* eslint-disable no-self-compare */
if (newVal === value || (newVal !== newVal && value !== value)) {
return
}
/* eslint-enable no-self-compare */
if ( true && customSetter) {
customSetter();
}
// #7981: for accessor properties without setter
if (getter && !setter) { return }
if (setter) {
setter.call(obj, newVal);
} else {
val = newVal;
}
childOb = !shallow && observe(newVal);
dep.notify();
}
});
}
/**
* Set a property on an object. Adds the new property and
* triggers change notification if the property doesn't
* already exist.
*/
function set (target, key, val) {
if ( true &&
(isUndef(target) || isPrimitive(target))
) {
warn(("Cannot set reactive property on undefined, null, or primitive value: " + ((target))));
}
if (Array.isArray(target) && isValidArrayIndex(key)) {
target.length = Math.max(target.length, key);
target.splice(key, 1, val);
return val
}
if (key in target && !(key in Object.prototype)) {
target[key] = val;
return val
}
var ob = (target).__ob__;
if (target._isVue || (ob && ob.vmCount)) {
true && warn(
'Avoid adding reactive properties to a Vue instance or its root $data ' +
'at runtime - declare it upfront in the data option.'
);
return val
}
if (!ob) {
target[key] = val;
return val
}
defineReactive$$1(ob.value, key, val);
ob.dep.notify();
return val
}
/**
* Delete a property and trigger change if necessary.
*/
function del (target, key) {
if ( true &&
(isUndef(target) || isPrimitive(target))
) {
warn(("Cannot delete reactive property on undefined, null, or primitive value: " + ((target))));
}
if (Array.isArray(target) && isValidArrayIndex(key)) {
target.splice(key, 1);
return
}
var ob = (target).__ob__;
if (target._isVue || (ob && ob.vmCount)) {
true && warn(
'Avoid deleting properties on a Vue instance or its root $data ' +
'- just set it to null.'
);
return
}
if (!hasOwn(target, key)) {
return
}
delete target[key];
if (!ob) {
return
}
ob.dep.notify();
}
/**
* Collect dependencies on array elements when the array is touched, since
* we cannot intercept array element access like property getters.
*/
function dependArray (value) {
for (var e = (void 0), i = 0, l = value.length; i < l; i++) {
e = value[i];
e && e.__ob__ && e.__ob__.dep.depend();
if (Array.isArray(e)) {
dependArray(e);
}
}
}
/* */
/**
* Option overwriting strategies are functions that handle
* how to merge a parent option value and a child option
* value into the final value.
*/
var strats = config.optionMergeStrategies;
/**
* Options with restrictions
*/
if (true) {
strats.el = strats.propsData = function (parent, child, vm, key) {
if (!vm) {
warn(
"option \"" + key + "\" can only be used during instance " +
'creation with the `new` keyword.'
);
}
return defaultStrat(parent, child)
};
}
/**
* Helper that recursively merges two data objects together.
*/
function mergeData (to, from) {
if (!from) { return to }
var key, toVal, fromVal;
var keys = hasSymbol
? Reflect.ownKeys(from)
: Object.keys(from);
for (var i = 0; i < keys.length; i++) {
key = keys[i];
// in case the object is already observed...
if (key === '__ob__') { continue }
toVal = to[key];
fromVal = from[key];
if (!hasOwn(to, key)) {
set(to, key, fromVal);
} else if (
toVal !== fromVal &&
isPlainObject(toVal) &&
isPlainObject(fromVal)
) {
mergeData(toVal, fromVal);
}
}
return to
}
/**
* Data
*/
function mergeDataOrFn (
parentVal,
childVal,
vm
) {
if (!vm) {
// in a Vue.extend merge, both should be functions
if (!childVal) {
return parentVal
}
if (!parentVal) {
return childVal
}
// when parentVal & childVal are both present,
// we need to return a function that returns the
// merged result of both functions... no need to
// check if parentVal is a function here because
// it has to be a function to pass previous merges.
return function mergedDataFn () {
return mergeData(
typeof childVal === 'function' ? childVal.call(this, this) : childVal,
typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal
)
}
} else {
return function mergedInstanceDataFn () {
// instance merge
var instanceData = typeof childVal === 'function'
? childVal.call(vm, vm)
: childVal;
var defaultData = typeof parentVal === 'function'
? parentVal.call(vm, vm)
: parentVal;
if (instanceData) {
return mergeData(instanceData, defaultData)
} else {
return defaultData
}
}
}
}
strats.data = function (
parentVal,
childVal,
vm
) {
if (!vm) {
if (childVal && typeof childVal !== 'function') {
true && warn(
'The "data" option should be a function ' +
'that returns a per-instance value in component ' +
'definitions.',
vm
);
return parentVal
}
return mergeDataOrFn(parentVal, childVal)
}
return mergeDataOrFn(parentVal, childVal, vm)
};
/**
* Hooks and props are merged as arrays.
*/
function mergeHook (
parentVal,
childVal
) {
var res = childVal
? parentVal
? parentVal.concat(childVal)
: Array.isArray(childVal)
? childVal
: [childVal]
: parentVal;
return res
? dedupeHooks(res)
: res
}
function dedupeHooks (hooks) {
var res = [];
for (var i = 0; i < hooks.length; i++) {
if (res.indexOf(hooks[i]) === -1) {
res.push(hooks[i]);
}
}
return res
}
LIFECYCLE_HOOKS.forEach(function (hook) {
strats[hook] = mergeHook;
});
/**
* Assets
*
* When a vm is present (instance creation), we need to do
* a three-way merge between constructor options, instance
* options and parent options.
*/
function mergeAssets (
parentVal,
childVal,
vm,
key
) {
var res = Object.create(parentVal || null);
if (childVal) {
true && assertObjectType(key, childVal, vm);
return extend(res, childVal)
} else {
return res
}
}
ASSET_TYPES.forEach(function (type) {
strats[type + 's'] = mergeAssets;
});
/**
* Watchers.
*
* Watchers hashes should not overwrite one
* another, so we merge them as arrays.
*/
strats.watch = function (
parentVal,
childVal,
vm,
key
) {
// work around Firefox's Object.prototype.watch...
if (parentVal === nativeWatch) { parentVal = undefined; }
if (childVal === nativeWatch) { childVal = undefined; }
/* istanbul ignore if */
if (!childVal) { return Object.create(parentVal || null) }
if (true) {
assertObjectType(key, childVal, vm);
}
if (!parentVal) { return childVal }
var ret = {};
extend(ret, parentVal);
for (var key$1 in childVal) {
var parent = ret[key$1];
var child = childVal[key$1];
if (parent && !Array.isArray(parent)) {
parent = [parent];
}
ret[key$1] = parent
? parent.concat(child)
: Array.isArray(child) ? child : [child];
}
return ret
};
/**
* Other object hashes.
*/
strats.props =
strats.methods =
strats.inject =
strats.computed = function (
parentVal,
childVal,
vm,
key
) {
if (childVal && "development" !== 'production') {
assertObjectType(key, childVal, vm);
}
if (!parentVal) { return childVal }
var ret = Object.create(null);
extend(ret, parentVal);
if (childVal) { extend(ret, childVal); }
return ret
};
strats.provide = mergeDataOrFn;
/**
* Default strategy.
*/
var defaultStrat = function (parentVal, childVal) {
return childVal === undefined
? parentVal
: childVal
};
/**
* Validate component names
*/
function checkComponents (options) {
for (var key in options.components) {
validateComponentName(key);
}
}
function validateComponentName (name) {
if (!new RegExp(("^[a-zA-Z][\\-\\.0-9_" + (unicodeRegExp.source) + "]*$")).test(name)) {
warn(
'Invalid component name: "' + name + '". Component names ' +
'should conform to valid custom element name in html5 specification.'
);
}
if (isBuiltInTag(name) || config.isReservedTag(name)) {
warn(
'Do not use built-in or reserved HTML elements as component ' +
'id: ' + name
);
}
}
/**
* Ensure all props option syntax are normalized into the
* Object-based format.
*/
function normalizeProps (options, vm) {
var props = options.props;
if (!props) { return }
var res = {};
var i, val, name;
if (Array.isArray(props)) {
i = props.length;
while (i--) {
val = props[i];
if (typeof val === 'string') {
name = camelize(val);
res[name] = { type: null };
} else if (true) {
warn('props must be strings when using array syntax.');
}
}
} else if (isPlainObject(props)) {
for (var key in props) {
val = props[key];
name = camelize(key);
res[name] = isPlainObject(val)
? val
: { type: val };
}
} else if (true) {
warn(
"Invalid value for option \"props\": expected an Array or an Object, " +
"but got " + (toRawType(props)) + ".",
vm
);
}
options.props = res;
}
/**
* Normalize all injections into Object-based format
*/
function normalizeInject (options, vm) {
var inject = options.inject;
if (!inject) { return }
var normalized = options.inject = {};
if (Array.isArray(inject)) {
for (var i = 0; i < inject.length; i++) {
normalized[inject[i]] = { from: inject[i] };
}
} else if (isPlainObject(inject)) {
for (var key in inject) {
var val = inject[key];
normalized[key] = isPlainObject(val)
? extend({ from: key }, val)
: { from: val };
}
} else if (true) {
warn(
"Invalid value for option \"inject\": expected an Array or an Object, " +
"but got " + (toRawType(inject)) + ".",
vm
);
}
}
/**
* Normalize raw function directives into object format.
*/
function normalizeDirectives (options) {
var dirs = options.directives;
if (dirs) {
for (var key in dirs) {
var def$$1 = dirs[key];
if (typeof def$$1 === 'function') {
dirs[key] = { bind: def$$1, update: def$$1 };
}
}
}
}
function assertObjectType (name, value, vm) {
if (!isPlainObject(value)) {
warn(
"Invalid value for option \"" + name + "\": expected an Object, " +
"but got " + (toRawType(value)) + ".",
vm
);
}
}
/**
* Merge two option objects into a new one.
* Core utility used in both instantiation and inheritance.
*/
function mergeOptions (
parent,
child,
vm
) {
if (true) {
checkComponents(child);
}
if (typeof child === 'function') {
child = child.options;
}
normalizeProps(child, vm);
normalizeInject(child, vm);
normalizeDirectives(child);
// Apply extends and mixins on the child options,
// but only if it is a raw options object that isn't
// the result of another mergeOptions call.
// Only merged options has the _base property.
if (!child._base) {
if (child.extends) {
parent = mergeOptions(parent, child.extends, vm);
}
if (child.mixins) {
for (var i = 0, l = child.mixins.length; i < l; i++) {
parent = mergeOptions(parent, child.mixins[i], vm);
}
}
}
var options = {};
var key;
for (key in parent) {
mergeField(key);
}
for (key in child) {
if (!hasOwn(parent, key)) {
mergeField(key);
}
}
function mergeField (key) {
var strat = strats[key] || defaultStrat;
options[key] = strat(parent[key], child[key], vm, key);
}
return options
}
/**
* Resolve an asset.
* This function is used because child instances need access
* to assets defined in its ancestor chain.
*/
function resolveAsset (
options,
type,
id,
warnMissing
) {
/* istanbul ignore if */
if (typeof id !== 'string') {
return
}
var assets = options[type];
// check local registration variations first
if (hasOwn(assets, id)) { return assets[id] }
var camelizedId = camelize(id);
if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }
var PascalCaseId = capitalize(camelizedId);
if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }
// fallback to prototype chain
var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];
if ( true && warnMissing && !res) {
warn(
'Failed to resolve ' + type.slice(0, -1) + ': ' + id,
options
);
}
return res
}
/* */
function validateProp (
key,
propOptions,
propsData,
vm
) {
var prop = propOptions[key];
var absent = !hasOwn(propsData, key);
var value = propsData[key];
// boolean casting
var booleanIndex = getTypeIndex(Boolean, prop.type);
if (booleanIndex > -1) {
if (absent && !hasOwn(prop, 'default')) {
value = false;
} else if (value === '' || value === hyphenate(key)) {
// only cast empty string / same name to boolean if
// boolean has higher priority
var stringIndex = getTypeIndex(String, prop.type);
if (stringIndex < 0 || booleanIndex < stringIndex) {
value = true;
}
}
}
// check default value
if (value === undefined) {
value = getPropDefaultValue(vm, prop, key);
// since the default value is a fresh copy,
// make sure to observe it.
var prevShouldObserve = shouldObserve;
toggleObserving(true);
observe(value);
toggleObserving(prevShouldObserve);
}
if (
true
) {
assertProp(prop, key, value, vm, absent);
}
return value
}
/**
* Get the default value of a prop.
*/
function getPropDefaultValue (vm, prop, key) {
// no default, return undefined
if (!hasOwn(prop, 'default')) {
return undefined
}
var def = prop.default;
// warn against non-factory defaults for Object & Array
if ( true && isObject(def)) {
warn(
'Invalid default value for prop "' + key + '": ' +
'Props with type Object/Array must use a factory function ' +
'to return the default value.',
vm
);
}
// the raw prop value was also undefined from previous render,
// return previous default value to avoid unnecessary watcher trigger
if (vm && vm.$options.propsData &&
vm.$options.propsData[key] === undefined &&
vm._props[key] !== undefined
) {
return vm._props[key]
}
// call factory function for non-Function types
// a value is Function if its prototype is function even across different execution context
return typeof def === 'function' && getType(prop.type) !== 'Function'
? def.call(vm)
: def
}
/**
* Assert whether a prop is valid.
*/
function assertProp (
prop,
name,
value,
vm,
absent
) {
if (prop.required && absent) {
warn(
'Missing required prop: "' + name + '"',
vm
);
return
}
if (value == null && !prop.required) {
return
}
var type = prop.type;
var valid = !type || type === true;
var expectedTypes = [];
if (type) {
if (!Array.isArray(type)) {
type = [type];
}
for (var i = 0; i < type.length && !valid; i++) {
var assertedType = assertType(value, type[i]);
expectedTypes.push(assertedType.expectedType || '');
valid = assertedType.valid;
}
}
if (!valid) {
warn(
getInvalidTypeMessage(name, value, expectedTypes),
vm
);
return
}
var validator = prop.validator;
if (validator) {
if (!validator(value)) {
warn(
'Invalid prop: custom validator check failed for prop "' + name + '".',
vm
);
}
}
}
var simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;
function assertType (value, type) {
var valid;
var expectedType = getType(type);
if (simpleCheckRE.test(expectedType)) {
var t = typeof value;
valid = t === expectedType.toLowerCase();
// for primitive wrapper objects
if (!valid && t === 'object') {
valid = value instanceof type;
}
} else if (expectedType === 'Object') {
valid = isPlainObject(value);
} else if (expectedType === 'Array') {
valid = Array.isArray(value);
} else {
valid = value instanceof type;
}
return {
valid: valid,
expectedType: expectedType
}
}
/**
* Use function string name to check built-in types,
* because a simple equality check will fail when running
* across different vms / iframes.
*/
function getType (fn) {
var match = fn && fn.toString().match(/^\s*function (\w+)/);
return match ? match[1] : ''
}
function isSameType (a, b) {
return getType(a) === getType(b)
}
function getTypeIndex (type, expectedTypes) {
if (!Array.isArray(expectedTypes)) {
return isSameType(expectedTypes, type) ? 0 : -1
}
for (var i = 0, len = expectedTypes.length; i < len; i++) {
if (isSameType(expectedTypes[i], type)) {
return i
}
}
return -1
}
function getInvalidTypeMessage (name, value, expectedTypes) {
var message = "Invalid prop: type check failed for prop \"" + name + "\"." +
" Expected " + (expectedTypes.map(capitalize).join(', '));
var expectedType = expectedTypes[0];
var receivedType = toRawType(value);
var expectedValue = styleValue(value, expectedType);
var receivedValue = styleValue(value, receivedType);
// check if we need to specify expected value
if (expectedTypes.length === 1 &&
isExplicable(expectedType) &&
!isBoolean(expectedType, receivedType)) {
message += " with value " + expectedValue;
}
message += ", got " + receivedType + " ";
// check if we need to specify received value
if (isExplicable(receivedType)) {
message += "with value " + receivedValue + ".";
}
return message
}
function styleValue (value, type) {
if (type === 'String') {
return ("\"" + value + "\"")
} else if (type === 'Number') {
return ("" + (Number(value)))
} else {
return ("" + value)
}
}
function isExplicable (value) {
var explicitTypes = ['string', 'number', 'boolean'];
return explicitTypes.some(function (elem) { return value.toLowerCase() === elem; })
}
function isBoolean () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
return args.some(function (elem) { return elem.toLowerCase() === 'boolean'; })
}
/* */
function handleError (err, vm, info) {
// Deactivate deps tracking while processing error handler to avoid possible infinite rendering.
// See: https://github.com/vuejs/vuex/issues/1505
pushTarget();
try {
if (vm) {
var cur = vm;
while ((cur = cur.$parent)) {
var hooks = cur.$options.errorCaptured;
if (hooks) {
for (var i = 0; i < hooks.length; i++) {
try {
var capture = hooks[i].call(cur, err, vm, info) === false;
if (capture) { return }
} catch (e) {
globalHandleError(e, cur, 'errorCaptured hook');
}
}
}
}
}
globalHandleError(err, vm, info);
} finally {
popTarget();
}
}
function invokeWithErrorHandling (
handler,
context,
args,
vm,
info
) {
var res;
try {
res = args ? handler.apply(context, args) : handler.call(context);
if (res && !res._isVue && isPromise(res) && !res._handled) {
res.catch(function (e) { return handleError(e, vm, info + " (Promise/async)"); });
// issue #9511
// avoid catch triggering multiple times when nested calls
res._handled = true;
}
} catch (e) {
handleError(e, vm, info);
}
return res
}
function globalHandleError (err, vm, info) {
if (config.errorHandler) {
try {
return config.errorHandler.call(null, err, vm, info)
} catch (e) {
// if the user intentionally throws the original error in the handler,
// do not log it twice
if (e !== err) {
logError(e, null, 'config.errorHandler');
}
}
}
logError(err, vm, info);
}
function logError (err, vm, info) {
if (true) {
warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);
}
/* istanbul ignore else */
if ((inBrowser || inWeex) && typeof console !== 'undefined') {
console.error(err);
} else {
throw err
}
}
/* */
var callbacks = [];
var pending = false;
function flushCallbacks () {
pending = false;
var copies = callbacks.slice(0);
callbacks.length = 0;
for (var i = 0; i < copies.length; i++) {
copies[i]();
}
}
// Here we have async deferring wrappers using microtasks.
// In 2.5 we used (macro) tasks (in combination with microtasks).
// However, it has subtle problems when state is changed right before repaint
// (e.g. #6813, out-in transitions).
// Also, using (macro) tasks in event handler would cause some weird behaviors
// that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109).
// So we now use microtasks everywhere, again.
// A major drawback of this tradeoff is that there are some scenarios
// where microtasks have too high a priority and fire in between supposedly
// sequential events (e.g. #4521, #6690, which have workarounds)
// or even between bubbling of the same event (#6566).
var timerFunc;
// The nextTick behavior leverages the microtask queue, which can be accessed
// via either native Promise.then or MutationObserver.
// MutationObserver has wider support, however it is seriously bugged in
// UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It
// completely stops working after triggering a few times... so, if native
// Promise is available, we will use it:
/* istanbul ignore next, $flow-disable-line */
if (typeof Promise !== 'undefined' && isNative(Promise)) {
var p = Promise.resolve();
timerFunc = function () {
p.then(flushCallbacks);
// In problematic UIWebViews, Promise.then doesn't completely break, but
// it can get stuck in a weird state where callbacks are pushed into the
// microtask queue but the queue isn't being flushed, until the browser
// needs to do some other work, e.g. handle a timer. Therefore we can
// "force" the microtask queue to be flushed by adding an empty timer.
if (isIOS) { setTimeout(noop); }
};
} else if (!isIE && typeof MutationObserver !== 'undefined' && (
isNative(MutationObserver) ||
// PhantomJS and iOS 7.x
MutationObserver.toString() === '[object MutationObserverConstructor]'
)) {
// Use MutationObserver where native Promise is not available,
// e.g. PhantomJS, iOS7, Android 4.4
// (#6466 MutationObserver is unreliable in IE11)
var counter = 1;
var observer = new MutationObserver(flushCallbacks);
var textNode = document.createTextNode(String(counter));
observer.observe(textNode, {
characterData: true
});
timerFunc = function () {
counter = (counter + 1) % 2;
textNode.data = String(counter);
};
} else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
// Fallback to setImmediate.
// Technically it leverages the (macro) task queue,
// but it is still a better choice than setTimeout.
timerFunc = function () {
setImmediate(flushCallbacks);
};
} else {
// Fallback to setTimeout.
timerFunc = function () {
setTimeout(flushCallbacks, 0);
};
}
function nextTick (cb, ctx) {
var _resolve;
callbacks.push(function () {
if (cb) {
try {
cb.call(ctx);
} catch (e) {
handleError(e, ctx, 'nextTick');
}
} else if (_resolve) {
_resolve(ctx);
}
});
if (!pending) {
pending = true;
timerFunc();
}
// $flow-disable-line
if (!cb && typeof Promise !== 'undefined') {
return new Promise(function (resolve) {
_resolve = resolve;
})
}
}
/* */
/* not type checking this file because flow doesn't play well with Proxy */
var initProxy;
if (true) {
var allowedGlobals = makeMap(
'Infinity,undefined,NaN,isFinite,isNaN,' +
'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +
'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +
'require' // for Webpack/Browserify
);
var warnNonPresent = function (target, key) {
warn(
"Property or method \"" + key + "\" is not defined on the instance but " +
'referenced during render. Make sure that this property is reactive, ' +
'either in the data option, or for class-based components, by ' +
'initializing the property. ' +
'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',
target
);
};
var warnReservedPrefix = function (target, key) {
warn(
"Property \"" + key + "\" must be accessed with \"$data." + key + "\" because " +
'properties starting with "$" or "_" are not proxied in the Vue instance to ' +
'prevent conflicts with Vue internals. ' +
'See: https://vuejs.org/v2/api/#data',
target
);
};
var hasProxy =
typeof Proxy !== 'undefined' && isNative(Proxy);
if (hasProxy) {
var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');
config.keyCodes = new Proxy(config.keyCodes, {
set: function set (target, key, value) {
if (isBuiltInModifier(key)) {
warn(("Avoid overwriting built-in modifier in config.keyCodes: ." + key));
return false
} else {
target[key] = value;
return true
}
}
});
}
var hasHandler = {
has: function has (target, key) {
var has = key in target;
var isAllowed = allowedGlobals(key) ||
(typeof key === 'string' && key.charAt(0) === '_' && !(key in target.$data));
if (!has && !isAllowed) {
if (key in target.$data) { warnReservedPrefix(target, key); }
else { warnNonPresent(target, key); }
}
return has || !isAllowed
}
};
var getHandler = {
get: function get (target, key) {
if (typeof key === 'string' && !(key in target)) {
if (key in target.$data) { warnReservedPrefix(target, key); }
else { warnNonPresent(target, key); }
}
return target[key]
}
};
initProxy = function initProxy (vm) {
if (hasProxy) {
// determine which proxy handler to use
var options = vm.$options;
var handlers = options.render && options.render._withStripped
? getHandler
: hasHandler;
vm._renderProxy = new Proxy(vm, handlers);
} else {
vm._renderProxy = vm;
}
};
}
/* */
var seenObjects = new _Set();
/**
* Recursively traverse an object to evoke all converted
* getters, so that every nested property inside the object
* is collected as a "deep" dependency.
*/
function traverse (val) {
_traverse(val, seenObjects);
seenObjects.clear();
}
function _traverse (val, seen) {
var i, keys;
var isA = Array.isArray(val);
if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {
return
}
if (val.__ob__) {
var depId = val.__ob__.dep.id;
if (seen.has(depId)) {
return
}
seen.add(depId);
}
if (isA) {
i = val.length;
while (i--) { _traverse(val[i], seen); }
} else {
keys = Object.keys(val);
i = keys.length;
while (i--) { _traverse(val[keys[i]], seen); }
}
}
var mark;
var measure;
if (true) {
var perf = inBrowser && window.performance;
/* istanbul ignore if */
if (
perf &&
perf.mark &&
perf.measure &&
perf.clearMarks &&
perf.clearMeasures
) {
mark = function (tag) { return perf.mark(tag); };
measure = function (name, startTag, endTag) {
perf.measure(name, startTag, endTag);
perf.clearMarks(startTag);
perf.clearMarks(endTag);
// perf.clearMeasures(name)
};
}
}
/* */
var normalizeEvent = cached(function (name) {
var passive = name.charAt(0) === '&';
name = passive ? name.slice(1) : name;
var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first
name = once$$1 ? name.slice(1) : name;
var capture = name.charAt(0) === '!';
name = capture ? name.slice(1) : name;
return {
name: name,
once: once$$1,
capture: capture,
passive: passive
}
});
function createFnInvoker (fns, vm) {
function invoker () {
var arguments$1 = arguments;
var fns = invoker.fns;
if (Array.isArray(fns)) {
var cloned = fns.slice();
for (var i = 0; i < cloned.length; i++) {
invokeWithErrorHandling(cloned[i], null, arguments$1, vm, "v-on handler");
}
} else {
// return handler return value for single handlers
return invokeWithErrorHandling(fns, null, arguments, vm, "v-on handler")
}
}
invoker.fns = fns;
return invoker
}
function updateListeners (
on,
oldOn,
add,
remove$$1,
createOnceHandler,
vm
) {
var name, def$$1, cur, old, event;
for (name in on) {
def$$1 = cur = on[name];
old = oldOn[name];
event = normalizeEvent(name);
if (isUndef(cur)) {
true && warn(
"Invalid handler for event \"" + (event.name) + "\": got " + String(cur),
vm
);
} else if (isUndef(old)) {
if (isUndef(cur.fns)) {
cur = on[name] = createFnInvoker(cur, vm);
}
if (isTrue(event.once)) {
cur = on[name] = createOnceHandler(event.name, cur, event.capture);
}
add(event.name, cur, event.capture, event.passive, event.params);
} else if (cur !== old) {
old.fns = cur;
on[name] = old;
}
}
for (name in oldOn) {
if (isUndef(on[name])) {
event = normalizeEvent(name);
remove$$1(event.name, oldOn[name], event.capture);
}
}
}
/* */
/* */
// fixed by xxxxxx (mp properties)
function extractPropertiesFromVNodeData(data, Ctor, res, context) {
var propOptions = Ctor.options.mpOptions && Ctor.options.mpOptions.properties;
if (isUndef(propOptions)) {
return res
}
var externalClasses = Ctor.options.mpOptions.externalClasses || [];
var attrs = data.attrs;
var props = data.props;
if (isDef(attrs) || isDef(props)) {
for (var key in propOptions) {
var altKey = hyphenate(key);
var result = checkProp(res, props, key, altKey, true) ||
checkProp(res, attrs, key, altKey, false);
// externalClass
if (
result &&
res[key] &&
externalClasses.indexOf(altKey) !== -1 &&
context[camelize(res[key])]
) {
// 赋值 externalClass 真正的值(模板里 externalClass 的值可能是字符串)
res[key] = context[camelize(res[key])];
}
}
}
return res
}
function extractPropsFromVNodeData (
data,
Ctor,
tag,
context// fixed by xxxxxx
) {
// we are only extracting raw values here.
// validation and default values are handled in the child
// component itself.
var propOptions = Ctor.options.props;
if (isUndef(propOptions)) {
// fixed by xxxxxx
return extractPropertiesFromVNodeData(data, Ctor, {}, context)
}
var res = {};
var attrs = data.attrs;
var props = data.props;
if (isDef(attrs) || isDef(props)) {
for (var key in propOptions) {
var altKey = hyphenate(key);
if (true) {
var keyInLowerCase = key.toLowerCase();
if (
key !== keyInLowerCase &&
attrs && hasOwn(attrs, keyInLowerCase)
) {
tip(
"Prop \"" + keyInLowerCase + "\" is passed to component " +
(formatComponentName(tag || Ctor)) + ", but the declared prop name is" +
" \"" + key + "\". " +
"Note that HTML attributes are case-insensitive and camelCased " +
"props need to use their kebab-case equivalents when using in-DOM " +
"templates. You should probably use \"" + altKey + "\" instead of \"" + key + "\"."
);
}
}
checkProp(res, props, key, altKey, true) ||
checkProp(res, attrs, key, altKey, false);
}
}
// fixed by xxxxxx
return extractPropertiesFromVNodeData(data, Ctor, res, context)
}
function checkProp (
res,
hash,
key,
altKey,
preserve
) {
if (isDef(hash)) {
if (hasOwn(hash, key)) {
res[key] = hash[key];
if (!preserve) {
delete hash[key];
}
return true
} else if (hasOwn(hash, altKey)) {
res[key] = hash[altKey];
if (!preserve) {
delete hash[altKey];
}
return true
}
}
return false
}
/* */
// The template compiler attempts to minimize the need for normalization by
// statically analyzing the template at compile time.
//
// For plain HTML markup, normalization can be completely skipped because the
// generated render function is guaranteed to return Array<VNode>. There are
// two cases where extra normalization is needed:
// 1. When the children contains components - because a functional component
// may return an Array instead of a single root. In this case, just a simple
// normalization is needed - if any child is an Array, we flatten the whole
// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep
// because functional components already normalize their own children.
function simpleNormalizeChildren (children) {
for (var i = 0; i < children.length; i++) {
if (Array.isArray(children[i])) {
return Array.prototype.concat.apply([], children)
}
}
return children
}
// 2. When the children contains constructs that always generated nested Arrays,
// e.g. <template>, <slot>, v-for, or when the children is provided by user
// with hand-written render functions / JSX. In such cases a full normalization
// is needed to cater to all possible types of children values.
function normalizeChildren (children) {
return isPrimitive(children)
? [createTextVNode(children)]
: Array.isArray(children)
? normalizeArrayChildren(children)
: undefined
}
function isTextNode (node) {
return isDef(node) && isDef(node.text) && isFalse(node.isComment)
}
function normalizeArrayChildren (children, nestedIndex) {
var res = [];
var i, c, lastIndex, last;
for (i = 0; i < children.length; i++) {
c = children[i];
if (isUndef(c) || typeof c === 'boolean') { continue }
lastIndex = res.length - 1;
last = res[lastIndex];
// nested
if (Array.isArray(c)) {
if (c.length > 0) {
c = normalizeArrayChildren(c, ((nestedIndex || '') + "_" + i));
// merge adjacent text nodes
if (isTextNode(c[0]) && isTextNode(last)) {
res[lastIndex] = createTextVNode(last.text + (c[0]).text);
c.shift();
}
res.push.apply(res, c);
}
} else if (isPrimitive(c)) {
if (isTextNode(last)) {
// merge adjacent text nodes
// this is necessary for SSR hydration because text nodes are
// essentially merged when rendered to HTML strings
res[lastIndex] = createTextVNode(last.text + c);
} else if (c !== '') {
// convert primitive to vnode
res.push(createTextVNode(c));
}
} else {
if (isTextNode(c) && isTextNode(last)) {
// merge adjacent text nodes
res[lastIndex] = createTextVNode(last.text + c.text);
} else {
// default key for nested array children (likely generated by v-for)
if (isTrue(children._isVList) &&
isDef(c.tag) &&
isUndef(c.key) &&
isDef(nestedIndex)) {
c.key = "__vlist" + nestedIndex + "_" + i + "__";
}
res.push(c);
}
}
}
return res
}
/* */
function initProvide (vm) {
var provide = vm.$options.provide;
if (provide) {
vm._provided = typeof provide === 'function'
? provide.call(vm)
: provide;
}
}
function initInjections (vm) {
var result = resolveInject(vm.$options.inject, vm);
if (result) {
toggleObserving(false);
Object.keys(result).forEach(function (key) {
/* istanbul ignore else */
if (true) {
defineReactive$$1(vm, key, result[key], function () {
warn(
"Avoid mutating an injected value directly since the changes will be " +
"overwritten whenever the provided component re-renders. " +
"injection being mutated: \"" + key + "\"",
vm
);
});
} else {}
});
toggleObserving(true);
}
}
function resolveInject (inject, vm) {
if (inject) {
// inject is :any because flow is not smart enough to figure out cached
var result = Object.create(null);
var keys = hasSymbol
? Reflect.ownKeys(inject)
: Object.keys(inject);
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
// #6574 in case the inject object is observed...
if (key === '__ob__') { continue }
var provideKey = inject[key].from;
var source = vm;
while (source) {
if (source._provided && hasOwn(source._provided, provideKey)) {
result[key] = source._provided[provideKey];
break
}
source = source.$parent;
}
if (!source) {
if ('default' in inject[key]) {
var provideDefault = inject[key].default;
result[key] = typeof provideDefault === 'function'
? provideDefault.call(vm)
: provideDefault;
} else if (true) {
warn(("Injection \"" + key + "\" not found"), vm);
}
}
}
return result
}
}
/* */
/**
* Runtime helper for resolving raw children VNodes into a slot object.
*/
function resolveSlots (
children,
context
) {
if (!children || !children.length) {
return {}
}
var slots = {};
for (var i = 0, l = children.length; i < l; i++) {
var child = children[i];
var data = child.data;
// remove slot attribute if the node is resolved as a Vue slot node
if (data && data.attrs && data.attrs.slot) {
delete data.attrs.slot;
}
// named slots should only be respected if the vnode was rendered in the
// same context.
if ((child.context === context || child.fnContext === context) &&
data && data.slot != null
) {
var name = data.slot;
var slot = (slots[name] || (slots[name] = []));
if (child.tag === 'template') {
slot.push.apply(slot, child.children || []);
} else {
slot.push(child);
}
} else {
// fixed by xxxxxx 临时 hack 掉 uni-app 中的异步 name slot page
if(child.asyncMeta && child.asyncMeta.data && child.asyncMeta.data.slot === 'page'){
(slots['page'] || (slots['page'] = [])).push(child);
}else{
(slots.default || (slots.default = [])).push(child);
}
}
}
// ignore slots that contains only whitespace
for (var name$1 in slots) {
if (slots[name$1].every(isWhitespace)) {
delete slots[name$1];
}
}
return slots
}
function isWhitespace (node) {
return (node.isComment && !node.asyncFactory) || node.text === ' '
}
/* */
function normalizeScopedSlots (
slots,
normalSlots,
prevSlots
) {
var res;
var hasNormalSlots = Object.keys(normalSlots).length > 0;
var isStable = slots ? !!slots.$stable : !hasNormalSlots;
var key = slots && slots.$key;
if (!slots) {
res = {};
} else if (slots._normalized) {
// fast path 1: child component re-render only, parent did not change
return slots._normalized
} else if (
isStable &&
prevSlots &&
prevSlots !== emptyObject &&
key === prevSlots.$key &&
!hasNormalSlots &&
!prevSlots.$hasNormal
) {
// fast path 2: stable scoped slots w/ no normal slots to proxy,
// only need to normalize once
return prevSlots
} else {
res = {};
for (var key$1 in slots) {
if (slots[key$1] && key$1[0] !== '$') {
res[key$1] = normalizeScopedSlot(normalSlots, key$1, slots[key$1]);
}
}
}
// expose normal slots on scopedSlots
for (var key$2 in normalSlots) {
if (!(key$2 in res)) {
res[key$2] = proxyNormalSlot(normalSlots, key$2);
}
}
// avoriaz seems to mock a non-extensible $scopedSlots object
// and when that is passed down this would cause an error
if (slots && Object.isExtensible(slots)) {
(slots)._normalized = res;
}
def(res, '$stable', isStable);
def(res, '$key', key);
def(res, '$hasNormal', hasNormalSlots);
return res
}
function normalizeScopedSlot(normalSlots, key, fn) {
var normalized = function () {
var res = arguments.length ? fn.apply(null, arguments) : fn({});
res = res && typeof res === 'object' && !Array.isArray(res)
? [res] // single vnode
: normalizeChildren(res);
return res && (
res.length === 0 ||
(res.length === 1 && res[0].isComment) // #9658
) ? undefined
: res
};
// this is a slot using the new v-slot syntax without scope. although it is
// compiled as a scoped slot, render fn users would expect it to be present
// on this.$slots because the usage is semantically a normal slot.
if (fn.proxy) {
Object.defineProperty(normalSlots, key, {
get: normalized,
enumerable: true,
configurable: true
});
}
return normalized
}
function proxyNormalSlot(slots, key) {
return function () { return slots[key]; }
}
/* */
/**
* Runtime helper for rendering v-for lists.
*/
function renderList (
val,
render
) {
var ret, i, l, keys, key;
if (Array.isArray(val) || typeof val === 'string') {
ret = new Array(val.length);
for (i = 0, l = val.length; i < l; i++) {
ret[i] = render(val[i], i, i, i); // fixed by xxxxxx
}
} else if (typeof val === 'number') {
ret = new Array(val);
for (i = 0; i < val; i++) {
ret[i] = render(i + 1, i, i, i); // fixed by xxxxxx
}
} else if (isObject(val)) {
if (hasSymbol && val[Symbol.iterator]) {
ret = [];
var iterator = val[Symbol.iterator]();
var result = iterator.next();
while (!result.done) {
ret.push(render(result.value, ret.length, i, i++)); // fixed by xxxxxx
result = iterator.next();
}
} else {
keys = Object.keys(val);
ret = new Array(keys.length);
for (i = 0, l = keys.length; i < l; i++) {
key = keys[i];
ret[i] = render(val[key], key, i, i); // fixed by xxxxxx
}
}
}
if (!isDef(ret)) {
ret = [];
}
(ret)._isVList = true;
return ret
}
/* */
/**
* Runtime helper for rendering <slot>
*/
function renderSlot (
name,
fallback,
props,
bindObject
) {
var scopedSlotFn = this.$scopedSlots[name];
var nodes;
if (scopedSlotFn) { // scoped slot
props = props || {};
if (bindObject) {
if ( true && !isObject(bindObject)) {
warn(
'slot v-bind without argument expects an Object',
this
);
}
props = extend(extend({}, bindObject), props);
}
// fixed by xxxxxx app-plus scopedSlot
nodes = scopedSlotFn(props, this, props._i) || fallback;
} else {
nodes = this.$slots[name] || fallback;
}
var target = props && props.slot;
if (target) {
return this.$createElement('template', { slot: target }, nodes)
} else {
return nodes
}
}
/* */
/**
* Runtime helper for resolving filters
*/
function resolveFilter (id) {
return resolveAsset(this.$options, 'filters', id, true) || identity
}
/* */
function isKeyNotMatch (expect, actual) {
if (Array.isArray(expect)) {
return expect.indexOf(actual) === -1
} else {
return expect !== actual
}
}
/**
* Runtime helper for checking keyCodes from config.
* exposed as Vue.prototype._k
* passing in eventKeyName as last argument separately for backwards compat
*/
function checkKeyCodes (
eventKeyCode,
key,
builtInKeyCode,
eventKeyName,
builtInKeyName
) {
var mappedKeyCode = config.keyCodes[key] || builtInKeyCode;
if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {
return isKeyNotMatch(builtInKeyName, eventKeyName)
} else if (mappedKeyCode) {
return isKeyNotMatch(mappedKeyCode, eventKeyCode)
} else if (eventKeyName) {
return hyphenate(eventKeyName) !== key
}
}
/* */
/**
* Runtime helper for merging v-bind="object" into a VNode's data.
*/
function bindObjectProps (
data,
tag,
value,
asProp,
isSync
) {
if (value) {
if (!isObject(value)) {
true && warn(
'v-bind without argument expects an Object or Array value',
this
);
} else {
if (Array.isArray(value)) {
value = toObject(value);
}
var hash;
var loop = function ( key ) {
if (
key === 'class' ||
key === 'style' ||
isReservedAttribute(key)
) {
hash = data;
} else {
var type = data.attrs && data.attrs.type;
hash = asProp || config.mustUseProp(tag, type, key)
? data.domProps || (data.domProps = {})
: data.attrs || (data.attrs = {});
}
var camelizedKey = camelize(key);
var hyphenatedKey = hyphenate(key);
if (!(camelizedKey in hash) && !(hyphenatedKey in hash)) {
hash[key] = value[key];
if (isSync) {
var on = data.on || (data.on = {});
on[("update:" + key)] = function ($event) {
value[key] = $event;
};
}
}
};
for (var key in value) loop( key );
}
}
return data
}
/* */
/**
* Runtime helper for rendering static trees.
*/
function renderStatic (
index,
isInFor
) {
var cached = this._staticTrees || (this._staticTrees = []);
var tree = cached[index];
// if has already-rendered static tree and not inside v-for,
// we can reuse the same tree.
if (tree && !isInFor) {
return tree
}
// otherwise, render a fresh tree.
tree = cached[index] = this.$options.staticRenderFns[index].call(
this._renderProxy,
null,
this // for render fns generated for functional component templates
);
markStatic(tree, ("__static__" + index), false);
return tree
}
/**
* Runtime helper for v-once.
* Effectively it means marking the node as static with a unique key.
*/
function markOnce (
tree,
index,
key
) {
markStatic(tree, ("__once__" + index + (key ? ("_" + key) : "")), true);
return tree
}
function markStatic (
tree,
key,
isOnce
) {
if (Array.isArray(tree)) {
for (var i = 0; i < tree.length; i++) {
if (tree[i] && typeof tree[i] !== 'string') {
markStaticNode(tree[i], (key + "_" + i), isOnce);
}
}
} else {
markStaticNode(tree, key, isOnce);
}
}
function markStaticNode (node, key, isOnce) {
node.isStatic = true;
node.key = key;
node.isOnce = isOnce;
}
/* */
function bindObjectListeners (data, value) {
if (value) {
if (!isPlainObject(value)) {
true && warn(
'v-on without argument expects an Object value',
this
);
} else {
var on = data.on = data.on ? extend({}, data.on) : {};
for (var key in value) {
var existing = on[key];
var ours = value[key];
on[key] = existing ? [].concat(existing, ours) : ours;
}
}
}
return data
}
/* */
function resolveScopedSlots (
fns, // see flow/vnode
res,
// the following are added in 2.6
hasDynamicKeys,
contentHashKey
) {
res = res || { $stable: !hasDynamicKeys };
for (var i = 0; i < fns.length; i++) {
var slot = fns[i];
if (Array.isArray(slot)) {
resolveScopedSlots(slot, res, hasDynamicKeys);
} else if (slot) {
// marker for reverse proxying v-slot without scope on this.$slots
if (slot.proxy) {
slot.fn.proxy = true;
}
res[slot.key] = slot.fn;
}
}
if (contentHashKey) {
(res).$key = contentHashKey;
}
return res
}
/* */
function bindDynamicKeys (baseObj, values) {
for (var i = 0; i < values.length; i += 2) {
var key = values[i];
if (typeof key === 'string' && key) {
baseObj[values[i]] = values[i + 1];
} else if ( true && key !== '' && key !== null) {
// null is a special value for explicitly removing a binding
warn(
("Invalid value for dynamic directive argument (expected string or null): " + key),
this
);
}
}
return baseObj
}
// helper to dynamically append modifier runtime markers to event names.
// ensure only append when value is already string, otherwise it will be cast
// to string and cause the type check to miss.
function prependModifier (value, symbol) {
return typeof value === 'string' ? symbol + value : value
}
/* */
function installRenderHelpers (target) {
target._o = markOnce;
target._n = toNumber;
target._s = toString;
target._l = renderList;
target._t = renderSlot;
target._q = looseEqual;
target._i = looseIndexOf;
target._m = renderStatic;
target._f = resolveFilter;
target._k = checkKeyCodes;
target._b = bindObjectProps;
target._v = createTextVNode;
target._e = createEmptyVNode;
target._u = resolveScopedSlots;
target._g = bindObjectListeners;
target._d = bindDynamicKeys;
target._p = prependModifier;
}
/* */
function FunctionalRenderContext (
data,
props,
children,
parent,
Ctor
) {
var this$1 = this;
var options = Ctor.options;
// ensure the createElement function in functional components
// gets a unique context - this is necessary for correct named slot check
var contextVm;
if (hasOwn(parent, '_uid')) {
contextVm = Object.create(parent);
// $flow-disable-line
contextVm._original = parent;
} else {
// the context vm passed in is a functional context as well.
// in this case we want to make sure we are able to get a hold to the
// real context instance.
contextVm = parent;
// $flow-disable-line
parent = parent._original;
}
var isCompiled = isTrue(options._compiled);
var needNormalization = !isCompiled;
this.data = data;
this.props = props;
this.children = children;
this.parent = parent;
this.listeners = data.on || emptyObject;
this.injections = resolveInject(options.inject, parent);
this.slots = function () {
if (!this$1.$slots) {
normalizeScopedSlots(
data.scopedSlots,
this$1.$slots = resolveSlots(children, parent)
);
}
return this$1.$slots
};
Object.defineProperty(this, 'scopedSlots', ({
enumerable: true,
get: function get () {
return normalizeScopedSlots(data.scopedSlots, this.slots())
}
}));
// support for compiled functional template
if (isCompiled) {
// exposing $options for renderStatic()
this.$options = options;
// pre-resolve slots for renderSlot()
this.$slots = this.slots();
this.$scopedSlots = normalizeScopedSlots(data.scopedSlots, this.$slots);
}
if (options._scopeId) {
this._c = function (a, b, c, d) {
var vnode = createElement(contextVm, a, b, c, d, needNormalization);
if (vnode && !Array.isArray(vnode)) {
vnode.fnScopeId = options._scopeId;
vnode.fnContext = parent;
}
return vnode
};
} else {
this._c = function (a, b, c, d) { return createElement(contextVm, a, b, c, d, needNormalization); };
}
}
installRenderHelpers(FunctionalRenderContext.prototype);
function createFunctionalComponent (
Ctor,
propsData,
data,
contextVm,
children
) {
var options = Ctor.options;
var props = {};
var propOptions = options.props;
if (isDef(propOptions)) {
for (var key in propOptions) {
props[key] = validateProp(key, propOptions, propsData || emptyObject);
}
} else {
if (isDef(data.attrs)) { mergeProps(props, data.attrs); }
if (isDef(data.props)) { mergeProps(props, data.props); }
}
var renderContext = new FunctionalRenderContext(
data,
props,
children,
contextVm,
Ctor
);
var vnode = options.render.call(null, renderContext._c, renderContext);
if (vnode instanceof VNode) {
return cloneAndMarkFunctionalResult(vnode, data, renderContext.parent, options, renderContext)
} else if (Array.isArray(vnode)) {
var vnodes = normalizeChildren(vnode) || [];
var res = new Array(vnodes.length);
for (var i = 0; i < vnodes.length; i++) {
res[i] = cloneAndMarkFunctionalResult(vnodes[i], data, renderContext.parent, options, renderContext);
}
return res
}
}
function cloneAndMarkFunctionalResult (vnode, data, contextVm, options, renderContext) {
// #7817 clone node before setting fnContext, otherwise if the node is reused
// (e.g. it was from a cached normal slot) the fnContext causes named slots
// that should not be matched to match.
var clone = cloneVNode(vnode);
clone.fnContext = contextVm;
clone.fnOptions = options;
if (true) {
(clone.devtoolsMeta = clone.devtoolsMeta || {}).renderContext = renderContext;
}
if (data.slot) {
(clone.data || (clone.data = {})).slot = data.slot;
}
return clone
}
function mergeProps (to, from) {
for (var key in from) {
to[camelize(key)] = from[key];
}
}
/* */
/* */
/* */
/* */
// inline hooks to be invoked on component VNodes during patch
var componentVNodeHooks = {
init: function init (vnode, hydrating) {
if (
vnode.componentInstance &&
!vnode.componentInstance._isDestroyed &&
vnode.data.keepAlive
) {
// kept-alive components, treat as a patch
var mountedNode = vnode; // work around flow
componentVNodeHooks.prepatch(mountedNode, mountedNode);
} else {
var child = vnode.componentInstance = createComponentInstanceForVnode(
vnode,
activeInstance
);
child.$mount(hydrating ? vnode.elm : undefined, hydrating);
}
},
prepatch: function prepatch (oldVnode, vnode) {
var options = vnode.componentOptions;
var child = vnode.componentInstance = oldVnode.componentInstance;
updateChildComponent(
child,
options.propsData, // updated props
options.listeners, // updated listeners
vnode, // new parent vnode
options.children // new children
);
},
insert: function insert (vnode) {
var context = vnode.context;
var componentInstance = vnode.componentInstance;
if (!componentInstance._isMounted) {
callHook(componentInstance, 'onServiceCreated');
callHook(componentInstance, 'onServiceAttached');
componentInstance._isMounted = true;
callHook(componentInstance, 'mounted');
}
if (vnode.data.keepAlive) {
if (context._isMounted) {
// vue-router#1212
// During updates, a kept-alive component's child components may
// change, so directly walking the tree here may call activated hooks
// on incorrect children. Instead we push them into a queue which will
// be processed after the whole patch process ended.
queueActivatedComponent(componentInstance);
} else {
activateChildComponent(componentInstance, true /* direct */);
}
}
},
destroy: function destroy (vnode) {
var componentInstance = vnode.componentInstance;
if (!componentInstance._isDestroyed) {
if (!vnode.data.keepAlive) {
componentInstance.$destroy();
} else {
deactivateChildComponent(componentInstance, true /* direct */);
}
}
}
};
var hooksToMerge = Object.keys(componentVNodeHooks);
function createComponent (
Ctor,
data,
context,
children,
tag
) {
if (isUndef(Ctor)) {
return
}
var baseCtor = context.$options._base;
// plain options object: turn it into a constructor
if (isObject(Ctor)) {
Ctor = baseCtor.extend(Ctor);
}
// if at this stage it's not a constructor or an async component factory,
// reject.
if (typeof Ctor !== 'function') {
if (true) {
warn(("Invalid Component definition: " + (String(Ctor))), context);
}
return
}
// async component
var asyncFactory;
if (isUndef(Ctor.cid)) {
asyncFactory = Ctor;
Ctor = resolveAsyncComponent(asyncFactory, baseCtor);
if (Ctor === undefined) {
// return a placeholder node for async component, which is rendered
// as a comment node but preserves all the raw information for the node.
// the information will be used for async server-rendering and hydration.
return createAsyncPlaceholder(
asyncFactory,
data,
context,
children,
tag
)
}
}
data = data || {};
// resolve constructor options in case global mixins are applied after
// component constructor creation
resolveConstructorOptions(Ctor);
// transform component v-model data into props & events
if (isDef(data.model)) {
transformModel(Ctor.options, data);
}
// extract props
var propsData = extractPropsFromVNodeData(data, Ctor, tag, context); // fixed by xxxxxx
// functional component
if (isTrue(Ctor.options.functional)) {
return createFunctionalComponent(Ctor, propsData, data, context, children)
}
// extract listeners, since these needs to be treated as
// child component listeners instead of DOM listeners
var listeners = data.on;
// replace with listeners with .native modifier
// so it gets processed during parent component patch.
data.on = data.nativeOn;
if (isTrue(Ctor.options.abstract)) {
// abstract components do not keep anything
// other than props & listeners & slot
// work around flow
var slot = data.slot;
data = {};
if (slot) {
data.slot = slot;
}
}
// install component management hooks onto the placeholder node
installComponentHooks(data);
// return a placeholder vnode
var name = Ctor.options.name || tag;
var vnode = new VNode(
("vue-component-" + (Ctor.cid) + (name ? ("-" + name) : '')),
data, undefined, undefined, undefined, context,
{ Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children },
asyncFactory
);
return vnode
}
function createComponentInstanceForVnode (
vnode, // we know it's MountedComponentVNode but flow doesn't
parent // activeInstance in lifecycle state
) {
var options = {
_isComponent: true,
_parentVnode: vnode,
parent: parent
};
// check inline-template render functions
var inlineTemplate = vnode.data.inlineTemplate;
if (isDef(inlineTemplate)) {
options.render = inlineTemplate.render;
options.staticRenderFns = inlineTemplate.staticRenderFns;
}
return new vnode.componentOptions.Ctor(options)
}
function installComponentHooks (data) {
var hooks = data.hook || (data.hook = {});
for (var i = 0; i < hooksToMerge.length; i++) {
var key = hooksToMerge[i];
var existing = hooks[key];
var toMerge = componentVNodeHooks[key];
if (existing !== toMerge && !(existing && existing._merged)) {
hooks[key] = existing ? mergeHook$1(toMerge, existing) : toMerge;
}
}
}
function mergeHook$1 (f1, f2) {
var merged = function (a, b) {
// flow complains about extra args which is why we use any
f1(a, b);
f2(a, b);
};
merged._merged = true;
return merged
}
// transform component v-model info (value and callback) into
// prop and event handler respectively.
function transformModel (options, data) {
var prop = (options.model && options.model.prop) || 'value';
var event = (options.model && options.model.event) || 'input'
;(data.attrs || (data.attrs = {}))[prop] = data.model.value;
var on = data.on || (data.on = {});
var existing = on[event];
var callback = data.model.callback;
if (isDef(existing)) {
if (
Array.isArray(existing)
? existing.indexOf(callback) === -1
: existing !== callback
) {
on[event] = [callback].concat(existing);
}
} else {
on[event] = callback;
}
}
/* */
var SIMPLE_NORMALIZE = 1;
var ALWAYS_NORMALIZE = 2;
// wrapper function for providing a more flexible interface
// without getting yelled at by flow
function createElement (
context,
tag,
data,
children,
normalizationType,
alwaysNormalize
) {
if (Array.isArray(data) || isPrimitive(data)) {
normalizationType = children;
children = data;
data = undefined;
}
if (isTrue(alwaysNormalize)) {
normalizationType = ALWAYS_NORMALIZE;
}
return _createElement(context, tag, data, children, normalizationType)
}
function _createElement (
context,
tag,
data,
children,
normalizationType
) {
if (isDef(data) && isDef((data).__ob__)) {
true && warn(
"Avoid using observed data object as vnode data: " + (JSON.stringify(data)) + "\n" +
'Always create fresh vnode data objects in each render!',
context
);
return createEmptyVNode()
}
// object syntax in v-bind
if (isDef(data) && isDef(data.is)) {
tag = data.is;
}
if (!tag) {
// in case of component :is set to falsy value
return createEmptyVNode()
}
// warn against non-primitive key
if ( true &&
isDef(data) && isDef(data.key) && !isPrimitive(data.key)
) {
{
warn(
'Avoid using non-primitive value as key, ' +
'use string/number value instead.',
context
);
}
}
// support single function children as default scoped slot
if (Array.isArray(children) &&
typeof children[0] === 'function'
) {
data = data || {};
data.scopedSlots = { default: children[0] };
children.length = 0;
}
if (normalizationType === ALWAYS_NORMALIZE) {
children = normalizeChildren(children);
} else if (normalizationType === SIMPLE_NORMALIZE) {
children = simpleNormalizeChildren(children);
}
var vnode, ns;
if (typeof tag === 'string') {
var Ctor;
ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag);
if (config.isReservedTag(tag)) {
// platform built-in elements
if ( true && isDef(data) && isDef(data.nativeOn)) {
warn(
("The .native modifier for v-on is only valid on components but it was used on <" + tag + ">."),
context
);
}
vnode = new VNode(
config.parsePlatformTagName(tag), data, children,
undefined, undefined, context
);
} else if ((!data || !data.pre) && isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {
// component
vnode = createComponent(Ctor, data, context, children, tag);
} else {
// unknown or unlisted namespaced elements
// check at runtime because it may get assigned a namespace when its
// parent normalizes children
vnode = new VNode(
tag, data, children,
undefined, undefined, context
);
}
} else {
// direct component options / constructor
vnode = createComponent(tag, data, context, children);
}
if (Array.isArray(vnode)) {
return vnode
} else if (isDef(vnode)) {
if (isDef(ns)) { applyNS(vnode, ns); }
if (isDef(data)) { registerDeepBindings(data); }
return vnode
} else {
return createEmptyVNode()
}
}
function applyNS (vnode, ns, force) {
vnode.ns = ns;
if (vnode.tag === 'foreignObject') {
// use default namespace inside foreignObject
ns = undefined;
force = true;
}
if (isDef(vnode.children)) {
for (var i = 0, l = vnode.children.length; i < l; i++) {
var child = vnode.children[i];
if (isDef(child.tag) && (
isUndef(child.ns) || (isTrue(force) && child.tag !== 'svg'))) {
applyNS(child, ns, force);
}
}
}
}
// ref #5318
// necessary to ensure parent re-render when deep bindings like :style and
// :class are used on slot nodes
function registerDeepBindings (data) {
if (isObject(data.style)) {
traverse(data.style);
}
if (isObject(data.class)) {
traverse(data.class);
}
}
/* */
function initRender (vm) {
vm._vnode = null; // the root of the child tree
vm._staticTrees = null; // v-once cached trees
var options = vm.$options;
var parentVnode = vm.$vnode = options._parentVnode; // the placeholder node in parent tree
var renderContext = parentVnode && parentVnode.context;
vm.$slots = resolveSlots(options._renderChildren, renderContext);
vm.$scopedSlots = emptyObject;
// bind the createElement fn to this instance
// so that we get proper render context inside it.
// args order: tag, data, children, normalizationType, alwaysNormalize
// internal version is used by render functions compiled from templates
vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };
// normalization is always applied for the public version, used in
// user-written render functions.
vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };
// $attrs & $listeners are exposed for easier HOC creation.
// they need to be reactive so that HOCs using them are always updated
var parentData = parentVnode && parentVnode.data;
/* istanbul ignore else */
if (true) {
defineReactive$$1(vm, '$attrs', parentData && parentData.attrs || emptyObject, function () {
!isUpdatingChildComponent && warn("$attrs is readonly.", vm);
}, true);
defineReactive$$1(vm, '$listeners', options._parentListeners || emptyObject, function () {
!isUpdatingChildComponent && warn("$listeners is readonly.", vm);
}, true);
} else {}
}
var currentRenderingInstance = null;
function renderMixin (Vue) {
// install runtime convenience helpers
installRenderHelpers(Vue.prototype);
Vue.prototype.$nextTick = function (fn) {
return nextTick(fn, this)
};
Vue.prototype._render = function () {
var vm = this;
var ref = vm.$options;
var render = ref.render;
var _parentVnode = ref._parentVnode;
if (_parentVnode) {
vm.$scopedSlots = normalizeScopedSlots(
_parentVnode.data.scopedSlots,
vm.$slots,
vm.$scopedSlots
);
}
// set parent vnode. this allows render functions to have access
// to the data on the placeholder node.
vm.$vnode = _parentVnode;
// render self
var vnode;
try {
// There's no need to maintain a stack because all render fns are called
// separately from one another. Nested component's render fns are called
// when parent component is patched.
currentRenderingInstance = vm;
vnode = render.call(vm._renderProxy, vm.$createElement);
} catch (e) {
handleError(e, vm, "render");
// return error render result,
// or previous vnode to prevent render error causing blank component
/* istanbul ignore else */
if ( true && vm.$options.renderError) {
try {
vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e);
} catch (e) {
handleError(e, vm, "renderError");
vnode = vm._vnode;
}
} else {
vnode = vm._vnode;
}
} finally {
currentRenderingInstance = null;
}
// if the returned array contains only a single node, allow it
if (Array.isArray(vnode) && vnode.length === 1) {
vnode = vnode[0];
}
// return empty vnode in case the render function errored out
if (!(vnode instanceof VNode)) {
if ( true && Array.isArray(vnode)) {
warn(
'Multiple root nodes returned from render function. Render function ' +
'should return a single root node.',
vm
);
}
vnode = createEmptyVNode();
}
// set parent
vnode.parent = _parentVnode;
return vnode
};
}
/* */
function ensureCtor (comp, base) {
if (
comp.__esModule ||
(hasSymbol && comp[Symbol.toStringTag] === 'Module')
) {
comp = comp.default;
}
return isObject(comp)
? base.extend(comp)
: comp
}
function createAsyncPlaceholder (
factory,
data,
context,
children,
tag
) {
var node = createEmptyVNode();
node.asyncFactory = factory;
node.asyncMeta = { data: data, context: context, children: children, tag: tag };
return node
}
function resolveAsyncComponent (
factory,
baseCtor
) {
if (isTrue(factory.error) && isDef(factory.errorComp)) {
return factory.errorComp
}
if (isDef(factory.resolved)) {
return factory.resolved
}
var owner = currentRenderingInstance;
if (owner && isDef(factory.owners) && factory.owners.indexOf(owner) === -1) {
// already pending
factory.owners.push(owner);
}
if (isTrue(factory.loading) && isDef(factory.loadingComp)) {
return factory.loadingComp
}
if (owner && !isDef(factory.owners)) {
var owners = factory.owners = [owner];
var sync = true;
var timerLoading = null;
var timerTimeout = null
;(owner).$on('hook:destroyed', function () { return remove(owners, owner); });
var forceRender = function (renderCompleted) {
for (var i = 0, l = owners.length; i < l; i++) {
(owners[i]).$forceUpdate();
}
if (renderCompleted) {
owners.length = 0;
if (timerLoading !== null) {
clearTimeout(timerLoading);
timerLoading = null;
}
if (timerTimeout !== null) {
clearTimeout(timerTimeout);
timerTimeout = null;
}
}
};
var resolve = once(function (res) {
// cache resolved
factory.resolved = ensureCtor(res, baseCtor);
// invoke callbacks only if this is not a synchronous resolve
// (async resolves are shimmed as synchronous during SSR)
if (!sync) {
forceRender(true);
} else {
owners.length = 0;
}
});
var reject = once(function (reason) {
true && warn(
"Failed to resolve async component: " + (String(factory)) +
(reason ? ("\nReason: " + reason) : '')
);
if (isDef(factory.errorComp)) {
factory.error = true;
forceRender(true);
}
});
var res = factory(resolve, reject);
if (isObject(res)) {
if (isPromise(res)) {
// () => Promise
if (isUndef(factory.resolved)) {
res.then(resolve, reject);
}
} else if (isPromise(res.component)) {
res.component.then(resolve, reject);
if (isDef(res.error)) {
factory.errorComp = ensureCtor(res.error, baseCtor);
}
if (isDef(res.loading)) {
factory.loadingComp = ensureCtor(res.loading, baseCtor);
if (res.delay === 0) {
factory.loading = true;
} else {
timerLoading = setTimeout(function () {
timerLoading = null;
if (isUndef(factory.resolved) && isUndef(factory.error)) {
factory.loading = true;
forceRender(false);
}
}, res.delay || 200);
}
}
if (isDef(res.timeout)) {
timerTimeout = setTimeout(function () {
timerTimeout = null;
if (isUndef(factory.resolved)) {
reject(
true
? ("timeout (" + (res.timeout) + "ms)")
: undefined
);
}
}, res.timeout);
}
}
}
sync = false;
// return in case resolved synchronously
return factory.loading
? factory.loadingComp
: factory.resolved
}
}
/* */
function isAsyncPlaceholder (node) {
return node.isComment && node.asyncFactory
}
/* */
function getFirstComponentChild (children) {
if (Array.isArray(children)) {
for (var i = 0; i < children.length; i++) {
var c = children[i];
if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {
return c
}
}
}
}
/* */
/* */
function initEvents (vm) {
vm._events = Object.create(null);
vm._hasHookEvent = false;
// init parent attached events
var listeners = vm.$options._parentListeners;
if (listeners) {
updateComponentListeners(vm, listeners);
}
}
var target;
function add (event, fn) {
target.$on(event, fn);
}
function remove$1 (event, fn) {
target.$off(event, fn);
}
function createOnceHandler (event, fn) {
var _target = target;
return function onceHandler () {
var res = fn.apply(null, arguments);
if (res !== null) {
_target.$off(event, onceHandler);
}
}
}
function updateComponentListeners (
vm,
listeners,
oldListeners
) {
target = vm;
updateListeners(listeners, oldListeners || {}, add, remove$1, createOnceHandler, vm);
target = undefined;
}
function eventsMixin (Vue) {
var hookRE = /^hook:/;
Vue.prototype.$on = function (event, fn) {
var vm = this;
if (Array.isArray(event)) {
for (var i = 0, l = event.length; i < l; i++) {
vm.$on(event[i], fn);
}
} else {
(vm._events[event] || (vm._events[event] = [])).push(fn);
// optimize hook:event cost by using a boolean flag marked at registration
// instead of a hash lookup
if (hookRE.test(event)) {
vm._hasHookEvent = true;
}
}
return vm
};
Vue.prototype.$once = function (event, fn) {
var vm = this;
function on () {
vm.$off(event, on);
fn.apply(vm, arguments);
}
on.fn = fn;
vm.$on(event, on);
return vm
};
Vue.prototype.$off = function (event, fn) {
var vm = this;
// all
if (!arguments.length) {
vm._events = Object.create(null);
return vm
}
// array of events
if (Array.isArray(event)) {
for (var i$1 = 0, l = event.length; i$1 < l; i$1++) {
vm.$off(event[i$1], fn);
}
return vm
}
// specific event
var cbs = vm._events[event];
if (!cbs) {
return vm
}
if (!fn) {
vm._events[event] = null;
return vm
}
// specific handler
var cb;
var i = cbs.length;
while (i--) {
cb = cbs[i];
if (cb === fn || cb.fn === fn) {
cbs.splice(i, 1);
break
}
}
return vm
};
Vue.prototype.$emit = function (event) {
var vm = this;
if (true) {
var lowerCaseEvent = event.toLowerCase();
if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {
tip(
"Event \"" + lowerCaseEvent + "\" is emitted in component " +
(formatComponentName(vm)) + " but the handler is registered for \"" + event + "\". " +
"Note that HTML attributes are case-insensitive and you cannot use " +
"v-on to listen to camelCase events when using in-DOM templates. " +
"You should probably use \"" + (hyphenate(event)) + "\" instead of \"" + event + "\"."
);
}
}
var cbs = vm._events[event];
if (cbs) {
cbs = cbs.length > 1 ? toArray(cbs) : cbs;
var args = toArray(arguments, 1);
var info = "event handler for \"" + event + "\"";
for (var i = 0, l = cbs.length; i < l; i++) {
invokeWithErrorHandling(cbs[i], vm, args, vm, info);
}
}
return vm
};
}
/* */
var activeInstance = null;
var isUpdatingChildComponent = false;
function setActiveInstance(vm) {
var prevActiveInstance = activeInstance;
activeInstance = vm;
return function () {
activeInstance = prevActiveInstance;
}
}
function initLifecycle (vm) {
var options = vm.$options;
// locate first non-abstract parent
var parent = options.parent;
if (parent && !options.abstract) {
while (parent.$options.abstract && parent.$parent) {
parent = parent.$parent;
}
parent.$children.push(vm);
}
vm.$parent = parent;
vm.$root = parent ? parent.$root : vm;
vm.$children = [];
vm.$refs = {};
vm._watcher = null;
vm._inactive = null;
vm._directInactive = false;
vm._isMounted = false;
vm._isDestroyed = false;
vm._isBeingDestroyed = false;
}
function lifecycleMixin (Vue) {
Vue.prototype._update = function (vnode, hydrating) {
var vm = this;
var prevEl = vm.$el;
var prevVnode = vm._vnode;
var restoreActiveInstance = setActiveInstance(vm);
vm._vnode = vnode;
// Vue.prototype.__patch__ is injected in entry points
// based on the rendering backend used.
if (!prevVnode) {
// initial render
vm.$el = vm.__patch__(vm.$el, vnode, hydrating, false /* removeOnly */);
} else {
// updates
vm.$el = vm.__patch__(prevVnode, vnode);
}
restoreActiveInstance();
// update __vue__ reference
if (prevEl) {
prevEl.__vue__ = null;
}
if (vm.$el) {
vm.$el.__vue__ = vm;
}
// if parent is an HOC, update its $el as well
if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {
vm.$parent.$el = vm.$el;
}
// updated hook is called by the scheduler to ensure that children are
// updated in a parent's updated hook.
};
Vue.prototype.$forceUpdate = function () {
var vm = this;
if (vm._watcher) {
vm._watcher.update();
}
};
Vue.prototype.$destroy = function () {
var vm = this;
if (vm._isBeingDestroyed) {
return
}
callHook(vm, 'beforeDestroy');
vm._isBeingDestroyed = true;
// remove self from parent
var parent = vm.$parent;
if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {
remove(parent.$children, vm);
}
// teardown watchers
if (vm._watcher) {
vm._watcher.teardown();
}
var i = vm._watchers.length;
while (i--) {
vm._watchers[i].teardown();
}
// remove reference from data ob
// frozen object may not have observer.
if (vm._data.__ob__) {
vm._data.__ob__.vmCount--;
}
// call the last hook...
vm._isDestroyed = true;
// invoke destroy hooks on current rendered tree
vm.__patch__(vm._vnode, null);
// fire destroyed hook
callHook(vm, 'destroyed');
// turn off all instance listeners.
vm.$off();
// remove __vue__ reference
if (vm.$el) {
vm.$el.__vue__ = null;
}
// release circular reference (#6759)
if (vm.$vnode) {
vm.$vnode.parent = null;
}
};
}
function updateChildComponent (
vm,
propsData,
listeners,
parentVnode,
renderChildren
) {
if (true) {
isUpdatingChildComponent = true;
}
// determine whether component has slot children
// we need to do this before overwriting $options._renderChildren.
// check if there are dynamic scopedSlots (hand-written or compiled but with
// dynamic slot names). Static scoped slots compiled from template has the
// "$stable" marker.
var newScopedSlots = parentVnode.data.scopedSlots;
var oldScopedSlots = vm.$scopedSlots;
var hasDynamicScopedSlot = !!(
(newScopedSlots && !newScopedSlots.$stable) ||
(oldScopedSlots !== emptyObject && !oldScopedSlots.$stable) ||
(newScopedSlots && vm.$scopedSlots.$key !== newScopedSlots.$key)
);
// Any static slot children from the parent may have changed during parent's
// update. Dynamic scoped slots may also have changed. In such cases, a forced
// update is necessary to ensure correctness.
var needsForceUpdate = !!(
renderChildren || // has new static slots
vm.$options._renderChildren || // has old static slots
hasDynamicScopedSlot
);
vm.$options._parentVnode = parentVnode;
vm.$vnode = parentVnode; // update vm's placeholder node without re-render
if (vm._vnode) { // update child tree's parent
vm._vnode.parent = parentVnode;
}
vm.$options._renderChildren = renderChildren;
// update $attrs and $listeners hash
// these are also reactive so they may trigger child update if the child
// used them during render
vm.$attrs = parentVnode.data.attrs || emptyObject;
vm.$listeners = listeners || emptyObject;
// update props
if (propsData && vm.$options.props) {
toggleObserving(false);
var props = vm._props;
var propKeys = vm.$options._propKeys || [];
for (var i = 0; i < propKeys.length; i++) {
var key = propKeys[i];
var propOptions = vm.$options.props; // wtf flow?
props[key] = validateProp(key, propOptions, propsData, vm);
}
toggleObserving(true);
// keep a copy of raw propsData
vm.$options.propsData = propsData;
}
// fixed by xxxxxx update properties(mp runtime)
vm._$updateProperties && vm._$updateProperties(vm);
// update listeners
listeners = listeners || emptyObject;
var oldListeners = vm.$options._parentListeners;
vm.$options._parentListeners = listeners;
updateComponentListeners(vm, listeners, oldListeners);
// resolve slots + force update if has children
if (needsForceUpdate) {
vm.$slots = resolveSlots(renderChildren, parentVnode.context);
vm.$forceUpdate();
}
if (true) {
isUpdatingChildComponent = false;
}
}
function isInInactiveTree (vm) {
while (vm && (vm = vm.$parent)) {
if (vm._inactive) { return true }
}
return false
}
function activateChildComponent (vm, direct) {
if (direct) {
vm._directInactive = false;
if (isInInactiveTree(vm)) {
return
}
} else if (vm._directInactive) {
return
}
if (vm._inactive || vm._inactive === null) {
vm._inactive = false;
for (var i = 0; i < vm.$children.length; i++) {
activateChildComponent(vm.$children[i]);
}
callHook(vm, 'activated');
}
}
function deactivateChildComponent (vm, direct) {
if (direct) {
vm._directInactive = true;
if (isInInactiveTree(vm)) {
return
}
}
if (!vm._inactive) {
vm._inactive = true;
for (var i = 0; i < vm.$children.length; i++) {
deactivateChildComponent(vm.$children[i]);
}
callHook(vm, 'deactivated');
}
}
function callHook (vm, hook) {
// #7573 disable dep collection when invoking lifecycle hooks
pushTarget();
var handlers = vm.$options[hook];
var info = hook + " hook";
if (handlers) {
for (var i = 0, j = handlers.length; i < j; i++) {
invokeWithErrorHandling(handlers[i], vm, null, vm, info);
}
}
if (vm._hasHookEvent) {
vm.$emit('hook:' + hook);
}
popTarget();
}
/* */
var MAX_UPDATE_COUNT = 100;
var queue = [];
var activatedChildren = [];
var has = {};
var circular = {};
var waiting = false;
var flushing = false;
var index = 0;
/**
* Reset the scheduler's state.
*/
function resetSchedulerState () {
index = queue.length = activatedChildren.length = 0;
has = {};
if (true) {
circular = {};
}
waiting = flushing = false;
}
// Async edge case #6566 requires saving the timestamp when event listeners are
// attached. However, calling performance.now() has a perf overhead especially
// if the page has thousands of event listeners. Instead, we take a timestamp
// every time the scheduler flushes and use that for all event listeners
// attached during that flush.
var currentFlushTimestamp = 0;
// Async edge case fix requires storing an event listener's attach timestamp.
var getNow = Date.now;
// Determine what event timestamp the browser is using. Annoyingly, the
// timestamp can either be hi-res (relative to page load) or low-res
// (relative to UNIX epoch), so in order to compare time we have to use the
// same timestamp type when saving the flush timestamp.
// All IE versions use low-res event timestamps, and have problematic clock
// implementations (#9632)
if (inBrowser && !isIE) {
var performance = window.performance;
if (
performance &&
typeof performance.now === 'function' &&
getNow() > document.createEvent('Event').timeStamp
) {
// if the event timestamp, although evaluated AFTER the Date.now(), is
// smaller than it, it means the event is using a hi-res timestamp,
// and we need to use the hi-res version for event listener timestamps as
// well.
getNow = function () { return performance.now(); };
}
}
/**
* Flush both queues and run the watchers.
*/
function flushSchedulerQueue () {
currentFlushTimestamp = getNow();
flushing = true;
var watcher, id;
// Sort queue before flush.
// This ensures that:
// 1. Components are updated from parent to child. (because parent is always
// created before the child)
// 2. A component's user watchers are run before its render watcher (because
// user watchers are created before the render watcher)
// 3. If a component is destroyed during a parent component's watcher run,
// its watchers can be skipped.
queue.sort(function (a, b) { return a.id - b.id; });
// do not cache length because more watchers might be pushed
// as we run existing watchers
for (index = 0; index < queue.length; index++) {
watcher = queue[index];
if (watcher.before) {
watcher.before();
}
id = watcher.id;
has[id] = null;
watcher.run();
// in dev build, check and stop circular updates.
if ( true && has[id] != null) {
circular[id] = (circular[id] || 0) + 1;
if (circular[id] > MAX_UPDATE_COUNT) {
warn(
'You may have an infinite update loop ' + (
watcher.user
? ("in watcher with expression \"" + (watcher.expression) + "\"")
: "in a component render function."
),
watcher.vm
);
break
}
}
}
// keep copies of post queues before resetting state
var activatedQueue = activatedChildren.slice();
var updatedQueue = queue.slice();
resetSchedulerState();
// call component updated and activated hooks
callActivatedHooks(activatedQueue);
callUpdatedHooks(updatedQueue);
// devtool hook
/* istanbul ignore if */
if (devtools && config.devtools) {
devtools.emit('flush');
}
}
function callUpdatedHooks (queue) {
var i = queue.length;
while (i--) {
var watcher = queue[i];
var vm = watcher.vm;
if (vm._watcher === watcher && vm._isMounted && !vm._isDestroyed) {
callHook(vm, 'updated');
}
}
}
/**
* Queue a kept-alive component that was activated during patch.
* The queue will be processed after the entire tree has been patched.
*/
function queueActivatedComponent (vm) {
// setting _inactive to false here so that a render function can
// rely on checking whether it's in an inactive tree (e.g. router-view)
vm._inactive = false;
activatedChildren.push(vm);
}
function callActivatedHooks (queue) {
for (var i = 0; i < queue.length; i++) {
queue[i]._inactive = true;
activateChildComponent(queue[i], true /* true */);
}
}
/**
* Push a watcher into the watcher queue.
* Jobs with duplicate IDs will be skipped unless it's
* pushed when the queue is being flushed.
*/
function queueWatcher (watcher) {
var id = watcher.id;
if (has[id] == null) {
has[id] = true;
if (!flushing) {
queue.push(watcher);
} else {
// if already flushing, splice the watcher based on its id
// if already past its id, it will be run next immediately.
var i = queue.length - 1;
while (i > index && queue[i].id > watcher.id) {
i--;
}
queue.splice(i + 1, 0, watcher);
}
// queue the flush
if (!waiting) {
waiting = true;
if ( true && !config.async) {
flushSchedulerQueue();
return
}
nextTick(flushSchedulerQueue);
}
}
}
/* */
var uid$2 = 0;
/**
* A watcher parses an expression, collects dependencies,
* and fires callback when the expression value changes.
* This is used for both the $watch() api and directives.
*/
var Watcher = function Watcher (
vm,
expOrFn,
cb,
options,
isRenderWatcher
) {
this.vm = vm;
if (isRenderWatcher) {
vm._watcher = this;
}
vm._watchers.push(this);
// options
if (options) {
this.deep = !!options.deep;
this.user = !!options.user;
this.lazy = !!options.lazy;
this.sync = !!options.sync;
this.before = options.before;
} else {
this.deep = this.user = this.lazy = this.sync = false;
}
this.cb = cb;
this.id = ++uid$2; // uid for batching
this.active = true;
this.dirty = this.lazy; // for lazy watchers
this.deps = [];
this.newDeps = [];
this.depIds = new _Set();
this.newDepIds = new _Set();
this.expression = true
? expOrFn.toString()
: undefined;
// parse expression for getter
if (typeof expOrFn === 'function') {
this.getter = expOrFn;
} else {
this.getter = parsePath(expOrFn);
if (!this.getter) {
this.getter = noop;
true && warn(
"Failed watching path: \"" + expOrFn + "\" " +
'Watcher only accepts simple dot-delimited paths. ' +
'For full control, use a function instead.',
vm
);
}
}
this.value = this.lazy
? undefined
: this.get();
};
/**
* Evaluate the getter, and re-collect dependencies.
*/
Watcher.prototype.get = function get () {
pushTarget(this);
var value;
var vm = this.vm;
try {
value = this.getter.call(vm, vm);
} catch (e) {
if (this.user) {
handleError(e, vm, ("getter for watcher \"" + (this.expression) + "\""));
} else {
throw e
}
} finally {
// "touch" every property so they are all tracked as
// dependencies for deep watching
if (this.deep) {
traverse(value);
}
popTarget();
this.cleanupDeps();
}
return value
};
/**
* Add a dependency to this directive.
*/
Watcher.prototype.addDep = function addDep (dep) {
var id = dep.id;
if (!this.newDepIds.has(id)) {
this.newDepIds.add(id);
this.newDeps.push(dep);
if (!this.depIds.has(id)) {
dep.addSub(this);
}
}
};
/**
* Clean up for dependency collection.
*/
Watcher.prototype.cleanupDeps = function cleanupDeps () {
var i = this.deps.length;
while (i--) {
var dep = this.deps[i];
if (!this.newDepIds.has(dep.id)) {
dep.removeSub(this);
}
}
var tmp = this.depIds;
this.depIds = this.newDepIds;
this.newDepIds = tmp;
this.newDepIds.clear();
tmp = this.deps;
this.deps = this.newDeps;
this.newDeps = tmp;
this.newDeps.length = 0;
};
/**
* Subscriber interface.
* Will be called when a dependency changes.
*/
Watcher.prototype.update = function update () {
/* istanbul ignore else */
if (this.lazy) {
this.dirty = true;
} else if (this.sync) {
this.run();
} else {
queueWatcher(this);
}
};
/**
* Scheduler job interface.
* Will be called by the scheduler.
*/
Watcher.prototype.run = function run () {
if (this.active) {
var value = this.get();
if (
value !== this.value ||
// Deep watchers and watchers on Object/Arrays should fire even
// when the value is the same, because the value may
// have mutated.
isObject(value) ||
this.deep
) {
// set new value
var oldValue = this.value;
this.value = value;
if (this.user) {
try {
this.cb.call(this.vm, value, oldValue);
} catch (e) {
handleError(e, this.vm, ("callback for watcher \"" + (this.expression) + "\""));
}
} else {
this.cb.call(this.vm, value, oldValue);
}
}
}
};
/**
* Evaluate the value of the watcher.
* This only gets called for lazy watchers.
*/
Watcher.prototype.evaluate = function evaluate () {
this.value = this.get();
this.dirty = false;
};
/**
* Depend on all deps collected by this watcher.
*/
Watcher.prototype.depend = function depend () {
var i = this.deps.length;
while (i--) {
this.deps[i].depend();
}
};
/**
* Remove self from all dependencies' subscriber list.
*/
Watcher.prototype.teardown = function teardown () {
if (this.active) {
// remove self from vm's watcher list
// this is a somewhat expensive operation so we skip it
// if the vm is being destroyed.
if (!this.vm._isBeingDestroyed) {
remove(this.vm._watchers, this);
}
var i = this.deps.length;
while (i--) {
this.deps[i].removeSub(this);
}
this.active = false;
}
};
/* */
var sharedPropertyDefinition = {
enumerable: true,
configurable: true,
get: noop,
set: noop
};
function proxy (target, sourceKey, key) {
sharedPropertyDefinition.get = function proxyGetter () {
return this[sourceKey][key]
};
sharedPropertyDefinition.set = function proxySetter (val) {
this[sourceKey][key] = val;
};
Object.defineProperty(target, key, sharedPropertyDefinition);
}
function initState (vm) {
vm._watchers = [];
var opts = vm.$options;
if (opts.props) { initProps(vm, opts.props); }
if (opts.methods) { initMethods(vm, opts.methods); }
if (opts.data) {
initData(vm);
} else {
observe(vm._data = {}, true /* asRootData */);
}
if (opts.computed) { initComputed(vm, opts.computed); }
if (opts.watch && opts.watch !== nativeWatch) {
initWatch(vm, opts.watch);
}
}
function initProps (vm, propsOptions) {
var propsData = vm.$options.propsData || {};
var props = vm._props = {};
// cache prop keys so that future props updates can iterate using Array
// instead of dynamic object key enumeration.
var keys = vm.$options._propKeys = [];
var isRoot = !vm.$parent;
// root instance props should be converted
if (!isRoot) {
toggleObserving(false);
}
var loop = function ( key ) {
keys.push(key);
var value = validateProp(key, propsOptions, propsData, vm);
/* istanbul ignore else */
if (true) {
var hyphenatedKey = hyphenate(key);
if (isReservedAttribute(hyphenatedKey) ||
config.isReservedAttr(hyphenatedKey)) {
warn(
("\"" + hyphenatedKey + "\" is a reserved attribute and cannot be used as component prop."),
vm
);
}
defineReactive$$1(props, key, value, function () {
if (!isRoot && !isUpdatingChildComponent) {
{
if(vm.mpHost === 'mp-baidu' || vm.mpHost === 'mp-kuaishou' || vm.mpHost === 'mp-xhs'){//百度、快手、小红书 observer 在 setData callback 之后触发,直接忽略该 warn
return
}
//fixed by xxxxxx __next_tick_pending,uni://form-field 时不告警
if(
key === 'value' &&
Array.isArray(vm.$options.behaviors) &&
vm.$options.behaviors.indexOf('uni://form-field') !== -1
){
return
}
if(vm._getFormData){
return
}
var $parent = vm.$parent;
while($parent){
if($parent.__next_tick_pending){
return
}
$parent = $parent.$parent;
}
}
warn(
"Avoid mutating a prop directly since the value will be " +
"overwritten whenever the parent component re-renders. " +
"Instead, use a data or computed property based on the prop's " +
"value. Prop being mutated: \"" + key + "\"",
vm
);
}
});
} else {}
// static props are already proxied on the component's prototype
// during Vue.extend(). We only need to proxy props defined at
// instantiation here.
if (!(key in vm)) {
proxy(vm, "_props", key);
}
};
for (var key in propsOptions) loop( key );
toggleObserving(true);
}
function initData (vm) {
var data = vm.$options.data;
data = vm._data = typeof data === 'function'
? getData(data, vm)
: data || {};
if (!isPlainObject(data)) {
data = {};
true && warn(
'data functions should return an object:\n' +
'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',
vm
);
}
// proxy data on instance
var keys = Object.keys(data);
var props = vm.$options.props;
var methods = vm.$options.methods;
var i = keys.length;
while (i--) {
var key = keys[i];
if (true) {
if (methods && hasOwn(methods, key)) {
warn(
("Method \"" + key + "\" has already been defined as a data property."),
vm
);
}
}
if (props && hasOwn(props, key)) {
true && warn(
"The data property \"" + key + "\" is already declared as a prop. " +
"Use prop default value instead.",
vm
);
} else if (!isReserved(key)) {
proxy(vm, "_data", key);
}
}
// observe data
observe(data, true /* asRootData */);
}
function getData (data, vm) {
// #7573 disable dep collection when invoking data getters
pushTarget();
try {
return data.call(vm, vm)
} catch (e) {
handleError(e, vm, "data()");
return {}
} finally {
popTarget();
}
}
var computedWatcherOptions = { lazy: true };
function initComputed (vm, computed) {
// $flow-disable-line
var watchers = vm._computedWatchers = Object.create(null);
// computed properties are just getters during SSR
var isSSR = isServerRendering();
for (var key in computed) {
var userDef = computed[key];
var getter = typeof userDef === 'function' ? userDef : userDef.get;
if ( true && getter == null) {
warn(
("Getter is missing for computed property \"" + key + "\"."),
vm
);
}
if (!isSSR) {
// create internal watcher for the computed property.
watchers[key] = new Watcher(
vm,
getter || noop,
noop,
computedWatcherOptions
);
}
// component-defined computed properties are already defined on the
// component prototype. We only need to define computed properties defined
// at instantiation here.
if (!(key in vm)) {
defineComputed(vm, key, userDef);
} else if (true) {
if (key in vm.$data) {
warn(("The computed property \"" + key + "\" is already defined in data."), vm);
} else if (vm.$options.props && key in vm.$options.props) {
warn(("The computed property \"" + key + "\" is already defined as a prop."), vm);
}
}
}
}
function defineComputed (
target,
key,
userDef
) {
var shouldCache = !isServerRendering();
if (typeof userDef === 'function') {
sharedPropertyDefinition.get = shouldCache
? createComputedGetter(key)
: createGetterInvoker(userDef);
sharedPropertyDefinition.set = noop;
} else {
sharedPropertyDefinition.get = userDef.get
? shouldCache && userDef.cache !== false
? createComputedGetter(key)
: createGetterInvoker(userDef.get)
: noop;
sharedPropertyDefinition.set = userDef.set || noop;
}
if ( true &&
sharedPropertyDefinition.set === noop) {
sharedPropertyDefinition.set = function () {
warn(
("Computed property \"" + key + "\" was assigned to but it has no setter."),
this
);
};
}
Object.defineProperty(target, key, sharedPropertyDefinition);
}
function createComputedGetter (key) {
return function computedGetter () {
var watcher = this._computedWatchers && this._computedWatchers[key];
if (watcher) {
if (watcher.dirty) {
watcher.evaluate();
}
if (Dep.SharedObject.target) {// fixed by xxxxxx
watcher.depend();
}
return watcher.value
}
}
}
function createGetterInvoker(fn) {
return function computedGetter () {
return fn.call(this, this)
}
}
function initMethods (vm, methods) {
var props = vm.$options.props;
for (var key in methods) {
if (true) {
if (typeof methods[key] !== 'function') {
warn(
"Method \"" + key + "\" has type \"" + (typeof methods[key]) + "\" in the component definition. " +
"Did you reference the function correctly?",
vm
);
}
if (props && hasOwn(props, key)) {
warn(
("Method \"" + key + "\" has already been defined as a prop."),
vm
);
}
if ((key in vm) && isReserved(key)) {
warn(
"Method \"" + key + "\" conflicts with an existing Vue instance method. " +
"Avoid defining component methods that start with _ or $."
);
}
}
vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key], vm);
}
}
function initWatch (vm, watch) {
for (var key in watch) {
var handler = watch[key];
if (Array.isArray(handler)) {
for (var i = 0; i < handler.length; i++) {
createWatcher(vm, key, handler[i]);
}
} else {
createWatcher(vm, key, handler);
}
}
}
function createWatcher (
vm,
expOrFn,
handler,
options
) {
if (isPlainObject(handler)) {
options = handler;
handler = handler.handler;
}
if (typeof handler === 'string') {
handler = vm[handler];
}
return vm.$watch(expOrFn, handler, options)
}
function stateMixin (Vue) {
// flow somehow has problems with directly declared definition object
// when using Object.defineProperty, so we have to procedurally build up
// the object here.
var dataDef = {};
dataDef.get = function () { return this._data };
var propsDef = {};
propsDef.get = function () { return this._props };
if (true) {
dataDef.set = function () {
warn(
'Avoid replacing instance root $data. ' +
'Use nested data properties instead.',
this
);
};
propsDef.set = function () {
warn("$props is readonly.", this);
};
}
Object.defineProperty(Vue.prototype, '$data', dataDef);
Object.defineProperty(Vue.prototype, '$props', propsDef);
Vue.prototype.$set = set;
Vue.prototype.$delete = del;
Vue.prototype.$watch = function (
expOrFn,
cb,
options
) {
var vm = this;
if (isPlainObject(cb)) {
return createWatcher(vm, expOrFn, cb, options)
}
options = options || {};
options.user = true;
var watcher = new Watcher(vm, expOrFn, cb, options);
if (options.immediate) {
try {
cb.call(vm, watcher.value);
} catch (error) {
handleError(error, vm, ("callback for immediate watcher \"" + (watcher.expression) + "\""));
}
}
return function unwatchFn () {
watcher.teardown();
}
};
}
/* */
var uid$3 = 0;
function initMixin (Vue) {
Vue.prototype._init = function (options) {
var vm = this;
// a uid
vm._uid = uid$3++;
var startTag, endTag;
/* istanbul ignore if */
if ( true && config.performance && mark) {
startTag = "vue-perf-start:" + (vm._uid);
endTag = "vue-perf-end:" + (vm._uid);
mark(startTag);
}
// a flag to avoid this being observed
vm._isVue = true;
// merge options
if (options && options._isComponent) {
// optimize internal component instantiation
// since dynamic options merging is pretty slow, and none of the
// internal component options needs special treatment.
initInternalComponent(vm, options);
} else {
vm.$options = mergeOptions(
resolveConstructorOptions(vm.constructor),
options || {},
vm
);
}
/* istanbul ignore else */
if (true) {
initProxy(vm);
} else {}
// expose real self
vm._self = vm;
initLifecycle(vm);
initEvents(vm);
initRender(vm);
callHook(vm, 'beforeCreate');
!vm._$fallback && initInjections(vm); // resolve injections before data/props
initState(vm);
!vm._$fallback && initProvide(vm); // resolve provide after data/props
!vm._$fallback && callHook(vm, 'created');
/* istanbul ignore if */
if ( true && config.performance && mark) {
vm._name = formatComponentName(vm, false);
mark(endTag);
measure(("vue " + (vm._name) + " init"), startTag, endTag);
}
if (vm.$options.el) {
vm.$mount(vm.$options.el);
}
};
}
function initInternalComponent (vm, options) {
var opts = vm.$options = Object.create(vm.constructor.options);
// doing this because it's faster than dynamic enumeration.
var parentVnode = options._parentVnode;
opts.parent = options.parent;
opts._parentVnode = parentVnode;
var vnodeComponentOptions = parentVnode.componentOptions;
opts.propsData = vnodeComponentOptions.propsData;
opts._parentListeners = vnodeComponentOptions.listeners;
opts._renderChildren = vnodeComponentOptions.children;
opts._componentTag = vnodeComponentOptions.tag;
if (options.render) {
opts.render = options.render;
opts.staticRenderFns = options.staticRenderFns;
}
}
function resolveConstructorOptions (Ctor) {
var options = Ctor.options;
if (Ctor.super) {
var superOptions = resolveConstructorOptions(Ctor.super);
var cachedSuperOptions = Ctor.superOptions;
if (superOptions !== cachedSuperOptions) {
// super option changed,
// need to resolve new options.
Ctor.superOptions = superOptions;
// check if there are any late-modified/attached options (#4976)
var modifiedOptions = resolveModifiedOptions(Ctor);
// update base extend options
if (modifiedOptions) {
extend(Ctor.extendOptions, modifiedOptions);
}
options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions);
if (options.name) {
options.components[options.name] = Ctor;
}
}
}
return options
}
function resolveModifiedOptions (Ctor) {
var modified;
var latest = Ctor.options;
var sealed = Ctor.sealedOptions;
for (var key in latest) {
if (latest[key] !== sealed[key]) {
if (!modified) { modified = {}; }
modified[key] = latest[key];
}
}
return modified
}
function Vue (options) {
if ( true &&
!(this instanceof Vue)
) {
warn('Vue is a constructor and should be called with the `new` keyword');
}
this._init(options);
}
initMixin(Vue);
stateMixin(Vue);
eventsMixin(Vue);
lifecycleMixin(Vue);
renderMixin(Vue);
/* */
function initUse (Vue) {
Vue.use = function (plugin) {
var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));
if (installedPlugins.indexOf(plugin) > -1) {
return this
}
// additional parameters
var args = toArray(arguments, 1);
args.unshift(this);
if (typeof plugin.install === 'function') {
plugin.install.apply(plugin, args);
} else if (typeof plugin === 'function') {
plugin.apply(null, args);
}
installedPlugins.push(plugin);
return this
};
}
/* */
function initMixin$1 (Vue) {
Vue.mixin = function (mixin) {
this.options = mergeOptions(this.options, mixin);
return this
};
}
/* */
function initExtend (Vue) {
/**
* Each instance constructor, including Vue, has a unique
* cid. This enables us to create wrapped "child
* constructors" for prototypal inheritance and cache them.
*/
Vue.cid = 0;
var cid = 1;
/**
* Class inheritance
*/
Vue.extend = function (extendOptions) {
extendOptions = extendOptions || {};
var Super = this;
var SuperId = Super.cid;
var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});
if (cachedCtors[SuperId]) {
return cachedCtors[SuperId]
}
var name = extendOptions.name || Super.options.name;
if ( true && name) {
validateComponentName(name);
}
var Sub = function VueComponent (options) {
this._init(options);
};
Sub.prototype = Object.create(Super.prototype);
Sub.prototype.constructor = Sub;
Sub.cid = cid++;
Sub.options = mergeOptions(
Super.options,
extendOptions
);
Sub['super'] = Super;
// For props and computed properties, we define the proxy getters on
// the Vue instances at extension time, on the extended prototype. This
// avoids Object.defineProperty calls for each instance created.
if (Sub.options.props) {
initProps$1(Sub);
}
if (Sub.options.computed) {
initComputed$1(Sub);
}
// allow further extension/mixin/plugin usage
Sub.extend = Super.extend;
Sub.mixin = Super.mixin;
Sub.use = Super.use;
// create asset registers, so extended classes
// can have their private assets too.
ASSET_TYPES.forEach(function (type) {
Sub[type] = Super[type];
});
// enable recursive self-lookup
if (name) {
Sub.options.components[name] = Sub;
}
// keep a reference to the super options at extension time.
// later at instantiation we can check if Super's options have
// been updated.
Sub.superOptions = Super.options;
Sub.extendOptions = extendOptions;
Sub.sealedOptions = extend({}, Sub.options);
// cache constructor
cachedCtors[SuperId] = Sub;
return Sub
};
}
function initProps$1 (Comp) {
var props = Comp.options.props;
for (var key in props) {
proxy(Comp.prototype, "_props", key);
}
}
function initComputed$1 (Comp) {
var computed = Comp.options.computed;
for (var key in computed) {
defineComputed(Comp.prototype, key, computed[key]);
}
}
/* */
function initAssetRegisters (Vue) {
/**
* Create asset registration methods.
*/
ASSET_TYPES.forEach(function (type) {
Vue[type] = function (
id,
definition
) {
if (!definition) {
return this.options[type + 's'][id]
} else {
/* istanbul ignore if */
if ( true && type === 'component') {
validateComponentName(id);
}
if (type === 'component' && isPlainObject(definition)) {
definition.name = definition.name || id;
definition = this.options._base.extend(definition);
}
if (type === 'directive' && typeof definition === 'function') {
definition = { bind: definition, update: definition };
}
this.options[type + 's'][id] = definition;
return definition
}
};
});
}
/* */
function getComponentName (opts) {
return opts && (opts.Ctor.options.name || opts.tag)
}
function matches (pattern, name) {
if (Array.isArray(pattern)) {
return pattern.indexOf(name) > -1
} else if (typeof pattern === 'string') {
return pattern.split(',').indexOf(name) > -1
} else if (isRegExp(pattern)) {
return pattern.test(name)
}
/* istanbul ignore next */
return false
}
function pruneCache (keepAliveInstance, filter) {
var cache = keepAliveInstance.cache;
var keys = keepAliveInstance.keys;
var _vnode = keepAliveInstance._vnode;
for (var key in cache) {
var cachedNode = cache[key];
if (cachedNode) {
var name = getComponentName(cachedNode.componentOptions);
if (name && !filter(name)) {
pruneCacheEntry(cache, key, keys, _vnode);
}
}
}
}
function pruneCacheEntry (
cache,
key,
keys,
current
) {
var cached$$1 = cache[key];
if (cached$$1 && (!current || cached$$1.tag !== current.tag)) {
cached$$1.componentInstance.$destroy();
}
cache[key] = null;
remove(keys, key);
}
var patternTypes = [String, RegExp, Array];
var KeepAlive = {
name: 'keep-alive',
abstract: true,
props: {
include: patternTypes,
exclude: patternTypes,
max: [String, Number]
},
created: function created () {
this.cache = Object.create(null);
this.keys = [];
},
destroyed: function destroyed () {
for (var key in this.cache) {
pruneCacheEntry(this.cache, key, this.keys);
}
},
mounted: function mounted () {
var this$1 = this;
this.$watch('include', function (val) {
pruneCache(this$1, function (name) { return matches(val, name); });
});
this.$watch('exclude', function (val) {
pruneCache(this$1, function (name) { return !matches(val, name); });
});
},
render: function render () {
var slot = this.$slots.default;
var vnode = getFirstComponentChild(slot);
var componentOptions = vnode && vnode.componentOptions;
if (componentOptions) {
// check pattern
var name = getComponentName(componentOptions);
var ref = this;
var include = ref.include;
var exclude = ref.exclude;
if (
// not included
(include && (!name || !matches(include, name))) ||
// excluded
(exclude && name && matches(exclude, name))
) {
return vnode
}
var ref$1 = this;
var cache = ref$1.cache;
var keys = ref$1.keys;
var key = vnode.key == null
// same constructor may get registered as different local components
// so cid alone is not enough (#3269)
? componentOptions.Ctor.cid + (componentOptions.tag ? ("::" + (componentOptions.tag)) : '')
: vnode.key;
if (cache[key]) {
vnode.componentInstance = cache[key].componentInstance;
// make current key freshest
remove(keys, key);
keys.push(key);
} else {
cache[key] = vnode;
keys.push(key);
// prune oldest entry
if (this.max && keys.length > parseInt(this.max)) {
pruneCacheEntry(cache, keys[0], keys, this._vnode);
}
}
vnode.data.keepAlive = true;
}
return vnode || (slot && slot[0])
}
};
var builtInComponents = {
KeepAlive: KeepAlive
};
/* */
function initGlobalAPI (Vue) {
// config
var configDef = {};
configDef.get = function () { return config; };
if (true) {
configDef.set = function () {
warn(
'Do not replace the Vue.config object, set individual fields instead.'
);
};
}
Object.defineProperty(Vue, 'config', configDef);
// exposed util methods.
// NOTE: these are not considered part of the public API - avoid relying on
// them unless you are aware of the risk.
Vue.util = {
warn: warn,
extend: extend,
mergeOptions: mergeOptions,
defineReactive: defineReactive$$1
};
Vue.set = set;
Vue.delete = del;
Vue.nextTick = nextTick;
// 2.6 explicit observable API
Vue.observable = function (obj) {
observe(obj);
return obj
};
Vue.options = Object.create(null);
ASSET_TYPES.forEach(function (type) {
Vue.options[type + 's'] = Object.create(null);
});
// this is used to identify the "base" constructor to extend all plain-object
// components with in Weex's multi-instance scenarios.
Vue.options._base = Vue;
extend(Vue.options.components, builtInComponents);
initUse(Vue);
initMixin$1(Vue);
initExtend(Vue);
initAssetRegisters(Vue);
}
initGlobalAPI(Vue);
Object.defineProperty(Vue.prototype, '$isServer', {
get: isServerRendering
});
Object.defineProperty(Vue.prototype, '$ssrContext', {
get: function get () {
/* istanbul ignore next */
return this.$vnode && this.$vnode.ssrContext
}
});
// expose FunctionalRenderContext for ssr runtime helper installation
Object.defineProperty(Vue, 'FunctionalRenderContext', {
value: FunctionalRenderContext
});
Vue.version = '2.6.11';
/**
* https://raw.githubusercontent.com/Tencent/westore/master/packages/westore/utils/diff.js
*/
var ARRAYTYPE = '[object Array]';
var OBJECTTYPE = '[object Object]';
var NULLTYPE = '[object Null]';
var UNDEFINEDTYPE = '[object Undefined]';
// const FUNCTIONTYPE = '[object Function]'
function diff(current, pre) {
var result = {};
syncKeys(current, pre);
_diff(current, pre, '', result);
return result
}
function syncKeys(current, pre) {
if (current === pre) { return }
var rootCurrentType = type(current);
var rootPreType = type(pre);
if (rootCurrentType == OBJECTTYPE && rootPreType == OBJECTTYPE) {
if(Object.keys(current).length >= Object.keys(pre).length){
for (var key in pre) {
var currentValue = current[key];
if (currentValue === undefined) {
current[key] = null;
} else {
syncKeys(currentValue, pre[key]);
}
}
}
} else if (rootCurrentType == ARRAYTYPE && rootPreType == ARRAYTYPE) {
if (current.length >= pre.length) {
pre.forEach(function (item, index) {
syncKeys(current[index], item);
});
}
}
}
function nullOrUndefined(currentType, preType) {
if(
(currentType === NULLTYPE || currentType === UNDEFINEDTYPE) &&
(preType === NULLTYPE || preType === UNDEFINEDTYPE)
) {
return false
}
return true
}
function _diff(current, pre, path, result) {
if (current === pre) { return }
var rootCurrentType = type(current);
var rootPreType = type(pre);
if (rootCurrentType == OBJECTTYPE) {
if (rootPreType != OBJECTTYPE || Object.keys(current).length < Object.keys(pre).length) {
setResult(result, path, current);
} else {
var loop = function ( key ) {
var currentValue = current[key];
var preValue = pre[key];
var currentType = type(currentValue);
var preType = type(preValue);
if (currentType != ARRAYTYPE && currentType != OBJECTTYPE) {
if (currentValue !== pre[key] && nullOrUndefined(currentType, preType)) {
setResult(result, (path == '' ? '' : path + ".") + key, currentValue);
}
} else if (currentType == ARRAYTYPE) {
if (preType != ARRAYTYPE) {
setResult(result, (path == '' ? '' : path + ".") + key, currentValue);
} else {
if (currentValue.length < preValue.length) {
setResult(result, (path == '' ? '' : path + ".") + key, currentValue);
} else {
currentValue.forEach(function (item, index) {
_diff(item, preValue[index], (path == '' ? '' : path + ".") + key + '[' + index + ']', result);
});
}
}
} else if (currentType == OBJECTTYPE) {
if (preType != OBJECTTYPE || Object.keys(currentValue).length < Object.keys(preValue).length) {
setResult(result, (path == '' ? '' : path + ".") + key, currentValue);
} else {
for (var subKey in currentValue) {
_diff(currentValue[subKey], preValue[subKey], (path == '' ? '' : path + ".") + key + '.' + subKey, result);
}
}
}
};
for (var key in current) loop( key );
}
} else if (rootCurrentType == ARRAYTYPE) {
if (rootPreType != ARRAYTYPE) {
setResult(result, path, current);
} else {
if (current.length < pre.length) {
setResult(result, path, current);
} else {
current.forEach(function (item, index) {
_diff(item, pre[index], path + '[' + index + ']', result);
});
}
}
} else {
setResult(result, path, current);
}
}
function setResult(result, k, v) {
// if (type(v) != FUNCTIONTYPE) {
result[k] = v;
// }
}
function type(obj) {
return Object.prototype.toString.call(obj)
}
/* */
function flushCallbacks$1(vm) {
if (vm.__next_tick_callbacks && vm.__next_tick_callbacks.length) {
if (Object({"NODE_ENV":"development","VUE_APP_DARK_MODE":"false","VUE_APP_NAME":"易加蓝牙助手","VUE_APP_PLATFORM":"mp-jd","BASE_URL":"/"}).VUE_APP_DEBUG) {
var mpInstance = vm.$scope;
console.log('[' + (+new Date) + '][' + (mpInstance.is || mpInstance.route) + '][' + vm._uid +
']:flushCallbacks[' + vm.__next_tick_callbacks.length + ']');
}
var copies = vm.__next_tick_callbacks.slice(0);
vm.__next_tick_callbacks.length = 0;
for (var i = 0; i < copies.length; i++) {
copies[i]();
}
}
}
function hasRenderWatcher(vm) {
return queue.find(function (watcher) { return vm._watcher === watcher; })
}
function nextTick$1(vm, cb) {
//1.nextTick 之前 已 setData 且 setData 还未回调完成
//2.nextTick 之前存在 render watcher
if (!vm.__next_tick_pending && !hasRenderWatcher(vm)) {
if(Object({"NODE_ENV":"development","VUE_APP_DARK_MODE":"false","VUE_APP_NAME":"易加蓝牙助手","VUE_APP_PLATFORM":"mp-jd","BASE_URL":"/"}).VUE_APP_DEBUG){
var mpInstance = vm.$scope;
console.log('[' + (+new Date) + '][' + (mpInstance.is || mpInstance.route) + '][' + vm._uid +
']:nextVueTick');
}
return nextTick(cb, vm)
}else{
if(Object({"NODE_ENV":"development","VUE_APP_DARK_MODE":"false","VUE_APP_NAME":"易加蓝牙助手","VUE_APP_PLATFORM":"mp-jd","BASE_URL":"/"}).VUE_APP_DEBUG){
var mpInstance$1 = vm.$scope;
console.log('[' + (+new Date) + '][' + (mpInstance$1.is || mpInstance$1.route) + '][' + vm._uid +
']:nextMPTick');
}
}
var _resolve;
if (!vm.__next_tick_callbacks) {
vm.__next_tick_callbacks = [];
}
vm.__next_tick_callbacks.push(function () {
if (cb) {
try {
cb.call(vm);
} catch (e) {
handleError(e, vm, 'nextTick');
}
} else if (_resolve) {
_resolve(vm);
}
});
// $flow-disable-line
if (!cb && typeof Promise !== 'undefined') {
return new Promise(function (resolve) {
_resolve = resolve;
})
}
}
/* */
function clearInstance(key, value) {
// 简易去除 Vue 和小程序组件实例
if (value) {
if (value._isVue || value.__v_isMPComponent) {
return {}
}
}
return value
}
function cloneWithData(vm) {
// 确保当前 vm 所有数据被同步
var ret = Object.create(null);
var dataKeys = [].concat(
Object.keys(vm._data || {}),
Object.keys(vm._computedWatchers || {}));
dataKeys.reduce(function(ret, key) {
ret[key] = vm[key];
return ret
}, ret);
// vue-composition-api
var compositionApiState = vm.__composition_api_state__ || vm.__secret_vfa_state__;
var rawBindings = compositionApiState && compositionApiState.rawBindings;
if (rawBindings) {
Object.keys(rawBindings).forEach(function (key) {
ret[key] = vm[key];
});
}
//TODO 需要把无用数据处理掉,比如 list=>l0 则 list 需要移除,否则多传输一份数据
Object.assign(ret, vm.$mp.data || {});
if (
Array.isArray(vm.$options.behaviors) &&
vm.$options.behaviors.indexOf('uni://form-field') !== -1
) { //form-field
ret['name'] = vm.name;
ret['value'] = vm.value;
}
return JSON.parse(JSON.stringify(ret, clearInstance))
}
var patch = function(oldVnode, vnode) {
var this$1 = this;
if (vnode === null) { //destroy
return
}
if (this.mpType === 'page' || this.mpType === 'component') {
var mpInstance = this.$scope;
var data = Object.create(null);
try {
data = cloneWithData(this);
} catch (err) {
console.error(err);
}
data.__webviewId__ = mpInstance.data.__webviewId__;
var mpData = Object.create(null);
Object.keys(data).forEach(function (key) { //仅同步 data 中有的数据
mpData[key] = mpInstance.data[key];
});
var diffData = this.$shouldDiffData === false ? data : diff(data, mpData);
if (Object.keys(diffData).length) {
if (Object({"NODE_ENV":"development","VUE_APP_DARK_MODE":"false","VUE_APP_NAME":"易加蓝牙助手","VUE_APP_PLATFORM":"mp-jd","BASE_URL":"/"}).VUE_APP_DEBUG) {
console.log('[' + (+new Date) + '][' + (mpInstance.is || mpInstance.route) + '][' + this._uid +
']差量更新',
JSON.stringify(diffData));
}
this.__next_tick_pending = true;
mpInstance.setData(diffData, function () {
this$1.__next_tick_pending = false;
flushCallbacks$1(this$1);
});
} else {
flushCallbacks$1(this);
}
}
};
/* */
function createEmptyRender() {
}
function mountComponent$1(
vm,
el,
hydrating
) {
if (!vm.mpType) {//main.js 中的 new Vue
return vm
}
if (vm.mpType === 'app') {
vm.$options.render = createEmptyRender;
}
if (!vm.$options.render) {
vm.$options.render = createEmptyRender;
if (true) {
/* istanbul ignore if */
if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') ||
vm.$options.el || el) {
warn(
'You are using the runtime-only build of Vue where the template ' +
'compiler is not available. Either pre-compile the templates into ' +
'render functions, or use the compiler-included build.',
vm
);
} else {
warn(
'Failed to mount component: template or render function not defined.',
vm
);
}
}
}
!vm._$fallback && callHook(vm, 'beforeMount');
var updateComponent = function () {
vm._update(vm._render(), hydrating);
};
// we set this to vm._watcher inside the watcher's constructor
// since the watcher's initial patch may call $forceUpdate (e.g. inside child
// component's mounted hook), which relies on vm._watcher being already defined
new Watcher(vm, updateComponent, noop, {
before: function before() {
if (vm._isMounted && !vm._isDestroyed) {
callHook(vm, 'beforeUpdate');
}
}
}, true /* isRenderWatcher */);
hydrating = false;
return vm
}
/* */
function renderClass (
staticClass,
dynamicClass
) {
if (isDef(staticClass) || isDef(dynamicClass)) {
return concat(staticClass, stringifyClass(dynamicClass))
}
/* istanbul ignore next */
return ''
}
function concat (a, b) {
return a ? b ? (a + ' ' + b) : a : (b || '')
}
function stringifyClass (value) {
if (Array.isArray(value)) {
return stringifyArray(value)
}
if (isObject(value)) {
return stringifyObject(value)
}
if (typeof value === 'string') {
return value
}
/* istanbul ignore next */
return ''
}
function stringifyArray (value) {
var res = '';
var stringified;
for (var i = 0, l = value.length; i < l; i++) {
if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') {
if (res) { res += ' '; }
res += stringified;
}
}
return res
}
function stringifyObject (value) {
var res = '';
for (var key in value) {
if (value[key]) {
if (res) { res += ' '; }
res += key;
}
}
return res
}
/* */
var parseStyleText = cached(function (cssText) {
var res = {};
var listDelimiter = /;(?![^(]*\))/g;
var propertyDelimiter = /:(.+)/;
cssText.split(listDelimiter).forEach(function (item) {
if (item) {
var tmp = item.split(propertyDelimiter);
tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim());
}
});
return res
});
// normalize possible array / string values into Object
function normalizeStyleBinding (bindingStyle) {
if (Array.isArray(bindingStyle)) {
return toObject(bindingStyle)
}
if (typeof bindingStyle === 'string') {
return parseStyleText(bindingStyle)
}
return bindingStyle
}
/* */
var MP_METHODS = ['createSelectorQuery', 'createIntersectionObserver', 'selectAllComponents', 'selectComponent'];
function getTarget(obj, path) {
var parts = path.split('.');
var key = parts[0];
if (key.indexOf('__$n') === 0) { //number index
key = parseInt(key.replace('__$n', ''));
}
if (parts.length === 1) {
return obj[key]
}
return getTarget(obj[key], parts.slice(1).join('.'))
}
function internalMixin(Vue) {
Vue.config.errorHandler = function(err, vm, info) {
Vue.util.warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);
console.error(err);
/* eslint-disable no-undef */
var app = typeof getApp === 'function' && getApp();
if (app && app.onError) {
app.onError(err);
}
};
var oldEmit = Vue.prototype.$emit;
Vue.prototype.$emit = function(event) {
if (this.$scope && event) {
var triggerEvent = this.$scope['_triggerEvent'] || this.$scope['triggerEvent'];
if (triggerEvent) {
try {
triggerEvent.call(this.$scope, event, {
__args__: toArray(arguments, 1)
});
} catch (error) {
}
}
}
return oldEmit.apply(this, arguments)
};
Vue.prototype.$nextTick = function(fn) {
return nextTick$1(this, fn)
};
MP_METHODS.forEach(function (method) {
Vue.prototype[method] = function(args) {
if (this.$scope && this.$scope[method]) {
return this.$scope[method](args)
}
// mp-alipay
if (typeof my === 'undefined') {
return
}
if (method === 'createSelectorQuery') {
/* eslint-disable no-undef */
return my.createSelectorQuery(args)
} else if (method === 'createIntersectionObserver') {
/* eslint-disable no-undef */
return my.createIntersectionObserver(args)
}
// TODO mp-alipay 暂不支持 selectAllComponents,selectComponent
};
});
Vue.prototype.__init_provide = initProvide;
Vue.prototype.__init_injections = initInjections;
Vue.prototype.__call_hook = function(hook, args) {
var vm = this;
// #7573 disable dep collection when invoking lifecycle hooks
pushTarget();
var handlers = vm.$options[hook];
var info = hook + " hook";
var ret;
if (handlers) {
for (var i = 0, j = handlers.length; i < j; i++) {
ret = invokeWithErrorHandling(handlers[i], vm, args ? [args] : null, vm, info);
}
}
if (vm._hasHookEvent) {
vm.$emit('hook:' + hook, args);
}
popTarget();
return ret
};
Vue.prototype.__set_model = function(target, key, value, modifiers) {
if (Array.isArray(modifiers)) {
if (modifiers.indexOf('trim') !== -1) {
value = value.trim();
}
if (modifiers.indexOf('number') !== -1) {
value = this._n(value);
}
}
if (!target) {
target = this;
}
// 解决动态属性添加
Vue.set(target, key, value);
};
Vue.prototype.__set_sync = function(target, key, value) {
if (!target) {
target = this;
}
// 解决动态属性添加
Vue.set(target, key, value);
};
Vue.prototype.__get_orig = function(item) {
if (isPlainObject(item)) {
return item['$orig'] || item
}
return item
};
Vue.prototype.__get_value = function(dataPath, target) {
return getTarget(target || this, dataPath)
};
Vue.prototype.__get_class = function(dynamicClass, staticClass) {
return renderClass(staticClass, dynamicClass)
};
Vue.prototype.__get_style = function(dynamicStyle, staticStyle) {
if (!dynamicStyle && !staticStyle) {
return ''
}
var dynamicStyleObj = normalizeStyleBinding(dynamicStyle);
var styleObj = staticStyle ? extend(staticStyle, dynamicStyleObj) : dynamicStyleObj;
return Object.keys(styleObj).map(function (name) { return ((hyphenate(name)) + ":" + (styleObj[name])); }).join(';')
};
Vue.prototype.__map = function(val, iteratee) {
//TODO 暂不考虑 string
var ret, i, l, keys, key;
if (Array.isArray(val)) {
ret = new Array(val.length);
for (i = 0, l = val.length; i < l; i++) {
ret[i] = iteratee(val[i], i);
}
return ret
} else if (isObject(val)) {
keys = Object.keys(val);
ret = Object.create(null);
for (i = 0, l = keys.length; i < l; i++) {
key = keys[i];
ret[key] = iteratee(val[key], key, i);
}
return ret
} else if (typeof val === 'number') {
ret = new Array(val);
for (i = 0, l = val; i < l; i++) {
// 第一个参数暂时仍和小程序一致
ret[i] = iteratee(i, i);
}
return ret
}
return []
};
}
/* */
var LIFECYCLE_HOOKS$1 = [
//App
'onLaunch',
'onShow',
'onHide',
'onUniNViewMessage',
'onPageNotFound',
'onThemeChange',
'onError',
'onUnhandledRejection',
//Page
'onInit',
'onLoad',
// 'onShow',
'onReady',
// 'onHide',
'onUnload',
'onPullDownRefresh',
'onReachBottom',
'onTabItemTap',
'onAddToFavorites',
'onShareTimeline',
'onShareAppMessage',
'onResize',
'onPageScroll',
'onNavigationBarButtonTap',
'onBackPress',
'onNavigationBarSearchInputChanged',
'onNavigationBarSearchInputConfirmed',
'onNavigationBarSearchInputClicked',
//Component
// 'onReady', // 兼容旧版本,应该移除该事件
'onPageShow',
'onPageHide',
'onPageResize',
'onUploadDouyinVideo'
];
function lifecycleMixin$1(Vue) {
//fixed vue-class-component
var oldExtend = Vue.extend;
Vue.extend = function(extendOptions) {
extendOptions = extendOptions || {};
var methods = extendOptions.methods;
if (methods) {
Object.keys(methods).forEach(function (methodName) {
if (LIFECYCLE_HOOKS$1.indexOf(methodName)!==-1) {
extendOptions[methodName] = methods[methodName];
delete methods[methodName];
}
});
}
return oldExtend.call(this, extendOptions)
};
var strategies = Vue.config.optionMergeStrategies;
var mergeHook = strategies.created;
LIFECYCLE_HOOKS$1.forEach(function (hook) {
strategies[hook] = mergeHook;
});
Vue.prototype.__lifecycle_hooks__ = LIFECYCLE_HOOKS$1;
}
/* */
// install platform patch function
Vue.prototype.__patch__ = patch;
// public mount method
Vue.prototype.$mount = function(
el ,
hydrating
) {
return mountComponent$1(this, el, hydrating)
};
lifecycleMixin$1(Vue);
internalMixin(Vue);
/* */
/* harmony default export */ __webpack_exports__["default"] = (Vue);
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../webpack/buildin/global.js */ 2)))
/***/ }),
/* 25 */
/*!**************************************************************************!*\
!*** C:/Users/mofan/Desktop/eciot-bletool for uni-app/易加蓝牙助手/pages.json ***!
\**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/***/ }),
/* 26 */,
/* 27 */,
/* 28 */,
/* 29 */,
/* 30 */,
/* 31 */
/*!**********************************************************************************************************!*\
!*** ./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/runtime/componentNormalizer.js ***!
\**********************************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return normalizeComponent; });
/* globals __VUE_SSR_CONTEXT__ */
// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).
// This module is a runtime utility for cleaner component module output and will
// be included in the final webpack user bundle.
function normalizeComponent (
scriptExports,
render,
staticRenderFns,
functionalTemplate,
injectStyles,
scopeId,
moduleIdentifier, /* server only */
shadowMode, /* vue-cli only */
components, // fixed by xxxxxx auto components
renderjs // fixed by xxxxxx renderjs
) {
// Vue.extend constructor export interop
var options = typeof scriptExports === 'function'
? scriptExports.options
: scriptExports
// fixed by xxxxxx auto components
if (components) {
if (!options.components) {
options.components = {}
}
var hasOwn = Object.prototype.hasOwnProperty
for (var name in components) {
if (hasOwn.call(components, name) && !hasOwn.call(options.components, name)) {
options.components[name] = components[name]
}
}
}
// fixed by xxxxxx renderjs
if (renderjs) {
(renderjs.beforeCreate || (renderjs.beforeCreate = [])).unshift(function() {
this[renderjs.__module] = this
});
(options.mixins || (options.mixins = [])).push(renderjs)
}
// render functions
if (render) {
options.render = render
options.staticRenderFns = staticRenderFns
options._compiled = true
}
// functional template
if (functionalTemplate) {
options.functional = true
}
// scopedId
if (scopeId) {
options._scopeId = 'data-v-' + scopeId
}
var hook
if (moduleIdentifier) { // server build
hook = function (context) {
// 2.3 injection
context =
context || // cached call
(this.$vnode && this.$vnode.ssrContext) || // stateful
(this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional
// 2.2 with runInNewContext: true
if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {
context = __VUE_SSR_CONTEXT__
}
// inject component styles
if (injectStyles) {
injectStyles.call(this, context)
}
// register component module identifier for async chunk inferrence
if (context && context._registeredComponents) {
context._registeredComponents.add(moduleIdentifier)
}
}
// used by ssr in case component is cached and beforeCreate
// never gets called
options._ssrRegister = hook
} else if (injectStyles) {
hook = shadowMode
? function () { injectStyles.call(this, this.$root.$options.shadowRoot) }
: injectStyles
}
if (hook) {
if (options.functional) {
// for template-only hot-reload because in that case the render fn doesn't
// go through the normalizer
options._injectStyles = hook
// register for functioal component in vue file
var originalRender = options.render
options.render = function renderWithStyleInjection (h, context) {
hook.call(context)
return originalRender(h, context)
}
} else {
// inject component registration as beforeCreate hook
var existing = options.beforeCreate
options.beforeCreate = existing
? [].concat(existing, hook)
: [hook]
}
}
return {
exports: scriptExports,
options: options
}
}
/***/ }),
/* 32 */,
/* 33 */,
/* 34 */,
/* 35 */,
/* 36 */,
/* 37 */,
/* 38 */
/*!*****************************************************************************!*\
!*** C:/Users/mofan/Desktop/eciot-bletool for uni-app/易加蓝牙助手/utils/ecUI.js ***!
\*****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(uni) {var showModal = function showModal(title, content, cb) {
uni.showModal({
title: title,
content: content,
showCancel: false,
complete: function complete() {
if (cb) cb();
}
});
};
var showLoading = function showLoading(title) {
uni.showLoading({
title: title,
mask: true
});
};
var hideLoading = function hideLoading() {
uni.hideLoading();
};
module.exports = {
showModal: showModal,
showLoading: showLoading,
hideLoading: hideLoading
};
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-jd/dist/index.js */ 1)["default"]))
/***/ }),
/* 39 */
/*!************************************************************************************!*\
!*** C:/Users/mofan/Desktop/eciot-bletool for uni-app/易加蓝牙助手/utils/ecBLE/ecBLE.js ***!
\************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
module.exports = __webpack_require__(/*! ./ecBLEJD.js */ 40);
/***/ }),
/* 40 */
/*!**************************************************************************************!*\
!*** C:/Users/mofan/Desktop/eciot-bletool for uni-app/易加蓝牙助手/utils/ecBLE/ecBLEJD.js ***!
\**************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var _regeneratorRuntime = __webpack_require__(/*! @babel/runtime/regenerator */ 41);
var _asyncToGenerator = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ 43);
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(_e) { throw _e; }, 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(_e2) { didErr = true; err = _e2; }, 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; }
var logEnable = false;
var isAndroid = false;
var ecBluetoothAdapterStateChangeCallback = function ecBluetoothAdapterStateChangeCallback() {};
var ecBLEConnectionStateChangeCallback = function ecBLEConnectionStateChangeCallback() {};
var ecDeviceId = '';
var ecGattServerUUID = '';
var ecGattServerUUIDOption1 = '0000FFF0-0000-1000-8000-00805F9B34FB';
var ecGattServerUUIDOption2 = 'FFF0';
var ecGattCharacteristicWriteUUID = '';
var ecGattCharacteristicWriteUUIDOption1 = '0000FFF2-0000-1000-8000-00805F9B34FB';
var ecGattCharacteristicWriteUUIDOption2 = 'FFF2';
var log = function log(data) {
if (logEnable) {
console.log('[eciot]:' + JSON.stringify(data));
}
};
var onBluetoothAdapterStateChange = function onBluetoothAdapterStateChange(cb) {
ecBluetoothAdapterStateChangeCallback = cb;
};
// const getSetting = () => {
// return new Promise(function (resolve, reject) {
// jd.getSetting({
// success(res) {
// log(res);
// if (res.authSetting && res.authSetting['scope.bluetooth']) {
// resolve({
// ok: true,
// errCode: 0,
// errMsg: ''
// });
// } else {
// resolve({
// ok: false,
// errCode: 30001,
// errMsg: 'getSetting fail'
// });
// }
// },
// fail(res) {
// log(res);
// resolve({
// ok: false,
// errCode: res.errCode ? res.errCode : 30000,
// errMsg: res.errMsg ? res.errMsg : 'getSetting fail'
// });
// }
// });
// });
// };
// const authorize = () => {
// return new Promise(function (resolve, reject) {
// jd.authorize({
// scope: 'scope.bluetooth',
// success(res) {
// log(res);
// resolve({
// ok: true,
// errCode: 0,
// errMsg: ''
// });
// },
// fail(res) {
// log(res);
// // {"errMsg":"authorize:fail:auth deny"}
// resolve({
// ok: false,
// errCode: 30000,
// errMsg: res.errMsg
// });
// }
// });
// });
// };
var _openBluetoothAdapter = function _openBluetoothAdapter() {
return new Promise(function (resolve, reject) {
jd.openBluetoothAdapter({
success: function success(res) {
log(res);
// {errno: 0, errMsg: "openBluetoothAdapter:ok"}
resolve({
ok: true,
errCode: 0,
errMsg: ''
});
},
fail: function fail(res) {
log(res);
resolve({
ok: false,
errCode: res.errCode ? res.errCode : 30000,
errMsg: res.errMsg
});
}
});
});
};
var openBluetoothAdapter = /*#__PURE__*/function () {
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
var systemInfo, openRes;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
// await _openBluetoothAdapter()
systemInfo = jd.getSystemInfoSync();
log(systemInfo);
if (systemInfo.platform.toLowerCase() === 'android') {
isAndroid = true;
}
// if (!systemInfo.bluetoothEnabled) {
// ecBluetoothAdapterStateChangeCallback({
// ok: false,
// errCode: 30001,
// errMsg: '请打开系统蓝牙开关'
// });
// return;
// }
// if (isAndroid && !systemInfo.locationEnabled) {
// ecBluetoothAdapterStateChangeCallback({
// ok: false,
// errCode: 30002,
// errMsg: '请打开系统定位开关'
// });
// return;
// }
// if (isAndroid && !systemInfo.locationAuthorized) {
// ecBluetoothAdapterStateChangeCallback({
// ok: false,
// errCode: 30003,
// errMsg: '请打开微信定位权限,允许微信使用您的位置信息'
// });
// return;
// }
// const setting = await getSetting(); //小程序蓝牙权限
// if (!setting.ok) {
// const authRes = await authorize();
// if (!authRes.ok) {
// ecBluetoothAdapterStateChangeCallback({
// ok: false,
// errCode: 30004,
// errMsg: '请打开小程序蓝牙开关,点击右上角三个点,然后点击设置'
// });
// return;
// }
// }
jd.offBluetoothAdapterStateChange();
jd.onBluetoothAdapterStateChange(function (res) {
log(res); // {available: true, discovering: true}
if (!res.available) {
ecBluetoothAdapterStateChangeCallback({
ok: false,
errCode: 30005,
errMsg: '蓝牙适配器不可用'
});
}
});
_context.next = 7;
return _openBluetoothAdapter();
case 7:
openRes = _context.sent;
ecBluetoothAdapterStateChangeCallback(openRes);
case 9:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return function openBluetoothAdapter() {
return _ref.apply(this, arguments);
};
}();
var onBluetoothDeviceFound = function onBluetoothDeviceFound(cb) {
jd.offBluetoothDeviceFound();
jd.onBluetoothDeviceFound(function (res) {
// log(res);
var device = res.devices[0];
var name = device.name ? device.name : device.localName;
if (!name) {
return;
}
var id = device.deviceId;
var rssi = device.RSSI;
cb({
id: id,
name: name,
rssi: rssi
});
});
};
var startBluetoothDevicesDiscovery = function startBluetoothDevicesDiscovery() {
jd.startBluetoothDevicesDiscovery({
//services: [ecServerId],
allowDuplicatesKey: true,
powerLevel: 'high',
complete: function complete(res) {
log(res);
}
});
};
var stopBluetoothDevicesDiscovery = function stopBluetoothDevicesDiscovery() {
jd.stopBluetoothDevicesDiscovery({
complete: function complete(res) {
// {errno: 0, errMsg: "stopBluetoothDevicesDiscovery:ok", isDiscovering: false}
log(res);
}
});
};
var onBLEConnectionStateChange = function onBLEConnectionStateChange(cb) {
ecBLEConnectionStateChangeCallback = cb;
};
var _createBLEConnection = function _createBLEConnection() {
return new Promise(function (resolve, reject) {
jd.createBLEConnection({
deviceId: ecDeviceId,
success: function success(res) {
log(res);
// {"errno":0,"errCode":0,"errMsg":"createBLEConnection:ok"}
resolve({
ok: true,
errCode: 0,
errMsg: ''
});
},
fail: function fail(res) {
log(res);
// {"errno":1001,"errMsg":"createBLEConnection:fail parameter error: parameter.deviceId should be String instead of Undefined;"}
resolve({
ok: false,
errCode: res.errCode ? res.errCode : res.errno,
errMsg: res.errMsg
});
}
});
if (!isAndroid) {
setTimeout(function () {
jd.createBLEConnection({
deviceId: ecDeviceId,
success: function success(res) {
log(res);
// {"errno":0,"errCode":0,"errMsg":"createBLEConnection:ok"}
resolve({
ok: true,
errCode: 0,
errMsg: ''
});
},
fail: function fail(res) {
log(res);
// {"errno":1001,"errMsg":"createBLEConnection:fail parameter error: parameter.deviceId should be String instead of Undefined;"}
resolve({
ok: false,
errCode: res.errCode ? res.errCode : res.errno,
errMsg: res.errMsg
});
}
});
}, 1000);
}
});
};
var getBLEDeviceServices = function getBLEDeviceServices() {
return new Promise(function (resolve, reject) {
jd.getBLEDeviceServices({
deviceId: ecDeviceId,
success: function success(res) {
log(res);
//{"services":[{"uuid":"0000FFF0-0000-1000-8000-00805F9B34FB","isPrimary":true}],"errCode":0,"errno":0,"errMsg":"getBLEDeviceServices:ok"}
// {"errno":0,"deviceId":"7C7E20F2-CB75-6DA8-F8DF-FFF702B0D63F","services":[{"isPrimary":true,"uuid":"0000FFF0-0000-1000-8000-00805F9B34FB"}],"errMsg":"getBLEDeviceServices:ok","errCode":0}
resolve({
ok: true,
errCode: 0,
errMsg: '',
services: res.services
});
},
fail: function fail(res) {
log(res);
resolve({
ok: false,
errCode: res.errCode,
errMsg: res.errMsg
});
}
});
});
};
var getBLEDeviceCharacteristics = function getBLEDeviceCharacteristics(serviceId) {
return new Promise(function (resolve, reject) {
jd.getBLEDeviceCharacteristics({
deviceId: ecDeviceId,
serviceId: serviceId,
success: function success(res) {
log(res);
// {"characteristics":[{"uuid":"0000FFF2-0000-1000-8000-00805F9B34FB","handle":3,"properties":{"read":false,"write":true,"notify":false,"indicate":false,"writeNoResponse":true,"writeDefault":true}},{"uuid":"0000FFF1-0000-1000-8000-00805F9B34FB","handle":5,"properties":{"read":true,"write":true,"notify":true,"indicate":false,"writeNoResponse":true,"writeDefault":true}}],"errCode":0,"errno":0,"errMsg":"getBLEDeviceCharacteristics:ok"}
// {"characteristics":[{"properties":{"writeDefault":true,"notify":false,"write":true,"indicate":false,"read":false,"writeNoResponse":true},"uuid":"0000FFF2-0000-1000-8000-00805F9B34FB"},{"properties":{"writeDefault":true,"notify":true,"write":true,"indicate":false,"read":true,"writeNoResponse":true},"uuid":"0000FFF1-0000-1000-8000-00805F9B34FB"}],"deviceId":"7C7E20F2-CB75-6DA8-F8DF-FFF702B0D63F","serviceId":"0000FFF0-0000-1000-8000-00805F9B34FB","errno":0,"errMsg":"getBLEDeviceCharacteristics:ok","errCode":0}
resolve({
ok: true,
errCode: 0,
errMsg: '',
characteristics: res.characteristics
});
},
fail: function fail(res) {
log(res);
resolve({
ok: false,
errCode: res.errCode,
errMsg: res.errMsg
});
}
});
});
};
var notifyBLECharacteristicValueChange = function notifyBLECharacteristicValueChange(serviceId, characteristicId) {
return new Promise(function (resolve, reject) {
jd.notifyBLECharacteristicValueChange({
state: true,
deviceId: ecDeviceId,
serviceId: serviceId,
characteristicId: characteristicId,
success: function success(res) {
log(res);
// {"errCode":0,"errno":0,"errMsg":"notifyBLECharacteristicValueChange:ok"}
resolve({
ok: true,
errCode: 0,
errMsg: ''
});
},
fail: function fail(res) {
log(res);
resolve({
ok: false,
errCode: res.errCode,
errMsg: res.errMsg
});
}
});
});
};
var setBLEMTU = function setBLEMTU(mtu) {
return new Promise(function (resolve, reject) {
jd.setBLEMTU({
deviceId: ecDeviceId,
mtu: mtu,
success: function success(res) {
log(res);
// {"errMsg":"setBLEMTU:ok","errno":0,"errCode":0,"mtu":50}
resolve({
ok: true,
errCode: 0,
errMsg: ''
});
},
fail: function fail(res) {
log(res);
// {"errCode":-1,"errno":1500104,"errMsg":"setBLEMTU:fail:internal error"}
resolve({
ok: false,
errCode: res.errCode,
errMsg: res.errMsg
});
}
});
});
};
//和设备建立连接
var createBLEConnection = /*#__PURE__*/function () {
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(id) {
var res;
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
ecDeviceId = id;
jd.offBLEConnectionStateChange();
jd.onBLEConnectionStateChange( /*#__PURE__*/function () {
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(res) {
var servicesResult, _iterator, _step, service, characteristicsResult, _iterator2, _step2, characteristic, notifyResult;
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
log(res);
// {"deviceId":"EC:22:05:13:78:49","connected":true}
if (!res.connected) {
_context2.next = 62;
break;
}
_context2.next = 4;
return getBLEDeviceServices();
case 4:
servicesResult = _context2.sent;
if (servicesResult.ok) {
_context2.next = 9;
break;
}
ecBLEConnectionStateChangeCallback(servicesResult);
closeBLEConnection();
return _context2.abrupt("return");
case 9:
_iterator = _createForOfIteratorHelper(servicesResult.services);
_context2.prev = 10;
_iterator.s();
case 12:
if ((_step = _iterator.n()).done) {
_context2.next = 48;
break;
}
service = _step.value;
if (service.uuid.toUpperCase() === ecGattServerUUIDOption1 || service.uuid.toUpperCase() === ecGattServerUUIDOption2) {
ecGattServerUUID = service.uuid;
}
_context2.next = 17;
return getBLEDeviceCharacteristics(service.uuid);
case 17:
characteristicsResult = _context2.sent;
if (characteristicsResult.ok) {
_context2.next = 22;
break;
}
ecBLEConnectionStateChangeCallback(characteristicsResult);
closeBLEConnection();
return _context2.abrupt("return");
case 22:
_iterator2 = _createForOfIteratorHelper(characteristicsResult.characteristics);
_context2.prev = 23;
_iterator2.s();
case 25:
if ((_step2 = _iterator2.n()).done) {
_context2.next = 38;
break;
}
characteristic = _step2.value;
if (!(characteristic.properties && characteristic.properties.notify)) {
_context2.next = 35;
break;
}
_context2.next = 30;
return notifyBLECharacteristicValueChange(service.uuid, characteristic.uuid);
case 30:
notifyResult = _context2.sent;
if (notifyResult.ok) {
_context2.next = 35;
break;
}
ecBLEConnectionStateChangeCallback({
ok: false,
errCode: 30000,
errMsg: 'notify error'
});
closeBLEConnection();
return _context2.abrupt("return");
case 35:
if (characteristic.uuid.toUpperCase() === ecGattCharacteristicWriteUUIDOption1 || characteristic.uuid.toUpperCase() === ecGattCharacteristicWriteUUIDOption2) {
ecGattCharacteristicWriteUUID = characteristic.uuid;
}
case 36:
_context2.next = 25;
break;
case 38:
_context2.next = 43;
break;
case 40:
_context2.prev = 40;
_context2.t0 = _context2["catch"](23);
_iterator2.e(_context2.t0);
case 43:
_context2.prev = 43;
_iterator2.f();
return _context2.finish(43);
case 46:
_context2.next = 12;
break;
case 48:
_context2.next = 53;
break;
case 50:
_context2.prev = 50;
_context2.t1 = _context2["catch"](10);
_iterator.e(_context2.t1);
case 53:
_context2.prev = 53;
_iterator.f();
return _context2.finish(53);
case 56:
if (!isAndroid) {
_context2.next = 59;
break;
}
_context2.next = 59;
return setBLEMTU(247);
case 59:
ecBLEConnectionStateChangeCallback({
ok: true,
errCode: 0,
errMsg: ''
});
_context2.next = 63;
break;
case 62:
ecBLEConnectionStateChangeCallback({
ok: false,
errCode: 0,
errMsg: 'disconnect'
});
case 63:
case "end":
return _context2.stop();
}
}
}, _callee2, null, [[10, 50, 53, 56], [23, 40, 43, 46]]);
}));
return function (_x2) {
return _ref3.apply(this, arguments);
};
}());
_context3.next = 5;
return _createBLEConnection();
case 5:
res = _context3.sent;
if (!res.ok) {
ecBLEConnectionStateChangeCallback(res);
}
case 7:
case "end":
return _context3.stop();
}
}
}, _callee3);
}));
return function createBLEConnection(_x) {
return _ref2.apply(this, arguments);
};
}();
//关闭当前连接
var closeBLEConnection = function closeBLEConnection() {
jd.closeBLEConnection({
deviceId: ecDeviceId,
complete: function complete(res) {
log(res);
}
});
};
var onBLECharacteristicValueChange = function onBLECharacteristicValueChange(cb) {
jd.offBLECharacteristicValueChange();
jd.onBLECharacteristicValueChange(function (res) {
log(res);
var x = new Uint8Array(res.value);
log(x);
var str = utf8BytesToStr(x);
var strHex = '';
for (var i = 0; i < x.length; i++) {
strHex = strHex + x[i].toString(16).padStart(2, '0').toUpperCase();
}
log(str);
log(strHex);
cb(str, strHex);
});
};
var _writeBLECharacteristicValue = function _writeBLECharacteristicValue(buffer) {
return new Promise(function (resolve, reject) {
jd.writeBLECharacteristicValue({
deviceId: ecDeviceId,
serviceId: ecGattServerUUID,
characteristicId: ecGattCharacteristicWriteUUID,
value: buffer,
writeType: 'writeNoResponse',
success: function success(res) {
log(res);
// {"errno":0,"errCode":0,"errMsg":"writeBLECharacteristicValue:ok"}
resolve({
ok: true,
errCode: 0,
errMsg: ''
});
},
fail: function fail(res) {
log(res);
resolve({
ok: false,
errCode: res.errCode,
errMsg: res.errMsg
});
}
});
});
};
var writeBLECharacteristicValue = /*#__PURE__*/function () {
var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(str, isHex) {
var buffer, x, i;
return _regeneratorRuntime.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
if (!(str.length === 0)) {
_context4.next = 2;
break;
}
return _context4.abrupt("return", {
ok: false,
errCode: 30000,
errMsg: 'data is null'
});
case 2:
if (isHex) {
buffer = new ArrayBuffer(str.length / 2);
x = new Uint8Array(buffer);
for (i = 0; i < x.length; i++) {
x[i] = parseInt(str.substr(2 * i, 2), 16);
}
} else {
buffer = new Uint8Array(strToUtf8Bytes(str)).buffer;
}
_context4.next = 5;
return _writeBLECharacteristicValue(buffer);
case 5:
return _context4.abrupt("return", _context4.sent);
case 6:
case "end":
return _context4.stop();
}
}
}, _callee4);
}));
return function writeBLECharacteristicValue(_x3, _x4) {
return _ref4.apply(this, arguments);
};
}();
var utf8BytesToStr = function utf8BytesToStr(utf8Bytes) {
var unicodeStr = '';
for (var pos = 0; pos < utf8Bytes.length;) {
var flag = utf8Bytes[pos];
var unicode = 0;
if (flag >>> 7 === 0) {
unicodeStr += String.fromCharCode(utf8Bytes[pos]);
pos += 1;
}
// else if ((flag & 0xFC) === 0xFC) {
// unicode = (utf8Bytes[pos] & 0x3) << 30
// unicode |= (utf8Bytes[pos + 1] & 0x3F) << 24
// unicode |= (utf8Bytes[pos + 2] & 0x3F) << 18
// unicode |= (utf8Bytes[pos + 3] & 0x3F) << 12
// unicode |= (utf8Bytes[pos + 4] & 0x3F) << 6
// unicode |= (utf8Bytes[pos + 5] & 0x3F)
// unicodeStr += String.fromCharCode(unicode)
// pos += 6
// }
// else if ((flag & 0xF8) === 0xF8) {
// unicode = (utf8Bytes[pos] & 0x7) << 24
// unicode |= (utf8Bytes[pos + 1] & 0x3F) << 18
// unicode |= (utf8Bytes[pos + 2] & 0x3F) << 12
// unicode |= (utf8Bytes[pos + 3] & 0x3F) << 6
// unicode |= (utf8Bytes[pos + 4] & 0x3F)
// unicodeStr += String.fromCharCode(unicode)
// pos += 5
// }
else if ((flag & 0xf0) === 0xf0) {
unicode = (utf8Bytes[pos] & 0xf) << 18;
unicode |= (utf8Bytes[pos + 1] & 0x3f) << 12;
unicode |= (utf8Bytes[pos + 2] & 0x3f) << 6;
unicode |= utf8Bytes[pos + 3] & 0x3f;
unicodeStr += String.fromCharCode(unicode);
pos += 4;
} else if ((flag & 0xe0) === 0xe0) {
unicode = (utf8Bytes[pos] & 0x1f) << 12;
unicode |= (utf8Bytes[pos + 1] & 0x3f) << 6;
unicode |= utf8Bytes[pos + 2] & 0x3f;
unicodeStr += String.fromCharCode(unicode);
pos += 3;
} else if ((flag & 0xc0) === 0xc0) {
//110
unicode = (utf8Bytes[pos] & 0x3f) << 6;
unicode |= utf8Bytes[pos + 1] & 0x3f;
unicodeStr += String.fromCharCode(unicode);
pos += 2;
} else {
unicodeStr += String.fromCharCode(utf8Bytes[pos]);
pos += 1;
}
}
return unicodeStr;
};
var strToUtf8Bytes = function strToUtf8Bytes(str) {
var bytes = [];
for (var i = 0; i < str.length; ++i) {
var code = str.charCodeAt(i);
if (code >= 0x10000 && code <= 0x10ffff) {
bytes.push(code >> 18 | 0xf0); // 第一个字节
bytes.push(code >> 12 & 0x3f | 0x80);
bytes.push(code >> 6 & 0x3f | 0x80);
bytes.push(code & 0x3f | 0x80);
} else if (code >= 0x800 && code <= 0xffff) {
bytes.push(code >> 12 | 0xe0);
bytes.push(code >> 6 & 0x3f | 0x80);
bytes.push(code & 0x3f | 0x80);
} else if (code >= 0x80 && code <= 0x7ff) {
bytes.push(code >> 6 | 0xc0);
bytes.push(code & 0x3f | 0x80);
} else {
bytes.push(code);
}
}
return bytes;
};
module.exports = {
onBluetoothAdapterStateChange: onBluetoothAdapterStateChange,
openBluetoothAdapter: openBluetoothAdapter,
onBluetoothDeviceFound: onBluetoothDeviceFound,
startBluetoothDevicesDiscovery: startBluetoothDevicesDiscovery,
stopBluetoothDevicesDiscovery: stopBluetoothDevicesDiscovery,
onBLEConnectionStateChange: onBLEConnectionStateChange,
createBLEConnection: createBLEConnection,
closeBLEConnection: closeBLEConnection,
onBLECharacteristicValueChange: onBLECharacteristicValueChange,
writeBLECharacteristicValue: writeBLECharacteristicValue
};
/***/ }),
/* 41 */
/*!************************************************************************************************!*\
!*** ./node_modules/@dcloudio/vue-cli-plugin-uni/packages/@babel/runtime/regenerator/index.js ***!
\************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
// TODO(Babel 8): Remove this file.
var runtime = __webpack_require__(/*! @babel/runtime/helpers/regeneratorRuntime */ 42)();
module.exports = runtime;
/***/ }),
/* 42 */
/*!*******************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/regeneratorRuntime.js ***!
\*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var _typeof = __webpack_require__(/*! ./typeof.js */ 13)["default"];
function _regeneratorRuntime() {
"use strict";
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
module.exports = _regeneratorRuntime = function _regeneratorRuntime() {
return exports;
}, module.exports.__esModule = true, module.exports["default"] = module.exports;
var exports = {},
Op = Object.prototype,
hasOwn = Op.hasOwnProperty,
defineProperty = Object.defineProperty || function (obj, key, desc) {
obj[key] = desc.value;
},
$Symbol = "function" == typeof Symbol ? Symbol : {},
iteratorSymbol = $Symbol.iterator || "@@iterator",
asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator",
toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
function define(obj, key, value) {
return Object.defineProperty(obj, key, {
value: value,
enumerable: !0,
configurable: !0,
writable: !0
}), obj[key];
}
try {
define({}, "");
} catch (err) {
define = function define(obj, key, value) {
return obj[key] = value;
};
}
function wrap(innerFn, outerFn, self, tryLocsList) {
var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator,
generator = Object.create(protoGenerator.prototype),
context = new Context(tryLocsList || []);
return defineProperty(generator, "_invoke", {
value: makeInvokeMethod(innerFn, self, context)
}), generator;
}
function tryCatch(fn, obj, arg) {
try {
return {
type: "normal",
arg: fn.call(obj, arg)
};
} catch (err) {
return {
type: "throw",
arg: err
};
}
}
exports.wrap = wrap;
var ContinueSentinel = {};
function Generator() {}
function GeneratorFunction() {}
function GeneratorFunctionPrototype() {}
var IteratorPrototype = {};
define(IteratorPrototype, iteratorSymbol, function () {
return this;
});
var getProto = Object.getPrototypeOf,
NativeIteratorPrototype = getProto && getProto(getProto(values([])));
NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);
var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
function defineIteratorMethods(prototype) {
["next", "throw", "return"].forEach(function (method) {
define(prototype, method, function (arg) {
return this._invoke(method, arg);
});
});
}
function AsyncIterator(generator, PromiseImpl) {
function invoke(method, arg, resolve, reject) {
var record = tryCatch(generator[method], generator, arg);
if ("throw" !== record.type) {
var result = record.arg,
value = result.value;
return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) {
invoke("next", value, resolve, reject);
}, function (err) {
invoke("throw", err, resolve, reject);
}) : PromiseImpl.resolve(value).then(function (unwrapped) {
result.value = unwrapped, resolve(result);
}, function (error) {
return invoke("throw", error, resolve, reject);
});
}
reject(record.arg);
}
var previousPromise;
defineProperty(this, "_invoke", {
value: function value(method, arg) {
function callInvokeWithMethodAndArg() {
return new PromiseImpl(function (resolve, reject) {
invoke(method, arg, resolve, reject);
});
}
return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
}
});
}
function makeInvokeMethod(innerFn, self, context) {
var state = "suspendedStart";
return function (method, arg) {
if ("executing" === state) throw new Error("Generator is already running");
if ("completed" === state) {
if ("throw" === method) throw arg;
return doneResult();
}
for (context.method = method, context.arg = arg;;) {
var delegate = context.delegate;
if (delegate) {
var delegateResult = maybeInvokeDelegate(delegate, context);
if (delegateResult) {
if (delegateResult === ContinueSentinel) continue;
return delegateResult;
}
}
if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) {
if ("suspendedStart" === state) throw state = "completed", context.arg;
context.dispatchException(context.arg);
} else "return" === context.method && context.abrupt("return", context.arg);
state = "executing";
var record = tryCatch(innerFn, self, context);
if ("normal" === record.type) {
if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue;
return {
value: record.arg,
done: context.done
};
}
"throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg);
}
};
}
function maybeInvokeDelegate(delegate, context) {
var methodName = context.method,
method = delegate.iterator[methodName];
if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel;
var record = tryCatch(method, delegate.iterator, context.arg);
if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel;
var info = record.arg;
return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel);
}
function pushTryEntry(locs) {
var entry = {
tryLoc: locs[0]
};
1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);
}
function resetTryEntry(entry) {
var record = entry.completion || {};
record.type = "normal", delete record.arg, entry.completion = record;
}
function Context(tryLocsList) {
this.tryEntries = [{
tryLoc: "root"
}], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);
}
function values(iterable) {
if (iterable) {
var iteratorMethod = iterable[iteratorSymbol];
if (iteratorMethod) return iteratorMethod.call(iterable);
if ("function" == typeof iterable.next) return iterable;
if (!isNaN(iterable.length)) {
var i = -1,
next = function next() {
for (; ++i < iterable.length;) {
if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;
}
return next.value = undefined, next.done = !0, next;
};
return next.next = next;
}
}
return {
next: doneResult
};
}
function doneResult() {
return {
value: undefined,
done: !0
};
}
return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", {
value: GeneratorFunctionPrototype,
configurable: !0
}), defineProperty(GeneratorFunctionPrototype, "constructor", {
value: GeneratorFunction,
configurable: !0
}), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) {
var ctor = "function" == typeof genFun && genFun.constructor;
return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name));
}, exports.mark = function (genFun) {
return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun;
}, exports.awrap = function (arg) {
return {
__await: arg
};
}, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () {
return this;
}), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {
void 0 === PromiseImpl && (PromiseImpl = Promise);
var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);
return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {
return result.done ? result.value : iter.next();
});
}, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () {
return this;
}), define(Gp, "toString", function () {
return "[object Generator]";
}), exports.keys = function (val) {
var object = Object(val),
keys = [];
for (var key in object) {
keys.push(key);
}
return keys.reverse(), function next() {
for (; keys.length;) {
var key = keys.pop();
if (key in object) return next.value = key, next.done = !1, next;
}
return next.done = !0, next;
};
}, exports.values = values, Context.prototype = {
constructor: Context,
reset: function reset(skipTempReset) {
if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) {
"t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);
}
},
stop: function stop() {
this.done = !0;
var rootRecord = this.tryEntries[0].completion;
if ("throw" === rootRecord.type) throw rootRecord.arg;
return this.rval;
},
dispatchException: function dispatchException(exception) {
if (this.done) throw exception;
var context = this;
function handle(loc, caught) {
return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught;
}
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i],
record = entry.completion;
if ("root" === entry.tryLoc) return handle("end");
if (entry.tryLoc <= this.prev) {
var hasCatch = hasOwn.call(entry, "catchLoc"),
hasFinally = hasOwn.call(entry, "finallyLoc");
if (hasCatch && hasFinally) {
if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);
if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);
} else if (hasCatch) {
if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);
} else {
if (!hasFinally) throw new Error("try statement without catch or finally");
if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);
}
}
}
},
abrupt: function abrupt(type, arg) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
var finallyEntry = entry;
break;
}
}
finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);
var record = finallyEntry ? finallyEntry.completion : {};
return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);
},
complete: function complete(record, afterLoc) {
if ("throw" === record.type) throw record.arg;
return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;
},
finish: function finish(finallyLoc) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;
}
},
"catch": function _catch(tryLoc) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.tryLoc === tryLoc) {
var record = entry.completion;
if ("throw" === record.type) {
var thrown = record.arg;
resetTryEntry(entry);
}
return thrown;
}
}
throw new Error("illegal catch attempt");
},
delegateYield: function delegateYield(iterable, resultName, nextLoc) {
return this.delegate = {
iterator: values(iterable),
resultName: resultName,
nextLoc: nextLoc
}, "next" === this.method && (this.arg = undefined), ContinueSentinel;
}
}, exports;
}
module.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/* 43 */
/*!*****************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/asyncToGenerator.js ***!
\*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator(fn) {
return function () {
var self = this,
args = arguments;
return new Promise(function (resolve, reject) {
var gen = fn.apply(self, args);
function _next(value) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(undefined);
});
};
}
module.exports = _asyncToGenerator, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ })
]]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BkY2xvdWRpby91bmktbXAtamQvZGlzdC9pbmRleC5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9nbG9iYWwuanMiLCJ1bmktYXBwOi8vL0Q6L1Byb2dyYW0gRmlsZXMvSEJ1aWxkZXJYLjMuNi4xOC4yMDIzMDExNy9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdC5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheS5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRoSG9sZXMuanMiLCJ1bmktYXBwOi8vL0Q6L1Byb2dyYW0gRmlsZXMvSEJ1aWxkZXJYLjMuNi4xOC4yMDIzMDExNy9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzIiwidW5pLWFwcDovLy9EOi9Qcm9ncmFtIEZpbGVzL0hCdWlsZGVyWC4zLjYuMTguMjAyMzAxMTcvSEJ1aWxkZXJYL3BsdWdpbnMvdW5pYXBwLWNsaS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlMaWtlVG9BcnJheS5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvbm9uSXRlcmFibGVSZXN0LmpzIiwidW5pLWFwcDovLy9EOi9Qcm9ncmFtIEZpbGVzL0hCdWlsZGVyWC4zLjYuMTguMjAyMzAxMTcvSEJ1aWxkZXJYL3BsdWdpbnMvdW5pYXBwLWNsaS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3MuanMiLCJ1bmktYXBwOi8vL0Q6L1Byb2dyYW0gRmlsZXMvSEJ1aWxkZXJYLjMuNi4xOC4yMDIzMDExNy9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvUHJvcGVydHlLZXkuanMiLCJ1bmktYXBwOi8vL0Q6L1Byb2dyYW0gRmlsZXMvSEJ1aWxkZXJYLjMuNi4xOC4yMDIzMDExNy9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZi5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9QcmltaXRpdmUuanMiLCJ1bmktYXBwOi8vL0Q6L1Byb2dyYW0gRmlsZXMvSEJ1aWxkZXJYLjMuNi4xOC4yMDIzMDExNy9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIiwidW5pLWFwcDovLy9EOi9Qcm9ncmFtIEZpbGVzL0hCdWlsZGVyWC4zLjYuMTguMjAyMzAxMTcvSEJ1aWxkZXJYL3BsdWdpbnMvdW5pYXBwLWNsaS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jb25zdHJ1Y3QuanMiLCJ1bmktYXBwOi8vL0Q6L1Byb2dyYW0gRmlsZXMvSEJ1aWxkZXJYLjMuNi4xOC4yMDIzMDExNy9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NldFByb3RvdHlwZU9mLmpzIiwidW5pLWFwcDovLy9EOi9Qcm9ncmFtIEZpbGVzL0hCdWlsZGVyWC4zLjYuMTguMjAyMzAxMTcvSEJ1aWxkZXJYL3BsdWdpbnMvdW5pYXBwLWNsaS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QuanMiLCJ1bmktYXBwOi8vL0Q6L1Byb2dyYW0gRmlsZXMvSEJ1aWxkZXJYLjMuNi4xOC4yMDIzMDExNy9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzIiwidW5pLWFwcDovLy9EOi9Qcm9ncmFtIEZpbGVzL0hCdWlsZGVyWC4zLjYuMTguMjAyMzAxMTcvSEJ1aWxkZXJYL3BsdWdpbnMvdW5pYXBwLWNsaS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcnJheVdpdGhvdXRIb2xlcy5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXRlcmFibGVUb0FycmF5LmpzIiwidW5pLWFwcDovLy9EOi9Qcm9ncmFtIEZpbGVzL0hCdWlsZGVyWC4zLjYuMTguMjAyMzAxMTcvSEJ1aWxkZXJYL3BsdWdpbnMvdW5pYXBwLWNsaS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVNwcmVhZC5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BkY2xvdWRpby91bmktaTE4bi9kaXN0L3VuaS1pMThuLmVzLmpzIiwidW5pLWFwcDovLy9EOi9Qcm9ncmFtIEZpbGVzL0hCdWlsZGVyWC4zLjYuMTguMjAyMzAxMTcvSEJ1aWxkZXJYL3BsdWdpbnMvdW5pYXBwLWNsaS9ub2RlX21vZHVsZXMvQGRjbG91ZGlvL3Z1ZS1jbGktcGx1Z2luLXVuaS9wYWNrYWdlcy9tcC12dWUvZGlzdC9tcC5ydW50aW1lLmVzbS5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BkY2xvdWRpby92dWUtY2xpLXBsdWdpbi11bmkvcGFja2FnZXMvdnVlLWxvYWRlci9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzIiwidW5pLWFwcDovLy91dGlscy9lY1VJLmpzIiwidW5pLWFwcDovLy91dGlscy9lY0JMRS9lY0JMRS5qcyIsInVuaS1hcHA6Ly8vdXRpbHMvZWNCTEUvZWNCTEVKRC5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BkY2xvdWRpby92dWUtY2xpLXBsdWdpbi11bmkvcGFja2FnZXMvQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanMiLCJ1bmktYXBwOi8vL0Q6L1Byb2dyYW0gRmlsZXMvSEJ1aWxkZXJYLjMuNi4xOC4yMDIzMDExNy9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3JlZ2VuZXJhdG9yUnVudGltZS5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvci5qcyJdLCJuYW1lcyI6WyJyZWFsQXRvYiIsImI2NCIsImI2NHJlIiwiYXRvYiIsInN0ciIsIlN0cmluZyIsInJlcGxhY2UiLCJ0ZXN0IiwiRXJyb3IiLCJzbGljZSIsImxlbmd0aCIsImJpdG1hcCIsInJlc3VsdCIsInIxIiwicjIiLCJpIiwiaW5kZXhPZiIsImNoYXJBdCIsImZyb21DaGFyQ29kZSIsImI2NERlY29kZVVuaWNvZGUiLCJkZWNvZGVVUklDb21wb25lbnQiLCJzcGxpdCIsIm1hcCIsImMiLCJjaGFyQ29kZUF0IiwidG9TdHJpbmciLCJqb2luIiwiZ2V0Q3VycmVudFVzZXJJbmZvIiwidG9rZW4iLCJqZCIsImdldFN0b3JhZ2VTeW5jIiwidG9rZW5BcnIiLCJ1aWQiLCJyb2xlIiwicGVybWlzc2lvbiIsInRva2VuRXhwaXJlZCIsInVzZXJJbmZvIiwiSlNPTiIsInBhcnNlIiwiZXJyb3IiLCJtZXNzYWdlIiwiZXhwIiwiaWF0IiwidW5pSWRNaXhpbiIsIlZ1ZSIsInByb3RvdHlwZSIsInVuaUlESGFzUm9sZSIsInJvbGVJZCIsInVuaUlESGFzUGVybWlzc2lvbiIsInBlcm1pc3Npb25JZCIsInVuaUlEVG9rZW5WYWxpZCIsIkRhdGUiLCJub3ciLCJfdG9TdHJpbmciLCJPYmplY3QiLCJoYXNPd25Qcm9wZXJ0eSIsImlzRm4iLCJmbiIsImlzU3RyIiwiaXNPYmplY3QiLCJvYmoiLCJpc1BsYWluT2JqZWN0IiwiY2FsbCIsImhhc093biIsImtleSIsIm5vb3AiLCJjYWNoZWQiLCJjYWNoZSIsImNyZWF0ZSIsImNhY2hlZEZuIiwiaGl0IiwiY2FtZWxpemVSRSIsImNhbWVsaXplIiwiXyIsInRvVXBwZXJDYXNlIiwiSE9PS1MiLCJnbG9iYWxJbnRlcmNlcHRvcnMiLCJzY29wZWRJbnRlcmNlcHRvcnMiLCJtZXJnZUhvb2siLCJwYXJlbnRWYWwiLCJjaGlsZFZhbCIsInJlcyIsImNvbmNhdCIsIkFycmF5IiwiaXNBcnJheSIsImRlZHVwZUhvb2tzIiwiaG9va3MiLCJwdXNoIiwicmVtb3ZlSG9vayIsImhvb2siLCJpbmRleCIsInNwbGljZSIsIm1lcmdlSW50ZXJjZXB0b3JIb29rIiwiaW50ZXJjZXB0b3IiLCJvcHRpb24iLCJrZXlzIiwiZm9yRWFjaCIsInJlbW92ZUludGVyY2VwdG9ySG9vayIsImFkZEludGVyY2VwdG9yIiwibWV0aG9kIiwicmVtb3ZlSW50ZXJjZXB0b3IiLCJ3cmFwcGVySG9vayIsImRhdGEiLCJpc1Byb21pc2UiLCJ0aGVuIiwicXVldWUiLCJwcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjYWxsYmFjayIsIndyYXBwZXJPcHRpb25zIiwib3B0aW9ucyIsIm5hbWUiLCJvbGRDYWxsYmFjayIsImNhbGxiYWNrSW50ZXJjZXB0b3IiLCJ3cmFwcGVyUmV0dXJuVmFsdWUiLCJyZXR1cm5WYWx1ZSIsInJldHVyblZhbHVlSG9va3MiLCJnZXRBcGlJbnRlcmNlcHRvckhvb2tzIiwic2NvcGVkSW50ZXJjZXB0b3IiLCJpbnZva2VBcGkiLCJhcGkiLCJwYXJhbXMiLCJpbnZva2UiLCJwcm9taXNlSW50ZXJjZXB0b3IiLCJyZWplY3QiLCJTWU5DX0FQSV9SRSIsIkNPTlRFWFRfQVBJX1JFIiwiQ09OVEVYVF9BUElfUkVfRVhDIiwiQVNZTkNfQVBJIiwiQ0FMTEJBQ0tfQVBJX1JFIiwiaXNDb250ZXh0QXBpIiwiaXNTeW5jQXBpIiwiaXNDYWxsYmFja0FwaSIsImhhbmRsZVByb21pc2UiLCJjYXRjaCIsImVyciIsInNob3VsZFByb21pc2UiLCJmaW5hbGx5IiwiY29uc3RydWN0b3IiLCJ2YWx1ZSIsInJlYXNvbiIsInByb21pc2lmeSIsInByb21pc2VBcGkiLCJzdWNjZXNzIiwiZmFpbCIsImNvbXBsZXRlIiwiYXNzaWduIiwiRVBTIiwiQkFTRV9ERVZJQ0VfV0lEVEgiLCJpc0lPUyIsImRldmljZVdpZHRoIiwiZGV2aWNlRFBSIiwiY2hlY2tEZXZpY2VXaWR0aCIsImdldFN5c3RlbUluZm9TeW5jIiwicGxhdGZvcm0iLCJwaXhlbFJhdGlvIiwid2luZG93V2lkdGgiLCJ1cHgycHgiLCJudW1iZXIiLCJuZXdEZXZpY2VXaWR0aCIsIk51bWJlciIsIk1hdGgiLCJmbG9vciIsIkxPQ0FMRV9aSF9IQU5TIiwiTE9DQUxFX1pIX0hBTlQiLCJMT0NBTEVfRU4iLCJMT0NBTEVfRlIiLCJMT0NBTEVfRVMiLCJtZXNzYWdlcyIsImxvY2FsZSIsIm5vcm1hbGl6ZUxvY2FsZSIsImxhbmd1YWdlIiwiaW5pdEkxOG5NZXNzYWdlcyIsImlzRW5hYmxlTG9jYWxlIiwibG9jYWxlS2V5cyIsIl9fdW5pQ29uZmlnIiwibG9jYWxlcyIsImN1ck1lc3NhZ2VzIiwidXNlck1lc3NhZ2VzIiwiaTE4biIsImluaXRWdWVJMThuIiwidCIsImkxOG5NaXhpbiIsIm1peGluIiwiYmVmb3JlQ3JlYXRlIiwidW53YXRjaCIsIndhdGNoTG9jYWxlIiwiJGZvcmNlVXBkYXRlIiwiJG9uY2UiLCJtZXRob2RzIiwiJCR0IiwidmFsdWVzIiwic2V0TG9jYWxlIiwiZ2V0TG9jYWxlIiwiaW5pdEFwcExvY2FsZSIsImFwcFZtIiwic3RhdGUiLCJvYnNlcnZhYmxlIiwibG9jYWxlV2F0Y2hlcnMiLCIkd2F0Y2hMb2NhbGUiLCJkZWZpbmVQcm9wZXJ0eSIsImdldCIsInNldCIsInYiLCJ3YXRjaCIsImluY2x1ZGUiLCJwYXJ0cyIsImZpbmQiLCJwYXJ0Iiwic3RhcnRzV2l0aCIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsImxhbmciLCJnZXRMb2NhbGUkMSIsImdldEFwcCIsImFwcCIsImFsbG93RGVmYXVsdCIsIiR2bSIsIiRsb2NhbGUiLCJzZXRMb2NhbGUkMSIsIm9sZExvY2FsZSIsIm9uTG9jYWxlQ2hhbmdlQ2FsbGJhY2tzIiwib25Mb2NhbGVDaGFuZ2UiLCJnbG9iYWwiLCJpbnRlcmNlcHRvcnMiLCJiYXNlQXBpIiwiZnJlZXplIiwiX19wcm90b19fIiwiVVVJRF9LRVkiLCJkZXZpY2VJZCIsInVzZURldmljZUlkIiwicmFuZG9tIiwic2V0U3RvcmFnZSIsImFkZFNhZmVBcmVhSW5zZXRzIiwic2FmZUFyZWEiLCJzYWZlQXJlYUluc2V0cyIsInRvcCIsImxlZnQiLCJyaWdodCIsImJvdHRvbSIsInNjcmVlbkhlaWdodCIsInBvcHVsYXRlUGFyYW1ldGVycyIsImJyYW5kIiwibW9kZWwiLCJzeXN0ZW0iLCJ0aGVtZSIsInZlcnNpb24iLCJmb250U2l6ZVNldHRpbmciLCJTREtWZXJzaW9uIiwiZGV2aWNlT3JpZW50YXRpb24iLCJvc05hbWUiLCJvc1ZlcnNpb24iLCJob3N0VmVyc2lvbiIsImhvc3RWZXJzaW9uTmFtZSIsImRldmljZVR5cGUiLCJnZXRHZXREZXZpY2VUeXBlIiwiZGV2aWNlQnJhbmQiLCJnZXREZXZpY2VCcmFuZCIsIl9ob3N0TmFtZSIsImdldEhvc3ROYW1lIiwiX2RldmljZU9yaWVudGF0aW9uIiwiX2RldmljZVBpeGVsUmF0aW8iLCJfU0RLVmVyc2lvbiIsImhvc3RMYW5ndWFnZSIsInBhcmFtZXRlcnMiLCJhcHBJZCIsInByb2Nlc3MiLCJhcHBOYW1lIiwiYXBwVmVyc2lvbiIsImFwcFZlcnNpb25Db2RlIiwiYXBwTGFuZ3VhZ2UiLCJnZXRBcHBMYW5ndWFnZSIsInVuaUNvbXBpbGVWZXJzaW9uIiwidW5pUnVudGltZVZlcnNpb24iLCJ1bmlQbGF0Zm9ybSIsImRldmljZU1vZGVsIiwiZGV2aWNlUGl4ZWxSYXRpbyIsInRvTG9jYWxlTG93ZXJDYXNlIiwiaG9zdFRoZW1lIiwiaG9zdE5hbWUiLCJob3N0U0RLVmVyc2lvbiIsImhvc3RGb250U2l6ZVNldHRpbmciLCJ3aW5kb3dUb3AiLCJ3aW5kb3dCb3R0b20iLCJvc0xhbmd1YWdlIiwidW5kZWZpbmVkIiwib3NUaGVtZSIsInVhIiwiaG9zdFBhY2thZ2VOYW1lIiwiYnJvd3Nlck5hbWUiLCJicm93c2VyVmVyc2lvbiIsImRldmljZVR5cGVNYXBzIiwiaXBhZCIsIndpbmRvd3MiLCJtYWMiLCJkZXZpY2VUeXBlTWFwc0tleXMiLCJfbW9kZWwiLCJfbSIsImRlZmF1bHRMYW5ndWFnZSIsIl9wbGF0Zm9ybSIsImdldFN5c3RlbUluZm8iLCJwcm90b2NvbHMiLCJ0b2RvcyIsImNhbklVc2VzIiwiQ0FMTEJBQ0tTIiwicHJvY2Vzc0NhbGxiYWNrIiwibWV0aG9kTmFtZSIsInByb2Nlc3NSZXR1cm5WYWx1ZSIsInByb2Nlc3NBcmdzIiwiZnJvbUFyZ3MiLCJhcmdzT3B0aW9uIiwia2VlcEZyb21BcmdzIiwidG9BcmdzIiwia2V5T3B0aW9uIiwiY29uc29sZSIsIndhcm4iLCJrZWVwUmV0dXJuVmFsdWUiLCJ3cmFwcGVyIiwicHJvdG9jb2wiLCJhcmcxIiwiYXJnMiIsImFyZ3MiLCJhcHBseSIsInRvZG9BcGlzIiwiVE9ET1MiLCJjcmVhdGVUb2RvQXBpIiwidG9kb0FwaSIsImVyck1zZyIsInByb3ZpZGVycyIsIm9hdXRoIiwic2hhcmUiLCJwYXltZW50IiwiZ2V0UHJvdmlkZXIiLCJzZXJ2aWNlIiwicHJvdmlkZXIiLCJleHRyYUFwaSIsImdldEVtaXR0ZXIiLCJFbWl0dGVyIiwiZ2V0VW5pRW1pdHRlciIsImN0eCIsIiRvbiIsImFyZ3VtZW50cyIsIiRvZmYiLCIkZW1pdCIsImV2ZW50QXBpIiwidHJ5Q2F0Y2giLCJlIiwiZ2V0QXBpQ2FsbGJhY2tzIiwiYXBpQ2FsbGJhY2tzIiwicGFyYW0iLCJjaWQiLCJjaWRFcnJNc2ciLCJlbmFibGVkIiwibm9ybWFsaXplUHVzaE1lc3NhZ2UiLCJpbnZva2VQdXNoQ2FsbGJhY2siLCJ0eXBlIiwiaW52b2tlR2V0UHVzaENpZENhbGxiYWNrcyIsIm9uUHVzaE1lc3NhZ2VDYWxsYmFja3MiLCJzdG9wcGVkIiwiZ2V0UHVzaENpZENhbGxiYWNrcyIsImdldFB1c2hDbGllbnRJZCIsImhhc1N1Y2Nlc3MiLCJoYXNGYWlsIiwiaGFzQ29tcGxldGUiLCJvblB1c2hNZXNzYWdlIiwib2ZmUHVzaE1lc3NhZ2UiLCJtb2NrcyIsImZpbmRWbUJ5VnVlSWQiLCJ2bSIsInZ1ZVBpZCIsIiRjaGlsZHJlbiIsImNoaWxkVm0iLCIkc2NvcGUiLCJfJHZ1ZUlkIiwicGFyZW50Vm0iLCJpbml0QmVoYXZpb3IiLCJCZWhhdmlvciIsImlzUGFnZSIsInJvdXRlIiwiaW5pdFJlbGF0aW9uIiwiZGV0YWlsIiwidHJpZ2dlckV2ZW50Iiwic2VsZWN0QWxsQ29tcG9uZW50cyIsIm1wSW5zdGFuY2UiLCJzZWxlY3RvciIsIiRyZWZzIiwiY29tcG9uZW50cyIsImNvbXBvbmVudCIsInJlZiIsImRhdGFzZXQiLCJ0b1NraXAiLCJzeW5jUmVmcyIsInJlZnMiLCJuZXdSZWZzIiwib2xkS2V5cyIsIlNldCIsIm5ld0tleXMiLCJvbGRWYWx1ZSIsIm5ld1ZhbHVlIiwiZXZlcnkiLCJpbmNsdWRlcyIsImRlbGV0ZSIsImluaXRSZWZzIiwiZm9yQ29tcG9uZW50cyIsImhhbmRsZUxpbmsiLCJldmVudCIsInZ1ZU9wdGlvbnMiLCJwYXJlbnQiLCJtYXJrTVBDb21wb25lbnQiLCJJU19NUCIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJPQiIsIlNLSVAiLCJpc0V4dGVuc2libGUiLCJNUFBhZ2UiLCJQYWdlIiwiTVBDb21wb25lbnQiLCJDb21wb25lbnQiLCJjdXN0b21pemVSRSIsImN1c3RvbWl6ZSIsImluaXRUcmlnZ2VyRXZlbnQiLCJvbGRUcmlnZ2VyRXZlbnQiLCJuZXdUcmlnZ2VyRXZlbnQiLCJjb21UeXBlIiwiX3RyaWdnZXJFdmVudCIsImluaXRIb29rIiwiaXNDb21wb25lbnQiLCJvbGRIb29rIiwiX18kd3JhcHBlcmVkIiwiYWZ0ZXIiLCJQQUdFX0VWRU5UX0hPT0tTIiwiaW5pdE1vY2tzIiwiJG1wIiwibXBUeXBlIiwibW9jayIsImhhc0hvb2siLCJkZWZhdWx0IiwiZXh0ZW5kT3B0aW9ucyIsInN1cGVyIiwibWl4aW5zIiwiaW5pdEhvb2tzIiwibXBPcHRpb25zIiwiX19jYWxsX2hvb2siLCJpbml0VW5rbm93bkhvb2tzIiwiZXhjbHVkZXMiLCJmaW5kSG9va3MiLCJpbml0SG9vayQxIiwiaW5pdFZ1ZUNvbXBvbmVudCIsIlZ1ZUNvbXBvbmVudCIsImV4dGVuZCIsImluaXRTbG90cyIsInZ1ZVNsb3RzIiwiJHNsb3RzIiwic2xvdE5hbWUiLCIkc2NvcGVkU2xvdHMiLCJpbml0VnVlSWRzIiwidnVlSWRzIiwibGVuIiwiXyR2dWVQaWQiLCJpbml0RGF0YSIsImNvbnRleHQiLCJWVUVfQVBQX0RFQlVHIiwic3RyaW5naWZ5IiwiX19saWZlY3ljbGVfaG9va3NfXyIsIlBST1BfVFlQRVMiLCJCb29sZWFuIiwiY3JlYXRlT2JzZXJ2ZXIiLCJvYnNlcnZlciIsIm5ld1ZhbCIsIm9sZFZhbCIsImluaXRCZWhhdmlvcnMiLCJ2dWVCZWhhdmlvcnMiLCJiZWhhdmlvcnMiLCJ2dWVFeHRlbmRzIiwiZXh0ZW5kcyIsInZ1ZU1peGlucyIsInZ1ZVByb3BzIiwicHJvcHMiLCJiZWhhdmlvciIsInByb3BlcnRpZXMiLCJpbml0UHJvcGVydGllcyIsInZ1ZU1peGluIiwicGFyc2VQcm9wVHlwZSIsImRlZmF1bHRWYWx1ZSIsImZpbGUiLCJpc0JlaGF2aW9yIiwidnVlSWQiLCJzY29wZWRTbG90c0NvbXBpbGVyIiwic2V0RGF0YSIsIm9wdHMiLCJ3cmFwcGVyJDEiLCJtcCIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0IiwidGFyZ2V0IiwibWFya2VySWQiLCJnZXRFeHRyYVZhbHVlIiwiZGF0YVBhdGhzQXJyYXkiLCJkYXRhUGF0aEFycmF5IiwiZGF0YVBhdGgiLCJwcm9wUGF0aCIsInZhbHVlUGF0aCIsInZGb3IiLCJpc0ludGVnZXIiLCJzdWJzdHIiLCJfX2dldF92YWx1ZSIsInZGb3JJdGVtIiwidkZvcktleSIsInByb2Nlc3NFdmVudEV4dHJhIiwiZXh0cmEiLCJfX2FyZ3NfXyIsImV4dHJhT2JqIiwiZ2V0T2JqQnlBcnJheSIsImFyciIsImVsZW1lbnQiLCJwcm9jZXNzRXZlbnRBcmdzIiwiaXNDdXN0b20iLCJpc0N1c3RvbU1QRXZlbnQiLCJjdXJyZW50VGFyZ2V0IiwicmV0IiwiYXJnIiwiT05DRSIsIkNVU1RPTSIsImlzTWF0Y2hFdmVudFR5cGUiLCJldmVudFR5cGUiLCJvcHRUeXBlIiwiZ2V0Q29udGV4dFZtIiwiJHBhcmVudCIsIiRvcHRpb25zIiwiZ2VuZXJpYyIsImhhbmRsZUV2ZW50IiwiZXZlbnRPcHRzIiwiZXZlbnRPcHQiLCJldmVudHNBcnJheSIsImlzT25jZSIsImV2ZW50QXJyYXkiLCJoYW5kbGVyQ3R4IiwiaGFuZGxlciIsInBhdGgiLCJpcyIsIm9uY2UiLCJFdmVudENoYW5uZWwiLCJpZCIsImV2ZW50cyIsImxpc3RlbmVyIiwiZW1pdENhY2hlIiwib24iLCJldmVudE5hbWUiLCJmbnMiLCJvcHQiLCJmaWx0ZXIiLCJfYWRkTGlzdGVuZXIiLCJfY2xlYXJDYWNoZSIsImNhY2hlQXJncyIsImVtaXQiLCJzaGlmdCIsImV2ZW50Q2hhbm5lbHMiLCJldmVudENoYW5uZWxTdGFjayIsImdldEV2ZW50Q2hhbm5lbCIsImV2ZW50Q2hhbm5lbCIsImluaXRFdmVudENoYW5uZWwiLCJnZXRPcGVuZXJFdmVudENoYW5uZWwiLCJfX2V2ZW50Q2hhbm5lbF9fIiwiY2FsbEhvb2siLCJfX2lkX18iLCJpbml0U2NvcGVkU2xvdHNQYXJhbXMiLCJjZW50ZXIiLCJwYXJlbnRzIiwiJGhhc1Njb3BlZFNsb3RzUGFyYW1zIiwiaGFzIiwiJGdldFNjb3BlZFNsb3RzUGFyYW1zIiwib2JqZWN0IiwiJHNldFNjb3BlZFNsb3RzUGFyYW1zIiwicHJvcHNEYXRhIiwiZGVzdHJveWVkIiwicGFyc2VCYXNlQXBwIiwic3RvcmUiLCIkc3RvcmUiLCJtcEhvc3QiLCIkaTE4biIsIl9pMThuIiwiYXBwT3B0aW9ucyIsIm9uTGF1bmNoIiwiZ2xvYmFsRGF0YSIsIl9pc01vdW50ZWQiLCJwYXJzZUFwcCIsInBhcnNlQXBwJDEiLCJjcmVhdGVBcHAiLCJBcHAiLCJlbmNvZGVSZXNlcnZlUkUiLCJlbmNvZGVSZXNlcnZlUmVwbGFjZXIiLCJjb21tYVJFIiwiZW5jb2RlIiwiZW5jb2RlVVJJQ29tcG9uZW50Iiwic3RyaW5naWZ5UXVlcnkiLCJlbmNvZGVTdHIiLCJ2YWwiLCJ2YWwyIiwieCIsInBhcnNlQmFzZUNvbXBvbmVudCIsInZ1ZUNvbXBvbmVudE9wdGlvbnMiLCJuZWVkVnVlT3B0aW9ucyIsIm11bHRpcGxlU2xvdHMiLCJhZGRHbG9iYWxDbGFzcyIsImNvbXBvbmVudE9wdGlvbnMiLCJfX2ZpbGUiLCJsaWZldGltZXMiLCJhdHRhY2hlZCIsIiRtb3VudCIsInJlYWR5IiwiZGV0YWNoZWQiLCIkZGVzdHJveSIsInBhZ2VMaWZldGltZXMiLCJzaG93IiwiaGlkZSIsInJlc2l6ZSIsInNpemUiLCJfX2wiLCJfX2UiLCJleHRlcm5hbENsYXNzZXMiLCJ3eHNDYWxsTWV0aG9kcyIsImNhbGxNZXRob2QiLCJwYXJzZUNvbXBvbmVudCIsInBhcnNlQ29tcG9uZW50JDEiLCJob29rcyQxIiwicGFyc2VCYXNlUGFnZSIsInZ1ZVBhZ2VPcHRpb25zIiwicGFnZU9wdGlvbnMiLCJvbkxvYWQiLCJxdWVyeSIsImNvcHlRdWVyeSIsIiRwYWdlIiwiZnVsbFBhdGgiLCJwYXJzZVBhZ2UiLCJwYXJzZVBhZ2UkMSIsImNyZWF0ZVBhZ2UiLCJjcmVhdGVDb21wb25lbnQiLCJjcmVhdGVTdWJwYWNrYWdlQXBwIiwib25TaG93Iiwib25BcHBTaG93Iiwib25IaWRlIiwib25BcHBIaWRlIiwiZ2V0TGF1bmNoT3B0aW9uc1N5bmMiLCJjcmVhdGVQbHVnaW4iLCJjYW5JVXNlQXBpIiwiYXBpTmFtZSIsImNhbklVc2UiLCJ1bmkiLCJQcm94eSIsInVuaSQxIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9fZXNNb2R1bGUiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXJyYXlXaXRoSG9sZXMiLCJyZXF1aXJlIiwiaXRlcmFibGVUb0FycmF5TGltaXQiLCJ1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIm5vbkl0ZXJhYmxlUmVzdCIsIl9zbGljZWRUb0FycmF5IiwiX2FycmF5V2l0aEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheUxpbWl0IiwiX2kiLCJTeW1ib2wiLCJpdGVyYXRvciIsIl9zIiwiX2UiLCJfeCIsIl9yIiwiX2FyciIsIl9uIiwiX2QiLCJuZXh0IiwiZG9uZSIsImFycmF5TGlrZVRvQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJvIiwibWluTGVuIiwibiIsImZyb20iLCJfYXJyYXlMaWtlVG9BcnJheSIsImFycjIiLCJfbm9uSXRlcmFibGVSZXN0IiwiVHlwZUVycm9yIiwiX2NsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsInRvUHJvcGVydHlLZXkiLCJfZGVmaW5lUHJvcGVydGllcyIsImRlc2NyaXB0b3IiLCJ3cml0YWJsZSIsIl9jcmVhdGVDbGFzcyIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsIl90eXBlb2YiLCJ0b1ByaW1pdGl2ZSIsIl90b1Byb3BlcnR5S2V5IiwiX3RvUHJpbWl0aXZlIiwiaW5wdXQiLCJoaW50IiwicHJpbSIsIl9kZWZpbmVQcm9wZXJ0eSIsInNldFByb3RvdHlwZU9mIiwiaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiX2NvbnN0cnVjdCIsIlBhcmVudCIsIkNsYXNzIiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImJpbmQiLCJhIiwiRnVuY3Rpb24iLCJfc2V0UHJvdG90eXBlT2YiLCJwIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsInNoYW0iLCJ2YWx1ZU9mIiwiYXJyYXlXaXRob3V0SG9sZXMiLCJpdGVyYWJsZVRvQXJyYXkiLCJub25JdGVyYWJsZVNwcmVhZCIsIl90b0NvbnN1bWFibGVBcnJheSIsIl9hcnJheVdpdGhvdXRIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXkiLCJpdGVyIiwiX25vbkl0ZXJhYmxlU3ByZWFkIiwiZGVmYXVsdERlbGltaXRlcnMiLCJCYXNlRm9ybWF0dGVyIiwiX2NhY2hlcyIsImRlbGltaXRlcnMiLCJ0b2tlbnMiLCJjb21waWxlIiwiUkVfVE9LRU5fTElTVF9WQUxVRSIsIlJFX1RPS0VOX05BTUVEX1ZBTFVFIiwiZm9ybWF0Iiwic3RhcnREZWxpbWl0ZXIiLCJlbmREZWxpbWl0ZXIiLCJwb3NpdGlvbiIsInRleHQiLCJjaGFyIiwic3ViIiwiaXNDbG9zZWQiLCJjb21waWxlZCIsIm1vZGUiLCJwYXJzZUludCIsImRlZmF1bHRGb3JtYXR0ZXIiLCJJMThuIiwiZmFsbGJhY2tMb2NhbGUiLCJ3YXRjaGVyIiwiZm9ybWF0ZXIiLCJ3YXRjaGVycyIsIm92ZXJyaWRlIiwiaW50ZXJwb2xhdGUiLCJ3YXRjaEFwcExvY2FsZSIsIm5ld0xvY2FsZSIsIiR3YXRjaCIsImdldERlZmF1bHRMb2NhbGUiLCJpc1dhdGNoZWRBcHBMb2NhbGUiLCJmIiwiYWRkIiwiaXNTdHJpbmciLCJoYXNJMThuSnNvbiIsImpzb25PYmoiLCJ3YWxrSnNvbk9iaiIsImlzSTE4blN0ciIsInBhcnNlSTE4bkpzb24iLCJjb21waWxlU3RyIiwiY29tcGlsZUkxOG5Kc29uU3RyIiwianNvblN0ciIsImxvY2FsZVZhbHVlcyIsInVuc2hpZnQiLCJjb21waWxlSnNvbk9iaiIsImNvbXBpbGVWYWx1ZSIsInZhbHVlTG9jYWxlcyIsImxvY2FsVmFsdWUiLCJ3YWxrIiwicmVzb2x2ZUxvY2FsZSIsInJlc29sdmVMb2NhbGVDaGFpbiIsImNoYWluIiwicG9wIiwic2hvd01vZGFsIiwidGl0bGUiLCJjb250ZW50IiwiY2IiLCJzaG93Q2FuY2VsIiwic2hvd0xvYWRpbmciLCJtYXNrIiwiaGlkZUxvYWRpbmciLCJsb2dFbmFibGUiLCJpc0FuZHJvaWQiLCJlY0JsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZUNhbGxiYWNrIiwiZWNCTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2VDYWxsYmFjayIsImVjRGV2aWNlSWQiLCJlY0dhdHRTZXJ2ZXJVVUlEIiwiZWNHYXR0U2VydmVyVVVJRE9wdGlvbjEiLCJlY0dhdHRTZXJ2ZXJVVUlET3B0aW9uMiIsImVjR2F0dENoYXJhY3RlcmlzdGljV3JpdGVVVUlEIiwiZWNHYXR0Q2hhcmFjdGVyaXN0aWNXcml0ZVVVSURPcHRpb24xIiwiZWNHYXR0Q2hhcmFjdGVyaXN0aWNXcml0ZVVVSURPcHRpb24yIiwibG9nIiwib25CbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2UiLCJfb3BlbkJsdWV0b290aEFkYXB0ZXIiLCJvcGVuQmx1ZXRvb3RoQWRhcHRlciIsIm9rIiwiZXJyQ29kZSIsInN5c3RlbUluZm8iLCJvZmZCbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2UiLCJhdmFpbGFibGUiLCJvcGVuUmVzIiwib25CbHVldG9vdGhEZXZpY2VGb3VuZCIsIm9mZkJsdWV0b290aERldmljZUZvdW5kIiwiZGV2aWNlIiwiZGV2aWNlcyIsImxvY2FsTmFtZSIsInJzc2kiLCJSU1NJIiwic3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5IiwiYWxsb3dEdXBsaWNhdGVzS2V5IiwicG93ZXJMZXZlbCIsInN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5Iiwib25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2UiLCJfY3JlYXRlQkxFQ29ubmVjdGlvbiIsImNyZWF0ZUJMRUNvbm5lY3Rpb24iLCJlcnJubyIsInNldFRpbWVvdXQiLCJnZXRCTEVEZXZpY2VTZXJ2aWNlcyIsInNlcnZpY2VzIiwiZ2V0QkxFRGV2aWNlQ2hhcmFjdGVyaXN0aWNzIiwic2VydmljZUlkIiwiY2hhcmFjdGVyaXN0aWNzIiwibm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIsImNoYXJhY3RlcmlzdGljSWQiLCJzZXRCTEVNVFUiLCJtdHUiLCJvZmZCTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2UiLCJjb25uZWN0ZWQiLCJzZXJ2aWNlc1Jlc3VsdCIsImNsb3NlQkxFQ29ubmVjdGlvbiIsInV1aWQiLCJjaGFyYWN0ZXJpc3RpY3NSZXN1bHQiLCJjaGFyYWN0ZXJpc3RpYyIsIm5vdGlmeSIsIm5vdGlmeVJlc3VsdCIsIm9uQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIsIm9mZkJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2UiLCJVaW50OEFycmF5IiwidXRmOEJ5dGVzVG9TdHIiLCJzdHJIZXgiLCJwYWRTdGFydCIsIl93cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWUiLCJidWZmZXIiLCJ3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWUiLCJ3cml0ZVR5cGUiLCJpc0hleCIsIkFycmF5QnVmZmVyIiwic3RyVG9VdGY4Qnl0ZXMiLCJ1dGY4Qnl0ZXMiLCJ1bmljb2RlU3RyIiwicG9zIiwiZmxhZyIsInVuaWNvZGUiLCJieXRlcyIsImNvZGUiLCJydW50aW1lIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIk9wIiwiZGVzYyIsIiRTeW1ib2wiLCJpdGVyYXRvclN5bWJvbCIsImFzeW5jSXRlcmF0b3JTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwidG9TdHJpbmdUYWdTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsImRlZmluZSIsIndyYXAiLCJpbm5lckZuIiwib3V0ZXJGbiIsInNlbGYiLCJ0cnlMb2NzTGlzdCIsInByb3RvR2VuZXJhdG9yIiwiR2VuZXJhdG9yIiwiZ2VuZXJhdG9yIiwiQ29udGV4dCIsIm1ha2VJbnZva2VNZXRob2QiLCJDb250aW51ZVNlbnRpbmVsIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsIkl0ZXJhdG9yUHJvdG90eXBlIiwiZ2V0UHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsIk5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlIiwiR3AiLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJfaW52b2tlIiwiQXN5bmNJdGVyYXRvciIsIlByb21pc2VJbXBsIiwicmVjb3JkIiwiX19hd2FpdCIsInVud3JhcHBlZCIsInByZXZpb3VzUHJvbWlzZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwiZG9uZVJlc3VsdCIsImRlbGVnYXRlIiwiZGVsZWdhdGVSZXN1bHQiLCJtYXliZUludm9rZURlbGVnYXRlIiwic2VudCIsIl9zZW50IiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJhYnJ1cHQiLCJpbmZvIiwicmVzdWx0TmFtZSIsIm5leHRMb2MiLCJwdXNoVHJ5RW50cnkiLCJsb2NzIiwiZW50cnkiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJyZXNldFRyeUVudHJ5IiwiY29tcGxldGlvbiIsInJlc2V0IiwiaXRlcmFibGUiLCJpdGVyYXRvck1ldGhvZCIsImlzTmFOIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwiZ2VuRnVuIiwiY3RvciIsIm1hcmsiLCJhd3JhcCIsImFzeW5jIiwicmV2ZXJzZSIsInNraXBUZW1wUmVzZXQiLCJwcmV2Iiwic3RvcCIsInJvb3RSZWNvcmQiLCJydmFsIiwiZXhjZXB0aW9uIiwiaGFuZGxlIiwibG9jIiwiY2F1Z2h0IiwiaGFzQ2F0Y2giLCJoYXNGaW5hbGx5IiwiZmluYWxseUVudHJ5IiwiZmluaXNoIiwiX2NhdGNoIiwidGhyb3duIiwiZGVsZWdhdGVZaWVsZCIsImFzeW5jR2VuZXJhdG9yU3RlcCIs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Q0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakMsa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixhQUFvQjs7QUFFckM7QUFDQTtBQUNBO0FBQ0EsWUFBWSxhQUFvQjs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIsaUJBQWlCO0FBQ2xDO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEtBQXFDO0FBQ3pDO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyx1QkFBdUI7QUFDekQsaUNBQWlDLHNCQUFzQjtBQUN2RDtBQUNBLGtCQUFrQjtBQUNsQixNQUFNLElBQXFDO0FBQzNDO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsYUFBb0I7QUFDdEM7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0EsaUJBQWlCLHVCQUF1QjtBQUN4QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsT0FBTyxVQUFVLElBQXFDO0FBQ3REO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsR0FBRyxVQUFVLElBQXFDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0EsbUJBQW1CLG1CQUFtQjtBQUN0QywrQkFBK0I7QUFDL0I7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFlBQVk7QUFDOUIsV0FBVztBQUNYO0FBQ0EsR0FBRyxVQUFVLElBQXFDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxJQUFxQztBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLE9BQU87QUFDckQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBLG9DQUFvQztBQUNwQztBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0EsTUFBTSxLQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBRVE7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDJCQUEyQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxTQUFTO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZDQUE2QyxxQ0FBcUMsRUFBRTtBQUNwRjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0NBQW9DLHlDQUF5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QUF1QjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsbUJBQW1CO0FBQ3hDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sS0FBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxJQUFxQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxTQUFTO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRLElBQXFDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLE9BQU87QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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OztBQUlBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsS0FBcUM7QUFDekQ7QUFDQSxNQUFNLFNBQUU7QUFDUjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwyQkFBMkI7QUFDOUMscUJBQXFCLCtCQUErQjtBQUNwRDtBQUNBO0FBQ0EsR0FBRztBQUNILHlCQUF5QjtBQUN6QjtBQUNBLHNCQUFzQixpQ0FBaUM7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUFxQztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0dBQWtHO0FBQ2xHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSyxNQUFNLEVBRU47QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEtBQXFDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBcUM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sS0FBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsS0FBcUM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssVUFBVSxJQUFxQztBQUNwRDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sS0FBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUFxQztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLG9CQUFvQjtBQUN6QztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0EsOEJBQThCO0FBQzlCLE1BQU0sSUFBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRLEtBQXFDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBcUM7QUFDN0M7QUFDQSxLQUFLLE1BQU0sRUFFTjtBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBLHNDQUFzQztBQUN0Qyw4Qzs7QUFFQTtBQUNBLFFBQVEsS0FBcUM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGVBQWU7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU0sS0FBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFO0FBQ3RFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVEsS0FBcUM7QUFDN0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLFlBQVksS0FBcUM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBLDBDQUEwQywyQkFBMkIsRUFBRTtBQUN2RSxLQUFLO0FBQ0w7QUFDQSwwQ0FBMEMsNEJBQTRCLEVBQUU7QUFDeEUsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixlQUFlO0FBQzlDLE1BQU0sSUFBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QU8sRUFBRWlCLE1BQU0sRUFBRTtNQUM1QyxJQUFJMnpCLEdBQUcsR0FBRy8zQixFQUFFLENBQUMwUSxLQUFLLENBQUMyaUIsSUFBSSxFQUFFNWlCLElBQUksQ0FBQztNQUM5QixTQUFTdW5CLEtBQUssQ0FBQzd5QixLQUFLLEVBQUU7UUFDcEIyeUIsa0JBQWtCLENBQUNDLEdBQUcsRUFBRTUwQixPQUFPLEVBQUVpQixNQUFNLEVBQUU0ekIsS0FBSyxFQUFFQyxNQUFNLEVBQUUsTUFBTSxFQUFFOXlCLEtBQUssQ0FBQztNQUN4RTtNQUNBLFNBQVM4eUIsTUFBTSxDQUFDbHpCLEdBQUcsRUFBRTtRQUNuQit5QixrQkFBa0IsQ0FBQ0MsR0FBRyxFQUFFNTBCLE9BQU8sRUFBRWlCLE1BQU0sRUFBRTR6QixLQUFLLEVBQUVDLE1BQU0sRUFBRSxPQUFPLEVBQUVsekIsR0FBRyxDQUFDO01BQ3ZFO01BQ0FpekIsS0FBSyxDQUFDM3BCLFNBQVMsQ0FBQztJQUNsQixDQUFDLENBQUM7RUFDSixDQUFDO0FBQ0g7QUFDQWdYLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHNFMsaUJBQWlCLEVBQUU3UyxNQUFNLENBQUNDLE9BQU8sQ0FBQ0YsVUFBVSxHQUFHLElBQUksRUFBRUMsTUFBTSxDQUFDQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUdELE1BQU0sQ0FBQ0MsT0FBTyxDIiwiZmlsZSI6ImNvbW1vbi92ZW5kb3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbml0VnVlSTE4biB9IGZyb20gJ0BkY2xvdWRpby91bmktaTE4bic7XHJcbmltcG9ydCBWdWUgZnJvbSAndnVlJztcclxuXHJcbmxldCByZWFsQXRvYjtcclxuXHJcbmNvbnN0IGI2NCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSc7XHJcbmNvbnN0IGI2NHJlID0gL14oPzpbQS1aYS16XFxkKy9dezR9KSo/KD86W0EtWmEtelxcZCsvXXsyfSg/Oj09KT98W0EtWmEtelxcZCsvXXszfT0/KT8kLztcclxuXHJcbmlmICh0eXBlb2YgYXRvYiAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gIHJlYWxBdG9iID0gZnVuY3Rpb24gKHN0cikge1xyXG4gICAgc3RyID0gU3RyaW5nKHN0cikucmVwbGFjZSgvW1xcdFxcblxcZlxcciBdKy9nLCAnJyk7XHJcbiAgICBpZiAoIWI2NHJlLnRlc3Qoc3RyKSkgeyB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZXhlY3V0ZSAnYXRvYicgb24gJ1dpbmRvdyc6IFRoZSBzdHJpbmcgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuXCIpIH1cclxuXHJcbiAgICAvLyBBZGRpbmcgdGhlIHBhZGRpbmcgaWYgbWlzc2luZywgZm9yIHNlbXBsaWNpdHlcclxuICAgIHN0ciArPSAnPT0nLnNsaWNlKDIgLSAoc3RyLmxlbmd0aCAmIDMpKTtcclxuICAgIHZhciBiaXRtYXA7IHZhciByZXN1bHQgPSAnJzsgdmFyIHIxOyB2YXIgcjI7IHZhciBpID0gMDtcclxuICAgIGZvciAoOyBpIDwgc3RyLmxlbmd0aDspIHtcclxuICAgICAgYml0bWFwID0gYjY0LmluZGV4T2Yoc3RyLmNoYXJBdChpKyspKSA8PCAxOCB8IGI2NC5pbmRleE9mKHN0ci5jaGFyQXQoaSsrKSkgPDwgMTIgfFxyXG4gICAgICAgICAgICAgICAgICAgIChyMSA9IGI2NC5pbmRleE9mKHN0ci5jaGFyQXQoaSsrKSkpIDw8IDYgfCAocjIgPSBiNjQuaW5kZXhPZihzdHIuY2hhckF0KGkrKykpKTtcclxuXHJcbiAgICAgIHJlc3VsdCArPSByMSA9PT0gNjQgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGJpdG1hcCA+PiAxNiAmIDI1NSlcclxuICAgICAgICA6IHIyID09PSA2NCA/IFN0cmluZy5mcm9tQ2hhckNvZGUoYml0bWFwID4+IDE2ICYgMjU1LCBiaXRtYXAgPj4gOCAmIDI1NSlcclxuICAgICAgICAgIDogU3RyaW5nLmZyb21DaGFyQ29kZShiaXRtYXAgPj4gMTYgJiAyNTUsIGJpdG1hcCA+PiA4ICYgMjU1LCBiaXRtYXAgJiAyNTUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdFxyXG4gIH07XHJcbn0gZWxzZSB7XHJcbiAgLy8g5rOo5oSPYXRvYuWPquiDveWcqOWFqOWxgOWvueixoeS4iuiwg+eUqO+8jOS+i+Wmgu+8mmBjb25zdCBCYXNlNjQgPSB7YXRvYn07QmFzZTY0LmF0b2IoJ3h4eHgnKWDmmK/plJnor6/nmoTnlKjms5VcclxuICByZWFsQXRvYiA9IGF0b2I7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGI2NERlY29kZVVuaWNvZGUgKHN0cikge1xyXG4gIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocmVhbEF0b2Ioc3RyKS5zcGxpdCgnJykubWFwKGZ1bmN0aW9uIChjKSB7XHJcbiAgICByZXR1cm4gJyUnICsgKCcwMCcgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMilcclxuICB9KS5qb2luKCcnKSlcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXJJbmZvICgpIHtcclxuICBjb25zdCB0b2tlbiA9ICggamQpLmdldFN0b3JhZ2VTeW5jKCd1bmlfaWRfdG9rZW4nKSB8fCAnJztcclxuICBjb25zdCB0b2tlbkFyciA9IHRva2VuLnNwbGl0KCcuJyk7XHJcbiAgaWYgKCF0b2tlbiB8fCB0b2tlbkFyci5sZW5ndGggIT09IDMpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHVpZDogbnVsbCxcclxuICAgICAgcm9sZTogW10sXHJcbiAgICAgIHBlcm1pc3Npb246IFtdLFxyXG4gICAgICB0b2tlbkV4cGlyZWQ6IDBcclxuICAgIH1cclxuICB9XHJcbiAgbGV0IHVzZXJJbmZvO1xyXG4gIHRyeSB7XHJcbiAgICB1c2VySW5mbyA9IEpTT04ucGFyc2UoYjY0RGVjb2RlVW5pY29kZSh0b2tlbkFyclsxXSkpO1xyXG4gIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ+iOt+WPluW9k+WJjeeUqOaIt+S/oeaBr+WHuumUme+8jOivpue7humUmeivr+S/oeaBr+S4uu+8micgKyBlcnJvci5tZXNzYWdlKVxyXG4gIH1cclxuICB1c2VySW5mby50b2tlbkV4cGlyZWQgPSB1c2VySW5mby5leHAgKiAxMDAwO1xyXG4gIGRlbGV0ZSB1c2VySW5mby5leHA7XHJcbiAgZGVsZXRlIHVzZXJJbmZvLmlhdDtcclxuICByZXR1cm4gdXNlckluZm9cclxufVxyXG5cclxuZnVuY3Rpb24gdW5pSWRNaXhpbiAoVnVlKSB7XHJcbiAgVnVlLnByb3RvdHlwZS51bmlJREhhc1JvbGUgPSBmdW5jdGlvbiAocm9sZUlkKSB7XHJcbiAgICBjb25zdCB7XHJcbiAgICAgIHJvbGVcclxuICAgIH0gPSBnZXRDdXJyZW50VXNlckluZm8oKTtcclxuICAgIHJldHVybiByb2xlLmluZGV4T2Yocm9sZUlkKSA+IC0xXHJcbiAgfTtcclxuICBWdWUucHJvdG90eXBlLnVuaUlESGFzUGVybWlzc2lvbiA9IGZ1bmN0aW9uIChwZXJtaXNzaW9uSWQpIHtcclxuICAgIGNvbnN0IHtcclxuICAgICAgcGVybWlzc2lvblxyXG4gICAgfSA9IGdldEN1cnJlbnRVc2VySW5mbygpO1xyXG4gICAgcmV0dXJuIHRoaXMudW5pSURIYXNSb2xlKCdhZG1pbicpIHx8IHBlcm1pc3Npb24uaW5kZXhPZihwZXJtaXNzaW9uSWQpID4gLTFcclxuICB9O1xyXG4gIFZ1ZS5wcm90b3R5cGUudW5pSURUb2tlblZhbGlkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3Qge1xyXG4gICAgICB0b2tlbkV4cGlyZWRcclxuICAgIH0gPSBnZXRDdXJyZW50VXNlckluZm8oKTtcclxuICAgIHJldHVybiB0b2tlbkV4cGlyZWQgPiBEYXRlLm5vdygpXHJcbiAgfTtcclxufVxyXG5cclxuY29uc3QgX3RvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcclxuY29uc3QgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xyXG5cclxuZnVuY3Rpb24gaXNGbiAoZm4pIHtcclxuICByZXR1cm4gdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzU3RyIChzdHIpIHtcclxuICByZXR1cm4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZydcclxufVxyXG5cclxuZnVuY3Rpb24gaXNPYmplY3QgKG9iaikge1xyXG4gIHJldHVybiBvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCdcclxufVxyXG5cclxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCAob2JqKSB7XHJcbiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IE9iamVjdF0nXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhc093biAob2JqLCBrZXkpIHtcclxuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSlcclxufVxyXG5cclxuZnVuY3Rpb24gbm9vcCAoKSB7IH1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYSBjYWNoZWQgdmVyc2lvbiBvZiBhIHB1cmUgZnVuY3Rpb24uXHJcbiAqL1xyXG5mdW5jdGlvbiBjYWNoZWQgKGZuKSB7XHJcbiAgY29uc3QgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xyXG4gIHJldHVybiBmdW5jdGlvbiBjYWNoZWRGbiAoc3RyKSB7XHJcbiAgICBjb25zdCBoaXQgPSBjYWNoZVtzdHJdO1xyXG4gICAgcmV0dXJuIGhpdCB8fCAoY2FjaGVbc3RyXSA9IGZuKHN0cikpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQ2FtZWxpemUgYSBoeXBoZW4tZGVsaW1pdGVkIHN0cmluZy5cclxuICovXHJcbmNvbnN0IGNhbWVsaXplUkUgPSAvLShcXHcpL2c7XHJcbmNvbnN0IGNhbWVsaXplID0gY2FjaGVkKChzdHIpID0+IHtcclxuICByZXR1cm4gc3RyLnJlcGxhY2UoY2FtZWxpemVSRSwgKF8sIGMpID0+IGMgPyBjLnRvVXBwZXJDYXNlKCkgOiAnJylcclxufSk7XHJcblxyXG5jb25zdCBIT09LUyA9IFtcclxuICAnaW52b2tlJyxcclxuICAnc3VjY2VzcycsXHJcbiAgJ2ZhaWwnLFxyXG4gICdjb21wbGV0ZScsXHJcbiAgJ3JldHVyblZhbHVlJ1xyXG5dO1xyXG5cclxuY29uc3QgZ2xvYmFsSW50ZXJjZXB0b3JzID0ge307XHJcbmNvbnN0IHNjb3BlZEludGVyY2VwdG9ycyA9IHt9O1xyXG5cclxuZnVuY3Rpb24gbWVyZ2VIb29rIChwYXJlbnRWYWwsIGNoaWxkVmFsKSB7XHJcbiAgY29uc3QgcmVzID0gY2hpbGRWYWxcclxuICAgID8gcGFyZW50VmFsXHJcbiAgICAgID8gcGFyZW50VmFsLmNvbmNhdChjaGlsZFZhbClcclxuICAgICAgOiBBcnJheS5pc0FycmF5KGNoaWxkVmFsKVxyXG4gICAgICAgID8gY2hpbGRWYWwgOiBbY2hpbGRWYWxdXHJcbiAgICA6IHBhcmVudFZhbDtcclxuICByZXR1cm4gcmVzXHJcbiAgICA/IGRlZHVwZUhvb2tzKHJlcylcclxuICAgIDogcmVzXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRlZHVwZUhvb2tzIChob29rcykge1xyXG4gIGNvbnN0IHJlcyA9IFtdO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaG9va3MubGVuZ3RoOyBpKyspIHtcclxuICAgIGlmIChyZXMuaW5kZXhPZihob29rc1tpXSkgPT09IC0xKSB7XHJcbiAgICAgIHJlcy5wdXNoKGhvb2tzW2ldKTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHJlc1xyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVIb29rIChob29rcywgaG9vaykge1xyXG4gIGNvbnN0IGluZGV4ID0gaG9va3MuaW5kZXhPZihob29rKTtcclxuICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICBob29rcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gbWVyZ2VJbnRlcmNlcHRvckhvb2sgKGludGVyY2VwdG9yLCBvcHRpb24pIHtcclxuICBPYmplY3Qua2V5cyhvcHRpb24pLmZvckVhY2goaG9vayA9PiB7XHJcbiAgICBpZiAoSE9PS1MuaW5kZXhPZihob29rKSAhPT0gLTEgJiYgaXNGbihvcHRpb25baG9va10pKSB7XHJcbiAgICAgIGludGVyY2VwdG9yW2hvb2tdID0gbWVyZ2VIb29rKGludGVyY2VwdG9yW2hvb2tdLCBvcHRpb25baG9va10pO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVJbnRlcmNlcHRvckhvb2sgKGludGVyY2VwdG9yLCBvcHRpb24pIHtcclxuICBpZiAoIWludGVyY2VwdG9yIHx8ICFvcHRpb24pIHtcclxuICAgIHJldHVyblxyXG4gIH1cclxuICBPYmplY3Qua2V5cyhvcHRpb24pLmZvckVhY2goaG9vayA9PiB7XHJcbiAgICBpZiAoSE9PS1MuaW5kZXhPZihob29rKSAhPT0gLTEgJiYgaXNGbihvcHRpb25baG9va10pKSB7XHJcbiAgICAgIHJlbW92ZUhvb2soaW50ZXJjZXB0b3JbaG9va10sIG9wdGlvbltob29rXSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZEludGVyY2VwdG9yIChtZXRob2QsIG9wdGlvbikge1xyXG4gIGlmICh0eXBlb2YgbWV0aG9kID09PSAnc3RyaW5nJyAmJiBpc1BsYWluT2JqZWN0KG9wdGlvbikpIHtcclxuICAgIG1lcmdlSW50ZXJjZXB0b3JIb29rKHNjb3BlZEludGVyY2VwdG9yc1ttZXRob2RdIHx8IChzY29wZWRJbnRlcmNlcHRvcnNbbWV0aG9kXSA9IHt9KSwgb3B0aW9uKTtcclxuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QobWV0aG9kKSkge1xyXG4gICAgbWVyZ2VJbnRlcmNlcHRvckhvb2soZ2xvYmFsSW50ZXJjZXB0b3JzLCBtZXRob2QpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcmVtb3ZlSW50ZXJjZXB0b3IgKG1ldGhvZCwgb3B0aW9uKSB7XHJcbiAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7XHJcbiAgICBpZiAoaXNQbGFpbk9iamVjdChvcHRpb24pKSB7XHJcbiAgICAgIHJlbW92ZUludGVyY2VwdG9ySG9vayhzY29wZWRJbnRlcmNlcHRvcnNbbWV0aG9kXSwgb3B0aW9uKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRlbGV0ZSBzY29wZWRJbnRlcmNlcHRvcnNbbWV0aG9kXTtcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QobWV0aG9kKSkge1xyXG4gICAgcmVtb3ZlSW50ZXJjZXB0b3JIb29rKGdsb2JhbEludGVyY2VwdG9ycywgbWV0aG9kKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdyYXBwZXJIb29rIChob29rKSB7XHJcbiAgcmV0dXJuIGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICByZXR1cm4gaG9vayhkYXRhKSB8fCBkYXRhXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBpc1Byb21pc2UgKG9iaikge1xyXG4gIHJldHVybiAhIW9iaiAmJiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykgJiYgdHlwZW9mIG9iai50aGVuID09PSAnZnVuY3Rpb24nXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHF1ZXVlIChob29rcywgZGF0YSkge1xyXG4gIGxldCBwcm9taXNlID0gZmFsc2U7XHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7IGkrKykge1xyXG4gICAgY29uc3QgaG9vayA9IGhvb2tzW2ldO1xyXG4gICAgaWYgKHByb21pc2UpIHtcclxuICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh3cmFwcGVySG9vayhob29rKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCByZXMgPSBob29rKGRhdGEpO1xyXG4gICAgICBpZiAoaXNQcm9taXNlKHJlcykpIHtcclxuICAgICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHJlcyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJlcyA9PT0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgdGhlbiAoKSB7IH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHByb21pc2UgfHwge1xyXG4gICAgdGhlbiAoY2FsbGJhY2spIHtcclxuICAgICAgcmV0dXJuIGNhbGxiYWNrKGRhdGEpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB3cmFwcGVyT3B0aW9ucyAoaW50ZXJjZXB0b3IsIG9wdGlvbnMgPSB7fSkge1xyXG4gIFsnc3VjY2VzcycsICdmYWlsJywgJ2NvbXBsZXRlJ10uZm9yRWFjaChuYW1lID0+IHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGludGVyY2VwdG9yW25hbWVdKSkge1xyXG4gICAgICBjb25zdCBvbGRDYWxsYmFjayA9IG9wdGlvbnNbbmFtZV07XHJcbiAgICAgIG9wdGlvbnNbbmFtZV0gPSBmdW5jdGlvbiBjYWxsYmFja0ludGVyY2VwdG9yIChyZXMpIHtcclxuICAgICAgICBxdWV1ZShpbnRlcmNlcHRvcltuYW1lXSwgcmVzKS50aGVuKChyZXMpID0+IHtcclxuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLW1peGVkLW9wZXJhdG9ycyAqL1xyXG4gICAgICAgICAgcmV0dXJuIGlzRm4ob2xkQ2FsbGJhY2spICYmIG9sZENhbGxiYWNrKHJlcykgfHwgcmVzXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIG9wdGlvbnNcclxufVxyXG5cclxuZnVuY3Rpb24gd3JhcHBlclJldHVyblZhbHVlIChtZXRob2QsIHJldHVyblZhbHVlKSB7XHJcbiAgY29uc3QgcmV0dXJuVmFsdWVIb29rcyA9IFtdO1xyXG4gIGlmIChBcnJheS5pc0FycmF5KGdsb2JhbEludGVyY2VwdG9ycy5yZXR1cm5WYWx1ZSkpIHtcclxuICAgIHJldHVyblZhbHVlSG9va3MucHVzaCguLi5nbG9iYWxJbnRlcmNlcHRvcnMucmV0dXJuVmFsdWUpO1xyXG4gIH1cclxuICBjb25zdCBpbnRlcmNlcHRvciA9IHNjb3BlZEludGVyY2VwdG9yc1ttZXRob2RdO1xyXG4gIGlmIChpbnRlcmNlcHRvciAmJiBBcnJheS5pc0FycmF5KGludGVyY2VwdG9yLnJldHVyblZhbHVlKSkge1xyXG4gICAgcmV0dXJuVmFsdWVIb29rcy5wdXNoKC4uLmludGVyY2VwdG9yLnJldHVyblZhbHVlKTtcclxuICB9XHJcbiAgcmV0dXJuVmFsdWVIb29rcy5mb3JFYWNoKGhvb2sgPT4ge1xyXG4gICAgcmV0dXJuVmFsdWUgPSBob29rKHJldHVyblZhbHVlKSB8fCByZXR1cm5WYWx1ZTtcclxuICB9KTtcclxuICByZXR1cm4gcmV0dXJuVmFsdWVcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0QXBpSW50ZXJjZXB0b3JIb29rcyAobWV0aG9kKSB7XHJcbiAgY29uc3QgaW50ZXJjZXB0b3IgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xyXG4gIE9iamVjdC5rZXlzKGdsb2JhbEludGVyY2VwdG9ycykuZm9yRWFjaChob29rID0+IHtcclxuICAgIGlmIChob29rICE9PSAncmV0dXJuVmFsdWUnKSB7XHJcbiAgICAgIGludGVyY2VwdG9yW2hvb2tdID0gZ2xvYmFsSW50ZXJjZXB0b3JzW2hvb2tdLnNsaWNlKCk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgY29uc3Qgc2NvcGVkSW50ZXJjZXB0b3IgPSBzY29wZWRJbnRlcmNlcHRvcnNbbWV0aG9kXTtcclxuICBpZiAoc2NvcGVkSW50ZXJjZXB0b3IpIHtcclxuICAgIE9iamVjdC5rZXlzKHNjb3BlZEludGVyY2VwdG9yKS5mb3JFYWNoKGhvb2sgPT4ge1xyXG4gICAgICBpZiAoaG9vayAhPT0gJ3JldHVyblZhbHVlJykge1xyXG4gICAgICAgIGludGVyY2VwdG9yW2hvb2tdID0gKGludGVyY2VwdG9yW2hvb2tdIHx8IFtdKS5jb25jYXQoc2NvcGVkSW50ZXJjZXB0b3JbaG9va10pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcmV0dXJuIGludGVyY2VwdG9yXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGludm9rZUFwaSAobWV0aG9kLCBhcGksIG9wdGlvbnMsIC4uLnBhcmFtcykge1xyXG4gIGNvbnN0IGludGVyY2VwdG9yID0gZ2V0QXBpSW50ZXJjZXB0b3JIb29rcyhtZXRob2QpO1xyXG4gIGlmIChpbnRlcmNlcHRvciAmJiBPYmplY3Qua2V5cyhpbnRlcmNlcHRvcikubGVuZ3RoKSB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbnRlcmNlcHRvci5pbnZva2UpKSB7XHJcbiAgICAgIGNvbnN0IHJlcyA9IHF1ZXVlKGludGVyY2VwdG9yLmludm9rZSwgb3B0aW9ucyk7XHJcbiAgICAgIHJldHVybiByZXMudGhlbigob3B0aW9ucykgPT4ge1xyXG4gICAgICAgIHJldHVybiBhcGkod3JhcHBlck9wdGlvbnMoaW50ZXJjZXB0b3IsIG9wdGlvbnMpLCAuLi5wYXJhbXMpXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gYXBpKHdyYXBwZXJPcHRpb25zKGludGVyY2VwdG9yLCBvcHRpb25zKSwgLi4ucGFyYW1zKVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gYXBpKG9wdGlvbnMsIC4uLnBhcmFtcylcclxufVxyXG5cclxuY29uc3QgcHJvbWlzZUludGVyY2VwdG9yID0ge1xyXG4gIHJldHVyblZhbHVlIChyZXMpIHtcclxuICAgIGlmICghaXNQcm9taXNlKHJlcykpIHtcclxuICAgICAgcmV0dXJuIHJlc1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgcmVzLnRoZW4ocmVzID0+IHtcclxuICAgICAgICBpZiAocmVzWzBdKSB7XHJcbiAgICAgICAgICByZWplY3QocmVzWzBdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzb2x2ZShyZXNbMV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KVxyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IFNZTkNfQVBJX1JFID1cclxuICAvXlxcJHxXaW5kb3ckfFdpbmRvd1N0eWxlJHxzZW5kSG9zdEV2ZW50fHNlbmROYXRpdmVFdmVudHxyZXN0b3JlR2xvYmFsfHJlcXVpcmVHbG9iYWx8Z2V0Q3VycmVudFN1Yk5WdWV8Z2V0TWVudUJ1dHRvbkJvdW5kaW5nQ2xpZW50UmVjdHxecmVwb3J0fGludGVyY2VwdG9yc3xJbnRlcmNlcHRvciR8Z2V0U3ViTlZ1ZUJ5SWR8cmVxdWlyZU5hdGl2ZVBsdWdpbnx1cHgycHh8aGlkZUtleWJvYXJkfGNhbklVc2V8XmNyZWF0ZXxTeW5jJHxNYW5hZ2VyJHxiYXNlNjRUb0FycmF5QnVmZmVyfGFycmF5QnVmZmVyVG9CYXNlNjR8Z2V0TG9jYWxlfHNldExvY2FsZXxpbnZva2VQdXNoQ2FsbGJhY2t8Z2V0V2luZG93SW5mb3xnZXREZXZpY2VJbmZvfGdldEFwcEJhc2VJbmZvfGdldFN5c3RlbVNldHRpbmd8Z2V0QXBwQXV0aG9yaXplU2V0dGluZy87XHJcblxyXG5jb25zdCBDT05URVhUX0FQSV9SRSA9IC9eY3JlYXRlfE1hbmFnZXIkLztcclxuXHJcbi8vIENvbnRleHTkvovlpJbmg4XlhrVcclxuY29uc3QgQ09OVEVYVF9BUElfUkVfRVhDID0gWydjcmVhdGVCTEVDb25uZWN0aW9uJ107XHJcblxyXG4vLyDlkIzmraXkvovlpJbmg4XlhrVcclxuY29uc3QgQVNZTkNfQVBJID0gWydjcmVhdGVCTEVDb25uZWN0aW9uJywgJ2NyZWF0ZVB1c2hNZXNzYWdlJ107XHJcblxyXG5jb25zdCBDQUxMQkFDS19BUElfUkUgPSAvXm9ufF5vZmYvO1xyXG5cclxuZnVuY3Rpb24gaXNDb250ZXh0QXBpIChuYW1lKSB7XHJcbiAgcmV0dXJuIENPTlRFWFRfQVBJX1JFLnRlc3QobmFtZSkgJiYgQ09OVEVYVF9BUElfUkVfRVhDLmluZGV4T2YobmFtZSkgPT09IC0xXHJcbn1cclxuZnVuY3Rpb24gaXNTeW5jQXBpIChuYW1lKSB7XHJcbiAgcmV0dXJuIFNZTkNfQVBJX1JFLnRlc3QobmFtZSkgJiYgQVNZTkNfQVBJLmluZGV4T2YobmFtZSkgPT09IC0xXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzQ2FsbGJhY2tBcGkgKG5hbWUpIHtcclxuICByZXR1cm4gQ0FMTEJBQ0tfQVBJX1JFLnRlc3QobmFtZSkgJiYgbmFtZSAhPT0gJ29uUHVzaCdcclxufVxyXG5cclxuZnVuY3Rpb24gaGFuZGxlUHJvbWlzZSAocHJvbWlzZSkge1xyXG4gIHJldHVybiBwcm9taXNlLnRoZW4oZGF0YSA9PiB7XHJcbiAgICByZXR1cm4gW251bGwsIGRhdGFdXHJcbiAgfSlcclxuICAgIC5jYXRjaChlcnIgPT4gW2Vycl0pXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3VsZFByb21pc2UgKG5hbWUpIHtcclxuICBpZiAoXHJcbiAgICBpc0NvbnRleHRBcGkobmFtZSkgfHxcclxuICAgIGlzU3luY0FwaShuYW1lKSB8fFxyXG4gICAgaXNDYWxsYmFja0FwaShuYW1lKVxyXG4gICkge1xyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG4gIHJldHVybiB0cnVlXHJcbn1cclxuXHJcbi8qIGVzbGludC1kaXNhYmxlIG5vLWV4dGVuZC1uYXRpdmUgKi9cclxuaWYgKCFQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5KSB7XHJcbiAgUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xyXG4gICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuY29uc3RydWN0b3I7XHJcbiAgICByZXR1cm4gdGhpcy50aGVuKFxyXG4gICAgICB2YWx1ZSA9PiBwcm9taXNlLnJlc29sdmUoY2FsbGJhY2soKSkudGhlbigoKSA9PiB2YWx1ZSksXHJcbiAgICAgIHJlYXNvbiA9PiBwcm9taXNlLnJlc29sdmUoY2FsbGJhY2soKSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgdGhyb3cgcmVhc29uXHJcbiAgICAgIH0pXHJcbiAgICApXHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJvbWlzaWZ5IChuYW1lLCBhcGkpIHtcclxuICBpZiAoIXNob3VsZFByb21pc2UobmFtZSkgfHwgIWlzRm4oYXBpKSkge1xyXG4gICAgcmV0dXJuIGFwaVxyXG4gIH1cclxuICByZXR1cm4gZnVuY3Rpb24gcHJvbWlzZUFwaSAob3B0aW9ucyA9IHt9LCAuLi5wYXJhbXMpIHtcclxuICAgIGlmIChpc0ZuKG9wdGlvbnMuc3VjY2VzcykgfHwgaXNGbihvcHRpb25zLmZhaWwpIHx8IGlzRm4ob3B0aW9ucy5jb21wbGV0ZSkpIHtcclxuICAgICAgcmV0dXJuIHdyYXBwZXJSZXR1cm5WYWx1ZShuYW1lLCBpbnZva2VBcGkobmFtZSwgYXBpLCBvcHRpb25zLCAuLi5wYXJhbXMpKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHdyYXBwZXJSZXR1cm5WYWx1ZShuYW1lLCBoYW5kbGVQcm9taXNlKG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaW52b2tlQXBpKG5hbWUsIGFwaSwgT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xyXG4gICAgICAgIHN1Y2Nlc3M6IHJlc29sdmUsXHJcbiAgICAgICAgZmFpbDogcmVqZWN0XHJcbiAgICAgIH0pLCAuLi5wYXJhbXMpO1xyXG4gICAgfSkpKVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgRVBTID0gMWUtNDtcclxuY29uc3QgQkFTRV9ERVZJQ0VfV0lEVEggPSA3NTA7XHJcbmxldCBpc0lPUyA9IGZhbHNlO1xyXG5sZXQgZGV2aWNlV2lkdGggPSAwO1xyXG5sZXQgZGV2aWNlRFBSID0gMDtcclxuXHJcbmZ1bmN0aW9uIGNoZWNrRGV2aWNlV2lkdGggKCkge1xyXG4gIGNvbnN0IHtcclxuICAgIHBsYXRmb3JtLFxyXG4gICAgcGl4ZWxSYXRpbyxcclxuICAgIHdpbmRvd1dpZHRoXHJcbiAgfSA9IGpkLmdldFN5c3RlbUluZm9TeW5jKCk7IC8vIHVuaT0+amQgcnVudGltZSDnvJbor5Hnm67moIfmmK8gdW5pIOWvueixoe+8jOWGhemDqOS4jeWFgeiuuOebtOaOpeS9v+eUqCB1bmlcclxuXHJcbiAgZGV2aWNlV2lkdGggPSB3aW5kb3dXaWR0aDtcclxuICBkZXZpY2VEUFIgPSBwaXhlbFJhdGlvO1xyXG4gIGlzSU9TID0gcGxhdGZvcm0gPT09ICdpb3MnO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1cHgycHggKG51bWJlciwgbmV3RGV2aWNlV2lkdGgpIHtcclxuICBpZiAoZGV2aWNlV2lkdGggPT09IDApIHtcclxuICAgIGNoZWNrRGV2aWNlV2lkdGgoKTtcclxuICB9XHJcblxyXG4gIG51bWJlciA9IE51bWJlcihudW1iZXIpO1xyXG4gIGlmIChudW1iZXIgPT09IDApIHtcclxuICAgIHJldHVybiAwXHJcbiAgfVxyXG4gIGxldCByZXN1bHQgPSAobnVtYmVyIC8gQkFTRV9ERVZJQ0VfV0lEVEgpICogKG5ld0RldmljZVdpZHRoIHx8IGRldmljZVdpZHRoKTtcclxuICBpZiAocmVzdWx0IDwgMCkge1xyXG4gICAgcmVzdWx0ID0gLXJlc3VsdDtcclxuICB9XHJcbiAgcmVzdWx0ID0gTWF0aC5mbG9vcihyZXN1bHQgKyBFUFMpO1xyXG4gIGlmIChyZXN1bHQgPT09IDApIHtcclxuICAgIGlmIChkZXZpY2VEUFIgPT09IDEgfHwgIWlzSU9TKSB7XHJcbiAgICAgIHJlc3VsdCA9IDE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSAwLjU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBudW1iZXIgPCAwID8gLXJlc3VsdCA6IHJlc3VsdFxyXG59XHJcblxyXG5jb25zdCBMT0NBTEVfWkhfSEFOUyA9ICd6aC1IYW5zJztcclxuY29uc3QgTE9DQUxFX1pIX0hBTlQgPSAnemgtSGFudCc7XHJcbmNvbnN0IExPQ0FMRV9FTiA9ICdlbic7XHJcbmNvbnN0IExPQ0FMRV9GUiA9ICdmcic7XHJcbmNvbnN0IExPQ0FMRV9FUyA9ICdlcyc7XHJcblxyXG5jb25zdCBtZXNzYWdlcyA9IHt9O1xyXG5cclxubGV0IGxvY2FsZTtcclxuXHJcbntcclxuICBsb2NhbGUgPSBub3JtYWxpemVMb2NhbGUoamQuZ2V0U3lzdGVtSW5mb1N5bmMoKS5sYW5ndWFnZSkgfHwgTE9DQUxFX0VOO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0STE4bk1lc3NhZ2VzICgpIHtcclxuICBpZiAoIWlzRW5hYmxlTG9jYWxlKCkpIHtcclxuICAgIHJldHVyblxyXG4gIH1cclxuICBjb25zdCBsb2NhbGVLZXlzID0gT2JqZWN0LmtleXMoX191bmlDb25maWcubG9jYWxlcyk7XHJcbiAgaWYgKGxvY2FsZUtleXMubGVuZ3RoKSB7XHJcbiAgICBsb2NhbGVLZXlzLmZvckVhY2goKGxvY2FsZSkgPT4ge1xyXG4gICAgICBjb25zdCBjdXJNZXNzYWdlcyA9IG1lc3NhZ2VzW2xvY2FsZV07XHJcbiAgICAgIGNvbnN0IHVzZXJNZXNzYWdlcyA9IF9fdW5pQ29uZmlnLmxvY2FsZXNbbG9jYWxlXTtcclxuICAgICAgaWYgKGN1ck1lc3NhZ2VzKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihjdXJNZXNzYWdlcywgdXNlck1lc3NhZ2VzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtZXNzYWdlc1tsb2NhbGVdID0gdXNlck1lc3NhZ2VzO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmluaXRJMThuTWVzc2FnZXMoKTtcclxuXHJcbmNvbnN0IGkxOG4gPSBpbml0VnVlSTE4bihcclxuICBsb2NhbGUsXHJcbiAgIHt9XHJcbik7XHJcbmNvbnN0IHQgPSBpMThuLnQ7XHJcbmNvbnN0IGkxOG5NaXhpbiA9IChpMThuLm1peGluID0ge1xyXG4gIGJlZm9yZUNyZWF0ZSAoKSB7XHJcbiAgICBjb25zdCB1bndhdGNoID0gaTE4bi5pMThuLndhdGNoTG9jYWxlKCgpID0+IHtcclxuICAgICAgdGhpcy4kZm9yY2VVcGRhdGUoKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy4kb25jZSgnaG9vazpiZWZvcmVEZXN0cm95JywgZnVuY3Rpb24gKCkge1xyXG4gICAgICB1bndhdGNoKCk7XHJcbiAgICB9KTtcclxuICB9LFxyXG4gIG1ldGhvZHM6IHtcclxuICAgICQkdCAoa2V5LCB2YWx1ZXMpIHtcclxuICAgICAgcmV0dXJuIHQoa2V5LCB2YWx1ZXMpXHJcbiAgICB9XHJcbiAgfVxyXG59KTtcclxuY29uc3Qgc2V0TG9jYWxlID0gaTE4bi5zZXRMb2NhbGU7XHJcbmNvbnN0IGdldExvY2FsZSA9IGkxOG4uZ2V0TG9jYWxlO1xyXG5cclxuZnVuY3Rpb24gaW5pdEFwcExvY2FsZSAoVnVlLCBhcHBWbSwgbG9jYWxlKSB7XHJcbiAgY29uc3Qgc3RhdGUgPSBWdWUub2JzZXJ2YWJsZSh7XHJcbiAgICBsb2NhbGU6IGxvY2FsZSB8fCBpMThuLmdldExvY2FsZSgpXHJcbiAgfSk7XHJcbiAgY29uc3QgbG9jYWxlV2F0Y2hlcnMgPSBbXTtcclxuICBhcHBWbS4kd2F0Y2hMb2NhbGUgPSBmbiA9PiB7XHJcbiAgICBsb2NhbGVXYXRjaGVycy5wdXNoKGZuKTtcclxuICB9O1xyXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcHBWbSwgJyRsb2NhbGUnLCB7XHJcbiAgICBnZXQgKCkge1xyXG4gICAgICByZXR1cm4gc3RhdGUubG9jYWxlXHJcbiAgICB9LFxyXG4gICAgc2V0ICh2KSB7XHJcbiAgICAgIHN0YXRlLmxvY2FsZSA9IHY7XHJcbiAgICAgIGxvY2FsZVdhdGNoZXJzLmZvckVhY2god2F0Y2ggPT4gd2F0Y2godikpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0VuYWJsZUxvY2FsZSAoKSB7XHJcbiAgcmV0dXJuIHR5cGVvZiBfX3VuaUNvbmZpZyAhPT0gJ3VuZGVmaW5lZCcgJiYgX191bmlDb25maWcubG9jYWxlcyAmJiAhIU9iamVjdC5rZXlzKF9fdW5pQ29uZmlnLmxvY2FsZXMpLmxlbmd0aFxyXG59XHJcblxyXG5mdW5jdGlvbiBpbmNsdWRlIChzdHIsIHBhcnRzKSB7XHJcbiAgcmV0dXJuICEhcGFydHMuZmluZCgocGFydCkgPT4gc3RyLmluZGV4T2YocGFydCkgIT09IC0xKVxyXG59XHJcblxyXG5mdW5jdGlvbiBzdGFydHNXaXRoIChzdHIsIHBhcnRzKSB7XHJcbiAgcmV0dXJuIHBhcnRzLmZpbmQoKHBhcnQpID0+IHN0ci5pbmRleE9mKHBhcnQpID09PSAwKVxyXG59XHJcblxyXG5mdW5jdGlvbiBub3JtYWxpemVMb2NhbGUgKGxvY2FsZSwgbWVzc2FnZXMpIHtcclxuICBpZiAoIWxvY2FsZSkge1xyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG4gIGxvY2FsZSA9IGxvY2FsZS50cmltKCkucmVwbGFjZSgvXy9nLCAnLScpO1xyXG4gIGlmIChtZXNzYWdlcyAmJiBtZXNzYWdlc1tsb2NhbGVdKSB7XHJcbiAgICByZXR1cm4gbG9jYWxlXHJcbiAgfVxyXG4gIGxvY2FsZSA9IGxvY2FsZS50b0xvd2VyQ2FzZSgpO1xyXG4gIGlmIChsb2NhbGUgPT09ICdjaGluZXNlJykge1xyXG4gICAgLy8g5pSv5LuY5a6dXHJcbiAgICByZXR1cm4gTE9DQUxFX1pIX0hBTlNcclxuICB9XHJcbiAgaWYgKGxvY2FsZS5pbmRleE9mKCd6aCcpID09PSAwKSB7XHJcbiAgICBpZiAobG9jYWxlLmluZGV4T2YoJy1oYW5zJykgPiAtMSkge1xyXG4gICAgICByZXR1cm4gTE9DQUxFX1pIX0hBTlNcclxuICAgIH1cclxuICAgIGlmIChsb2NhbGUuaW5kZXhPZignLWhhbnQnKSA+IC0xKSB7XHJcbiAgICAgIHJldHVybiBMT0NBTEVfWkhfSEFOVFxyXG4gICAgfVxyXG4gICAgaWYgKGluY2x1ZGUobG9jYWxlLCBbJy10dycsICctaGsnLCAnLW1vJywgJy1jaHQnXSkpIHtcclxuICAgICAgcmV0dXJuIExPQ0FMRV9aSF9IQU5UXHJcbiAgICB9XHJcbiAgICByZXR1cm4gTE9DQUxFX1pIX0hBTlNcclxuICB9XHJcbiAgY29uc3QgbGFuZyA9IHN0YXJ0c1dpdGgobG9jYWxlLCBbTE9DQUxFX0VOLCBMT0NBTEVfRlIsIExPQ0FMRV9FU10pO1xyXG4gIGlmIChsYW5nKSB7XHJcbiAgICByZXR1cm4gbGFuZ1xyXG4gIH1cclxufVxyXG4vLyBleHBvcnQgZnVuY3Rpb24gaW5pdEkxOG4oKSB7XHJcbi8vICAgY29uc3QgbG9jYWxlS2V5cyA9IE9iamVjdC5rZXlzKF9fdW5pQ29uZmlnLmxvY2FsZXMgfHwge30pXHJcbi8vICAgaWYgKGxvY2FsZUtleXMubGVuZ3RoKSB7XHJcbi8vICAgICBsb2NhbGVLZXlzLmZvckVhY2goKGxvY2FsZSkgPT5cclxuLy8gICAgICAgaTE4bi5hZGQobG9jYWxlLCBfX3VuaUNvbmZpZy5sb2NhbGVzW2xvY2FsZV0pXHJcbi8vICAgICApXHJcbi8vICAgfVxyXG4vLyB9XHJcblxyXG5mdW5jdGlvbiBnZXRMb2NhbGUkMSAoKSB7XHJcbiAgLy8g5LyY5YWI5L2/55SoICRsb2NhbGVcclxuICBpZiAoaXNGbihnZXRBcHApKSB7XHJcbiAgICBjb25zdCBhcHAgPSBnZXRBcHAoe1xyXG4gICAgICBhbGxvd0RlZmF1bHQ6IHRydWVcclxuICAgIH0pO1xyXG4gICAgaWYgKGFwcCAmJiBhcHAuJHZtKSB7XHJcbiAgICAgIHJldHVybiBhcHAuJHZtLiRsb2NhbGVcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIG5vcm1hbGl6ZUxvY2FsZShqZC5nZXRTeXN0ZW1JbmZvU3luYygpLmxhbmd1YWdlKSB8fCBMT0NBTEVfRU5cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0TG9jYWxlJDEgKGxvY2FsZSkge1xyXG4gIGNvbnN0IGFwcCA9IGlzRm4oZ2V0QXBwKSA/IGdldEFwcCgpIDogZmFsc2U7XHJcbiAgaWYgKCFhcHApIHtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuICBjb25zdCBvbGRMb2NhbGUgPSBhcHAuJHZtLiRsb2NhbGU7XHJcbiAgaWYgKG9sZExvY2FsZSAhPT0gbG9jYWxlKSB7XHJcbiAgICBhcHAuJHZtLiRsb2NhbGUgPSBsb2NhbGU7XHJcbiAgICBvbkxvY2FsZUNoYW5nZUNhbGxiYWNrcy5mb3JFYWNoKChmbikgPT4gZm4oe1xyXG4gICAgICBsb2NhbGVcclxuICAgIH0pKTtcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG4gIHJldHVybiBmYWxzZVxyXG59XHJcblxyXG5jb25zdCBvbkxvY2FsZUNoYW5nZUNhbGxiYWNrcyA9IFtdO1xyXG5mdW5jdGlvbiBvbkxvY2FsZUNoYW5nZSAoZm4pIHtcclxuICBpZiAob25Mb2NhbGVDaGFuZ2VDYWxsYmFja3MuaW5kZXhPZihmbikgPT09IC0xKSB7XHJcbiAgICBvbkxvY2FsZUNoYW5nZUNhbGxiYWNrcy5wdXNoKGZuKTtcclxuICB9XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xyXG4gIGdsb2JhbC5nZXRMb2NhbGUgPSBnZXRMb2NhbGUkMTtcclxufVxyXG5cclxuY29uc3QgaW50ZXJjZXB0b3JzID0ge1xyXG4gIHByb21pc2VJbnRlcmNlcHRvclxyXG59O1xyXG5cclxudmFyIGJhc2VBcGkgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XHJcbiAgX19wcm90b19fOiBudWxsLFxyXG4gIHVweDJweDogdXB4MnB4LFxyXG4gIGdldExvY2FsZTogZ2V0TG9jYWxlJDEsXHJcbiAgc2V0TG9jYWxlOiBzZXRMb2NhbGUkMSxcclxuICBvbkxvY2FsZUNoYW5nZTogb25Mb2NhbGVDaGFuZ2UsXHJcbiAgYWRkSW50ZXJjZXB0b3I6IGFkZEludGVyY2VwdG9yLFxyXG4gIHJlbW92ZUludGVyY2VwdG9yOiByZW1vdmVJbnRlcmNlcHRvcixcclxuICBpbnRlcmNlcHRvcnM6IGludGVyY2VwdG9yc1xyXG59KTtcclxuXHJcbmNvbnN0IFVVSURfS0VZID0gJ19fRENfU1RBVF9VVUlEJztcclxubGV0IGRldmljZUlkO1xyXG5mdW5jdGlvbiB1c2VEZXZpY2VJZCAocmVzdWx0KSB7XHJcbiAgZGV2aWNlSWQgPSBkZXZpY2VJZCB8fCBqZC5nZXRTdG9yYWdlU3luYyhVVUlEX0tFWSk7XHJcbiAgaWYgKCFkZXZpY2VJZCkge1xyXG4gICAgZGV2aWNlSWQgPSBEYXRlLm5vdygpICsgJycgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxZTcpO1xyXG4gICAgamQuc2V0U3RvcmFnZSh7XHJcbiAgICAgIGtleTogVVVJRF9LRVksXHJcbiAgICAgIGRhdGE6IGRldmljZUlkXHJcbiAgICB9KTtcclxuICB9XHJcbiAgcmVzdWx0LmRldmljZUlkID0gZGV2aWNlSWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZFNhZmVBcmVhSW5zZXRzIChyZXN1bHQpIHtcclxuICBpZiAocmVzdWx0LnNhZmVBcmVhKSB7XHJcbiAgICBjb25zdCBzYWZlQXJlYSA9IHJlc3VsdC5zYWZlQXJlYTtcclxuICAgIHJlc3VsdC5zYWZlQXJlYUluc2V0cyA9IHtcclxuICAgICAgdG9wOiBzYWZlQXJlYS50b3AsXHJcbiAgICAgIGxlZnQ6IHNhZmVBcmVhLmxlZnQsXHJcbiAgICAgIHJpZ2h0OiByZXN1bHQud2luZG93V2lkdGggLSBzYWZlQXJlYS5yaWdodCxcclxuICAgICAgYm90dG9tOiByZXN1bHQuc2NyZWVuSGVpZ2h0IC0gc2FmZUFyZWEuYm90dG9tXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcG9wdWxhdGVQYXJhbWV0ZXJzIChyZXN1bHQpIHtcclxuICBjb25zdCB7XHJcbiAgICBicmFuZCA9ICcnLCBtb2RlbCA9ICcnLCBzeXN0ZW0gPSAnJyxcclxuICAgIGxhbmd1YWdlID0gJycsIHRoZW1lLCB2ZXJzaW9uLFxyXG4gICAgcGxhdGZvcm0sIGZvbnRTaXplU2V0dGluZyxcclxuICAgIFNES1ZlcnNpb24sIHBpeGVsUmF0aW8sIGRldmljZU9yaWVudGF0aW9uXHJcbiAgfSA9IHJlc3VsdDtcclxuICAvLyBjb25zdCBpc1F1aWNrQXBwID0gXCJtcC1qZFwiLmluZGV4T2YoJ3F1aWNrYXBwLXdlYnZpZXcnKSAhPT0gLTFcclxuXHJcbiAgLy8gb3NOYW1lIG9zVmVyc2lvblxyXG4gIGxldCBvc05hbWUgPSAnJztcclxuICBsZXQgb3NWZXJzaW9uID0gJyc7XHJcbiAge1xyXG4gICAgb3NOYW1lID0gc3lzdGVtLnNwbGl0KCcgJylbMF0gfHwgJyc7XHJcbiAgICBvc1ZlcnNpb24gPSBzeXN0ZW0uc3BsaXQoJyAnKVsxXSB8fCAnJztcclxuICB9XHJcbiAgbGV0IGhvc3RWZXJzaW9uID0gdmVyc2lvbjtcclxuICB7XHJcbiAgICBob3N0VmVyc2lvbiA9IHJlc3VsdC5ob3N0VmVyc2lvbk5hbWU7XHJcbiAgfVxyXG5cclxuICAvLyBkZXZpY2VUeXBlXHJcbiAgY29uc3QgZGV2aWNlVHlwZSA9IGdldEdldERldmljZVR5cGUocmVzdWx0LCBtb2RlbCk7XHJcblxyXG4gIC8vIGRldmljZU1vZGVsXHJcbiAgY29uc3QgZGV2aWNlQnJhbmQgPSBnZXREZXZpY2VCcmFuZChicmFuZCk7XHJcblxyXG4gIC8vIGhvc3ROYW1lXHJcbiAgY29uc3QgX2hvc3ROYW1lID0gZ2V0SG9zdE5hbWUocmVzdWx0KTtcclxuXHJcbiAgLy8gZGV2aWNlT3JpZW50YXRpb25cclxuICBsZXQgX2RldmljZU9yaWVudGF0aW9uID0gZGV2aWNlT3JpZW50YXRpb247IC8vIOS7hSDlvq7kv6Eg55m+5bqmIOaUr+aMgVxyXG5cclxuICAvLyBkZXZpY2VQaXhlbFJhdGlvXHJcbiAgbGV0IF9kZXZpY2VQaXhlbFJhdGlvID0gcGl4ZWxSYXRpbztcclxuXHJcbiAgLy8gU0RLVmVyc2lvblxyXG4gIGxldCBfU0RLVmVyc2lvbiA9IFNES1ZlcnNpb247XHJcblxyXG4gIC8vIGhvc3RMYW5ndWFnZVxyXG4gIGNvbnN0IGhvc3RMYW5ndWFnZSA9IGxhbmd1YWdlLnJlcGxhY2UoL18vZywgJy0nKTtcclxuXHJcbiAgLy8gd3guZ2V0QWNjb3VudEluZm9TeW5jXHJcblxyXG4gIGNvbnN0IHBhcmFtZXRlcnMgPSB7XHJcbiAgICBhcHBJZDogcHJvY2Vzcy5lbnYuVU5JX0FQUF9JRCxcclxuICAgIGFwcE5hbWU6IHByb2Nlc3MuZW52LlVOSV9BUFBfTkFNRSxcclxuICAgIGFwcFZlcnNpb246IHByb2Nlc3MuZW52LlVOSV9BUFBfVkVSU0lPTl9OQU1FLFxyXG4gICAgYXBwVmVyc2lvbkNvZGU6IHByb2Nlc3MuZW52LlVOSV9BUFBfVkVSU0lPTl9DT0RFLFxyXG4gICAgYXBwTGFuZ3VhZ2U6IGdldEFwcExhbmd1YWdlKGhvc3RMYW5ndWFnZSksXHJcbiAgICB1bmlDb21waWxlVmVyc2lvbjogcHJvY2Vzcy5lbnYuVU5JX0NPTVBJTEVSX1ZFUlNJT04sXHJcbiAgICB1bmlSdW50aW1lVmVyc2lvbjogcHJvY2Vzcy5lbnYuVU5JX0NPTVBJTEVSX1ZFUlNJT04sXHJcbiAgICB1bmlQbGF0Zm9ybTogcHJvY2Vzcy5lbnYuVU5JX1NVQl9QTEFURk9STSB8fCBwcm9jZXNzLmVudi5VTklfUExBVEZPUk0sXHJcbiAgICBkZXZpY2VCcmFuZCxcclxuICAgIGRldmljZU1vZGVsOiBtb2RlbCxcclxuICAgIGRldmljZVR5cGUsXHJcbiAgICBkZXZpY2VQaXhlbFJhdGlvOiBfZGV2aWNlUGl4ZWxSYXRpbyxcclxuICAgIGRldmljZU9yaWVudGF0aW9uOiBfZGV2aWNlT3JpZW50YXRpb24sXHJcbiAgICBvc05hbWU6IG9zTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpLFxyXG4gICAgb3NWZXJzaW9uLFxyXG4gICAgaG9zdFRoZW1lOiB0aGVtZSxcclxuICAgIGhvc3RWZXJzaW9uLFxyXG4gICAgaG9zdExhbmd1YWdlLFxyXG4gICAgaG9zdE5hbWU6IF9ob3N0TmFtZSxcclxuICAgIGhvc3RTREtWZXJzaW9uOiBfU0RLVmVyc2lvbixcclxuICAgIGhvc3RGb250U2l6ZVNldHRpbmc6IGZvbnRTaXplU2V0dGluZyxcclxuICAgIHdpbmRvd1RvcDogMCxcclxuICAgIHdpbmRvd0JvdHRvbTogMCxcclxuICAgIC8vIFRPRE9cclxuICAgIG9zTGFuZ3VhZ2U6IHVuZGVmaW5lZCxcclxuICAgIG9zVGhlbWU6IHVuZGVmaW5lZCxcclxuICAgIHVhOiB1bmRlZmluZWQsXHJcbiAgICBob3N0UGFja2FnZU5hbWU6IHVuZGVmaW5lZCxcclxuICAgIGJyb3dzZXJOYW1lOiB1bmRlZmluZWQsXHJcbiAgICBicm93c2VyVmVyc2lvbjogdW5kZWZpbmVkXHJcbiAgfTtcclxuXHJcbiAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIHBhcmFtZXRlcnMpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRHZXREZXZpY2VUeXBlIChyZXN1bHQsIG1vZGVsKSB7XHJcbiAgbGV0IGRldmljZVR5cGUgPSByZXN1bHQuZGV2aWNlVHlwZSB8fCAncGhvbmUnO1xyXG4gIHtcclxuICAgIGNvbnN0IGRldmljZVR5cGVNYXBzID0ge1xyXG4gICAgICBpcGFkOiAncGFkJyxcclxuICAgICAgd2luZG93czogJ3BjJyxcclxuICAgICAgbWFjOiAncGMnXHJcbiAgICB9O1xyXG4gICAgY29uc3QgZGV2aWNlVHlwZU1hcHNLZXlzID0gT2JqZWN0LmtleXMoZGV2aWNlVHlwZU1hcHMpO1xyXG4gICAgY29uc3QgX21vZGVsID0gbW9kZWwudG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkZXZpY2VUeXBlTWFwc0tleXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IF9tID0gZGV2aWNlVHlwZU1hcHNLZXlzW2luZGV4XTtcclxuICAgICAgaWYgKF9tb2RlbC5pbmRleE9mKF9tKSAhPT0gLTEpIHtcclxuICAgICAgICBkZXZpY2VUeXBlID0gZGV2aWNlVHlwZU1hcHNbX21dO1xyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGRldmljZVR5cGVcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RGV2aWNlQnJhbmQgKGJyYW5kKSB7XHJcbiAgbGV0IGRldmljZUJyYW5kID0gYnJhbmQ7XHJcbiAgaWYgKGRldmljZUJyYW5kKSB7XHJcbiAgICBkZXZpY2VCcmFuZCA9IGJyYW5kLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG4gIHJldHVybiBkZXZpY2VCcmFuZFxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRBcHBMYW5ndWFnZSAoZGVmYXVsdExhbmd1YWdlKSB7XHJcbiAgcmV0dXJuIGdldExvY2FsZSQxXHJcbiAgICA/IGdldExvY2FsZSQxKClcclxuICAgIDogZGVmYXVsdExhbmd1YWdlXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEhvc3ROYW1lIChyZXN1bHQpIHtcclxuICBjb25zdCBfcGxhdGZvcm0gPSAgXCJtcC1qZFwiLnNwbGl0KCctJylbMV07XHJcbiAgbGV0IF9ob3N0TmFtZSA9IHJlc3VsdC5ob3N0TmFtZSB8fCBfcGxhdGZvcm07IC8vIG1wLWpkXHJcblxyXG4gIHJldHVybiBfaG9zdE5hbWVcclxufVxyXG5cclxudmFyIGdldFN5c3RlbUluZm8gPSB7XHJcbiAgcmV0dXJuVmFsdWU6IGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgIHVzZURldmljZUlkKHJlc3VsdCk7XHJcbiAgICBhZGRTYWZlQXJlYUluc2V0cyhyZXN1bHQpO1xyXG4gICAgcG9wdWxhdGVQYXJhbWV0ZXJzKHJlc3VsdCk7XHJcbiAgfVxyXG59O1xyXG5cclxuLy8gaW1wb3J0IG5hdmlnYXRlVG8gZnJvbSAndW5pLWhlbHBlcnMvbmF2aWdhdGUtdG8nXHJcbi8vIGltcG9ydCBnZXRVc2VyUHJvZmlsZSBmcm9tICcuLi8uLi8uLi9tcC13ZWl4aW4vaGVscGVycy9nZXQtdXNlci1wcm9maWxlJ1xyXG5cclxuLy8g6ZyA6KaB5YGa6L2s5o2i55qEIEFQSSDliJfooahcclxuY29uc3QgcHJvdG9jb2xzID0ge1xyXG4gIC8vIG5hdmlnYXRlVG8sXHJcbiAgLy8gcmVkaXJlY3RUbyxcclxuICAvLyBwcmV2aWV3SW1hZ2UsXHJcbiAgZ2V0U3lzdGVtSW5mbyxcclxuICBnZXRTeXN0ZW1JbmZvU3luYzogZ2V0U3lzdGVtSW5mb1xyXG4gIC8vIGdldFVzZXJQcm9maWxlXHJcbn07XHJcblxyXG4vLyDkuI3mlK/mjIHnmoQgQVBJIOWIl+ihqFxyXG5jb25zdCB0b2RvcyA9IFtcclxuICAnZ2V0U2VsZWN0ZWRUZXh0UmFuZ2UnXHJcbl07XHJcblxyXG4vLyDlrZjlnKjlhbzlrrnmgKfnmoQgQVBJIOWIl+ihqFxyXG5jb25zdCBjYW5JVXNlcyA9IFtdO1xyXG5cclxuY29uc3QgQ0FMTEJBQ0tTID0gWydzdWNjZXNzJywgJ2ZhaWwnLCAnY2FuY2VsJywgJ2NvbXBsZXRlJ107XHJcblxyXG5mdW5jdGlvbiBwcm9jZXNzQ2FsbGJhY2sgKG1ldGhvZE5hbWUsIG1ldGhvZCwgcmV0dXJuVmFsdWUpIHtcclxuICByZXR1cm4gZnVuY3Rpb24gKHJlcykge1xyXG4gICAgcmV0dXJuIG1ldGhvZChwcm9jZXNzUmV0dXJuVmFsdWUobWV0aG9kTmFtZSwgcmVzLCByZXR1cm5WYWx1ZSkpXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBwcm9jZXNzQXJncyAobWV0aG9kTmFtZSwgZnJvbUFyZ3MsIGFyZ3NPcHRpb24gPSB7fSwgcmV0dXJuVmFsdWUgPSB7fSwga2VlcEZyb21BcmdzID0gZmFsc2UpIHtcclxuICBpZiAoaXNQbGFpbk9iamVjdChmcm9tQXJncykpIHsgLy8g5LiA6IisIGFwaSDnmoTlj4LmlbDop6PmnpBcclxuICAgIGNvbnN0IHRvQXJncyA9IGtlZXBGcm9tQXJncyA9PT0gdHJ1ZSA/IGZyb21BcmdzIDoge307IC8vIHJldHVyblZhbHVlIOS4uiBmYWxzZSDml7bvvIzor7TmmI7mmK/moLzlvI/ljJbov5Tlm57lgLzvvIznm7TmjqXlnKjov5Tlm57lgLzlr7nosaHkuIrkv67mlLnotYvlgLxcclxuICAgIGlmIChpc0ZuKGFyZ3NPcHRpb24pKSB7XHJcbiAgICAgIGFyZ3NPcHRpb24gPSBhcmdzT3B0aW9uKGZyb21BcmdzLCB0b0FyZ3MpIHx8IHt9O1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbUFyZ3MpIHtcclxuICAgICAgaWYgKGhhc093bihhcmdzT3B0aW9uLCBrZXkpKSB7XHJcbiAgICAgICAgbGV0IGtleU9wdGlvbiA9IGFyZ3NPcHRpb25ba2V5XTtcclxuICAgICAgICBpZiAoaXNGbihrZXlPcHRpb24pKSB7XHJcbiAgICAgICAgICBrZXlPcHRpb24gPSBrZXlPcHRpb24oZnJvbUFyZ3Nba2V5XSwgZnJvbUFyZ3MsIHRvQXJncyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgha2V5T3B0aW9uKSB7IC8vIOS4jeaUr+aMgeeahOWPguaVsFxyXG4gICAgICAgICAgY29uc29sZS53YXJuKGBUaGUgJyR7bWV0aG9kTmFtZX0nIG1ldGhvZCBvZiBwbGF0Zm9ybSAn5Lqs5Lic5bCP56iL5bqPJyBkb2VzIG5vdCBzdXBwb3J0IG9wdGlvbiAnJHtrZXl9J2ApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaXNTdHIoa2V5T3B0aW9uKSkgeyAvLyDph43lhpnlj4LmlbAga2V5XHJcbiAgICAgICAgICB0b0FyZ3Nba2V5T3B0aW9uXSA9IGZyb21BcmdzW2tleV07XHJcbiAgICAgICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGtleU9wdGlvbikpIHsgLy8ge25hbWU6bmV3TmFtZSx2YWx1ZTp2YWx1ZX3lj6/ph43mlrDmjIflrprlj4LmlbAga2V5OnZhbHVlXHJcbiAgICAgICAgICB0b0FyZ3Nba2V5T3B0aW9uLm5hbWUgPyBrZXlPcHRpb24ubmFtZSA6IGtleV0gPSBrZXlPcHRpb24udmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKENBTExCQUNLUy5pbmRleE9mKGtleSkgIT09IC0xKSB7XHJcbiAgICAgICAgaWYgKGlzRm4oZnJvbUFyZ3Nba2V5XSkpIHtcclxuICAgICAgICAgIHRvQXJnc1trZXldID0gcHJvY2Vzc0NhbGxiYWNrKG1ldGhvZE5hbWUsIGZyb21BcmdzW2tleV0sIHJldHVyblZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKCFrZWVwRnJvbUFyZ3MpIHtcclxuICAgICAgICAgIHRvQXJnc1trZXldID0gZnJvbUFyZ3Nba2V5XTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0b0FyZ3NcclxuICB9IGVsc2UgaWYgKGlzRm4oZnJvbUFyZ3MpKSB7XHJcbiAgICBmcm9tQXJncyA9IHByb2Nlc3NDYWxsYmFjayhtZXRob2ROYW1lLCBmcm9tQXJncywgcmV0dXJuVmFsdWUpO1xyXG4gIH1cclxuICByZXR1cm4gZnJvbUFyZ3NcclxufVxyXG5cclxuZnVuY3Rpb24gcHJvY2Vzc1JldHVyblZhbHVlIChtZXRob2ROYW1lLCByZXMsIHJldHVyblZhbHVlLCBrZWVwUmV0dXJuVmFsdWUgPSBmYWxzZSkge1xyXG4gIGlmIChpc0ZuKHByb3RvY29scy5yZXR1cm5WYWx1ZSkpIHsgLy8g5aSE55CG6YCa55SoIHJldHVyblZhbHVlXHJcbiAgICByZXMgPSBwcm90b2NvbHMucmV0dXJuVmFsdWUobWV0aG9kTmFtZSwgcmVzKTtcclxuICB9XHJcbiAgcmV0dXJuIHByb2Nlc3NBcmdzKG1ldGhvZE5hbWUsIHJlcywgcmV0dXJuVmFsdWUsIHt9LCBrZWVwUmV0dXJuVmFsdWUpXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdyYXBwZXIgKG1ldGhvZE5hbWUsIG1ldGhvZCkge1xyXG4gIGlmIChoYXNPd24ocHJvdG9jb2xzLCBtZXRob2ROYW1lKSkge1xyXG4gICAgY29uc3QgcHJvdG9jb2wgPSBwcm90b2NvbHNbbWV0aG9kTmFtZV07XHJcbiAgICBpZiAoIXByb3RvY29sKSB7IC8vIOaaguS4jeaUr+aMgeeahCBhcGlcclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGBQbGF0Zm9ybSAn5Lqs5Lic5bCP56iL5bqPJyBkb2VzIG5vdCBzdXBwb3J0ICcke21ldGhvZE5hbWV9Jy5gKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhcmcxLCBhcmcyKSB7IC8vIOebruWJjSBhcGkg5pyA5aSa5Lik5Liq5Y+C5pWwXHJcbiAgICAgIGxldCBvcHRpb25zID0gcHJvdG9jb2w7XHJcbiAgICAgIGlmIChpc0ZuKHByb3RvY29sKSkge1xyXG4gICAgICAgIG9wdGlvbnMgPSBwcm90b2NvbChhcmcxKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXJnMSA9IHByb2Nlc3NBcmdzKG1ldGhvZE5hbWUsIGFyZzEsIG9wdGlvbnMuYXJncywgb3B0aW9ucy5yZXR1cm5WYWx1ZSk7XHJcblxyXG4gICAgICBjb25zdCBhcmdzID0gW2FyZzFdO1xyXG4gICAgICBpZiAodHlwZW9mIGFyZzIgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgYXJncy5wdXNoKGFyZzIpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpc0ZuKG9wdGlvbnMubmFtZSkpIHtcclxuICAgICAgICBtZXRob2ROYW1lID0gb3B0aW9ucy5uYW1lKGFyZzEpO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzU3RyKG9wdGlvbnMubmFtZSkpIHtcclxuICAgICAgICBtZXRob2ROYW1lID0gb3B0aW9ucy5uYW1lO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gamRbbWV0aG9kTmFtZV0uYXBwbHkoamQsIGFyZ3MpO1xyXG4gICAgICBpZiAoaXNTeW5jQXBpKG1ldGhvZE5hbWUpKSB7IC8vIOWQjOatpSBhcGlcclxuICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVyblZhbHVlKG1ldGhvZE5hbWUsIHJldHVyblZhbHVlLCBvcHRpb25zLnJldHVyblZhbHVlLCBpc0NvbnRleHRBcGkobWV0aG9kTmFtZSkpXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJldHVyblZhbHVlXHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBtZXRob2RcclxufVxyXG5cclxuY29uc3QgdG9kb0FwaXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xyXG5cclxuY29uc3QgVE9ET1MgPSBbXHJcbiAgJ29uVGFiQmFyTWlkQnV0dG9uVGFwJyxcclxuICAnc3Vic2NyaWJlUHVzaCcsXHJcbiAgJ3Vuc3Vic2NyaWJlUHVzaCcsXHJcbiAgJ29uUHVzaCcsXHJcbiAgJ29mZlB1c2gnLFxyXG4gICdzaGFyZSdcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZVRvZG9BcGkgKG5hbWUpIHtcclxuICByZXR1cm4gZnVuY3Rpb24gdG9kb0FwaSAoe1xyXG4gICAgZmFpbCxcclxuICAgIGNvbXBsZXRlXHJcbiAgfSkge1xyXG4gICAgY29uc3QgcmVzID0ge1xyXG4gICAgICBlcnJNc2c6IGAke25hbWV9OmZhaWwgbWV0aG9kICcke25hbWV9JyBub3Qgc3VwcG9ydGVkYFxyXG4gICAgfTtcclxuICAgIGlzRm4oZmFpbCkgJiYgZmFpbChyZXMpO1xyXG4gICAgaXNGbihjb21wbGV0ZSkgJiYgY29tcGxldGUocmVzKTtcclxuICB9XHJcbn1cclxuXHJcblRPRE9TLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcclxuICB0b2RvQXBpc1tuYW1lXSA9IGNyZWF0ZVRvZG9BcGkobmFtZSk7XHJcbn0pO1xyXG5cclxudmFyIHByb3ZpZGVycyA9IHtcclxuICBvYXV0aDogWydqZCddLFxyXG4gIHNoYXJlOiBbJ2pkJ10sXHJcbiAgcGF5bWVudDogWydqZCddLFxyXG4gIHB1c2g6IFsnamQnXVxyXG59O1xyXG5cclxuZnVuY3Rpb24gZ2V0UHJvdmlkZXIgKHtcclxuICBzZXJ2aWNlLFxyXG4gIHN1Y2Nlc3MsXHJcbiAgZmFpbCxcclxuICBjb21wbGV0ZVxyXG59KSB7XHJcbiAgbGV0IHJlcyA9IGZhbHNlO1xyXG4gIGlmIChwcm92aWRlcnNbc2VydmljZV0pIHtcclxuICAgIHJlcyA9IHtcclxuICAgICAgZXJyTXNnOiAnZ2V0UHJvdmlkZXI6b2snLFxyXG4gICAgICBzZXJ2aWNlLFxyXG4gICAgICBwcm92aWRlcjogcHJvdmlkZXJzW3NlcnZpY2VdXHJcbiAgICB9O1xyXG4gICAgaXNGbihzdWNjZXNzKSAmJiBzdWNjZXNzKHJlcyk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJlcyA9IHtcclxuICAgICAgZXJyTXNnOiAnZ2V0UHJvdmlkZXI6ZmFpbCBzZXJ2aWNlIG5vdCBmb3VuZCdcclxuICAgIH07XHJcbiAgICBpc0ZuKGZhaWwpICYmIGZhaWwocmVzKTtcclxuICB9XHJcbiAgaXNGbihjb21wbGV0ZSkgJiYgY29tcGxldGUocmVzKTtcclxufVxyXG5cclxudmFyIGV4dHJhQXBpID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xyXG4gIF9fcHJvdG9fXzogbnVsbCxcclxuICBnZXRQcm92aWRlcjogZ2V0UHJvdmlkZXJcclxufSk7XHJcblxyXG5jb25zdCBnZXRFbWl0dGVyID0gKGZ1bmN0aW9uICgpIHtcclxuICBsZXQgRW1pdHRlcjtcclxuICByZXR1cm4gZnVuY3Rpb24gZ2V0VW5pRW1pdHRlciAoKSB7XHJcbiAgICBpZiAoIUVtaXR0ZXIpIHtcclxuICAgICAgRW1pdHRlciA9IG5ldyBWdWUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBFbWl0dGVyXHJcbiAgfVxyXG59KSgpO1xyXG5cclxuZnVuY3Rpb24gYXBwbHkgKGN0eCwgbWV0aG9kLCBhcmdzKSB7XHJcbiAgcmV0dXJuIGN0eFttZXRob2RdLmFwcGx5KGN0eCwgYXJncylcclxufVxyXG5cclxuZnVuY3Rpb24gJG9uICgpIHtcclxuICByZXR1cm4gYXBwbHkoZ2V0RW1pdHRlcigpLCAnJG9uJywgWy4uLmFyZ3VtZW50c10pXHJcbn1cclxuZnVuY3Rpb24gJG9mZiAoKSB7XHJcbiAgcmV0dXJuIGFwcGx5KGdldEVtaXR0ZXIoKSwgJyRvZmYnLCBbLi4uYXJndW1lbnRzXSlcclxufVxyXG5mdW5jdGlvbiAkb25jZSAoKSB7XHJcbiAgcmV0dXJuIGFwcGx5KGdldEVtaXR0ZXIoKSwgJyRvbmNlJywgWy4uLmFyZ3VtZW50c10pXHJcbn1cclxuZnVuY3Rpb24gJGVtaXQgKCkge1xyXG4gIHJldHVybiBhcHBseShnZXRFbWl0dGVyKCksICckZW1pdCcsIFsuLi5hcmd1bWVudHNdKVxyXG59XHJcblxyXG52YXIgZXZlbnRBcGkgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XHJcbiAgX19wcm90b19fOiBudWxsLFxyXG4gICRvbjogJG9uLFxyXG4gICRvZmY6ICRvZmYsXHJcbiAgJG9uY2U6ICRvbmNlLFxyXG4gICRlbWl0OiAkZW1pdFxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiDmoYbmnrblhoUgdHJ5LWNhdGNoXHJcbiAqL1xyXG4vKipcclxuICog5byA5Y+R6ICFIHRyeS1jYXRjaFxyXG4gKi9cclxuZnVuY3Rpb24gdHJ5Q2F0Y2ggKGZuKSB7XHJcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiBmbi5hcHBseShmbiwgYXJndW1lbnRzKVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyBUT0RPXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRBcGlDYWxsYmFja3MgKHBhcmFtcykge1xyXG4gIGNvbnN0IGFwaUNhbGxiYWNrcyA9IHt9O1xyXG4gIGZvciAoY29uc3QgbmFtZSBpbiBwYXJhbXMpIHtcclxuICAgIGNvbnN0IHBhcmFtID0gcGFyYW1zW25hbWVdO1xyXG4gICAgaWYgKGlzRm4ocGFyYW0pKSB7XHJcbiAgICAgIGFwaUNhbGxiYWNrc1tuYW1lXSA9IHRyeUNhdGNoKHBhcmFtKTtcclxuICAgICAgZGVsZXRlIHBhcmFtc1tuYW1lXTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGFwaUNhbGxiYWNrc1xyXG59XHJcblxyXG5sZXQgY2lkO1xyXG5sZXQgY2lkRXJyTXNnO1xyXG5sZXQgZW5hYmxlZDtcclxuXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZVB1c2hNZXNzYWdlIChtZXNzYWdlKSB7XHJcbiAgdHJ5IHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKG1lc3NhZ2UpXHJcbiAgfSBjYXRjaCAoZSkge31cclxuICByZXR1cm4gbWVzc2FnZVxyXG59XHJcblxyXG5mdW5jdGlvbiBpbnZva2VQdXNoQ2FsbGJhY2sgKFxyXG4gIGFyZ3NcclxuKSB7XHJcbiAgaWYgKGFyZ3MudHlwZSA9PT0gJ2VuYWJsZWQnKSB7XHJcbiAgICBlbmFibGVkID0gdHJ1ZTtcclxuICB9IGVsc2UgaWYgKGFyZ3MudHlwZSA9PT0gJ2NsaWVudElkJykge1xyXG4gICAgY2lkID0gYXJncy5jaWQ7XHJcbiAgICBjaWRFcnJNc2cgPSBhcmdzLmVyck1zZztcclxuICAgIGludm9rZUdldFB1c2hDaWRDYWxsYmFja3MoY2lkLCBhcmdzLmVyck1zZyk7XHJcbiAgfSBlbHNlIGlmIChhcmdzLnR5cGUgPT09ICdwdXNoTXNnJykge1xyXG4gICAgY29uc3QgbWVzc2FnZSA9IHtcclxuICAgICAgdHlwZTogJ3JlY2VpdmUnLFxyXG4gICAgICBkYXRhOiBub3JtYWxpemVQdXNoTWVzc2FnZShhcmdzLm1lc3NhZ2UpXHJcbiAgICB9O1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvblB1c2hNZXNzYWdlQ2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gb25QdXNoTWVzc2FnZUNhbGxiYWNrc1tpXTtcclxuICAgICAgY2FsbGJhY2sobWVzc2FnZSk7XHJcbiAgICAgIC8vIOivpea2iOaBr+W3suiiq+mYu+atolxyXG4gICAgICBpZiAobWVzc2FnZS5zdG9wcGVkKSB7XHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAoYXJncy50eXBlID09PSAnY2xpY2snKSB7XHJcbiAgICBvblB1c2hNZXNzYWdlQ2FsbGJhY2tzLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XHJcbiAgICAgIGNhbGxiYWNrKHtcclxuICAgICAgICB0eXBlOiAnY2xpY2snLFxyXG4gICAgICAgIGRhdGE6IG5vcm1hbGl6ZVB1c2hNZXNzYWdlKGFyZ3MubWVzc2FnZSlcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGdldFB1c2hDaWRDYWxsYmFja3MgPSBbXTtcclxuXHJcbmZ1bmN0aW9uIGludm9rZUdldFB1c2hDaWRDYWxsYmFja3MgKGNpZCwgZXJyTXNnKSB7XHJcbiAgZ2V0UHVzaENpZENhbGxiYWNrcy5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xyXG4gICAgY2FsbGJhY2soY2lkLCBlcnJNc2cpO1xyXG4gIH0pO1xyXG4gIGdldFB1c2hDaWRDYWxsYmFja3MubGVuZ3RoID0gMDtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0UHVzaENsaWVudElkIChhcmdzKSB7XHJcbiAgaWYgKCFpc1BsYWluT2JqZWN0KGFyZ3MpKSB7XHJcbiAgICBhcmdzID0ge307XHJcbiAgfVxyXG4gIGNvbnN0IHtcclxuICAgIHN1Y2Nlc3MsXHJcbiAgICBmYWlsLFxyXG4gICAgY29tcGxldGVcclxuICB9ID0gZ2V0QXBpQ2FsbGJhY2tzKGFyZ3MpO1xyXG4gIGNvbnN0IGhhc1N1Y2Nlc3MgPSBpc0ZuKHN1Y2Nlc3MpO1xyXG4gIGNvbnN0IGhhc0ZhaWwgPSBpc0ZuKGZhaWwpO1xyXG4gIGNvbnN0IGhhc0NvbXBsZXRlID0gaXNGbihjb21wbGV0ZSk7XHJcblxyXG4gIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xyXG4gICAgaWYgKHR5cGVvZiBlbmFibGVkID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBlbmFibGVkID0gZmFsc2U7XHJcbiAgICAgIGNpZCA9ICcnO1xyXG4gICAgICBjaWRFcnJNc2cgPSAndW5pUHVzaCBpcyBub3QgZW5hYmxlZCc7XHJcbiAgICB9XHJcbiAgICBnZXRQdXNoQ2lkQ2FsbGJhY2tzLnB1c2goKGNpZCwgZXJyTXNnKSA9PiB7XHJcbiAgICAgIGxldCByZXM7XHJcbiAgICAgIGlmIChjaWQpIHtcclxuICAgICAgICByZXMgPSB7XHJcbiAgICAgICAgICBlcnJNc2c6ICdnZXRQdXNoQ2xpZW50SWQ6b2snLFxyXG4gICAgICAgICAgY2lkXHJcbiAgICAgICAgfTtcclxuICAgICAgICBoYXNTdWNjZXNzICYmIHN1Y2Nlc3MocmVzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXMgPSB7XHJcbiAgICAgICAgICBlcnJNc2c6ICdnZXRQdXNoQ2xpZW50SWQ6ZmFpbCcgKyAoZXJyTXNnID8gJyAnICsgZXJyTXNnIDogJycpXHJcbiAgICAgICAgfTtcclxuICAgICAgICBoYXNGYWlsICYmIGZhaWwocmVzKTtcclxuICAgICAgfVxyXG4gICAgICBoYXNDb21wbGV0ZSAmJiBjb21wbGV0ZShyZXMpO1xyXG4gICAgfSk7XHJcbiAgICBpZiAodHlwZW9mIGNpZCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgaW52b2tlR2V0UHVzaENpZENhbGxiYWNrcyhjaWQsIGNpZEVyck1zZyk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbmNvbnN0IG9uUHVzaE1lc3NhZ2VDYWxsYmFja3MgPSBbXTtcclxuLy8g5LiN5L2/55SoIGRlZmluZU9uQXBpIOWunueOsO+8jOaYr+WboOS4uiBkZWZpbmVPbkFwaSDkvp3otZYgVW5pU2VydmljZUpTQnJpZGdlIO+8jOivpeWvueixoeebruWJjeWcqOWwj+eoi+W6j+S4iuacquaPkOS+m++8jOaVheeugOWNleWunueOsFxyXG5jb25zdCBvblB1c2hNZXNzYWdlID0gKGZuKSA9PiB7XHJcbiAgaWYgKG9uUHVzaE1lc3NhZ2VDYWxsYmFja3MuaW5kZXhPZihmbikgPT09IC0xKSB7XHJcbiAgICBvblB1c2hNZXNzYWdlQ2FsbGJhY2tzLnB1c2goZm4pO1xyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IG9mZlB1c2hNZXNzYWdlID0gKGZuKSA9PiB7XHJcbiAgaWYgKCFmbikge1xyXG4gICAgb25QdXNoTWVzc2FnZUNhbGxiYWNrcy5sZW5ndGggPSAwO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBpbmRleCA9IG9uUHVzaE1lc3NhZ2VDYWxsYmFja3MuaW5kZXhPZihmbik7XHJcbiAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICBvblB1c2hNZXNzYWdlQ2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG59O1xyXG5cclxudmFyIGFwaSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcclxuICBfX3Byb3RvX186IG51bGwsXHJcbiAgZ2V0UHVzaENsaWVudElkOiBnZXRQdXNoQ2xpZW50SWQsXHJcbiAgb25QdXNoTWVzc2FnZTogb25QdXNoTWVzc2FnZSxcclxuICBvZmZQdXNoTWVzc2FnZTogb2ZmUHVzaE1lc3NhZ2UsXHJcbiAgaW52b2tlUHVzaENhbGxiYWNrOiBpbnZva2VQdXNoQ2FsbGJhY2tcclxufSk7XHJcblxyXG5jb25zdCBtb2NrcyA9IFsnX19yb3V0ZV9fJywgJ19fd3hFeHBhcnNlck5vZGVJZF9fJywgJ19fd3hXZWJ2aWV3SWRfXyddO1xyXG5cclxuZnVuY3Rpb24gZmluZFZtQnlWdWVJZCAodm0sIHZ1ZVBpZCkge1xyXG4gIGNvbnN0ICRjaGlsZHJlbiA9IHZtLiRjaGlsZHJlbjtcclxuICAvLyDkvJjlhYjmn6Xmib7nm7TlsZ4o5Y+N5ZCR5p+l5om+Omh0dHBzOi8vZ2l0aHViLmNvbS9kY2xvdWRpby91bmktYXBwL2lzc3Vlcy8xMjAwKVxyXG4gIGZvciAobGV0IGkgPSAkY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgIGNvbnN0IGNoaWxkVm0gPSAkY2hpbGRyZW5baV07XHJcbiAgICBpZiAoY2hpbGRWbS4kc2NvcGUuXyR2dWVJZCA9PT0gdnVlUGlkKSB7XHJcbiAgICAgIHJldHVybiBjaGlsZFZtXHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vIOWPjeWQkemAkuW9kuafpeaJvlxyXG4gIGxldCBwYXJlbnRWbTtcclxuICBmb3IgKGxldCBpID0gJGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICBwYXJlbnRWbSA9IGZpbmRWbUJ5VnVlSWQoJGNoaWxkcmVuW2ldLCB2dWVQaWQpO1xyXG4gICAgaWYgKHBhcmVudFZtKSB7XHJcbiAgICAgIHJldHVybiBwYXJlbnRWbVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gaW5pdEJlaGF2aW9yIChvcHRpb25zKSB7XHJcbiAgcmV0dXJuIEJlaGF2aW9yKG9wdGlvbnMpXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzUGFnZSAoKSB7XHJcbiAgcmV0dXJuICEhdGhpcy5yb3V0ZVxyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0UmVsYXRpb24gKGRldGFpbCkge1xyXG4gIHRoaXMudHJpZ2dlckV2ZW50KCdfX2wnLCBkZXRhaWwpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZWxlY3RBbGxDb21wb25lbnRzIChtcEluc3RhbmNlLCBzZWxlY3RvciwgJHJlZnMpIHtcclxuICBjb25zdCBjb21wb25lbnRzID0gbXBJbnN0YW5jZS5zZWxlY3RBbGxDb21wb25lbnRzKHNlbGVjdG9yKSB8fCBbXTtcclxuICBjb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IHtcclxuICAgIGNvbnN0IHJlZiA9IGNvbXBvbmVudC5kYXRhc2V0LnJlZjtcclxuICAgICRyZWZzW3JlZl0gPSBjb21wb25lbnQuJHZtIHx8IHRvU2tpcChjb21wb25lbnQpO1xyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzeW5jUmVmcyAocmVmcywgbmV3UmVmcykge1xyXG4gIGNvbnN0IG9sZEtleXMgPSBuZXcgU2V0KC4uLk9iamVjdC5rZXlzKHJlZnMpKTtcclxuICBjb25zdCBuZXdLZXlzID0gT2JqZWN0LmtleXMobmV3UmVmcyk7XHJcbiAgbmV3S2V5cy5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICBjb25zdCBvbGRWYWx1ZSA9IHJlZnNba2V5XTtcclxuICAgIGNvbnN0IG5ld1ZhbHVlID0gbmV3UmVmc1trZXldO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2xkVmFsdWUpICYmIEFycmF5LmlzQXJyYXkobmV3VmFsdWUpICYmIG9sZFZhbHVlLmxlbmd0aCA9PT0gbmV3VmFsdWUubGVuZ3RoICYmIG5ld1ZhbHVlLmV2ZXJ5KHZhbHVlID0+IG9sZFZhbHVlLmluY2x1ZGVzKHZhbHVlKSkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICByZWZzW2tleV0gPSBuZXdWYWx1ZTtcclxuICAgIG9sZEtleXMuZGVsZXRlKGtleSk7XHJcbiAgfSk7XHJcbiAgb2xkS2V5cy5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICBkZWxldGUgcmVmc1trZXldO1xyXG4gIH0pO1xyXG4gIHJldHVybiByZWZzXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRSZWZzICh2bSkge1xyXG4gIGNvbnN0IG1wSW5zdGFuY2UgPSB2bS4kc2NvcGU7XHJcbiAgY29uc3QgcmVmcyA9IHt9O1xyXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2bSwgJyRyZWZzJywge1xyXG4gICAgZ2V0ICgpIHtcclxuICAgICAgY29uc3QgJHJlZnMgPSB7fTtcclxuICAgICAgc2VsZWN0QWxsQ29tcG9uZW50cyhtcEluc3RhbmNlLCAnLnZ1ZS1yZWYnLCAkcmVmcyk7XHJcbiAgICAgIC8vIFRPRE8g5pqC5LiN6ICD6JmRIGZvciDkuK3nmoQgc2NvcGVkXHJcbiAgICAgIGNvbnN0IGZvckNvbXBvbmVudHMgPSBtcEluc3RhbmNlLnNlbGVjdEFsbENvbXBvbmVudHMoJy52dWUtcmVmLWluLWZvcicpIHx8IFtdO1xyXG4gICAgICBmb3JDb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IHtcclxuICAgICAgICBjb25zdCByZWYgPSBjb21wb25lbnQuZGF0YXNldC5yZWY7XHJcbiAgICAgICAgaWYgKCEkcmVmc1tyZWZdKSB7XHJcbiAgICAgICAgICAkcmVmc1tyZWZdID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgICRyZWZzW3JlZl0ucHVzaChjb21wb25lbnQuJHZtIHx8IHRvU2tpcChjb21wb25lbnQpKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBzeW5jUmVmcyhyZWZzLCAkcmVmcylcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gaGFuZGxlTGluayAoZXZlbnQpIHtcclxuICBjb25zdCB7XHJcbiAgICB2dWVQaWQsXHJcbiAgICB2dWVPcHRpb25zXHJcbiAgfSA9IGV2ZW50LmRldGFpbCB8fCBldmVudC52YWx1ZTsgLy8gZGV0YWlsIOaYr+W+ruS/oSx2YWx1ZSDmmK/nmb7luqYoZGlwYXRjaClcclxuXHJcbiAgbGV0IHBhcmVudFZtO1xyXG5cclxuICBpZiAodnVlUGlkKSB7XHJcbiAgICBwYXJlbnRWbSA9IGZpbmRWbUJ5VnVlSWQodGhpcy4kdm0sIHZ1ZVBpZCk7XHJcbiAgfVxyXG5cclxuICBpZiAoIXBhcmVudFZtKSB7XHJcbiAgICBwYXJlbnRWbSA9IHRoaXMuJHZtO1xyXG4gIH1cclxuXHJcbiAgdnVlT3B0aW9ucy5wYXJlbnQgPSBwYXJlbnRWbTtcclxufVxyXG5cclxuZnVuY3Rpb24gbWFya01QQ29tcG9uZW50IChjb21wb25lbnQpIHtcclxuICAvLyDlnKggVnVlIOS4reagh+iusOS4uuWwj+eoi+W6j+e7hOS7tlxyXG4gIGNvbnN0IElTX01QID0gJ19fdl9pc01QQ29tcG9uZW50JztcclxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29tcG9uZW50LCBJU19NUCwge1xyXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICB2YWx1ZTogdHJ1ZVxyXG4gIH0pO1xyXG4gIHJldHVybiBjb21wb25lbnRcclxufVxyXG5cclxuZnVuY3Rpb24gdG9Ta2lwIChvYmopIHtcclxuICBjb25zdCBPQiA9ICdfX29iX18nO1xyXG4gIGNvbnN0IFNLSVAgPSAnX192X3NraXAnO1xyXG4gIGlmIChpc09iamVjdChvYmopICYmIE9iamVjdC5pc0V4dGVuc2libGUob2JqKSkge1xyXG4gICAgLy8g6YG/5YWN6KKrIEB2dWUvY29tcG9zaXRpb24tYXBpIOingua1i1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgT0IsIHtcclxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxyXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgICAgdmFsdWU6IHtcclxuICAgICAgICBbU0tJUF06IHRydWVcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHJldHVybiBvYmpcclxufVxyXG5cclxuY29uc3QgTVBQYWdlID0gUGFnZTtcclxuY29uc3QgTVBDb21wb25lbnQgPSBDb21wb25lbnQ7XHJcblxyXG5jb25zdCBjdXN0b21pemVSRSA9IC86L2c7XHJcblxyXG5jb25zdCBjdXN0b21pemUgPSBjYWNoZWQoKHN0cikgPT4ge1xyXG4gIHJldHVybiBjYW1lbGl6ZShzdHIucmVwbGFjZShjdXN0b21pemVSRSwgJy0nKSlcclxufSk7XHJcblxyXG5mdW5jdGlvbiBpbml0VHJpZ2dlckV2ZW50IChtcEluc3RhbmNlKSB7XHJcbiAgY29uc3Qgb2xkVHJpZ2dlckV2ZW50ID0gbXBJbnN0YW5jZS50cmlnZ2VyRXZlbnQ7XHJcbiAgY29uc3QgbmV3VHJpZ2dlckV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCAuLi5hcmdzKSB7XHJcbiAgICAvLyDkuovku7blkI3nu5/kuIDovazpqbzls7DmoLzlvI/vvIzku4XlpITnkIbvvJrlvZPliY3nu4Tku7bkuLogdnVlIOe7hOS7tuOAgeW9k+WJjee7hOS7tuS4uiB2dWUg57uE5Lu25a2Q57uE5Lu2XHJcbiAgICBpZiAodGhpcy4kdm0gfHwgKHRoaXMuZGF0YXNldCAmJiB0aGlzLmRhdGFzZXQuY29tVHlwZSkpIHtcclxuICAgICAgZXZlbnQgPSBjdXN0b21pemUoZXZlbnQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9sZFRyaWdnZXJFdmVudC5hcHBseSh0aGlzLCBbZXZlbnQsIC4uLmFyZ3NdKVxyXG4gIH07XHJcbiAgdHJ5IHtcclxuICAgIC8vIOS6rOS4nOWwj+eoi+W6jyB0cmlnZ2VyRXZlbnQg5Li65Y+q6K+7XHJcbiAgICBtcEluc3RhbmNlLnRyaWdnZXJFdmVudCA9IG5ld1RyaWdnZXJFdmVudDtcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgbXBJbnN0YW5jZS5fdHJpZ2dlckV2ZW50ID0gbmV3VHJpZ2dlckV2ZW50O1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gaW5pdEhvb2sgKG5hbWUsIG9wdGlvbnMsIGlzQ29tcG9uZW50KSB7XHJcbiAgY29uc3Qgb2xkSG9vayA9IG9wdGlvbnNbbmFtZV07XHJcbiAgb3B0aW9uc1tuYW1lXSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XHJcbiAgICBtYXJrTVBDb21wb25lbnQodGhpcyk7XHJcbiAgICBpbml0VHJpZ2dlckV2ZW50KHRoaXMpO1xyXG4gICAgaWYgKG9sZEhvb2spIHtcclxuICAgICAgcmV0dXJuIG9sZEhvb2suYXBwbHkodGhpcywgYXJncylcclxuICAgIH1cclxuICB9O1xyXG59XHJcbmlmICghTVBQYWdlLl9fJHdyYXBwZXJlZCkge1xyXG4gIE1QUGFnZS5fXyR3cmFwcGVyZWQgPSB0cnVlO1xyXG4gIFBhZ2UgPSBmdW5jdGlvbiAob3B0aW9ucyA9IHt9KSB7XHJcbiAgICBpbml0SG9vaygnb25Mb2FkJywgb3B0aW9ucyk7XHJcbiAgICByZXR1cm4gTVBQYWdlKG9wdGlvbnMpXHJcbiAgfTtcclxuICBQYWdlLmFmdGVyID0gTVBQYWdlLmFmdGVyO1xyXG5cclxuICBDb21wb25lbnQgPSBmdW5jdGlvbiAob3B0aW9ucyA9IHt9KSB7XHJcbiAgICBpbml0SG9vaygnY3JlYXRlZCcsIG9wdGlvbnMpO1xyXG4gICAgcmV0dXJuIE1QQ29tcG9uZW50KG9wdGlvbnMpXHJcbiAgfTtcclxufVxyXG5cclxuY29uc3QgUEFHRV9FVkVOVF9IT09LUyA9IFtcclxuICAnb25QdWxsRG93blJlZnJlc2gnLFxyXG4gICdvblJlYWNoQm90dG9tJyxcclxuICAnb25BZGRUb0Zhdm9yaXRlcycsXHJcbiAgJ29uU2hhcmVUaW1lbGluZScsXHJcbiAgJ29uU2hhcmVBcHBNZXNzYWdlJyxcclxuICAnb25QYWdlU2Nyb2xsJyxcclxuICAnb25SZXNpemUnLFxyXG4gICdvblRhYkl0ZW1UYXAnXHJcbl07XHJcblxyXG5mdW5jdGlvbiBpbml0TW9ja3MgKHZtLCBtb2Nrcykge1xyXG4gIGNvbnN0IG1wSW5zdGFuY2UgPSB2bS4kbXBbdm0ubXBUeXBlXTtcclxuICBtb2Nrcy5mb3JFYWNoKG1vY2sgPT4ge1xyXG4gICAgaWYgKGhhc093bihtcEluc3RhbmNlLCBtb2NrKSkge1xyXG4gICAgICB2bVttb2NrXSA9IG1wSW5zdGFuY2VbbW9ja107XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhc0hvb2sgKGhvb2ssIHZ1ZU9wdGlvbnMpIHtcclxuICBpZiAoIXZ1ZU9wdGlvbnMpIHtcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICBpZiAoVnVlLm9wdGlvbnMgJiYgQXJyYXkuaXNBcnJheShWdWUub3B0aW9uc1tob29rXSkpIHtcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICB2dWVPcHRpb25zID0gdnVlT3B0aW9ucy5kZWZhdWx0IHx8IHZ1ZU9wdGlvbnM7XHJcblxyXG4gIGlmIChpc0ZuKHZ1ZU9wdGlvbnMpKSB7XHJcbiAgICBpZiAoaXNGbih2dWVPcHRpb25zLmV4dGVuZE9wdGlvbnNbaG9va10pKSB7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcbiAgICBpZiAodnVlT3B0aW9ucy5zdXBlciAmJlxyXG4gICAgICB2dWVPcHRpb25zLnN1cGVyLm9wdGlvbnMgJiZcclxuICAgICAgQXJyYXkuaXNBcnJheSh2dWVPcHRpb25zLnN1cGVyLm9wdGlvbnNbaG9va10pKSB7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIGlmIChpc0ZuKHZ1ZU9wdGlvbnNbaG9va10pIHx8IEFycmF5LmlzQXJyYXkodnVlT3B0aW9uc1tob29rXSkpIHtcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG4gIGNvbnN0IG1peGlucyA9IHZ1ZU9wdGlvbnMubWl4aW5zO1xyXG4gIGlmIChBcnJheS5pc0FycmF5KG1peGlucykpIHtcclxuICAgIHJldHVybiAhIW1peGlucy5maW5kKG1peGluID0+IGhhc0hvb2soaG9vaywgbWl4aW4pKVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gaW5pdEhvb2tzIChtcE9wdGlvbnMsIGhvb2tzLCB2dWVPcHRpb25zKSB7XHJcbiAgaG9va3MuZm9yRWFjaChob29rID0+IHtcclxuICAgIGlmIChoYXNIb29rKGhvb2ssIHZ1ZU9wdGlvbnMpKSB7XHJcbiAgICAgIG1wT3B0aW9uc1tob29rXSA9IGZ1bmN0aW9uIChhcmdzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuJHZtICYmIHRoaXMuJHZtLl9fY2FsbF9ob29rKGhvb2ssIGFyZ3MpXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRVbmtub3duSG9va3MgKG1wT3B0aW9ucywgdnVlT3B0aW9ucywgZXhjbHVkZXMgPSBbXSkge1xyXG4gIGZpbmRIb29rcyh2dWVPcHRpb25zKS5mb3JFYWNoKChob29rKSA9PiBpbml0SG9vayQxKG1wT3B0aW9ucywgaG9vaywgZXhjbHVkZXMpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZmluZEhvb2tzICh2dWVPcHRpb25zLCBob29rcyA9IFtdKSB7XHJcbiAgaWYgKHZ1ZU9wdGlvbnMpIHtcclxuICAgIE9iamVjdC5rZXlzKHZ1ZU9wdGlvbnMpLmZvckVhY2goKG5hbWUpID0+IHtcclxuICAgICAgaWYgKG5hbWUuaW5kZXhPZignb24nKSA9PT0gMCAmJiBpc0ZuKHZ1ZU9wdGlvbnNbbmFtZV0pKSB7XHJcbiAgICAgICAgaG9va3MucHVzaChuYW1lKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHJldHVybiBob29rc1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0SG9vayQxIChtcE9wdGlvbnMsIGhvb2ssIGV4Y2x1ZGVzKSB7XHJcbiAgaWYgKGV4Y2x1ZGVzLmluZGV4T2YoaG9vaykgPT09IC0xICYmICFoYXNPd24obXBPcHRpb25zLCBob29rKSkge1xyXG4gICAgbXBPcHRpb25zW2hvb2tdID0gZnVuY3Rpb24gKGFyZ3MpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuJHZtICYmIHRoaXMuJHZtLl9fY2FsbF9ob29rKGhvb2ssIGFyZ3MpXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gaW5pdFZ1ZUNvbXBvbmVudCAoVnVlLCB2dWVPcHRpb25zKSB7XHJcbiAgdnVlT3B0aW9ucyA9IHZ1ZU9wdGlvbnMuZGVmYXVsdCB8fCB2dWVPcHRpb25zO1xyXG4gIGxldCBWdWVDb21wb25lbnQ7XHJcbiAgaWYgKGlzRm4odnVlT3B0aW9ucykpIHtcclxuICAgIFZ1ZUNvbXBvbmVudCA9IHZ1ZU9wdGlvbnM7XHJcbiAgfSBlbHNlIHtcclxuICAgIFZ1ZUNvbXBvbmVudCA9IFZ1ZS5leHRlbmQodnVlT3B0aW9ucyk7XHJcbiAgfVxyXG4gIHZ1ZU9wdGlvbnMgPSBWdWVDb21wb25lbnQub3B0aW9ucztcclxuICByZXR1cm4gW1Z1ZUNvbXBvbmVudCwgdnVlT3B0aW9uc11cclxufVxyXG5cclxuZnVuY3Rpb24gaW5pdFNsb3RzICh2bSwgdnVlU2xvdHMpIHtcclxuICBpZiAoQXJyYXkuaXNBcnJheSh2dWVTbG90cykgJiYgdnVlU2xvdHMubGVuZ3RoKSB7XHJcbiAgICBjb25zdCAkc2xvdHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xyXG4gICAgdnVlU2xvdHMuZm9yRWFjaChzbG90TmFtZSA9PiB7XHJcbiAgICAgICRzbG90c1tzbG90TmFtZV0gPSB0cnVlO1xyXG4gICAgfSk7XHJcbiAgICB2bS4kc2NvcGVkU2xvdHMgPSB2bS4kc2xvdHMgPSAkc2xvdHM7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0VnVlSWRzICh2dWVJZHMsIG1wSW5zdGFuY2UpIHtcclxuICB2dWVJZHMgPSAodnVlSWRzIHx8ICcnKS5zcGxpdCgnLCcpO1xyXG4gIGNvbnN0IGxlbiA9IHZ1ZUlkcy5sZW5ndGg7XHJcblxyXG4gIGlmIChsZW4gPT09IDEpIHtcclxuICAgIG1wSW5zdGFuY2UuXyR2dWVJZCA9IHZ1ZUlkc1swXTtcclxuICB9IGVsc2UgaWYgKGxlbiA9PT0gMikge1xyXG4gICAgbXBJbnN0YW5jZS5fJHZ1ZUlkID0gdnVlSWRzWzBdO1xyXG4gICAgbXBJbnN0YW5jZS5fJHZ1ZVBpZCA9IHZ1ZUlkc1sxXTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXREYXRhICh2dWVPcHRpb25zLCBjb250ZXh0KSB7XHJcbiAgbGV0IGRhdGEgPSB2dWVPcHRpb25zLmRhdGEgfHwge307XHJcbiAgY29uc3QgbWV0aG9kcyA9IHZ1ZU9wdGlvbnMubWV0aG9kcyB8fCB7fTtcclxuXHJcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBkYXRhID0gZGF0YS5jYWxsKGNvbnRleHQpOyAvLyDmlK/mjIEgVnVlLnByb3RvdHlwZSDkuIrmjILnmoTmlbDmja5cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgaWYgKHByb2Nlc3MuZW52LlZVRV9BUFBfREVCVUcpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ+agueaNriBWdWUg55qEIGRhdGEg5Ye95pWw5Yid5aeL5YyW5bCP56iL5bqPIGRhdGEg5aSx6LSl77yM6K+35bC96YeP56Gu5L+dIGRhdGEg5Ye95pWw5Lit5LiN6K6/6ZeuIHZtIOWvueixoe+8jOWQpuWImeWPr+iDveW9seWTjemmluasoeaVsOaNrua4suafk+mAn+W6puOAgicsIGRhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIOWvuSBkYXRhIOagvOW8j+WMllxyXG4gICAgICBkYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICB9IGNhdGNoIChlKSB7IH1cclxuICB9XHJcblxyXG4gIGlmICghaXNQbGFpbk9iamVjdChkYXRhKSkge1xyXG4gICAgZGF0YSA9IHt9O1xyXG4gIH1cclxuXHJcbiAgT2JqZWN0LmtleXMobWV0aG9kcykuZm9yRWFjaChtZXRob2ROYW1lID0+IHtcclxuICAgIGlmIChjb250ZXh0Ll9fbGlmZWN5Y2xlX2hvb2tzX18uaW5kZXhPZihtZXRob2ROYW1lKSA9PT0gLTEgJiYgIWhhc093bihkYXRhLCBtZXRob2ROYW1lKSkge1xyXG4gICAgICBkYXRhW21ldGhvZE5hbWVdID0gbWV0aG9kc1ttZXRob2ROYW1lXTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIGRhdGFcclxufVxyXG5cclxuY29uc3QgUFJPUF9UWVBFUyA9IFtTdHJpbmcsIE51bWJlciwgQm9vbGVhbiwgT2JqZWN0LCBBcnJheSwgbnVsbF07XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVPYnNlcnZlciAobmFtZSkge1xyXG4gIHJldHVybiBmdW5jdGlvbiBvYnNlcnZlciAobmV3VmFsLCBvbGRWYWwpIHtcclxuICAgIGlmICh0aGlzLiR2bSkge1xyXG4gICAgICB0aGlzLiR2bVtuYW1lXSA9IG5ld1ZhbDsgLy8g5Li65LqG6Kem5Y+R5YW25LuW6Z2eIHJlbmRlciB3YXRjaGVyXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0QmVoYXZpb3JzICh2dWVPcHRpb25zLCBpbml0QmVoYXZpb3IpIHtcclxuICBjb25zdCB2dWVCZWhhdmlvcnMgPSB2dWVPcHRpb25zLmJlaGF2aW9ycztcclxuICBjb25zdCB2dWVFeHRlbmRzID0gdnVlT3B0aW9ucy5leHRlbmRzO1xyXG4gIGNvbnN0IHZ1ZU1peGlucyA9IHZ1ZU9wdGlvbnMubWl4aW5zO1xyXG5cclxuICBsZXQgdnVlUHJvcHMgPSB2dWVPcHRpb25zLnByb3BzO1xyXG5cclxuICBpZiAoIXZ1ZVByb3BzKSB7XHJcbiAgICB2dWVPcHRpb25zLnByb3BzID0gdnVlUHJvcHMgPSBbXTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGJlaGF2aW9ycyA9IFtdO1xyXG4gIGlmIChBcnJheS5pc0FycmF5KHZ1ZUJlaGF2aW9ycykpIHtcclxuICAgIHZ1ZUJlaGF2aW9ycy5mb3JFYWNoKGJlaGF2aW9yID0+IHtcclxuICAgICAgYmVoYXZpb3JzLnB1c2goYmVoYXZpb3IucmVwbGFjZSgndW5pOi8vJywgYCR7XCJqZFwifTovL2ApKTtcclxuICAgICAgaWYgKGJlaGF2aW9yID09PSAndW5pOi8vZm9ybS1maWVsZCcpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2dWVQcm9wcykpIHtcclxuICAgICAgICAgIHZ1ZVByb3BzLnB1c2goJ25hbWUnKTtcclxuICAgICAgICAgIHZ1ZVByb3BzLnB1c2goJ3ZhbHVlJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHZ1ZVByb3BzLm5hbWUgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgICAgICAgZGVmYXVsdDogJydcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB2dWVQcm9wcy52YWx1ZSA9IHtcclxuICAgICAgICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyLCBCb29sZWFuLCBBcnJheSwgT2JqZWN0LCBEYXRlXSxcclxuICAgICAgICAgICAgZGVmYXVsdDogJydcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgaWYgKGlzUGxhaW5PYmplY3QodnVlRXh0ZW5kcykgJiYgdnVlRXh0ZW5kcy5wcm9wcykge1xyXG4gICAgYmVoYXZpb3JzLnB1c2goXHJcbiAgICAgIGluaXRCZWhhdmlvcih7XHJcbiAgICAgICAgcHJvcGVydGllczogaW5pdFByb3BlcnRpZXModnVlRXh0ZW5kcy5wcm9wcywgdHJ1ZSlcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIGlmIChBcnJheS5pc0FycmF5KHZ1ZU1peGlucykpIHtcclxuICAgIHZ1ZU1peGlucy5mb3JFYWNoKHZ1ZU1peGluID0+IHtcclxuICAgICAgaWYgKGlzUGxhaW5PYmplY3QodnVlTWl4aW4pICYmIHZ1ZU1peGluLnByb3BzKSB7XHJcbiAgICAgICAgYmVoYXZpb3JzLnB1c2goXHJcbiAgICAgICAgICBpbml0QmVoYXZpb3Ioe1xyXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBpbml0UHJvcGVydGllcyh2dWVNaXhpbi5wcm9wcywgdHJ1ZSlcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHJldHVybiBiZWhhdmlvcnNcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VQcm9wVHlwZSAoa2V5LCB0eXBlLCBkZWZhdWx0VmFsdWUsIGZpbGUpIHtcclxuICAvLyBbU3RyaW5nXT0+U3RyaW5nXHJcbiAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkgJiYgdHlwZS5sZW5ndGggPT09IDEpIHtcclxuICAgIHJldHVybiB0eXBlWzBdXHJcbiAgfVxyXG4gIHJldHVybiB0eXBlXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRQcm9wZXJ0aWVzIChwcm9wcywgaXNCZWhhdmlvciA9IGZhbHNlLCBmaWxlID0gJycsIG9wdGlvbnMpIHtcclxuICBjb25zdCBwcm9wZXJ0aWVzID0ge307XHJcbiAgaWYgKCFpc0JlaGF2aW9yKSB7XHJcbiAgICBwcm9wZXJ0aWVzLnZ1ZUlkID0ge1xyXG4gICAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICAgIHZhbHVlOiAnJ1xyXG4gICAgfTtcclxuICAgIC8vIHNjb3BlZFNsb3RzQ29tcGlsZXIgYXV0b1xyXG4gICAgcHJvcGVydGllcy5zY29wZWRTbG90c0NvbXBpbGVyID0ge1xyXG4gICAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICAgIHZhbHVlOiAnJ1xyXG4gICAgfTtcclxuICAgIHByb3BlcnRpZXMudnVlU2xvdHMgPSB7IC8vIOWwj+eoi+W6j+S4jeiDveebtOaOpeWumuS5iSAkc2xvdHMg55qEIHByb3Bz77yM5omA5Lul6YCa6L+HIHZ1ZVNsb3RzIOi9rOaNouWIsCAkc2xvdHNcclxuICAgICAgdHlwZTogbnVsbCxcclxuICAgICAgdmFsdWU6IFtdLFxyXG4gICAgICBvYnNlcnZlcjogZnVuY3Rpb24gKG5ld1ZhbCwgb2xkVmFsKSB7XHJcbiAgICAgICAgY29uc3QgJHNsb3RzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcclxuICAgICAgICBuZXdWYWwuZm9yRWFjaChzbG90TmFtZSA9PiB7XHJcbiAgICAgICAgICAkc2xvdHNbc2xvdE5hbWVdID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnNldERhdGEoe1xyXG4gICAgICAgICAgJHNsb3RzXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG4gIGlmIChBcnJheS5pc0FycmF5KHByb3BzKSkgeyAvLyBbJ3RpdGxlJ11cclxuICAgIHByb3BzLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgcHJvcGVydGllc1trZXldID0ge1xyXG4gICAgICAgIHR5cGU6IG51bGwsXHJcbiAgICAgICAgb2JzZXJ2ZXI6IGNyZWF0ZU9ic2VydmVyKGtleSlcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChwcm9wcykpIHsgLy8ge3RpdGxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OicnfSxjb250ZW50OlN0cmluZ31cclxuICAgIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgIGNvbnN0IG9wdHMgPSBwcm9wc1trZXldO1xyXG4gICAgICBpZiAoaXNQbGFpbk9iamVjdChvcHRzKSkgeyAvLyB0aXRsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDonJ31cclxuICAgICAgICBsZXQgdmFsdWUgPSBvcHRzLmRlZmF1bHQ7XHJcbiAgICAgICAgaWYgKGlzRm4odmFsdWUpKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvcHRzLnR5cGUgPSBwYXJzZVByb3BUeXBlKGtleSwgb3B0cy50eXBlKTtcclxuXHJcbiAgICAgICAgcHJvcGVydGllc1trZXldID0ge1xyXG4gICAgICAgICAgdHlwZTogUFJPUF9UWVBFUy5pbmRleE9mKG9wdHMudHlwZSkgIT09IC0xID8gb3B0cy50eXBlIDogbnVsbCxcclxuICAgICAgICAgIHZhbHVlLFxyXG4gICAgICAgICAgb2JzZXJ2ZXI6IGNyZWF0ZU9ic2VydmVyKGtleSlcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2UgeyAvLyBjb250ZW50OlN0cmluZ1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSBwYXJzZVByb3BUeXBlKGtleSwgb3B0cyk7XHJcbiAgICAgICAgcHJvcGVydGllc1trZXldID0ge1xyXG4gICAgICAgICAgdHlwZTogUFJPUF9UWVBFUy5pbmRleE9mKHR5cGUpICE9PSAtMSA/IHR5cGUgOiBudWxsLFxyXG4gICAgICAgICAgb2JzZXJ2ZXI6IGNyZWF0ZU9ic2VydmVyKGtleSlcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcmV0dXJuIHByb3BlcnRpZXNcclxufVxyXG5cclxuZnVuY3Rpb24gd3JhcHBlciQxIChldmVudCkge1xyXG4gIC8vIFRPRE8g5Y+I5b6X5YW85a65IG1wdnVlIOeahCBtcCDlr7nosaFcclxuICB0cnkge1xyXG4gICAgZXZlbnQubXAgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGV2ZW50KSk7XHJcbiAgfSBjYXRjaCAoZSkgeyB9XHJcblxyXG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9IG5vb3A7XHJcbiAgZXZlbnQucHJldmVudERlZmF1bHQgPSBub29wO1xyXG5cclxuICBldmVudC50YXJnZXQgPSBldmVudC50YXJnZXQgfHwge307XHJcblxyXG4gIGlmICghaGFzT3duKGV2ZW50LCAnZGV0YWlsJykpIHtcclxuICAgIGV2ZW50LmRldGFpbCA9IHt9O1xyXG4gIH1cclxuXHJcbiAgaWYgKGhhc093bihldmVudCwgJ21hcmtlcklkJykpIHtcclxuICAgIGV2ZW50LmRldGFpbCA9IHR5cGVvZiBldmVudC5kZXRhaWwgPT09ICdvYmplY3QnID8gZXZlbnQuZGV0YWlsIDoge307XHJcbiAgICBldmVudC5kZXRhaWwubWFya2VySWQgPSBldmVudC5tYXJrZXJJZDtcclxuICB9XHJcblxyXG4gIGlmIChpc1BsYWluT2JqZWN0KGV2ZW50LmRldGFpbCkpIHtcclxuICAgIGV2ZW50LnRhcmdldCA9IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50LnRhcmdldCwgZXZlbnQuZGV0YWlsKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBldmVudFxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRFeHRyYVZhbHVlICh2bSwgZGF0YVBhdGhzQXJyYXkpIHtcclxuICBsZXQgY29udGV4dCA9IHZtO1xyXG4gIGRhdGFQYXRoc0FycmF5LmZvckVhY2goZGF0YVBhdGhBcnJheSA9PiB7XHJcbiAgICBjb25zdCBkYXRhUGF0aCA9IGRhdGFQYXRoQXJyYXlbMF07XHJcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGFQYXRoQXJyYXlbMl07XHJcbiAgICBpZiAoZGF0YVBhdGggfHwgdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJykgeyAvLyBbJycsJycsaW5kZXgsJ2Rpc2FibGUnXVxyXG4gICAgICBjb25zdCBwcm9wUGF0aCA9IGRhdGFQYXRoQXJyYXlbMV07XHJcbiAgICAgIGNvbnN0IHZhbHVlUGF0aCA9IGRhdGFQYXRoQXJyYXlbM107XHJcblxyXG4gICAgICBsZXQgdkZvcjtcclxuICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoZGF0YVBhdGgpKSB7XHJcbiAgICAgICAgdkZvciA9IGRhdGFQYXRoO1xyXG4gICAgICB9IGVsc2UgaWYgKCFkYXRhUGF0aCkge1xyXG4gICAgICAgIHZGb3IgPSBjb250ZXh0O1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhUGF0aCA9PT0gJ3N0cmluZycgJiYgZGF0YVBhdGgpIHtcclxuICAgICAgICBpZiAoZGF0YVBhdGguaW5kZXhPZignI3MjJykgPT09IDApIHtcclxuICAgICAgICAgIHZGb3IgPSBkYXRhUGF0aC5zdWJzdHIoMyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHZGb3IgPSB2bS5fX2dldF92YWx1ZShkYXRhUGF0aCwgY29udGV4dCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2Rm9yKSkge1xyXG4gICAgICAgIGNvbnRleHQgPSB2YWx1ZTtcclxuICAgICAgfSBlbHNlIGlmICghcHJvcFBhdGgpIHtcclxuICAgICAgICBjb250ZXh0ID0gdkZvclt2YWx1ZV07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodkZvcikpIHtcclxuICAgICAgICAgIGNvbnRleHQgPSB2Rm9yLmZpbmQodkZvckl0ZW0gPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdm0uX19nZXRfdmFsdWUocHJvcFBhdGgsIHZGb3JJdGVtKSA9PT0gdmFsdWVcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCh2Rm9yKSkge1xyXG4gICAgICAgICAgY29udGV4dCA9IE9iamVjdC5rZXlzKHZGb3IpLmZpbmQodkZvcktleSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB2bS5fX2dldF92YWx1ZShwcm9wUGF0aCwgdkZvclt2Rm9yS2V5XSkgPT09IHZhbHVlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcigndi1mb3Ig5pqC5LiN5pSv5oyB5b6q546v5pWw5o2u77yaJywgdkZvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodmFsdWVQYXRoKSB7XHJcbiAgICAgICAgY29udGV4dCA9IHZtLl9fZ2V0X3ZhbHVlKHZhbHVlUGF0aCwgY29udGV4dCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuICByZXR1cm4gY29udGV4dFxyXG59XHJcblxyXG5mdW5jdGlvbiBwcm9jZXNzRXZlbnRFeHRyYSAodm0sIGV4dHJhLCBldmVudCwgX19hcmdzX18pIHtcclxuICBjb25zdCBleHRyYU9iaiA9IHt9O1xyXG5cclxuICBpZiAoQXJyYXkuaXNBcnJheShleHRyYSkgJiYgZXh0cmEubGVuZ3RoKSB7XHJcbiAgICAvKipcclxuICAgICAqW1xyXG4gICAgICogICAgWydkYXRhLml0ZW1zJywgJ2RhdGEuaWQnLCBpdGVtLmRhdGEuaWRdLFxyXG4gICAgICogICAgWydtZXRhcycsICdpZCcsIG1ldGEuaWRdXHJcbiAgICAgKl0sXHJcbiAgICAgKltcclxuICAgICAqICAgIFsnZGF0YS5pdGVtcycsICdkYXRhLmlkJywgaXRlbS5kYXRhLmlkXSxcclxuICAgICAqICAgIFsnbWV0YXMnLCAnaWQnLCBtZXRhLmlkXVxyXG4gICAgICpdLFxyXG4gICAgICondGVzdCdcclxuICAgICAqL1xyXG4gICAgZXh0cmEuZm9yRWFjaCgoZGF0YVBhdGgsIGluZGV4KSA9PiB7XHJcbiAgICAgIGlmICh0eXBlb2YgZGF0YVBhdGggPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgaWYgKCFkYXRhUGF0aCkgeyAvLyBtb2RlbCxwcm9wLnN5bmNcclxuICAgICAgICAgIGV4dHJhT2JqWyckJyArIGluZGV4XSA9IHZtO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoZGF0YVBhdGggPT09ICckZXZlbnQnKSB7IC8vICRldmVudFxyXG4gICAgICAgICAgICBleHRyYU9ialsnJCcgKyBpbmRleF0gPSBldmVudDtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVBhdGggPT09ICdhcmd1bWVudHMnKSB7XHJcbiAgICAgICAgICAgIGV4dHJhT2JqWyckJyArIGluZGV4XSA9IGV2ZW50LmRldGFpbCA/IGV2ZW50LmRldGFpbC5fX2FyZ3NfXyB8fCBfX2FyZ3NfXyA6IF9fYXJnc19fO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChkYXRhUGF0aC5pbmRleE9mKCckZXZlbnQuJykgPT09IDApIHsgLy8gJGV2ZW50LnRhcmdldC52YWx1ZVxyXG4gICAgICAgICAgICBleHRyYU9ialsnJCcgKyBpbmRleF0gPSB2bS5fX2dldF92YWx1ZShkYXRhUGF0aC5yZXBsYWNlKCckZXZlbnQuJywgJycpLCBldmVudCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBleHRyYU9ialsnJCcgKyBpbmRleF0gPSB2bS5fX2dldF92YWx1ZShkYXRhUGF0aCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGV4dHJhT2JqWyckJyArIGluZGV4XSA9IGdldEV4dHJhVmFsdWUodm0sIGRhdGFQYXRoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZXh0cmFPYmpcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0T2JqQnlBcnJheSAoYXJyKSB7XHJcbiAgY29uc3Qgb2JqID0ge307XHJcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJbaV07XHJcbiAgICBvYmpbZWxlbWVudFswXV0gPSBlbGVtZW50WzFdO1xyXG4gIH1cclxuICByZXR1cm4gb2JqXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByb2Nlc3NFdmVudEFyZ3MgKHZtLCBldmVudCwgYXJncyA9IFtdLCBleHRyYSA9IFtdLCBpc0N1c3RvbSwgbWV0aG9kTmFtZSkge1xyXG4gIGxldCBpc0N1c3RvbU1QRXZlbnQgPSBmYWxzZTsgLy8gd3hjb21wb25lbnQg57uE5Lu277yM5Lyg6YCS5Y6f5aeLIGV2ZW50IOWvueixoVxyXG5cclxuICAvLyBmaXhlZCDnlKjmiLfnm7TmjqXop6blj5EgbXBJbnN0YW5jZS50cmlnZ2VyRXZlbnRcclxuICBjb25zdCBfX2FyZ3NfXyA9IGlzUGxhaW5PYmplY3QoZXZlbnQuZGV0YWlsKVxyXG4gICAgPyBldmVudC5kZXRhaWwuX19hcmdzX18gfHwgW2V2ZW50LmRldGFpbF1cclxuICAgIDogW2V2ZW50LmRldGFpbF07XHJcblxyXG4gIGlmIChpc0N1c3RvbSkgeyAvLyDoh6rlrprkuYnkuovku7ZcclxuICAgIGlzQ3VzdG9tTVBFdmVudCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgJiZcclxuICAgICAgZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0ICYmXHJcbiAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldC5jb21UeXBlID09PSAnd3gnO1xyXG4gICAgaWYgKCFhcmdzLmxlbmd0aCkgeyAvLyDml6Dlj4LmlbDvvIznm7TmjqXkvKDlhaUgZXZlbnQg5oiWIGRldGFpbCDmlbDnu4RcclxuICAgICAgaWYgKGlzQ3VzdG9tTVBFdmVudCkge1xyXG4gICAgICAgIHJldHVybiBbZXZlbnRdXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIF9fYXJnc19fXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdCBleHRyYU9iaiA9IHByb2Nlc3NFdmVudEV4dHJhKHZtLCBleHRyYSwgZXZlbnQsIF9fYXJnc19fKTtcclxuXHJcbiAgY29uc3QgcmV0ID0gW107XHJcbiAgYXJncy5mb3JFYWNoKGFyZyA9PiB7XHJcbiAgICBpZiAoYXJnID09PSAnJGV2ZW50Jykge1xyXG4gICAgICBpZiAobWV0aG9kTmFtZSA9PT0gJ19fc2V0X21vZGVsJyAmJiAhaXNDdXN0b20pIHsgLy8gaW5wdXQgdi1tb2RlbCB2YWx1ZVxyXG4gICAgICAgIHJldC5wdXNoKGV2ZW50LnRhcmdldC52YWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKGlzQ3VzdG9tICYmICFpc0N1c3RvbU1QRXZlbnQpIHtcclxuICAgICAgICAgIHJldC5wdXNoKF9fYXJnc19fWzBdKTtcclxuICAgICAgICB9IGVsc2UgeyAvLyB3eGNvbXBvbmVudCDnu4Tku7bmiJblhoXnva7nu4Tku7ZcclxuICAgICAgICAgIHJldC5wdXNoKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykgJiYgYXJnWzBdID09PSAnbycpIHtcclxuICAgICAgICByZXQucHVzaChnZXRPYmpCeUFycmF5KGFyZykpO1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnICYmIGhhc093bihleHRyYU9iaiwgYXJnKSkge1xyXG4gICAgICAgIHJldC5wdXNoKGV4dHJhT2JqW2FyZ10pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldC5wdXNoKGFyZyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIHJldFxyXG59XHJcblxyXG5jb25zdCBPTkNFID0gJ34nO1xyXG5jb25zdCBDVVNUT00gPSAnXic7XHJcblxyXG5mdW5jdGlvbiBpc01hdGNoRXZlbnRUeXBlIChldmVudFR5cGUsIG9wdFR5cGUpIHtcclxuICByZXR1cm4gKGV2ZW50VHlwZSA9PT0gb3B0VHlwZSkgfHxcclxuICAgIChcclxuICAgICAgb3B0VHlwZSA9PT0gJ3JlZ2lvbmNoYW5nZScgJiZcclxuICAgICAgKFxyXG4gICAgICAgIGV2ZW50VHlwZSA9PT0gJ2JlZ2luJyB8fFxyXG4gICAgICAgIGV2ZW50VHlwZSA9PT0gJ2VuZCdcclxuICAgICAgKVxyXG4gICAgKVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRDb250ZXh0Vm0gKHZtKSB7XHJcbiAgbGV0ICRwYXJlbnQgPSB2bS4kcGFyZW50O1xyXG4gIC8vIOeItue7hOS7tuaYryBzY29wZWQgc2xvdHMg5oiW6ICF5YW25LuW6Ieq5a6a5LmJ57uE5Lu25pe257un57ut5p+l5om+XHJcbiAgd2hpbGUgKCRwYXJlbnQgJiYgJHBhcmVudC4kcGFyZW50ICYmICgkcGFyZW50LiRvcHRpb25zLmdlbmVyaWMgfHwgJHBhcmVudC4kcGFyZW50LiRvcHRpb25zLmdlbmVyaWMgfHwgJHBhcmVudC4kc2NvcGUuXyR2dWVQaWQpKSB7XHJcbiAgICAkcGFyZW50ID0gJHBhcmVudC4kcGFyZW50O1xyXG4gIH1cclxuICByZXR1cm4gJHBhcmVudCAmJiAkcGFyZW50LiRwYXJlbnRcclxufVxyXG5cclxuZnVuY3Rpb24gaGFuZGxlRXZlbnQgKGV2ZW50KSB7XHJcbiAgZXZlbnQgPSB3cmFwcGVyJDEoZXZlbnQpO1xyXG5cclxuICAvLyBbWyd0YXAnLFtbJ2hhbmRsZScsWzEsMixhXV0sWydoYW5kbGUxJyxbMSwyLGFdXV1dXVxyXG4gIGNvbnN0IGRhdGFzZXQgPSAoZXZlbnQuY3VycmVudFRhcmdldCB8fCBldmVudC50YXJnZXQpLmRhdGFzZXQ7XHJcbiAgaWYgKCFkYXRhc2V0KSB7XHJcbiAgICByZXR1cm4gY29uc29sZS53YXJuKCfkuovku7bkv6Hmga/kuI3lrZjlnKgnKVxyXG4gIH1cclxuICBjb25zdCBldmVudE9wdHMgPSBkYXRhc2V0LmV2ZW50T3B0cyB8fCBkYXRhc2V0WydldmVudC1vcHRzJ107IC8vIOaUr+S7mOWunSB3ZWItdmlldyDnu4Tku7YgZGF0YXNldCDpnZ7pqbzls7BcclxuICBpZiAoIWV2ZW50T3B0cykge1xyXG4gICAgcmV0dXJuIGNvbnNvbGUud2Fybign5LqL5Lu25L+h5oGv5LiN5a2Y5ZyoJylcclxuICB9XHJcblxyXG4gIC8vIFtbJ2hhbmRsZScsWzEsMixhXV0sWydoYW5kbGUxJyxbMSwyLGFdXV1cclxuICBjb25zdCBldmVudFR5cGUgPSBldmVudC50eXBlO1xyXG5cclxuICBjb25zdCByZXQgPSBbXTtcclxuXHJcbiAgZXZlbnRPcHRzLmZvckVhY2goZXZlbnRPcHQgPT4ge1xyXG4gICAgbGV0IHR5cGUgPSBldmVudE9wdFswXTtcclxuICAgIGNvbnN0IGV2ZW50c0FycmF5ID0gZXZlbnRPcHRbMV07XHJcblxyXG4gICAgY29uc3QgaXNDdXN0b20gPSB0eXBlLmNoYXJBdCgwKSA9PT0gQ1VTVE9NO1xyXG4gICAgdHlwZSA9IGlzQ3VzdG9tID8gdHlwZS5zbGljZSgxKSA6IHR5cGU7XHJcbiAgICBjb25zdCBpc09uY2UgPSB0eXBlLmNoYXJBdCgwKSA9PT0gT05DRTtcclxuICAgIHR5cGUgPSBpc09uY2UgPyB0eXBlLnNsaWNlKDEpIDogdHlwZTtcclxuXHJcbiAgICBpZiAoZXZlbnRzQXJyYXkgJiYgaXNNYXRjaEV2ZW50VHlwZShldmVudFR5cGUsIHR5cGUpKSB7XHJcbiAgICAgIGV2ZW50c0FycmF5LmZvckVhY2goZXZlbnRBcnJheSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IGV2ZW50QXJyYXlbMF07XHJcbiAgICAgICAgaWYgKG1ldGhvZE5hbWUpIHtcclxuICAgICAgICAgIGxldCBoYW5kbGVyQ3R4ID0gdGhpcy4kdm07XHJcbiAgICAgICAgICBpZiAoaGFuZGxlckN0eC4kb3B0aW9ucy5nZW5lcmljKSB7IC8vIG1wLXdlaXhpbixtcC10b3V0aWFvIOaKveixoeiKgueCueaooeaLnyBzY29wZWQgc2xvdHNcclxuICAgICAgICAgICAgaGFuZGxlckN0eCA9IGdldENvbnRleHRWbShoYW5kbGVyQ3R4KSB8fCBoYW5kbGVyQ3R4O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKG1ldGhvZE5hbWUgPT09ICckZW1pdCcpIHtcclxuICAgICAgICAgICAgaGFuZGxlckN0eC4kZW1pdC5hcHBseShoYW5kbGVyQ3R4LFxyXG4gICAgICAgICAgICAgIHByb2Nlc3NFdmVudEFyZ3MoXHJcbiAgICAgICAgICAgICAgICB0aGlzLiR2bSxcclxuICAgICAgICAgICAgICAgIGV2ZW50LFxyXG4gICAgICAgICAgICAgICAgZXZlbnRBcnJheVsxXSxcclxuICAgICAgICAgICAgICAgIGV2ZW50QXJyYXlbMl0sXHJcbiAgICAgICAgICAgICAgICBpc0N1c3RvbSxcclxuICAgICAgICAgICAgICAgIG1ldGhvZE5hbWVcclxuICAgICAgICAgICAgICApKTtcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlckN0eFttZXRob2ROYW1lXTtcclxuICAgICAgICAgIGlmICghaXNGbihoYW5kbGVyKSkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gdGhpcy4kdm0ubXBUeXBlID09PSAncGFnZScgPyAnUGFnZScgOiAnQ29tcG9uZW50JztcclxuICAgICAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMucm91dGUgfHwgdGhpcy5pcztcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3R5cGV9IFwiJHtwYXRofVwiIGRvZXMgbm90IGhhdmUgYSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCJgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGlzT25jZSkge1xyXG4gICAgICAgICAgICBpZiAoaGFuZGxlci5vbmNlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaGFuZGxlci5vbmNlID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBwYXJhbXMgPSBwcm9jZXNzRXZlbnRBcmdzKFxyXG4gICAgICAgICAgICB0aGlzLiR2bSxcclxuICAgICAgICAgICAgZXZlbnQsXHJcbiAgICAgICAgICAgIGV2ZW50QXJyYXlbMV0sXHJcbiAgICAgICAgICAgIGV2ZW50QXJyYXlbMl0sXHJcbiAgICAgICAgICAgIGlzQ3VzdG9tLFxyXG4gICAgICAgICAgICBtZXRob2ROYW1lXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcGFyYW1zID0gQXJyYXkuaXNBcnJheShwYXJhbXMpID8gcGFyYW1zIDogW107XHJcbiAgICAgICAgICAvLyDlj4LmlbDlsL7pg6jlop7liqDljp/lp4vkuovku7blr7nosaHnlKjkuo7lpI3mnYLooajovr7lvI/lhoXojrflj5bpop3lpJbmlbDmja5cclxuICAgICAgICAgIGlmICgvPVxccypcXFMrXFwuZXZlbnRQYXJhbXNcXHMqXFx8XFx8XFxzKlxcUytcXFtbJ1wiXWV2ZW50LXBhcmFtc1snXCJdXFxdLy50ZXN0KGhhbmRsZXIudG9TdHJpbmcoKSkpIHtcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNwYXJzZS1hcnJheXNcclxuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmNvbmNhdChbLCAsICwgLCAsICwgLCAsICwgLCBldmVudF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0LnB1c2goaGFuZGxlci5hcHBseShoYW5kbGVyQ3R4LCBwYXJhbXMpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICBpZiAoXHJcbiAgICBldmVudFR5cGUgPT09ICdpbnB1dCcgJiZcclxuICAgIHJldC5sZW5ndGggPT09IDEgJiZcclxuICAgIHR5cGVvZiByZXRbMF0gIT09ICd1bmRlZmluZWQnXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gcmV0WzBdXHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBFdmVudENoYW5uZWwge1xyXG4gIGNvbnN0cnVjdG9yIChpZCwgZXZlbnRzKSB7XHJcbiAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICB0aGlzLmxpc3RlbmVyID0ge307XHJcbiAgICB0aGlzLmVtaXRDYWNoZSA9IHt9O1xyXG4gICAgaWYgKGV2ZW50cykge1xyXG4gICAgICBPYmplY3Qua2V5cyhldmVudHMpLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICAgICAgdGhpcy5vbihuYW1lLCBldmVudHNbbmFtZV0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGVtaXQgKGV2ZW50TmFtZSwgLi4uYXJncykge1xyXG4gICAgY29uc3QgZm5zID0gdGhpcy5saXN0ZW5lcltldmVudE5hbWVdO1xyXG4gICAgaWYgKCFmbnMpIHtcclxuICAgICAgcmV0dXJuICh0aGlzLmVtaXRDYWNoZVtldmVudE5hbWVdIHx8ICh0aGlzLmVtaXRDYWNoZVtldmVudE5hbWVdID0gW10pKS5wdXNoKGFyZ3MpXHJcbiAgICB9XHJcbiAgICBmbnMuZm9yRWFjaChvcHQgPT4ge1xyXG4gICAgICBvcHQuZm4uYXBwbHkob3B0LmZuLCBhcmdzKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5saXN0ZW5lcltldmVudE5hbWVdID0gZm5zLmZpbHRlcihvcHQgPT4gb3B0LnR5cGUgIT09ICdvbmNlJyk7XHJcbiAgfVxyXG5cclxuICBvbiAoZXZlbnROYW1lLCBmbikge1xyXG4gICAgdGhpcy5fYWRkTGlzdGVuZXIoZXZlbnROYW1lLCAnb24nLCBmbik7XHJcbiAgICB0aGlzLl9jbGVhckNhY2hlKGV2ZW50TmFtZSk7XHJcbiAgfVxyXG5cclxuICBvbmNlIChldmVudE5hbWUsIGZuKSB7XHJcbiAgICB0aGlzLl9hZGRMaXN0ZW5lcihldmVudE5hbWUsICdvbmNlJywgZm4pO1xyXG4gICAgdGhpcy5fY2xlYXJDYWNoZShldmVudE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgb2ZmIChldmVudE5hbWUsIGZuKSB7XHJcbiAgICBjb25zdCBmbnMgPSB0aGlzLmxpc3RlbmVyW2V2ZW50TmFtZV07XHJcbiAgICBpZiAoIWZucykge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGlmIChmbikge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZucy5sZW5ndGg7KSB7XHJcbiAgICAgICAgaWYgKGZuc1tpXS5mbiA9PT0gZm4pIHtcclxuICAgICAgICAgIGZucy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICBpLS07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGkrKztcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZGVsZXRlIHRoaXMubGlzdGVuZXJbZXZlbnROYW1lXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIF9jbGVhckNhY2hlIChldmVudE5hbWUpIHtcclxuICAgIGNvbnN0IGNhY2hlQXJncyA9IHRoaXMuZW1pdENhY2hlW2V2ZW50TmFtZV07XHJcbiAgICBpZiAoY2FjaGVBcmdzKSB7XHJcbiAgICAgIGZvciAoOyBjYWNoZUFyZ3MubGVuZ3RoID4gMDspIHtcclxuICAgICAgICB0aGlzLmVtaXQuYXBwbHkodGhpcywgW2V2ZW50TmFtZV0uY29uY2F0KGNhY2hlQXJncy5zaGlmdCgpKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIF9hZGRMaXN0ZW5lciAoZXZlbnROYW1lLCB0eXBlLCBmbikge1xyXG4gICAgKHRoaXMubGlzdGVuZXJbZXZlbnROYW1lXSB8fCAodGhpcy5saXN0ZW5lcltldmVudE5hbWVdID0gW10pKS5wdXNoKHtcclxuICAgICAgZm4sXHJcbiAgICAgIHR5cGVcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuY29uc3QgZXZlbnRDaGFubmVscyA9IHt9O1xyXG5cclxuY29uc3QgZXZlbnRDaGFubmVsU3RhY2sgPSBbXTtcclxuXHJcbmZ1bmN0aW9uIGdldEV2ZW50Q2hhbm5lbCAoaWQpIHtcclxuICBpZiAoaWQpIHtcclxuICAgIGNvbnN0IGV2ZW50Q2hhbm5lbCA9IGV2ZW50Q2hhbm5lbHNbaWRdO1xyXG4gICAgZGVsZXRlIGV2ZW50Q2hhbm5lbHNbaWRdO1xyXG4gICAgcmV0dXJuIGV2ZW50Q2hhbm5lbFxyXG4gIH1cclxuICByZXR1cm4gZXZlbnRDaGFubmVsU3RhY2suc2hpZnQoKVxyXG59XHJcblxyXG5jb25zdCBob29rcyA9IFtcclxuICAnb25TaG93JyxcclxuICAnb25IaWRlJyxcclxuICAnb25FcnJvcicsXHJcbiAgJ29uUGFnZU5vdEZvdW5kJyxcclxuICAnb25UaGVtZUNoYW5nZScsXHJcbiAgJ29uVW5oYW5kbGVkUmVqZWN0aW9uJ1xyXG5dO1xyXG5cclxuZnVuY3Rpb24gaW5pdEV2ZW50Q2hhbm5lbCAoKSB7XHJcbiAgVnVlLnByb3RvdHlwZS5nZXRPcGVuZXJFdmVudENoYW5uZWwgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAoIXRoaXMuX19ldmVudENoYW5uZWxfXykge1xyXG4gICAgICB0aGlzLl9fZXZlbnRDaGFubmVsX18gPSBuZXcgRXZlbnRDaGFubmVsKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fX2V2ZW50Q2hhbm5lbF9fXHJcbiAgfTtcclxuICBjb25zdCBjYWxsSG9vayA9IFZ1ZS5wcm90b3R5cGUuX19jYWxsX2hvb2s7XHJcbiAgVnVlLnByb3RvdHlwZS5fX2NhbGxfaG9vayA9IGZ1bmN0aW9uIChob29rLCBhcmdzKSB7XHJcbiAgICBpZiAoaG9vayA9PT0gJ29uTG9hZCcgJiYgYXJncyAmJiBhcmdzLl9faWRfXykge1xyXG4gICAgICB0aGlzLl9fZXZlbnRDaGFubmVsX18gPSBnZXRFdmVudENoYW5uZWwoYXJncy5fX2lkX18pO1xyXG4gICAgICBkZWxldGUgYXJncy5fX2lkX187XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2FsbEhvb2suY2FsbCh0aGlzLCBob29rLCBhcmdzKVxyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRTY29wZWRTbG90c1BhcmFtcyAoKSB7XHJcbiAgY29uc3QgY2VudGVyID0ge307XHJcbiAgY29uc3QgcGFyZW50cyA9IHt9O1xyXG5cclxuICBWdWUucHJvdG90eXBlLiRoYXNTY29wZWRTbG90c1BhcmFtcyA9IGZ1bmN0aW9uICh2dWVJZCkge1xyXG4gICAgY29uc3QgaGFzID0gY2VudGVyW3Z1ZUlkXTtcclxuICAgIGlmICghaGFzKSB7XHJcbiAgICAgIHBhcmVudHNbdnVlSWRdID0gdGhpcztcclxuICAgICAgdGhpcy4kb24oJ2hvb2s6ZGVzdHJveWVkJywgKCkgPT4ge1xyXG4gICAgICAgIGRlbGV0ZSBwYXJlbnRzW3Z1ZUlkXTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaGFzXHJcbiAgfTtcclxuXHJcbiAgVnVlLnByb3RvdHlwZS4kZ2V0U2NvcGVkU2xvdHNQYXJhbXMgPSBmdW5jdGlvbiAodnVlSWQsIG5hbWUsIGtleSkge1xyXG4gICAgY29uc3QgZGF0YSA9IGNlbnRlclt2dWVJZF07XHJcbiAgICBpZiAoZGF0YSkge1xyXG4gICAgICBjb25zdCBvYmplY3QgPSBkYXRhW25hbWVdIHx8IHt9O1xyXG4gICAgICByZXR1cm4ga2V5ID8gb2JqZWN0W2tleV0gOiBvYmplY3RcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBhcmVudHNbdnVlSWRdID0gdGhpcztcclxuICAgICAgdGhpcy4kb24oJ2hvb2s6ZGVzdHJveWVkJywgKCkgPT4ge1xyXG4gICAgICAgIGRlbGV0ZSBwYXJlbnRzW3Z1ZUlkXTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgVnVlLnByb3RvdHlwZS4kc2V0U2NvcGVkU2xvdHNQYXJhbXMgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcclxuICAgIGNvbnN0IHZ1ZUlkcyA9IHRoaXMuJG9wdGlvbnMucHJvcHNEYXRhLnZ1ZUlkO1xyXG4gICAgaWYgKHZ1ZUlkcykge1xyXG4gICAgICBjb25zdCB2dWVJZCA9IHZ1ZUlkcy5zcGxpdCgnLCcpWzBdO1xyXG4gICAgICBjb25zdCBvYmplY3QgPSBjZW50ZXJbdnVlSWRdID0gY2VudGVyW3Z1ZUlkXSB8fCB7fTtcclxuICAgICAgb2JqZWN0W25hbWVdID0gdmFsdWU7XHJcbiAgICAgIGlmIChwYXJlbnRzW3Z1ZUlkXSkge1xyXG4gICAgICAgIHBhcmVudHNbdnVlSWRdLiRmb3JjZVVwZGF0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgVnVlLm1peGluKHtcclxuICAgIGRlc3Ryb3llZCAoKSB7XHJcbiAgICAgIGNvbnN0IHByb3BzRGF0YSA9IHRoaXMuJG9wdGlvbnMucHJvcHNEYXRhO1xyXG4gICAgICBjb25zdCB2dWVJZCA9IHByb3BzRGF0YSAmJiBwcm9wc0RhdGEudnVlSWQ7XHJcbiAgICAgIGlmICh2dWVJZCkge1xyXG4gICAgICAgIGRlbGV0ZSBjZW50ZXJbdnVlSWRdO1xyXG4gICAgICAgIGRlbGV0ZSBwYXJlbnRzW3Z1ZUlkXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUJhc2VBcHAgKHZtLCB7XHJcbiAgbW9ja3MsXHJcbiAgaW5pdFJlZnNcclxufSkge1xyXG4gIGluaXRFdmVudENoYW5uZWwoKTtcclxuICB7XHJcbiAgICBpbml0U2NvcGVkU2xvdHNQYXJhbXMoKTtcclxuICB9XHJcbiAgaWYgKHZtLiRvcHRpb25zLnN0b3JlKSB7XHJcbiAgICBWdWUucHJvdG90eXBlLiRzdG9yZSA9IHZtLiRvcHRpb25zLnN0b3JlO1xyXG4gIH1cclxuICB1bmlJZE1peGluKFZ1ZSk7XHJcblxyXG4gIFZ1ZS5wcm90b3R5cGUubXBIb3N0ID0gXCJtcC1qZFwiO1xyXG5cclxuICBWdWUubWl4aW4oe1xyXG4gICAgYmVmb3JlQ3JlYXRlICgpIHtcclxuICAgICAgaWYgKCF0aGlzLiRvcHRpb25zLm1wVHlwZSkge1xyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLm1wVHlwZSA9IHRoaXMuJG9wdGlvbnMubXBUeXBlO1xyXG5cclxuICAgICAgdGhpcy4kbXAgPSB7XHJcbiAgICAgICAgZGF0YToge30sXHJcbiAgICAgICAgW3RoaXMubXBUeXBlXTogdGhpcy4kb3B0aW9ucy5tcEluc3RhbmNlXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLiRzY29wZSA9IHRoaXMuJG9wdGlvbnMubXBJbnN0YW5jZTtcclxuXHJcbiAgICAgIGRlbGV0ZSB0aGlzLiRvcHRpb25zLm1wVHlwZTtcclxuICAgICAgZGVsZXRlIHRoaXMuJG9wdGlvbnMubXBJbnN0YW5jZTtcclxuICAgICAgaWYgKHRoaXMubXBUeXBlID09PSAncGFnZScgJiYgdHlwZW9mIGdldEFwcCA9PT0gJ2Z1bmN0aW9uJykgeyAvLyBoYWNrIHZ1ZS1pMThuXHJcbiAgICAgICAgY29uc3QgYXBwID0gZ2V0QXBwKCk7XHJcbiAgICAgICAgaWYgKGFwcC4kdm0gJiYgYXBwLiR2bS4kaTE4bikge1xyXG4gICAgICAgICAgdGhpcy5faTE4biA9IGFwcC4kdm0uJGkxOG47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLm1wVHlwZSAhPT0gJ2FwcCcpIHtcclxuICAgICAgICBpbml0UmVmcyh0aGlzKTtcclxuICAgICAgICBpbml0TW9ja3ModGhpcywgbW9ja3MpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IGFwcE9wdGlvbnMgPSB7XHJcbiAgICBvbkxhdW5jaCAoYXJncykge1xyXG4gICAgICBpZiAodGhpcy4kdm0pIHsgLy8g5bey57uP5Yid5aeL5YyW6L+H5LqG77yM5Li76KaB5piv5Li65LqG55m+5bqm77yM55m+5bqmIG9uU2hvdyDlnKggb25MYXVuY2gg5LmL5YmNXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuJHZtID0gdm07XHJcblxyXG4gICAgICB0aGlzLiR2bS4kbXAgPSB7XHJcbiAgICAgICAgYXBwOiB0aGlzXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLiR2bS4kc2NvcGUgPSB0aGlzO1xyXG4gICAgICAvLyB2bSDkuIrkuZ/mjILovb0gZ2xvYmFsRGF0YVxyXG4gICAgICB0aGlzLiR2bS5nbG9iYWxEYXRhID0gdGhpcy5nbG9iYWxEYXRhO1xyXG5cclxuICAgICAgdGhpcy4kdm0uX2lzTW91bnRlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuJHZtLl9fY2FsbF9ob29rKCdtb3VudGVkJywgYXJncyk7XHJcblxyXG4gICAgICB0aGlzLiR2bS5fX2NhbGxfaG9vaygnb25MYXVuY2gnLCBhcmdzKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICAvLyDlhbzlrrnml6fniYjmnKwgZ2xvYmFsRGF0YVxyXG4gIGFwcE9wdGlvbnMuZ2xvYmFsRGF0YSA9IHZtLiRvcHRpb25zLmdsb2JhbERhdGEgfHwge307XHJcbiAgLy8g5bCGIG1ldGhvZHMg5Lit55qE5pa55rOV5oyC5ZyoIGdldEFwcCgpIOS4rVxyXG4gIGNvbnN0IG1ldGhvZHMgPSB2bS4kb3B0aW9ucy5tZXRob2RzO1xyXG4gIGlmIChtZXRob2RzKSB7XHJcbiAgICBPYmplY3Qua2V5cyhtZXRob2RzKS5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgICBhcHBPcHRpb25zW25hbWVdID0gbWV0aG9kc1tuYW1lXTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5pdEFwcExvY2FsZShWdWUsIHZtLCBub3JtYWxpemVMb2NhbGUoamQuZ2V0U3lzdGVtSW5mb1N5bmMoKS5sYW5ndWFnZSkgfHwgTE9DQUxFX0VOKTtcclxuXHJcbiAgaW5pdEhvb2tzKGFwcE9wdGlvbnMsIGhvb2tzKTtcclxuICBpbml0VW5rbm93bkhvb2tzKGFwcE9wdGlvbnMsIHZtLiRvcHRpb25zKTtcclxuXHJcbiAgcmV0dXJuIGFwcE9wdGlvbnNcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VBcHAgKHZtKSB7XHJcbiAgcmV0dXJuIHBhcnNlQmFzZUFwcCh2bSwge1xyXG4gICAgbW9ja3MsXHJcbiAgICBpbml0UmVmc1xyXG4gIH0pXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlQXBwJDEgKHZtKSB7XHJcbiAgcmV0dXJuIHBhcnNlQXBwKHZtKVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVBcHAgKHZtKSB7XHJcbiAgQXBwKHBhcnNlQXBwJDEodm0pKTtcclxuICByZXR1cm4gdm1cclxufVxyXG5cclxuY29uc3QgZW5jb2RlUmVzZXJ2ZVJFID0gL1shJygpKl0vZztcclxuY29uc3QgZW5jb2RlUmVzZXJ2ZVJlcGxhY2VyID0gYyA9PiAnJScgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpO1xyXG5jb25zdCBjb21tYVJFID0gLyUyQy9nO1xyXG5cclxuLy8gZml4ZWQgZW5jb2RlVVJJQ29tcG9uZW50IHdoaWNoIGlzIG1vcmUgY29uZm9ybWFudCB0byBSRkMzOTg2OlxyXG4vLyAtIGVzY2FwZXMgWyEnKCkqXVxyXG4vLyAtIHByZXNlcnZlIGNvbW1hc1xyXG5jb25zdCBlbmNvZGUgPSBzdHIgPT4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cilcclxuICAucmVwbGFjZShlbmNvZGVSZXNlcnZlUkUsIGVuY29kZVJlc2VydmVSZXBsYWNlcilcclxuICAucmVwbGFjZShjb21tYVJFLCAnLCcpO1xyXG5cclxuZnVuY3Rpb24gc3RyaW5naWZ5UXVlcnkgKG9iaiwgZW5jb2RlU3RyID0gZW5jb2RlKSB7XHJcbiAgY29uc3QgcmVzID0gb2JqID8gT2JqZWN0LmtleXMob2JqKS5tYXAoa2V5ID0+IHtcclxuICAgIGNvbnN0IHZhbCA9IG9ialtrZXldO1xyXG5cclxuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gJydcclxuICAgIH1cclxuXHJcbiAgICBpZiAodmFsID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBlbmNvZGVTdHIoa2V5KVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gW107XHJcbiAgICAgIHZhbC5mb3JFYWNoKHZhbDIgPT4ge1xyXG4gICAgICAgIGlmICh2YWwyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsMiA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgcmVzdWx0LnB1c2goZW5jb2RlU3RyKGtleSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXN1bHQucHVzaChlbmNvZGVTdHIoa2V5KSArICc9JyArIGVuY29kZVN0cih2YWwyKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcmJylcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZW5jb2RlU3RyKGtleSkgKyAnPScgKyBlbmNvZGVTdHIodmFsKVxyXG4gIH0pLmZpbHRlcih4ID0+IHgubGVuZ3RoID4gMCkuam9pbignJicpIDogbnVsbDtcclxuICByZXR1cm4gcmVzID8gYD8ke3Jlc31gIDogJydcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VCYXNlQ29tcG9uZW50ICh2dWVDb21wb25lbnRPcHRpb25zLCB7XHJcbiAgaXNQYWdlLFxyXG4gIGluaXRSZWxhdGlvblxyXG59ID0ge30sIG5lZWRWdWVPcHRpb25zKSB7XHJcbiAgY29uc3QgW1Z1ZUNvbXBvbmVudCwgdnVlT3B0aW9uc10gPSBpbml0VnVlQ29tcG9uZW50KFZ1ZSwgdnVlQ29tcG9uZW50T3B0aW9ucyk7XHJcblxyXG4gIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICBtdWx0aXBsZVNsb3RzOiB0cnVlLFxyXG4gICAgYWRkR2xvYmFsQ2xhc3M6IHRydWUsXHJcbiAgICAuLi4odnVlT3B0aW9ucy5vcHRpb25zIHx8IHt9KVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGNvbXBvbmVudE9wdGlvbnMgPSB7XHJcbiAgICBvcHRpb25zLFxyXG4gICAgZGF0YTogaW5pdERhdGEodnVlT3B0aW9ucywgVnVlLnByb3RvdHlwZSksXHJcbiAgICBiZWhhdmlvcnM6IGluaXRCZWhhdmlvcnModnVlT3B0aW9ucywgaW5pdEJlaGF2aW9yKSxcclxuICAgIHByb3BlcnRpZXM6IGluaXRQcm9wZXJ0aWVzKHZ1ZU9wdGlvbnMucHJvcHMsIGZhbHNlLCB2dWVPcHRpb25zLl9fZmlsZSksXHJcbiAgICBsaWZldGltZXM6IHtcclxuICAgICAgYXR0YWNoZWQgKCkge1xyXG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLnByb3BlcnRpZXM7XHJcblxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICBtcFR5cGU6IGlzUGFnZS5jYWxsKHRoaXMpID8gJ3BhZ2UnIDogJ2NvbXBvbmVudCcsXHJcbiAgICAgICAgICBtcEluc3RhbmNlOiB0aGlzLFxyXG4gICAgICAgICAgcHJvcHNEYXRhOiBwcm9wZXJ0aWVzXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaW5pdFZ1ZUlkcyhwcm9wZXJ0aWVzLnZ1ZUlkLCB0aGlzKTtcclxuXHJcbiAgICAgICAgLy8g5aSE55CG54i25a2Q5YWz57O7XHJcbiAgICAgICAgaW5pdFJlbGF0aW9uLmNhbGwodGhpcywge1xyXG4gICAgICAgICAgdnVlUGlkOiB0aGlzLl8kdnVlUGlkLFxyXG4gICAgICAgICAgdnVlT3B0aW9uczogb3B0aW9uc1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyDliJ3lp4vljJYgdnVlIOWunuS+i1xyXG4gICAgICAgIHRoaXMuJHZtID0gbmV3IFZ1ZUNvbXBvbmVudChvcHRpb25zKTtcclxuXHJcbiAgICAgICAgLy8g5aSE55CGJHNsb3RzLCRzY29wZWRTbG90c++8iOaaguS4jeaUr+aMgeWKqOaAgeWPmOWMliRzbG90c++8iVxyXG4gICAgICAgIGluaXRTbG90cyh0aGlzLiR2bSwgcHJvcGVydGllcy52dWVTbG90cyk7XHJcblxyXG4gICAgICAgIC8vIOinpuWPkemmluasoSBzZXREYXRhXHJcbiAgICAgICAgdGhpcy4kdm0uJG1vdW50KCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHJlYWR5ICgpIHtcclxuICAgICAgICAvLyDlvZPnu4Tku7YgcHJvcHMg6buY6K6k5YC85Li6IHRydWXvvIzliJ3lp4vljJbml7bkvKDlhaUgZmFsc2Ug5Lya5a+86Ie0IGNyZWF0ZWQscmVhZHkg6Kem5Y+RLCDkvYYgYXR0YWNoZWQg5LiN6Kem5Y+RXHJcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLndlaXhpbi5xcS5jb20vY29tbXVuaXR5L2RldmVsb3AvZG9jLzAwMDY2YWUyODQ0Y2MwZjhlYjg4M2UyYTU1NzgwMFxyXG4gICAgICAgIGlmICh0aGlzLiR2bSkge1xyXG4gICAgICAgICAgdGhpcy4kdm0uX2lzTW91bnRlZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLiR2bS5fX2NhbGxfaG9vaygnbW91bnRlZCcpO1xyXG4gICAgICAgICAgdGhpcy4kdm0uX19jYWxsX2hvb2soJ29uUmVhZHknKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGRldGFjaGVkICgpIHtcclxuICAgICAgICB0aGlzLiR2bSAmJiB0aGlzLiR2bS4kZGVzdHJveSgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgcGFnZUxpZmV0aW1lczoge1xyXG4gICAgICBzaG93IChhcmdzKSB7XHJcbiAgICAgICAgdGhpcy4kdm0gJiYgdGhpcy4kdm0uX19jYWxsX2hvb2soJ29uUGFnZVNob3cnLCBhcmdzKTtcclxuICAgICAgfSxcclxuICAgICAgaGlkZSAoKSB7XHJcbiAgICAgICAgdGhpcy4kdm0gJiYgdGhpcy4kdm0uX19jYWxsX2hvb2soJ29uUGFnZUhpZGUnKTtcclxuICAgICAgfSxcclxuICAgICAgcmVzaXplIChzaXplKSB7XHJcbiAgICAgICAgdGhpcy4kdm0gJiYgdGhpcy4kdm0uX19jYWxsX2hvb2soJ29uUGFnZVJlc2l6ZScsIHNpemUpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgbWV0aG9kczoge1xyXG4gICAgICBfX2w6IGhhbmRsZUxpbmssXHJcbiAgICAgIF9fZTogaGFuZGxlRXZlbnRcclxuICAgIH1cclxuICB9O1xyXG4gIC8vIGV4dGVybmFsQ2xhc3Nlc1xyXG4gIGlmICh2dWVPcHRpb25zLmV4dGVybmFsQ2xhc3Nlcykge1xyXG4gICAgY29tcG9uZW50T3B0aW9ucy5leHRlcm5hbENsYXNzZXMgPSB2dWVPcHRpb25zLmV4dGVybmFsQ2xhc3NlcztcclxuICB9XHJcblxyXG4gIGlmIChBcnJheS5pc0FycmF5KHZ1ZU9wdGlvbnMud3hzQ2FsbE1ldGhvZHMpKSB7XHJcbiAgICB2dWVPcHRpb25zLnd4c0NhbGxNZXRob2RzLmZvckVhY2goY2FsbE1ldGhvZCA9PiB7XHJcbiAgICAgIGNvbXBvbmVudE9wdGlvbnMubWV0aG9kc1tjYWxsTWV0aG9kXSA9IGZ1bmN0aW9uIChhcmdzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuJHZtW2NhbGxNZXRob2RdKGFyZ3MpXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGlmIChuZWVkVnVlT3B0aW9ucykge1xyXG4gICAgcmV0dXJuIFtjb21wb25lbnRPcHRpb25zLCB2dWVPcHRpb25zLCBWdWVDb21wb25lbnRdXHJcbiAgfVxyXG4gIGlmIChpc1BhZ2UpIHtcclxuICAgIHJldHVybiBjb21wb25lbnRPcHRpb25zXHJcbiAgfVxyXG4gIHJldHVybiBbY29tcG9uZW50T3B0aW9ucywgVnVlQ29tcG9uZW50XVxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUNvbXBvbmVudCAodnVlQ29tcG9uZW50T3B0aW9ucywgbmVlZFZ1ZU9wdGlvbnMpIHtcclxuICByZXR1cm4gcGFyc2VCYXNlQ29tcG9uZW50KHZ1ZUNvbXBvbmVudE9wdGlvbnMsIHtcclxuICAgIGlzUGFnZSxcclxuICAgIGluaXRSZWxhdGlvblxyXG4gIH0sIG5lZWRWdWVPcHRpb25zKVxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUNvbXBvbmVudCQxICh2dWVDb21wb25lbnRPcHRpb25zLCBuZWVkVnVlT3B0aW9ucykge1xyXG4gIGNvbnN0IFtjb21wb25lbnRPcHRpb25zLCB2dWVPcHRpb25zXSA9IHBhcnNlQ29tcG9uZW50KHZ1ZUNvbXBvbmVudE9wdGlvbnMsIHRydWUpO1xyXG4gIC8vIOS6rOS4nOWwj+eoi+W6jyBsaWZldGltZXMg5a2Y5Zyo5YW85a656Zeu6aKYXHJcbiAgY29uc3QgbGlmZXRpbWVzID0gY29tcG9uZW50T3B0aW9ucy5saWZldGltZXM7XHJcbiAgT2JqZWN0LmtleXMobGlmZXRpbWVzKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICBjb21wb25lbnRPcHRpb25zW2tleV0gPSBsaWZldGltZXNba2V5XTtcclxuICB9KTtcclxuICByZXR1cm4gbmVlZFZ1ZU9wdGlvbnMgPyBbY29tcG9uZW50T3B0aW9ucywgdnVlT3B0aW9uc10gOiBjb21wb25lbnRPcHRpb25zXHJcbn1cclxuXHJcbmNvbnN0IGhvb2tzJDEgPSBbXHJcbiAgJ29uU2hvdycsXHJcbiAgJ29uSGlkZScsXHJcbiAgJ29uVW5sb2FkJ1xyXG5dO1xyXG5cclxuaG9va3MkMS5wdXNoKC4uLlBBR0VfRVZFTlRfSE9PS1MpO1xyXG5cclxuZnVuY3Rpb24gcGFyc2VCYXNlUGFnZSAodnVlUGFnZU9wdGlvbnMpIHtcclxuICBjb25zdCBbcGFnZU9wdGlvbnMsIHZ1ZU9wdGlvbnNdID0gcGFyc2VDb21wb25lbnQkMSh2dWVQYWdlT3B0aW9ucywgdHJ1ZSk7XHJcblxyXG4gIGluaXRIb29rcyhwYWdlT3B0aW9ucy5tZXRob2RzLCBob29rcyQxLCB2dWVPcHRpb25zKTtcclxuXHJcbiAgcGFnZU9wdGlvbnMubWV0aG9kcy5vbkxvYWQgPSBmdW5jdGlvbiAocXVlcnkpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IHF1ZXJ5O1xyXG4gICAgY29uc3QgY29weVF1ZXJ5ID0gT2JqZWN0LmFzc2lnbih7fSwgcXVlcnkpO1xyXG4gICAgZGVsZXRlIGNvcHlRdWVyeS5fX2lkX187XHJcbiAgICB0aGlzLiRwYWdlID0ge1xyXG4gICAgICBmdWxsUGF0aDogJy8nICsgKHRoaXMucm91dGUgfHwgdGhpcy5pcykgKyBzdHJpbmdpZnlRdWVyeShjb3B5UXVlcnkpXHJcbiAgICB9O1xyXG4gICAgdGhpcy4kdm0uJG1wLnF1ZXJ5ID0gcXVlcnk7IC8vIOWFvOWuuSBtcHZ1ZVxyXG4gICAgdGhpcy4kdm0uX19jYWxsX2hvb2soJ29uTG9hZCcsIHF1ZXJ5KTtcclxuICB9O1xyXG4gIHtcclxuICAgIGluaXRVbmtub3duSG9va3MocGFnZU9wdGlvbnMubWV0aG9kcywgdnVlUGFnZU9wdGlvbnMsIFsnb25SZWFkeSddKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBwYWdlT3B0aW9uc1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZVBhZ2UgKHZ1ZVBhZ2VPcHRpb25zKSB7XHJcbiAgcmV0dXJuIHBhcnNlQmFzZVBhZ2UodnVlUGFnZU9wdGlvbnMpXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlUGFnZSQxICh2dWVQYWdlT3B0aW9ucykge1xyXG4gIHJldHVybiBwYXJzZVBhZ2UodnVlUGFnZU9wdGlvbnMpXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZVBhZ2UgKHZ1ZVBhZ2VPcHRpb25zKSB7XHJcbiAge1xyXG4gICAgcmV0dXJuIENvbXBvbmVudChwYXJzZVBhZ2UkMSh2dWVQYWdlT3B0aW9ucykpXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVDb21wb25lbnQgKHZ1ZU9wdGlvbnMpIHtcclxuICB7XHJcbiAgICByZXR1cm4gQ29tcG9uZW50KHBhcnNlQ29tcG9uZW50JDEodnVlT3B0aW9ucykpXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVTdWJwYWNrYWdlQXBwICh2bSkge1xyXG4gIGNvbnN0IGFwcE9wdGlvbnMgPSBwYXJzZUFwcCQxKHZtKTtcclxuICBjb25zdCBhcHAgPSBnZXRBcHAoe1xyXG4gICAgYWxsb3dEZWZhdWx0OiB0cnVlXHJcbiAgfSk7XHJcbiAgdm0uJHNjb3BlID0gYXBwO1xyXG4gIGNvbnN0IGdsb2JhbERhdGEgPSBhcHAuZ2xvYmFsRGF0YTtcclxuICBpZiAoZ2xvYmFsRGF0YSkge1xyXG4gICAgT2JqZWN0LmtleXMoYXBwT3B0aW9ucy5nbG9iYWxEYXRhKS5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgICBpZiAoIWhhc093bihnbG9iYWxEYXRhLCBuYW1lKSkge1xyXG4gICAgICAgIGdsb2JhbERhdGFbbmFtZV0gPSBhcHBPcHRpb25zLmdsb2JhbERhdGFbbmFtZV07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBPYmplY3Qua2V5cyhhcHBPcHRpb25zKS5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgaWYgKCFoYXNPd24oYXBwLCBuYW1lKSkge1xyXG4gICAgICBhcHBbbmFtZV0gPSBhcHBPcHRpb25zW25hbWVdO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIGlmIChpc0ZuKGFwcE9wdGlvbnMub25TaG93KSAmJiBqZC5vbkFwcFNob3cpIHtcclxuICAgIGpkLm9uQXBwU2hvdygoLi4uYXJncykgPT4ge1xyXG4gICAgICB2bS5fX2NhbGxfaG9vaygnb25TaG93JywgYXJncyk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgaWYgKGlzRm4oYXBwT3B0aW9ucy5vbkhpZGUpICYmIGpkLm9uQXBwSGlkZSkge1xyXG4gICAgamQub25BcHBIaWRlKCguLi5hcmdzKSA9PiB7XHJcbiAgICAgIHZtLl9fY2FsbF9ob29rKCdvbkhpZGUnLCBhcmdzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBpZiAoaXNGbihhcHBPcHRpb25zLm9uTGF1bmNoKSkge1xyXG4gICAgY29uc3QgYXJncyA9IGpkLmdldExhdW5jaE9wdGlvbnNTeW5jICYmIGpkLmdldExhdW5jaE9wdGlvbnNTeW5jKCk7XHJcbiAgICB2bS5fX2NhbGxfaG9vaygnb25MYXVuY2gnLCBhcmdzKTtcclxuICB9XHJcbiAgcmV0dXJuIHZtXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZVBsdWdpbiAodm0pIHtcclxuICBjb25zdCBhcHBPcHRpb25zID0gcGFyc2VBcHAkMSh2bSk7XHJcbiAgaWYgKGlzRm4oYXBwT3B0aW9ucy5vblNob3cpICYmIGpkLm9uQXBwU2hvdykge1xyXG4gICAgamQub25BcHBTaG93KCguLi5hcmdzKSA9PiB7XHJcbiAgICAgIHZtLl9fY2FsbF9ob29rKCdvblNob3cnLCBhcmdzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBpZiAoaXNGbihhcHBPcHRpb25zLm9uSGlkZSkgJiYgamQub25BcHBIaWRlKSB7XHJcbiAgICBqZC5vbkFwcEhpZGUoKC4uLmFyZ3MpID0+IHtcclxuICAgICAgdm0uX19jYWxsX2hvb2soJ29uSGlkZScsIGFyZ3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGlmIChpc0ZuKGFwcE9wdGlvbnMub25MYXVuY2gpKSB7XHJcbiAgICBjb25zdCBhcmdzID0gamQuZ2V0TGF1bmNoT3B0aW9uc1N5bmMgJiYgamQuZ2V0TGF1bmNoT3B0aW9uc1N5bmMoKTtcclxuICAgIHZtLl9fY2FsbF9ob29rKCdvbkxhdW5jaCcsIGFyZ3MpO1xyXG4gIH1cclxuICByZXR1cm4gdm1cclxufVxyXG5cclxudG9kb3MuZm9yRWFjaCh0b2RvQXBpID0+IHtcclxuICBwcm90b2NvbHNbdG9kb0FwaV0gPSBmYWxzZTtcclxufSk7XHJcblxyXG5jYW5JVXNlcy5mb3JFYWNoKGNhbklVc2VBcGkgPT4ge1xyXG4gIGNvbnN0IGFwaU5hbWUgPSBwcm90b2NvbHNbY2FuSVVzZUFwaV0gJiYgcHJvdG9jb2xzW2NhbklVc2VBcGldLm5hbWUgPyBwcm90b2NvbHNbY2FuSVVzZUFwaV0ubmFtZVxyXG4gICAgOiBjYW5JVXNlQXBpO1xyXG4gIGlmICghamQuY2FuSVVzZShhcGlOYW1lKSkge1xyXG4gICAgcHJvdG9jb2xzW2NhbklVc2VBcGldID0gZmFsc2U7XHJcbiAgfVxyXG59KTtcclxuXHJcbmxldCB1bmkgPSB7fTtcclxuXHJcbmlmICh0eXBlb2YgUHJveHkgIT09ICd1bmRlZmluZWQnICYmIFwibXAtamRcIiAhPT0gJ2FwcC1wbHVzJykge1xyXG4gIHVuaSA9IG5ldyBQcm94eSh7fSwge1xyXG4gICAgZ2V0ICh0YXJnZXQsIG5hbWUpIHtcclxuICAgICAgaWYgKGhhc093bih0YXJnZXQsIG5hbWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRhcmdldFtuYW1lXVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChiYXNlQXBpW25hbWVdKSB7XHJcbiAgICAgICAgcmV0dXJuIGJhc2VBcGlbbmFtZV1cclxuICAgICAgfVxyXG4gICAgICBpZiAoYXBpW25hbWVdKSB7XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2lmeShuYW1lLCBhcGlbbmFtZV0pXHJcbiAgICAgIH1cclxuICAgICAge1xyXG4gICAgICAgIGlmIChleHRyYUFwaVtuYW1lXSkge1xyXG4gICAgICAgICAgcmV0dXJuIHByb21pc2lmeShuYW1lLCBleHRyYUFwaVtuYW1lXSlcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRvZG9BcGlzW25hbWVdKSB7XHJcbiAgICAgICAgICByZXR1cm4gcHJvbWlzaWZ5KG5hbWUsIHRvZG9BcGlzW25hbWVdKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoZXZlbnRBcGlbbmFtZV0pIHtcclxuICAgICAgICByZXR1cm4gZXZlbnRBcGlbbmFtZV1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcHJvbWlzaWZ5KG5hbWUsIHdyYXBwZXIobmFtZSwgamRbbmFtZV0pKVxyXG4gICAgfSxcclxuICAgIHNldCAodGFyZ2V0LCBuYW1lLCB2YWx1ZSkge1xyXG4gICAgICB0YXJnZXRbbmFtZV0gPSB2YWx1ZTtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuICB9KTtcclxufSBlbHNlIHtcclxuICBPYmplY3Qua2V5cyhiYXNlQXBpKS5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgdW5pW25hbWVdID0gYmFzZUFwaVtuYW1lXTtcclxuICB9KTtcclxuXHJcbiAge1xyXG4gICAgT2JqZWN0LmtleXModG9kb0FwaXMpLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICAgIHVuaVtuYW1lXSA9IHByb21pc2lmeShuYW1lLCB0b2RvQXBpc1tuYW1lXSk7XHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5rZXlzKGV4dHJhQXBpKS5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgICB1bmlbbmFtZV0gPSBwcm9taXNpZnkobmFtZSwgdG9kb0FwaXNbbmFtZV0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBPYmplY3Qua2V5cyhldmVudEFwaSkuZm9yRWFjaChuYW1lID0+IHtcclxuICAgIHVuaVtuYW1lXSA9IGV2ZW50QXBpW25hbWVdO1xyXG4gIH0pO1xyXG5cclxuICBPYmplY3Qua2V5cyhhcGkpLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICB1bmlbbmFtZV0gPSBwcm9taXNpZnkobmFtZSwgYXBpW25hbWVdKTtcclxuICB9KTtcclxuXHJcbiAgT2JqZWN0LmtleXMoamQpLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICBpZiAoaGFzT3duKGpkLCBuYW1lKSB8fCBoYXNPd24ocHJvdG9jb2xzLCBuYW1lKSkge1xyXG4gICAgICB1bmlbbmFtZV0gPSBwcm9taXNpZnkobmFtZSwgd3JhcHBlcihuYW1lLCBqZFtuYW1lXSkpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5qZC5jcmVhdGVBcHAgPSBjcmVhdGVBcHA7XHJcbmpkLmNyZWF0ZVBhZ2UgPSBjcmVhdGVQYWdlO1xyXG5qZC5jcmVhdGVDb21wb25lbnQgPSBjcmVhdGVDb21wb25lbnQ7XHJcbmpkLmNyZWF0ZVN1YnBhY2thZ2VBcHAgPSBjcmVhdGVTdWJwYWNrYWdlQXBwO1xyXG5qZC5jcmVhdGVQbHVnaW4gPSBjcmVhdGVQbHVnaW47XHJcblxyXG52YXIgdW5pJDEgPSB1bmk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCB1bmkkMTtcclxuZXhwb3J0IHsgY3JlYXRlQXBwLCBjcmVhdGVDb21wb25lbnQsIGNyZWF0ZVBhZ2UsIGNyZWF0ZVBsdWdpbiwgY3JlYXRlU3VicGFja2FnZUFwcCB9O1xyXG4iLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCJmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikge1xuICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDoge1xuICAgIFwiZGVmYXVsdFwiOiBvYmpcbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBhcnJheVdpdGhIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aEhvbGVzLmpzXCIpO1xudmFyIGl0ZXJhYmxlVG9BcnJheUxpbWl0ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5TGltaXQuanNcIik7XG52YXIgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgPSByZXF1aXJlKFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiKTtcbnZhciBub25JdGVyYWJsZVJlc3QgPSByZXF1aXJlKFwiLi9ub25JdGVyYWJsZVJlc3QuanNcIik7XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIGFycmF5V2l0aEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfc2xpY2VkVG9BcnJheSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aEhvbGVzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2kgPSBudWxsID09IGFyciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKG51bGwgIT0gX2kpIHtcbiAgICB2YXIgX3MsXG4gICAgICBfZSxcbiAgICAgIF94LFxuICAgICAgX3IsXG4gICAgICBfYXJyID0gW10sXG4gICAgICBfbiA9ICEwLFxuICAgICAgX2QgPSAhMTtcbiAgICB0cnkge1xuICAgICAgaWYgKF94ID0gKF9pID0gX2kuY2FsbChhcnIpKS5uZXh0LCAwID09PSBpKSB7XG4gICAgICAgIGlmIChPYmplY3QoX2kpICE9PSBfaSkgcmV0dXJuO1xuICAgICAgICBfbiA9ICExO1xuICAgICAgfSBlbHNlIGZvciAoOyAhKF9uID0gKF9zID0gX3guY2FsbChfaSkpLmRvbmUpICYmIChfYXJyLnB1c2goX3MudmFsdWUpLCBfYXJyLmxlbmd0aCAhPT0gaSk7IF9uID0gITApIHtcbiAgICAgICAgO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2QgPSAhMCwgX2UgPSBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghX24gJiYgbnVsbCAhPSBfaVtcInJldHVyblwiXSAmJiAoX3IgPSBfaVtcInJldHVyblwiXSgpLCBPYmplY3QoX3IpICE9PSBfcikpIHJldHVybjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBfYXJyO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXlMaW1pdCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBhcnJheUxpa2VUb0FycmF5ID0gcmVxdWlyZShcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiKTtcbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIyW2ldID0gYXJyW2ldO1xuICB9XG4gIHJldHVybiBhcnIyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlMaWtlVG9BcnJheSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9ub25JdGVyYWJsZVJlc3QsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBfY2xhc3NDYWxsQ2hlY2ssIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoXCIuL3RvUHJvcGVydHlLZXkuanNcIik7XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCB0b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9jcmVhdGVDbGFzcywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIi4vdHlwZW9mLmpzXCIpW1wiZGVmYXVsdFwiXTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoXCIuL3RvUHJpbWl0aXZlLmpzXCIpO1xuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7XG4gIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShhcmcsIFwic3RyaW5nXCIpO1xuICByZXR1cm4gX3R5cGVvZihrZXkpID09PSBcInN5bWJvbFwiID8ga2V5IDogU3RyaW5nKGtleSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF90b1Byb3BlcnR5S2V5LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiAobW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cyksIF90eXBlb2Yob2JqKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIi4vdHlwZW9mLmpzXCIpW1wiZGVmYXVsdFwiXTtcbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZShpbnB1dCwgaGludCkge1xuICBpZiAoX3R5cGVvZihpbnB1dCkgIT09IFwib2JqZWN0XCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDtcbiAgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdO1xuICBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7XG4gICAgaWYgKF90eXBlb2YocmVzKSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlcztcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG4gIH1cbiAgcmV0dXJuIChoaW50ID09PSBcInN0cmluZ1wiID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF90b1ByaW1pdGl2ZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciB0b1Byb3BlcnR5S2V5ID0gcmVxdWlyZShcIi4vdG9Qcm9wZXJ0eUtleS5qc1wiKTtcbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAga2V5ID0gdG9Qcm9wZXJ0eUtleShrZXkpO1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfZGVmaW5lUHJvcGVydHksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiKTtcbnZhciBpc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSByZXF1aXJlKFwiLi9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QuanNcIik7XG5mdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgaWYgKGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfY29uc3RydWN0ID0gUmVmbGVjdC5jb25zdHJ1Y3QuYmluZCgpLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7XG4gIH0gZWxzZSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfY29uc3RydWN0ID0gZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gICAgICB2YXIgYSA9IFtudWxsXTtcbiAgICAgIGEucHVzaC5hcHBseShhLCBhcmdzKTtcbiAgICAgIHZhciBDb25zdHJ1Y3RvciA9IEZ1bmN0aW9uLmJpbmQuYXBwbHkoUGFyZW50LCBhKTtcbiAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBDb25zdHJ1Y3RvcigpO1xuICAgICAgaWYgKENsYXNzKSBzZXRQcm90b3R5cGVPZihpbnN0YW5jZSwgQ2xhc3MucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7XG4gIH1cbiAgcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2NvbnN0cnVjdCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7XG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9zZXRQcm90b3R5cGVPZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTtcbiAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBhcnJheVdpdGhvdXRIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aG91dEhvbGVzLmpzXCIpO1xudmFyIGl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2l0ZXJhYmxlVG9BcnJheS5qc1wiKTtcbnZhciB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCIpO1xudmFyIG5vbkl0ZXJhYmxlU3ByZWFkID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVTcHJlYWQuanNcIik7XG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gIHJldHVybiBhcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgbm9uSXRlcmFibGVTcHJlYWQoKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3RvQ29uc3VtYWJsZUFycmF5LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIGFycmF5TGlrZVRvQXJyYXkgPSByZXF1aXJlKFwiLi9hcnJheUxpa2VUb0FycmF5LmpzXCIpO1xuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShhcnIpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlXaXRob3V0SG9sZXMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlcltcIkBAaXRlcmF0b3JcIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfbm9uSXRlcmFibGVTcHJlYWQsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcclxuY29uc3QgaXNPYmplY3QgPSAodmFsKSA9PiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCc7XHJcbmNvbnN0IGRlZmF1bHREZWxpbWl0ZXJzID0gWyd7JywgJ30nXTtcclxuY2xhc3MgQmFzZUZvcm1hdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLl9jYWNoZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xyXG4gICAgfVxyXG4gICAgaW50ZXJwb2xhdGUobWVzc2FnZSwgdmFsdWVzLCBkZWxpbWl0ZXJzID0gZGVmYXVsdERlbGltaXRlcnMpIHtcclxuICAgICAgICBpZiAoIXZhbHVlcykge1xyXG4gICAgICAgICAgICByZXR1cm4gW21lc3NhZ2VdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdG9rZW5zID0gdGhpcy5fY2FjaGVzW21lc3NhZ2VdO1xyXG4gICAgICAgIGlmICghdG9rZW5zKSB7XHJcbiAgICAgICAgICAgIHRva2VucyA9IHBhcnNlKG1lc3NhZ2UsIGRlbGltaXRlcnMpO1xyXG4gICAgICAgICAgICB0aGlzLl9jYWNoZXNbbWVzc2FnZV0gPSB0b2tlbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb21waWxlKHRva2VucywgdmFsdWVzKTtcclxuICAgIH1cclxufVxyXG5jb25zdCBSRV9UT0tFTl9MSVNUX1ZBTFVFID0gL14oPzpcXGQpKy87XHJcbmNvbnN0IFJFX1RPS0VOX05BTUVEX1ZBTFVFID0gL14oPzpcXHcpKy87XHJcbmZ1bmN0aW9uIHBhcnNlKGZvcm1hdCwgW3N0YXJ0RGVsaW1pdGVyLCBlbmREZWxpbWl0ZXJdKSB7XHJcbiAgICBjb25zdCB0b2tlbnMgPSBbXTtcclxuICAgIGxldCBwb3NpdGlvbiA9IDA7XHJcbiAgICBsZXQgdGV4dCA9ICcnO1xyXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgZm9ybWF0Lmxlbmd0aCkge1xyXG4gICAgICAgIGxldCBjaGFyID0gZm9ybWF0W3Bvc2l0aW9uKytdO1xyXG4gICAgICAgIGlmIChjaGFyID09PSBzdGFydERlbGltaXRlcikge1xyXG4gICAgICAgICAgICBpZiAodGV4dCkge1xyXG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlOiB0ZXh0IH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRleHQgPSAnJztcclxuICAgICAgICAgICAgbGV0IHN1YiA9ICcnO1xyXG4gICAgICAgICAgICBjaGFyID0gZm9ybWF0W3Bvc2l0aW9uKytdO1xyXG4gICAgICAgICAgICB3aGlsZSAoY2hhciAhPT0gdW5kZWZpbmVkICYmIGNoYXIgIT09IGVuZERlbGltaXRlcikge1xyXG4gICAgICAgICAgICAgICAgc3ViICs9IGNoYXI7XHJcbiAgICAgICAgICAgICAgICBjaGFyID0gZm9ybWF0W3Bvc2l0aW9uKytdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQ2xvc2VkID0gY2hhciA9PT0gZW5kRGVsaW1pdGVyO1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gUkVfVE9LRU5fTElTVF9WQUxVRS50ZXN0KHN1YilcclxuICAgICAgICAgICAgICAgID8gJ2xpc3QnXHJcbiAgICAgICAgICAgICAgICA6IGlzQ2xvc2VkICYmIFJFX1RPS0VOX05BTUVEX1ZBTFVFLnRlc3Qoc3ViKVxyXG4gICAgICAgICAgICAgICAgICAgID8gJ25hbWVkJ1xyXG4gICAgICAgICAgICAgICAgICAgIDogJ3Vua25vd24nO1xyXG4gICAgICAgICAgICB0b2tlbnMucHVzaCh7IHZhbHVlOiBzdWIsIHR5cGUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vICBlbHNlIGlmIChjaGFyID09PSAnJScpIHtcclxuICAgICAgICAvLyAgIC8vIHdoZW4gZm91bmQgcmFpbHMgaTE4biBzeW50YXgsIHNraXAgdGV4dCBjYXB0dXJlXHJcbiAgICAgICAgLy8gICBpZiAoZm9ybWF0W3Bvc2l0aW9uXSAhPT0gJ3snKSB7XHJcbiAgICAgICAgLy8gICAgIHRleHQgKz0gY2hhclxyXG4gICAgICAgIC8vICAgfVxyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGV4dCArPSBjaGFyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHRleHQgJiYgdG9rZW5zLnB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlOiB0ZXh0IH0pO1xyXG4gICAgcmV0dXJuIHRva2VucztcclxufVxyXG5mdW5jdGlvbiBjb21waWxlKHRva2VucywgdmFsdWVzKSB7XHJcbiAgICBjb25zdCBjb21waWxlZCA9IFtdO1xyXG4gICAgbGV0IGluZGV4ID0gMDtcclxuICAgIGNvbnN0IG1vZGUgPSBpc0FycmF5KHZhbHVlcylcclxuICAgICAgICA/ICdsaXN0J1xyXG4gICAgICAgIDogaXNPYmplY3QodmFsdWVzKVxyXG4gICAgICAgICAgICA/ICduYW1lZCdcclxuICAgICAgICAgICAgOiAndW5rbm93bic7XHJcbiAgICBpZiAobW9kZSA9PT0gJ3Vua25vd24nKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbXBpbGVkO1xyXG4gICAgfVxyXG4gICAgd2hpbGUgKGluZGV4IDwgdG9rZW5zLmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2luZGV4XTtcclxuICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSAndGV4dCc6XHJcbiAgICAgICAgICAgICAgICBjb21waWxlZC5wdXNoKHRva2VuLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdsaXN0JzpcclxuICAgICAgICAgICAgICAgIGNvbXBpbGVkLnB1c2godmFsdWVzW3BhcnNlSW50KHRva2VuLnZhbHVlLCAxMCldKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICduYW1lZCc6XHJcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ25hbWVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBpbGVkLnB1c2godmFsdWVzW3Rva2VuLnZhbHVlXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFR5cGUgb2YgdG9rZW4gJyR7dG9rZW4udHlwZX0nIGFuZCBmb3JtYXQgb2YgdmFsdWUgJyR7bW9kZX0nIGRvbid0IG1hdGNoIWApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICd1bmtub3duJzpcclxuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBEZXRlY3QgJ3Vua25vd24nIHR5cGUgb2YgdG9rZW4hYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5kZXgrKztcclxuICAgIH1cclxuICAgIHJldHVybiBjb21waWxlZDtcclxufVxyXG5cclxuY29uc3QgTE9DQUxFX1pIX0hBTlMgPSAnemgtSGFucyc7XHJcbmNvbnN0IExPQ0FMRV9aSF9IQU5UID0gJ3poLUhhbnQnO1xyXG5jb25zdCBMT0NBTEVfRU4gPSAnZW4nO1xyXG5jb25zdCBMT0NBTEVfRlIgPSAnZnInO1xyXG5jb25zdCBMT0NBTEVfRVMgPSAnZXMnO1xyXG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XHJcbmNvbnN0IGhhc093biA9ICh2YWwsIGtleSkgPT4gaGFzT3duUHJvcGVydHkuY2FsbCh2YWwsIGtleSk7XHJcbmNvbnN0IGRlZmF1bHRGb3JtYXR0ZXIgPSBuZXcgQmFzZUZvcm1hdHRlcigpO1xyXG5mdW5jdGlvbiBpbmNsdWRlKHN0ciwgcGFydHMpIHtcclxuICAgIHJldHVybiAhIXBhcnRzLmZpbmQoKHBhcnQpID0+IHN0ci5pbmRleE9mKHBhcnQpICE9PSAtMSk7XHJcbn1cclxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsIHBhcnRzKSB7XHJcbiAgICByZXR1cm4gcGFydHMuZmluZCgocGFydCkgPT4gc3RyLmluZGV4T2YocGFydCkgPT09IDApO1xyXG59XHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZUxvY2FsZShsb2NhbGUsIG1lc3NhZ2VzKSB7XHJcbiAgICBpZiAoIWxvY2FsZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxvY2FsZSA9IGxvY2FsZS50cmltKCkucmVwbGFjZSgvXy9nLCAnLScpO1xyXG4gICAgaWYgKG1lc3NhZ2VzICYmIG1lc3NhZ2VzW2xvY2FsZV0pIHtcclxuICAgICAgICByZXR1cm4gbG9jYWxlO1xyXG4gICAgfVxyXG4gICAgbG9jYWxlID0gbG9jYWxlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAobG9jYWxlLmluZGV4T2YoJ3poJykgPT09IDApIHtcclxuICAgICAgICBpZiAobG9jYWxlLmluZGV4T2YoJy1oYW5zJykgPiAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gTE9DQUxFX1pIX0hBTlM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsb2NhbGUuaW5kZXhPZignLWhhbnQnKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBMT0NBTEVfWkhfSEFOVDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGluY2x1ZGUobG9jYWxlLCBbJy10dycsICctaGsnLCAnLW1vJywgJy1jaHQnXSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIExPQ0FMRV9aSF9IQU5UO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gTE9DQUxFX1pIX0hBTlM7XHJcbiAgICB9XHJcbiAgICBjb25zdCBsYW5nID0gc3RhcnRzV2l0aChsb2NhbGUsIFtMT0NBTEVfRU4sIExPQ0FMRV9GUiwgTE9DQUxFX0VTXSk7XHJcbiAgICBpZiAobGFuZykge1xyXG4gICAgICAgIHJldHVybiBsYW5nO1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIEkxOG4ge1xyXG4gICAgY29uc3RydWN0b3IoeyBsb2NhbGUsIGZhbGxiYWNrTG9jYWxlLCBtZXNzYWdlcywgd2F0Y2hlciwgZm9ybWF0ZXIsIH0pIHtcclxuICAgICAgICB0aGlzLmxvY2FsZSA9IExPQ0FMRV9FTjtcclxuICAgICAgICB0aGlzLmZhbGxiYWNrTG9jYWxlID0gTE9DQUxFX0VOO1xyXG4gICAgICAgIHRoaXMubWVzc2FnZSA9IHt9O1xyXG4gICAgICAgIHRoaXMubWVzc2FnZXMgPSB7fTtcclxuICAgICAgICB0aGlzLndhdGNoZXJzID0gW107XHJcbiAgICAgICAgaWYgKGZhbGxiYWNrTG9jYWxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmFsbGJhY2tMb2NhbGUgPSBmYWxsYmFja0xvY2FsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mb3JtYXRlciA9IGZvcm1hdGVyIHx8IGRlZmF1bHRGb3JtYXR0ZXI7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlcyA9IG1lc3NhZ2VzIHx8IHt9O1xyXG4gICAgICAgIHRoaXMuc2V0TG9jYWxlKGxvY2FsZSB8fCBMT0NBTEVfRU4pO1xyXG4gICAgICAgIGlmICh3YXRjaGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMud2F0Y2hMb2NhbGUod2F0Y2hlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2V0TG9jYWxlKGxvY2FsZSkge1xyXG4gICAgICAgIGNvbnN0IG9sZExvY2FsZSA9IHRoaXMubG9jYWxlO1xyXG4gICAgICAgIHRoaXMubG9jYWxlID0gbm9ybWFsaXplTG9jYWxlKGxvY2FsZSwgdGhpcy5tZXNzYWdlcykgfHwgdGhpcy5mYWxsYmFja0xvY2FsZTtcclxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZXNbdGhpcy5sb2NhbGVdKSB7XHJcbiAgICAgICAgICAgIC8vIOWPr+iDveWIneWni+WMluaXtuS4jeWtmOWcqFxyXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VzW3RoaXMubG9jYWxlXSA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzW3RoaXMubG9jYWxlXTtcclxuICAgICAgICAvLyDku4Xlj5HnlJ/lj5jljJbml7bvvIzpgJrnn6VcclxuICAgICAgICBpZiAob2xkTG9jYWxlICE9PSB0aGlzLmxvY2FsZSkge1xyXG4gICAgICAgICAgICB0aGlzLndhdGNoZXJzLmZvckVhY2goKHdhdGNoZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIHdhdGNoZXIodGhpcy5sb2NhbGUsIG9sZExvY2FsZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldExvY2FsZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGU7XHJcbiAgICB9XHJcbiAgICB3YXRjaExvY2FsZShmbikge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy53YXRjaGVycy5wdXNoKGZuKSAtIDE7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy53YXRjaGVycy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBhZGQobG9jYWxlLCBtZXNzYWdlLCBvdmVycmlkZSA9IHRydWUpIHtcclxuICAgICAgICBjb25zdCBjdXJNZXNzYWdlcyA9IHRoaXMubWVzc2FnZXNbbG9jYWxlXTtcclxuICAgICAgICBpZiAoY3VyTWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgaWYgKG92ZXJyaWRlKSB7XHJcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGN1ck1lc3NhZ2VzLCBtZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG1lc3NhZ2UpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghaGFzT3duKGN1ck1lc3NhZ2VzLCBrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ck1lc3NhZ2VzW2tleV0gPSBtZXNzYWdlW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXNbbG9jYWxlXSA9IG1lc3NhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZihtZXNzYWdlLCB2YWx1ZXMsIGRlbGltaXRlcnMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRlci5pbnRlcnBvbGF0ZShtZXNzYWdlLCB2YWx1ZXMsIGRlbGltaXRlcnMpLmpvaW4oJycpO1xyXG4gICAgfVxyXG4gICAgdChrZXksIGxvY2FsZSwgdmFsdWVzKSB7XHJcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2U7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBsb2NhbGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGxvY2FsZSA9IG5vcm1hbGl6ZUxvY2FsZShsb2NhbGUsIHRoaXMubWVzc2FnZXMpO1xyXG4gICAgICAgICAgICBsb2NhbGUgJiYgKG1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzW2xvY2FsZV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdmFsdWVzID0gbG9jYWxlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWhhc093bihtZXNzYWdlLCBrZXkpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ2Fubm90IHRyYW5zbGF0ZSB0aGUgdmFsdWUgb2Yga2V5cGF0aCAke2tleX0uIFVzZSB0aGUgdmFsdWUgb2Yga2V5cGF0aCBhcyBkZWZhdWx0LmApO1xyXG4gICAgICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRlci5pbnRlcnBvbGF0ZShtZXNzYWdlW2tleV0sIHZhbHVlcykuam9pbignJyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdhdGNoQXBwTG9jYWxlKGFwcFZtLCBpMThuKSB7XHJcbiAgICAvLyDpnIDopoHkv53or4Egd2F0Y2gg55qE6Kem5Y+R5Zyo57uE5Lu25riy5p+T5LmL5YmNXHJcbiAgICBpZiAoYXBwVm0uJHdhdGNoTG9jYWxlKSB7XHJcbiAgICAgICAgLy8gdnVlMlxyXG4gICAgICAgIGFwcFZtLiR3YXRjaExvY2FsZSgobmV3TG9jYWxlKSA9PiB7XHJcbiAgICAgICAgICAgIGkxOG4uc2V0TG9jYWxlKG5ld0xvY2FsZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBhcHBWbS4kd2F0Y2goKCkgPT4gYXBwVm0uJGxvY2FsZSwgKG5ld0xvY2FsZSkgPT4ge1xyXG4gICAgICAgICAgICBpMThuLnNldExvY2FsZShuZXdMb2NhbGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGdldERlZmF1bHRMb2NhbGUoKSB7XHJcbiAgICBpZiAodHlwZW9mIHVuaSAhPT0gJ3VuZGVmaW5lZCcgJiYgdW5pLmdldExvY2FsZSkge1xyXG4gICAgICAgIHJldHVybiB1bmkuZ2V0TG9jYWxlKCk7XHJcbiAgICB9XHJcbiAgICAvLyDlsI/nqIvluo/lubPlj7DvvIx1bmkg5ZKMIHVuaS1pMThuIOS6kuebuOW8leeUqO+8jOWvvOiHtOiuv+mXruS4jeWIsCB1bmnvvIzmlYXlnKggZ2xvYmFsIOS4iuaMguS6hiBnZXRMb2NhbGVcclxuICAgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwuZ2V0TG9jYWxlKSB7XHJcbiAgICAgICAgcmV0dXJuIGdsb2JhbC5nZXRMb2NhbGUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBMT0NBTEVfRU47XHJcbn1cclxuZnVuY3Rpb24gaW5pdFZ1ZUkxOG4obG9jYWxlLCBtZXNzYWdlcyA9IHt9LCBmYWxsYmFja0xvY2FsZSwgd2F0Y2hlcikge1xyXG4gICAgLy8g5YW85a655pen54mI5pys5YWl5Y+CXHJcbiAgICBpZiAodHlwZW9mIGxvY2FsZSAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICBbbG9jYWxlLCBtZXNzYWdlc10gPSBbXHJcbiAgICAgICAgICAgIG1lc3NhZ2VzLFxyXG4gICAgICAgICAgICBsb2NhbGUsXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgbG9jYWxlICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIC8vIOWboOS4uuWwj+eoi+W6j+W5s+WPsO+8jHVuaS1pMThuIOWSjCB1bmkg5LqS55u45byV55So77yM5a+86Ie05q2k5pe26K6/6ZeuIHVuaSDml7bvvIzkuLogdW5kZWZpbmVkXHJcbiAgICAgICAgbG9jYWxlID0gZ2V0RGVmYXVsdExvY2FsZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBmYWxsYmFja0xvY2FsZSAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICBmYWxsYmFja0xvY2FsZSA9XHJcbiAgICAgICAgICAgICh0eXBlb2YgX191bmlDb25maWcgIT09ICd1bmRlZmluZWQnICYmIF9fdW5pQ29uZmlnLmZhbGxiYWNrTG9jYWxlKSB8fFxyXG4gICAgICAgICAgICAgICAgTE9DQUxFX0VOO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaTE4biA9IG5ldyBJMThuKHtcclxuICAgICAgICBsb2NhbGUsXHJcbiAgICAgICAgZmFsbGJhY2tMb2NhbGUsXHJcbiAgICAgICAgbWVzc2FnZXMsXHJcbiAgICAgICAgd2F0Y2hlcixcclxuICAgIH0pO1xyXG4gICAgbGV0IHQgPSAoa2V5LCB2YWx1ZXMpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIGdldEFwcCAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAvLyBhcHAgdmlld1xyXG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1mdW5jLWFzc2lnbiAqL1xyXG4gICAgICAgICAgICB0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWVzKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaTE4bi50KGtleSwgdmFsdWVzKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBpc1dhdGNoZWRBcHBMb2NhbGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgdCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXBwVm0gPSBnZXRBcHAoKS4kdm07XHJcbiAgICAgICAgICAgICAgICAvLyDlj6/og70kdm3ov5jkuI3lrZjlnKjvvIzmr5TlpoLlnKjmlK/ku5jlrp3lsI/nqIvluo/kuK3vvIznu4Tku7blrprkuYnovoPml6nvvIzlnKhwcm9wc+eahGRlZmF1bHTph4zkvb/nlKjkuoZ0KCnlh73mlbDvvIjlpoJ1bmktZ29vZHMtbmF277yJ77yM5q2k5pe2YXBw6L+Y5pyq5Yid5aeL5YyWXHJcbiAgICAgICAgICAgICAgICAvLyBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAvLyBcdHR5cGU6IEFycmF5LFxyXG4gICAgICAgICAgICAgICAgLy8gXHRkZWZhdWx0ICgpIHtcclxuICAgICAgICAgICAgICAgIC8vIFx0XHRyZXR1cm4gW3tcclxuICAgICAgICAgICAgICAgIC8vIFx0XHRcdGljb246ICdzaG9wJyxcclxuICAgICAgICAgICAgICAgIC8vIFx0XHRcdHRleHQ6IHQoXCJ1bmktZ29vZHMtbmF2Lm9wdGlvbnMuc2hvcFwiKSxcclxuICAgICAgICAgICAgICAgIC8vIFx0XHR9LCB7XHJcbiAgICAgICAgICAgICAgICAvLyBcdFx0XHRpY29uOiAnY2FydCcsXHJcbiAgICAgICAgICAgICAgICAvLyBcdFx0XHR0ZXh0OiB0KFwidW5pLWdvb2RzLW5hdi5vcHRpb25zLmNhcnRcIilcclxuICAgICAgICAgICAgICAgIC8vIFx0XHR9XVxyXG4gICAgICAgICAgICAgICAgLy8gXHR9XHJcbiAgICAgICAgICAgICAgICAvLyB9LFxyXG4gICAgICAgICAgICAgICAgaWYgKGFwcFZtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g6Kem5Y+R5ZON5bqU5byPXHJcbiAgICAgICAgICAgICAgICAgICAgYXBwVm0uJGxvY2FsZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzV2F0Y2hlZEFwcExvY2FsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1dhdGNoZWRBcHBMb2NhbGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3YXRjaEFwcExvY2FsZShhcHBWbSwgaTE4bik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkxOG4udChrZXksIHZhbHVlcyk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0KGtleSwgdmFsdWVzKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGkxOG4sXHJcbiAgICAgICAgZihtZXNzYWdlLCB2YWx1ZXMsIGRlbGltaXRlcnMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGkxOG4uZihtZXNzYWdlLCB2YWx1ZXMsIGRlbGltaXRlcnMpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdChrZXksIHZhbHVlcykge1xyXG4gICAgICAgICAgICByZXR1cm4gdChrZXksIHZhbHVlcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBhZGQobG9jYWxlLCBtZXNzYWdlLCBvdmVycmlkZSA9IHRydWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGkxOG4uYWRkKGxvY2FsZSwgbWVzc2FnZSwgb3ZlcnJpZGUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2F0Y2goZm4pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGkxOG4ud2F0Y2hMb2NhbGUoZm4pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ2V0TG9jYWxlKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gaTE4bi5nZXRMb2NhbGUoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNldExvY2FsZShuZXdMb2NhbGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGkxOG4uc2V0TG9jYWxlKG5ld0xvY2FsZSk7XHJcbiAgICAgICAgfSxcclxuICAgIH07XHJcbn1cclxuXHJcbmNvbnN0IGlzU3RyaW5nID0gKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZyc7XHJcbmxldCBmb3JtYXRlcjtcclxuZnVuY3Rpb24gaGFzSTE4bkpzb24oanNvbk9iaiwgZGVsaW1pdGVycykge1xyXG4gICAgaWYgKCFmb3JtYXRlcikge1xyXG4gICAgICAgIGZvcm1hdGVyID0gbmV3IEJhc2VGb3JtYXR0ZXIoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB3YWxrSnNvbk9iaihqc29uT2JqLCAoanNvbk9iaiwga2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBqc29uT2JqW2tleV07XHJcbiAgICAgICAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xyXG4gICAgICAgICAgICBpZiAoaXNJMThuU3RyKHZhbHVlLCBkZWxpbWl0ZXJzKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBoYXNJMThuSnNvbih2YWx1ZSwgZGVsaW1pdGVycyk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn1cclxuZnVuY3Rpb24gcGFyc2VJMThuSnNvbihqc29uT2JqLCB2YWx1ZXMsIGRlbGltaXRlcnMpIHtcclxuICAgIGlmICghZm9ybWF0ZXIpIHtcclxuICAgICAgICBmb3JtYXRlciA9IG5ldyBCYXNlRm9ybWF0dGVyKCk7XHJcbiAgICB9XHJcbiAgICB3YWxrSnNvbk9iaihqc29uT2JqLCAoanNvbk9iaiwga2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBqc29uT2JqW2tleV07XHJcbiAgICAgICAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xyXG4gICAgICAgICAgICBpZiAoaXNJMThuU3RyKHZhbHVlLCBkZWxpbWl0ZXJzKSkge1xyXG4gICAgICAgICAgICAgICAganNvbk9ialtrZXldID0gY29tcGlsZVN0cih2YWx1ZSwgdmFsdWVzLCBkZWxpbWl0ZXJzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcGFyc2VJMThuSnNvbih2YWx1ZSwgdmFsdWVzLCBkZWxpbWl0ZXJzKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBqc29uT2JqO1xyXG59XHJcbmZ1bmN0aW9uIGNvbXBpbGVJMThuSnNvblN0cihqc29uU3RyLCB7IGxvY2FsZSwgbG9jYWxlcywgZGVsaW1pdGVycywgfSkge1xyXG4gICAgaWYgKCFpc0kxOG5TdHIoanNvblN0ciwgZGVsaW1pdGVycykpIHtcclxuICAgICAgICByZXR1cm4ganNvblN0cjtcclxuICAgIH1cclxuICAgIGlmICghZm9ybWF0ZXIpIHtcclxuICAgICAgICBmb3JtYXRlciA9IG5ldyBCYXNlRm9ybWF0dGVyKCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBsb2NhbGVWYWx1ZXMgPSBbXTtcclxuICAgIE9iamVjdC5rZXlzKGxvY2FsZXMpLmZvckVhY2goKG5hbWUpID0+IHtcclxuICAgICAgICBpZiAobmFtZSAhPT0gbG9jYWxlKSB7XHJcbiAgICAgICAgICAgIGxvY2FsZVZhbHVlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGxvY2FsZTogbmFtZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlczogbG9jYWxlc1tuYW1lXSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBsb2NhbGVWYWx1ZXMudW5zaGlmdCh7IGxvY2FsZSwgdmFsdWVzOiBsb2NhbGVzW2xvY2FsZV0gfSk7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShjb21waWxlSnNvbk9iaihKU09OLnBhcnNlKGpzb25TdHIpLCBsb2NhbGVWYWx1ZXMsIGRlbGltaXRlcnMpLCBudWxsLCAyKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7IH1cclxuICAgIHJldHVybiBqc29uU3RyO1xyXG59XHJcbmZ1bmN0aW9uIGlzSTE4blN0cih2YWx1ZSwgZGVsaW1pdGVycykge1xyXG4gICAgcmV0dXJuIHZhbHVlLmluZGV4T2YoZGVsaW1pdGVyc1swXSkgPiAtMTtcclxufVxyXG5mdW5jdGlvbiBjb21waWxlU3RyKHZhbHVlLCB2YWx1ZXMsIGRlbGltaXRlcnMpIHtcclxuICAgIHJldHVybiBmb3JtYXRlci5pbnRlcnBvbGF0ZSh2YWx1ZSwgdmFsdWVzLCBkZWxpbWl0ZXJzKS5qb2luKCcnKTtcclxufVxyXG5mdW5jdGlvbiBjb21waWxlVmFsdWUoanNvbk9iaiwga2V5LCBsb2NhbGVWYWx1ZXMsIGRlbGltaXRlcnMpIHtcclxuICAgIGNvbnN0IHZhbHVlID0ganNvbk9ialtrZXldO1xyXG4gICAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xyXG4gICAgICAgIC8vIOWtmOWcqOWbvemZheWMllxyXG4gICAgICAgIGlmIChpc0kxOG5TdHIodmFsdWUsIGRlbGltaXRlcnMpKSB7XHJcbiAgICAgICAgICAgIGpzb25PYmpba2V5XSA9IGNvbXBpbGVTdHIodmFsdWUsIGxvY2FsZVZhbHVlc1swXS52YWx1ZXMsIGRlbGltaXRlcnMpO1xyXG4gICAgICAgICAgICBpZiAobG9jYWxlVmFsdWVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIC8vIOagvOW8j+WMluWbvemZheWMluivreiogFxyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVMb2NhbGVzID0gKGpzb25PYmpba2V5ICsgJ0xvY2FsZXMnXSA9IHt9KTtcclxuICAgICAgICAgICAgICAgIGxvY2FsZVZhbHVlcy5mb3JFYWNoKChsb2NhbFZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVMb2NhbGVzW2xvY2FsVmFsdWUubG9jYWxlXSA9IGNvbXBpbGVTdHIodmFsdWUsIGxvY2FsVmFsdWUudmFsdWVzLCBkZWxpbWl0ZXJzKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgY29tcGlsZUpzb25PYmoodmFsdWUsIGxvY2FsZVZhbHVlcywgZGVsaW1pdGVycyk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gY29tcGlsZUpzb25PYmooanNvbk9iaiwgbG9jYWxlVmFsdWVzLCBkZWxpbWl0ZXJzKSB7XHJcbiAgICB3YWxrSnNvbk9iaihqc29uT2JqLCAoanNvbk9iaiwga2V5KSA9PiB7XHJcbiAgICAgICAgY29tcGlsZVZhbHVlKGpzb25PYmosIGtleSwgbG9jYWxlVmFsdWVzLCBkZWxpbWl0ZXJzKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGpzb25PYmo7XHJcbn1cclxuZnVuY3Rpb24gd2Fsa0pzb25PYmooanNvbk9iaiwgd2Fsaykge1xyXG4gICAgaWYgKGlzQXJyYXkoanNvbk9iaikpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGpzb25PYmoubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHdhbGsoanNvbk9iaiwgaSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoaXNPYmplY3QoanNvbk9iaikpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBqc29uT2JqKSB7XHJcbiAgICAgICAgICAgIGlmICh3YWxrKGpzb25PYmosIGtleSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZXNvbHZlTG9jYWxlKGxvY2FsZXMpIHtcclxuICAgIHJldHVybiAobG9jYWxlKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsb2NhbGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbG9jYWxlID0gbm9ybWFsaXplTG9jYWxlKGxvY2FsZSkgfHwgbG9jYWxlO1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlTG9jYWxlQ2hhaW4obG9jYWxlKS5maW5kKChsb2NhbGUpID0+IGxvY2FsZXMuaW5kZXhPZihsb2NhbGUpID4gLTEpO1xyXG4gICAgfTtcclxufVxyXG5mdW5jdGlvbiByZXNvbHZlTG9jYWxlQ2hhaW4obG9jYWxlKSB7XHJcbiAgICBjb25zdCBjaGFpbiA9IFtdO1xyXG4gICAgY29uc3QgdG9rZW5zID0gbG9jYWxlLnNwbGl0KCctJyk7XHJcbiAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCkge1xyXG4gICAgICAgIGNoYWluLnB1c2godG9rZW5zLmpvaW4oJy0nKSk7XHJcbiAgICAgICAgdG9rZW5zLnBvcCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNoYWluO1xyXG59XHJcblxyXG5leHBvcnQgeyBCYXNlRm9ybWF0dGVyIGFzIEZvcm1hdHRlciwgSTE4biwgTE9DQUxFX0VOLCBMT0NBTEVfRVMsIExPQ0FMRV9GUiwgTE9DQUxFX1pIX0hBTlMsIExPQ0FMRV9aSF9IQU5ULCBjb21waWxlSTE4bkpzb25TdHIsIGhhc0kxOG5Kc29uLCBpbml0VnVlSTE4biwgaXNJMThuU3RyLCBpc1N0cmluZywgbm9ybWFsaXplTG9jYWxlLCBwYXJzZUkxOG5Kc29uLCByZXNvbHZlTG9jYWxlIH07XHJcbiIsIi8qIVxuICogVnVlLmpzIHYyLjYuMTFcbiAqIChjKSAyMDE0LTIwMjIgRXZhbiBZb3VcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuLyogICovXG5cbnZhciBlbXB0eU9iamVjdCA9IE9iamVjdC5mcmVlemUoe30pO1xuXG4vLyBUaGVzZSBoZWxwZXJzIHByb2R1Y2UgYmV0dGVyIFZNIGNvZGUgaW4gSlMgZW5naW5lcyBkdWUgdG8gdGhlaXJcbi8vIGV4cGxpY2l0bmVzcyBhbmQgZnVuY3Rpb24gaW5saW5pbmcuXG5mdW5jdGlvbiBpc1VuZGVmICh2KSB7XG4gIHJldHVybiB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gbnVsbFxufVxuXG5mdW5jdGlvbiBpc0RlZiAodikge1xuICByZXR1cm4gdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGxcbn1cblxuZnVuY3Rpb24gaXNUcnVlICh2KSB7XG4gIHJldHVybiB2ID09PSB0cnVlXG59XG5cbmZ1bmN0aW9uIGlzRmFsc2UgKHYpIHtcbiAgcmV0dXJuIHYgPT09IGZhbHNlXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdmFsdWUgaXMgcHJpbWl0aXZlLlxuICovXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSAodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCcgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJ1xuICApXG59XG5cbi8qKlxuICogUXVpY2sgb2JqZWN0IGNoZWNrIC0gdGhpcyBpcyBwcmltYXJpbHkgdXNlZCB0byB0ZWxsXG4gKiBPYmplY3RzIGZyb20gcHJpbWl0aXZlIHZhbHVlcyB3aGVuIHdlIGtub3cgdGhlIHZhbHVlXG4gKiBpcyBhIEpTT04tY29tcGxpYW50IHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0IChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0J1xufVxuXG4vKipcbiAqIEdldCB0aGUgcmF3IHR5cGUgc3RyaW5nIG9mIGEgdmFsdWUsIGUuZy4sIFtvYmplY3QgT2JqZWN0XS5cbiAqL1xudmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbmZ1bmN0aW9uIHRvUmF3VHlwZSAodmFsdWUpIHtcbiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSlcbn1cblxuLyoqXG4gKiBTdHJpY3Qgb2JqZWN0IHR5cGUgY2hlY2suIE9ubHkgcmV0dXJucyB0cnVlXG4gKiBmb3IgcGxhaW4gSmF2YVNjcmlwdCBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0IChvYmopIHtcbiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IE9iamVjdF0nXG59XG5cbmZ1bmN0aW9uIGlzUmVnRXhwICh2KSB7XG4gIHJldHVybiBfdG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgUmVnRXhwXSdcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB2YWwgaXMgYSB2YWxpZCBhcnJheSBpbmRleC5cbiAqL1xuZnVuY3Rpb24gaXNWYWxpZEFycmF5SW5kZXggKHZhbCkge1xuICB2YXIgbiA9IHBhcnNlRmxvYXQoU3RyaW5nKHZhbCkpO1xuICByZXR1cm4gbiA+PSAwICYmIE1hdGguZmxvb3IobikgPT09IG4gJiYgaXNGaW5pdGUodmFsKVxufVxuXG5mdW5jdGlvbiBpc1Byb21pc2UgKHZhbCkge1xuICByZXR1cm4gKFxuICAgIGlzRGVmKHZhbCkgJiZcbiAgICB0eXBlb2YgdmFsLnRoZW4gPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsLmNhdGNoID09PSAnZnVuY3Rpb24nXG4gIClcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgdmFsdWUgdG8gYSBzdHJpbmcgdGhhdCBpcyBhY3R1YWxseSByZW5kZXJlZC5cbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcgKHZhbCkge1xuICByZXR1cm4gdmFsID09IG51bGxcbiAgICA/ICcnXG4gICAgOiBBcnJheS5pc0FycmF5KHZhbCkgfHwgKGlzUGxhaW5PYmplY3QodmFsKSAmJiB2YWwudG9TdHJpbmcgPT09IF90b1N0cmluZylcbiAgICAgID8gSlNPTi5zdHJpbmdpZnkodmFsLCBudWxsLCAyKVxuICAgICAgOiBTdHJpbmcodmFsKVxufVxuXG4vKipcbiAqIENvbnZlcnQgYW4gaW5wdXQgdmFsdWUgdG8gYSBudW1iZXIgZm9yIHBlcnNpc3RlbmNlLlxuICogSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIHJldHVybiBvcmlnaW5hbCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyICh2YWwpIHtcbiAgdmFyIG4gPSBwYXJzZUZsb2F0KHZhbCk7XG4gIHJldHVybiBpc05hTihuKSA/IHZhbCA6IG5cbn1cblxuLyoqXG4gKiBNYWtlIGEgbWFwIGFuZCByZXR1cm4gYSBmdW5jdGlvbiBmb3IgY2hlY2tpbmcgaWYgYSBrZXlcbiAqIGlzIGluIHRoYXQgbWFwLlxuICovXG5mdW5jdGlvbiBtYWtlTWFwIChcbiAgc3RyLFxuICBleHBlY3RzTG93ZXJDYXNlXG4pIHtcbiAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHZhciBsaXN0ID0gc3RyLnNwbGl0KCcsJyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIG1hcFtsaXN0W2ldXSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGV4cGVjdHNMb3dlckNhc2VcbiAgICA/IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWwudG9Mb3dlckNhc2UoKV07IH1cbiAgICA6IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWxdOyB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSB0YWcgaXMgYSBidWlsdC1pbiB0YWcuXG4gKi9cbnZhciBpc0J1aWx0SW5UYWcgPSBtYWtlTWFwKCdzbG90LGNvbXBvbmVudCcsIHRydWUpO1xuXG4vKipcbiAqIENoZWNrIGlmIGFuIGF0dHJpYnV0ZSBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZS5cbiAqL1xudmFyIGlzUmVzZXJ2ZWRBdHRyaWJ1dGUgPSBtYWtlTWFwKCdrZXkscmVmLHNsb3Qsc2xvdC1zY29wZSxpcycpO1xuXG4vKipcbiAqIFJlbW92ZSBhbiBpdGVtIGZyb20gYW4gYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZSAoYXJyLCBpdGVtKSB7XG4gIGlmIChhcnIubGVuZ3RoKSB7XG4gICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHJldHVybiBhcnIuc3BsaWNlKGluZGV4LCAxKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYW4gb2JqZWN0IGhhcyB0aGUgcHJvcGVydHkuXG4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5mdW5jdGlvbiBoYXNPd24gKG9iaiwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGNhY2hlZCB2ZXJzaW9uIG9mIGEgcHVyZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY2FjaGVkIChmbikge1xuICB2YXIgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gKGZ1bmN0aW9uIGNhY2hlZEZuIChzdHIpIHtcbiAgICB2YXIgaGl0ID0gY2FjaGVbc3RyXTtcbiAgICByZXR1cm4gaGl0IHx8IChjYWNoZVtzdHJdID0gZm4oc3RyKSlcbiAgfSlcbn1cblxuLyoqXG4gKiBDYW1lbGl6ZSBhIGh5cGhlbi1kZWxpbWl0ZWQgc3RyaW5nLlxuICovXG52YXIgY2FtZWxpemVSRSA9IC8tKFxcdykvZztcbnZhciBjYW1lbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShjYW1lbGl6ZVJFLCBmdW5jdGlvbiAoXywgYykgeyByZXR1cm4gYyA/IGMudG9VcHBlckNhc2UoKSA6ICcnOyB9KVxufSk7XG5cbi8qKlxuICogQ2FwaXRhbGl6ZSBhIHN0cmluZy5cbiAqL1xudmFyIGNhcGl0YWxpemUgPSBjYWNoZWQoZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpXG59KTtcblxuLyoqXG4gKiBIeXBoZW5hdGUgYSBjYW1lbENhc2Ugc3RyaW5nLlxuICovXG52YXIgaHlwaGVuYXRlUkUgPSAvXFxCKFtBLVpdKS9nO1xudmFyIGh5cGhlbmF0ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShoeXBoZW5hdGVSRSwgJy0kMScpLnRvTG93ZXJDYXNlKClcbn0pO1xuXG4vKipcbiAqIFNpbXBsZSBiaW5kIHBvbHlmaWxsIGZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBpdCxcbiAqIGUuZy4sIFBoYW50b21KUyAxLnguIFRlY2huaWNhbGx5LCB3ZSBkb24ndCBuZWVkIHRoaXMgYW55bW9yZVxuICogc2luY2UgbmF0aXZlIGJpbmQgaXMgbm93IHBlcmZvcm1hbnQgZW5vdWdoIGluIG1vc3QgYnJvd3NlcnMuXG4gKiBCdXQgcmVtb3ZpbmcgaXQgd291bGQgbWVhbiBicmVha2luZyBjb2RlIHRoYXQgd2FzIGFibGUgdG8gcnVuIGluXG4gKiBQaGFudG9tSlMgMS54LCBzbyB0aGlzIG11c3QgYmUga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAqL1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gcG9seWZpbGxCaW5kIChmbiwgY3R4KSB7XG4gIGZ1bmN0aW9uIGJvdW5kRm4gKGEpIHtcbiAgICB2YXIgbCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgcmV0dXJuIGxcbiAgICAgID8gbCA+IDFcbiAgICAgICAgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cylcbiAgICAgICAgOiBmbi5jYWxsKGN0eCwgYSlcbiAgICAgIDogZm4uY2FsbChjdHgpXG4gIH1cblxuICBib3VuZEZuLl9sZW5ndGggPSBmbi5sZW5ndGg7XG4gIHJldHVybiBib3VuZEZuXG59XG5cbmZ1bmN0aW9uIG5hdGl2ZUJpbmQgKGZuLCBjdHgpIHtcbiAgcmV0dXJuIGZuLmJpbmQoY3R4KVxufVxuXG52YXIgYmluZCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXG4gID8gbmF0aXZlQmluZFxuICA6IHBvbHlmaWxsQmluZDtcblxuLyoqXG4gKiBDb252ZXJ0IGFuIEFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgcmVhbCBBcnJheS5cbiAqL1xuZnVuY3Rpb24gdG9BcnJheSAobGlzdCwgc3RhcnQpIHtcbiAgc3RhcnQgPSBzdGFydCB8fCAwO1xuICB2YXIgaSA9IGxpc3QubGVuZ3RoIC0gc3RhcnQ7XG4gIHZhciByZXQgPSBuZXcgQXJyYXkoaSk7XG4gIHdoaWxlIChpLS0pIHtcbiAgICByZXRbaV0gPSBsaXN0W2kgKyBzdGFydF07XG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG4vKipcbiAqIE1peCBwcm9wZXJ0aWVzIGludG8gdGFyZ2V0IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZXh0ZW5kICh0bywgX2Zyb20pIHtcbiAgZm9yICh2YXIga2V5IGluIF9mcm9tKSB7XG4gICAgdG9ba2V5XSA9IF9mcm9tW2tleV07XG4gIH1cbiAgcmV0dXJuIHRvXG59XG5cbi8qKlxuICogTWVyZ2UgYW4gQXJyYXkgb2YgT2JqZWN0cyBpbnRvIGEgc2luZ2xlIE9iamVjdC5cbiAqL1xuZnVuY3Rpb24gdG9PYmplY3QgKGFycikge1xuICB2YXIgcmVzID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGFycltpXSkge1xuICAgICAgZXh0ZW5kKHJlcywgYXJyW2ldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG4vKipcbiAqIFBlcmZvcm0gbm8gb3BlcmF0aW9uLlxuICogU3R1YmJpbmcgYXJncyB0byBtYWtlIEZsb3cgaGFwcHkgd2l0aG91dCBsZWF2aW5nIHVzZWxlc3MgdHJhbnNwaWxlZCBjb2RlXG4gKiB3aXRoIC4uLnJlc3QgKGh0dHBzOi8vZmxvdy5vcmcvYmxvZy8yMDE3LzA1LzA3L1N0cmljdC1GdW5jdGlvbi1DYWxsLUFyaXR5LykuXG4gKi9cbmZ1bmN0aW9uIG5vb3AgKGEsIGIsIGMpIHt9XG5cbi8qKlxuICogQWx3YXlzIHJldHVybiBmYWxzZS5cbiAqL1xudmFyIG5vID0gZnVuY3Rpb24gKGEsIGIsIGMpIHsgcmV0dXJuIGZhbHNlOyB9O1xuXG4vKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC12YXJzICovXG5cbi8qKlxuICogUmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuICovXG52YXIgaWRlbnRpdHkgPSBmdW5jdGlvbiAoXykgeyByZXR1cm4gXzsgfTtcblxuLyoqXG4gKiBDaGVjayBpZiB0d28gdmFsdWVzIGFyZSBsb29zZWx5IGVxdWFsIC0gdGhhdCBpcyxcbiAqIGlmIHRoZXkgYXJlIHBsYWluIG9iamVjdHMsIGRvIHRoZXkgaGF2ZSB0aGUgc2FtZSBzaGFwZT9cbiAqL1xuZnVuY3Rpb24gbG9vc2VFcXVhbCAoYSwgYikge1xuICBpZiAoYSA9PT0gYikgeyByZXR1cm4gdHJ1ZSB9XG4gIHZhciBpc09iamVjdEEgPSBpc09iamVjdChhKTtcbiAgdmFyIGlzT2JqZWN0QiA9IGlzT2JqZWN0KGIpO1xuICBpZiAoaXNPYmplY3RBICYmIGlzT2JqZWN0Qikge1xuICAgIHRyeSB7XG4gICAgICB2YXIgaXNBcnJheUEgPSBBcnJheS5pc0FycmF5KGEpO1xuICAgICAgdmFyIGlzQXJyYXlCID0gQXJyYXkuaXNBcnJheShiKTtcbiAgICAgIGlmIChpc0FycmF5QSAmJiBpc0FycmF5Qikge1xuICAgICAgICByZXR1cm4gYS5sZW5ndGggPT09IGIubGVuZ3RoICYmIGEuZXZlcnkoZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChlLCBiW2ldKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmIChhIGluc3RhbmNlb2YgRGF0ZSAmJiBiIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gYS5nZXRUaW1lKCkgPT09IGIuZ2V0VGltZSgpXG4gICAgICB9IGVsc2UgaWYgKCFpc0FycmF5QSAmJiAhaXNBcnJheUIpIHtcbiAgICAgICAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMoYSk7XG4gICAgICAgIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKGIpO1xuICAgICAgICByZXR1cm4ga2V5c0EubGVuZ3RoID09PSBrZXlzQi5sZW5ndGggJiYga2V5c0EuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHJldHVybiBsb29zZUVxdWFsKGFba2V5XSwgYltrZXldKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSBlbHNlIGlmICghaXNPYmplY3RBICYmICFpc09iamVjdEIpIHtcbiAgICByZXR1cm4gU3RyaW5nKGEpID09PSBTdHJpbmcoYilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiB0aGUgZmlyc3QgaW5kZXggYXQgd2hpY2ggYSBsb29zZWx5IGVxdWFsIHZhbHVlIGNhbiBiZVxuICogZm91bmQgaW4gdGhlIGFycmF5IChpZiB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdCwgdGhlIGFycmF5IG11c3RcbiAqIGNvbnRhaW4gYW4gb2JqZWN0IG9mIHRoZSBzYW1lIHNoYXBlKSwgb3IgLTEgaWYgaXQgaXMgbm90IHByZXNlbnQuXG4gKi9cbmZ1bmN0aW9uIGxvb3NlSW5kZXhPZiAoYXJyLCB2YWwpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobG9vc2VFcXVhbChhcnJbaV0sIHZhbCkpIHsgcmV0dXJuIGkgfVxuICB9XG4gIHJldHVybiAtMVxufVxuXG4vKipcbiAqIEVuc3VyZSBhIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IG9uY2UuXG4gKi9cbmZ1bmN0aW9uIG9uY2UgKGZuKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBBU1NFVF9UWVBFUyA9IFtcbiAgJ2NvbXBvbmVudCcsXG4gICdkaXJlY3RpdmUnLFxuICAnZmlsdGVyJ1xuXTtcblxudmFyIExJRkVDWUNMRV9IT09LUyA9IFtcbiAgJ2JlZm9yZUNyZWF0ZScsXG4gICdjcmVhdGVkJyxcbiAgJ2JlZm9yZU1vdW50JyxcbiAgJ21vdW50ZWQnLFxuICAnYmVmb3JlVXBkYXRlJyxcbiAgJ3VwZGF0ZWQnLFxuICAnYmVmb3JlRGVzdHJveScsXG4gICdkZXN0cm95ZWQnLFxuICAnYWN0aXZhdGVkJyxcbiAgJ2RlYWN0aXZhdGVkJyxcbiAgJ2Vycm9yQ2FwdHVyZWQnLFxuICAnc2VydmVyUHJlZmV0Y2gnXG5dO1xuXG4vKiAgKi9cblxuXG5cbnZhciBjb25maWcgPSAoe1xuICAvKipcbiAgICogT3B0aW9uIG1lcmdlIHN0cmF0ZWdpZXMgKHVzZWQgaW4gY29yZS91dGlsL29wdGlvbnMpXG4gICAqL1xuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN1cHByZXNzIHdhcm5pbmdzLlxuICAgKi9cbiAgc2lsZW50OiBmYWxzZSxcblxuICAvKipcbiAgICogU2hvdyBwcm9kdWN0aW9uIG1vZGUgdGlwIG1lc3NhZ2Ugb24gYm9vdD9cbiAgICovXG4gIHByb2R1Y3Rpb25UaXA6IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIGRldnRvb2xzXG4gICAqL1xuICBkZXZ0b29sczogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyxcblxuICAvKipcbiAgICogV2hldGhlciB0byByZWNvcmQgcGVyZlxuICAgKi9cbiAgcGVyZm9ybWFuY2U6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBFcnJvciBoYW5kbGVyIGZvciB3YXRjaGVyIGVycm9yc1xuICAgKi9cbiAgZXJyb3JIYW5kbGVyOiBudWxsLFxuXG4gIC8qKlxuICAgKiBXYXJuIGhhbmRsZXIgZm9yIHdhdGNoZXIgd2FybnNcbiAgICovXG4gIHdhcm5IYW5kbGVyOiBudWxsLFxuXG4gIC8qKlxuICAgKiBJZ25vcmUgY2VydGFpbiBjdXN0b20gZWxlbWVudHNcbiAgICovXG4gIGlnbm9yZWRFbGVtZW50czogW10sXG5cbiAgLyoqXG4gICAqIEN1c3RvbSB1c2VyIGtleSBhbGlhc2VzIGZvciB2LW9uXG4gICAqL1xuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAga2V5Q29kZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdGFnIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHJlZ2lzdGVyZWQgYXMgYVxuICAgKiBjb21wb25lbnQuIFRoaXMgaXMgcGxhdGZvcm0tZGVwZW5kZW50IGFuZCBtYXkgYmUgb3ZlcndyaXR0ZW4uXG4gICAqL1xuICBpc1Jlc2VydmVkVGFnOiBubyxcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYXR0cmlidXRlIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHVzZWQgYXMgYSBjb21wb25lbnRcbiAgICogcHJvcC4gVGhpcyBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQgYW5kIG1heSBiZSBvdmVyd3JpdHRlbi5cbiAgICovXG4gIGlzUmVzZXJ2ZWRBdHRyOiBubyxcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB0YWcgaXMgYW4gdW5rbm93biBlbGVtZW50LlxuICAgKiBQbGF0Zm9ybS1kZXBlbmRlbnQuXG4gICAqL1xuICBpc1Vua25vd25FbGVtZW50OiBubyxcblxuICAvKipcbiAgICogR2V0IHRoZSBuYW1lc3BhY2Ugb2YgYW4gZWxlbWVudFxuICAgKi9cbiAgZ2V0VGFnTmFtZXNwYWNlOiBub29wLFxuXG4gIC8qKlxuICAgKiBQYXJzZSB0aGUgcmVhbCB0YWcgbmFtZSBmb3IgdGhlIHNwZWNpZmljIHBsYXRmb3JtLlxuICAgKi9cbiAgcGFyc2VQbGF0Zm9ybVRhZ05hbWU6IGlkZW50aXR5LFxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhdHRyaWJ1dGUgbXVzdCBiZSBib3VuZCB1c2luZyBwcm9wZXJ0eSwgZS5nLiB2YWx1ZVxuICAgKiBQbGF0Zm9ybS1kZXBlbmRlbnQuXG4gICAqL1xuICBtdXN0VXNlUHJvcDogbm8sXG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gdXBkYXRlcyBhc3luY2hyb25vdXNseS4gSW50ZW5kZWQgdG8gYmUgdXNlZCBieSBWdWUgVGVzdCBVdGlsc1xuICAgKiBUaGlzIHdpbGwgc2lnbmlmaWNhbnRseSByZWR1Y2UgcGVyZm9ybWFuY2UgaWYgc2V0IHRvIGZhbHNlLlxuICAgKi9cbiAgYXN5bmM6IHRydWUsXG5cbiAgLyoqXG4gICAqIEV4cG9zZWQgZm9yIGxlZ2FjeSByZWFzb25zXG4gICAqL1xuICBfbGlmZWN5Y2xlSG9va3M6IExJRkVDWUNMRV9IT09LU1xufSk7XG5cbi8qICAqL1xuXG4vKipcbiAqIHVuaWNvZGUgbGV0dGVycyB1c2VkIGZvciBwYXJzaW5nIGh0bWwgdGFncywgY29tcG9uZW50IG5hbWVzIGFuZCBwcm9wZXJ0eSBwYXRocy5cbiAqIHVzaW5nIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNTMvc2VtYW50aWNzLXNjcmlwdGluZy5odG1sI3BvdGVudGlhbGN1c3RvbWVsZW1lbnRuYW1lXG4gKiBza2lwcGluZyBcXHUxMDAwMC1cXHVFRkZGRiBkdWUgdG8gaXQgZnJlZXppbmcgdXAgUGhhbnRvbUpTXG4gKi9cbnZhciB1bmljb2RlUmVnRXhwID0gL2EtekEtWlxcdTAwQjdcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDNGLVxcdTIwNDBcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkQvO1xuXG4vKipcbiAqIENoZWNrIGlmIGEgc3RyaW5nIHN0YXJ0cyB3aXRoICQgb3IgX1xuICovXG5mdW5jdGlvbiBpc1Jlc2VydmVkIChzdHIpIHtcbiAgdmFyIGMgPSAoc3RyICsgJycpLmNoYXJDb2RlQXQoMCk7XG4gIHJldHVybiBjID09PSAweDI0IHx8IGMgPT09IDB4NUZcbn1cblxuLyoqXG4gKiBEZWZpbmUgYSBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZGVmIChvYmosIGtleSwgdmFsLCBlbnVtZXJhYmxlKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgIHZhbHVlOiB2YWwsXG4gICAgZW51bWVyYWJsZTogISFlbnVtZXJhYmxlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZSBzaW1wbGUgcGF0aC5cbiAqL1xudmFyIGJhaWxSRSA9IG5ldyBSZWdFeHAoKFwiW15cIiArICh1bmljb2RlUmVnRXhwLnNvdXJjZSkgKyBcIi4kX1xcXFxkXVwiKSk7XG5mdW5jdGlvbiBwYXJzZVBhdGggKHBhdGgpIHtcbiAgaWYgKGJhaWxSRS50ZXN0KHBhdGgpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIHNlZ21lbnRzID0gcGF0aC5zcGxpdCgnLicpO1xuICByZXR1cm4gZnVuY3Rpb24gKG9iaikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghb2JqKSB7IHJldHVybiB9XG4gICAgICBvYmogPSBvYmpbc2VnbWVudHNbaV1dO1xuICAgIH1cbiAgICByZXR1cm4gb2JqXG4gIH1cbn1cblxuLyogICovXG5cbi8vIGNhbiB3ZSB1c2UgX19wcm90b19fP1xudmFyIGhhc1Byb3RvID0gJ19fcHJvdG9fXycgaW4ge307XG5cbi8vIEJyb3dzZXIgZW52aXJvbm1lbnQgc25pZmZpbmdcbnZhciBpbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcbnZhciBpbldlZXggPSB0eXBlb2YgV1hFbnZpcm9ubWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgISFXWEVudmlyb25tZW50LnBsYXRmb3JtO1xudmFyIHdlZXhQbGF0Zm9ybSA9IGluV2VleCAmJiBXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCk7XG52YXIgVUEgPSBpbkJyb3dzZXIgJiYgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcbnZhciBpc0lFID0gVUEgJiYgL21zaWV8dHJpZGVudC8udGVzdChVQSk7XG52YXIgaXNJRTkgPSBVQSAmJiBVQS5pbmRleE9mKCdtc2llIDkuMCcpID4gMDtcbnZhciBpc0VkZ2UgPSBVQSAmJiBVQS5pbmRleE9mKCdlZGdlLycpID4gMDtcbnZhciBpc0FuZHJvaWQgPSAoVUEgJiYgVUEuaW5kZXhPZignYW5kcm9pZCcpID4gMCkgfHwgKHdlZXhQbGF0Zm9ybSA9PT0gJ2FuZHJvaWQnKTtcbnZhciBpc0lPUyA9IChVQSAmJiAvaXBob25lfGlwYWR8aXBvZHxpb3MvLnRlc3QoVUEpKSB8fCAod2VleFBsYXRmb3JtID09PSAnaW9zJyk7XG52YXIgaXNDaHJvbWUgPSBVQSAmJiAvY2hyb21lXFwvXFxkKy8udGVzdChVQSkgJiYgIWlzRWRnZTtcbnZhciBpc1BoYW50b21KUyA9IFVBICYmIC9waGFudG9tanMvLnRlc3QoVUEpO1xudmFyIGlzRkYgPSBVQSAmJiBVQS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pO1xuXG4vLyBGaXJlZm94IGhhcyBhIFwid2F0Y2hcIiBmdW5jdGlvbiBvbiBPYmplY3QucHJvdG90eXBlLi4uXG52YXIgbmF0aXZlV2F0Y2ggPSAoe30pLndhdGNoO1xuaWYgKGluQnJvd3Nlcikge1xuICB0cnkge1xuICAgIHZhciBvcHRzID0ge307XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9wdHMsICdwYXNzaXZlJywgKHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0ICgpIHtcbiAgICAgIH1cbiAgICB9KSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yODVcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdC1wYXNzaXZlJywgbnVsbCwgb3B0cyk7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG5cbi8vIHRoaXMgbmVlZHMgdG8gYmUgbGF6eS1ldmFsZWQgYmVjYXVzZSB2dWUgbWF5IGJlIHJlcXVpcmVkIGJlZm9yZVxuLy8gdnVlLXNlcnZlci1yZW5kZXJlciBjYW4gc2V0IFZVRV9FTlZcbnZhciBfaXNTZXJ2ZXI7XG52YXIgaXNTZXJ2ZXJSZW5kZXJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChfaXNTZXJ2ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghaW5Ccm93c2VyICYmICFpbldlZXggJiYgdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIGRldGVjdCBwcmVzZW5jZSBvZiB2dWUtc2VydmVyLXJlbmRlcmVyIGFuZCBhdm9pZFxuICAgICAgLy8gV2VicGFjayBzaGltbWluZyB0aGUgcHJvY2Vzc1xuICAgICAgX2lzU2VydmVyID0gZ2xvYmFsWydwcm9jZXNzJ10gJiYgZ2xvYmFsWydwcm9jZXNzJ10uZW52LlZVRV9FTlYgPT09ICdzZXJ2ZXInO1xuICAgIH0gZWxzZSB7XG4gICAgICBfaXNTZXJ2ZXIgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIF9pc1NlcnZlclxufTtcblxuLy8gZGV0ZWN0IGRldnRvb2xzXG52YXIgZGV2dG9vbHMgPSBpbkJyb3dzZXIgJiYgd2luZG93Ll9fVlVFX0RFVlRPT0xTX0dMT0JBTF9IT09LX187XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBpc05hdGl2ZSAoQ3Rvcikge1xuICByZXR1cm4gdHlwZW9mIEN0b3IgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KEN0b3IudG9TdHJpbmcoKSlcbn1cblxudmFyIGhhc1N5bWJvbCA9XG4gIHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFN5bWJvbCkgJiZcbiAgdHlwZW9mIFJlZmxlY3QgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFJlZmxlY3Qub3duS2V5cyk7XG5cbnZhciBfU2V0O1xuLyogaXN0YW5idWwgaWdub3JlIGlmICovIC8vICRmbG93LWRpc2FibGUtbGluZVxuaWYgKHR5cGVvZiBTZXQgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFNldCkpIHtcbiAgLy8gdXNlIG5hdGl2ZSBTZXQgd2hlbiBhdmFpbGFibGUuXG4gIF9TZXQgPSBTZXQ7XG59IGVsc2Uge1xuICAvLyBhIG5vbi1zdGFuZGFyZCBTZXQgcG9seWZpbGwgdGhhdCBvbmx5IHdvcmtzIHdpdGggcHJpbWl0aXZlIGtleXMuXG4gIF9TZXQgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTZXQgKCkge1xuICAgICAgdGhpcy5zZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIH1cbiAgICBTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIGhhcyAoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRba2V5XSA9PT0gdHJ1ZVxuICAgIH07XG4gICAgU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKGtleSkge1xuICAgICAgdGhpcy5zZXRba2V5XSA9IHRydWU7XG4gICAgfTtcbiAgICBTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIgKCkge1xuICAgICAgdGhpcy5zZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2V0O1xuICB9KCkpO1xufVxuXG4vKiAgKi9cblxudmFyIHdhcm4gPSBub29wO1xudmFyIHRpcCA9IG5vb3A7XG52YXIgZ2VuZXJhdGVDb21wb25lbnRUcmFjZSA9IChub29wKTsgLy8gd29yayBhcm91bmQgZmxvdyBjaGVja1xudmFyIGZvcm1hdENvbXBvbmVudE5hbWUgPSAobm9vcCk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBoYXNDb25zb2xlID0gdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnO1xuICB2YXIgY2xhc3NpZnlSRSA9IC8oPzpefFstX10pKFxcdykvZztcbiAgdmFyIGNsYXNzaWZ5ID0gZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gc3RyXG4gICAgLnJlcGxhY2UoY2xhc3NpZnlSRSwgZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMudG9VcHBlckNhc2UoKTsgfSlcbiAgICAucmVwbGFjZSgvWy1fXS9nLCAnJyk7IH07XG5cbiAgd2FybiA9IGZ1bmN0aW9uIChtc2csIHZtKSB7XG4gICAgdmFyIHRyYWNlID0gdm0gPyBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlKHZtKSA6ICcnO1xuXG4gICAgaWYgKGNvbmZpZy53YXJuSGFuZGxlcikge1xuICAgICAgY29uZmlnLndhcm5IYW5kbGVyLmNhbGwobnVsbCwgbXNnLCB2bSwgdHJhY2UpO1xuICAgIH0gZWxzZSBpZiAoaGFzQ29uc29sZSAmJiAoIWNvbmZpZy5zaWxlbnQpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKChcIltWdWUgd2Fybl06IFwiICsgbXNnICsgdHJhY2UpKTtcbiAgICB9XG4gIH07XG5cbiAgdGlwID0gZnVuY3Rpb24gKG1zZywgdm0pIHtcbiAgICBpZiAoaGFzQ29uc29sZSAmJiAoIWNvbmZpZy5zaWxlbnQpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJbVnVlIHRpcF06IFwiICsgbXNnICsgKFxuICAgICAgICB2bSA/IGdlbmVyYXRlQ29tcG9uZW50VHJhY2Uodm0pIDogJydcbiAgICAgICkpO1xuICAgIH1cbiAgfTtcblxuICBmb3JtYXRDb21wb25lbnROYW1lID0gZnVuY3Rpb24gKHZtLCBpbmNsdWRlRmlsZSkge1xuICAgIGlmICh2bS4kcm9vdCA9PT0gdm0pIHtcbiAgICAgIGlmICh2bS4kb3B0aW9ucyAmJiB2bS4kb3B0aW9ucy5fX2ZpbGUpIHsgLy8gZml4ZWQgYnkgeHh4eHh4XG4gICAgICAgIHJldHVybiAoJycpICsgdm0uJG9wdGlvbnMuX19maWxlXG4gICAgICB9XG4gICAgICByZXR1cm4gJzxSb290PidcbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygdm0gPT09ICdmdW5jdGlvbicgJiYgdm0uY2lkICE9IG51bGxcbiAgICAgID8gdm0ub3B0aW9uc1xuICAgICAgOiB2bS5faXNWdWVcbiAgICAgICAgPyB2bS4kb3B0aW9ucyB8fCB2bS5jb25zdHJ1Y3Rvci5vcHRpb25zXG4gICAgICAgIDogdm07XG4gICAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgb3B0aW9ucy5fY29tcG9uZW50VGFnO1xuICAgIHZhciBmaWxlID0gb3B0aW9ucy5fX2ZpbGU7XG4gICAgaWYgKCFuYW1lICYmIGZpbGUpIHtcbiAgICAgIHZhciBtYXRjaCA9IGZpbGUubWF0Y2goLyhbXi9cXFxcXSspXFwudnVlJC8pO1xuICAgICAgbmFtZSA9IG1hdGNoICYmIG1hdGNoWzFdO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAobmFtZSA/IChcIjxcIiArIChjbGFzc2lmeShuYW1lKSkgKyBcIj5cIikgOiBcIjxBbm9ueW1vdXM+XCIpICtcbiAgICAgIChmaWxlICYmIGluY2x1ZGVGaWxlICE9PSBmYWxzZSA/IChcIiBhdCBcIiArIGZpbGUpIDogJycpXG4gICAgKVxuICB9O1xuXG4gIHZhciByZXBlYXQgPSBmdW5jdGlvbiAoc3RyLCBuKSB7XG4gICAgdmFyIHJlcyA9ICcnO1xuICAgIHdoaWxlIChuKSB7XG4gICAgICBpZiAobiAlIDIgPT09IDEpIHsgcmVzICs9IHN0cjsgfVxuICAgICAgaWYgKG4gPiAxKSB7IHN0ciArPSBzdHI7IH1cbiAgICAgIG4gPj49IDE7XG4gICAgfVxuICAgIHJldHVybiByZXNcbiAgfTtcblxuICBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlID0gZnVuY3Rpb24gKHZtKSB7XG4gICAgaWYgKHZtLl9pc1Z1ZSAmJiB2bS4kcGFyZW50KSB7XG4gICAgICB2YXIgdHJlZSA9IFtdO1xuICAgICAgdmFyIGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZSA9IDA7XG4gICAgICB3aGlsZSAodm0gJiYgdm0uJG9wdGlvbnMubmFtZSAhPT0gJ1BhZ2VCb2R5Jykge1xuICAgICAgICBpZiAodHJlZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFyIGxhc3QgPSB0cmVlW3RyZWUubGVuZ3RoIC0gMV07XG4gICAgICAgICAgaWYgKGxhc3QuY29uc3RydWN0b3IgPT09IHZtLmNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICBjdXJyZW50UmVjdXJzaXZlU2VxdWVuY2UrKztcbiAgICAgICAgICAgIHZtID0gdm0uJHBhcmVudDtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50UmVjdXJzaXZlU2VxdWVuY2UgPiAwKSB7XG4gICAgICAgICAgICB0cmVlW3RyZWUubGVuZ3RoIC0gMV0gPSBbbGFzdCwgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlXTtcbiAgICAgICAgICAgIGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICF2bS4kb3B0aW9ucy5pc1Jlc2VydmVkICYmIHRyZWUucHVzaCh2bSk7XG4gICAgICAgIHZtID0gdm0uJHBhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAnXFxuXFxuZm91bmQgaW5cXG5cXG4nICsgdHJlZVxuICAgICAgICAubWFwKGZ1bmN0aW9uICh2bSwgaSkgeyByZXR1cm4gKFwiXCIgKyAoaSA9PT0gMCA/ICctLS0+ICcgOiByZXBlYXQoJyAnLCA1ICsgaSAqIDIpKSArIChBcnJheS5pc0FycmF5KHZtKVxuICAgICAgICAgICAgPyAoKGZvcm1hdENvbXBvbmVudE5hbWUodm1bMF0pKSArIFwiLi4uIChcIiArICh2bVsxXSkgKyBcIiByZWN1cnNpdmUgY2FsbHMpXCIpXG4gICAgICAgICAgICA6IGZvcm1hdENvbXBvbmVudE5hbWUodm0pKSk7IH0pXG4gICAgICAgIC5qb2luKCdcXG4nKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKFwiXFxuXFxuKGZvdW5kIGluIFwiICsgKGZvcm1hdENvbXBvbmVudE5hbWUodm0pKSArIFwiKVwiKVxuICAgIH1cbiAgfTtcbn1cblxuLyogICovXG5cbnZhciB1aWQgPSAwO1xuXG4vKipcbiAqIEEgZGVwIGlzIGFuIG9ic2VydmFibGUgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZVxuICogZGlyZWN0aXZlcyBzdWJzY3JpYmluZyB0byBpdC5cbiAqL1xudmFyIERlcCA9IGZ1bmN0aW9uIERlcCAoKSB7XG4gIHRoaXMuaWQgPSB1aWQrKztcbiAgdGhpcy5zdWJzID0gW107XG59O1xuXG5EZXAucHJvdG90eXBlLmFkZFN1YiA9IGZ1bmN0aW9uIGFkZFN1YiAoc3ViKSB7XG4gIHRoaXMuc3Vicy5wdXNoKHN1Yik7XG59O1xuXG5EZXAucHJvdG90eXBlLnJlbW92ZVN1YiA9IGZ1bmN0aW9uIHJlbW92ZVN1YiAoc3ViKSB7XG4gIHJlbW92ZSh0aGlzLnN1YnMsIHN1Yik7XG59O1xuXG5EZXAucHJvdG90eXBlLmRlcGVuZCA9IGZ1bmN0aW9uIGRlcGVuZCAoKSB7XG4gIGlmIChEZXAuU2hhcmVkT2JqZWN0LnRhcmdldCkge1xuICAgIERlcC5TaGFyZWRPYmplY3QudGFyZ2V0LmFkZERlcCh0aGlzKTtcbiAgfVxufTtcblxuRGVwLnByb3RvdHlwZS5ub3RpZnkgPSBmdW5jdGlvbiBub3RpZnkgKCkge1xuICAvLyBzdGFiaWxpemUgdGhlIHN1YnNjcmliZXIgbGlzdCBmaXJzdFxuICB2YXIgc3VicyA9IHRoaXMuc3Vicy5zbGljZSgpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhY29uZmlnLmFzeW5jKSB7XG4gICAgLy8gc3VicyBhcmVuJ3Qgc29ydGVkIGluIHNjaGVkdWxlciBpZiBub3QgcnVubmluZyBhc3luY1xuICAgIC8vIHdlIG5lZWQgdG8gc29ydCB0aGVtIG5vdyB0byBtYWtlIHN1cmUgdGhleSBmaXJlIGluIGNvcnJlY3RcbiAgICAvLyBvcmRlclxuICAgIHN1YnMuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYS5pZCAtIGIuaWQ7IH0pO1xuICB9XG4gIGZvciAodmFyIGkgPSAwLCBsID0gc3Vicy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBzdWJzW2ldLnVwZGF0ZSgpO1xuICB9XG59O1xuXG4vLyBUaGUgY3VycmVudCB0YXJnZXQgd2F0Y2hlciBiZWluZyBldmFsdWF0ZWQuXG4vLyBUaGlzIGlzIGdsb2JhbGx5IHVuaXF1ZSBiZWNhdXNlIG9ubHkgb25lIHdhdGNoZXJcbi8vIGNhbiBiZSBldmFsdWF0ZWQgYXQgYSB0aW1lLlxuLy8gZml4ZWQgYnkgeHh4eHh4IChudnVlIHNoYXJlZCB2dWV4KVxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbkRlcC5TaGFyZWRPYmplY3QgPSB7fTtcbkRlcC5TaGFyZWRPYmplY3QudGFyZ2V0ID0gbnVsbDtcbkRlcC5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2sgPSBbXTtcblxuZnVuY3Rpb24gcHVzaFRhcmdldCAodGFyZ2V0KSB7XG4gIERlcC5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2sucHVzaCh0YXJnZXQpO1xuICBEZXAuU2hhcmVkT2JqZWN0LnRhcmdldCA9IHRhcmdldDtcbiAgRGVwLnRhcmdldCA9IHRhcmdldDtcbn1cblxuZnVuY3Rpb24gcG9wVGFyZ2V0ICgpIHtcbiAgRGVwLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjay5wb3AoKTtcbiAgRGVwLlNoYXJlZE9iamVjdC50YXJnZXQgPSBEZXAuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrW0RlcC5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2subGVuZ3RoIC0gMV07XG4gIERlcC50YXJnZXQgPSBEZXAuU2hhcmVkT2JqZWN0LnRhcmdldDtcbn1cblxuLyogICovXG5cbnZhciBWTm9kZSA9IGZ1bmN0aW9uIFZOb2RlIChcbiAgdGFnLFxuICBkYXRhLFxuICBjaGlsZHJlbixcbiAgdGV4dCxcbiAgZWxtLFxuICBjb250ZXh0LFxuICBjb21wb25lbnRPcHRpb25zLFxuICBhc3luY0ZhY3Rvcnlcbikge1xuICB0aGlzLnRhZyA9IHRhZztcbiAgdGhpcy5kYXRhID0gZGF0YTtcbiAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB0aGlzLnRleHQgPSB0ZXh0O1xuICB0aGlzLmVsbSA9IGVsbTtcbiAgdGhpcy5ucyA9IHVuZGVmaW5lZDtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5mbkNvbnRleHQgPSB1bmRlZmluZWQ7XG4gIHRoaXMuZm5PcHRpb25zID0gdW5kZWZpbmVkO1xuICB0aGlzLmZuU2NvcGVJZCA9IHVuZGVmaW5lZDtcbiAgdGhpcy5rZXkgPSBkYXRhICYmIGRhdGEua2V5O1xuICB0aGlzLmNvbXBvbmVudE9wdGlvbnMgPSBjb21wb25lbnRPcHRpb25zO1xuICB0aGlzLmNvbXBvbmVudEluc3RhbmNlID0gdW5kZWZpbmVkO1xuICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZDtcbiAgdGhpcy5yYXcgPSBmYWxzZTtcbiAgdGhpcy5pc1N0YXRpYyA9IGZhbHNlO1xuICB0aGlzLmlzUm9vdEluc2VydCA9IHRydWU7XG4gIHRoaXMuaXNDb21tZW50ID0gZmFsc2U7XG4gIHRoaXMuaXNDbG9uZWQgPSBmYWxzZTtcbiAgdGhpcy5pc09uY2UgPSBmYWxzZTtcbiAgdGhpcy5hc3luY0ZhY3RvcnkgPSBhc3luY0ZhY3Rvcnk7XG4gIHRoaXMuYXN5bmNNZXRhID0gdW5kZWZpbmVkO1xuICB0aGlzLmlzQXN5bmNQbGFjZWhvbGRlciA9IGZhbHNlO1xufTtcblxudmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgY2hpbGQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuLy8gREVQUkVDQVRFRDogYWxpYXMgZm9yIGNvbXBvbmVudEluc3RhbmNlIGZvciBiYWNrd2FyZHMgY29tcGF0LlxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnByb3RvdHlwZUFjY2Vzc29ycy5jaGlsZC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmNvbXBvbmVudEluc3RhbmNlXG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggVk5vZGUucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxudmFyIGNyZWF0ZUVtcHR5Vk5vZGUgPSBmdW5jdGlvbiAodGV4dCkge1xuICBpZiAoIHRleHQgPT09IHZvaWQgMCApIHRleHQgPSAnJztcblxuICB2YXIgbm9kZSA9IG5ldyBWTm9kZSgpO1xuICBub2RlLnRleHQgPSB0ZXh0O1xuICBub2RlLmlzQ29tbWVudCA9IHRydWU7XG4gIHJldHVybiBub2RlXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVUZXh0Vk5vZGUgKHZhbCkge1xuICByZXR1cm4gbmV3IFZOb2RlKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFN0cmluZyh2YWwpKVxufVxuXG4vLyBvcHRpbWl6ZWQgc2hhbGxvdyBjbG9uZVxuLy8gdXNlZCBmb3Igc3RhdGljIG5vZGVzIGFuZCBzbG90IG5vZGVzIGJlY2F1c2UgdGhleSBtYXkgYmUgcmV1c2VkIGFjcm9zc1xuLy8gbXVsdGlwbGUgcmVuZGVycywgY2xvbmluZyB0aGVtIGF2b2lkcyBlcnJvcnMgd2hlbiBET00gbWFuaXB1bGF0aW9ucyByZWx5XG4vLyBvbiB0aGVpciBlbG0gcmVmZXJlbmNlLlxuZnVuY3Rpb24gY2xvbmVWTm9kZSAodm5vZGUpIHtcbiAgdmFyIGNsb25lZCA9IG5ldyBWTm9kZShcbiAgICB2bm9kZS50YWcsXG4gICAgdm5vZGUuZGF0YSxcbiAgICAvLyAjNzk3NVxuICAgIC8vIGNsb25lIGNoaWxkcmVuIGFycmF5IHRvIGF2b2lkIG11dGF0aW5nIG9yaWdpbmFsIGluIGNhc2Ugb2YgY2xvbmluZ1xuICAgIC8vIGEgY2hpbGQuXG4gICAgdm5vZGUuY2hpbGRyZW4gJiYgdm5vZGUuY2hpbGRyZW4uc2xpY2UoKSxcbiAgICB2bm9kZS50ZXh0LFxuICAgIHZub2RlLmVsbSxcbiAgICB2bm9kZS5jb250ZXh0LFxuICAgIHZub2RlLmNvbXBvbmVudE9wdGlvbnMsXG4gICAgdm5vZGUuYXN5bmNGYWN0b3J5XG4gICk7XG4gIGNsb25lZC5ucyA9IHZub2RlLm5zO1xuICBjbG9uZWQuaXNTdGF0aWMgPSB2bm9kZS5pc1N0YXRpYztcbiAgY2xvbmVkLmtleSA9IHZub2RlLmtleTtcbiAgY2xvbmVkLmlzQ29tbWVudCA9IHZub2RlLmlzQ29tbWVudDtcbiAgY2xvbmVkLmZuQ29udGV4dCA9IHZub2RlLmZuQ29udGV4dDtcbiAgY2xvbmVkLmZuT3B0aW9ucyA9IHZub2RlLmZuT3B0aW9ucztcbiAgY2xvbmVkLmZuU2NvcGVJZCA9IHZub2RlLmZuU2NvcGVJZDtcbiAgY2xvbmVkLmFzeW5jTWV0YSA9IHZub2RlLmFzeW5jTWV0YTtcbiAgY2xvbmVkLmlzQ2xvbmVkID0gdHJ1ZTtcbiAgcmV0dXJuIGNsb25lZFxufVxuXG4vKlxuICogbm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoXG4gKiBkeW5hbWljYWxseSBhY2Nlc3NpbmcgbWV0aG9kcyBvbiBBcnJheSBwcm90b3R5cGVcbiAqL1xuXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcbnZhciBhcnJheU1ldGhvZHMgPSBPYmplY3QuY3JlYXRlKGFycmF5UHJvdG8pO1xuXG52YXIgbWV0aG9kc1RvUGF0Y2ggPSBbXG4gICdwdXNoJyxcbiAgJ3BvcCcsXG4gICdzaGlmdCcsXG4gICd1bnNoaWZ0JyxcbiAgJ3NwbGljZScsXG4gICdzb3J0JyxcbiAgJ3JldmVyc2UnXG5dO1xuXG4vKipcbiAqIEludGVyY2VwdCBtdXRhdGluZyBtZXRob2RzIGFuZCBlbWl0IGV2ZW50c1xuICovXG5tZXRob2RzVG9QYXRjaC5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgLy8gY2FjaGUgb3JpZ2luYWwgbWV0aG9kXG4gIHZhciBvcmlnaW5hbCA9IGFycmF5UHJvdG9bbWV0aG9kXTtcbiAgZGVmKGFycmF5TWV0aG9kcywgbWV0aG9kLCBmdW5jdGlvbiBtdXRhdG9yICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICB2YXIgcmVzdWx0ID0gb3JpZ2luYWwuYXBwbHkodGhpcywgYXJncyk7XG4gICAgdmFyIG9iID0gdGhpcy5fX29iX187XG4gICAgdmFyIGluc2VydGVkO1xuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdwdXNoJzpcbiAgICAgIGNhc2UgJ3Vuc2hpZnQnOlxuICAgICAgICBpbnNlcnRlZCA9IGFyZ3M7XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdzcGxpY2UnOlxuICAgICAgICBpbnNlcnRlZCA9IGFyZ3Muc2xpY2UoMik7XG4gICAgICAgIGJyZWFrXG4gICAgfVxuICAgIGlmIChpbnNlcnRlZCkgeyBvYi5vYnNlcnZlQXJyYXkoaW5zZXJ0ZWQpOyB9XG4gICAgLy8gbm90aWZ5IGNoYW5nZVxuICAgIG9iLmRlcC5ub3RpZnkoKTtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH0pO1xufSk7XG5cbi8qICAqL1xuXG52YXIgYXJyYXlLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXJyYXlNZXRob2RzKTtcblxuLyoqXG4gKiBJbiBzb21lIGNhc2VzIHdlIG1heSB3YW50IHRvIGRpc2FibGUgb2JzZXJ2YXRpb24gaW5zaWRlIGEgY29tcG9uZW50J3NcbiAqIHVwZGF0ZSBjb21wdXRhdGlvbi5cbiAqL1xudmFyIHNob3VsZE9ic2VydmUgPSB0cnVlO1xuXG5mdW5jdGlvbiB0b2dnbGVPYnNlcnZpbmcgKHZhbHVlKSB7XG4gIHNob3VsZE9ic2VydmUgPSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBPYnNlcnZlciBjbGFzcyB0aGF0IGlzIGF0dGFjaGVkIHRvIGVhY2ggb2JzZXJ2ZWRcbiAqIG9iamVjdC4gT25jZSBhdHRhY2hlZCwgdGhlIG9ic2VydmVyIGNvbnZlcnRzIHRoZSB0YXJnZXRcbiAqIG9iamVjdCdzIHByb3BlcnR5IGtleXMgaW50byBnZXR0ZXIvc2V0dGVycyB0aGF0XG4gKiBjb2xsZWN0IGRlcGVuZGVuY2llcyBhbmQgZGlzcGF0Y2ggdXBkYXRlcy5cbiAqL1xudmFyIE9ic2VydmVyID0gZnVuY3Rpb24gT2JzZXJ2ZXIgKHZhbHVlKSB7XG4gIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgdGhpcy5kZXAgPSBuZXcgRGVwKCk7XG4gIHRoaXMudm1Db3VudCA9IDA7XG4gIGRlZih2YWx1ZSwgJ19fb2JfXycsIHRoaXMpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBpZiAoaGFzUHJvdG8pIHtcbiAgICAgIHsvLyBmaXhlZCBieSB4eHh4eHgg5b6u5L+h5bCP56iL5bqP5L2/55SoIHBsdWdpbnMg5LmL5ZCO77yM5pWw57uE5pa55rOV6KKr55u05o6l5oyC6L295Yiw5LqG5pWw57uE5a+56LGh5LiK77yM6ZyA6KaB5omn6KGMIGNvcHlBdWdtZW50IOmAu+i+kVxuICAgICAgICBpZih2YWx1ZS5wdXNoICE9PSB2YWx1ZS5fX3Byb3RvX18ucHVzaCl7XG4gICAgICAgICAgY29weUF1Z21lbnQodmFsdWUsIGFycmF5TWV0aG9kcywgYXJyYXlLZXlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm90b0F1Z21lbnQodmFsdWUsIGFycmF5TWV0aG9kcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29weUF1Z21lbnQodmFsdWUsIGFycmF5TWV0aG9kcywgYXJyYXlLZXlzKTtcbiAgICB9XG4gICAgdGhpcy5vYnNlcnZlQXJyYXkodmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMud2Fsayh2YWx1ZSk7XG4gIH1cbn07XG5cbi8qKlxuICogV2FsayB0aHJvdWdoIGFsbCBwcm9wZXJ0aWVzIGFuZCBjb252ZXJ0IHRoZW0gaW50b1xuICogZ2V0dGVyL3NldHRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuXG4gKiB2YWx1ZSB0eXBlIGlzIE9iamVjdC5cbiAqL1xuT2JzZXJ2ZXIucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiB3YWxrIChvYmopIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBkZWZpbmVSZWFjdGl2ZSQkMShvYmosIGtleXNbaV0pO1xuICB9XG59O1xuXG4vKipcbiAqIE9ic2VydmUgYSBsaXN0IG9mIEFycmF5IGl0ZW1zLlxuICovXG5PYnNlcnZlci5wcm90b3R5cGUub2JzZXJ2ZUFycmF5ID0gZnVuY3Rpb24gb2JzZXJ2ZUFycmF5IChpdGVtcykge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGl0ZW1zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIG9ic2VydmUoaXRlbXNbaV0pO1xuICB9XG59O1xuXG4vLyBoZWxwZXJzXG5cbi8qKlxuICogQXVnbWVudCBhIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgaW50ZXJjZXB0aW5nXG4gKiB0aGUgcHJvdG90eXBlIGNoYWluIHVzaW5nIF9fcHJvdG9fX1xuICovXG5mdW5jdGlvbiBwcm90b0F1Z21lbnQgKHRhcmdldCwgc3JjKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG4gIHRhcmdldC5fX3Byb3RvX18gPSBzcmM7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi9cbn1cblxuLyoqXG4gKiBBdWdtZW50IGEgdGFyZ2V0IE9iamVjdCBvciBBcnJheSBieSBkZWZpbmluZ1xuICogaGlkZGVuIHByb3BlcnRpZXMuXG4gKi9cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBjb3B5QXVnbWVudCAodGFyZ2V0LCBzcmMsIGtleXMpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGRlZih0YXJnZXQsIGtleSwgc3JjW2tleV0pO1xuICB9XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byBjcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIGEgdmFsdWUsXG4gKiByZXR1cm5zIHRoZSBuZXcgb2JzZXJ2ZXIgaWYgc3VjY2Vzc2Z1bGx5IG9ic2VydmVkLFxuICogb3IgdGhlIGV4aXN0aW5nIG9ic2VydmVyIGlmIHRoZSB2YWx1ZSBhbHJlYWR5IGhhcyBvbmUuXG4gKi9cbmZ1bmN0aW9uIG9ic2VydmUgKHZhbHVlLCBhc1Jvb3REYXRhKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgVk5vZGUpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgb2I7XG4gIGlmIChoYXNPd24odmFsdWUsICdfX29iX18nKSAmJiB2YWx1ZS5fX29iX18gaW5zdGFuY2VvZiBPYnNlcnZlcikge1xuICAgIG9iID0gdmFsdWUuX19vYl9fO1xuICB9IGVsc2UgaWYgKFxuICAgIHNob3VsZE9ic2VydmUgJiZcbiAgICAhaXNTZXJ2ZXJSZW5kZXJpbmcoKSAmJlxuICAgIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBpc1BsYWluT2JqZWN0KHZhbHVlKSkgJiZcbiAgICBPYmplY3QuaXNFeHRlbnNpYmxlKHZhbHVlKSAmJlxuICAgICF2YWx1ZS5faXNWdWUgJiZcbiAgICAhdmFsdWUuX192X2lzTVBDb21wb25lbnRcbiAgKSB7XG4gICAgb2IgPSBuZXcgT2JzZXJ2ZXIodmFsdWUpO1xuICB9XG4gIGlmIChhc1Jvb3REYXRhICYmIG9iKSB7XG4gICAgb2Iudm1Db3VudCsrO1xuICB9XG4gIHJldHVybiBvYlxufVxuXG4vKipcbiAqIERlZmluZSBhIHJlYWN0aXZlIHByb3BlcnR5IG9uIGFuIE9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZGVmaW5lUmVhY3RpdmUkJDEgKFxuICBvYmosXG4gIGtleSxcbiAgdmFsLFxuICBjdXN0b21TZXR0ZXIsXG4gIHNoYWxsb3dcbikge1xuICB2YXIgZGVwID0gbmV3IERlcCgpO1xuXG4gIHZhciBwcm9wZXJ0eSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpO1xuICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHkuY29uZmlndXJhYmxlID09PSBmYWxzZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gY2F0ZXIgZm9yIHByZS1kZWZpbmVkIGdldHRlci9zZXR0ZXJzXG4gIHZhciBnZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5nZXQ7XG4gIHZhciBzZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5zZXQ7XG4gIGlmICgoIWdldHRlciB8fCBzZXR0ZXIpICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICB2YWwgPSBvYmpba2V5XTtcbiAgfVxuXG4gIHZhciBjaGlsZE9iID0gIXNoYWxsb3cgJiYgb2JzZXJ2ZSh2YWwpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGdldHRlciA/IGdldHRlci5jYWxsKG9iaikgOiB2YWw7XG4gICAgICBpZiAoRGVwLlNoYXJlZE9iamVjdC50YXJnZXQpIHsgLy8gZml4ZWQgYnkgeHh4eHh4XG4gICAgICAgIGRlcC5kZXBlbmQoKTtcbiAgICAgICAgaWYgKGNoaWxkT2IpIHtcbiAgICAgICAgICBjaGlsZE9iLmRlcC5kZXBlbmQoKTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGRlcGVuZEFycmF5KHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiByZWFjdGl2ZVNldHRlciAobmV3VmFsKSB7XG4gICAgICB2YXIgdmFsdWUgPSBnZXR0ZXIgPyBnZXR0ZXIuY2FsbChvYmopIDogdmFsO1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlICovXG4gICAgICBpZiAobmV3VmFsID09PSB2YWx1ZSB8fCAobmV3VmFsICE9PSBuZXdWYWwgJiYgdmFsdWUgIT09IHZhbHVlKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlICovXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBjdXN0b21TZXR0ZXIpIHtcbiAgICAgICAgY3VzdG9tU2V0dGVyKCk7XG4gICAgICB9XG4gICAgICAvLyAjNzk4MTogZm9yIGFjY2Vzc29yIHByb3BlcnRpZXMgd2l0aG91dCBzZXR0ZXJcbiAgICAgIGlmIChnZXR0ZXIgJiYgIXNldHRlcikgeyByZXR1cm4gfVxuICAgICAgaWYgKHNldHRlcikge1xuICAgICAgICBzZXR0ZXIuY2FsbChvYmosIG5ld1ZhbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWwgPSBuZXdWYWw7XG4gICAgICB9XG4gICAgICBjaGlsZE9iID0gIXNoYWxsb3cgJiYgb2JzZXJ2ZShuZXdWYWwpO1xuICAgICAgZGVwLm5vdGlmeSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogU2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBBZGRzIHRoZSBuZXcgcHJvcGVydHkgYW5kXG4gKiB0cmlnZ2VycyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIHRoZSBwcm9wZXJ0eSBkb2Vzbid0XG4gKiBhbHJlYWR5IGV4aXN0LlxuICovXG5mdW5jdGlvbiBzZXQgKHRhcmdldCwga2V5LCB2YWwpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAoaXNVbmRlZih0YXJnZXQpIHx8IGlzUHJpbWl0aXZlKHRhcmdldCkpXG4gICkge1xuICAgIHdhcm4oKFwiQ2Fubm90IHNldCByZWFjdGl2ZSBwcm9wZXJ0eSBvbiB1bmRlZmluZWQsIG51bGwsIG9yIHByaW1pdGl2ZSB2YWx1ZTogXCIgKyAoKHRhcmdldCkpKSk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiBpc1ZhbGlkQXJyYXlJbmRleChrZXkpKSB7XG4gICAgdGFyZ2V0Lmxlbmd0aCA9IE1hdGgubWF4KHRhcmdldC5sZW5ndGgsIGtleSk7XG4gICAgdGFyZ2V0LnNwbGljZShrZXksIDEsIHZhbCk7XG4gICAgcmV0dXJuIHZhbFxuICB9XG4gIGlmIChrZXkgaW4gdGFyZ2V0ICYmICEoa2V5IGluIE9iamVjdC5wcm90b3R5cGUpKSB7XG4gICAgdGFyZ2V0W2tleV0gPSB2YWw7XG4gICAgcmV0dXJuIHZhbFxuICB9XG4gIHZhciBvYiA9ICh0YXJnZXQpLl9fb2JfXztcbiAgaWYgKHRhcmdldC5faXNWdWUgfHwgKG9iICYmIG9iLnZtQ291bnQpKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgJ0F2b2lkIGFkZGluZyByZWFjdGl2ZSBwcm9wZXJ0aWVzIHRvIGEgVnVlIGluc3RhbmNlIG9yIGl0cyByb290ICRkYXRhICcgK1xuICAgICAgJ2F0IHJ1bnRpbWUgLSBkZWNsYXJlIGl0IHVwZnJvbnQgaW4gdGhlIGRhdGEgb3B0aW9uLidcbiAgICApO1xuICAgIHJldHVybiB2YWxcbiAgfVxuICBpZiAoIW9iKSB7XG4gICAgdGFyZ2V0W2tleV0gPSB2YWw7XG4gICAgcmV0dXJuIHZhbFxuICB9XG4gIGRlZmluZVJlYWN0aXZlJCQxKG9iLnZhbHVlLCBrZXksIHZhbCk7XG4gIG9iLmRlcC5ub3RpZnkoKTtcbiAgcmV0dXJuIHZhbFxufVxuXG4vKipcbiAqIERlbGV0ZSBhIHByb3BlcnR5IGFuZCB0cmlnZ2VyIGNoYW5nZSBpZiBuZWNlc3NhcnkuXG4gKi9cbmZ1bmN0aW9uIGRlbCAodGFyZ2V0LCBrZXkpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAoaXNVbmRlZih0YXJnZXQpIHx8IGlzUHJpbWl0aXZlKHRhcmdldCkpXG4gICkge1xuICAgIHdhcm4oKFwiQ2Fubm90IGRlbGV0ZSByZWFjdGl2ZSBwcm9wZXJ0eSBvbiB1bmRlZmluZWQsIG51bGwsIG9yIHByaW1pdGl2ZSB2YWx1ZTogXCIgKyAoKHRhcmdldCkpKSk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiBpc1ZhbGlkQXJyYXlJbmRleChrZXkpKSB7XG4gICAgdGFyZ2V0LnNwbGljZShrZXksIDEpO1xuICAgIHJldHVyblxuICB9XG4gIHZhciBvYiA9ICh0YXJnZXQpLl9fb2JfXztcbiAgaWYgKHRhcmdldC5faXNWdWUgfHwgKG9iICYmIG9iLnZtQ291bnQpKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgJ0F2b2lkIGRlbGV0aW5nIHByb3BlcnRpZXMgb24gYSBWdWUgaW5zdGFuY2Ugb3IgaXRzIHJvb3QgJGRhdGEgJyArXG4gICAgICAnLSBqdXN0IHNldCBpdCB0byBudWxsLidcbiAgICApO1xuICAgIHJldHVyblxuICB9XG4gIGlmICghaGFzT3duKHRhcmdldCwga2V5KSkge1xuICAgIHJldHVyblxuICB9XG4gIGRlbGV0ZSB0YXJnZXRba2V5XTtcbiAgaWYgKCFvYikge1xuICAgIHJldHVyblxuICB9XG4gIG9iLmRlcC5ub3RpZnkoKTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGRlcGVuZGVuY2llcyBvbiBhcnJheSBlbGVtZW50cyB3aGVuIHRoZSBhcnJheSBpcyB0b3VjaGVkLCBzaW5jZVxuICogd2UgY2Fubm90IGludGVyY2VwdCBhcnJheSBlbGVtZW50IGFjY2VzcyBsaWtlIHByb3BlcnR5IGdldHRlcnMuXG4gKi9cbmZ1bmN0aW9uIGRlcGVuZEFycmF5ICh2YWx1ZSkge1xuICBmb3IgKHZhciBlID0gKHZvaWQgMCksIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZSA9IHZhbHVlW2ldO1xuICAgIGUgJiYgZS5fX29iX18gJiYgZS5fX29iX18uZGVwLmRlcGVuZCgpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7XG4gICAgICBkZXBlbmRBcnJheShlKTtcbiAgICB9XG4gIH1cbn1cblxuLyogICovXG5cbi8qKlxuICogT3B0aW9uIG92ZXJ3cml0aW5nIHN0cmF0ZWdpZXMgYXJlIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZVxuICogaG93IHRvIG1lcmdlIGEgcGFyZW50IG9wdGlvbiB2YWx1ZSBhbmQgYSBjaGlsZCBvcHRpb25cbiAqIHZhbHVlIGludG8gdGhlIGZpbmFsIHZhbHVlLlxuICovXG52YXIgc3RyYXRzID0gY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llcztcblxuLyoqXG4gKiBPcHRpb25zIHdpdGggcmVzdHJpY3Rpb25zXG4gKi9cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHN0cmF0cy5lbCA9IHN0cmF0cy5wcm9wc0RhdGEgPSBmdW5jdGlvbiAocGFyZW50LCBjaGlsZCwgdm0sIGtleSkge1xuICAgIGlmICghdm0pIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIFwib3B0aW9uIFxcXCJcIiArIGtleSArIFwiXFxcIiBjYW4gb25seSBiZSB1c2VkIGR1cmluZyBpbnN0YW5jZSBcIiArXG4gICAgICAgICdjcmVhdGlvbiB3aXRoIHRoZSBgbmV3YCBrZXl3b3JkLidcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0U3RyYXQocGFyZW50LCBjaGlsZClcbiAgfTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdGhhdCByZWN1cnNpdmVseSBtZXJnZXMgdHdvIGRhdGEgb2JqZWN0cyB0b2dldGhlci5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VEYXRhICh0bywgZnJvbSkge1xuICBpZiAoIWZyb20pIHsgcmV0dXJuIHRvIH1cbiAgdmFyIGtleSwgdG9WYWwsIGZyb21WYWw7XG5cbiAgdmFyIGtleXMgPSBoYXNTeW1ib2xcbiAgICA/IFJlZmxlY3Qub3duS2V5cyhmcm9tKVxuICAgIDogT2JqZWN0LmtleXMoZnJvbSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0ga2V5c1tpXTtcbiAgICAvLyBpbiBjYXNlIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBvYnNlcnZlZC4uLlxuICAgIGlmIChrZXkgPT09ICdfX29iX18nKSB7IGNvbnRpbnVlIH1cbiAgICB0b1ZhbCA9IHRvW2tleV07XG4gICAgZnJvbVZhbCA9IGZyb21ba2V5XTtcbiAgICBpZiAoIWhhc093bih0bywga2V5KSkge1xuICAgICAgc2V0KHRvLCBrZXksIGZyb21WYWwpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0b1ZhbCAhPT0gZnJvbVZhbCAmJlxuICAgICAgaXNQbGFpbk9iamVjdCh0b1ZhbCkgJiZcbiAgICAgIGlzUGxhaW5PYmplY3QoZnJvbVZhbClcbiAgICApIHtcbiAgICAgIG1lcmdlRGF0YSh0b1ZhbCwgZnJvbVZhbCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0b1xufVxuXG4vKipcbiAqIERhdGFcbiAqL1xuZnVuY3Rpb24gbWVyZ2VEYXRhT3JGbiAoXG4gIHBhcmVudFZhbCxcbiAgY2hpbGRWYWwsXG4gIHZtXG4pIHtcbiAgaWYgKCF2bSkge1xuICAgIC8vIGluIGEgVnVlLmV4dGVuZCBtZXJnZSwgYm90aCBzaG91bGQgYmUgZnVuY3Rpb25zXG4gICAgaWYgKCFjaGlsZFZhbCkge1xuICAgICAgcmV0dXJuIHBhcmVudFZhbFxuICAgIH1cbiAgICBpZiAoIXBhcmVudFZhbCkge1xuICAgICAgcmV0dXJuIGNoaWxkVmFsXG4gICAgfVxuICAgIC8vIHdoZW4gcGFyZW50VmFsICYgY2hpbGRWYWwgYXJlIGJvdGggcHJlc2VudCxcbiAgICAvLyB3ZSBuZWVkIHRvIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGVcbiAgICAvLyBtZXJnZWQgcmVzdWx0IG9mIGJvdGggZnVuY3Rpb25zLi4uIG5vIG5lZWQgdG9cbiAgICAvLyBjaGVjayBpZiBwYXJlbnRWYWwgaXMgYSBmdW5jdGlvbiBoZXJlIGJlY2F1c2VcbiAgICAvLyBpdCBoYXMgdG8gYmUgYSBmdW5jdGlvbiB0byBwYXNzIHByZXZpb3VzIG1lcmdlcy5cbiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkRGF0YUZuICgpIHtcbiAgICAgIHJldHVybiBtZXJnZURhdGEoXG4gICAgICAgIHR5cGVvZiBjaGlsZFZhbCA9PT0gJ2Z1bmN0aW9uJyA/IGNoaWxkVmFsLmNhbGwodGhpcywgdGhpcykgOiBjaGlsZFZhbCxcbiAgICAgICAgdHlwZW9mIHBhcmVudFZhbCA9PT0gJ2Z1bmN0aW9uJyA/IHBhcmVudFZhbC5jYWxsKHRoaXMsIHRoaXMpIDogcGFyZW50VmFsXG4gICAgICApXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZWRJbnN0YW5jZURhdGFGbiAoKSB7XG4gICAgICAvLyBpbnN0YW5jZSBtZXJnZVxuICAgICAgdmFyIGluc3RhbmNlRGF0YSA9IHR5cGVvZiBjaGlsZFZhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IGNoaWxkVmFsLmNhbGwodm0sIHZtKVxuICAgICAgICA6IGNoaWxkVmFsO1xuICAgICAgdmFyIGRlZmF1bHREYXRhID0gdHlwZW9mIHBhcmVudFZhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHBhcmVudFZhbC5jYWxsKHZtLCB2bSlcbiAgICAgICAgOiBwYXJlbnRWYWw7XG4gICAgICBpZiAoaW5zdGFuY2VEYXRhKSB7XG4gICAgICAgIHJldHVybiBtZXJnZURhdGEoaW5zdGFuY2VEYXRhLCBkZWZhdWx0RGF0YSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0RGF0YVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5zdHJhdHMuZGF0YSA9IGZ1bmN0aW9uIChcbiAgcGFyZW50VmFsLFxuICBjaGlsZFZhbCxcbiAgdm1cbikge1xuICBpZiAoIXZtKSB7XG4gICAgaWYgKGNoaWxkVmFsICYmIHR5cGVvZiBjaGlsZFZhbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICAnVGhlIFwiZGF0YVwiIG9wdGlvbiBzaG91bGQgYmUgYSBmdW5jdGlvbiAnICtcbiAgICAgICAgJ3RoYXQgcmV0dXJucyBhIHBlci1pbnN0YW5jZSB2YWx1ZSBpbiBjb21wb25lbnQgJyArXG4gICAgICAgICdkZWZpbml0aW9ucy4nLFxuICAgICAgICB2bVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHBhcmVudFZhbFxuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VEYXRhT3JGbihwYXJlbnRWYWwsIGNoaWxkVmFsKVxuICB9XG5cbiAgcmV0dXJuIG1lcmdlRGF0YU9yRm4ocGFyZW50VmFsLCBjaGlsZFZhbCwgdm0pXG59O1xuXG4vKipcbiAqIEhvb2tzIGFuZCBwcm9wcyBhcmUgbWVyZ2VkIGFzIGFycmF5cy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VIb29rIChcbiAgcGFyZW50VmFsLFxuICBjaGlsZFZhbFxuKSB7XG4gIHZhciByZXMgPSBjaGlsZFZhbFxuICAgID8gcGFyZW50VmFsXG4gICAgICA/IHBhcmVudFZhbC5jb25jYXQoY2hpbGRWYWwpXG4gICAgICA6IEFycmF5LmlzQXJyYXkoY2hpbGRWYWwpXG4gICAgICAgID8gY2hpbGRWYWxcbiAgICAgICAgOiBbY2hpbGRWYWxdXG4gICAgOiBwYXJlbnRWYWw7XG4gIHJldHVybiByZXNcbiAgICA/IGRlZHVwZUhvb2tzKHJlcylcbiAgICA6IHJlc1xufVxuXG5mdW5jdGlvbiBkZWR1cGVIb29rcyAoaG9va3MpIHtcbiAgdmFyIHJlcyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlcy5pbmRleE9mKGhvb2tzW2ldKSA9PT0gLTEpIHtcbiAgICAgIHJlcy5wdXNoKGhvb2tzW2ldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5MSUZFQ1lDTEVfSE9PS1MuZm9yRWFjaChmdW5jdGlvbiAoaG9vaykge1xuICBzdHJhdHNbaG9va10gPSBtZXJnZUhvb2s7XG59KTtcblxuLyoqXG4gKiBBc3NldHNcbiAqXG4gKiBXaGVuIGEgdm0gaXMgcHJlc2VudCAoaW5zdGFuY2UgY3JlYXRpb24pLCB3ZSBuZWVkIHRvIGRvXG4gKiBhIHRocmVlLXdheSBtZXJnZSBiZXR3ZWVuIGNvbnN0cnVjdG9yIG9wdGlvbnMsIGluc3RhbmNlXG4gKiBvcHRpb25zIGFuZCBwYXJlbnQgb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VBc3NldHMgKFxuICBwYXJlbnRWYWwsXG4gIGNoaWxkVmFsLFxuICB2bSxcbiAga2V5XG4pIHtcbiAgdmFyIHJlcyA9IE9iamVjdC5jcmVhdGUocGFyZW50VmFsIHx8IG51bGwpO1xuICBpZiAoY2hpbGRWYWwpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGFzc2VydE9iamVjdFR5cGUoa2V5LCBjaGlsZFZhbCwgdm0pO1xuICAgIHJldHVybiBleHRlbmQocmVzLCBjaGlsZFZhbClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVzXG4gIH1cbn1cblxuQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICBzdHJhdHNbdHlwZSArICdzJ10gPSBtZXJnZUFzc2V0cztcbn0pO1xuXG4vKipcbiAqIFdhdGNoZXJzLlxuICpcbiAqIFdhdGNoZXJzIGhhc2hlcyBzaG91bGQgbm90IG92ZXJ3cml0ZSBvbmVcbiAqIGFub3RoZXIsIHNvIHdlIG1lcmdlIHRoZW0gYXMgYXJyYXlzLlxuICovXG5zdHJhdHMud2F0Y2ggPSBmdW5jdGlvbiAoXG4gIHBhcmVudFZhbCxcbiAgY2hpbGRWYWwsXG4gIHZtLFxuICBrZXlcbikge1xuICAvLyB3b3JrIGFyb3VuZCBGaXJlZm94J3MgT2JqZWN0LnByb3RvdHlwZS53YXRjaC4uLlxuICBpZiAocGFyZW50VmFsID09PSBuYXRpdmVXYXRjaCkgeyBwYXJlbnRWYWwgPSB1bmRlZmluZWQ7IH1cbiAgaWYgKGNoaWxkVmFsID09PSBuYXRpdmVXYXRjaCkgeyBjaGlsZFZhbCA9IHVuZGVmaW5lZDsgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKCFjaGlsZFZhbCkgeyByZXR1cm4gT2JqZWN0LmNyZWF0ZShwYXJlbnRWYWwgfHwgbnVsbCkgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydE9iamVjdFR5cGUoa2V5LCBjaGlsZFZhbCwgdm0pO1xuICB9XG4gIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9XG4gIHZhciByZXQgPSB7fTtcbiAgZXh0ZW5kKHJldCwgcGFyZW50VmFsKTtcbiAgZm9yICh2YXIga2V5JDEgaW4gY2hpbGRWYWwpIHtcbiAgICB2YXIgcGFyZW50ID0gcmV0W2tleSQxXTtcbiAgICB2YXIgY2hpbGQgPSBjaGlsZFZhbFtrZXkkMV07XG4gICAgaWYgKHBhcmVudCAmJiAhQXJyYXkuaXNBcnJheShwYXJlbnQpKSB7XG4gICAgICBwYXJlbnQgPSBbcGFyZW50XTtcbiAgICB9XG4gICAgcmV0W2tleSQxXSA9IHBhcmVudFxuICAgICAgPyBwYXJlbnQuY29uY2F0KGNoaWxkKVxuICAgICAgOiBBcnJheS5pc0FycmF5KGNoaWxkKSA/IGNoaWxkIDogW2NoaWxkXTtcbiAgfVxuICByZXR1cm4gcmV0XG59O1xuXG4vKipcbiAqIE90aGVyIG9iamVjdCBoYXNoZXMuXG4gKi9cbnN0cmF0cy5wcm9wcyA9XG5zdHJhdHMubWV0aG9kcyA9XG5zdHJhdHMuaW5qZWN0ID1cbnN0cmF0cy5jb21wdXRlZCA9IGZ1bmN0aW9uIChcbiAgcGFyZW50VmFsLFxuICBjaGlsZFZhbCxcbiAgdm0sXG4gIGtleVxuKSB7XG4gIGlmIChjaGlsZFZhbCAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7XG4gIH1cbiAgaWYgKCFwYXJlbnRWYWwpIHsgcmV0dXJuIGNoaWxkVmFsIH1cbiAgdmFyIHJldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGV4dGVuZChyZXQsIHBhcmVudFZhbCk7XG4gIGlmIChjaGlsZFZhbCkgeyBleHRlbmQocmV0LCBjaGlsZFZhbCk7IH1cbiAgcmV0dXJuIHJldFxufTtcbnN0cmF0cy5wcm92aWRlID0gbWVyZ2VEYXRhT3JGbjtcblxuLyoqXG4gKiBEZWZhdWx0IHN0cmF0ZWd5LlxuICovXG52YXIgZGVmYXVsdFN0cmF0ID0gZnVuY3Rpb24gKHBhcmVudFZhbCwgY2hpbGRWYWwpIHtcbiAgcmV0dXJuIGNoaWxkVmFsID09PSB1bmRlZmluZWRcbiAgICA/IHBhcmVudFZhbFxuICAgIDogY2hpbGRWYWxcbn07XG5cbi8qKlxuICogVmFsaWRhdGUgY29tcG9uZW50IG5hbWVzXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQ29tcG9uZW50cyAob3B0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gb3B0aW9ucy5jb21wb25lbnRzKSB7XG4gICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDb21wb25lbnROYW1lIChuYW1lKSB7XG4gIGlmICghbmV3IFJlZ0V4cCgoXCJeW2EtekEtWl1bXFxcXC1cXFxcLjAtOV9cIiArICh1bmljb2RlUmVnRXhwLnNvdXJjZSkgKyBcIl0qJFwiKSkudGVzdChuYW1lKSkge1xuICAgIHdhcm4oXG4gICAgICAnSW52YWxpZCBjb21wb25lbnQgbmFtZTogXCInICsgbmFtZSArICdcIi4gQ29tcG9uZW50IG5hbWVzICcgK1xuICAgICAgJ3Nob3VsZCBjb25mb3JtIHRvIHZhbGlkIGN1c3RvbSBlbGVtZW50IG5hbWUgaW4gaHRtbDUgc3BlY2lmaWNhdGlvbi4nXG4gICAgKTtcbiAgfVxuICBpZiAoaXNCdWlsdEluVGFnKG5hbWUpIHx8IGNvbmZpZy5pc1Jlc2VydmVkVGFnKG5hbWUpKSB7XG4gICAgd2FybihcbiAgICAgICdEbyBub3QgdXNlIGJ1aWx0LWluIG9yIHJlc2VydmVkIEhUTUwgZWxlbWVudHMgYXMgY29tcG9uZW50ICcgK1xuICAgICAgJ2lkOiAnICsgbmFtZVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBFbnN1cmUgYWxsIHByb3BzIG9wdGlvbiBzeW50YXggYXJlIG5vcm1hbGl6ZWQgaW50byB0aGVcbiAqIE9iamVjdC1iYXNlZCBmb3JtYXQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzIChvcHRpb25zLCB2bSkge1xuICB2YXIgcHJvcHMgPSBvcHRpb25zLnByb3BzO1xuICBpZiAoIXByb3BzKSB7IHJldHVybiB9XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIGksIHZhbCwgbmFtZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkocHJvcHMpKSB7XG4gICAgaSA9IHByb3BzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB2YWwgPSBwcm9wc1tpXTtcbiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICBuYW1lID0gY2FtZWxpemUodmFsKTtcbiAgICAgICAgcmVzW25hbWVdID0geyB0eXBlOiBudWxsIH07XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybigncHJvcHMgbXVzdCBiZSBzdHJpbmdzIHdoZW4gdXNpbmcgYXJyYXkgc3ludGF4LicpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHByb3BzKSkge1xuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFsID0gcHJvcHNba2V5XTtcbiAgICAgIG5hbWUgPSBjYW1lbGl6ZShrZXkpO1xuICAgICAgcmVzW25hbWVdID0gaXNQbGFpbk9iamVjdCh2YWwpXG4gICAgICAgID8gdmFsXG4gICAgICAgIDogeyB0eXBlOiB2YWwgfTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHdhcm4oXG4gICAgICBcIkludmFsaWQgdmFsdWUgZm9yIG9wdGlvbiBcXFwicHJvcHNcXFwiOiBleHBlY3RlZCBhbiBBcnJheSBvciBhbiBPYmplY3QsIFwiICtcbiAgICAgIFwiYnV0IGdvdCBcIiArICh0b1Jhd1R5cGUocHJvcHMpKSArIFwiLlwiLFxuICAgICAgdm1cbiAgICApO1xuICB9XG4gIG9wdGlvbnMucHJvcHMgPSByZXM7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGFsbCBpbmplY3Rpb25zIGludG8gT2JqZWN0LWJhc2VkIGZvcm1hdFxuICovXG5mdW5jdGlvbiBub3JtYWxpemVJbmplY3QgKG9wdGlvbnMsIHZtKSB7XG4gIHZhciBpbmplY3QgPSBvcHRpb25zLmluamVjdDtcbiAgaWYgKCFpbmplY3QpIHsgcmV0dXJuIH1cbiAgdmFyIG5vcm1hbGl6ZWQgPSBvcHRpb25zLmluamVjdCA9IHt9O1xuICBpZiAoQXJyYXkuaXNBcnJheShpbmplY3QpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmplY3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5vcm1hbGl6ZWRbaW5qZWN0W2ldXSA9IHsgZnJvbTogaW5qZWN0W2ldIH07XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoaW5qZWN0KSkge1xuICAgIGZvciAodmFyIGtleSBpbiBpbmplY3QpIHtcbiAgICAgIHZhciB2YWwgPSBpbmplY3Rba2V5XTtcbiAgICAgIG5vcm1hbGl6ZWRba2V5XSA9IGlzUGxhaW5PYmplY3QodmFsKVxuICAgICAgICA/IGV4dGVuZCh7IGZyb206IGtleSB9LCB2YWwpXG4gICAgICAgIDogeyBmcm9tOiB2YWwgfTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHdhcm4oXG4gICAgICBcIkludmFsaWQgdmFsdWUgZm9yIG9wdGlvbiBcXFwiaW5qZWN0XFxcIjogZXhwZWN0ZWQgYW4gQXJyYXkgb3IgYW4gT2JqZWN0LCBcIiArXG4gICAgICBcImJ1dCBnb3QgXCIgKyAodG9SYXdUeXBlKGluamVjdCkpICsgXCIuXCIsXG4gICAgICB2bVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgcmF3IGZ1bmN0aW9uIGRpcmVjdGl2ZXMgaW50byBvYmplY3QgZm9ybWF0LlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzIChvcHRpb25zKSB7XG4gIHZhciBkaXJzID0gb3B0aW9ucy5kaXJlY3RpdmVzO1xuICBpZiAoZGlycykge1xuICAgIGZvciAodmFyIGtleSBpbiBkaXJzKSB7XG4gICAgICB2YXIgZGVmJCQxID0gZGlyc1trZXldO1xuICAgICAgaWYgKHR5cGVvZiBkZWYkJDEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZGlyc1trZXldID0geyBiaW5kOiBkZWYkJDEsIHVwZGF0ZTogZGVmJCQxIH07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydE9iamVjdFR5cGUgKG5hbWUsIHZhbHVlLCB2bSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgd2FybihcbiAgICAgIFwiSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uIFxcXCJcIiArIG5hbWUgKyBcIlxcXCI6IGV4cGVjdGVkIGFuIE9iamVjdCwgXCIgK1xuICAgICAgXCJidXQgZ290IFwiICsgKHRvUmF3VHlwZSh2YWx1ZSkpICsgXCIuXCIsXG4gICAgICB2bVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXJnZSB0d28gb3B0aW9uIG9iamVjdHMgaW50byBhIG5ldyBvbmUuXG4gKiBDb3JlIHV0aWxpdHkgdXNlZCBpbiBib3RoIGluc3RhbnRpYXRpb24gYW5kIGluaGVyaXRhbmNlLlxuICovXG5mdW5jdGlvbiBtZXJnZU9wdGlvbnMgKFxuICBwYXJlbnQsXG4gIGNoaWxkLFxuICB2bVxuKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY2hlY2tDb21wb25lbnRzKGNoaWxkKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgY2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjaGlsZCA9IGNoaWxkLm9wdGlvbnM7XG4gIH1cblxuICBub3JtYWxpemVQcm9wcyhjaGlsZCwgdm0pO1xuICBub3JtYWxpemVJbmplY3QoY2hpbGQsIHZtKTtcbiAgbm9ybWFsaXplRGlyZWN0aXZlcyhjaGlsZCk7XG5cbiAgLy8gQXBwbHkgZXh0ZW5kcyBhbmQgbWl4aW5zIG9uIHRoZSBjaGlsZCBvcHRpb25zLFxuICAvLyBidXQgb25seSBpZiBpdCBpcyBhIHJhdyBvcHRpb25zIG9iamVjdCB0aGF0IGlzbid0XG4gIC8vIHRoZSByZXN1bHQgb2YgYW5vdGhlciBtZXJnZU9wdGlvbnMgY2FsbC5cbiAgLy8gT25seSBtZXJnZWQgb3B0aW9ucyBoYXMgdGhlIF9iYXNlIHByb3BlcnR5LlxuICBpZiAoIWNoaWxkLl9iYXNlKSB7XG4gICAgaWYgKGNoaWxkLmV4dGVuZHMpIHtcbiAgICAgIHBhcmVudCA9IG1lcmdlT3B0aW9ucyhwYXJlbnQsIGNoaWxkLmV4dGVuZHMsIHZtKTtcbiAgICB9XG4gICAgaWYgKGNoaWxkLm1peGlucykge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZC5taXhpbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHBhcmVudCA9IG1lcmdlT3B0aW9ucyhwYXJlbnQsIGNoaWxkLm1peGluc1tpXSwgdm0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBvcHRpb25zID0ge307XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIHBhcmVudCkge1xuICAgIG1lcmdlRmllbGQoa2V5KTtcbiAgfVxuICBmb3IgKGtleSBpbiBjaGlsZCkge1xuICAgIGlmICghaGFzT3duKHBhcmVudCwga2V5KSkge1xuICAgICAgbWVyZ2VGaWVsZChrZXkpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBtZXJnZUZpZWxkIChrZXkpIHtcbiAgICB2YXIgc3RyYXQgPSBzdHJhdHNba2V5XSB8fCBkZWZhdWx0U3RyYXQ7XG4gICAgb3B0aW9uc1trZXldID0gc3RyYXQocGFyZW50W2tleV0sIGNoaWxkW2tleV0sIHZtLCBrZXkpO1xuICB9XG4gIHJldHVybiBvcHRpb25zXG59XG5cbi8qKlxuICogUmVzb2x2ZSBhbiBhc3NldC5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBiZWNhdXNlIGNoaWxkIGluc3RhbmNlcyBuZWVkIGFjY2Vzc1xuICogdG8gYXNzZXRzIGRlZmluZWQgaW4gaXRzIGFuY2VzdG9yIGNoYWluLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQXNzZXQgKFxuICBvcHRpb25zLFxuICB0eXBlLFxuICBpZCxcbiAgd2Fybk1pc3Npbmdcbikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgYXNzZXRzID0gb3B0aW9uc1t0eXBlXTtcbiAgLy8gY2hlY2sgbG9jYWwgcmVnaXN0cmF0aW9uIHZhcmlhdGlvbnMgZmlyc3RcbiAgaWYgKGhhc093bihhc3NldHMsIGlkKSkgeyByZXR1cm4gYXNzZXRzW2lkXSB9XG4gIHZhciBjYW1lbGl6ZWRJZCA9IGNhbWVsaXplKGlkKTtcbiAgaWYgKGhhc093bihhc3NldHMsIGNhbWVsaXplZElkKSkgeyByZXR1cm4gYXNzZXRzW2NhbWVsaXplZElkXSB9XG4gIHZhciBQYXNjYWxDYXNlSWQgPSBjYXBpdGFsaXplKGNhbWVsaXplZElkKTtcbiAgaWYgKGhhc093bihhc3NldHMsIFBhc2NhbENhc2VJZCkpIHsgcmV0dXJuIGFzc2V0c1tQYXNjYWxDYXNlSWRdIH1cbiAgLy8gZmFsbGJhY2sgdG8gcHJvdG90eXBlIGNoYWluXG4gIHZhciByZXMgPSBhc3NldHNbaWRdIHx8IGFzc2V0c1tjYW1lbGl6ZWRJZF0gfHwgYXNzZXRzW1Bhc2NhbENhc2VJZF07XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm5NaXNzaW5nICYmICFyZXMpIHtcbiAgICB3YXJuKFxuICAgICAgJ0ZhaWxlZCB0byByZXNvbHZlICcgKyB0eXBlLnNsaWNlKDAsIC0xKSArICc6ICcgKyBpZCxcbiAgICAgIG9wdGlvbnNcbiAgICApO1xuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyogICovXG5cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3AgKFxuICBrZXksXG4gIHByb3BPcHRpb25zLFxuICBwcm9wc0RhdGEsXG4gIHZtXG4pIHtcbiAgdmFyIHByb3AgPSBwcm9wT3B0aW9uc1trZXldO1xuICB2YXIgYWJzZW50ID0gIWhhc093bihwcm9wc0RhdGEsIGtleSk7XG4gIHZhciB2YWx1ZSA9IHByb3BzRGF0YVtrZXldO1xuICAvLyBib29sZWFuIGNhc3RpbmdcbiAgdmFyIGJvb2xlYW5JbmRleCA9IGdldFR5cGVJbmRleChCb29sZWFuLCBwcm9wLnR5cGUpO1xuICBpZiAoYm9vbGVhbkluZGV4ID4gLTEpIHtcbiAgICBpZiAoYWJzZW50ICYmICFoYXNPd24ocHJvcCwgJ2RlZmF1bHQnKSkge1xuICAgICAgdmFsdWUgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gaHlwaGVuYXRlKGtleSkpIHtcbiAgICAgIC8vIG9ubHkgY2FzdCBlbXB0eSBzdHJpbmcgLyBzYW1lIG5hbWUgdG8gYm9vbGVhbiBpZlxuICAgICAgLy8gYm9vbGVhbiBoYXMgaGlnaGVyIHByaW9yaXR5XG4gICAgICB2YXIgc3RyaW5nSW5kZXggPSBnZXRUeXBlSW5kZXgoU3RyaW5nLCBwcm9wLnR5cGUpO1xuICAgICAgaWYgKHN0cmluZ0luZGV4IDwgMCB8fCBib29sZWFuSW5kZXggPCBzdHJpbmdJbmRleCkge1xuICAgICAgICB2YWx1ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIGNoZWNrIGRlZmF1bHQgdmFsdWVcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICB2YWx1ZSA9IGdldFByb3BEZWZhdWx0VmFsdWUodm0sIHByb3AsIGtleSk7XG4gICAgLy8gc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYSBmcmVzaCBjb3B5LFxuICAgIC8vIG1ha2Ugc3VyZSB0byBvYnNlcnZlIGl0LlxuICAgIHZhciBwcmV2U2hvdWxkT2JzZXJ2ZSA9IHNob3VsZE9ic2VydmU7XG4gICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpO1xuICAgIG9ic2VydmUodmFsdWUpO1xuICAgIHRvZ2dsZU9ic2VydmluZyhwcmV2U2hvdWxkT2JzZXJ2ZSk7XG4gIH1cbiAgaWYgKFxuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAvLyBza2lwIHZhbGlkYXRpb24gZm9yIHdlZXggcmVjeWNsZS1saXN0IGNoaWxkIGNvbXBvbmVudCBwcm9wc1xuICAgICEoZmFsc2UpXG4gICkge1xuICAgIGFzc2VydFByb3AocHJvcCwga2V5LCB2YWx1ZSwgdm0sIGFic2VudCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgcHJvcC5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJvcERlZmF1bHRWYWx1ZSAodm0sIHByb3AsIGtleSkge1xuICAvLyBubyBkZWZhdWx0LCByZXR1cm4gdW5kZWZpbmVkXG4gIGlmICghaGFzT3duKHByb3AsICdkZWZhdWx0JykpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbiAgdmFyIGRlZiA9IHByb3AuZGVmYXVsdDtcbiAgLy8gd2FybiBhZ2FpbnN0IG5vbi1mYWN0b3J5IGRlZmF1bHRzIGZvciBPYmplY3QgJiBBcnJheVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBpc09iamVjdChkZWYpKSB7XG4gICAgd2FybihcbiAgICAgICdJbnZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIHByb3AgXCInICsga2V5ICsgJ1wiOiAnICtcbiAgICAgICdQcm9wcyB3aXRoIHR5cGUgT2JqZWN0L0FycmF5IG11c3QgdXNlIGEgZmFjdG9yeSBmdW5jdGlvbiAnICtcbiAgICAgICd0byByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuJyxcbiAgICAgIHZtXG4gICAgKTtcbiAgfVxuICAvLyB0aGUgcmF3IHByb3AgdmFsdWUgd2FzIGFsc28gdW5kZWZpbmVkIGZyb20gcHJldmlvdXMgcmVuZGVyLFxuICAvLyByZXR1cm4gcHJldmlvdXMgZGVmYXVsdCB2YWx1ZSB0byBhdm9pZCB1bm5lY2Vzc2FyeSB3YXRjaGVyIHRyaWdnZXJcbiAgaWYgKHZtICYmIHZtLiRvcHRpb25zLnByb3BzRGF0YSAmJlxuICAgIHZtLiRvcHRpb25zLnByb3BzRGF0YVtrZXldID09PSB1bmRlZmluZWQgJiZcbiAgICB2bS5fcHJvcHNba2V5XSAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIHJldHVybiB2bS5fcHJvcHNba2V5XVxuICB9XG4gIC8vIGNhbGwgZmFjdG9yeSBmdW5jdGlvbiBmb3Igbm9uLUZ1bmN0aW9uIHR5cGVzXG4gIC8vIGEgdmFsdWUgaXMgRnVuY3Rpb24gaWYgaXRzIHByb3RvdHlwZSBpcyBmdW5jdGlvbiBldmVuIGFjcm9zcyBkaWZmZXJlbnQgZXhlY3V0aW9uIGNvbnRleHRcbiAgcmV0dXJuIHR5cGVvZiBkZWYgPT09ICdmdW5jdGlvbicgJiYgZ2V0VHlwZShwcm9wLnR5cGUpICE9PSAnRnVuY3Rpb24nXG4gICAgPyBkZWYuY2FsbCh2bSlcbiAgICA6IGRlZlxufVxuXG4vKipcbiAqIEFzc2VydCB3aGV0aGVyIGEgcHJvcCBpcyB2YWxpZC5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0UHJvcCAoXG4gIHByb3AsXG4gIG5hbWUsXG4gIHZhbHVlLFxuICB2bSxcbiAgYWJzZW50XG4pIHtcbiAgaWYgKHByb3AucmVxdWlyZWQgJiYgYWJzZW50KSB7XG4gICAgd2FybihcbiAgICAgICdNaXNzaW5nIHJlcXVpcmVkIHByb3A6IFwiJyArIG5hbWUgKyAnXCInLFxuICAgICAgdm1cbiAgICApO1xuICAgIHJldHVyblxuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsICYmICFwcm9wLnJlcXVpcmVkKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIHR5cGUgPSBwcm9wLnR5cGU7XG4gIHZhciB2YWxpZCA9ICF0eXBlIHx8IHR5cGUgPT09IHRydWU7XG4gIHZhciBleHBlY3RlZFR5cGVzID0gW107XG4gIGlmICh0eXBlKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgICB0eXBlID0gW3R5cGVdO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGUubGVuZ3RoICYmICF2YWxpZDsgaSsrKSB7XG4gICAgICB2YXIgYXNzZXJ0ZWRUeXBlID0gYXNzZXJ0VHlwZSh2YWx1ZSwgdHlwZVtpXSk7XG4gICAgICBleHBlY3RlZFR5cGVzLnB1c2goYXNzZXJ0ZWRUeXBlLmV4cGVjdGVkVHlwZSB8fCAnJyk7XG4gICAgICB2YWxpZCA9IGFzc2VydGVkVHlwZS52YWxpZDtcbiAgICB9XG4gIH1cblxuICBpZiAoIXZhbGlkKSB7XG4gICAgd2FybihcbiAgICAgIGdldEludmFsaWRUeXBlTWVzc2FnZShuYW1lLCB2YWx1ZSwgZXhwZWN0ZWRUeXBlcyksXG4gICAgICB2bVxuICAgICk7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIHZhbGlkYXRvciA9IHByb3AudmFsaWRhdG9yO1xuICBpZiAodmFsaWRhdG9yKSB7XG4gICAgaWYgKCF2YWxpZGF0b3IodmFsdWUpKSB7XG4gICAgICB3YXJuKFxuICAgICAgICAnSW52YWxpZCBwcm9wOiBjdXN0b20gdmFsaWRhdG9yIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCBcIicgKyBuYW1lICsgJ1wiLicsXG4gICAgICAgIHZtXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG52YXIgc2ltcGxlQ2hlY2tSRSA9IC9eKFN0cmluZ3xOdW1iZXJ8Qm9vbGVhbnxGdW5jdGlvbnxTeW1ib2wpJC87XG5cbmZ1bmN0aW9uIGFzc2VydFR5cGUgKHZhbHVlLCB0eXBlKSB7XG4gIHZhciB2YWxpZDtcbiAgdmFyIGV4cGVjdGVkVHlwZSA9IGdldFR5cGUodHlwZSk7XG4gIGlmIChzaW1wbGVDaGVja1JFLnRlc3QoZXhwZWN0ZWRUeXBlKSkge1xuICAgIHZhciB0ID0gdHlwZW9mIHZhbHVlO1xuICAgIHZhbGlkID0gdCA9PT0gZXhwZWN0ZWRUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgLy8gZm9yIHByaW1pdGl2ZSB3cmFwcGVyIG9iamVjdHNcbiAgICBpZiAoIXZhbGlkICYmIHQgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YWxpZCA9IHZhbHVlIGluc3RhbmNlb2YgdHlwZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnT2JqZWN0Jykge1xuICAgIHZhbGlkID0gaXNQbGFpbk9iamVjdCh2YWx1ZSk7XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnQXJyYXknKSB7XG4gICAgdmFsaWQgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZCA9IHZhbHVlIGluc3RhbmNlb2YgdHlwZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHZhbGlkOiB2YWxpZCxcbiAgICBleHBlY3RlZFR5cGU6IGV4cGVjdGVkVHlwZVxuICB9XG59XG5cbi8qKlxuICogVXNlIGZ1bmN0aW9uIHN0cmluZyBuYW1lIHRvIGNoZWNrIGJ1aWx0LWluIHR5cGVzLFxuICogYmVjYXVzZSBhIHNpbXBsZSBlcXVhbGl0eSBjaGVjayB3aWxsIGZhaWwgd2hlbiBydW5uaW5nXG4gKiBhY3Jvc3MgZGlmZmVyZW50IHZtcyAvIGlmcmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFR5cGUgKGZuKSB7XG4gIHZhciBtYXRjaCA9IGZuICYmIGZuLnRvU3RyaW5nKCkubWF0Y2goL15cXHMqZnVuY3Rpb24gKFxcdyspLyk7XG4gIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdIDogJydcbn1cblxuZnVuY3Rpb24gaXNTYW1lVHlwZSAoYSwgYikge1xuICByZXR1cm4gZ2V0VHlwZShhKSA9PT0gZ2V0VHlwZShiKVxufVxuXG5mdW5jdGlvbiBnZXRUeXBlSW5kZXggKHR5cGUsIGV4cGVjdGVkVHlwZXMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGV4cGVjdGVkVHlwZXMpKSB7XG4gICAgcmV0dXJuIGlzU2FtZVR5cGUoZXhwZWN0ZWRUeXBlcywgdHlwZSkgPyAwIDogLTFcbiAgfVxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gZXhwZWN0ZWRUeXBlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChpc1NhbWVUeXBlKGV4cGVjdGVkVHlwZXNbaV0sIHR5cGUpKSB7XG4gICAgICByZXR1cm4gaVxuICAgIH1cbiAgfVxuICByZXR1cm4gLTFcbn1cblxuZnVuY3Rpb24gZ2V0SW52YWxpZFR5cGVNZXNzYWdlIChuYW1lLCB2YWx1ZSwgZXhwZWN0ZWRUeXBlcykge1xuICB2YXIgbWVzc2FnZSA9IFwiSW52YWxpZCBwcm9wOiB0eXBlIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCBcXFwiXCIgKyBuYW1lICsgXCJcXFwiLlwiICtcbiAgICBcIiBFeHBlY3RlZCBcIiArIChleHBlY3RlZFR5cGVzLm1hcChjYXBpdGFsaXplKS5qb2luKCcsICcpKTtcbiAgdmFyIGV4cGVjdGVkVHlwZSA9IGV4cGVjdGVkVHlwZXNbMF07XG4gIHZhciByZWNlaXZlZFR5cGUgPSB0b1Jhd1R5cGUodmFsdWUpO1xuICB2YXIgZXhwZWN0ZWRWYWx1ZSA9IHN0eWxlVmFsdWUodmFsdWUsIGV4cGVjdGVkVHlwZSk7XG4gIHZhciByZWNlaXZlZFZhbHVlID0gc3R5bGVWYWx1ZSh2YWx1ZSwgcmVjZWl2ZWRUeXBlKTtcbiAgLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBzcGVjaWZ5IGV4cGVjdGVkIHZhbHVlXG4gIGlmIChleHBlY3RlZFR5cGVzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgaXNFeHBsaWNhYmxlKGV4cGVjdGVkVHlwZSkgJiZcbiAgICAgICFpc0Jvb2xlYW4oZXhwZWN0ZWRUeXBlLCByZWNlaXZlZFR5cGUpKSB7XG4gICAgbWVzc2FnZSArPSBcIiB3aXRoIHZhbHVlIFwiICsgZXhwZWN0ZWRWYWx1ZTtcbiAgfVxuICBtZXNzYWdlICs9IFwiLCBnb3QgXCIgKyByZWNlaXZlZFR5cGUgKyBcIiBcIjtcbiAgLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBzcGVjaWZ5IHJlY2VpdmVkIHZhbHVlXG4gIGlmIChpc0V4cGxpY2FibGUocmVjZWl2ZWRUeXBlKSkge1xuICAgIG1lc3NhZ2UgKz0gXCJ3aXRoIHZhbHVlIFwiICsgcmVjZWl2ZWRWYWx1ZSArIFwiLlwiO1xuICB9XG4gIHJldHVybiBtZXNzYWdlXG59XG5cbmZ1bmN0aW9uIHN0eWxlVmFsdWUgKHZhbHVlLCB0eXBlKSB7XG4gIGlmICh0eXBlID09PSAnU3RyaW5nJykge1xuICAgIHJldHVybiAoXCJcXFwiXCIgKyB2YWx1ZSArIFwiXFxcIlwiKVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdOdW1iZXInKSB7XG4gICAgcmV0dXJuIChcIlwiICsgKE51bWJlcih2YWx1ZSkpKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiAoXCJcIiArIHZhbHVlKVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzRXhwbGljYWJsZSAodmFsdWUpIHtcbiAgdmFyIGV4cGxpY2l0VHlwZXMgPSBbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddO1xuICByZXR1cm4gZXhwbGljaXRUeXBlcy5zb21lKGZ1bmN0aW9uIChlbGVtKSB7IHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBlbGVtOyB9KVxufVxuXG5mdW5jdGlvbiBpc0Jvb2xlYW4gKCkge1xuICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gIHJldHVybiBhcmdzLnNvbWUoZnVuY3Rpb24gKGVsZW0pIHsgcmV0dXJuIGVsZW0udG9Mb3dlckNhc2UoKSA9PT0gJ2Jvb2xlYW4nOyB9KVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHtcbiAgLy8gRGVhY3RpdmF0ZSBkZXBzIHRyYWNraW5nIHdoaWxlIHByb2Nlc3NpbmcgZXJyb3IgaGFuZGxlciB0byBhdm9pZCBwb3NzaWJsZSBpbmZpbml0ZSByZW5kZXJpbmcuXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZXgvaXNzdWVzLzE1MDVcbiAgcHVzaFRhcmdldCgpO1xuICB0cnkge1xuICAgIGlmICh2bSkge1xuICAgICAgdmFyIGN1ciA9IHZtO1xuICAgICAgd2hpbGUgKChjdXIgPSBjdXIuJHBhcmVudCkpIHtcbiAgICAgICAgdmFyIGhvb2tzID0gY3VyLiRvcHRpb25zLmVycm9yQ2FwdHVyZWQ7XG4gICAgICAgIGlmIChob29rcykge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9va3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHZhciBjYXB0dXJlID0gaG9va3NbaV0uY2FsbChjdXIsIGVyciwgdm0sIGluZm8pID09PSBmYWxzZTtcbiAgICAgICAgICAgICAgaWYgKGNhcHR1cmUpIHsgcmV0dXJuIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgZ2xvYmFsSGFuZGxlRXJyb3IoZSwgY3VyLCAnZXJyb3JDYXB0dXJlZCBob29rJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGdsb2JhbEhhbmRsZUVycm9yKGVyciwgdm0sIGluZm8pO1xuICB9IGZpbmFsbHkge1xuICAgIHBvcFRhcmdldCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZVdpdGhFcnJvckhhbmRsaW5nIChcbiAgaGFuZGxlcixcbiAgY29udGV4dCxcbiAgYXJncyxcbiAgdm0sXG4gIGluZm9cbikge1xuICB2YXIgcmVzO1xuICB0cnkge1xuICAgIHJlcyA9IGFyZ3MgPyBoYW5kbGVyLmFwcGx5KGNvbnRleHQsIGFyZ3MpIDogaGFuZGxlci5jYWxsKGNvbnRleHQpO1xuICAgIGlmIChyZXMgJiYgIXJlcy5faXNWdWUgJiYgaXNQcm9taXNlKHJlcykgJiYgIXJlcy5faGFuZGxlZCkge1xuICAgICAgcmVzLmNhdGNoKGZ1bmN0aW9uIChlKSB7IHJldHVybiBoYW5kbGVFcnJvcihlLCB2bSwgaW5mbyArIFwiIChQcm9taXNlL2FzeW5jKVwiKTsgfSk7XG4gICAgICAvLyBpc3N1ZSAjOTUxMVxuICAgICAgLy8gYXZvaWQgY2F0Y2ggdHJpZ2dlcmluZyBtdWx0aXBsZSB0aW1lcyB3aGVuIG5lc3RlZCBjYWxsc1xuICAgICAgcmVzLl9oYW5kbGVkID0gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBoYW5kbGVFcnJvcihlLCB2bSwgaW5mbyk7XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBnbG9iYWxIYW5kbGVFcnJvciAoZXJyLCB2bSwgaW5mbykge1xuICBpZiAoY29uZmlnLmVycm9ySGFuZGxlcikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY29uZmlnLmVycm9ySGFuZGxlci5jYWxsKG51bGwsIGVyciwgdm0sIGluZm8pXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gaWYgdGhlIHVzZXIgaW50ZW50aW9uYWxseSB0aHJvd3MgdGhlIG9yaWdpbmFsIGVycm9yIGluIHRoZSBoYW5kbGVyLFxuICAgICAgLy8gZG8gbm90IGxvZyBpdCB0d2ljZVxuICAgICAgaWYgKGUgIT09IGVycikge1xuICAgICAgICBsb2dFcnJvcihlLCBudWxsLCAnY29uZmlnLmVycm9ySGFuZGxlcicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBsb2dFcnJvcihlcnIsIHZtLCBpbmZvKTtcbn1cblxuZnVuY3Rpb24gbG9nRXJyb3IgKGVyciwgdm0sIGluZm8pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuKChcIkVycm9yIGluIFwiICsgaW5mbyArIFwiOiBcXFwiXCIgKyAoZXJyLnRvU3RyaW5nKCkpICsgXCJcXFwiXCIpLCB2bSk7XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKChpbkJyb3dzZXIgfHwgaW5XZWV4KSAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLyogICovXG5cbnZhciBjYWxsYmFja3MgPSBbXTtcbnZhciBwZW5kaW5nID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGZsdXNoQ2FsbGJhY2tzICgpIHtcbiAgcGVuZGluZyA9IGZhbHNlO1xuICB2YXIgY29waWVzID0gY2FsbGJhY2tzLnNsaWNlKDApO1xuICBjYWxsYmFja3MubGVuZ3RoID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3BpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb3BpZXNbaV0oKTtcbiAgfVxufVxuXG4vLyBIZXJlIHdlIGhhdmUgYXN5bmMgZGVmZXJyaW5nIHdyYXBwZXJzIHVzaW5nIG1pY3JvdGFza3MuXG4vLyBJbiAyLjUgd2UgdXNlZCAobWFjcm8pIHRhc2tzIChpbiBjb21iaW5hdGlvbiB3aXRoIG1pY3JvdGFza3MpLlxuLy8gSG93ZXZlciwgaXQgaGFzIHN1YnRsZSBwcm9ibGVtcyB3aGVuIHN0YXRlIGlzIGNoYW5nZWQgcmlnaHQgYmVmb3JlIHJlcGFpbnRcbi8vIChlLmcuICM2ODEzLCBvdXQtaW4gdHJhbnNpdGlvbnMpLlxuLy8gQWxzbywgdXNpbmcgKG1hY3JvKSB0YXNrcyBpbiBldmVudCBoYW5kbGVyIHdvdWxkIGNhdXNlIHNvbWUgd2VpcmQgYmVoYXZpb3JzXG4vLyB0aGF0IGNhbm5vdCBiZSBjaXJjdW12ZW50ZWQgKGUuZy4gIzcxMDksICM3MTUzLCAjNzU0NiwgIzc4MzQsICM4MTA5KS5cbi8vIFNvIHdlIG5vdyB1c2UgbWljcm90YXNrcyBldmVyeXdoZXJlLCBhZ2Fpbi5cbi8vIEEgbWFqb3IgZHJhd2JhY2sgb2YgdGhpcyB0cmFkZW9mZiBpcyB0aGF0IHRoZXJlIGFyZSBzb21lIHNjZW5hcmlvc1xuLy8gd2hlcmUgbWljcm90YXNrcyBoYXZlIHRvbyBoaWdoIGEgcHJpb3JpdHkgYW5kIGZpcmUgaW4gYmV0d2VlbiBzdXBwb3NlZGx5XG4vLyBzZXF1ZW50aWFsIGV2ZW50cyAoZS5nLiAjNDUyMSwgIzY2OTAsIHdoaWNoIGhhdmUgd29ya2Fyb3VuZHMpXG4vLyBvciBldmVuIGJldHdlZW4gYnViYmxpbmcgb2YgdGhlIHNhbWUgZXZlbnQgKCM2NTY2KS5cbnZhciB0aW1lckZ1bmM7XG5cbi8vIFRoZSBuZXh0VGljayBiZWhhdmlvciBsZXZlcmFnZXMgdGhlIG1pY3JvdGFzayBxdWV1ZSwgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkXG4vLyB2aWEgZWl0aGVyIG5hdGl2ZSBQcm9taXNlLnRoZW4gb3IgTXV0YXRpb25PYnNlcnZlci5cbi8vIE11dGF0aW9uT2JzZXJ2ZXIgaGFzIHdpZGVyIHN1cHBvcnQsIGhvd2V2ZXIgaXQgaXMgc2VyaW91c2x5IGJ1Z2dlZCBpblxuLy8gVUlXZWJWaWV3IGluIGlPUyA+PSA5LjMuMyB3aGVuIHRyaWdnZXJlZCBpbiB0b3VjaCBldmVudCBoYW5kbGVycy4gSXRcbi8vIGNvbXBsZXRlbHkgc3RvcHMgd29ya2luZyBhZnRlciB0cmlnZ2VyaW5nIGEgZmV3IHRpbWVzLi4uIHNvLCBpZiBuYXRpdmVcbi8vIFByb21pc2UgaXMgYXZhaWxhYmxlLCB3ZSB3aWxsIHVzZSBpdDpcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0LCAkZmxvdy1kaXNhYmxlLWxpbmUgKi9cbmlmICh0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoUHJvbWlzZSkpIHtcbiAgdmFyIHAgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgdGltZXJGdW5jID0gZnVuY3Rpb24gKCkge1xuICAgIHAudGhlbihmbHVzaENhbGxiYWNrcyk7XG4gICAgLy8gSW4gcHJvYmxlbWF0aWMgVUlXZWJWaWV3cywgUHJvbWlzZS50aGVuIGRvZXNuJ3QgY29tcGxldGVseSBicmVhaywgYnV0XG4gICAgLy8gaXQgY2FuIGdldCBzdHVjayBpbiBhIHdlaXJkIHN0YXRlIHdoZXJlIGNhbGxiYWNrcyBhcmUgcHVzaGVkIGludG8gdGhlXG4gICAgLy8gbWljcm90YXNrIHF1ZXVlIGJ1dCB0aGUgcXVldWUgaXNuJ3QgYmVpbmcgZmx1c2hlZCwgdW50aWwgdGhlIGJyb3dzZXJcbiAgICAvLyBuZWVkcyB0byBkbyBzb21lIG90aGVyIHdvcmssIGUuZy4gaGFuZGxlIGEgdGltZXIuIFRoZXJlZm9yZSB3ZSBjYW5cbiAgICAvLyBcImZvcmNlXCIgdGhlIG1pY3JvdGFzayBxdWV1ZSB0byBiZSBmbHVzaGVkIGJ5IGFkZGluZyBhbiBlbXB0eSB0aW1lci5cbiAgICBpZiAoaXNJT1MpIHsgc2V0VGltZW91dChub29wKTsgfVxuICB9O1xufSBlbHNlIGlmICghaXNJRSAmJiB0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgKFxuICBpc05hdGl2ZShNdXRhdGlvbk9ic2VydmVyKSB8fFxuICAvLyBQaGFudG9tSlMgYW5kIGlPUyA3LnhcbiAgTXV0YXRpb25PYnNlcnZlci50b1N0cmluZygpID09PSAnW29iamVjdCBNdXRhdGlvbk9ic2VydmVyQ29uc3RydWN0b3JdJ1xuKSkge1xuICAvLyBVc2UgTXV0YXRpb25PYnNlcnZlciB3aGVyZSBuYXRpdmUgUHJvbWlzZSBpcyBub3QgYXZhaWxhYmxlLFxuICAvLyBlLmcuIFBoYW50b21KUywgaU9TNywgQW5kcm9pZCA0LjRcbiAgLy8gKCM2NDY2IE11dGF0aW9uT2JzZXJ2ZXIgaXMgdW5yZWxpYWJsZSBpbiBJRTExKVxuICB2YXIgY291bnRlciA9IDE7XG4gIHZhciBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZsdXNoQ2FsbGJhY2tzKTtcbiAgdmFyIHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGNvdW50ZXIpKTtcbiAgb2JzZXJ2ZXIub2JzZXJ2ZSh0ZXh0Tm9kZSwge1xuICAgIGNoYXJhY3RlckRhdGE6IHRydWVcbiAgfSk7XG4gIHRpbWVyRnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb3VudGVyID0gKGNvdW50ZXIgKyAxKSAlIDI7XG4gICAgdGV4dE5vZGUuZGF0YSA9IFN0cmluZyhjb3VudGVyKTtcbiAgfTtcbn0gZWxzZSBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoc2V0SW1tZWRpYXRlKSkge1xuICAvLyBGYWxsYmFjayB0byBzZXRJbW1lZGlhdGUuXG4gIC8vIFRlY2huaWNhbGx5IGl0IGxldmVyYWdlcyB0aGUgKG1hY3JvKSB0YXNrIHF1ZXVlLFxuICAvLyBidXQgaXQgaXMgc3RpbGwgYSBiZXR0ZXIgY2hvaWNlIHRoYW4gc2V0VGltZW91dC5cbiAgdGltZXJGdW5jID0gZnVuY3Rpb24gKCkge1xuICAgIHNldEltbWVkaWF0ZShmbHVzaENhbGxiYWNrcyk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBGYWxsYmFjayB0byBzZXRUaW1lb3V0LlxuICB0aW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgc2V0VGltZW91dChmbHVzaENhbGxiYWNrcywgMCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG5leHRUaWNrIChjYiwgY3R4KSB7XG4gIHZhciBfcmVzb2x2ZTtcbiAgY2FsbGJhY2tzLnB1c2goZnVuY3Rpb24gKCkge1xuICAgIGlmIChjYikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2IuY2FsbChjdHgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBoYW5kbGVFcnJvcihlLCBjdHgsICduZXh0VGljaycpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoX3Jlc29sdmUpIHtcbiAgICAgIF9yZXNvbHZlKGN0eCk7XG4gICAgfVxuICB9KTtcbiAgaWYgKCFwZW5kaW5nKSB7XG4gICAgcGVuZGluZyA9IHRydWU7XG4gICAgdGltZXJGdW5jKCk7XG4gIH1cbiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gIGlmICghY2IgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICBfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgfSlcbiAgfVxufVxuXG4vKiAgKi9cblxuLyogbm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoIFByb3h5ICovXG5cbnZhciBpbml0UHJveHk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBhbGxvd2VkR2xvYmFscyA9IG1ha2VNYXAoXG4gICAgJ0luZmluaXR5LHVuZGVmaW5lZCxOYU4saXNGaW5pdGUsaXNOYU4sJyArXG4gICAgJ3BhcnNlRmxvYXQscGFyc2VJbnQsZGVjb2RlVVJJLGRlY29kZVVSSUNvbXBvbmVudCxlbmNvZGVVUkksZW5jb2RlVVJJQ29tcG9uZW50LCcgK1xuICAgICdNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsJyArXG4gICAgJ3JlcXVpcmUnIC8vIGZvciBXZWJwYWNrL0Jyb3dzZXJpZnlcbiAgKTtcblxuICB2YXIgd2Fybk5vblByZXNlbnQgPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHtcbiAgICB3YXJuKFxuICAgICAgXCJQcm9wZXJ0eSBvciBtZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGlzIG5vdCBkZWZpbmVkIG9uIHRoZSBpbnN0YW5jZSBidXQgXCIgK1xuICAgICAgJ3JlZmVyZW5jZWQgZHVyaW5nIHJlbmRlci4gTWFrZSBzdXJlIHRoYXQgdGhpcyBwcm9wZXJ0eSBpcyByZWFjdGl2ZSwgJyArXG4gICAgICAnZWl0aGVyIGluIHRoZSBkYXRhIG9wdGlvbiwgb3IgZm9yIGNsYXNzLWJhc2VkIGNvbXBvbmVudHMsIGJ5ICcgK1xuICAgICAgJ2luaXRpYWxpemluZyB0aGUgcHJvcGVydHkuICcgK1xuICAgICAgJ1NlZTogaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvcmVhY3Rpdml0eS5odG1sI0RlY2xhcmluZy1SZWFjdGl2ZS1Qcm9wZXJ0aWVzLicsXG4gICAgICB0YXJnZXRcbiAgICApO1xuICB9O1xuXG4gIHZhciB3YXJuUmVzZXJ2ZWRQcmVmaXggPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHtcbiAgICB3YXJuKFxuICAgICAgXCJQcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgbXVzdCBiZSBhY2Nlc3NlZCB3aXRoIFxcXCIkZGF0YS5cIiArIGtleSArIFwiXFxcIiBiZWNhdXNlIFwiICtcbiAgICAgICdwcm9wZXJ0aWVzIHN0YXJ0aW5nIHdpdGggXCIkXCIgb3IgXCJfXCIgYXJlIG5vdCBwcm94aWVkIGluIHRoZSBWdWUgaW5zdGFuY2UgdG8gJyArXG4gICAgICAncHJldmVudCBjb25mbGljdHMgd2l0aCBWdWUgaW50ZXJuYWxzLiAnICtcbiAgICAgICdTZWU6IGh0dHBzOi8vdnVlanMub3JnL3YyL2FwaS8jZGF0YScsXG4gICAgICB0YXJnZXRcbiAgICApO1xuICB9O1xuXG4gIHZhciBoYXNQcm94eSA9XG4gICAgdHlwZW9mIFByb3h5ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShQcm94eSk7XG5cbiAgaWYgKGhhc1Byb3h5KSB7XG4gICAgdmFyIGlzQnVpbHRJbk1vZGlmaWVyID0gbWFrZU1hcCgnc3RvcCxwcmV2ZW50LHNlbGYsY3RybCxzaGlmdCxhbHQsbWV0YSxleGFjdCcpO1xuICAgIGNvbmZpZy5rZXlDb2RlcyA9IG5ldyBQcm94eShjb25maWcua2V5Q29kZXMsIHtcbiAgICAgIHNldDogZnVuY3Rpb24gc2V0ICh0YXJnZXQsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGlzQnVpbHRJbk1vZGlmaWVyKGtleSkpIHtcbiAgICAgICAgICB3YXJuKChcIkF2b2lkIG92ZXJ3cml0aW5nIGJ1aWx0LWluIG1vZGlmaWVyIGluIGNvbmZpZy5rZXlDb2RlczogLlwiICsga2V5KSk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB2YXIgaGFzSGFuZGxlciA9IHtcbiAgICBoYXM6IGZ1bmN0aW9uIGhhcyAodGFyZ2V0LCBrZXkpIHtcbiAgICAgIHZhciBoYXMgPSBrZXkgaW4gdGFyZ2V0O1xuICAgICAgdmFyIGlzQWxsb3dlZCA9IGFsbG93ZWRHbG9iYWxzKGtleSkgfHxcbiAgICAgICAgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmIGtleS5jaGFyQXQoMCkgPT09ICdfJyAmJiAhKGtleSBpbiB0YXJnZXQuJGRhdGEpKTtcbiAgICAgIGlmICghaGFzICYmICFpc0FsbG93ZWQpIHtcbiAgICAgICAgaWYgKGtleSBpbiB0YXJnZXQuJGRhdGEpIHsgd2FyblJlc2VydmVkUHJlZml4KHRhcmdldCwga2V5KTsgfVxuICAgICAgICBlbHNlIHsgd2Fybk5vblByZXNlbnQodGFyZ2V0LCBrZXkpOyB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzIHx8ICFpc0FsbG93ZWRcbiAgICB9XG4gIH07XG5cbiAgdmFyIGdldEhhbmRsZXIgPSB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQgKHRhcmdldCwga2V5KSB7XG4gICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYgIShrZXkgaW4gdGFyZ2V0KSkge1xuICAgICAgICBpZiAoa2V5IGluIHRhcmdldC4kZGF0YSkgeyB3YXJuUmVzZXJ2ZWRQcmVmaXgodGFyZ2V0LCBrZXkpOyB9XG4gICAgICAgIGVsc2UgeyB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7IH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0YXJnZXRba2V5XVxuICAgIH1cbiAgfTtcblxuICBpbml0UHJveHkgPSBmdW5jdGlvbiBpbml0UHJveHkgKHZtKSB7XG4gICAgaWYgKGhhc1Byb3h5KSB7XG4gICAgICAvLyBkZXRlcm1pbmUgd2hpY2ggcHJveHkgaGFuZGxlciB0byB1c2VcbiAgICAgIHZhciBvcHRpb25zID0gdm0uJG9wdGlvbnM7XG4gICAgICB2YXIgaGFuZGxlcnMgPSBvcHRpb25zLnJlbmRlciAmJiBvcHRpb25zLnJlbmRlci5fd2l0aFN0cmlwcGVkXG4gICAgICAgID8gZ2V0SGFuZGxlclxuICAgICAgICA6IGhhc0hhbmRsZXI7XG4gICAgICB2bS5fcmVuZGVyUHJveHkgPSBuZXcgUHJveHkodm0sIGhhbmRsZXJzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm0uX3JlbmRlclByb3h5ID0gdm07XG4gICAgfVxuICB9O1xufVxuXG4vKiAgKi9cblxudmFyIHNlZW5PYmplY3RzID0gbmV3IF9TZXQoKTtcblxuLyoqXG4gKiBSZWN1cnNpdmVseSB0cmF2ZXJzZSBhbiBvYmplY3QgdG8gZXZva2UgYWxsIGNvbnZlcnRlZFxuICogZ2V0dGVycywgc28gdGhhdCBldmVyeSBuZXN0ZWQgcHJvcGVydHkgaW5zaWRlIHRoZSBvYmplY3RcbiAqIGlzIGNvbGxlY3RlZCBhcyBhIFwiZGVlcFwiIGRlcGVuZGVuY3kuXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlICh2YWwpIHtcbiAgX3RyYXZlcnNlKHZhbCwgc2Vlbk9iamVjdHMpO1xuICBzZWVuT2JqZWN0cy5jbGVhcigpO1xufVxuXG5mdW5jdGlvbiBfdHJhdmVyc2UgKHZhbCwgc2Vlbikge1xuICB2YXIgaSwga2V5cztcbiAgdmFyIGlzQSA9IEFycmF5LmlzQXJyYXkodmFsKTtcbiAgaWYgKCghaXNBICYmICFpc09iamVjdCh2YWwpKSB8fCBPYmplY3QuaXNGcm96ZW4odmFsKSB8fCB2YWwgaW5zdGFuY2VvZiBWTm9kZSkge1xuICAgIHJldHVyblxuICB9XG4gIGlmICh2YWwuX19vYl9fKSB7XG4gICAgdmFyIGRlcElkID0gdmFsLl9fb2JfXy5kZXAuaWQ7XG4gICAgaWYgKHNlZW4uaGFzKGRlcElkKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHNlZW4uYWRkKGRlcElkKTtcbiAgfVxuICBpZiAoaXNBKSB7XG4gICAgaSA9IHZhbC5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkgeyBfdHJhdmVyc2UodmFsW2ldLCBzZWVuKTsgfVxuICB9IGVsc2Uge1xuICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgIGkgPSBrZXlzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7IF90cmF2ZXJzZSh2YWxba2V5c1tpXV0sIHNlZW4pOyB9XG4gIH1cbn1cblxudmFyIG1hcms7XG52YXIgbWVhc3VyZTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIHBlcmYgPSBpbkJyb3dzZXIgJiYgd2luZG93LnBlcmZvcm1hbmNlO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKFxuICAgIHBlcmYgJiZcbiAgICBwZXJmLm1hcmsgJiZcbiAgICBwZXJmLm1lYXN1cmUgJiZcbiAgICBwZXJmLmNsZWFyTWFya3MgJiZcbiAgICBwZXJmLmNsZWFyTWVhc3VyZXNcbiAgKSB7XG4gICAgbWFyayA9IGZ1bmN0aW9uICh0YWcpIHsgcmV0dXJuIHBlcmYubWFyayh0YWcpOyB9O1xuICAgIG1lYXN1cmUgPSBmdW5jdGlvbiAobmFtZSwgc3RhcnRUYWcsIGVuZFRhZykge1xuICAgICAgcGVyZi5tZWFzdXJlKG5hbWUsIHN0YXJ0VGFnLCBlbmRUYWcpO1xuICAgICAgcGVyZi5jbGVhck1hcmtzKHN0YXJ0VGFnKTtcbiAgICAgIHBlcmYuY2xlYXJNYXJrcyhlbmRUYWcpO1xuICAgICAgLy8gcGVyZi5jbGVhck1lYXN1cmVzKG5hbWUpXG4gICAgfTtcbiAgfVxufVxuXG4vKiAgKi9cblxudmFyIG5vcm1hbGl6ZUV2ZW50ID0gY2FjaGVkKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHZhciBwYXNzaXZlID0gbmFtZS5jaGFyQXQoMCkgPT09ICcmJztcbiAgbmFtZSA9IHBhc3NpdmUgPyBuYW1lLnNsaWNlKDEpIDogbmFtZTtcbiAgdmFyIG9uY2UkJDEgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJ34nOyAvLyBQcmVmaXhlZCBsYXN0LCBjaGVja2VkIGZpcnN0XG4gIG5hbWUgPSBvbmNlJCQxID8gbmFtZS5zbGljZSgxKSA6IG5hbWU7XG4gIHZhciBjYXB0dXJlID0gbmFtZS5jaGFyQXQoMCkgPT09ICchJztcbiAgbmFtZSA9IGNhcHR1cmUgPyBuYW1lLnNsaWNlKDEpIDogbmFtZTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBuYW1lLFxuICAgIG9uY2U6IG9uY2UkJDEsXG4gICAgY2FwdHVyZTogY2FwdHVyZSxcbiAgICBwYXNzaXZlOiBwYXNzaXZlXG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGVGbkludm9rZXIgKGZucywgdm0pIHtcbiAgZnVuY3Rpb24gaW52b2tlciAoKSB7XG4gICAgdmFyIGFyZ3VtZW50cyQxID0gYXJndW1lbnRzO1xuXG4gICAgdmFyIGZucyA9IGludm9rZXIuZm5zO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZucykpIHtcbiAgICAgIHZhciBjbG9uZWQgPSBmbnMuc2xpY2UoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xvbmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGludm9rZVdpdGhFcnJvckhhbmRsaW5nKGNsb25lZFtpXSwgbnVsbCwgYXJndW1lbnRzJDEsIHZtLCBcInYtb24gaGFuZGxlclwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmV0dXJuIGhhbmRsZXIgcmV0dXJuIHZhbHVlIGZvciBzaW5nbGUgaGFuZGxlcnNcbiAgICAgIHJldHVybiBpbnZva2VXaXRoRXJyb3JIYW5kbGluZyhmbnMsIG51bGwsIGFyZ3VtZW50cywgdm0sIFwidi1vbiBoYW5kbGVyXCIpXG4gICAgfVxuICB9XG4gIGludm9rZXIuZm5zID0gZm5zO1xuICByZXR1cm4gaW52b2tlclxufVxuXG5mdW5jdGlvbiB1cGRhdGVMaXN0ZW5lcnMgKFxuICBvbixcbiAgb2xkT24sXG4gIGFkZCxcbiAgcmVtb3ZlJCQxLFxuICBjcmVhdGVPbmNlSGFuZGxlcixcbiAgdm1cbikge1xuICB2YXIgbmFtZSwgZGVmJCQxLCBjdXIsIG9sZCwgZXZlbnQ7XG4gIGZvciAobmFtZSBpbiBvbikge1xuICAgIGRlZiQkMSA9IGN1ciA9IG9uW25hbWVdO1xuICAgIG9sZCA9IG9sZE9uW25hbWVdO1xuICAgIGV2ZW50ID0gbm9ybWFsaXplRXZlbnQobmFtZSk7XG4gICAgaWYgKGlzVW5kZWYoY3VyKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICBcIkludmFsaWQgaGFuZGxlciBmb3IgZXZlbnQgXFxcIlwiICsgKGV2ZW50Lm5hbWUpICsgXCJcXFwiOiBnb3QgXCIgKyBTdHJpbmcoY3VyKSxcbiAgICAgICAgdm1cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZCkpIHtcbiAgICAgIGlmIChpc1VuZGVmKGN1ci5mbnMpKSB7XG4gICAgICAgIGN1ciA9IG9uW25hbWVdID0gY3JlYXRlRm5JbnZva2VyKGN1ciwgdm0pO1xuICAgICAgfVxuICAgICAgaWYgKGlzVHJ1ZShldmVudC5vbmNlKSkge1xuICAgICAgICBjdXIgPSBvbltuYW1lXSA9IGNyZWF0ZU9uY2VIYW5kbGVyKGV2ZW50Lm5hbWUsIGN1ciwgZXZlbnQuY2FwdHVyZSk7XG4gICAgICB9XG4gICAgICBhZGQoZXZlbnQubmFtZSwgY3VyLCBldmVudC5jYXB0dXJlLCBldmVudC5wYXNzaXZlLCBldmVudC5wYXJhbXMpO1xuICAgIH0gZWxzZSBpZiAoY3VyICE9PSBvbGQpIHtcbiAgICAgIG9sZC5mbnMgPSBjdXI7XG4gICAgICBvbltuYW1lXSA9IG9sZDtcbiAgICB9XG4gIH1cbiAgZm9yIChuYW1lIGluIG9sZE9uKSB7XG4gICAgaWYgKGlzVW5kZWYob25bbmFtZV0pKSB7XG4gICAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50KG5hbWUpO1xuICAgICAgcmVtb3ZlJCQxKGV2ZW50Lm5hbWUsIG9sZE9uW25hbWVdLCBldmVudC5jYXB0dXJlKTtcbiAgICB9XG4gIH1cbn1cblxuLyogICovXG5cbi8qICAqL1xuXG4vLyBmaXhlZCBieSB4eHh4eHggKG1wIHByb3BlcnRpZXMpXG5mdW5jdGlvbiBleHRyYWN0UHJvcGVydGllc0Zyb21WTm9kZURhdGEoZGF0YSwgQ3RvciwgcmVzLCBjb250ZXh0KSB7XG4gIHZhciBwcm9wT3B0aW9ucyA9IEN0b3Iub3B0aW9ucy5tcE9wdGlvbnMgJiYgQ3Rvci5vcHRpb25zLm1wT3B0aW9ucy5wcm9wZXJ0aWVzO1xuICBpZiAoaXNVbmRlZihwcm9wT3B0aW9ucykpIHtcbiAgICByZXR1cm4gcmVzXG4gIH1cbiAgdmFyIGV4dGVybmFsQ2xhc3NlcyA9IEN0b3Iub3B0aW9ucy5tcE9wdGlvbnMuZXh0ZXJuYWxDbGFzc2VzIHx8IFtdO1xuICB2YXIgYXR0cnMgPSBkYXRhLmF0dHJzO1xuICB2YXIgcHJvcHMgPSBkYXRhLnByb3BzO1xuICBpZiAoaXNEZWYoYXR0cnMpIHx8IGlzRGVmKHByb3BzKSkge1xuICAgIGZvciAodmFyIGtleSBpbiBwcm9wT3B0aW9ucykge1xuICAgICAgdmFyIGFsdEtleSA9IGh5cGhlbmF0ZShrZXkpO1xuICAgICAgdmFyIHJlc3VsdCA9IGNoZWNrUHJvcChyZXMsIHByb3BzLCBrZXksIGFsdEtleSwgdHJ1ZSkgfHxcbiAgICAgICAgICBjaGVja1Byb3AocmVzLCBhdHRycywga2V5LCBhbHRLZXksIGZhbHNlKTtcbiAgICAgIC8vIGV4dGVybmFsQ2xhc3NcbiAgICAgIGlmIChcbiAgICAgICAgcmVzdWx0ICYmXG4gICAgICAgIHJlc1trZXldICYmXG4gICAgICAgIGV4dGVybmFsQ2xhc3Nlcy5pbmRleE9mKGFsdEtleSkgIT09IC0xICYmXG4gICAgICAgIGNvbnRleHRbY2FtZWxpemUocmVzW2tleV0pXVxuICAgICAgKSB7XG4gICAgICAgIC8vIOi1i+WAvCBleHRlcm5hbENsYXNzIOecn+ato+eahOWAvCjmqKHmnb/ph4wgZXh0ZXJuYWxDbGFzcyDnmoTlgLzlj6/og73mmK/lrZfnrKbkuLIpXG4gICAgICAgIHJlc1trZXldID0gY29udGV4dFtjYW1lbGl6ZShyZXNba2V5XSldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RQcm9wc0Zyb21WTm9kZURhdGEgKFxuICBkYXRhLFxuICBDdG9yLFxuICB0YWcsXG4gIGNvbnRleHQvLyBmaXhlZCBieSB4eHh4eHhcbikge1xuICAvLyB3ZSBhcmUgb25seSBleHRyYWN0aW5nIHJhdyB2YWx1ZXMgaGVyZS5cbiAgLy8gdmFsaWRhdGlvbiBhbmQgZGVmYXVsdCB2YWx1ZXMgYXJlIGhhbmRsZWQgaW4gdGhlIGNoaWxkXG4gIC8vIGNvbXBvbmVudCBpdHNlbGYuXG4gIHZhciBwcm9wT3B0aW9ucyA9IEN0b3Iub3B0aW9ucy5wcm9wcztcbiAgaWYgKGlzVW5kZWYocHJvcE9wdGlvbnMpKSB7XG4gICAgLy8gZml4ZWQgYnkgeHh4eHh4XG4gICAgcmV0dXJuIGV4dHJhY3RQcm9wZXJ0aWVzRnJvbVZOb2RlRGF0YShkYXRhLCBDdG9yLCB7fSwgY29udGV4dClcbiAgfVxuICB2YXIgcmVzID0ge307XG4gIHZhciBhdHRycyA9IGRhdGEuYXR0cnM7XG4gIHZhciBwcm9wcyA9IGRhdGEucHJvcHM7XG4gIGlmIChpc0RlZihhdHRycykgfHwgaXNEZWYocHJvcHMpKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHByb3BPcHRpb25zKSB7XG4gICAgICB2YXIgYWx0S2V5ID0gaHlwaGVuYXRlKGtleSk7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB2YXIga2V5SW5Mb3dlckNhc2UgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGtleSAhPT0ga2V5SW5Mb3dlckNhc2UgJiZcbiAgICAgICAgICBhdHRycyAmJiBoYXNPd24oYXR0cnMsIGtleUluTG93ZXJDYXNlKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aXAoXG4gICAgICAgICAgICBcIlByb3AgXFxcIlwiICsga2V5SW5Mb3dlckNhc2UgKyBcIlxcXCIgaXMgcGFzc2VkIHRvIGNvbXBvbmVudCBcIiArXG4gICAgICAgICAgICAoZm9ybWF0Q29tcG9uZW50TmFtZSh0YWcgfHwgQ3RvcikpICsgXCIsIGJ1dCB0aGUgZGVjbGFyZWQgcHJvcCBuYW1lIGlzXCIgK1xuICAgICAgICAgICAgXCIgXFxcIlwiICsga2V5ICsgXCJcXFwiLiBcIiArXG4gICAgICAgICAgICBcIk5vdGUgdGhhdCBIVE1MIGF0dHJpYnV0ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIGNhbWVsQ2FzZWQgXCIgK1xuICAgICAgICAgICAgXCJwcm9wcyBuZWVkIHRvIHVzZSB0aGVpciBrZWJhYi1jYXNlIGVxdWl2YWxlbnRzIHdoZW4gdXNpbmcgaW4tRE9NIFwiICtcbiAgICAgICAgICAgIFwidGVtcGxhdGVzLiBZb3Ugc2hvdWxkIHByb2JhYmx5IHVzZSBcXFwiXCIgKyBhbHRLZXkgKyBcIlxcXCIgaW5zdGVhZCBvZiBcXFwiXCIgKyBrZXkgKyBcIlxcXCIuXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjaGVja1Byb3AocmVzLCBwcm9wcywga2V5LCBhbHRLZXksIHRydWUpIHx8XG4gICAgICBjaGVja1Byb3AocmVzLCBhdHRycywga2V5LCBhbHRLZXksIGZhbHNlKTtcbiAgICB9XG4gIH1cbiAgLy8gZml4ZWQgYnkgeHh4eHh4XG4gIHJldHVybiBleHRyYWN0UHJvcGVydGllc0Zyb21WTm9kZURhdGEoZGF0YSwgQ3RvciwgcmVzLCBjb250ZXh0KVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3AgKFxuICByZXMsXG4gIGhhc2gsXG4gIGtleSxcbiAgYWx0S2V5LFxuICBwcmVzZXJ2ZVxuKSB7XG4gIGlmIChpc0RlZihoYXNoKSkge1xuICAgIGlmIChoYXNPd24oaGFzaCwga2V5KSkge1xuICAgICAgcmVzW2tleV0gPSBoYXNoW2tleV07XG4gICAgICBpZiAoIXByZXNlcnZlKSB7XG4gICAgICAgIGRlbGV0ZSBoYXNoW2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSBpZiAoaGFzT3duKGhhc2gsIGFsdEtleSkpIHtcbiAgICAgIHJlc1trZXldID0gaGFzaFthbHRLZXldO1xuICAgICAgaWYgKCFwcmVzZXJ2ZSkge1xuICAgICAgICBkZWxldGUgaGFzaFthbHRLZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qICAqL1xuXG4vLyBUaGUgdGVtcGxhdGUgY29tcGlsZXIgYXR0ZW1wdHMgdG8gbWluaW1pemUgdGhlIG5lZWQgZm9yIG5vcm1hbGl6YXRpb24gYnlcbi8vIHN0YXRpY2FsbHkgYW5hbHl6aW5nIHRoZSB0ZW1wbGF0ZSBhdCBjb21waWxlIHRpbWUuXG4vL1xuLy8gRm9yIHBsYWluIEhUTUwgbWFya3VwLCBub3JtYWxpemF0aW9uIGNhbiBiZSBjb21wbGV0ZWx5IHNraXBwZWQgYmVjYXVzZSB0aGVcbi8vIGdlbmVyYXRlZCByZW5kZXIgZnVuY3Rpb24gaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gQXJyYXk8Vk5vZGU+LiBUaGVyZSBhcmVcbi8vIHR3byBjYXNlcyB3aGVyZSBleHRyYSBub3JtYWxpemF0aW9uIGlzIG5lZWRlZDpcblxuLy8gMS4gV2hlbiB0aGUgY2hpbGRyZW4gY29udGFpbnMgY29tcG9uZW50cyAtIGJlY2F1c2UgYSBmdW5jdGlvbmFsIGNvbXBvbmVudFxuLy8gbWF5IHJldHVybiBhbiBBcnJheSBpbnN0ZWFkIG9mIGEgc2luZ2xlIHJvb3QuIEluIHRoaXMgY2FzZSwganVzdCBhIHNpbXBsZVxuLy8gbm9ybWFsaXphdGlvbiBpcyBuZWVkZWQgLSBpZiBhbnkgY2hpbGQgaXMgYW4gQXJyYXksIHdlIGZsYXR0ZW4gdGhlIHdob2xlXG4vLyB0aGluZyB3aXRoIEFycmF5LnByb3RvdHlwZS5jb25jYXQuIEl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgb25seSAxLWxldmVsIGRlZXBcbi8vIGJlY2F1c2UgZnVuY3Rpb25hbCBjb21wb25lbnRzIGFscmVhZHkgbm9ybWFsaXplIHRoZWlyIG93biBjaGlsZHJlbi5cbmZ1bmN0aW9uIHNpbXBsZU5vcm1hbGl6ZUNoaWxkcmVuIChjaGlsZHJlbikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW5baV0pKSB7XG4gICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgY2hpbGRyZW4pXG4gICAgfVxuICB9XG4gIHJldHVybiBjaGlsZHJlblxufVxuXG4vLyAyLiBXaGVuIHRoZSBjaGlsZHJlbiBjb250YWlucyBjb25zdHJ1Y3RzIHRoYXQgYWx3YXlzIGdlbmVyYXRlZCBuZXN0ZWQgQXJyYXlzLFxuLy8gZS5nLiA8dGVtcGxhdGU+LCA8c2xvdD4sIHYtZm9yLCBvciB3aGVuIHRoZSBjaGlsZHJlbiBpcyBwcm92aWRlZCBieSB1c2VyXG4vLyB3aXRoIGhhbmQtd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zIC8gSlNYLiBJbiBzdWNoIGNhc2VzIGEgZnVsbCBub3JtYWxpemF0aW9uXG4vLyBpcyBuZWVkZWQgdG8gY2F0ZXIgdG8gYWxsIHBvc3NpYmxlIHR5cGVzIG9mIGNoaWxkcmVuIHZhbHVlcy5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNoaWxkcmVuIChjaGlsZHJlbikge1xuICByZXR1cm4gaXNQcmltaXRpdmUoY2hpbGRyZW4pXG4gICAgPyBbY3JlYXRlVGV4dFZOb2RlKGNoaWxkcmVuKV1cbiAgICA6IEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pXG4gICAgICA/IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oY2hpbGRyZW4pXG4gICAgICA6IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBpc1RleHROb2RlIChub2RlKSB7XG4gIHJldHVybiBpc0RlZihub2RlKSAmJiBpc0RlZihub2RlLnRleHQpICYmIGlzRmFsc2Uobm9kZS5pc0NvbW1lbnQpXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4gKGNoaWxkcmVuLCBuZXN0ZWRJbmRleCkge1xuICB2YXIgcmVzID0gW107XG4gIHZhciBpLCBjLCBsYXN0SW5kZXgsIGxhc3Q7XG4gIGZvciAoaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGMgPSBjaGlsZHJlbltpXTtcbiAgICBpZiAoaXNVbmRlZihjKSB8fCB0eXBlb2YgYyA9PT0gJ2Jvb2xlYW4nKSB7IGNvbnRpbnVlIH1cbiAgICBsYXN0SW5kZXggPSByZXMubGVuZ3RoIC0gMTtcbiAgICBsYXN0ID0gcmVzW2xhc3RJbmRleF07XG4gICAgLy8gIG5lc3RlZFxuICAgIGlmIChBcnJheS5pc0FycmF5KGMpKSB7XG4gICAgICBpZiAoYy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGMgPSBub3JtYWxpemVBcnJheUNoaWxkcmVuKGMsICgobmVzdGVkSW5kZXggfHwgJycpICsgXCJfXCIgKyBpKSk7XG4gICAgICAgIC8vIG1lcmdlIGFkamFjZW50IHRleHQgbm9kZXNcbiAgICAgICAgaWYgKGlzVGV4dE5vZGUoY1swXSkgJiYgaXNUZXh0Tm9kZShsYXN0KSkge1xuICAgICAgICAgIHJlc1tsYXN0SW5kZXhdID0gY3JlYXRlVGV4dFZOb2RlKGxhc3QudGV4dCArIChjWzBdKS50ZXh0KTtcbiAgICAgICAgICBjLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnB1c2guYXBwbHkocmVzLCBjKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKGMpKSB7XG4gICAgICBpZiAoaXNUZXh0Tm9kZShsYXN0KSkge1xuICAgICAgICAvLyBtZXJnZSBhZGphY2VudCB0ZXh0IG5vZGVzXG4gICAgICAgIC8vIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBTU1IgaHlkcmF0aW9uIGJlY2F1c2UgdGV4dCBub2RlcyBhcmVcbiAgICAgICAgLy8gZXNzZW50aWFsbHkgbWVyZ2VkIHdoZW4gcmVuZGVyZWQgdG8gSFRNTCBzdHJpbmdzXG4gICAgICAgIHJlc1tsYXN0SW5kZXhdID0gY3JlYXRlVGV4dFZOb2RlKGxhc3QudGV4dCArIGMpO1xuICAgICAgfSBlbHNlIGlmIChjICE9PSAnJykge1xuICAgICAgICAvLyBjb252ZXJ0IHByaW1pdGl2ZSB0byB2bm9kZVxuICAgICAgICByZXMucHVzaChjcmVhdGVUZXh0Vk5vZGUoYykpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNUZXh0Tm9kZShjKSAmJiBpc1RleHROb2RlKGxhc3QpKSB7XG4gICAgICAgIC8vIG1lcmdlIGFkamFjZW50IHRleHQgbm9kZXNcbiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYy50ZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRlZmF1bHQga2V5IGZvciBuZXN0ZWQgYXJyYXkgY2hpbGRyZW4gKGxpa2VseSBnZW5lcmF0ZWQgYnkgdi1mb3IpXG4gICAgICAgIGlmIChpc1RydWUoY2hpbGRyZW4uX2lzVkxpc3QpICYmXG4gICAgICAgICAgaXNEZWYoYy50YWcpICYmXG4gICAgICAgICAgaXNVbmRlZihjLmtleSkgJiZcbiAgICAgICAgICBpc0RlZihuZXN0ZWRJbmRleCkpIHtcbiAgICAgICAgICBjLmtleSA9IFwiX192bGlzdFwiICsgbmVzdGVkSW5kZXggKyBcIl9cIiArIGkgKyBcIl9fXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnB1c2goYyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRQcm92aWRlICh2bSkge1xuICB2YXIgcHJvdmlkZSA9IHZtLiRvcHRpb25zLnByb3ZpZGU7XG4gIGlmIChwcm92aWRlKSB7XG4gICAgdm0uX3Byb3ZpZGVkID0gdHlwZW9mIHByb3ZpZGUgPT09ICdmdW5jdGlvbidcbiAgICAgID8gcHJvdmlkZS5jYWxsKHZtKVxuICAgICAgOiBwcm92aWRlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRJbmplY3Rpb25zICh2bSkge1xuICB2YXIgcmVzdWx0ID0gcmVzb2x2ZUluamVjdCh2bS4kb3B0aW9ucy5pbmplY3QsIHZtKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIHRvZ2dsZU9ic2VydmluZyhmYWxzZSk7XG4gICAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBkZWZpbmVSZWFjdGl2ZSQkMSh2bSwga2V5LCByZXN1bHRba2V5XSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICBcIkF2b2lkIG11dGF0aW5nIGFuIGluamVjdGVkIHZhbHVlIGRpcmVjdGx5IHNpbmNlIHRoZSBjaGFuZ2VzIHdpbGwgYmUgXCIgK1xuICAgICAgICAgICAgXCJvdmVyd3JpdHRlbiB3aGVuZXZlciB0aGUgcHJvdmlkZWQgY29tcG9uZW50IHJlLXJlbmRlcnMuIFwiICtcbiAgICAgICAgICAgIFwiaW5qZWN0aW9uIGJlaW5nIG11dGF0ZWQ6IFxcXCJcIiArIGtleSArIFwiXFxcIlwiLFxuICAgICAgICAgICAgdm1cbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCBrZXksIHJlc3VsdFtrZXldKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0b2dnbGVPYnNlcnZpbmcodHJ1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUluamVjdCAoaW5qZWN0LCB2bSkge1xuICBpZiAoaW5qZWN0KSB7XG4gICAgLy8gaW5qZWN0IGlzIDphbnkgYmVjYXVzZSBmbG93IGlzIG5vdCBzbWFydCBlbm91Z2ggdG8gZmlndXJlIG91dCBjYWNoZWRcbiAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB2YXIga2V5cyA9IGhhc1N5bWJvbFxuICAgICAgPyBSZWZsZWN0Lm93bktleXMoaW5qZWN0KVxuICAgICAgOiBPYmplY3Qua2V5cyhpbmplY3QpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgIC8vICM2NTc0IGluIGNhc2UgdGhlIGluamVjdCBvYmplY3QgaXMgb2JzZXJ2ZWQuLi5cbiAgICAgIGlmIChrZXkgPT09ICdfX29iX18nKSB7IGNvbnRpbnVlIH1cbiAgICAgIHZhciBwcm92aWRlS2V5ID0gaW5qZWN0W2tleV0uZnJvbTtcbiAgICAgIHZhciBzb3VyY2UgPSB2bTtcbiAgICAgIHdoaWxlIChzb3VyY2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZS5fcHJvdmlkZWQgJiYgaGFzT3duKHNvdXJjZS5fcHJvdmlkZWQsIHByb3ZpZGVLZXkpKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBzb3VyY2UuX3Byb3ZpZGVkW3Byb3ZpZGVLZXldO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgc291cmNlID0gc291cmNlLiRwYXJlbnQ7XG4gICAgICB9XG4gICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICBpZiAoJ2RlZmF1bHQnIGluIGluamVjdFtrZXldKSB7XG4gICAgICAgICAgdmFyIHByb3ZpZGVEZWZhdWx0ID0gaW5qZWN0W2tleV0uZGVmYXVsdDtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHR5cGVvZiBwcm92aWRlRGVmYXVsdCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBwcm92aWRlRGVmYXVsdC5jYWxsKHZtKVxuICAgICAgICAgICAgOiBwcm92aWRlRGVmYXVsdDtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgd2FybigoXCJJbmplY3Rpb24gXFxcIlwiICsga2V5ICsgXCJcXFwiIG5vdCBmb3VuZFwiKSwgdm0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxufVxuXG4vKiAgKi9cblxuXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyByYXcgY2hpbGRyZW4gVk5vZGVzIGludG8gYSBzbG90IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVNsb3RzIChcbiAgY2hpbGRyZW4sXG4gIGNvbnRleHRcbikge1xuICBpZiAoIWNoaWxkcmVuIHx8ICFjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuICB2YXIgc2xvdHMgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICB2YXIgZGF0YSA9IGNoaWxkLmRhdGE7XG4gICAgLy8gcmVtb3ZlIHNsb3QgYXR0cmlidXRlIGlmIHRoZSBub2RlIGlzIHJlc29sdmVkIGFzIGEgVnVlIHNsb3Qgbm9kZVxuICAgIGlmIChkYXRhICYmIGRhdGEuYXR0cnMgJiYgZGF0YS5hdHRycy5zbG90KSB7XG4gICAgICBkZWxldGUgZGF0YS5hdHRycy5zbG90O1xuICAgIH1cbiAgICAvLyBuYW1lZCBzbG90cyBzaG91bGQgb25seSBiZSByZXNwZWN0ZWQgaWYgdGhlIHZub2RlIHdhcyByZW5kZXJlZCBpbiB0aGVcbiAgICAvLyBzYW1lIGNvbnRleHQuXG4gICAgaWYgKChjaGlsZC5jb250ZXh0ID09PSBjb250ZXh0IHx8IGNoaWxkLmZuQ29udGV4dCA9PT0gY29udGV4dCkgJiZcbiAgICAgIGRhdGEgJiYgZGF0YS5zbG90ICE9IG51bGxcbiAgICApIHtcbiAgICAgIHZhciBuYW1lID0gZGF0YS5zbG90O1xuICAgICAgdmFyIHNsb3QgPSAoc2xvdHNbbmFtZV0gfHwgKHNsb3RzW25hbWVdID0gW10pKTtcbiAgICAgIGlmIChjaGlsZC50YWcgPT09ICd0ZW1wbGF0ZScpIHtcbiAgICAgICAgc2xvdC5wdXNoLmFwcGx5KHNsb3QsIGNoaWxkLmNoaWxkcmVuIHx8IFtdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNsb3QucHVzaChjaGlsZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZpeGVkIGJ5IHh4eHh4eCDkuLTml7YgaGFjayDmjokgdW5pLWFwcCDkuK3nmoTlvILmraUgbmFtZSBzbG90IHBhZ2VcbiAgICAgIGlmKGNoaWxkLmFzeW5jTWV0YSAmJiBjaGlsZC5hc3luY01ldGEuZGF0YSAmJiBjaGlsZC5hc3luY01ldGEuZGF0YS5zbG90ID09PSAncGFnZScpe1xuICAgICAgICAoc2xvdHNbJ3BhZ2UnXSB8fCAoc2xvdHNbJ3BhZ2UnXSA9IFtdKSkucHVzaChjaGlsZCk7XG4gICAgICB9ZWxzZXtcbiAgICAgICAgKHNsb3RzLmRlZmF1bHQgfHwgKHNsb3RzLmRlZmF1bHQgPSBbXSkpLnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBpZ25vcmUgc2xvdHMgdGhhdCBjb250YWlucyBvbmx5IHdoaXRlc3BhY2VcbiAgZm9yICh2YXIgbmFtZSQxIGluIHNsb3RzKSB7XG4gICAgaWYgKHNsb3RzW25hbWUkMV0uZXZlcnkoaXNXaGl0ZXNwYWNlKSkge1xuICAgICAgZGVsZXRlIHNsb3RzW25hbWUkMV07XG4gICAgfVxuICB9XG4gIHJldHVybiBzbG90c1xufVxuXG5mdW5jdGlvbiBpc1doaXRlc3BhY2UgKG5vZGUpIHtcbiAgcmV0dXJuIChub2RlLmlzQ29tbWVudCAmJiAhbm9kZS5hc3luY0ZhY3RvcnkpIHx8IG5vZGUudGV4dCA9PT0gJyAnXG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVTY29wZWRTbG90cyAoXG4gIHNsb3RzLFxuICBub3JtYWxTbG90cyxcbiAgcHJldlNsb3RzXG4pIHtcbiAgdmFyIHJlcztcbiAgdmFyIGhhc05vcm1hbFNsb3RzID0gT2JqZWN0LmtleXMobm9ybWFsU2xvdHMpLmxlbmd0aCA+IDA7XG4gIHZhciBpc1N0YWJsZSA9IHNsb3RzID8gISFzbG90cy4kc3RhYmxlIDogIWhhc05vcm1hbFNsb3RzO1xuICB2YXIga2V5ID0gc2xvdHMgJiYgc2xvdHMuJGtleTtcbiAgaWYgKCFzbG90cykge1xuICAgIHJlcyA9IHt9O1xuICB9IGVsc2UgaWYgKHNsb3RzLl9ub3JtYWxpemVkKSB7XG4gICAgLy8gZmFzdCBwYXRoIDE6IGNoaWxkIGNvbXBvbmVudCByZS1yZW5kZXIgb25seSwgcGFyZW50IGRpZCBub3QgY2hhbmdlXG4gICAgcmV0dXJuIHNsb3RzLl9ub3JtYWxpemVkXG4gIH0gZWxzZSBpZiAoXG4gICAgaXNTdGFibGUgJiZcbiAgICBwcmV2U2xvdHMgJiZcbiAgICBwcmV2U2xvdHMgIT09IGVtcHR5T2JqZWN0ICYmXG4gICAga2V5ID09PSBwcmV2U2xvdHMuJGtleSAmJlxuICAgICFoYXNOb3JtYWxTbG90cyAmJlxuICAgICFwcmV2U2xvdHMuJGhhc05vcm1hbFxuICApIHtcbiAgICAvLyBmYXN0IHBhdGggMjogc3RhYmxlIHNjb3BlZCBzbG90cyB3LyBubyBub3JtYWwgc2xvdHMgdG8gcHJveHksXG4gICAgLy8gb25seSBuZWVkIHRvIG5vcm1hbGl6ZSBvbmNlXG4gICAgcmV0dXJuIHByZXZTbG90c1xuICB9IGVsc2Uge1xuICAgIHJlcyA9IHt9O1xuICAgIGZvciAodmFyIGtleSQxIGluIHNsb3RzKSB7XG4gICAgICBpZiAoc2xvdHNba2V5JDFdICYmIGtleSQxWzBdICE9PSAnJCcpIHtcbiAgICAgICAgcmVzW2tleSQxXSA9IG5vcm1hbGl6ZVNjb3BlZFNsb3Qobm9ybWFsU2xvdHMsIGtleSQxLCBzbG90c1trZXkkMV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBleHBvc2Ugbm9ybWFsIHNsb3RzIG9uIHNjb3BlZFNsb3RzXG4gIGZvciAodmFyIGtleSQyIGluIG5vcm1hbFNsb3RzKSB7XG4gICAgaWYgKCEoa2V5JDIgaW4gcmVzKSkge1xuICAgICAgcmVzW2tleSQyXSA9IHByb3h5Tm9ybWFsU2xvdChub3JtYWxTbG90cywga2V5JDIpO1xuICAgIH1cbiAgfVxuICAvLyBhdm9yaWF6IHNlZW1zIHRvIG1vY2sgYSBub24tZXh0ZW5zaWJsZSAkc2NvcGVkU2xvdHMgb2JqZWN0XG4gIC8vIGFuZCB3aGVuIHRoYXQgaXMgcGFzc2VkIGRvd24gdGhpcyB3b3VsZCBjYXVzZSBhbiBlcnJvclxuICBpZiAoc2xvdHMgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShzbG90cykpIHtcbiAgICAoc2xvdHMpLl9ub3JtYWxpemVkID0gcmVzO1xuICB9XG4gIGRlZihyZXMsICckc3RhYmxlJywgaXNTdGFibGUpO1xuICBkZWYocmVzLCAnJGtleScsIGtleSk7XG4gIGRlZihyZXMsICckaGFzTm9ybWFsJywgaGFzTm9ybWFsU2xvdHMpO1xuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNjb3BlZFNsb3Qobm9ybWFsU2xvdHMsIGtleSwgZm4pIHtcbiAgdmFyIG5vcm1hbGl6ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlcyA9IGFyZ3VtZW50cy5sZW5ndGggPyBmbi5hcHBseShudWxsLCBhcmd1bWVudHMpIDogZm4oe30pO1xuICAgIHJlcyA9IHJlcyAmJiB0eXBlb2YgcmVzID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyZXMpXG4gICAgICA/IFtyZXNdIC8vIHNpbmdsZSB2bm9kZVxuICAgICAgOiBub3JtYWxpemVDaGlsZHJlbihyZXMpO1xuICAgIHJldHVybiByZXMgJiYgKFxuICAgICAgcmVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKHJlcy5sZW5ndGggPT09IDEgJiYgcmVzWzBdLmlzQ29tbWVudCkgLy8gIzk2NThcbiAgICApID8gdW5kZWZpbmVkXG4gICAgICA6IHJlc1xuICB9O1xuICAvLyB0aGlzIGlzIGEgc2xvdCB1c2luZyB0aGUgbmV3IHYtc2xvdCBzeW50YXggd2l0aG91dCBzY29wZS4gYWx0aG91Z2ggaXQgaXNcbiAgLy8gY29tcGlsZWQgYXMgYSBzY29wZWQgc2xvdCwgcmVuZGVyIGZuIHVzZXJzIHdvdWxkIGV4cGVjdCBpdCB0byBiZSBwcmVzZW50XG4gIC8vIG9uIHRoaXMuJHNsb3RzIGJlY2F1c2UgdGhlIHVzYWdlIGlzIHNlbWFudGljYWxseSBhIG5vcm1hbCBzbG90LlxuICBpZiAoZm4ucHJveHkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9ybWFsU2xvdHMsIGtleSwge1xuICAgICAgZ2V0OiBub3JtYWxpemVkLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVkXG59XG5cbmZ1bmN0aW9uIHByb3h5Tm9ybWFsU2xvdChzbG90cywga2V5KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBzbG90c1trZXldOyB9XG59XG5cbi8qICAqL1xuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciByZW5kZXJpbmcgdi1mb3IgbGlzdHMuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckxpc3QgKFxuICB2YWwsXG4gIHJlbmRlclxuKSB7XG4gIHZhciByZXQsIGksIGwsIGtleXMsIGtleTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSB8fCB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHJldCA9IG5ldyBBcnJheSh2YWwubGVuZ3RoKTtcbiAgICBmb3IgKGkgPSAwLCBsID0gdmFsLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgcmV0W2ldID0gcmVuZGVyKHZhbFtpXSwgaSwgaSwgaSk7IC8vIGZpeGVkIGJ5IHh4eHh4eFxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHJldCA9IG5ldyBBcnJheSh2YWwpO1xuICAgIGZvciAoaSA9IDA7IGkgPCB2YWw7IGkrKykge1xuICAgICAgcmV0W2ldID0gcmVuZGVyKGkgKyAxLCBpLCBpLCBpKTsgLy8gZml4ZWQgYnkgeHh4eHh4XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbCkpIHtcbiAgICBpZiAoaGFzU3ltYm9sICYmIHZhbFtTeW1ib2wuaXRlcmF0b3JdKSB7XG4gICAgICByZXQgPSBbXTtcbiAgICAgIHZhciBpdGVyYXRvciA9IHZhbFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgd2hpbGUgKCFyZXN1bHQuZG9uZSkge1xuICAgICAgICByZXQucHVzaChyZW5kZXIocmVzdWx0LnZhbHVlLCByZXQubGVuZ3RoLCBpLCBpKyspKTsgLy8gZml4ZWQgYnkgeHh4eHh4XG4gICAgICAgIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7XG4gICAgICByZXQgPSBuZXcgQXJyYXkoa2V5cy5sZW5ndGgpO1xuICAgICAgZm9yIChpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgIHJldFtpXSA9IHJlbmRlcih2YWxba2V5XSwga2V5LCBpLCBpKTsgLy8gZml4ZWQgYnkgeHh4eHh4XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICghaXNEZWYocmV0KSkge1xuICAgIHJldCA9IFtdO1xuICB9XG4gIChyZXQpLl9pc1ZMaXN0ID0gdHJ1ZTtcbiAgcmV0dXJuIHJldFxufVxuXG4vKiAgKi9cblxuLyoqXG4gKiBSdW50aW1lIGhlbHBlciBmb3IgcmVuZGVyaW5nIDxzbG90PlxuICovXG5mdW5jdGlvbiByZW5kZXJTbG90IChcbiAgbmFtZSxcbiAgZmFsbGJhY2ssXG4gIHByb3BzLFxuICBiaW5kT2JqZWN0XG4pIHtcbiAgdmFyIHNjb3BlZFNsb3RGbiA9IHRoaXMuJHNjb3BlZFNsb3RzW25hbWVdO1xuICB2YXIgbm9kZXM7XG4gIGlmIChzY29wZWRTbG90Rm4pIHsgLy8gc2NvcGVkIHNsb3RcbiAgICBwcm9wcyA9IHByb3BzIHx8IHt9O1xuICAgIGlmIChiaW5kT2JqZWN0KSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhaXNPYmplY3QoYmluZE9iamVjdCkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAnc2xvdCB2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCcsXG4gICAgICAgICAgdGhpc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcHJvcHMgPSBleHRlbmQoZXh0ZW5kKHt9LCBiaW5kT2JqZWN0KSwgcHJvcHMpO1xuICAgIH1cbiAgICAvLyBmaXhlZCBieSB4eHh4eHggYXBwLXBsdXMgc2NvcGVkU2xvdFxuICAgIG5vZGVzID0gc2NvcGVkU2xvdEZuKHByb3BzLCB0aGlzLCBwcm9wcy5faSkgfHwgZmFsbGJhY2s7XG4gIH0gZWxzZSB7XG4gICAgbm9kZXMgPSB0aGlzLiRzbG90c1tuYW1lXSB8fCBmYWxsYmFjaztcbiAgfVxuXG4gIHZhciB0YXJnZXQgPSBwcm9wcyAmJiBwcm9wcy5zbG90O1xuICBpZiAodGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMuJGNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJywgeyBzbG90OiB0YXJnZXQgfSwgbm9kZXMpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5vZGVzXG4gIH1cbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyBmaWx0ZXJzXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVGaWx0ZXIgKGlkKSB7XG4gIHJldHVybiByZXNvbHZlQXNzZXQodGhpcy4kb3B0aW9ucywgJ2ZpbHRlcnMnLCBpZCwgdHJ1ZSkgfHwgaWRlbnRpdHlcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGlzS2V5Tm90TWF0Y2ggKGV4cGVjdCwgYWN0dWFsKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdCkpIHtcbiAgICByZXR1cm4gZXhwZWN0LmluZGV4T2YoYWN0dWFsKSA9PT0gLTFcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZXhwZWN0ICE9PSBhY3R1YWxcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciBjaGVja2luZyBrZXlDb2RlcyBmcm9tIGNvbmZpZy5cbiAqIGV4cG9zZWQgYXMgVnVlLnByb3RvdHlwZS5fa1xuICogcGFzc2luZyBpbiBldmVudEtleU5hbWUgYXMgbGFzdCBhcmd1bWVudCBzZXBhcmF0ZWx5IGZvciBiYWNrd2FyZHMgY29tcGF0XG4gKi9cbmZ1bmN0aW9uIGNoZWNrS2V5Q29kZXMgKFxuICBldmVudEtleUNvZGUsXG4gIGtleSxcbiAgYnVpbHRJbktleUNvZGUsXG4gIGV2ZW50S2V5TmFtZSxcbiAgYnVpbHRJbktleU5hbWVcbikge1xuICB2YXIgbWFwcGVkS2V5Q29kZSA9IGNvbmZpZy5rZXlDb2Rlc1trZXldIHx8IGJ1aWx0SW5LZXlDb2RlO1xuICBpZiAoYnVpbHRJbktleU5hbWUgJiYgZXZlbnRLZXlOYW1lICYmICFjb25maWcua2V5Q29kZXNba2V5XSkge1xuICAgIHJldHVybiBpc0tleU5vdE1hdGNoKGJ1aWx0SW5LZXlOYW1lLCBldmVudEtleU5hbWUpXG4gIH0gZWxzZSBpZiAobWFwcGVkS2V5Q29kZSkge1xuICAgIHJldHVybiBpc0tleU5vdE1hdGNoKG1hcHBlZEtleUNvZGUsIGV2ZW50S2V5Q29kZSlcbiAgfSBlbHNlIGlmIChldmVudEtleU5hbWUpIHtcbiAgICByZXR1cm4gaHlwaGVuYXRlKGV2ZW50S2V5TmFtZSkgIT09IGtleVxuICB9XG59XG5cbi8qICAqL1xuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciBtZXJnaW5nIHYtYmluZD1cIm9iamVjdFwiIGludG8gYSBWTm9kZSdzIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGJpbmRPYmplY3RQcm9wcyAoXG4gIGRhdGEsXG4gIHRhZyxcbiAgdmFsdWUsXG4gIGFzUHJvcCxcbiAgaXNTeW5jXG4pIHtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgJ3YtYmluZCB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IG9yIEFycmF5IHZhbHVlJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gdG9PYmplY3QodmFsdWUpO1xuICAgICAgfVxuICAgICAgdmFyIGhhc2g7XG4gICAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgga2V5ICkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAga2V5ID09PSAnY2xhc3MnIHx8XG4gICAgICAgICAga2V5ID09PSAnc3R5bGUnIHx8XG4gICAgICAgICAgaXNSZXNlcnZlZEF0dHJpYnV0ZShrZXkpXG4gICAgICAgICkge1xuICAgICAgICAgIGhhc2ggPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciB0eXBlID0gZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnR5cGU7XG4gICAgICAgICAgaGFzaCA9IGFzUHJvcCB8fCBjb25maWcubXVzdFVzZVByb3AodGFnLCB0eXBlLCBrZXkpXG4gICAgICAgICAgICA/IGRhdGEuZG9tUHJvcHMgfHwgKGRhdGEuZG9tUHJvcHMgPSB7fSlcbiAgICAgICAgICAgIDogZGF0YS5hdHRycyB8fCAoZGF0YS5hdHRycyA9IHt9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2FtZWxpemVkS2V5ID0gY2FtZWxpemUoa2V5KTtcbiAgICAgICAgdmFyIGh5cGhlbmF0ZWRLZXkgPSBoeXBoZW5hdGUoa2V5KTtcbiAgICAgICAgaWYgKCEoY2FtZWxpemVkS2V5IGluIGhhc2gpICYmICEoaHlwaGVuYXRlZEtleSBpbiBoYXNoKSkge1xuICAgICAgICAgIGhhc2hba2V5XSA9IHZhbHVlW2tleV07XG5cbiAgICAgICAgICBpZiAoaXNTeW5jKSB7XG4gICAgICAgICAgICB2YXIgb24gPSBkYXRhLm9uIHx8IChkYXRhLm9uID0ge30pO1xuICAgICAgICAgICAgb25bKFwidXBkYXRlOlwiICsga2V5KV0gPSBmdW5jdGlvbiAoJGV2ZW50KSB7XG4gICAgICAgICAgICAgIHZhbHVlW2tleV0gPSAkZXZlbnQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSBsb29wKCBrZXkgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyBzdGF0aWMgdHJlZXMuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlclN0YXRpYyAoXG4gIGluZGV4LFxuICBpc0luRm9yXG4pIHtcbiAgdmFyIGNhY2hlZCA9IHRoaXMuX3N0YXRpY1RyZWVzIHx8ICh0aGlzLl9zdGF0aWNUcmVlcyA9IFtdKTtcbiAgdmFyIHRyZWUgPSBjYWNoZWRbaW5kZXhdO1xuICAvLyBpZiBoYXMgYWxyZWFkeS1yZW5kZXJlZCBzdGF0aWMgdHJlZSBhbmQgbm90IGluc2lkZSB2LWZvcixcbiAgLy8gd2UgY2FuIHJldXNlIHRoZSBzYW1lIHRyZWUuXG4gIGlmICh0cmVlICYmICFpc0luRm9yKSB7XG4gICAgcmV0dXJuIHRyZWVcbiAgfVxuICAvLyBvdGhlcndpc2UsIHJlbmRlciBhIGZyZXNoIHRyZWUuXG4gIHRyZWUgPSBjYWNoZWRbaW5kZXhdID0gdGhpcy4kb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnNbaW5kZXhdLmNhbGwoXG4gICAgdGhpcy5fcmVuZGVyUHJveHksXG4gICAgbnVsbCxcbiAgICB0aGlzIC8vIGZvciByZW5kZXIgZm5zIGdlbmVyYXRlZCBmb3IgZnVuY3Rpb25hbCBjb21wb25lbnQgdGVtcGxhdGVzXG4gICk7XG4gIG1hcmtTdGF0aWModHJlZSwgKFwiX19zdGF0aWNfX1wiICsgaW5kZXgpLCBmYWxzZSk7XG4gIHJldHVybiB0cmVlXG59XG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHYtb25jZS5cbiAqIEVmZmVjdGl2ZWx5IGl0IG1lYW5zIG1hcmtpbmcgdGhlIG5vZGUgYXMgc3RhdGljIHdpdGggYSB1bmlxdWUga2V5LlxuICovXG5mdW5jdGlvbiBtYXJrT25jZSAoXG4gIHRyZWUsXG4gIGluZGV4LFxuICBrZXlcbikge1xuICBtYXJrU3RhdGljKHRyZWUsIChcIl9fb25jZV9fXCIgKyBpbmRleCArIChrZXkgPyAoXCJfXCIgKyBrZXkpIDogXCJcIikpLCB0cnVlKTtcbiAgcmV0dXJuIHRyZWVcbn1cblxuZnVuY3Rpb24gbWFya1N0YXRpYyAoXG4gIHRyZWUsXG4gIGtleSxcbiAgaXNPbmNlXG4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodHJlZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyZWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0cmVlW2ldICYmIHR5cGVvZiB0cmVlW2ldICE9PSAnc3RyaW5nJykge1xuICAgICAgICBtYXJrU3RhdGljTm9kZSh0cmVlW2ldLCAoa2V5ICsgXCJfXCIgKyBpKSwgaXNPbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbWFya1N0YXRpY05vZGUodHJlZSwga2V5LCBpc09uY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtTdGF0aWNOb2RlIChub2RlLCBrZXksIGlzT25jZSkge1xuICBub2RlLmlzU3RhdGljID0gdHJ1ZTtcbiAgbm9kZS5rZXkgPSBrZXk7XG4gIG5vZGUuaXNPbmNlID0gaXNPbmNlO1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gYmluZE9iamVjdExpc3RlbmVycyAoZGF0YSwgdmFsdWUpIHtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICAndi1vbiB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IHZhbHVlJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG9uID0gZGF0YS5vbiA9IGRhdGEub24gPyBleHRlbmQoe30sIGRhdGEub24pIDoge307XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gb25ba2V5XTtcbiAgICAgICAgdmFyIG91cnMgPSB2YWx1ZVtrZXldO1xuICAgICAgICBvbltrZXldID0gZXhpc3RpbmcgPyBbXS5jb25jYXQoZXhpc3RpbmcsIG91cnMpIDogb3VycztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIHJlc29sdmVTY29wZWRTbG90cyAoXG4gIGZucywgLy8gc2VlIGZsb3cvdm5vZGVcbiAgcmVzLFxuICAvLyB0aGUgZm9sbG93aW5nIGFyZSBhZGRlZCBpbiAyLjZcbiAgaGFzRHluYW1pY0tleXMsXG4gIGNvbnRlbnRIYXNoS2V5XG4pIHtcbiAgcmVzID0gcmVzIHx8IHsgJHN0YWJsZTogIWhhc0R5bmFtaWNLZXlzIH07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZm5zLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNsb3QgPSBmbnNbaV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2xvdCkpIHtcbiAgICAgIHJlc29sdmVTY29wZWRTbG90cyhzbG90LCByZXMsIGhhc0R5bmFtaWNLZXlzKTtcbiAgICB9IGVsc2UgaWYgKHNsb3QpIHtcbiAgICAgIC8vIG1hcmtlciBmb3IgcmV2ZXJzZSBwcm94eWluZyB2LXNsb3Qgd2l0aG91dCBzY29wZSBvbiB0aGlzLiRzbG90c1xuICAgICAgaWYgKHNsb3QucHJveHkpIHtcbiAgICAgICAgc2xvdC5mbi5wcm94eSA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXNbc2xvdC5rZXldID0gc2xvdC5mbjtcbiAgICB9XG4gIH1cbiAgaWYgKGNvbnRlbnRIYXNoS2V5KSB7XG4gICAgKHJlcykuJGtleSA9IGNvbnRlbnRIYXNoS2V5O1xuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGJpbmREeW5hbWljS2V5cyAoYmFzZU9iaiwgdmFsdWVzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIGtleSA9IHZhbHVlc1tpXTtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5KSB7XG4gICAgICBiYXNlT2JqW3ZhbHVlc1tpXV0gPSB2YWx1ZXNbaSArIDFdO1xuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBrZXkgIT09ICcnICYmIGtleSAhPT0gbnVsbCkge1xuICAgICAgLy8gbnVsbCBpcyBhIHNwZWNpYWwgdmFsdWUgZm9yIGV4cGxpY2l0bHkgcmVtb3ZpbmcgYSBiaW5kaW5nXG4gICAgICB3YXJuKFxuICAgICAgICAoXCJJbnZhbGlkIHZhbHVlIGZvciBkeW5hbWljIGRpcmVjdGl2ZSBhcmd1bWVudCAoZXhwZWN0ZWQgc3RyaW5nIG9yIG51bGwpOiBcIiArIGtleSksXG4gICAgICAgIHRoaXNcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBiYXNlT2JqXG59XG5cbi8vIGhlbHBlciB0byBkeW5hbWljYWxseSBhcHBlbmQgbW9kaWZpZXIgcnVudGltZSBtYXJrZXJzIHRvIGV2ZW50IG5hbWVzLlxuLy8gZW5zdXJlIG9ubHkgYXBwZW5kIHdoZW4gdmFsdWUgaXMgYWxyZWFkeSBzdHJpbmcsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGNhc3Rcbi8vIHRvIHN0cmluZyBhbmQgY2F1c2UgdGhlIHR5cGUgY2hlY2sgdG8gbWlzcy5cbmZ1bmN0aW9uIHByZXBlbmRNb2RpZmllciAodmFsdWUsIHN5bWJvbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHN5bWJvbCArIHZhbHVlIDogdmFsdWVcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluc3RhbGxSZW5kZXJIZWxwZXJzICh0YXJnZXQpIHtcbiAgdGFyZ2V0Ll9vID0gbWFya09uY2U7XG4gIHRhcmdldC5fbiA9IHRvTnVtYmVyO1xuICB0YXJnZXQuX3MgPSB0b1N0cmluZztcbiAgdGFyZ2V0Ll9sID0gcmVuZGVyTGlzdDtcbiAgdGFyZ2V0Ll90ID0gcmVuZGVyU2xvdDtcbiAgdGFyZ2V0Ll9xID0gbG9vc2VFcXVhbDtcbiAgdGFyZ2V0Ll9pID0gbG9vc2VJbmRleE9mO1xuICB0YXJnZXQuX20gPSByZW5kZXJTdGF0aWM7XG4gIHRhcmdldC5fZiA9IHJlc29sdmVGaWx0ZXI7XG4gIHRhcmdldC5fayA9IGNoZWNrS2V5Q29kZXM7XG4gIHRhcmdldC5fYiA9IGJpbmRPYmplY3RQcm9wcztcbiAgdGFyZ2V0Ll92ID0gY3JlYXRlVGV4dFZOb2RlO1xuICB0YXJnZXQuX2UgPSBjcmVhdGVFbXB0eVZOb2RlO1xuICB0YXJnZXQuX3UgPSByZXNvbHZlU2NvcGVkU2xvdHM7XG4gIHRhcmdldC5fZyA9IGJpbmRPYmplY3RMaXN0ZW5lcnM7XG4gIHRhcmdldC5fZCA9IGJpbmREeW5hbWljS2V5cztcbiAgdGFyZ2V0Ll9wID0gcHJlcGVuZE1vZGlmaWVyO1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gRnVuY3Rpb25hbFJlbmRlckNvbnRleHQgKFxuICBkYXRhLFxuICBwcm9wcyxcbiAgY2hpbGRyZW4sXG4gIHBhcmVudCxcbiAgQ3RvclxuKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zO1xuICAvLyBlbnN1cmUgdGhlIGNyZWF0ZUVsZW1lbnQgZnVuY3Rpb24gaW4gZnVuY3Rpb25hbCBjb21wb25lbnRzXG4gIC8vIGdldHMgYSB1bmlxdWUgY29udGV4dCAtIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBjb3JyZWN0IG5hbWVkIHNsb3QgY2hlY2tcbiAgdmFyIGNvbnRleHRWbTtcbiAgaWYgKGhhc093bihwYXJlbnQsICdfdWlkJykpIHtcbiAgICBjb250ZXh0Vm0gPSBPYmplY3QuY3JlYXRlKHBhcmVudCk7XG4gICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgY29udGV4dFZtLl9vcmlnaW5hbCA9IHBhcmVudDtcbiAgfSBlbHNlIHtcbiAgICAvLyB0aGUgY29udGV4dCB2bSBwYXNzZWQgaW4gaXMgYSBmdW5jdGlvbmFsIGNvbnRleHQgYXMgd2VsbC5cbiAgICAvLyBpbiB0aGlzIGNhc2Ugd2Ugd2FudCB0byBtYWtlIHN1cmUgd2UgYXJlIGFibGUgdG8gZ2V0IGEgaG9sZCB0byB0aGVcbiAgICAvLyByZWFsIGNvbnRleHQgaW5zdGFuY2UuXG4gICAgY29udGV4dFZtID0gcGFyZW50O1xuICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgIHBhcmVudCA9IHBhcmVudC5fb3JpZ2luYWw7XG4gIH1cbiAgdmFyIGlzQ29tcGlsZWQgPSBpc1RydWUob3B0aW9ucy5fY29tcGlsZWQpO1xuICB2YXIgbmVlZE5vcm1hbGl6YXRpb24gPSAhaXNDb21waWxlZDtcblxuICB0aGlzLmRhdGEgPSBkYXRhO1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMubGlzdGVuZXJzID0gZGF0YS5vbiB8fCBlbXB0eU9iamVjdDtcbiAgdGhpcy5pbmplY3Rpb25zID0gcmVzb2x2ZUluamVjdChvcHRpb25zLmluamVjdCwgcGFyZW50KTtcbiAgdGhpcy5zbG90cyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMkMS4kc2xvdHMpIHtcbiAgICAgIG5vcm1hbGl6ZVNjb3BlZFNsb3RzKFxuICAgICAgICBkYXRhLnNjb3BlZFNsb3RzLFxuICAgICAgICB0aGlzJDEuJHNsb3RzID0gcmVzb2x2ZVNsb3RzKGNoaWxkcmVuLCBwYXJlbnQpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcyQxLiRzbG90c1xuICB9O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc2NvcGVkU2xvdHMnLCAoe1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQgKCkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVNjb3BlZFNsb3RzKGRhdGEuc2NvcGVkU2xvdHMsIHRoaXMuc2xvdHMoKSlcbiAgICB9XG4gIH0pKTtcblxuICAvLyBzdXBwb3J0IGZvciBjb21waWxlZCBmdW5jdGlvbmFsIHRlbXBsYXRlXG4gIGlmIChpc0NvbXBpbGVkKSB7XG4gICAgLy8gZXhwb3NpbmcgJG9wdGlvbnMgZm9yIHJlbmRlclN0YXRpYygpXG4gICAgdGhpcy4kb3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgLy8gcHJlLXJlc29sdmUgc2xvdHMgZm9yIHJlbmRlclNsb3QoKVxuICAgIHRoaXMuJHNsb3RzID0gdGhpcy5zbG90cygpO1xuICAgIHRoaXMuJHNjb3BlZFNsb3RzID0gbm9ybWFsaXplU2NvcGVkU2xvdHMoZGF0YS5zY29wZWRTbG90cywgdGhpcy4kc2xvdHMpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuX3Njb3BlSWQpIHtcbiAgICB0aGlzLl9jID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHtcbiAgICAgIHZhciB2bm9kZSA9IGNyZWF0ZUVsZW1lbnQoY29udGV4dFZtLCBhLCBiLCBjLCBkLCBuZWVkTm9ybWFsaXphdGlvbik7XG4gICAgICBpZiAodm5vZGUgJiYgIUFycmF5LmlzQXJyYXkodm5vZGUpKSB7XG4gICAgICAgIHZub2RlLmZuU2NvcGVJZCA9IG9wdGlvbnMuX3Njb3BlSWQ7XG4gICAgICAgIHZub2RlLmZuQ29udGV4dCA9IHBhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2bm9kZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fYyA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7IHJldHVybiBjcmVhdGVFbGVtZW50KGNvbnRleHRWbSwgYSwgYiwgYywgZCwgbmVlZE5vcm1hbGl6YXRpb24pOyB9O1xuICB9XG59XG5cbmluc3RhbGxSZW5kZXJIZWxwZXJzKEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0LnByb3RvdHlwZSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQgKFxuICBDdG9yLFxuICBwcm9wc0RhdGEsXG4gIGRhdGEsXG4gIGNvbnRleHRWbSxcbiAgY2hpbGRyZW5cbikge1xuICB2YXIgb3B0aW9ucyA9IEN0b3Iub3B0aW9ucztcbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBwcm9wT3B0aW9ucyA9IG9wdGlvbnMucHJvcHM7XG4gIGlmIChpc0RlZihwcm9wT3B0aW9ucykpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcE9wdGlvbnMpIHtcbiAgICAgIHByb3BzW2tleV0gPSB2YWxpZGF0ZVByb3Aoa2V5LCBwcm9wT3B0aW9ucywgcHJvcHNEYXRhIHx8IGVtcHR5T2JqZWN0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzRGVmKGRhdGEuYXR0cnMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEuYXR0cnMpOyB9XG4gICAgaWYgKGlzRGVmKGRhdGEucHJvcHMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEucHJvcHMpOyB9XG4gIH1cblxuICB2YXIgcmVuZGVyQ29udGV4dCA9IG5ldyBGdW5jdGlvbmFsUmVuZGVyQ29udGV4dChcbiAgICBkYXRhLFxuICAgIHByb3BzLFxuICAgIGNoaWxkcmVuLFxuICAgIGNvbnRleHRWbSxcbiAgICBDdG9yXG4gICk7XG5cbiAgdmFyIHZub2RlID0gb3B0aW9ucy5yZW5kZXIuY2FsbChudWxsLCByZW5kZXJDb250ZXh0Ll9jLCByZW5kZXJDb250ZXh0KTtcblxuICBpZiAodm5vZGUgaW5zdGFuY2VvZiBWTm9kZSkge1xuICAgIHJldHVybiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0KHZub2RlLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucywgcmVuZGVyQ29udGV4dClcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZub2RlKSkge1xuICAgIHZhciB2bm9kZXMgPSBub3JtYWxpemVDaGlsZHJlbih2bm9kZSkgfHwgW107XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheSh2bm9kZXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzW2ldID0gY2xvbmVBbmRNYXJrRnVuY3Rpb25hbFJlc3VsdCh2bm9kZXNbaV0sIGRhdGEsIHJlbmRlckNvbnRleHQucGFyZW50LCBvcHRpb25zLCByZW5kZXJDb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb25lQW5kTWFya0Z1bmN0aW9uYWxSZXN1bHQgKHZub2RlLCBkYXRhLCBjb250ZXh0Vm0sIG9wdGlvbnMsIHJlbmRlckNvbnRleHQpIHtcbiAgLy8gIzc4MTcgY2xvbmUgbm9kZSBiZWZvcmUgc2V0dGluZyBmbkNvbnRleHQsIG90aGVyd2lzZSBpZiB0aGUgbm9kZSBpcyByZXVzZWRcbiAgLy8gKGUuZy4gaXQgd2FzIGZyb20gYSBjYWNoZWQgbm9ybWFsIHNsb3QpIHRoZSBmbkNvbnRleHQgY2F1c2VzIG5hbWVkIHNsb3RzXG4gIC8vIHRoYXQgc2hvdWxkIG5vdCBiZSBtYXRjaGVkIHRvIG1hdGNoLlxuICB2YXIgY2xvbmUgPSBjbG9uZVZOb2RlKHZub2RlKTtcbiAgY2xvbmUuZm5Db250ZXh0ID0gY29udGV4dFZtO1xuICBjbG9uZS5mbk9wdGlvbnMgPSBvcHRpb25zO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIChjbG9uZS5kZXZ0b29sc01ldGEgPSBjbG9uZS5kZXZ0b29sc01ldGEgfHwge30pLnJlbmRlckNvbnRleHQgPSByZW5kZXJDb250ZXh0O1xuICB9XG4gIGlmIChkYXRhLnNsb3QpIHtcbiAgICAoY2xvbmUuZGF0YSB8fCAoY2xvbmUuZGF0YSA9IHt9KSkuc2xvdCA9IGRhdGEuc2xvdDtcbiAgfVxuICByZXR1cm4gY2xvbmVcbn1cblxuZnVuY3Rpb24gbWVyZ2VQcm9wcyAodG8sIGZyb20pIHtcbiAgZm9yICh2YXIga2V5IGluIGZyb20pIHtcbiAgICB0b1tjYW1lbGl6ZShrZXkpXSA9IGZyb21ba2V5XTtcbiAgfVxufVxuXG4vKiAgKi9cblxuLyogICovXG5cbi8qICAqL1xuXG4vKiAgKi9cblxuLy8gaW5saW5lIGhvb2tzIHRvIGJlIGludm9rZWQgb24gY29tcG9uZW50IFZOb2RlcyBkdXJpbmcgcGF0Y2hcbnZhciBjb21wb25lbnRWTm9kZUhvb2tzID0ge1xuICBpbml0OiBmdW5jdGlvbiBpbml0ICh2bm9kZSwgaHlkcmF0aW5nKSB7XG4gICAgaWYgKFxuICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgJiZcbiAgICAgICF2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQgJiZcbiAgICAgIHZub2RlLmRhdGEua2VlcEFsaXZlXG4gICAgKSB7XG4gICAgICAvLyBrZXB0LWFsaXZlIGNvbXBvbmVudHMsIHRyZWF0IGFzIGEgcGF0Y2hcbiAgICAgIHZhciBtb3VudGVkTm9kZSA9IHZub2RlOyAvLyB3b3JrIGFyb3VuZCBmbG93XG4gICAgICBjb21wb25lbnRWTm9kZUhvb2tzLnByZXBhdGNoKG1vdW50ZWROb2RlLCBtb3VudGVkTm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjaGlsZCA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2VGb3JWbm9kZShcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIGFjdGl2ZUluc3RhbmNlXG4gICAgICApO1xuICAgICAgY2hpbGQuJG1vdW50KGh5ZHJhdGluZyA/IHZub2RlLmVsbSA6IHVuZGVmaW5lZCwgaHlkcmF0aW5nKTtcbiAgICB9XG4gIH0sXG5cbiAgcHJlcGF0Y2g6IGZ1bmN0aW9uIHByZXBhdGNoIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnM7XG4gICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBvbGRWbm9kZS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICB1cGRhdGVDaGlsZENvbXBvbmVudChcbiAgICAgIGNoaWxkLFxuICAgICAgb3B0aW9ucy5wcm9wc0RhdGEsIC8vIHVwZGF0ZWQgcHJvcHNcbiAgICAgIG9wdGlvbnMubGlzdGVuZXJzLCAvLyB1cGRhdGVkIGxpc3RlbmVyc1xuICAgICAgdm5vZGUsIC8vIG5ldyBwYXJlbnQgdm5vZGVcbiAgICAgIG9wdGlvbnMuY2hpbGRyZW4gLy8gbmV3IGNoaWxkcmVuXG4gICAgKTtcbiAgfSxcblxuICBpbnNlcnQ6IGZ1bmN0aW9uIGluc2VydCAodm5vZGUpIHtcbiAgICB2YXIgY29udGV4dCA9IHZub2RlLmNvbnRleHQ7XG4gICAgdmFyIGNvbXBvbmVudEluc3RhbmNlID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2U7XG4gICAgaWYgKCFjb21wb25lbnRJbnN0YW5jZS5faXNNb3VudGVkKSB7XG4gICAgICBjYWxsSG9vayhjb21wb25lbnRJbnN0YW5jZSwgJ29uU2VydmljZUNyZWF0ZWQnKTtcbiAgICAgIGNhbGxIb29rKGNvbXBvbmVudEluc3RhbmNlLCAnb25TZXJ2aWNlQXR0YWNoZWQnKTtcbiAgICAgIGNvbXBvbmVudEluc3RhbmNlLl9pc01vdW50ZWQgPSB0cnVlO1xuICAgICAgY2FsbEhvb2soY29tcG9uZW50SW5zdGFuY2UsICdtb3VudGVkJyk7XG4gICAgfVxuICAgIGlmICh2bm9kZS5kYXRhLmtlZXBBbGl2ZSkge1xuICAgICAgaWYgKGNvbnRleHQuX2lzTW91bnRlZCkge1xuICAgICAgICAvLyB2dWUtcm91dGVyIzEyMTJcbiAgICAgICAgLy8gRHVyaW5nIHVwZGF0ZXMsIGEga2VwdC1hbGl2ZSBjb21wb25lbnQncyBjaGlsZCBjb21wb25lbnRzIG1heVxuICAgICAgICAvLyBjaGFuZ2UsIHNvIGRpcmVjdGx5IHdhbGtpbmcgdGhlIHRyZWUgaGVyZSBtYXkgY2FsbCBhY3RpdmF0ZWQgaG9va3NcbiAgICAgICAgLy8gb24gaW5jb3JyZWN0IGNoaWxkcmVuLiBJbnN0ZWFkIHdlIHB1c2ggdGhlbSBpbnRvIGEgcXVldWUgd2hpY2ggd2lsbFxuICAgICAgICAvLyBiZSBwcm9jZXNzZWQgYWZ0ZXIgdGhlIHdob2xlIHBhdGNoIHByb2Nlc3MgZW5kZWQuXG4gICAgICAgIHF1ZXVlQWN0aXZhdGVkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2YXRlQ2hpbGRDb21wb25lbnQoY29tcG9uZW50SW5zdGFuY2UsIHRydWUgLyogZGlyZWN0ICovKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHtcbiAgICB2YXIgY29tcG9uZW50SW5zdGFuY2UgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICBpZiAoIWNvbXBvbmVudEluc3RhbmNlLl9pc0Rlc3Ryb3llZCkge1xuICAgICAgaWYgKCF2bm9kZS5kYXRhLmtlZXBBbGl2ZSkge1xuICAgICAgICBjb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlLCB0cnVlIC8qIGRpcmVjdCAqLyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG52YXIgaG9va3NUb01lcmdlID0gT2JqZWN0LmtleXMoY29tcG9uZW50Vk5vZGVIb29rcyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudCAoXG4gIEN0b3IsXG4gIGRhdGEsXG4gIGNvbnRleHQsXG4gIGNoaWxkcmVuLFxuICB0YWdcbikge1xuICBpZiAoaXNVbmRlZihDdG9yKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGJhc2VDdG9yID0gY29udGV4dC4kb3B0aW9ucy5fYmFzZTtcblxuICAvLyBwbGFpbiBvcHRpb25zIG9iamVjdDogdHVybiBpdCBpbnRvIGEgY29uc3RydWN0b3JcbiAgaWYgKGlzT2JqZWN0KEN0b3IpKSB7XG4gICAgQ3RvciA9IGJhc2VDdG9yLmV4dGVuZChDdG9yKTtcbiAgfVxuXG4gIC8vIGlmIGF0IHRoaXMgc3RhZ2UgaXQncyBub3QgYSBjb25zdHJ1Y3RvciBvciBhbiBhc3luYyBjb21wb25lbnQgZmFjdG9yeSxcbiAgLy8gcmVqZWN0LlxuICBpZiAodHlwZW9mIEN0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgd2FybigoXCJJbnZhbGlkIENvbXBvbmVudCBkZWZpbml0aW9uOiBcIiArIChTdHJpbmcoQ3RvcikpKSwgY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gYXN5bmMgY29tcG9uZW50XG4gIHZhciBhc3luY0ZhY3Rvcnk7XG4gIGlmIChpc1VuZGVmKEN0b3IuY2lkKSkge1xuICAgIGFzeW5jRmFjdG9yeSA9IEN0b3I7XG4gICAgQ3RvciA9IHJlc29sdmVBc3luY0NvbXBvbmVudChhc3luY0ZhY3RvcnksIGJhc2VDdG9yKTtcbiAgICBpZiAoQ3RvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyByZXR1cm4gYSBwbGFjZWhvbGRlciBub2RlIGZvciBhc3luYyBjb21wb25lbnQsIHdoaWNoIGlzIHJlbmRlcmVkXG4gICAgICAvLyBhcyBhIGNvbW1lbnQgbm9kZSBidXQgcHJlc2VydmVzIGFsbCB0aGUgcmF3IGluZm9ybWF0aW9uIGZvciB0aGUgbm9kZS5cbiAgICAgIC8vIHRoZSBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgZm9yIGFzeW5jIHNlcnZlci1yZW5kZXJpbmcgYW5kIGh5ZHJhdGlvbi5cbiAgICAgIHJldHVybiBjcmVhdGVBc3luY1BsYWNlaG9sZGVyKFxuICAgICAgICBhc3luY0ZhY3RvcnksXG4gICAgICAgIGRhdGEsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICB0YWdcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBkYXRhID0gZGF0YSB8fCB7fTtcblxuICAvLyByZXNvbHZlIGNvbnN0cnVjdG9yIG9wdGlvbnMgaW4gY2FzZSBnbG9iYWwgbWl4aW5zIGFyZSBhcHBsaWVkIGFmdGVyXG4gIC8vIGNvbXBvbmVudCBjb25zdHJ1Y3RvciBjcmVhdGlvblxuICByZXNvbHZlQ29uc3RydWN0b3JPcHRpb25zKEN0b3IpO1xuXG4gIC8vIHRyYW5zZm9ybSBjb21wb25lbnQgdi1tb2RlbCBkYXRhIGludG8gcHJvcHMgJiBldmVudHNcbiAgaWYgKGlzRGVmKGRhdGEubW9kZWwpKSB7XG4gICAgdHJhbnNmb3JtTW9kZWwoQ3Rvci5vcHRpb25zLCBkYXRhKTtcbiAgfVxuXG4gIC8vIGV4dHJhY3QgcHJvcHNcbiAgdmFyIHByb3BzRGF0YSA9IGV4dHJhY3RQcm9wc0Zyb21WTm9kZURhdGEoZGF0YSwgQ3RvciwgdGFnLCBjb250ZXh0KTsgLy8gZml4ZWQgYnkgeHh4eHh4XG5cbiAgLy8gZnVuY3Rpb25hbCBjb21wb25lbnRcbiAgaWYgKGlzVHJ1ZShDdG9yLm9wdGlvbnMuZnVuY3Rpb25hbCkpIHtcbiAgICByZXR1cm4gY3JlYXRlRnVuY3Rpb25hbENvbXBvbmVudChDdG9yLCBwcm9wc0RhdGEsIGRhdGEsIGNvbnRleHQsIGNoaWxkcmVuKVxuICB9XG5cbiAgLy8gZXh0cmFjdCBsaXN0ZW5lcnMsIHNpbmNlIHRoZXNlIG5lZWRzIHRvIGJlIHRyZWF0ZWQgYXNcbiAgLy8gY2hpbGQgY29tcG9uZW50IGxpc3RlbmVycyBpbnN0ZWFkIG9mIERPTSBsaXN0ZW5lcnNcbiAgdmFyIGxpc3RlbmVycyA9IGRhdGEub247XG4gIC8vIHJlcGxhY2Ugd2l0aCBsaXN0ZW5lcnMgd2l0aCAubmF0aXZlIG1vZGlmaWVyXG4gIC8vIHNvIGl0IGdldHMgcHJvY2Vzc2VkIGR1cmluZyBwYXJlbnQgY29tcG9uZW50IHBhdGNoLlxuICBkYXRhLm9uID0gZGF0YS5uYXRpdmVPbjtcblxuICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5hYnN0cmFjdCkpIHtcbiAgICAvLyBhYnN0cmFjdCBjb21wb25lbnRzIGRvIG5vdCBrZWVwIGFueXRoaW5nXG4gICAgLy8gb3RoZXIgdGhhbiBwcm9wcyAmIGxpc3RlbmVycyAmIHNsb3RcblxuICAgIC8vIHdvcmsgYXJvdW5kIGZsb3dcbiAgICB2YXIgc2xvdCA9IGRhdGEuc2xvdDtcbiAgICBkYXRhID0ge307XG4gICAgaWYgKHNsb3QpIHtcbiAgICAgIGRhdGEuc2xvdCA9IHNsb3Q7XG4gICAgfVxuICB9XG5cbiAgLy8gaW5zdGFsbCBjb21wb25lbnQgbWFuYWdlbWVudCBob29rcyBvbnRvIHRoZSBwbGFjZWhvbGRlciBub2RlXG4gIGluc3RhbGxDb21wb25lbnRIb29rcyhkYXRhKTtcblxuICAvLyByZXR1cm4gYSBwbGFjZWhvbGRlciB2bm9kZVxuICB2YXIgbmFtZSA9IEN0b3Iub3B0aW9ucy5uYW1lIHx8IHRhZztcbiAgdmFyIHZub2RlID0gbmV3IFZOb2RlKFxuICAgIChcInZ1ZS1jb21wb25lbnQtXCIgKyAoQ3Rvci5jaWQpICsgKG5hbWUgPyAoXCItXCIgKyBuYW1lKSA6ICcnKSksXG4gICAgZGF0YSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29udGV4dCxcbiAgICB7IEN0b3I6IEN0b3IsIHByb3BzRGF0YTogcHJvcHNEYXRhLCBsaXN0ZW5lcnM6IGxpc3RlbmVycywgdGFnOiB0YWcsIGNoaWxkcmVuOiBjaGlsZHJlbiB9LFxuICAgIGFzeW5jRmFjdG9yeVxuICApO1xuXG4gIHJldHVybiB2bm9kZVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDb21wb25lbnRJbnN0YW5jZUZvclZub2RlIChcbiAgdm5vZGUsIC8vIHdlIGtub3cgaXQncyBNb3VudGVkQ29tcG9uZW50Vk5vZGUgYnV0IGZsb3cgZG9lc24ndFxuICBwYXJlbnQgLy8gYWN0aXZlSW5zdGFuY2UgaW4gbGlmZWN5Y2xlIHN0YXRlXG4pIHtcbiAgdmFyIG9wdGlvbnMgPSB7XG4gICAgX2lzQ29tcG9uZW50OiB0cnVlLFxuICAgIF9wYXJlbnRWbm9kZTogdm5vZGUsXG4gICAgcGFyZW50OiBwYXJlbnRcbiAgfTtcbiAgLy8gY2hlY2sgaW5saW5lLXRlbXBsYXRlIHJlbmRlciBmdW5jdGlvbnNcbiAgdmFyIGlubGluZVRlbXBsYXRlID0gdm5vZGUuZGF0YS5pbmxpbmVUZW1wbGF0ZTtcbiAgaWYgKGlzRGVmKGlubGluZVRlbXBsYXRlKSkge1xuICAgIG9wdGlvbnMucmVuZGVyID0gaW5saW5lVGVtcGxhdGUucmVuZGVyO1xuICAgIG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zID0gaW5saW5lVGVtcGxhdGUuc3RhdGljUmVuZGVyRm5zO1xuICB9XG4gIHJldHVybiBuZXcgdm5vZGUuY29tcG9uZW50T3B0aW9ucy5DdG9yKG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIGluc3RhbGxDb21wb25lbnRIb29rcyAoZGF0YSkge1xuICB2YXIgaG9va3MgPSBkYXRhLmhvb2sgfHwgKGRhdGEuaG9vayA9IHt9KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rc1RvTWVyZ2UubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gaG9va3NUb01lcmdlW2ldO1xuICAgIHZhciBleGlzdGluZyA9IGhvb2tzW2tleV07XG4gICAgdmFyIHRvTWVyZ2UgPSBjb21wb25lbnRWTm9kZUhvb2tzW2tleV07XG4gICAgaWYgKGV4aXN0aW5nICE9PSB0b01lcmdlICYmICEoZXhpc3RpbmcgJiYgZXhpc3RpbmcuX21lcmdlZCkpIHtcbiAgICAgIGhvb2tzW2tleV0gPSBleGlzdGluZyA/IG1lcmdlSG9vayQxKHRvTWVyZ2UsIGV4aXN0aW5nKSA6IHRvTWVyZ2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlSG9vayQxIChmMSwgZjIpIHtcbiAgdmFyIG1lcmdlZCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgLy8gZmxvdyBjb21wbGFpbnMgYWJvdXQgZXh0cmEgYXJncyB3aGljaCBpcyB3aHkgd2UgdXNlIGFueVxuICAgIGYxKGEsIGIpO1xuICAgIGYyKGEsIGIpO1xuICB9O1xuICBtZXJnZWQuX21lcmdlZCA9IHRydWU7XG4gIHJldHVybiBtZXJnZWRcbn1cblxuLy8gdHJhbnNmb3JtIGNvbXBvbmVudCB2LW1vZGVsIGluZm8gKHZhbHVlIGFuZCBjYWxsYmFjaykgaW50b1xuLy8gcHJvcCBhbmQgZXZlbnQgaGFuZGxlciByZXNwZWN0aXZlbHkuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Nb2RlbCAob3B0aW9ucywgZGF0YSkge1xuICB2YXIgcHJvcCA9IChvcHRpb25zLm1vZGVsICYmIG9wdGlvbnMubW9kZWwucHJvcCkgfHwgJ3ZhbHVlJztcbiAgdmFyIGV2ZW50ID0gKG9wdGlvbnMubW9kZWwgJiYgb3B0aW9ucy5tb2RlbC5ldmVudCkgfHwgJ2lucHV0J1xuICA7KGRhdGEuYXR0cnMgfHwgKGRhdGEuYXR0cnMgPSB7fSkpW3Byb3BdID0gZGF0YS5tb2RlbC52YWx1ZTtcbiAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTtcbiAgdmFyIGV4aXN0aW5nID0gb25bZXZlbnRdO1xuICB2YXIgY2FsbGJhY2sgPSBkYXRhLm1vZGVsLmNhbGxiYWNrO1xuICBpZiAoaXNEZWYoZXhpc3RpbmcpKSB7XG4gICAgaWYgKFxuICAgICAgQXJyYXkuaXNBcnJheShleGlzdGluZylcbiAgICAgICAgPyBleGlzdGluZy5pbmRleE9mKGNhbGxiYWNrKSA9PT0gLTFcbiAgICAgICAgOiBleGlzdGluZyAhPT0gY2FsbGJhY2tcbiAgICApIHtcbiAgICAgIG9uW2V2ZW50XSA9IFtjYWxsYmFja10uY29uY2F0KGV4aXN0aW5nKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb25bZXZlbnRdID0gY2FsbGJhY2s7XG4gIH1cbn1cblxuLyogICovXG5cbnZhciBTSU1QTEVfTk9STUFMSVpFID0gMTtcbnZhciBBTFdBWVNfTk9STUFMSVpFID0gMjtcblxuLy8gd3JhcHBlciBmdW5jdGlvbiBmb3IgcHJvdmlkaW5nIGEgbW9yZSBmbGV4aWJsZSBpbnRlcmZhY2Vcbi8vIHdpdGhvdXQgZ2V0dGluZyB5ZWxsZWQgYXQgYnkgZmxvd1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCAoXG4gIGNvbnRleHQsXG4gIHRhZyxcbiAgZGF0YSxcbiAgY2hpbGRyZW4sXG4gIG5vcm1hbGl6YXRpb25UeXBlLFxuICBhbHdheXNOb3JtYWxpemVcbikge1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSB8fCBpc1ByaW1pdGl2ZShkYXRhKSkge1xuICAgIG5vcm1hbGl6YXRpb25UeXBlID0gY2hpbGRyZW47XG4gICAgY2hpbGRyZW4gPSBkYXRhO1xuICAgIGRhdGEgPSB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKGlzVHJ1ZShhbHdheXNOb3JtYWxpemUpKSB7XG4gICAgbm9ybWFsaXphdGlvblR5cGUgPSBBTFdBWVNfTk9STUFMSVpFO1xuICB9XG4gIHJldHVybiBfY3JlYXRlRWxlbWVudChjb250ZXh0LCB0YWcsIGRhdGEsIGNoaWxkcmVuLCBub3JtYWxpemF0aW9uVHlwZSlcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUVsZW1lbnQgKFxuICBjb250ZXh0LFxuICB0YWcsXG4gIGRhdGEsXG4gIGNoaWxkcmVuLFxuICBub3JtYWxpemF0aW9uVHlwZVxuKSB7XG4gIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZigoZGF0YSkuX19vYl9fKSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgIFwiQXZvaWQgdXNpbmcgb2JzZXJ2ZWQgZGF0YSBvYmplY3QgYXMgdm5vZGUgZGF0YTogXCIgKyAoSlNPTi5zdHJpbmdpZnkoZGF0YSkpICsgXCJcXG5cIiArXG4gICAgICAnQWx3YXlzIGNyZWF0ZSBmcmVzaCB2bm9kZSBkYXRhIG9iamVjdHMgaW4gZWFjaCByZW5kZXIhJyxcbiAgICAgIGNvbnRleHRcbiAgICApO1xuICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKClcbiAgfVxuICAvLyBvYmplY3Qgc3ludGF4IGluIHYtYmluZFxuICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNEZWYoZGF0YS5pcykpIHtcbiAgICB0YWcgPSBkYXRhLmlzO1xuICB9XG4gIGlmICghdGFnKSB7XG4gICAgLy8gaW4gY2FzZSBvZiBjb21wb25lbnQgOmlzIHNldCB0byBmYWxzeSB2YWx1ZVxuICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKClcbiAgfVxuICAvLyB3YXJuIGFnYWluc3Qgbm9uLXByaW1pdGl2ZSBrZXlcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICBpc0RlZihkYXRhKSAmJiBpc0RlZihkYXRhLmtleSkgJiYgIWlzUHJpbWl0aXZlKGRhdGEua2V5KVxuICApIHtcbiAgICB7XG4gICAgICB3YXJuKFxuICAgICAgICAnQXZvaWQgdXNpbmcgbm9uLXByaW1pdGl2ZSB2YWx1ZSBhcyBrZXksICcgK1xuICAgICAgICAndXNlIHN0cmluZy9udW1iZXIgdmFsdWUgaW5zdGVhZC4nLFxuICAgICAgICBjb250ZXh0XG4gICAgICApO1xuICAgIH1cbiAgfVxuICAvLyBzdXBwb3J0IHNpbmdsZSBmdW5jdGlvbiBjaGlsZHJlbiBhcyBkZWZhdWx0IHNjb3BlZCBzbG90XG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJlxuICAgIHR5cGVvZiBjaGlsZHJlblswXSA9PT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICBkYXRhID0gZGF0YSB8fCB7fTtcbiAgICBkYXRhLnNjb3BlZFNsb3RzID0geyBkZWZhdWx0OiBjaGlsZHJlblswXSB9O1xuICAgIGNoaWxkcmVuLmxlbmd0aCA9IDA7XG4gIH1cbiAgaWYgKG5vcm1hbGl6YXRpb25UeXBlID09PSBBTFdBWVNfTk9STUFMSVpFKSB7XG4gICAgY2hpbGRyZW4gPSBub3JtYWxpemVDaGlsZHJlbihjaGlsZHJlbik7XG4gIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IFNJTVBMRV9OT1JNQUxJWkUpIHtcbiAgICBjaGlsZHJlbiA9IHNpbXBsZU5vcm1hbGl6ZUNoaWxkcmVuKGNoaWxkcmVuKTtcbiAgfVxuICB2YXIgdm5vZGUsIG5zO1xuICBpZiAodHlwZW9mIHRhZyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgQ3RvcjtcbiAgICBucyA9IChjb250ZXh0LiR2bm9kZSAmJiBjb250ZXh0LiR2bm9kZS5ucykgfHwgY29uZmlnLmdldFRhZ05hbWVzcGFjZSh0YWcpO1xuICAgIGlmIChjb25maWcuaXNSZXNlcnZlZFRhZyh0YWcpKSB7XG4gICAgICAvLyBwbGF0Zm9ybSBidWlsdC1pbiBlbGVtZW50c1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgaXNEZWYoZGF0YSkgJiYgaXNEZWYoZGF0YS5uYXRpdmVPbikpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAoXCJUaGUgLm5hdGl2ZSBtb2RpZmllciBmb3Igdi1vbiBpcyBvbmx5IHZhbGlkIG9uIGNvbXBvbmVudHMgYnV0IGl0IHdhcyB1c2VkIG9uIDxcIiArIHRhZyArIFwiPi5cIiksXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoXG4gICAgICAgIGNvbmZpZy5wYXJzZVBsYXRmb3JtVGFnTmFtZSh0YWcpLCBkYXRhLCBjaGlsZHJlbixcbiAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHRcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICgoIWRhdGEgfHwgIWRhdGEucHJlKSAmJiBpc0RlZihDdG9yID0gcmVzb2x2ZUFzc2V0KGNvbnRleHQuJG9wdGlvbnMsICdjb21wb25lbnRzJywgdGFnKSkpIHtcbiAgICAgIC8vIGNvbXBvbmVudFxuICAgICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQoQ3RvciwgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4sIHRhZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVua25vd24gb3IgdW5saXN0ZWQgbmFtZXNwYWNlZCBlbGVtZW50c1xuICAgICAgLy8gY2hlY2sgYXQgcnVudGltZSBiZWNhdXNlIGl0IG1heSBnZXQgYXNzaWduZWQgYSBuYW1lc3BhY2Ugd2hlbiBpdHNcbiAgICAgIC8vIHBhcmVudCBub3JtYWxpemVzIGNoaWxkcmVuXG4gICAgICB2bm9kZSA9IG5ldyBWTm9kZShcbiAgICAgICAgdGFnLCBkYXRhLCBjaGlsZHJlbixcbiAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHRcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGRpcmVjdCBjb21wb25lbnQgb3B0aW9ucyAvIGNvbnN0cnVjdG9yXG4gICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQodGFnLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbik7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodm5vZGUpKSB7XG4gICAgcmV0dXJuIHZub2RlXG4gIH0gZWxzZSBpZiAoaXNEZWYodm5vZGUpKSB7XG4gICAgaWYgKGlzRGVmKG5zKSkgeyBhcHBseU5TKHZub2RlLCBucyk7IH1cbiAgICBpZiAoaXNEZWYoZGF0YSkpIHsgcmVnaXN0ZXJEZWVwQmluZGluZ3MoZGF0YSk7IH1cbiAgICByZXR1cm4gdm5vZGVcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpXG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlOUyAodm5vZGUsIG5zLCBmb3JjZSkge1xuICB2bm9kZS5ucyA9IG5zO1xuICBpZiAodm5vZGUudGFnID09PSAnZm9yZWlnbk9iamVjdCcpIHtcbiAgICAvLyB1c2UgZGVmYXVsdCBuYW1lc3BhY2UgaW5zaWRlIGZvcmVpZ25PYmplY3RcbiAgICBucyA9IHVuZGVmaW5lZDtcbiAgICBmb3JjZSA9IHRydWU7XG4gIH1cbiAgaWYgKGlzRGVmKHZub2RlLmNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSB2bm9kZS5jaGlsZHJlbltpXTtcbiAgICAgIGlmIChpc0RlZihjaGlsZC50YWcpICYmIChcbiAgICAgICAgaXNVbmRlZihjaGlsZC5ucykgfHwgKGlzVHJ1ZShmb3JjZSkgJiYgY2hpbGQudGFnICE9PSAnc3ZnJykpKSB7XG4gICAgICAgIGFwcGx5TlMoY2hpbGQsIG5zLCBmb3JjZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIHJlZiAjNTMxOFxuLy8gbmVjZXNzYXJ5IHRvIGVuc3VyZSBwYXJlbnQgcmUtcmVuZGVyIHdoZW4gZGVlcCBiaW5kaW5ncyBsaWtlIDpzdHlsZSBhbmRcbi8vIDpjbGFzcyBhcmUgdXNlZCBvbiBzbG90IG5vZGVzXG5mdW5jdGlvbiByZWdpc3RlckRlZXBCaW5kaW5ncyAoZGF0YSkge1xuICBpZiAoaXNPYmplY3QoZGF0YS5zdHlsZSkpIHtcbiAgICB0cmF2ZXJzZShkYXRhLnN0eWxlKTtcbiAgfVxuICBpZiAoaXNPYmplY3QoZGF0YS5jbGFzcykpIHtcbiAgICB0cmF2ZXJzZShkYXRhLmNsYXNzKTtcbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdFJlbmRlciAodm0pIHtcbiAgdm0uX3Zub2RlID0gbnVsbDsgLy8gdGhlIHJvb3Qgb2YgdGhlIGNoaWxkIHRyZWVcbiAgdm0uX3N0YXRpY1RyZWVzID0gbnVsbDsgLy8gdi1vbmNlIGNhY2hlZCB0cmVlc1xuICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zO1xuICB2YXIgcGFyZW50Vm5vZGUgPSB2bS4kdm5vZGUgPSBvcHRpb25zLl9wYXJlbnRWbm9kZTsgLy8gdGhlIHBsYWNlaG9sZGVyIG5vZGUgaW4gcGFyZW50IHRyZWVcbiAgdmFyIHJlbmRlckNvbnRleHQgPSBwYXJlbnRWbm9kZSAmJiBwYXJlbnRWbm9kZS5jb250ZXh0O1xuICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMob3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpO1xuICB2bS4kc2NvcGVkU2xvdHMgPSBlbXB0eU9iamVjdDtcbiAgLy8gYmluZCB0aGUgY3JlYXRlRWxlbWVudCBmbiB0byB0aGlzIGluc3RhbmNlXG4gIC8vIHNvIHRoYXQgd2UgZ2V0IHByb3BlciByZW5kZXIgY29udGV4dCBpbnNpZGUgaXQuXG4gIC8vIGFyZ3Mgb3JkZXI6IHRhZywgZGF0YSwgY2hpbGRyZW4sIG5vcm1hbGl6YXRpb25UeXBlLCBhbHdheXNOb3JtYWxpemVcbiAgLy8gaW50ZXJuYWwgdmVyc2lvbiBpcyB1c2VkIGJ5IHJlbmRlciBmdW5jdGlvbnMgY29tcGlsZWQgZnJvbSB0ZW1wbGF0ZXNcbiAgdm0uX2MgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudCh2bSwgYSwgYiwgYywgZCwgZmFsc2UpOyB9O1xuICAvLyBub3JtYWxpemF0aW9uIGlzIGFsd2F5cyBhcHBsaWVkIGZvciB0aGUgcHVibGljIHZlcnNpb24sIHVzZWQgaW5cbiAgLy8gdXNlci13cml0dGVuIHJlbmRlciBmdW5jdGlvbnMuXG4gIHZtLiRjcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsgcmV0dXJuIGNyZWF0ZUVsZW1lbnQodm0sIGEsIGIsIGMsIGQsIHRydWUpOyB9O1xuXG4gIC8vICRhdHRycyAmICRsaXN0ZW5lcnMgYXJlIGV4cG9zZWQgZm9yIGVhc2llciBIT0MgY3JlYXRpb24uXG4gIC8vIHRoZXkgbmVlZCB0byBiZSByZWFjdGl2ZSBzbyB0aGF0IEhPQ3MgdXNpbmcgdGhlbSBhcmUgYWx3YXlzIHVwZGF0ZWRcbiAgdmFyIHBhcmVudERhdGEgPSBwYXJlbnRWbm9kZSAmJiBwYXJlbnRWbm9kZS5kYXRhO1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgZGVmaW5lUmVhY3RpdmUkJDEodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHtcbiAgICAgICFpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgJiYgd2FybihcIiRhdHRycyBpcyByZWFkb25seS5cIiwgdm0pO1xuICAgIH0sIHRydWUpO1xuICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCAnJGxpc3RlbmVycycsIG9wdGlvbnMuX3BhcmVudExpc3RlbmVycyB8fCBlbXB0eU9iamVjdCwgZnVuY3Rpb24gKCkge1xuICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKFwiJGxpc3RlbmVycyBpcyByZWFkb25seS5cIiwgdm0pO1xuICAgIH0sIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCAnJGF0dHJzJywgcGFyZW50RGF0YSAmJiBwYXJlbnREYXRhLmF0dHJzIHx8IGVtcHR5T2JqZWN0LCBudWxsLCB0cnVlKTtcbiAgICBkZWZpbmVSZWFjdGl2ZSQkMSh2bSwgJyRsaXN0ZW5lcnMnLCBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3QsIG51bGwsIHRydWUpO1xuICB9XG59XG5cbnZhciBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgPSBudWxsO1xuXG5mdW5jdGlvbiByZW5kZXJNaXhpbiAoVnVlKSB7XG4gIC8vIGluc3RhbGwgcnVudGltZSBjb252ZW5pZW5jZSBoZWxwZXJzXG4gIGluc3RhbGxSZW5kZXJIZWxwZXJzKFZ1ZS5wcm90b3R5cGUpO1xuXG4gIFZ1ZS5wcm90b3R5cGUuJG5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgcmV0dXJuIG5leHRUaWNrKGZuLCB0aGlzKVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuX3JlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIHZhciByZWYgPSB2bS4kb3B0aW9ucztcbiAgICB2YXIgcmVuZGVyID0gcmVmLnJlbmRlcjtcbiAgICB2YXIgX3BhcmVudFZub2RlID0gcmVmLl9wYXJlbnRWbm9kZTtcblxuICAgIGlmIChfcGFyZW50Vm5vZGUpIHtcbiAgICAgIHZtLiRzY29wZWRTbG90cyA9IG5vcm1hbGl6ZVNjb3BlZFNsb3RzKFxuICAgICAgICBfcGFyZW50Vm5vZGUuZGF0YS5zY29wZWRTbG90cyxcbiAgICAgICAgdm0uJHNsb3RzLFxuICAgICAgICB2bS4kc2NvcGVkU2xvdHNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gc2V0IHBhcmVudCB2bm9kZS4gdGhpcyBhbGxvd3MgcmVuZGVyIGZ1bmN0aW9ucyB0byBoYXZlIGFjY2Vzc1xuICAgIC8vIHRvIHRoZSBkYXRhIG9uIHRoZSBwbGFjZWhvbGRlciBub2RlLlxuICAgIHZtLiR2bm9kZSA9IF9wYXJlbnRWbm9kZTtcbiAgICAvLyByZW5kZXIgc2VsZlxuICAgIHZhciB2bm9kZTtcbiAgICB0cnkge1xuICAgICAgLy8gVGhlcmUncyBubyBuZWVkIHRvIG1haW50YWluIGEgc3RhY2sgYmVjYXVzZSBhbGwgcmVuZGVyIGZucyBhcmUgY2FsbGVkXG4gICAgICAvLyBzZXBhcmF0ZWx5IGZyb20gb25lIGFub3RoZXIuIE5lc3RlZCBjb21wb25lbnQncyByZW5kZXIgZm5zIGFyZSBjYWxsZWRcbiAgICAgIC8vIHdoZW4gcGFyZW50IGNvbXBvbmVudCBpcyBwYXRjaGVkLlxuICAgICAgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gdm07XG4gICAgICB2bm9kZSA9IHJlbmRlci5jYWxsKHZtLl9yZW5kZXJQcm94eSwgdm0uJGNyZWF0ZUVsZW1lbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCBcInJlbmRlclwiKTtcbiAgICAgIC8vIHJldHVybiBlcnJvciByZW5kZXIgcmVzdWx0LFxuICAgICAgLy8gb3IgcHJldmlvdXMgdm5vZGUgdG8gcHJldmVudCByZW5kZXIgZXJyb3IgY2F1c2luZyBibGFuayBjb21wb25lbnRcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB2bS4kb3B0aW9ucy5yZW5kZXJFcnJvcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZub2RlID0gdm0uJG9wdGlvbnMucmVuZGVyRXJyb3IuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50LCBlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCBcInJlbmRlckVycm9yXCIpO1xuICAgICAgICAgIHZub2RlID0gdm0uX3Zub2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2bm9kZSA9IHZtLl92bm9kZTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gbnVsbDtcbiAgICB9XG4gICAgLy8gaWYgdGhlIHJldHVybmVkIGFycmF5IGNvbnRhaW5zIG9ubHkgYSBzaW5nbGUgbm9kZSwgYWxsb3cgaXRcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2bm9kZSkgJiYgdm5vZGUubGVuZ3RoID09PSAxKSB7XG4gICAgICB2bm9kZSA9IHZub2RlWzBdO1xuICAgIH1cbiAgICAvLyByZXR1cm4gZW1wdHkgdm5vZGUgaW4gY2FzZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGVycm9yZWQgb3V0XG4gICAgaWYgKCEodm5vZGUgaW5zdGFuY2VvZiBWTm9kZSkpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIEFycmF5LmlzQXJyYXkodm5vZGUpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ011bHRpcGxlIHJvb3Qgbm9kZXMgcmV0dXJuZWQgZnJvbSByZW5kZXIgZnVuY3Rpb24uIFJlbmRlciBmdW5jdGlvbiAnICtcbiAgICAgICAgICAnc2hvdWxkIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUuJyxcbiAgICAgICAgICB2bVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdm5vZGUgPSBjcmVhdGVFbXB0eVZOb2RlKCk7XG4gICAgfVxuICAgIC8vIHNldCBwYXJlbnRcbiAgICB2bm9kZS5wYXJlbnQgPSBfcGFyZW50Vm5vZGU7XG4gICAgcmV0dXJuIHZub2RlXG4gIH07XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBlbnN1cmVDdG9yIChjb21wLCBiYXNlKSB7XG4gIGlmIChcbiAgICBjb21wLl9fZXNNb2R1bGUgfHxcbiAgICAoaGFzU3ltYm9sICYmIGNvbXBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ01vZHVsZScpXG4gICkge1xuICAgIGNvbXAgPSBjb21wLmRlZmF1bHQ7XG4gIH1cbiAgcmV0dXJuIGlzT2JqZWN0KGNvbXApXG4gICAgPyBiYXNlLmV4dGVuZChjb21wKVxuICAgIDogY29tcFxufVxuXG5mdW5jdGlvbiBjcmVhdGVBc3luY1BsYWNlaG9sZGVyIChcbiAgZmFjdG9yeSxcbiAgZGF0YSxcbiAgY29udGV4dCxcbiAgY2hpbGRyZW4sXG4gIHRhZ1xuKSB7XG4gIHZhciBub2RlID0gY3JlYXRlRW1wdHlWTm9kZSgpO1xuICBub2RlLmFzeW5jRmFjdG9yeSA9IGZhY3Rvcnk7XG4gIG5vZGUuYXN5bmNNZXRhID0geyBkYXRhOiBkYXRhLCBjb250ZXh0OiBjb250ZXh0LCBjaGlsZHJlbjogY2hpbGRyZW4sIHRhZzogdGFnIH07XG4gIHJldHVybiBub2RlXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVBc3luY0NvbXBvbmVudCAoXG4gIGZhY3RvcnksXG4gIGJhc2VDdG9yXG4pIHtcbiAgaWYgKGlzVHJ1ZShmYWN0b3J5LmVycm9yKSAmJiBpc0RlZihmYWN0b3J5LmVycm9yQ29tcCkpIHtcbiAgICByZXR1cm4gZmFjdG9yeS5lcnJvckNvbXBcbiAgfVxuXG4gIGlmIChpc0RlZihmYWN0b3J5LnJlc29sdmVkKSkge1xuICAgIHJldHVybiBmYWN0b3J5LnJlc29sdmVkXG4gIH1cblxuICB2YXIgb3duZXIgPSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2U7XG4gIGlmIChvd25lciAmJiBpc0RlZihmYWN0b3J5Lm93bmVycykgJiYgZmFjdG9yeS5vd25lcnMuaW5kZXhPZihvd25lcikgPT09IC0xKSB7XG4gICAgLy8gYWxyZWFkeSBwZW5kaW5nXG4gICAgZmFjdG9yeS5vd25lcnMucHVzaChvd25lcik7XG4gIH1cblxuICBpZiAoaXNUcnVlKGZhY3RvcnkubG9hZGluZykgJiYgaXNEZWYoZmFjdG9yeS5sb2FkaW5nQ29tcCkpIHtcbiAgICByZXR1cm4gZmFjdG9yeS5sb2FkaW5nQ29tcFxuICB9XG5cbiAgaWYgKG93bmVyICYmICFpc0RlZihmYWN0b3J5Lm93bmVycykpIHtcbiAgICB2YXIgb3duZXJzID0gZmFjdG9yeS5vd25lcnMgPSBbb3duZXJdO1xuICAgIHZhciBzeW5jID0gdHJ1ZTtcbiAgICB2YXIgdGltZXJMb2FkaW5nID0gbnVsbDtcbiAgICB2YXIgdGltZXJUaW1lb3V0ID0gbnVsbFxuXG4gICAgOyhvd25lcikuJG9uKCdob29rOmRlc3Ryb3llZCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlbW92ZShvd25lcnMsIG93bmVyKTsgfSk7XG5cbiAgICB2YXIgZm9yY2VSZW5kZXIgPSBmdW5jdGlvbiAocmVuZGVyQ29tcGxldGVkKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG93bmVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgKG93bmVyc1tpXSkuJGZvcmNlVXBkYXRlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZW5kZXJDb21wbGV0ZWQpIHtcbiAgICAgICAgb3duZXJzLmxlbmd0aCA9IDA7XG4gICAgICAgIGlmICh0aW1lckxvYWRpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJMb2FkaW5nKTtcbiAgICAgICAgICB0aW1lckxvYWRpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aW1lclRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJUaW1lb3V0KTtcbiAgICAgICAgICB0aW1lclRpbWVvdXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciByZXNvbHZlID0gb25jZShmdW5jdGlvbiAocmVzKSB7XG4gICAgICAvLyBjYWNoZSByZXNvbHZlZFxuICAgICAgZmFjdG9yeS5yZXNvbHZlZCA9IGVuc3VyZUN0b3IocmVzLCBiYXNlQ3Rvcik7XG4gICAgICAvLyBpbnZva2UgY2FsbGJhY2tzIG9ubHkgaWYgdGhpcyBpcyBub3QgYSBzeW5jaHJvbm91cyByZXNvbHZlXG4gICAgICAvLyAoYXN5bmMgcmVzb2x2ZXMgYXJlIHNoaW1tZWQgYXMgc3luY2hyb25vdXMgZHVyaW5nIFNTUilcbiAgICAgIGlmICghc3luYykge1xuICAgICAgICBmb3JjZVJlbmRlcih0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG93bmVycy5sZW5ndGggPSAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIHJlamVjdCA9IG9uY2UoZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICBcIkZhaWxlZCB0byByZXNvbHZlIGFzeW5jIGNvbXBvbmVudDogXCIgKyAoU3RyaW5nKGZhY3RvcnkpKSArXG4gICAgICAgIChyZWFzb24gPyAoXCJcXG5SZWFzb246IFwiICsgcmVhc29uKSA6ICcnKVxuICAgICAgKTtcbiAgICAgIGlmIChpc0RlZihmYWN0b3J5LmVycm9yQ29tcCkpIHtcbiAgICAgICAgZmFjdG9yeS5lcnJvciA9IHRydWU7XG4gICAgICAgIGZvcmNlUmVuZGVyKHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIHJlcyA9IGZhY3RvcnkocmVzb2x2ZSwgcmVqZWN0KTtcblxuICAgIGlmIChpc09iamVjdChyZXMpKSB7XG4gICAgICBpZiAoaXNQcm9taXNlKHJlcykpIHtcbiAgICAgICAgLy8gKCkgPT4gUHJvbWlzZVxuICAgICAgICBpZiAoaXNVbmRlZihmYWN0b3J5LnJlc29sdmVkKSkge1xuICAgICAgICAgIHJlcy50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNQcm9taXNlKHJlcy5jb21wb25lbnQpKSB7XG4gICAgICAgIHJlcy5jb21wb25lbnQudGhlbihyZXNvbHZlLCByZWplY3QpO1xuXG4gICAgICAgIGlmIChpc0RlZihyZXMuZXJyb3IpKSB7XG4gICAgICAgICAgZmFjdG9yeS5lcnJvckNvbXAgPSBlbnN1cmVDdG9yKHJlcy5lcnJvciwgYmFzZUN0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRGVmKHJlcy5sb2FkaW5nKSkge1xuICAgICAgICAgIGZhY3RvcnkubG9hZGluZ0NvbXAgPSBlbnN1cmVDdG9yKHJlcy5sb2FkaW5nLCBiYXNlQ3Rvcik7XG4gICAgICAgICAgaWYgKHJlcy5kZWxheSA9PT0gMCkge1xuICAgICAgICAgICAgZmFjdG9yeS5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGltZXJMb2FkaW5nID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHRpbWVyTG9hZGluZyA9IG51bGw7XG4gICAgICAgICAgICAgIGlmIChpc1VuZGVmKGZhY3RvcnkucmVzb2x2ZWQpICYmIGlzVW5kZWYoZmFjdG9yeS5lcnJvcikpIHtcbiAgICAgICAgICAgICAgICBmYWN0b3J5LmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGZvcmNlUmVuZGVyKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgcmVzLmRlbGF5IHx8IDIwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRGVmKHJlcy50aW1lb3V0KSkge1xuICAgICAgICAgIHRpbWVyVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGltZXJUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmKGZhY3RvcnkucmVzb2x2ZWQpKSB7XG4gICAgICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgICAgICAgICAgICA/IChcInRpbWVvdXQgKFwiICsgKHJlcy50aW1lb3V0KSArIFwibXMpXCIpXG4gICAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCByZXMudGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzeW5jID0gZmFsc2U7XG4gICAgLy8gcmV0dXJuIGluIGNhc2UgcmVzb2x2ZWQgc3luY2hyb25vdXNseVxuICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmdcbiAgICAgID8gZmFjdG9yeS5sb2FkaW5nQ29tcFxuICAgICAgOiBmYWN0b3J5LnJlc29sdmVkXG4gIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGlzQXN5bmNQbGFjZWhvbGRlciAobm9kZSkge1xuICByZXR1cm4gbm9kZS5pc0NvbW1lbnQgJiYgbm9kZS5hc3luY0ZhY3Rvcnlcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGdldEZpcnN0Q29tcG9uZW50Q2hpbGQgKGNoaWxkcmVuKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjID0gY2hpbGRyZW5baV07XG4gICAgICBpZiAoaXNEZWYoYykgJiYgKGlzRGVmKGMuY29tcG9uZW50T3B0aW9ucykgfHwgaXNBc3luY1BsYWNlaG9sZGVyKGMpKSkge1xuICAgICAgICByZXR1cm4gY1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRFdmVudHMgKHZtKSB7XG4gIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB2bS5faGFzSG9va0V2ZW50ID0gZmFsc2U7XG4gIC8vIGluaXQgcGFyZW50IGF0dGFjaGVkIGV2ZW50c1xuICB2YXIgbGlzdGVuZXJzID0gdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycztcbiAgaWYgKGxpc3RlbmVycykge1xuICAgIHVwZGF0ZUNvbXBvbmVudExpc3RlbmVycyh2bSwgbGlzdGVuZXJzKTtcbiAgfVxufVxuXG52YXIgdGFyZ2V0O1xuXG5mdW5jdGlvbiBhZGQgKGV2ZW50LCBmbikge1xuICB0YXJnZXQuJG9uKGV2ZW50LCBmbik7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSQxIChldmVudCwgZm4pIHtcbiAgdGFyZ2V0LiRvZmYoZXZlbnQsIGZuKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlT25jZUhhbmRsZXIgKGV2ZW50LCBmbikge1xuICB2YXIgX3RhcmdldCA9IHRhcmdldDtcbiAgcmV0dXJuIGZ1bmN0aW9uIG9uY2VIYW5kbGVyICgpIHtcbiAgICB2YXIgcmVzID0gZm4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICBpZiAocmVzICE9PSBudWxsKSB7XG4gICAgICBfdGFyZ2V0LiRvZmYoZXZlbnQsIG9uY2VIYW5kbGVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlQ29tcG9uZW50TGlzdGVuZXJzIChcbiAgdm0sXG4gIGxpc3RlbmVycyxcbiAgb2xkTGlzdGVuZXJzXG4pIHtcbiAgdGFyZ2V0ID0gdm07XG4gIHVwZGF0ZUxpc3RlbmVycyhsaXN0ZW5lcnMsIG9sZExpc3RlbmVycyB8fCB7fSwgYWRkLCByZW1vdmUkMSwgY3JlYXRlT25jZUhhbmRsZXIsIHZtKTtcbiAgdGFyZ2V0ID0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBldmVudHNNaXhpbiAoVnVlKSB7XG4gIHZhciBob29rUkUgPSAvXmhvb2s6LztcbiAgVnVlLnByb3RvdHlwZS4kb24gPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZXZlbnQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZtLiRvbihldmVudFtpXSwgZm4pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAodm0uX2V2ZW50c1tldmVudF0gfHwgKHZtLl9ldmVudHNbZXZlbnRdID0gW10pKS5wdXNoKGZuKTtcbiAgICAgIC8vIG9wdGltaXplIGhvb2s6ZXZlbnQgY29zdCBieSB1c2luZyBhIGJvb2xlYW4gZmxhZyBtYXJrZWQgYXQgcmVnaXN0cmF0aW9uXG4gICAgICAvLyBpbnN0ZWFkIG9mIGEgaGFzaCBsb29rdXBcbiAgICAgIGlmIChob29rUkUudGVzdChldmVudCkpIHtcbiAgICAgICAgdm0uX2hhc0hvb2tFdmVudCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2bVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJG9uY2UgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBmdW5jdGlvbiBvbiAoKSB7XG4gICAgICB2bS4kb2ZmKGV2ZW50LCBvbik7XG4gICAgICBmbi5hcHBseSh2bSwgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgb24uZm4gPSBmbjtcbiAgICB2bS4kb24oZXZlbnQsIG9uKTtcbiAgICByZXR1cm4gdm1cbiAgfTtcblxuICBWdWUucHJvdG90eXBlLiRvZmYgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICAvLyBhbGxcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgcmV0dXJuIHZtXG4gICAgfVxuICAgIC8vIGFycmF5IG9mIGV2ZW50c1xuICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZW50KSkge1xuICAgICAgZm9yICh2YXIgaSQxID0gMCwgbCA9IGV2ZW50Lmxlbmd0aDsgaSQxIDwgbDsgaSQxKyspIHtcbiAgICAgICAgdm0uJG9mZihldmVudFtpJDFdLCBmbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm1cbiAgICB9XG4gICAgLy8gc3BlY2lmaWMgZXZlbnRcbiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07XG4gICAgaWYgKCFjYnMpIHtcbiAgICAgIHJldHVybiB2bVxuICAgIH1cbiAgICBpZiAoIWZuKSB7XG4gICAgICB2bS5fZXZlbnRzW2V2ZW50XSA9IG51bGw7XG4gICAgICByZXR1cm4gdm1cbiAgICB9XG4gICAgLy8gc3BlY2lmaWMgaGFuZGxlclxuICAgIHZhciBjYjtcbiAgICB2YXIgaSA9IGNicy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgY2IgPSBjYnNbaV07XG4gICAgICBpZiAoY2IgPT09IGZuIHx8IGNiLmZuID09PSBmbikge1xuICAgICAgICBjYnMuc3BsaWNlKGksIDEpO1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdm1cbiAgfTtcblxuICBWdWUucHJvdG90eXBlLiRlbWl0ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIGxvd2VyQ2FzZUV2ZW50ID0gZXZlbnQudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChsb3dlckNhc2VFdmVudCAhPT0gZXZlbnQgJiYgdm0uX2V2ZW50c1tsb3dlckNhc2VFdmVudF0pIHtcbiAgICAgICAgdGlwKFxuICAgICAgICAgIFwiRXZlbnQgXFxcIlwiICsgbG93ZXJDYXNlRXZlbnQgKyBcIlxcXCIgaXMgZW1pdHRlZCBpbiBjb21wb25lbnQgXCIgK1xuICAgICAgICAgIChmb3JtYXRDb21wb25lbnROYW1lKHZtKSkgKyBcIiBidXQgdGhlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBmb3IgXFxcIlwiICsgZXZlbnQgKyBcIlxcXCIuIFwiICtcbiAgICAgICAgICBcIk5vdGUgdGhhdCBIVE1MIGF0dHJpYnV0ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHlvdSBjYW5ub3QgdXNlIFwiICtcbiAgICAgICAgICBcInYtb24gdG8gbGlzdGVuIHRvIGNhbWVsQ2FzZSBldmVudHMgd2hlbiB1c2luZyBpbi1ET00gdGVtcGxhdGVzLiBcIiArXG4gICAgICAgICAgXCJZb3Ugc2hvdWxkIHByb2JhYmx5IHVzZSBcXFwiXCIgKyAoaHlwaGVuYXRlKGV2ZW50KSkgKyBcIlxcXCIgaW5zdGVhZCBvZiBcXFwiXCIgKyBldmVudCArIFwiXFxcIi5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07XG4gICAgaWYgKGNicykge1xuICAgICAgY2JzID0gY2JzLmxlbmd0aCA+IDEgPyB0b0FycmF5KGNicykgOiBjYnM7XG4gICAgICB2YXIgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzLCAxKTtcbiAgICAgIHZhciBpbmZvID0gXCJldmVudCBoYW5kbGVyIGZvciBcXFwiXCIgKyBldmVudCArIFwiXFxcIlwiO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjYnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGludm9rZVdpdGhFcnJvckhhbmRsaW5nKGNic1tpXSwgdm0sIGFyZ3MsIHZtLCBpbmZvKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZtXG4gIH07XG59XG5cbi8qICAqL1xuXG52YXIgYWN0aXZlSW5zdGFuY2UgPSBudWxsO1xudmFyIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBzZXRBY3RpdmVJbnN0YW5jZSh2bSkge1xuICB2YXIgcHJldkFjdGl2ZUluc3RhbmNlID0gYWN0aXZlSW5zdGFuY2U7XG4gIGFjdGl2ZUluc3RhbmNlID0gdm07XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgYWN0aXZlSW5zdGFuY2UgPSBwcmV2QWN0aXZlSW5zdGFuY2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdExpZmVjeWNsZSAodm0pIHtcbiAgdmFyIG9wdGlvbnMgPSB2bS4kb3B0aW9ucztcblxuICAvLyBsb2NhdGUgZmlyc3Qgbm9uLWFic3RyYWN0IHBhcmVudFxuICB2YXIgcGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG4gIGlmIChwYXJlbnQgJiYgIW9wdGlvbnMuYWJzdHJhY3QpIHtcbiAgICB3aGlsZSAocGFyZW50LiRvcHRpb25zLmFic3RyYWN0ICYmIHBhcmVudC4kcGFyZW50KSB7XG4gICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcbiAgICB9XG4gICAgcGFyZW50LiRjaGlsZHJlbi5wdXNoKHZtKTtcbiAgfVxuXG4gIHZtLiRwYXJlbnQgPSBwYXJlbnQ7XG4gIHZtLiRyb290ID0gcGFyZW50ID8gcGFyZW50LiRyb290IDogdm07XG5cbiAgdm0uJGNoaWxkcmVuID0gW107XG4gIHZtLiRyZWZzID0ge307XG5cbiAgdm0uX3dhdGNoZXIgPSBudWxsO1xuICB2bS5faW5hY3RpdmUgPSBudWxsO1xuICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZTtcbiAgdm0uX2lzTW91bnRlZCA9IGZhbHNlO1xuICB2bS5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGlmZWN5Y2xlTWl4aW4gKFZ1ZSkge1xuICBWdWUucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAodm5vZGUsIGh5ZHJhdGluZykge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgdmFyIHByZXZFbCA9IHZtLiRlbDtcbiAgICB2YXIgcHJldlZub2RlID0gdm0uX3Zub2RlO1xuICAgIHZhciByZXN0b3JlQWN0aXZlSW5zdGFuY2UgPSBzZXRBY3RpdmVJbnN0YW5jZSh2bSk7XG4gICAgdm0uX3Zub2RlID0gdm5vZGU7XG4gICAgLy8gVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gaXMgaW5qZWN0ZWQgaW4gZW50cnkgcG9pbnRzXG4gICAgLy8gYmFzZWQgb24gdGhlIHJlbmRlcmluZyBiYWNrZW5kIHVzZWQuXG4gICAgaWYgKCFwcmV2Vm5vZGUpIHtcbiAgICAgIC8vIGluaXRpYWwgcmVuZGVyXG4gICAgICB2bS4kZWwgPSB2bS5fX3BhdGNoX18odm0uJGVsLCB2bm9kZSwgaHlkcmF0aW5nLCBmYWxzZSAvKiByZW1vdmVPbmx5ICovKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdXBkYXRlc1xuICAgICAgdm0uJGVsID0gdm0uX19wYXRjaF9fKHByZXZWbm9kZSwgdm5vZGUpO1xuICAgIH1cbiAgICByZXN0b3JlQWN0aXZlSW5zdGFuY2UoKTtcbiAgICAvLyB1cGRhdGUgX192dWVfXyByZWZlcmVuY2VcbiAgICBpZiAocHJldkVsKSB7XG4gICAgICBwcmV2RWwuX192dWVfXyA9IG51bGw7XG4gICAgfVxuICAgIGlmICh2bS4kZWwpIHtcbiAgICAgIHZtLiRlbC5fX3Z1ZV9fID0gdm07XG4gICAgfVxuICAgIC8vIGlmIHBhcmVudCBpcyBhbiBIT0MsIHVwZGF0ZSBpdHMgJGVsIGFzIHdlbGxcbiAgICBpZiAodm0uJHZub2RlICYmIHZtLiRwYXJlbnQgJiYgdm0uJHZub2RlID09PSB2bS4kcGFyZW50Ll92bm9kZSkge1xuICAgICAgdm0uJHBhcmVudC4kZWwgPSB2bS4kZWw7XG4gICAgfVxuICAgIC8vIHVwZGF0ZWQgaG9vayBpcyBjYWxsZWQgYnkgdGhlIHNjaGVkdWxlciB0byBlbnN1cmUgdGhhdCBjaGlsZHJlbiBhcmVcbiAgICAvLyB1cGRhdGVkIGluIGEgcGFyZW50J3MgdXBkYXRlZCBob29rLlxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJGZvcmNlVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgaWYgKHZtLl93YXRjaGVyKSB7XG4gICAgICB2bS5fd2F0Y2hlci51cGRhdGUoKTtcbiAgICB9XG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS4kZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIGlmICh2bS5faXNCZWluZ0Rlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlRGVzdHJveScpO1xuICAgIHZtLl9pc0JlaW5nRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAvLyByZW1vdmUgc2VsZiBmcm9tIHBhcmVudFxuICAgIHZhciBwYXJlbnQgPSB2bS4kcGFyZW50O1xuICAgIGlmIChwYXJlbnQgJiYgIXBhcmVudC5faXNCZWluZ0Rlc3Ryb3llZCAmJiAhdm0uJG9wdGlvbnMuYWJzdHJhY3QpIHtcbiAgICAgIHJlbW92ZShwYXJlbnQuJGNoaWxkcmVuLCB2bSk7XG4gICAgfVxuICAgIC8vIHRlYXJkb3duIHdhdGNoZXJzXG4gICAgaWYgKHZtLl93YXRjaGVyKSB7XG4gICAgICB2bS5fd2F0Y2hlci50ZWFyZG93bigpO1xuICAgIH1cbiAgICB2YXIgaSA9IHZtLl93YXRjaGVycy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgdm0uX3dhdGNoZXJzW2ldLnRlYXJkb3duKCk7XG4gICAgfVxuICAgIC8vIHJlbW92ZSByZWZlcmVuY2UgZnJvbSBkYXRhIG9iXG4gICAgLy8gZnJvemVuIG9iamVjdCBtYXkgbm90IGhhdmUgb2JzZXJ2ZXIuXG4gICAgaWYgKHZtLl9kYXRhLl9fb2JfXykge1xuICAgICAgdm0uX2RhdGEuX19vYl9fLnZtQ291bnQtLTtcbiAgICB9XG4gICAgLy8gY2FsbCB0aGUgbGFzdCBob29rLi4uXG4gICAgdm0uX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAvLyBpbnZva2UgZGVzdHJveSBob29rcyBvbiBjdXJyZW50IHJlbmRlcmVkIHRyZWVcbiAgICB2bS5fX3BhdGNoX18odm0uX3Zub2RlLCBudWxsKTtcbiAgICAvLyBmaXJlIGRlc3Ryb3llZCBob29rXG4gICAgY2FsbEhvb2sodm0sICdkZXN0cm95ZWQnKTtcbiAgICAvLyB0dXJuIG9mZiBhbGwgaW5zdGFuY2UgbGlzdGVuZXJzLlxuICAgIHZtLiRvZmYoKTtcbiAgICAvLyByZW1vdmUgX192dWVfXyByZWZlcmVuY2VcbiAgICBpZiAodm0uJGVsKSB7XG4gICAgICB2bS4kZWwuX192dWVfXyA9IG51bGw7XG4gICAgfVxuICAgIC8vIHJlbGVhc2UgY2lyY3VsYXIgcmVmZXJlbmNlICgjNjc1OSlcbiAgICBpZiAodm0uJHZub2RlKSB7XG4gICAgICB2bS4kdm5vZGUucGFyZW50ID0gbnVsbDtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNoaWxkQ29tcG9uZW50IChcbiAgdm0sXG4gIHByb3BzRGF0YSxcbiAgbGlzdGVuZXJzLFxuICBwYXJlbnRWbm9kZSxcbiAgcmVuZGVyQ2hpbGRyZW5cbikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IHRydWU7XG4gIH1cblxuICAvLyBkZXRlcm1pbmUgd2hldGhlciBjb21wb25lbnQgaGFzIHNsb3QgY2hpbGRyZW5cbiAgLy8gd2UgbmVlZCB0byBkbyB0aGlzIGJlZm9yZSBvdmVyd3JpdGluZyAkb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4uXG5cbiAgLy8gY2hlY2sgaWYgdGhlcmUgYXJlIGR5bmFtaWMgc2NvcGVkU2xvdHMgKGhhbmQtd3JpdHRlbiBvciBjb21waWxlZCBidXQgd2l0aFxuICAvLyBkeW5hbWljIHNsb3QgbmFtZXMpLiBTdGF0aWMgc2NvcGVkIHNsb3RzIGNvbXBpbGVkIGZyb20gdGVtcGxhdGUgaGFzIHRoZVxuICAvLyBcIiRzdGFibGVcIiBtYXJrZXIuXG4gIHZhciBuZXdTY29wZWRTbG90cyA9IHBhcmVudFZub2RlLmRhdGEuc2NvcGVkU2xvdHM7XG4gIHZhciBvbGRTY29wZWRTbG90cyA9IHZtLiRzY29wZWRTbG90cztcbiAgdmFyIGhhc0R5bmFtaWNTY29wZWRTbG90ID0gISEoXG4gICAgKG5ld1Njb3BlZFNsb3RzICYmICFuZXdTY29wZWRTbG90cy4kc3RhYmxlKSB8fFxuICAgIChvbGRTY29wZWRTbG90cyAhPT0gZW1wdHlPYmplY3QgJiYgIW9sZFNjb3BlZFNsb3RzLiRzdGFibGUpIHx8XG4gICAgKG5ld1Njb3BlZFNsb3RzICYmIHZtLiRzY29wZWRTbG90cy4ka2V5ICE9PSBuZXdTY29wZWRTbG90cy4ka2V5KVxuICApO1xuXG4gIC8vIEFueSBzdGF0aWMgc2xvdCBjaGlsZHJlbiBmcm9tIHRoZSBwYXJlbnQgbWF5IGhhdmUgY2hhbmdlZCBkdXJpbmcgcGFyZW50J3NcbiAgLy8gdXBkYXRlLiBEeW5hbWljIHNjb3BlZCBzbG90cyBtYXkgYWxzbyBoYXZlIGNoYW5nZWQuIEluIHN1Y2ggY2FzZXMsIGEgZm9yY2VkXG4gIC8vIHVwZGF0ZSBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIGNvcnJlY3RuZXNzLlxuICB2YXIgbmVlZHNGb3JjZVVwZGF0ZSA9ICEhKFxuICAgIHJlbmRlckNoaWxkcmVuIHx8ICAgICAgICAgICAgICAgLy8gaGFzIG5ldyBzdGF0aWMgc2xvdHNcbiAgICB2bS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4gfHwgIC8vIGhhcyBvbGQgc3RhdGljIHNsb3RzXG4gICAgaGFzRHluYW1pY1Njb3BlZFNsb3RcbiAgKTtcblxuICB2bS4kb3B0aW9ucy5fcGFyZW50Vm5vZGUgPSBwYXJlbnRWbm9kZTtcbiAgdm0uJHZub2RlID0gcGFyZW50Vm5vZGU7IC8vIHVwZGF0ZSB2bSdzIHBsYWNlaG9sZGVyIG5vZGUgd2l0aG91dCByZS1yZW5kZXJcblxuICBpZiAodm0uX3Zub2RlKSB7IC8vIHVwZGF0ZSBjaGlsZCB0cmVlJ3MgcGFyZW50XG4gICAgdm0uX3Zub2RlLnBhcmVudCA9IHBhcmVudFZub2RlO1xuICB9XG4gIHZtLiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbiA9IHJlbmRlckNoaWxkcmVuO1xuXG4gIC8vIHVwZGF0ZSAkYXR0cnMgYW5kICRsaXN0ZW5lcnMgaGFzaFxuICAvLyB0aGVzZSBhcmUgYWxzbyByZWFjdGl2ZSBzbyB0aGV5IG1heSB0cmlnZ2VyIGNoaWxkIHVwZGF0ZSBpZiB0aGUgY2hpbGRcbiAgLy8gdXNlZCB0aGVtIGR1cmluZyByZW5kZXJcbiAgdm0uJGF0dHJzID0gcGFyZW50Vm5vZGUuZGF0YS5hdHRycyB8fCBlbXB0eU9iamVjdDtcbiAgdm0uJGxpc3RlbmVycyA9IGxpc3RlbmVycyB8fCBlbXB0eU9iamVjdDtcblxuICAvLyB1cGRhdGUgcHJvcHNcbiAgaWYgKHByb3BzRGF0YSAmJiB2bS4kb3B0aW9ucy5wcm9wcykge1xuICAgIHRvZ2dsZU9ic2VydmluZyhmYWxzZSk7XG4gICAgdmFyIHByb3BzID0gdm0uX3Byb3BzO1xuICAgIHZhciBwcm9wS2V5cyA9IHZtLiRvcHRpb25zLl9wcm9wS2V5cyB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0gcHJvcEtleXNbaV07XG4gICAgICB2YXIgcHJvcE9wdGlvbnMgPSB2bS4kb3B0aW9ucy5wcm9wczsgLy8gd3RmIGZsb3c/XG4gICAgICBwcm9wc1trZXldID0gdmFsaWRhdGVQcm9wKGtleSwgcHJvcE9wdGlvbnMsIHByb3BzRGF0YSwgdm0pO1xuICAgIH1cbiAgICB0b2dnbGVPYnNlcnZpbmcodHJ1ZSk7XG4gICAgLy8ga2VlcCBhIGNvcHkgb2YgcmF3IHByb3BzRGF0YVxuICAgIHZtLiRvcHRpb25zLnByb3BzRGF0YSA9IHByb3BzRGF0YTtcbiAgfVxuICBcbiAgLy8gZml4ZWQgYnkgeHh4eHh4IHVwZGF0ZSBwcm9wZXJ0aWVzKG1wIHJ1bnRpbWUpXG4gIHZtLl8kdXBkYXRlUHJvcGVydGllcyAmJiB2bS5fJHVwZGF0ZVByb3BlcnRpZXModm0pO1xuICBcbiAgLy8gdXBkYXRlIGxpc3RlbmVyc1xuICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3Q7XG4gIHZhciBvbGRMaXN0ZW5lcnMgPSB2bS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO1xuICB2bS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzID0gbGlzdGVuZXJzO1xuICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycywgb2xkTGlzdGVuZXJzKTtcblxuICAvLyByZXNvbHZlIHNsb3RzICsgZm9yY2UgdXBkYXRlIGlmIGhhcyBjaGlsZHJlblxuICBpZiAobmVlZHNGb3JjZVVwZGF0ZSkge1xuICAgIHZtLiRzbG90cyA9IHJlc29sdmVTbG90cyhyZW5kZXJDaGlsZHJlbiwgcGFyZW50Vm5vZGUuY29udGV4dCk7XG4gICAgdm0uJGZvcmNlVXBkYXRlKCk7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzSW5JbmFjdGl2ZVRyZWUgKHZtKSB7XG4gIHdoaWxlICh2bSAmJiAodm0gPSB2bS4kcGFyZW50KSkge1xuICAgIGlmICh2bS5faW5hY3RpdmUpIHsgcmV0dXJuIHRydWUgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBhY3RpdmF0ZUNoaWxkQ29tcG9uZW50ICh2bSwgZGlyZWN0KSB7XG4gIGlmIChkaXJlY3QpIHtcbiAgICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZTtcbiAgICBpZiAoaXNJbkluYWN0aXZlVHJlZSh2bSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfSBlbHNlIGlmICh2bS5fZGlyZWN0SW5hY3RpdmUpIHtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAodm0uX2luYWN0aXZlIHx8IHZtLl9pbmFjdGl2ZSA9PT0gbnVsbCkge1xuICAgIHZtLl9pbmFjdGl2ZSA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdm0uJGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KHZtLiRjaGlsZHJlbltpXSk7XG4gICAgfVxuICAgIGNhbGxIb29rKHZtLCAnYWN0aXZhdGVkJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50ICh2bSwgZGlyZWN0KSB7XG4gIGlmIChkaXJlY3QpIHtcbiAgICB2bS5fZGlyZWN0SW5hY3RpdmUgPSB0cnVlO1xuICAgIGlmIChpc0luSW5hY3RpdmVUcmVlKHZtKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICB9XG4gIGlmICghdm0uX2luYWN0aXZlKSB7XG4gICAgdm0uX2luYWN0aXZlID0gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZtLiRjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KHZtLiRjaGlsZHJlbltpXSk7XG4gICAgfVxuICAgIGNhbGxIb29rKHZtLCAnZGVhY3RpdmF0ZWQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsSG9vayAodm0sIGhvb2spIHtcbiAgLy8gIzc1NzMgZGlzYWJsZSBkZXAgY29sbGVjdGlvbiB3aGVuIGludm9raW5nIGxpZmVjeWNsZSBob29rc1xuICBwdXNoVGFyZ2V0KCk7XG4gIHZhciBoYW5kbGVycyA9IHZtLiRvcHRpb25zW2hvb2tdO1xuICB2YXIgaW5mbyA9IGhvb2sgKyBcIiBob29rXCI7XG4gIGlmIChoYW5kbGVycykge1xuICAgIGZvciAodmFyIGkgPSAwLCBqID0gaGFuZGxlcnMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICBpbnZva2VXaXRoRXJyb3JIYW5kbGluZyhoYW5kbGVyc1tpXSwgdm0sIG51bGwsIHZtLCBpbmZvKTtcbiAgICB9XG4gIH1cbiAgaWYgKHZtLl9oYXNIb29rRXZlbnQpIHtcbiAgICB2bS4kZW1pdCgnaG9vazonICsgaG9vayk7XG4gIH1cbiAgcG9wVGFyZ2V0KCk7XG59XG5cbi8qICAqL1xuXG52YXIgTUFYX1VQREFURV9DT1VOVCA9IDEwMDtcblxudmFyIHF1ZXVlID0gW107XG52YXIgYWN0aXZhdGVkQ2hpbGRyZW4gPSBbXTtcbnZhciBoYXMgPSB7fTtcbnZhciBjaXJjdWxhciA9IHt9O1xudmFyIHdhaXRpbmcgPSBmYWxzZTtcbnZhciBmbHVzaGluZyA9IGZhbHNlO1xudmFyIGluZGV4ID0gMDtcblxuLyoqXG4gKiBSZXNldCB0aGUgc2NoZWR1bGVyJ3Mgc3RhdGUuXG4gKi9cbmZ1bmN0aW9uIHJlc2V0U2NoZWR1bGVyU3RhdGUgKCkge1xuICBpbmRleCA9IHF1ZXVlLmxlbmd0aCA9IGFjdGl2YXRlZENoaWxkcmVuLmxlbmd0aCA9IDA7XG4gIGhhcyA9IHt9O1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNpcmN1bGFyID0ge307XG4gIH1cbiAgd2FpdGluZyA9IGZsdXNoaW5nID0gZmFsc2U7XG59XG5cbi8vIEFzeW5jIGVkZ2UgY2FzZSAjNjU2NiByZXF1aXJlcyBzYXZpbmcgdGhlIHRpbWVzdGFtcCB3aGVuIGV2ZW50IGxpc3RlbmVycyBhcmVcbi8vIGF0dGFjaGVkLiBIb3dldmVyLCBjYWxsaW5nIHBlcmZvcm1hbmNlLm5vdygpIGhhcyBhIHBlcmYgb3ZlcmhlYWQgZXNwZWNpYWxseVxuLy8gaWYgdGhlIHBhZ2UgaGFzIHRob3VzYW5kcyBvZiBldmVudCBsaXN0ZW5lcnMuIEluc3RlYWQsIHdlIHRha2UgYSB0aW1lc3RhbXBcbi8vIGV2ZXJ5IHRpbWUgdGhlIHNjaGVkdWxlciBmbHVzaGVzIGFuZCB1c2UgdGhhdCBmb3IgYWxsIGV2ZW50IGxpc3RlbmVyc1xuLy8gYXR0YWNoZWQgZHVyaW5nIHRoYXQgZmx1c2guXG52YXIgY3VycmVudEZsdXNoVGltZXN0YW1wID0gMDtcblxuLy8gQXN5bmMgZWRnZSBjYXNlIGZpeCByZXF1aXJlcyBzdG9yaW5nIGFuIGV2ZW50IGxpc3RlbmVyJ3MgYXR0YWNoIHRpbWVzdGFtcC5cbnZhciBnZXROb3cgPSBEYXRlLm5vdztcblxuLy8gRGV0ZXJtaW5lIHdoYXQgZXZlbnQgdGltZXN0YW1wIHRoZSBicm93c2VyIGlzIHVzaW5nLiBBbm5veWluZ2x5LCB0aGVcbi8vIHRpbWVzdGFtcCBjYW4gZWl0aGVyIGJlIGhpLXJlcyAocmVsYXRpdmUgdG8gcGFnZSBsb2FkKSBvciBsb3ctcmVzXG4vLyAocmVsYXRpdmUgdG8gVU5JWCBlcG9jaCksIHNvIGluIG9yZGVyIHRvIGNvbXBhcmUgdGltZSB3ZSBoYXZlIHRvIHVzZSB0aGVcbi8vIHNhbWUgdGltZXN0YW1wIHR5cGUgd2hlbiBzYXZpbmcgdGhlIGZsdXNoIHRpbWVzdGFtcC5cbi8vIEFsbCBJRSB2ZXJzaW9ucyB1c2UgbG93LXJlcyBldmVudCB0aW1lc3RhbXBzLCBhbmQgaGF2ZSBwcm9ibGVtYXRpYyBjbG9ja1xuLy8gaW1wbGVtZW50YXRpb25zICgjOTYzMilcbmlmIChpbkJyb3dzZXIgJiYgIWlzSUUpIHtcbiAgdmFyIHBlcmZvcm1hbmNlID0gd2luZG93LnBlcmZvcm1hbmNlO1xuICBpZiAoXG4gICAgcGVyZm9ybWFuY2UgJiZcbiAgICB0eXBlb2YgcGVyZm9ybWFuY2Uubm93ID09PSAnZnVuY3Rpb24nICYmXG4gICAgZ2V0Tm93KCkgPiBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKS50aW1lU3RhbXBcbiAgKSB7XG4gICAgLy8gaWYgdGhlIGV2ZW50IHRpbWVzdGFtcCwgYWx0aG91Z2ggZXZhbHVhdGVkIEFGVEVSIHRoZSBEYXRlLm5vdygpLCBpc1xuICAgIC8vIHNtYWxsZXIgdGhhbiBpdCwgaXQgbWVhbnMgdGhlIGV2ZW50IGlzIHVzaW5nIGEgaGktcmVzIHRpbWVzdGFtcCxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byB1c2UgdGhlIGhpLXJlcyB2ZXJzaW9uIGZvciBldmVudCBsaXN0ZW5lciB0aW1lc3RhbXBzIGFzXG4gICAgLy8gd2VsbC5cbiAgICBnZXROb3cgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTsgfTtcbiAgfVxufVxuXG4vKipcbiAqIEZsdXNoIGJvdGggcXVldWVzIGFuZCBydW4gdGhlIHdhdGNoZXJzLlxuICovXG5mdW5jdGlvbiBmbHVzaFNjaGVkdWxlclF1ZXVlICgpIHtcbiAgY3VycmVudEZsdXNoVGltZXN0YW1wID0gZ2V0Tm93KCk7XG4gIGZsdXNoaW5nID0gdHJ1ZTtcbiAgdmFyIHdhdGNoZXIsIGlkO1xuXG4gIC8vIFNvcnQgcXVldWUgYmVmb3JlIGZsdXNoLlxuICAvLyBUaGlzIGVuc3VyZXMgdGhhdDpcbiAgLy8gMS4gQ29tcG9uZW50cyBhcmUgdXBkYXRlZCBmcm9tIHBhcmVudCB0byBjaGlsZC4gKGJlY2F1c2UgcGFyZW50IGlzIGFsd2F5c1xuICAvLyAgICBjcmVhdGVkIGJlZm9yZSB0aGUgY2hpbGQpXG4gIC8vIDIuIEEgY29tcG9uZW50J3MgdXNlciB3YXRjaGVycyBhcmUgcnVuIGJlZm9yZSBpdHMgcmVuZGVyIHdhdGNoZXIgKGJlY2F1c2VcbiAgLy8gICAgdXNlciB3YXRjaGVycyBhcmUgY3JlYXRlZCBiZWZvcmUgdGhlIHJlbmRlciB3YXRjaGVyKVxuICAvLyAzLiBJZiBhIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQgZHVyaW5nIGEgcGFyZW50IGNvbXBvbmVudCdzIHdhdGNoZXIgcnVuLFxuICAvLyAgICBpdHMgd2F0Y2hlcnMgY2FuIGJlIHNraXBwZWQuXG4gIHF1ZXVlLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEuaWQgLSBiLmlkOyB9KTtcblxuICAvLyBkbyBub3QgY2FjaGUgbGVuZ3RoIGJlY2F1c2UgbW9yZSB3YXRjaGVycyBtaWdodCBiZSBwdXNoZWRcbiAgLy8gYXMgd2UgcnVuIGV4aXN0aW5nIHdhdGNoZXJzXG4gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHF1ZXVlLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIHdhdGNoZXIgPSBxdWV1ZVtpbmRleF07XG4gICAgaWYgKHdhdGNoZXIuYmVmb3JlKSB7XG4gICAgICB3YXRjaGVyLmJlZm9yZSgpO1xuICAgIH1cbiAgICBpZCA9IHdhdGNoZXIuaWQ7XG4gICAgaGFzW2lkXSA9IG51bGw7XG4gICAgd2F0Y2hlci5ydW4oKTtcbiAgICAvLyBpbiBkZXYgYnVpbGQsIGNoZWNrIGFuZCBzdG9wIGNpcmN1bGFyIHVwZGF0ZXMuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgaGFzW2lkXSAhPSBudWxsKSB7XG4gICAgICBjaXJjdWxhcltpZF0gPSAoY2lyY3VsYXJbaWRdIHx8IDApICsgMTtcbiAgICAgIGlmIChjaXJjdWxhcltpZF0gPiBNQVhfVVBEQVRFX0NPVU5UKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ1lvdSBtYXkgaGF2ZSBhbiBpbmZpbml0ZSB1cGRhdGUgbG9vcCAnICsgKFxuICAgICAgICAgICAgd2F0Y2hlci51c2VyXG4gICAgICAgICAgICAgID8gKFwiaW4gd2F0Y2hlciB3aXRoIGV4cHJlc3Npb24gXFxcIlwiICsgKHdhdGNoZXIuZXhwcmVzc2lvbikgKyBcIlxcXCJcIilcbiAgICAgICAgICAgICAgOiBcImluIGEgY29tcG9uZW50IHJlbmRlciBmdW5jdGlvbi5cIlxuICAgICAgICAgICksXG4gICAgICAgICAgd2F0Y2hlci52bVxuICAgICAgICApO1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGtlZXAgY29waWVzIG9mIHBvc3QgcXVldWVzIGJlZm9yZSByZXNldHRpbmcgc3RhdGVcbiAgdmFyIGFjdGl2YXRlZFF1ZXVlID0gYWN0aXZhdGVkQ2hpbGRyZW4uc2xpY2UoKTtcbiAgdmFyIHVwZGF0ZWRRdWV1ZSA9IHF1ZXVlLnNsaWNlKCk7XG5cbiAgcmVzZXRTY2hlZHVsZXJTdGF0ZSgpO1xuXG4gIC8vIGNhbGwgY29tcG9uZW50IHVwZGF0ZWQgYW5kIGFjdGl2YXRlZCBob29rc1xuICBjYWxsQWN0aXZhdGVkSG9va3MoYWN0aXZhdGVkUXVldWUpO1xuICBjYWxsVXBkYXRlZEhvb2tzKHVwZGF0ZWRRdWV1ZSk7XG5cbiAgLy8gZGV2dG9vbCBob29rXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoZGV2dG9vbHMgJiYgY29uZmlnLmRldnRvb2xzKSB7XG4gICAgZGV2dG9vbHMuZW1pdCgnZmx1c2gnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsVXBkYXRlZEhvb2tzIChxdWV1ZSkge1xuICB2YXIgaSA9IHF1ZXVlLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIHZhciB3YXRjaGVyID0gcXVldWVbaV07XG4gICAgdmFyIHZtID0gd2F0Y2hlci52bTtcbiAgICBpZiAodm0uX3dhdGNoZXIgPT09IHdhdGNoZXIgJiYgdm0uX2lzTW91bnRlZCAmJiAhdm0uX2lzRGVzdHJveWVkKSB7XG4gICAgICBjYWxsSG9vayh2bSwgJ3VwZGF0ZWQnKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBRdWV1ZSBhIGtlcHQtYWxpdmUgY29tcG9uZW50IHRoYXQgd2FzIGFjdGl2YXRlZCBkdXJpbmcgcGF0Y2guXG4gKiBUaGUgcXVldWUgd2lsbCBiZSBwcm9jZXNzZWQgYWZ0ZXIgdGhlIGVudGlyZSB0cmVlIGhhcyBiZWVuIHBhdGNoZWQuXG4gKi9cbmZ1bmN0aW9uIHF1ZXVlQWN0aXZhdGVkQ29tcG9uZW50ICh2bSkge1xuICAvLyBzZXR0aW5nIF9pbmFjdGl2ZSB0byBmYWxzZSBoZXJlIHNvIHRoYXQgYSByZW5kZXIgZnVuY3Rpb24gY2FuXG4gIC8vIHJlbHkgb24gY2hlY2tpbmcgd2hldGhlciBpdCdzIGluIGFuIGluYWN0aXZlIHRyZWUgKGUuZy4gcm91dGVyLXZpZXcpXG4gIHZtLl9pbmFjdGl2ZSA9IGZhbHNlO1xuICBhY3RpdmF0ZWRDaGlsZHJlbi5wdXNoKHZtKTtcbn1cblxuZnVuY3Rpb24gY2FsbEFjdGl2YXRlZEhvb2tzIChxdWV1ZSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgcXVldWVbaV0uX2luYWN0aXZlID0gdHJ1ZTtcbiAgICBhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KHF1ZXVlW2ldLCB0cnVlIC8qIHRydWUgKi8pO1xuICB9XG59XG5cbi8qKlxuICogUHVzaCBhIHdhdGNoZXIgaW50byB0aGUgd2F0Y2hlciBxdWV1ZS5cbiAqIEpvYnMgd2l0aCBkdXBsaWNhdGUgSURzIHdpbGwgYmUgc2tpcHBlZCB1bmxlc3MgaXQnc1xuICogcHVzaGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGJlaW5nIGZsdXNoZWQuXG4gKi9cbmZ1bmN0aW9uIHF1ZXVlV2F0Y2hlciAod2F0Y2hlcikge1xuICB2YXIgaWQgPSB3YXRjaGVyLmlkO1xuICBpZiAoaGFzW2lkXSA9PSBudWxsKSB7XG4gICAgaGFzW2lkXSA9IHRydWU7XG4gICAgaWYgKCFmbHVzaGluZykge1xuICAgICAgcXVldWUucHVzaCh3YXRjaGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgYWxyZWFkeSBmbHVzaGluZywgc3BsaWNlIHRoZSB3YXRjaGVyIGJhc2VkIG9uIGl0cyBpZFxuICAgICAgLy8gaWYgYWxyZWFkeSBwYXN0IGl0cyBpZCwgaXQgd2lsbCBiZSBydW4gbmV4dCBpbW1lZGlhdGVseS5cbiAgICAgIHZhciBpID0gcXVldWUubGVuZ3RoIC0gMTtcbiAgICAgIHdoaWxlIChpID4gaW5kZXggJiYgcXVldWVbaV0uaWQgPiB3YXRjaGVyLmlkKSB7XG4gICAgICAgIGktLTtcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnNwbGljZShpICsgMSwgMCwgd2F0Y2hlcik7XG4gICAgfVxuICAgIC8vIHF1ZXVlIHRoZSBmbHVzaFxuICAgIGlmICghd2FpdGluZykge1xuICAgICAgd2FpdGluZyA9IHRydWU7XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFjb25maWcuYXN5bmMpIHtcbiAgICAgICAgZmx1c2hTY2hlZHVsZXJRdWV1ZSgpO1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIG5leHRUaWNrKGZsdXNoU2NoZWR1bGVyUXVldWUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxuXG5cbnZhciB1aWQkMiA9IDA7XG5cbi8qKlxuICogQSB3YXRjaGVyIHBhcnNlcyBhbiBleHByZXNzaW9uLCBjb2xsZWN0cyBkZXBlbmRlbmNpZXMsXG4gKiBhbmQgZmlyZXMgY2FsbGJhY2sgd2hlbiB0aGUgZXhwcmVzc2lvbiB2YWx1ZSBjaGFuZ2VzLlxuICogVGhpcyBpcyB1c2VkIGZvciBib3RoIHRoZSAkd2F0Y2goKSBhcGkgYW5kIGRpcmVjdGl2ZXMuXG4gKi9cbnZhciBXYXRjaGVyID0gZnVuY3Rpb24gV2F0Y2hlciAoXG4gIHZtLFxuICBleHBPckZuLFxuICBjYixcbiAgb3B0aW9ucyxcbiAgaXNSZW5kZXJXYXRjaGVyXG4pIHtcbiAgdGhpcy52bSA9IHZtO1xuICBpZiAoaXNSZW5kZXJXYXRjaGVyKSB7XG4gICAgdm0uX3dhdGNoZXIgPSB0aGlzO1xuICB9XG4gIHZtLl93YXRjaGVycy5wdXNoKHRoaXMpO1xuICAvLyBvcHRpb25zXG4gIGlmIChvcHRpb25zKSB7XG4gICAgdGhpcy5kZWVwID0gISFvcHRpb25zLmRlZXA7XG4gICAgdGhpcy51c2VyID0gISFvcHRpb25zLnVzZXI7XG4gICAgdGhpcy5sYXp5ID0gISFvcHRpb25zLmxhenk7XG4gICAgdGhpcy5zeW5jID0gISFvcHRpb25zLnN5bmM7XG4gICAgdGhpcy5iZWZvcmUgPSBvcHRpb25zLmJlZm9yZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmRlZXAgPSB0aGlzLnVzZXIgPSB0aGlzLmxhenkgPSB0aGlzLnN5bmMgPSBmYWxzZTtcbiAgfVxuICB0aGlzLmNiID0gY2I7XG4gIHRoaXMuaWQgPSArK3VpZCQyOyAvLyB1aWQgZm9yIGJhdGNoaW5nXG4gIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgdGhpcy5kaXJ0eSA9IHRoaXMubGF6eTsgLy8gZm9yIGxhenkgd2F0Y2hlcnNcbiAgdGhpcy5kZXBzID0gW107XG4gIHRoaXMubmV3RGVwcyA9IFtdO1xuICB0aGlzLmRlcElkcyA9IG5ldyBfU2V0KCk7XG4gIHRoaXMubmV3RGVwSWRzID0gbmV3IF9TZXQoKTtcbiAgdGhpcy5leHByZXNzaW9uID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJ1xuICAgID8gZXhwT3JGbi50b1N0cmluZygpXG4gICAgOiAnJztcbiAgLy8gcGFyc2UgZXhwcmVzc2lvbiBmb3IgZ2V0dGVyXG4gIGlmICh0eXBlb2YgZXhwT3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuZ2V0dGVyID0gZXhwT3JGbjtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmdldHRlciA9IHBhcnNlUGF0aChleHBPckZuKTtcbiAgICBpZiAoIXRoaXMuZ2V0dGVyKSB7XG4gICAgICB0aGlzLmdldHRlciA9IG5vb3A7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAgIFwiRmFpbGVkIHdhdGNoaW5nIHBhdGg6IFxcXCJcIiArIGV4cE9yRm4gKyBcIlxcXCIgXCIgK1xuICAgICAgICAnV2F0Y2hlciBvbmx5IGFjY2VwdHMgc2ltcGxlIGRvdC1kZWxpbWl0ZWQgcGF0aHMuICcgK1xuICAgICAgICAnRm9yIGZ1bGwgY29udHJvbCwgdXNlIGEgZnVuY3Rpb24gaW5zdGVhZC4nLFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgdGhpcy52YWx1ZSA9IHRoaXMubGF6eVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiB0aGlzLmdldCgpO1xufTtcblxuLyoqXG4gKiBFdmFsdWF0ZSB0aGUgZ2V0dGVyLCBhbmQgcmUtY29sbGVjdCBkZXBlbmRlbmNpZXMuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAoKSB7XG4gIHB1c2hUYXJnZXQodGhpcyk7XG4gIHZhciB2YWx1ZTtcbiAgdmFyIHZtID0gdGhpcy52bTtcbiAgdHJ5IHtcbiAgICB2YWx1ZSA9IHRoaXMuZ2V0dGVyLmNhbGwodm0sIHZtKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICh0aGlzLnVzZXIpIHtcbiAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCAoXCJnZXR0ZXIgZm9yIHdhdGNoZXIgXFxcIlwiICsgKHRoaXMuZXhwcmVzc2lvbikgKyBcIlxcXCJcIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlXG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIC8vIFwidG91Y2hcIiBldmVyeSBwcm9wZXJ0eSBzbyB0aGV5IGFyZSBhbGwgdHJhY2tlZCBhc1xuICAgIC8vIGRlcGVuZGVuY2llcyBmb3IgZGVlcCB3YXRjaGluZ1xuICAgIGlmICh0aGlzLmRlZXApIHtcbiAgICAgIHRyYXZlcnNlKHZhbHVlKTtcbiAgICB9XG4gICAgcG9wVGFyZ2V0KCk7XG4gICAgdGhpcy5jbGVhbnVwRGVwcygpO1xuICB9XG4gIHJldHVybiB2YWx1ZVxufTtcblxuLyoqXG4gKiBBZGQgYSBkZXBlbmRlbmN5IHRvIHRoaXMgZGlyZWN0aXZlLlxuICovXG5XYXRjaGVyLnByb3RvdHlwZS5hZGREZXAgPSBmdW5jdGlvbiBhZGREZXAgKGRlcCkge1xuICB2YXIgaWQgPSBkZXAuaWQ7XG4gIGlmICghdGhpcy5uZXdEZXBJZHMuaGFzKGlkKSkge1xuICAgIHRoaXMubmV3RGVwSWRzLmFkZChpZCk7XG4gICAgdGhpcy5uZXdEZXBzLnB1c2goZGVwKTtcbiAgICBpZiAoIXRoaXMuZGVwSWRzLmhhcyhpZCkpIHtcbiAgICAgIGRlcC5hZGRTdWIodGhpcyk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIENsZWFuIHVwIGZvciBkZXBlbmRlbmN5IGNvbGxlY3Rpb24uXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLmNsZWFudXBEZXBzID0gZnVuY3Rpb24gY2xlYW51cERlcHMgKCkge1xuICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB2YXIgZGVwID0gdGhpcy5kZXBzW2ldO1xuICAgIGlmICghdGhpcy5uZXdEZXBJZHMuaGFzKGRlcC5pZCkpIHtcbiAgICAgIGRlcC5yZW1vdmVTdWIodGhpcyk7XG4gICAgfVxuICB9XG4gIHZhciB0bXAgPSB0aGlzLmRlcElkcztcbiAgdGhpcy5kZXBJZHMgPSB0aGlzLm5ld0RlcElkcztcbiAgdGhpcy5uZXdEZXBJZHMgPSB0bXA7XG4gIHRoaXMubmV3RGVwSWRzLmNsZWFyKCk7XG4gIHRtcCA9IHRoaXMuZGVwcztcbiAgdGhpcy5kZXBzID0gdGhpcy5uZXdEZXBzO1xuICB0aGlzLm5ld0RlcHMgPSB0bXA7XG4gIHRoaXMubmV3RGVwcy5sZW5ndGggPSAwO1xufTtcblxuLyoqXG4gKiBTdWJzY3JpYmVyIGludGVyZmFjZS5cbiAqIFdpbGwgYmUgY2FsbGVkIHdoZW4gYSBkZXBlbmRlbmN5IGNoYW5nZXMuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICh0aGlzLmxhenkpIHtcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgfSBlbHNlIGlmICh0aGlzLnN5bmMpIHtcbiAgICB0aGlzLnJ1bigpO1xuICB9IGVsc2Uge1xuICAgIHF1ZXVlV2F0Y2hlcih0aGlzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTY2hlZHVsZXIgam9iIGludGVyZmFjZS5cbiAqIFdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBzY2hlZHVsZXIuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIHJ1biAoKSB7XG4gIGlmICh0aGlzLmFjdGl2ZSkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0KCk7XG4gICAgaWYgKFxuICAgICAgdmFsdWUgIT09IHRoaXMudmFsdWUgfHxcbiAgICAgIC8vIERlZXAgd2F0Y2hlcnMgYW5kIHdhdGNoZXJzIG9uIE9iamVjdC9BcnJheXMgc2hvdWxkIGZpcmUgZXZlblxuICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUsIGJlY2F1c2UgdGhlIHZhbHVlIG1heVxuICAgICAgLy8gaGF2ZSBtdXRhdGVkLlxuICAgICAgaXNPYmplY3QodmFsdWUpIHx8XG4gICAgICB0aGlzLmRlZXBcbiAgICApIHtcbiAgICAgIC8vIHNldCBuZXcgdmFsdWVcbiAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy51c2VyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5jYi5jYWxsKHRoaXMudm0sIHZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB0aGlzLnZtLCAoXCJjYWxsYmFjayBmb3Igd2F0Y2hlciBcXFwiXCIgKyAodGhpcy5leHByZXNzaW9uKSArIFwiXFxcIlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2IuY2FsbCh0aGlzLnZtLCB2YWx1ZSwgb2xkVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBFdmFsdWF0ZSB0aGUgdmFsdWUgb2YgdGhlIHdhdGNoZXIuXG4gKiBUaGlzIG9ubHkgZ2V0cyBjYWxsZWQgZm9yIGxhenkgd2F0Y2hlcnMuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gZXZhbHVhdGUgKCkge1xuICB0aGlzLnZhbHVlID0gdGhpcy5nZXQoKTtcbiAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xufTtcblxuLyoqXG4gKiBEZXBlbmQgb24gYWxsIGRlcHMgY29sbGVjdGVkIGJ5IHRoaXMgd2F0Y2hlci5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gZGVwZW5kICgpIHtcbiAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgdGhpcy5kZXBzW2ldLmRlcGVuZCgpO1xuICB9XG59O1xuXG4vKipcbiAqIFJlbW92ZSBzZWxmIGZyb20gYWxsIGRlcGVuZGVuY2llcycgc3Vic2NyaWJlciBsaXN0LlxuICovXG5XYXRjaGVyLnByb3RvdHlwZS50ZWFyZG93biA9IGZ1bmN0aW9uIHRlYXJkb3duICgpIHtcbiAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgLy8gcmVtb3ZlIHNlbGYgZnJvbSB2bSdzIHdhdGNoZXIgbGlzdFxuICAgIC8vIHRoaXMgaXMgYSBzb21ld2hhdCBleHBlbnNpdmUgb3BlcmF0aW9uIHNvIHdlIHNraXAgaXRcbiAgICAvLyBpZiB0aGUgdm0gaXMgYmVpbmcgZGVzdHJveWVkLlxuICAgIGlmICghdGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZCkge1xuICAgICAgcmVtb3ZlKHRoaXMudm0uX3dhdGNoZXJzLCB0aGlzKTtcbiAgICB9XG4gICAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRoaXMuZGVwc1tpXS5yZW1vdmVTdWIodGhpcyk7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gIH1cbn07XG5cbi8qICAqL1xuXG52YXIgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uID0ge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogbm9vcCxcbiAgc2V0OiBub29wXG59O1xuXG5mdW5jdGlvbiBwcm94eSAodGFyZ2V0LCBzb3VyY2VLZXksIGtleSkge1xuICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uZ2V0ID0gZnVuY3Rpb24gcHJveHlHZXR0ZXIgKCkge1xuICAgIHJldHVybiB0aGlzW3NvdXJjZUtleV1ba2V5XVxuICB9O1xuICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gZnVuY3Rpb24gcHJveHlTZXR0ZXIgKHZhbCkge1xuICAgIHRoaXNbc291cmNlS2V5XVtrZXldID0gdmFsO1xuICB9O1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbik7XG59XG5cbmZ1bmN0aW9uIGluaXRTdGF0ZSAodm0pIHtcbiAgdm0uX3dhdGNoZXJzID0gW107XG4gIHZhciBvcHRzID0gdm0uJG9wdGlvbnM7XG4gIGlmIChvcHRzLnByb3BzKSB7IGluaXRQcm9wcyh2bSwgb3B0cy5wcm9wcyk7IH1cbiAgaWYgKG9wdHMubWV0aG9kcykgeyBpbml0TWV0aG9kcyh2bSwgb3B0cy5tZXRob2RzKTsgfVxuICBpZiAob3B0cy5kYXRhKSB7XG4gICAgaW5pdERhdGEodm0pO1xuICB9IGVsc2Uge1xuICAgIG9ic2VydmUodm0uX2RhdGEgPSB7fSwgdHJ1ZSAvKiBhc1Jvb3REYXRhICovKTtcbiAgfVxuICBpZiAob3B0cy5jb21wdXRlZCkgeyBpbml0Q29tcHV0ZWQodm0sIG9wdHMuY29tcHV0ZWQpOyB9XG4gIGlmIChvcHRzLndhdGNoICYmIG9wdHMud2F0Y2ggIT09IG5hdGl2ZVdhdGNoKSB7XG4gICAgaW5pdFdhdGNoKHZtLCBvcHRzLndhdGNoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0UHJvcHMgKHZtLCBwcm9wc09wdGlvbnMpIHtcbiAgdmFyIHByb3BzRGF0YSA9IHZtLiRvcHRpb25zLnByb3BzRGF0YSB8fCB7fTtcbiAgdmFyIHByb3BzID0gdm0uX3Byb3BzID0ge307XG4gIC8vIGNhY2hlIHByb3Aga2V5cyBzbyB0aGF0IGZ1dHVyZSBwcm9wcyB1cGRhdGVzIGNhbiBpdGVyYXRlIHVzaW5nIEFycmF5XG4gIC8vIGluc3RlYWQgb2YgZHluYW1pYyBvYmplY3Qga2V5IGVudW1lcmF0aW9uLlxuICB2YXIga2V5cyA9IHZtLiRvcHRpb25zLl9wcm9wS2V5cyA9IFtdO1xuICB2YXIgaXNSb290ID0gIXZtLiRwYXJlbnQ7XG4gIC8vIHJvb3QgaW5zdGFuY2UgcHJvcHMgc2hvdWxkIGJlIGNvbnZlcnRlZFxuICBpZiAoIWlzUm9vdCkge1xuICAgIHRvZ2dsZU9ic2VydmluZyhmYWxzZSk7XG4gIH1cbiAgdmFyIGxvb3AgPSBmdW5jdGlvbiAoIGtleSApIHtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB2YXIgdmFsdWUgPSB2YWxpZGF0ZVByb3Aoa2V5LCBwcm9wc09wdGlvbnMsIHByb3BzRGF0YSwgdm0pO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBoeXBoZW5hdGVkS2V5ID0gaHlwaGVuYXRlKGtleSk7XG4gICAgICBpZiAoaXNSZXNlcnZlZEF0dHJpYnV0ZShoeXBoZW5hdGVkS2V5KSB8fFxuICAgICAgICAgIGNvbmZpZy5pc1Jlc2VydmVkQXR0cihoeXBoZW5hdGVkS2V5KSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIChcIlxcXCJcIiArIGh5cGhlbmF0ZWRLZXkgKyBcIlxcXCIgaXMgYSByZXNlcnZlZCBhdHRyaWJ1dGUgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIGNvbXBvbmVudCBwcm9wLlwiKSxcbiAgICAgICAgICB2bVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZGVmaW5lUmVhY3RpdmUkJDEocHJvcHMsIGtleSwgdmFsdWUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFpc1Jvb3QgJiYgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmKHZtLm1wSG9zdCA9PT0gJ21wLWJhaWR1JyB8fCB2bS5tcEhvc3QgPT09ICdtcC1rdWFpc2hvdScgfHwgdm0ubXBIb3N0ID09PSAnbXAteGhzJyl7Ly/nmb7luqbjgIHlv6vmiYvjgIHlsI/nuqLkuaYgb2JzZXJ2ZXIg5ZyoIHNldERhdGEgY2FsbGJhY2sg5LmL5ZCO6Kem5Y+R77yM55u05o6l5b+955Wl6K+lIHdhcm5cbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vZml4ZWQgYnkgeHh4eHh4IF9fbmV4dF90aWNrX3BlbmRpbmcsdW5pOi8vZm9ybS1maWVsZCDml7bkuI3lkYroraZcbiAgICAgICAgICAgIGlmKFxuICAgICAgICAgICAgICAgIGtleSA9PT0gJ3ZhbHVlJyAmJiBcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHZtLiRvcHRpb25zLmJlaGF2aW9ycykgJiZcbiAgICAgICAgICAgICAgICB2bS4kb3B0aW9ucy5iZWhhdmlvcnMuaW5kZXhPZigndW5pOi8vZm9ybS1maWVsZCcpICE9PSAtMVxuICAgICAgICAgICAgICApe1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHZtLl9nZXRGb3JtRGF0YSl7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyICRwYXJlbnQgPSB2bS4kcGFyZW50O1xuICAgICAgICAgICAgd2hpbGUoJHBhcmVudCl7XG4gICAgICAgICAgICAgIGlmKCRwYXJlbnQuX19uZXh0X3RpY2tfcGVuZGluZyl7XG4gICAgICAgICAgICAgICAgcmV0dXJuICBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAkcGFyZW50ID0gJHBhcmVudC4kcGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgXCJBdm9pZCBtdXRhdGluZyBhIHByb3AgZGlyZWN0bHkgc2luY2UgdGhlIHZhbHVlIHdpbGwgYmUgXCIgK1xuICAgICAgICAgICAgXCJvdmVyd3JpdHRlbiB3aGVuZXZlciB0aGUgcGFyZW50IGNvbXBvbmVudCByZS1yZW5kZXJzLiBcIiArXG4gICAgICAgICAgICBcIkluc3RlYWQsIHVzZSBhIGRhdGEgb3IgY29tcHV0ZWQgcHJvcGVydHkgYmFzZWQgb24gdGhlIHByb3AncyBcIiArXG4gICAgICAgICAgICBcInZhbHVlLiBQcm9wIGJlaW5nIG11dGF0ZWQ6IFxcXCJcIiArIGtleSArIFwiXFxcIlwiLFxuICAgICAgICAgICAgdm1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVmaW5lUmVhY3RpdmUkJDEocHJvcHMsIGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICAvLyBzdGF0aWMgcHJvcHMgYXJlIGFscmVhZHkgcHJveGllZCBvbiB0aGUgY29tcG9uZW50J3MgcHJvdG90eXBlXG4gICAgLy8gZHVyaW5nIFZ1ZS5leHRlbmQoKS4gV2Ugb25seSBuZWVkIHRvIHByb3h5IHByb3BzIGRlZmluZWQgYXRcbiAgICAvLyBpbnN0YW50aWF0aW9uIGhlcmUuXG4gICAgaWYgKCEoa2V5IGluIHZtKSkge1xuICAgICAgcHJveHkodm0sIFwiX3Byb3BzXCIsIGtleSk7XG4gICAgfVxuICB9O1xuXG4gIGZvciAodmFyIGtleSBpbiBwcm9wc09wdGlvbnMpIGxvb3AoIGtleSApO1xuICB0b2dnbGVPYnNlcnZpbmcodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGluaXREYXRhICh2bSkge1xuICB2YXIgZGF0YSA9IHZtLiRvcHRpb25zLmRhdGE7XG4gIGRhdGEgPSB2bS5fZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nXG4gICAgPyBnZXREYXRhKGRhdGEsIHZtKVxuICAgIDogZGF0YSB8fCB7fTtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KGRhdGEpKSB7XG4gICAgZGF0YSA9IHt9O1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICdkYXRhIGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIGFuIG9iamVjdDpcXG4nICtcbiAgICAgICdodHRwczovL3Z1ZWpzLm9yZy92Mi9ndWlkZS9jb21wb25lbnRzLmh0bWwjZGF0YS1NdXN0LUJlLWEtRnVuY3Rpb24nLFxuICAgICAgdm1cbiAgICApO1xuICB9XG4gIC8vIHByb3h5IGRhdGEgb24gaW5zdGFuY2VcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7XG4gIHZhciBtZXRob2RzID0gdm0uJG9wdGlvbnMubWV0aG9kcztcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAobWV0aG9kcyAmJiBoYXNPd24obWV0aG9kcywga2V5KSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIChcIk1ldGhvZCBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIGFzIGEgZGF0YSBwcm9wZXJ0eS5cIiksXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb3BzICYmIGhhc093bihwcm9wcywga2V5KSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICBcIlRoZSBkYXRhIHByb3BlcnR5IFxcXCJcIiArIGtleSArIFwiXFxcIiBpcyBhbHJlYWR5IGRlY2xhcmVkIGFzIGEgcHJvcC4gXCIgK1xuICAgICAgICBcIlVzZSBwcm9wIGRlZmF1bHQgdmFsdWUgaW5zdGVhZC5cIixcbiAgICAgICAgdm1cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICghaXNSZXNlcnZlZChrZXkpKSB7XG4gICAgICBwcm94eSh2bSwgXCJfZGF0YVwiLCBrZXkpO1xuICAgIH1cbiAgfVxuICAvLyBvYnNlcnZlIGRhdGFcbiAgb2JzZXJ2ZShkYXRhLCB0cnVlIC8qIGFzUm9vdERhdGEgKi8pO1xufVxuXG5mdW5jdGlvbiBnZXREYXRhIChkYXRhLCB2bSkge1xuICAvLyAjNzU3MyBkaXNhYmxlIGRlcCBjb2xsZWN0aW9uIHdoZW4gaW52b2tpbmcgZGF0YSBnZXR0ZXJzXG4gIHB1c2hUYXJnZXQoKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGF0YS5jYWxsKHZtLCB2bSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIGhhbmRsZUVycm9yKGUsIHZtLCBcImRhdGEoKVwiKTtcbiAgICByZXR1cm4ge31cbiAgfSBmaW5hbGx5IHtcbiAgICBwb3BUYXJnZXQoKTtcbiAgfVxufVxuXG52YXIgY29tcHV0ZWRXYXRjaGVyT3B0aW9ucyA9IHsgbGF6eTogdHJ1ZSB9O1xuXG5mdW5jdGlvbiBpbml0Q29tcHV0ZWQgKHZtLCBjb21wdXRlZCkge1xuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgdmFyIHdhdGNoZXJzID0gdm0uX2NvbXB1dGVkV2F0Y2hlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAvLyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBqdXN0IGdldHRlcnMgZHVyaW5nIFNTUlxuICB2YXIgaXNTU1IgPSBpc1NlcnZlclJlbmRlcmluZygpO1xuXG4gIGZvciAodmFyIGtleSBpbiBjb21wdXRlZCkge1xuICAgIHZhciB1c2VyRGVmID0gY29tcHV0ZWRba2V5XTtcbiAgICB2YXIgZ2V0dGVyID0gdHlwZW9mIHVzZXJEZWYgPT09ICdmdW5jdGlvbicgPyB1c2VyRGVmIDogdXNlckRlZi5nZXQ7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZ2V0dGVyID09IG51bGwpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIChcIkdldHRlciBpcyBtaXNzaW5nIGZvciBjb21wdXRlZCBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIuXCIpLFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzU1NSKSB7XG4gICAgICAvLyBjcmVhdGUgaW50ZXJuYWwgd2F0Y2hlciBmb3IgdGhlIGNvbXB1dGVkIHByb3BlcnR5LlxuICAgICAgd2F0Y2hlcnNba2V5XSA9IG5ldyBXYXRjaGVyKFxuICAgICAgICB2bSxcbiAgICAgICAgZ2V0dGVyIHx8IG5vb3AsXG4gICAgICAgIG5vb3AsXG4gICAgICAgIGNvbXB1dGVkV2F0Y2hlck9wdGlvbnNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gY29tcG9uZW50LWRlZmluZWQgY29tcHV0ZWQgcHJvcGVydGllcyBhcmUgYWxyZWFkeSBkZWZpbmVkIG9uIHRoZVxuICAgIC8vIGNvbXBvbmVudCBwcm90b3R5cGUuIFdlIG9ubHkgbmVlZCB0byBkZWZpbmUgY29tcHV0ZWQgcHJvcGVydGllcyBkZWZpbmVkXG4gICAgLy8gYXQgaW5zdGFudGlhdGlvbiBoZXJlLlxuICAgIGlmICghKGtleSBpbiB2bSkpIHtcbiAgICAgIGRlZmluZUNvbXB1dGVkKHZtLCBrZXksIHVzZXJEZWYpO1xuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGtleSBpbiB2bS4kZGF0YSkge1xuICAgICAgICB3YXJuKChcIlRoZSBjb21wdXRlZCBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIGRhdGEuXCIpLCB2bSk7XG4gICAgICB9IGVsc2UgaWYgKHZtLiRvcHRpb25zLnByb3BzICYmIGtleSBpbiB2bS4kb3B0aW9ucy5wcm9wcykge1xuICAgICAgICB3YXJuKChcIlRoZSBjb21wdXRlZCBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgcHJvcC5cIiksIHZtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lQ29tcHV0ZWQgKFxuICB0YXJnZXQsXG4gIGtleSxcbiAgdXNlckRlZlxuKSB7XG4gIHZhciBzaG91bGRDYWNoZSA9ICFpc1NlcnZlclJlbmRlcmluZygpO1xuICBpZiAodHlwZW9mIHVzZXJEZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uZ2V0ID0gc2hvdWxkQ2FjaGVcbiAgICAgID8gY3JlYXRlQ29tcHV0ZWRHZXR0ZXIoa2V5KVxuICAgICAgOiBjcmVhdGVHZXR0ZXJJbnZva2VyKHVzZXJEZWYpO1xuICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSBub29wO1xuICB9IGVsc2Uge1xuICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5nZXQgPSB1c2VyRGVmLmdldFxuICAgICAgPyBzaG91bGRDYWNoZSAmJiB1c2VyRGVmLmNhY2hlICE9PSBmYWxzZVxuICAgICAgICA/IGNyZWF0ZUNvbXB1dGVkR2V0dGVyKGtleSlcbiAgICAgICAgOiBjcmVhdGVHZXR0ZXJJbnZva2VyKHVzZXJEZWYuZ2V0KVxuICAgICAgOiBub29wO1xuICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSB1c2VyRGVmLnNldCB8fCBub29wO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID09PSBub29wKSB7XG4gICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIChcIkNvbXB1dGVkIHByb3BlcnR5IFxcXCJcIiArIGtleSArIFwiXFxcIiB3YXMgYXNzaWduZWQgdG8gYnV0IGl0IGhhcyBubyBzZXR0ZXIuXCIpLFxuICAgICAgICB0aGlzXG4gICAgICApO1xuICAgIH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb21wdXRlZEdldHRlciAoa2V5KSB7XG4gIHJldHVybiBmdW5jdGlvbiBjb21wdXRlZEdldHRlciAoKSB7XG4gICAgdmFyIHdhdGNoZXIgPSB0aGlzLl9jb21wdXRlZFdhdGNoZXJzICYmIHRoaXMuX2NvbXB1dGVkV2F0Y2hlcnNba2V5XTtcbiAgICBpZiAod2F0Y2hlcikge1xuICAgICAgaWYgKHdhdGNoZXIuZGlydHkpIHtcbiAgICAgICAgd2F0Y2hlci5ldmFsdWF0ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKERlcC5TaGFyZWRPYmplY3QudGFyZ2V0KSB7Ly8gZml4ZWQgYnkgeHh4eHh4XG4gICAgICAgIHdhdGNoZXIuZGVwZW5kKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2F0Y2hlci52YWx1ZVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVHZXR0ZXJJbnZva2VyKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjb21wdXRlZEdldHRlciAoKSB7XG4gICAgcmV0dXJuIGZuLmNhbGwodGhpcywgdGhpcylcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0TWV0aG9kcyAodm0sIG1ldGhvZHMpIHtcbiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7XG4gIGZvciAodmFyIGtleSBpbiBtZXRob2RzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0aG9kc1trZXldICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgXCJNZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGhhcyB0eXBlIFxcXCJcIiArICh0eXBlb2YgbWV0aG9kc1trZXldKSArIFwiXFxcIiBpbiB0aGUgY29tcG9uZW50IGRlZmluaXRpb24uIFwiICtcbiAgICAgICAgICBcIkRpZCB5b3UgcmVmZXJlbmNlIHRoZSBmdW5jdGlvbiBjb3JyZWN0bHk/XCIsXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcyAmJiBoYXNPd24ocHJvcHMsIGtleSkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAoXCJNZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBhcyBhIHByb3AuXCIpLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoKGtleSBpbiB2bSkgJiYgaXNSZXNlcnZlZChrZXkpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgXCJNZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIFZ1ZSBpbnN0YW5jZSBtZXRob2QuIFwiICtcbiAgICAgICAgICBcIkF2b2lkIGRlZmluaW5nIGNvbXBvbmVudCBtZXRob2RzIHRoYXQgc3RhcnQgd2l0aCBfIG9yICQuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdm1ba2V5XSA9IHR5cGVvZiBtZXRob2RzW2tleV0gIT09ICdmdW5jdGlvbicgPyBub29wIDogYmluZChtZXRob2RzW2tleV0sIHZtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0V2F0Y2ggKHZtLCB3YXRjaCkge1xuICBmb3IgKHZhciBrZXkgaW4gd2F0Y2gpIHtcbiAgICB2YXIgaGFuZGxlciA9IHdhdGNoW2tleV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaGFuZGxlcikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjcmVhdGVXYXRjaGVyKHZtLCBrZXksIGhhbmRsZXJbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjcmVhdGVXYXRjaGVyKHZtLCBrZXksIGhhbmRsZXIpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVXYXRjaGVyIChcbiAgdm0sXG4gIGV4cE9yRm4sXG4gIGhhbmRsZXIsXG4gIG9wdGlvbnNcbikge1xuICBpZiAoaXNQbGFpbk9iamVjdChoYW5kbGVyKSkge1xuICAgIG9wdGlvbnMgPSBoYW5kbGVyO1xuICAgIGhhbmRsZXIgPSBoYW5kbGVyLmhhbmRsZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnc3RyaW5nJykge1xuICAgIGhhbmRsZXIgPSB2bVtoYW5kbGVyXTtcbiAgfVxuICByZXR1cm4gdm0uJHdhdGNoKGV4cE9yRm4sIGhhbmRsZXIsIG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIHN0YXRlTWl4aW4gKFZ1ZSkge1xuICAvLyBmbG93IHNvbWVob3cgaGFzIHByb2JsZW1zIHdpdGggZGlyZWN0bHkgZGVjbGFyZWQgZGVmaW5pdGlvbiBvYmplY3RcbiAgLy8gd2hlbiB1c2luZyBPYmplY3QuZGVmaW5lUHJvcGVydHksIHNvIHdlIGhhdmUgdG8gcHJvY2VkdXJhbGx5IGJ1aWxkIHVwXG4gIC8vIHRoZSBvYmplY3QgaGVyZS5cbiAgdmFyIGRhdGFEZWYgPSB7fTtcbiAgZGF0YURlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kYXRhIH07XG4gIHZhciBwcm9wc0RlZiA9IHt9O1xuICBwcm9wc0RlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9wcm9wcyB9O1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGRhdGFEZWYuc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2FybihcbiAgICAgICAgJ0F2b2lkIHJlcGxhY2luZyBpbnN0YW5jZSByb290ICRkYXRhLiAnICtcbiAgICAgICAgJ1VzZSBuZXN0ZWQgZGF0YSBwcm9wZXJ0aWVzIGluc3RlYWQuJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9O1xuICAgIHByb3BzRGVmLnNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdhcm4oXCIkcHJvcHMgaXMgcmVhZG9ubHkuXCIsIHRoaXMpO1xuICAgIH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZS5wcm90b3R5cGUsICckZGF0YScsIGRhdGFEZWYpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRwcm9wcycsIHByb3BzRGVmKTtcblxuICBWdWUucHJvdG90eXBlLiRzZXQgPSBzZXQ7XG4gIFZ1ZS5wcm90b3R5cGUuJGRlbGV0ZSA9IGRlbDtcblxuICBWdWUucHJvdG90eXBlLiR3YXRjaCA9IGZ1bmN0aW9uIChcbiAgICBleHBPckZuLFxuICAgIGNiLFxuICAgIG9wdGlvbnNcbiAgKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAoaXNQbGFpbk9iamVjdChjYikpIHtcbiAgICAgIHJldHVybiBjcmVhdGVXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucylcbiAgICB9XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy51c2VyID0gdHJ1ZTtcbiAgICB2YXIgd2F0Y2hlciA9IG5ldyBXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMuaW1tZWRpYXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjYi5jYWxsKHZtLCB3YXRjaGVyLnZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVycm9yLCB2bSwgKFwiY2FsbGJhY2sgZm9yIGltbWVkaWF0ZSB3YXRjaGVyIFxcXCJcIiArICh3YXRjaGVyLmV4cHJlc3Npb24pICsgXCJcXFwiXCIpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVud2F0Y2hGbiAoKSB7XG4gICAgICB3YXRjaGVyLnRlYXJkb3duKCk7XG4gICAgfVxuICB9O1xufVxuXG4vKiAgKi9cblxudmFyIHVpZCQzID0gMDtcblxuZnVuY3Rpb24gaW5pdE1peGluIChWdWUpIHtcbiAgVnVlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICAvLyBhIHVpZFxuICAgIHZtLl91aWQgPSB1aWQkMysrO1xuXG4gICAgdmFyIHN0YXJ0VGFnLCBlbmRUYWc7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHtcbiAgICAgIHN0YXJ0VGFnID0gXCJ2dWUtcGVyZi1zdGFydDpcIiArICh2bS5fdWlkKTtcbiAgICAgIGVuZFRhZyA9IFwidnVlLXBlcmYtZW5kOlwiICsgKHZtLl91aWQpO1xuICAgICAgbWFyayhzdGFydFRhZyk7XG4gICAgfVxuXG4gICAgLy8gYSBmbGFnIHRvIGF2b2lkIHRoaXMgYmVpbmcgb2JzZXJ2ZWRcbiAgICB2bS5faXNWdWUgPSB0cnVlO1xuICAgIC8vIG1lcmdlIG9wdGlvbnNcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLl9pc0NvbXBvbmVudCkge1xuICAgICAgLy8gb3B0aW1pemUgaW50ZXJuYWwgY29tcG9uZW50IGluc3RhbnRpYXRpb25cbiAgICAgIC8vIHNpbmNlIGR5bmFtaWMgb3B0aW9ucyBtZXJnaW5nIGlzIHByZXR0eSBzbG93LCBhbmQgbm9uZSBvZiB0aGVcbiAgICAgIC8vIGludGVybmFsIGNvbXBvbmVudCBvcHRpb25zIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50LlxuICAgICAgaW5pdEludGVybmFsQ29tcG9uZW50KHZtLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm0uJG9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoXG4gICAgICAgIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnModm0uY29uc3RydWN0b3IpLFxuICAgICAgICBvcHRpb25zIHx8IHt9LFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaW5pdFByb3h5KHZtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm0uX3JlbmRlclByb3h5ID0gdm07XG4gICAgfVxuICAgIC8vIGV4cG9zZSByZWFsIHNlbGZcbiAgICB2bS5fc2VsZiA9IHZtO1xuICAgIGluaXRMaWZlY3ljbGUodm0pO1xuICAgIGluaXRFdmVudHModm0pO1xuICAgIGluaXRSZW5kZXIodm0pO1xuICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlQ3JlYXRlJyk7XG4gICAgIXZtLl8kZmFsbGJhY2sgJiYgaW5pdEluamVjdGlvbnModm0pOyAvLyByZXNvbHZlIGluamVjdGlvbnMgYmVmb3JlIGRhdGEvcHJvcHMgIFxuICAgIGluaXRTdGF0ZSh2bSk7XG4gICAgIXZtLl8kZmFsbGJhY2sgJiYgaW5pdFByb3ZpZGUodm0pOyAvLyByZXNvbHZlIHByb3ZpZGUgYWZ0ZXIgZGF0YS9wcm9wc1xuICAgICF2bS5fJGZhbGxiYWNrICYmIGNhbGxIb29rKHZtLCAnY3JlYXRlZCcpOyAgICAgIFxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHtcbiAgICAgIHZtLl9uYW1lID0gZm9ybWF0Q29tcG9uZW50TmFtZSh2bSwgZmFsc2UpO1xuICAgICAgbWFyayhlbmRUYWcpO1xuICAgICAgbWVhc3VyZSgoXCJ2dWUgXCIgKyAodm0uX25hbWUpICsgXCIgaW5pdFwiKSwgc3RhcnRUYWcsIGVuZFRhZyk7XG4gICAgfVxuXG4gICAgaWYgKHZtLiRvcHRpb25zLmVsKSB7XG4gICAgICB2bS4kbW91bnQodm0uJG9wdGlvbnMuZWwpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gaW5pdEludGVybmFsQ29tcG9uZW50ICh2bSwgb3B0aW9ucykge1xuICB2YXIgb3B0cyA9IHZtLiRvcHRpb25zID0gT2JqZWN0LmNyZWF0ZSh2bS5jb25zdHJ1Y3Rvci5vcHRpb25zKTtcbiAgLy8gZG9pbmcgdGhpcyBiZWNhdXNlIGl0J3MgZmFzdGVyIHRoYW4gZHluYW1pYyBlbnVtZXJhdGlvbi5cbiAgdmFyIHBhcmVudFZub2RlID0gb3B0aW9ucy5fcGFyZW50Vm5vZGU7XG4gIG9wdHMucGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG4gIG9wdHMuX3BhcmVudFZub2RlID0gcGFyZW50Vm5vZGU7XG5cbiAgdmFyIHZub2RlQ29tcG9uZW50T3B0aW9ucyA9IHBhcmVudFZub2RlLmNvbXBvbmVudE9wdGlvbnM7XG4gIG9wdHMucHJvcHNEYXRhID0gdm5vZGVDb21wb25lbnRPcHRpb25zLnByb3BzRGF0YTtcbiAgb3B0cy5fcGFyZW50TGlzdGVuZXJzID0gdm5vZGVDb21wb25lbnRPcHRpb25zLmxpc3RlbmVycztcbiAgb3B0cy5fcmVuZGVyQ2hpbGRyZW4gPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMuY2hpbGRyZW47XG4gIG9wdHMuX2NvbXBvbmVudFRhZyA9IHZub2RlQ29tcG9uZW50T3B0aW9ucy50YWc7XG5cbiAgaWYgKG9wdGlvbnMucmVuZGVyKSB7XG4gICAgb3B0cy5yZW5kZXIgPSBvcHRpb25zLnJlbmRlcjtcbiAgICBvcHRzLnN0YXRpY1JlbmRlckZucyA9IG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMgKEN0b3IpIHtcbiAgdmFyIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnM7XG4gIGlmIChDdG9yLnN1cGVyKSB7XG4gICAgdmFyIHN1cGVyT3B0aW9ucyA9IHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvci5zdXBlcik7XG4gICAgdmFyIGNhY2hlZFN1cGVyT3B0aW9ucyA9IEN0b3Iuc3VwZXJPcHRpb25zO1xuICAgIGlmIChzdXBlck9wdGlvbnMgIT09IGNhY2hlZFN1cGVyT3B0aW9ucykge1xuICAgICAgLy8gc3VwZXIgb3B0aW9uIGNoYW5nZWQsXG4gICAgICAvLyBuZWVkIHRvIHJlc29sdmUgbmV3IG9wdGlvbnMuXG4gICAgICBDdG9yLnN1cGVyT3B0aW9ucyA9IHN1cGVyT3B0aW9ucztcbiAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgbGF0ZS1tb2RpZmllZC9hdHRhY2hlZCBvcHRpb25zICgjNDk3NilcbiAgICAgIHZhciBtb2RpZmllZE9wdGlvbnMgPSByZXNvbHZlTW9kaWZpZWRPcHRpb25zKEN0b3IpO1xuICAgICAgLy8gdXBkYXRlIGJhc2UgZXh0ZW5kIG9wdGlvbnNcbiAgICAgIGlmIChtb2RpZmllZE9wdGlvbnMpIHtcbiAgICAgICAgZXh0ZW5kKEN0b3IuZXh0ZW5kT3B0aW9ucywgbW9kaWZpZWRPcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoc3VwZXJPcHRpb25zLCBDdG9yLmV4dGVuZE9wdGlvbnMpO1xuICAgICAgaWYgKG9wdGlvbnMubmFtZSkge1xuICAgICAgICBvcHRpb25zLmNvbXBvbmVudHNbb3B0aW9ucy5uYW1lXSA9IEN0b3I7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBvcHRpb25zXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVNb2RpZmllZE9wdGlvbnMgKEN0b3IpIHtcbiAgdmFyIG1vZGlmaWVkO1xuICB2YXIgbGF0ZXN0ID0gQ3Rvci5vcHRpb25zO1xuICB2YXIgc2VhbGVkID0gQ3Rvci5zZWFsZWRPcHRpb25zO1xuICBmb3IgKHZhciBrZXkgaW4gbGF0ZXN0KSB7XG4gICAgaWYgKGxhdGVzdFtrZXldICE9PSBzZWFsZWRba2V5XSkge1xuICAgICAgaWYgKCFtb2RpZmllZCkgeyBtb2RpZmllZCA9IHt9OyB9XG4gICAgICBtb2RpZmllZFtrZXldID0gbGF0ZXN0W2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBtb2RpZmllZFxufVxuXG5mdW5jdGlvbiBWdWUgKG9wdGlvbnMpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAhKHRoaXMgaW5zdGFuY2VvZiBWdWUpXG4gICkge1xuICAgIHdhcm4oJ1Z1ZSBpcyBhIGNvbnN0cnVjdG9yIGFuZCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGBuZXdgIGtleXdvcmQnKTtcbiAgfVxuICB0aGlzLl9pbml0KG9wdGlvbnMpO1xufVxuXG5pbml0TWl4aW4oVnVlKTtcbnN0YXRlTWl4aW4oVnVlKTtcbmV2ZW50c01peGluKFZ1ZSk7XG5saWZlY3ljbGVNaXhpbihWdWUpO1xucmVuZGVyTWl4aW4oVnVlKTtcblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRVc2UgKFZ1ZSkge1xuICBWdWUudXNlID0gZnVuY3Rpb24gKHBsdWdpbikge1xuICAgIHZhciBpbnN0YWxsZWRQbHVnaW5zID0gKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgfHwgKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgPSBbXSkpO1xuICAgIGlmIChpbnN0YWxsZWRQbHVnaW5zLmluZGV4T2YocGx1Z2luKSA+IC0xKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8vIGFkZGl0aW9uYWwgcGFyYW1ldGVyc1xuICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpO1xuICAgIGFyZ3MudW5zaGlmdCh0aGlzKTtcbiAgICBpZiAodHlwZW9mIHBsdWdpbi5pbnN0YWxsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwbHVnaW4uaW5zdGFsbC5hcHBseShwbHVnaW4sIGFyZ3MpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBsdWdpbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGx1Z2luLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH1cbiAgICBpbnN0YWxsZWRQbHVnaW5zLnB1c2gocGx1Z2luKTtcbiAgICByZXR1cm4gdGhpc1xuICB9O1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdE1peGluJDEgKFZ1ZSkge1xuICBWdWUubWl4aW4gPSBmdW5jdGlvbiAobWl4aW4pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLCBtaXhpbik7XG4gICAgcmV0dXJuIHRoaXNcbiAgfTtcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRFeHRlbmQgKFZ1ZSkge1xuICAvKipcbiAgICogRWFjaCBpbnN0YW5jZSBjb25zdHJ1Y3RvciwgaW5jbHVkaW5nIFZ1ZSwgaGFzIGEgdW5pcXVlXG4gICAqIGNpZC4gVGhpcyBlbmFibGVzIHVzIHRvIGNyZWF0ZSB3cmFwcGVkIFwiY2hpbGRcbiAgICogY29uc3RydWN0b3JzXCIgZm9yIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UgYW5kIGNhY2hlIHRoZW0uXG4gICAqL1xuICBWdWUuY2lkID0gMDtcbiAgdmFyIGNpZCA9IDE7XG5cbiAgLyoqXG4gICAqIENsYXNzIGluaGVyaXRhbmNlXG4gICAqL1xuICBWdWUuZXh0ZW5kID0gZnVuY3Rpb24gKGV4dGVuZE9wdGlvbnMpIHtcbiAgICBleHRlbmRPcHRpb25zID0gZXh0ZW5kT3B0aW9ucyB8fCB7fTtcbiAgICB2YXIgU3VwZXIgPSB0aGlzO1xuICAgIHZhciBTdXBlcklkID0gU3VwZXIuY2lkO1xuICAgIHZhciBjYWNoZWRDdG9ycyA9IGV4dGVuZE9wdGlvbnMuX0N0b3IgfHwgKGV4dGVuZE9wdGlvbnMuX0N0b3IgPSB7fSk7XG4gICAgaWYgKGNhY2hlZEN0b3JzW1N1cGVySWRdKSB7XG4gICAgICByZXR1cm4gY2FjaGVkQ3RvcnNbU3VwZXJJZF1cbiAgICB9XG5cbiAgICB2YXIgbmFtZSA9IGV4dGVuZE9wdGlvbnMubmFtZSB8fCBTdXBlci5vcHRpb25zLm5hbWU7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSkge1xuICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKG5hbWUpO1xuICAgIH1cblxuICAgIHZhciBTdWIgPSBmdW5jdGlvbiBWdWVDb21wb25lbnQgKG9wdGlvbnMpIHtcbiAgICAgIHRoaXMuX2luaXQob3B0aW9ucyk7XG4gICAgfTtcbiAgICBTdWIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdXBlci5wcm90b3R5cGUpO1xuICAgIFN1Yi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTdWI7XG4gICAgU3ViLmNpZCA9IGNpZCsrO1xuICAgIFN1Yi5vcHRpb25zID0gbWVyZ2VPcHRpb25zKFxuICAgICAgU3VwZXIub3B0aW9ucyxcbiAgICAgIGV4dGVuZE9wdGlvbnNcbiAgICApO1xuICAgIFN1Ylsnc3VwZXInXSA9IFN1cGVyO1xuXG4gICAgLy8gRm9yIHByb3BzIGFuZCBjb21wdXRlZCBwcm9wZXJ0aWVzLCB3ZSBkZWZpbmUgdGhlIHByb3h5IGdldHRlcnMgb25cbiAgICAvLyB0aGUgVnVlIGluc3RhbmNlcyBhdCBleHRlbnNpb24gdGltZSwgb24gdGhlIGV4dGVuZGVkIHByb3RvdHlwZS4gVGhpc1xuICAgIC8vIGF2b2lkcyBPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbHMgZm9yIGVhY2ggaW5zdGFuY2UgY3JlYXRlZC5cbiAgICBpZiAoU3ViLm9wdGlvbnMucHJvcHMpIHtcbiAgICAgIGluaXRQcm9wcyQxKFN1Yik7XG4gICAgfVxuICAgIGlmIChTdWIub3B0aW9ucy5jb21wdXRlZCkge1xuICAgICAgaW5pdENvbXB1dGVkJDEoU3ViKTtcbiAgICB9XG5cbiAgICAvLyBhbGxvdyBmdXJ0aGVyIGV4dGVuc2lvbi9taXhpbi9wbHVnaW4gdXNhZ2VcbiAgICBTdWIuZXh0ZW5kID0gU3VwZXIuZXh0ZW5kO1xuICAgIFN1Yi5taXhpbiA9IFN1cGVyLm1peGluO1xuICAgIFN1Yi51c2UgPSBTdXBlci51c2U7XG5cbiAgICAvLyBjcmVhdGUgYXNzZXQgcmVnaXN0ZXJzLCBzbyBleHRlbmRlZCBjbGFzc2VzXG4gICAgLy8gY2FuIGhhdmUgdGhlaXIgcHJpdmF0ZSBhc3NldHMgdG9vLlxuICAgIEFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgIFN1Ylt0eXBlXSA9IFN1cGVyW3R5cGVdO1xuICAgIH0pO1xuICAgIC8vIGVuYWJsZSByZWN1cnNpdmUgc2VsZi1sb29rdXBcbiAgICBpZiAobmFtZSkge1xuICAgICAgU3ViLm9wdGlvbnMuY29tcG9uZW50c1tuYW1lXSA9IFN1YjtcbiAgICB9XG5cbiAgICAvLyBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBzdXBlciBvcHRpb25zIGF0IGV4dGVuc2lvbiB0aW1lLlxuICAgIC8vIGxhdGVyIGF0IGluc3RhbnRpYXRpb24gd2UgY2FuIGNoZWNrIGlmIFN1cGVyJ3Mgb3B0aW9ucyBoYXZlXG4gICAgLy8gYmVlbiB1cGRhdGVkLlxuICAgIFN1Yi5zdXBlck9wdGlvbnMgPSBTdXBlci5vcHRpb25zO1xuICAgIFN1Yi5leHRlbmRPcHRpb25zID0gZXh0ZW5kT3B0aW9ucztcbiAgICBTdWIuc2VhbGVkT3B0aW9ucyA9IGV4dGVuZCh7fSwgU3ViLm9wdGlvbnMpO1xuXG4gICAgLy8gY2FjaGUgY29uc3RydWN0b3JcbiAgICBjYWNoZWRDdG9yc1tTdXBlcklkXSA9IFN1YjtcbiAgICByZXR1cm4gU3ViXG4gIH07XG59XG5cbmZ1bmN0aW9uIGluaXRQcm9wcyQxIChDb21wKSB7XG4gIHZhciBwcm9wcyA9IENvbXAub3B0aW9ucy5wcm9wcztcbiAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgcHJveHkoQ29tcC5wcm90b3R5cGUsIFwiX3Byb3BzXCIsIGtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdENvbXB1dGVkJDEgKENvbXApIHtcbiAgdmFyIGNvbXB1dGVkID0gQ29tcC5vcHRpb25zLmNvbXB1dGVkO1xuICBmb3IgKHZhciBrZXkgaW4gY29tcHV0ZWQpIHtcbiAgICBkZWZpbmVDb21wdXRlZChDb21wLnByb3RvdHlwZSwga2V5LCBjb21wdXRlZFtrZXldKTtcbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdEFzc2V0UmVnaXN0ZXJzIChWdWUpIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhc3NldCByZWdpc3RyYXRpb24gbWV0aG9kcy5cbiAgICovXG4gIEFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICBWdWVbdHlwZV0gPSBmdW5jdGlvbiAoXG4gICAgICBpZCxcbiAgICAgIGRlZmluaXRpb25cbiAgICApIHtcbiAgICAgIGlmICghZGVmaW5pdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zW3R5cGUgKyAncyddW2lkXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGUgPT09ICdjb21wb25lbnQnKSB7XG4gICAgICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gJ2NvbXBvbmVudCcgJiYgaXNQbGFpbk9iamVjdChkZWZpbml0aW9uKSkge1xuICAgICAgICAgIGRlZmluaXRpb24ubmFtZSA9IGRlZmluaXRpb24ubmFtZSB8fCBpZDtcbiAgICAgICAgICBkZWZpbml0aW9uID0gdGhpcy5vcHRpb25zLl9iYXNlLmV4dGVuZChkZWZpbml0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gJ2RpcmVjdGl2ZScgJiYgdHlwZW9mIGRlZmluaXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBkZWZpbml0aW9uID0geyBiaW5kOiBkZWZpbml0aW9uLCB1cGRhdGU6IGRlZmluaXRpb24gfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdID0gZGVmaW5pdGlvbjtcbiAgICAgICAgcmV0dXJuIGRlZmluaXRpb25cbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbn1cblxuLyogICovXG5cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lIChvcHRzKSB7XG4gIHJldHVybiBvcHRzICYmIChvcHRzLkN0b3Iub3B0aW9ucy5uYW1lIHx8IG9wdHMudGFnKVxufVxuXG5mdW5jdGlvbiBtYXRjaGVzIChwYXR0ZXJuLCBuYW1lKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uaW5kZXhPZihuYW1lKSA+IC0xXG4gIH0gZWxzZSBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uc3BsaXQoJywnKS5pbmRleE9mKG5hbWUpID4gLTFcbiAgfSBlbHNlIGlmIChpc1JlZ0V4cChwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLnRlc3QobmFtZSlcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gZmFsc2Vcbn1cblxuZnVuY3Rpb24gcHJ1bmVDYWNoZSAoa2VlcEFsaXZlSW5zdGFuY2UsIGZpbHRlcikge1xuICB2YXIgY2FjaGUgPSBrZWVwQWxpdmVJbnN0YW5jZS5jYWNoZTtcbiAgdmFyIGtleXMgPSBrZWVwQWxpdmVJbnN0YW5jZS5rZXlzO1xuICB2YXIgX3Zub2RlID0ga2VlcEFsaXZlSW5zdGFuY2UuX3Zub2RlO1xuICBmb3IgKHZhciBrZXkgaW4gY2FjaGUpIHtcbiAgICB2YXIgY2FjaGVkTm9kZSA9IGNhY2hlW2tleV07XG4gICAgaWYgKGNhY2hlZE5vZGUpIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjYWNoZWROb2RlLmNvbXBvbmVudE9wdGlvbnMpO1xuICAgICAgaWYgKG5hbWUgJiYgIWZpbHRlcihuYW1lKSkge1xuICAgICAgICBwcnVuZUNhY2hlRW50cnkoY2FjaGUsIGtleSwga2V5cywgX3Zub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJ1bmVDYWNoZUVudHJ5IChcbiAgY2FjaGUsXG4gIGtleSxcbiAga2V5cyxcbiAgY3VycmVudFxuKSB7XG4gIHZhciBjYWNoZWQkJDEgPSBjYWNoZVtrZXldO1xuICBpZiAoY2FjaGVkJCQxICYmICghY3VycmVudCB8fCBjYWNoZWQkJDEudGFnICE9PSBjdXJyZW50LnRhZykpIHtcbiAgICBjYWNoZWQkJDEuY29tcG9uZW50SW5zdGFuY2UuJGRlc3Ryb3koKTtcbiAgfVxuICBjYWNoZVtrZXldID0gbnVsbDtcbiAgcmVtb3ZlKGtleXMsIGtleSk7XG59XG5cbnZhciBwYXR0ZXJuVHlwZXMgPSBbU3RyaW5nLCBSZWdFeHAsIEFycmF5XTtcblxudmFyIEtlZXBBbGl2ZSA9IHtcbiAgbmFtZTogJ2tlZXAtYWxpdmUnLFxuICBhYnN0cmFjdDogdHJ1ZSxcblxuICBwcm9wczoge1xuICAgIGluY2x1ZGU6IHBhdHRlcm5UeXBlcyxcbiAgICBleGNsdWRlOiBwYXR0ZXJuVHlwZXMsXG4gICAgbWF4OiBbU3RyaW5nLCBOdW1iZXJdXG4gIH0sXG5cbiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCAoKSB7XG4gICAgdGhpcy5jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5rZXlzID0gW107XG4gIH0sXG5cbiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQgKCkge1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmNhY2hlKSB7XG4gICAgICBwcnVuZUNhY2hlRW50cnkodGhpcy5jYWNoZSwga2V5LCB0aGlzLmtleXMpO1xuICAgIH1cbiAgfSxcblxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHRoaXMuJHdhdGNoKCdpbmNsdWRlJywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcHJ1bmVDYWNoZSh0aGlzJDEsIGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBtYXRjaGVzKHZhbCwgbmFtZSk7IH0pO1xuICAgIH0pO1xuICAgIHRoaXMuJHdhdGNoKCdleGNsdWRlJywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcHJ1bmVDYWNoZSh0aGlzJDEsIGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiAhbWF0Y2hlcyh2YWwsIG5hbWUpOyB9KTtcbiAgICB9KTtcbiAgfSxcblxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoKSB7XG4gICAgdmFyIHNsb3QgPSB0aGlzLiRzbG90cy5kZWZhdWx0O1xuICAgIHZhciB2bm9kZSA9IGdldEZpcnN0Q29tcG9uZW50Q2hpbGQoc2xvdCk7XG4gICAgdmFyIGNvbXBvbmVudE9wdGlvbnMgPSB2bm9kZSAmJiB2bm9kZS5jb21wb25lbnRPcHRpb25zO1xuICAgIGlmIChjb21wb25lbnRPcHRpb25zKSB7XG4gICAgICAvLyBjaGVjayBwYXR0ZXJuXG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoY29tcG9uZW50T3B0aW9ucyk7XG4gICAgICB2YXIgcmVmID0gdGhpcztcbiAgICAgIHZhciBpbmNsdWRlID0gcmVmLmluY2x1ZGU7XG4gICAgICB2YXIgZXhjbHVkZSA9IHJlZi5leGNsdWRlO1xuICAgICAgaWYgKFxuICAgICAgICAvLyBub3QgaW5jbHVkZWRcbiAgICAgICAgKGluY2x1ZGUgJiYgKCFuYW1lIHx8ICFtYXRjaGVzKGluY2x1ZGUsIG5hbWUpKSkgfHxcbiAgICAgICAgLy8gZXhjbHVkZWRcbiAgICAgICAgKGV4Y2x1ZGUgJiYgbmFtZSAmJiBtYXRjaGVzKGV4Y2x1ZGUsIG5hbWUpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB2bm9kZVxuICAgICAgfVxuXG4gICAgICB2YXIgcmVmJDEgPSB0aGlzO1xuICAgICAgdmFyIGNhY2hlID0gcmVmJDEuY2FjaGU7XG4gICAgICB2YXIga2V5cyA9IHJlZiQxLmtleXM7XG4gICAgICB2YXIga2V5ID0gdm5vZGUua2V5ID09IG51bGxcbiAgICAgICAgLy8gc2FtZSBjb25zdHJ1Y3RvciBtYXkgZ2V0IHJlZ2lzdGVyZWQgYXMgZGlmZmVyZW50IGxvY2FsIGNvbXBvbmVudHNcbiAgICAgICAgLy8gc28gY2lkIGFsb25lIGlzIG5vdCBlbm91Z2ggKCMzMjY5KVxuICAgICAgICA/IGNvbXBvbmVudE9wdGlvbnMuQ3Rvci5jaWQgKyAoY29tcG9uZW50T3B0aW9ucy50YWcgPyAoXCI6OlwiICsgKGNvbXBvbmVudE9wdGlvbnMudGFnKSkgOiAnJylcbiAgICAgICAgOiB2bm9kZS5rZXk7XG4gICAgICBpZiAoY2FjaGVba2V5XSkge1xuICAgICAgICB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IGNhY2hlW2tleV0uY29tcG9uZW50SW5zdGFuY2U7XG4gICAgICAgIC8vIG1ha2UgY3VycmVudCBrZXkgZnJlc2hlc3RcbiAgICAgICAgcmVtb3ZlKGtleXMsIGtleSk7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FjaGVba2V5XSA9IHZub2RlO1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgLy8gcHJ1bmUgb2xkZXN0IGVudHJ5XG4gICAgICAgIGlmICh0aGlzLm1heCAmJiBrZXlzLmxlbmd0aCA+IHBhcnNlSW50KHRoaXMubWF4KSkge1xuICAgICAgICAgIHBydW5lQ2FjaGVFbnRyeShjYWNoZSwga2V5c1swXSwga2V5cywgdGhpcy5fdm5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZub2RlLmRhdGEua2VlcEFsaXZlID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZub2RlIHx8IChzbG90ICYmIHNsb3RbMF0pXG4gIH1cbn07XG5cbnZhciBidWlsdEluQ29tcG9uZW50cyA9IHtcbiAgS2VlcEFsaXZlOiBLZWVwQWxpdmVcbn07XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0R2xvYmFsQVBJIChWdWUpIHtcbiAgLy8gY29uZmlnXG4gIHZhciBjb25maWdEZWYgPSB7fTtcbiAgY29uZmlnRGVmLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbmZpZzsgfTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25maWdEZWYuc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2FybihcbiAgICAgICAgJ0RvIG5vdCByZXBsYWNlIHRoZSBWdWUuY29uZmlnIG9iamVjdCwgc2V0IGluZGl2aWR1YWwgZmllbGRzIGluc3RlYWQuJ1xuICAgICAgKTtcbiAgICB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUsICdjb25maWcnLCBjb25maWdEZWYpO1xuXG4gIC8vIGV4cG9zZWQgdXRpbCBtZXRob2RzLlxuICAvLyBOT1RFOiB0aGVzZSBhcmUgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgcHVibGljIEFQSSAtIGF2b2lkIHJlbHlpbmcgb25cbiAgLy8gdGhlbSB1bmxlc3MgeW91IGFyZSBhd2FyZSBvZiB0aGUgcmlzay5cbiAgVnVlLnV0aWwgPSB7XG4gICAgd2Fybjogd2FybixcbiAgICBleHRlbmQ6IGV4dGVuZCxcbiAgICBtZXJnZU9wdGlvbnM6IG1lcmdlT3B0aW9ucyxcbiAgICBkZWZpbmVSZWFjdGl2ZTogZGVmaW5lUmVhY3RpdmUkJDFcbiAgfTtcblxuICBWdWUuc2V0ID0gc2V0O1xuICBWdWUuZGVsZXRlID0gZGVsO1xuICBWdWUubmV4dFRpY2sgPSBuZXh0VGljaztcblxuICAvLyAyLjYgZXhwbGljaXQgb2JzZXJ2YWJsZSBBUElcbiAgVnVlLm9ic2VydmFibGUgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgb2JzZXJ2ZShvYmopO1xuICAgIHJldHVybiBvYmpcbiAgfTtcblxuICBWdWUub3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIEFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICBWdWUub3B0aW9uc1t0eXBlICsgJ3MnXSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH0pO1xuXG4gIC8vIHRoaXMgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgXCJiYXNlXCIgY29uc3RydWN0b3IgdG8gZXh0ZW5kIGFsbCBwbGFpbi1vYmplY3RcbiAgLy8gY29tcG9uZW50cyB3aXRoIGluIFdlZXgncyBtdWx0aS1pbnN0YW5jZSBzY2VuYXJpb3MuXG4gIFZ1ZS5vcHRpb25zLl9iYXNlID0gVnVlO1xuXG4gIGV4dGVuZChWdWUub3B0aW9ucy5jb21wb25lbnRzLCBidWlsdEluQ29tcG9uZW50cyk7XG5cbiAgaW5pdFVzZShWdWUpO1xuICBpbml0TWl4aW4kMShWdWUpO1xuICBpbml0RXh0ZW5kKFZ1ZSk7XG4gIGluaXRBc3NldFJlZ2lzdGVycyhWdWUpO1xufVxuXG5pbml0R2xvYmFsQVBJKFZ1ZSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGlzU2VydmVyJywge1xuICBnZXQ6IGlzU2VydmVyUmVuZGVyaW5nXG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZS5wcm90b3R5cGUsICckc3NyQ29udGV4dCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiBnZXQgKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHRoaXMuJHZub2RlICYmIHRoaXMuJHZub2RlLnNzckNvbnRleHRcbiAgfVxufSk7XG5cbi8vIGV4cG9zZSBGdW5jdGlvbmFsUmVuZGVyQ29udGV4dCBmb3Igc3NyIHJ1bnRpbWUgaGVscGVyIGluc3RhbGxhdGlvblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZSwgJ0Z1bmN0aW9uYWxSZW5kZXJDb250ZXh0Jywge1xuICB2YWx1ZTogRnVuY3Rpb25hbFJlbmRlckNvbnRleHRcbn0pO1xuXG5WdWUudmVyc2lvbiA9ICcyLjYuMTEnO1xuXG4vKipcbiAqIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9UZW5jZW50L3dlc3RvcmUvbWFzdGVyL3BhY2thZ2VzL3dlc3RvcmUvdXRpbHMvZGlmZi5qc1xuICovXG52YXIgQVJSQVlUWVBFID0gJ1tvYmplY3QgQXJyYXldJztcbnZhciBPQkpFQ1RUWVBFID0gJ1tvYmplY3QgT2JqZWN0XSc7XG52YXIgTlVMTFRZUEUgPSAnW29iamVjdCBOdWxsXSc7XG52YXIgVU5ERUZJTkVEVFlQRSA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nO1xuLy8gY29uc3QgRlVOQ1RJT05UWVBFID0gJ1tvYmplY3QgRnVuY3Rpb25dJ1xuXG5mdW5jdGlvbiBkaWZmKGN1cnJlbnQsIHByZSkge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBzeW5jS2V5cyhjdXJyZW50LCBwcmUpO1xuICAgIF9kaWZmKGN1cnJlbnQsIHByZSwgJycsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBzeW5jS2V5cyhjdXJyZW50LCBwcmUpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gcHJlKSB7IHJldHVybiB9XG4gICAgdmFyIHJvb3RDdXJyZW50VHlwZSA9IHR5cGUoY3VycmVudCk7XG4gICAgdmFyIHJvb3RQcmVUeXBlID0gdHlwZShwcmUpO1xuICAgIGlmIChyb290Q3VycmVudFR5cGUgPT0gT0JKRUNUVFlQRSAmJiByb290UHJlVHlwZSA9PSBPQkpFQ1RUWVBFKSB7XG4gICAgICAgIGlmKE9iamVjdC5rZXlzKGN1cnJlbnQpLmxlbmd0aCA+PSBPYmplY3Qua2V5cyhwcmUpLmxlbmd0aCl7XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gcHJlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFtrZXldID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzeW5jS2V5cyhjdXJyZW50VmFsdWUsIHByZVtrZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJvb3RDdXJyZW50VHlwZSA9PSBBUlJBWVRZUEUgJiYgcm9vdFByZVR5cGUgPT0gQVJSQVlUWVBFKSB7XG4gICAgICAgIGlmIChjdXJyZW50Lmxlbmd0aCA+PSBwcmUubGVuZ3RoKSB7XG4gICAgICAgICAgICBwcmUuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBzeW5jS2V5cyhjdXJyZW50W2luZGV4XSwgaXRlbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gbnVsbE9yVW5kZWZpbmVkKGN1cnJlbnRUeXBlLCBwcmVUeXBlKSB7XG4gICAgaWYoXG4gICAgICAgIChjdXJyZW50VHlwZSA9PT0gTlVMTFRZUEUgfHwgY3VycmVudFR5cGUgPT09IFVOREVGSU5FRFRZUEUpICYmIFxuICAgICAgICAocHJlVHlwZSA9PT0gTlVMTFRZUEUgfHwgcHJlVHlwZSA9PT0gVU5ERUZJTkVEVFlQRSlcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIF9kaWZmKGN1cnJlbnQsIHByZSwgcGF0aCwgcmVzdWx0KSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IHByZSkgeyByZXR1cm4gfVxuICAgIHZhciByb290Q3VycmVudFR5cGUgPSB0eXBlKGN1cnJlbnQpO1xuICAgIHZhciByb290UHJlVHlwZSA9IHR5cGUocHJlKTtcbiAgICBpZiAocm9vdEN1cnJlbnRUeXBlID09IE9CSkVDVFRZUEUpIHtcbiAgICAgICAgaWYgKHJvb3RQcmVUeXBlICE9IE9CSkVDVFRZUEUgfHwgT2JqZWN0LmtleXMoY3VycmVudCkubGVuZ3RoIDwgT2JqZWN0LmtleXMocHJlKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNldFJlc3VsdChyZXN1bHQsIHBhdGgsIGN1cnJlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGxvb3AgPSBmdW5jdGlvbiAoIGtleSApIHtcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gY3VycmVudFtrZXldO1xuICAgICAgICAgICAgICAgIHZhciBwcmVWYWx1ZSA9IHByZVtrZXldO1xuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VHlwZSA9IHR5cGUoY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgICAgICB2YXIgcHJlVHlwZSA9IHR5cGUocHJlVmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VHlwZSAhPSBBUlJBWVRZUEUgJiYgY3VycmVudFR5cGUgIT0gT0JKRUNUVFlQRSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9PSBwcmVba2V5XSAmJiBudWxsT3JVbmRlZmluZWQoY3VycmVudFR5cGUsIHByZVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRSZXN1bHQocmVzdWx0LCAocGF0aCA9PSAnJyA/ICcnIDogcGF0aCArIFwiLlwiKSArIGtleSwgY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFR5cGUgPT0gQVJSQVlUWVBFKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmVUeXBlICE9IEFSUkFZVFlQRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0KHJlc3VsdCwgKHBhdGggPT0gJycgPyAnJyA6IHBhdGggKyBcIi5cIikgKyBrZXksIGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlLmxlbmd0aCA8IHByZVZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlc3VsdChyZXN1bHQsIChwYXRoID09ICcnID8gJycgOiBwYXRoICsgXCIuXCIpICsga2V5LCBjdXJyZW50VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RpZmYoaXRlbSwgcHJlVmFsdWVbaW5kZXhdLCAocGF0aCA9PSAnJyA/ICcnIDogcGF0aCArIFwiLlwiKSArIGtleSArICdbJyArIGluZGV4ICsgJ10nLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VHlwZSA9PSBPQkpFQ1RUWVBFKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmVUeXBlICE9IE9CSkVDVFRZUEUgfHwgT2JqZWN0LmtleXMoY3VycmVudFZhbHVlKS5sZW5ndGggPCBPYmplY3Qua2V5cyhwcmVWYWx1ZSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRSZXN1bHQocmVzdWx0LCAocGF0aCA9PSAnJyA/ICcnIDogcGF0aCArIFwiLlwiKSArIGtleSwgY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHN1YktleSBpbiBjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGlmZihjdXJyZW50VmFsdWVbc3ViS2V5XSwgcHJlVmFsdWVbc3ViS2V5XSwgKHBhdGggPT0gJycgPyAnJyA6IHBhdGggKyBcIi5cIikgKyBrZXkgKyAnLicgKyBzdWJLZXksIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gY3VycmVudCkgbG9vcCgga2V5ICk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJvb3RDdXJyZW50VHlwZSA9PSBBUlJBWVRZUEUpIHtcbiAgICAgICAgaWYgKHJvb3RQcmVUeXBlICE9IEFSUkFZVFlQRSkge1xuICAgICAgICAgICAgc2V0UmVzdWx0KHJlc3VsdCwgcGF0aCwgY3VycmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudC5sZW5ndGggPCBwcmUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2V0UmVzdWx0KHJlc3VsdCwgcGF0aCwgY3VycmVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgX2RpZmYoaXRlbSwgcHJlW2luZGV4XSwgcGF0aCArICdbJyArIGluZGV4ICsgJ10nLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2V0UmVzdWx0KHJlc3VsdCwgcGF0aCwgY3VycmVudCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzZXRSZXN1bHQocmVzdWx0LCBrLCB2KSB7XG4gICAgLy8gaWYgKHR5cGUodikgIT0gRlVOQ1RJT05UWVBFKSB7XG4gICAgICAgIHJlc3VsdFtrXSA9IHY7XG4gICAgLy8gfVxufVxuXG5mdW5jdGlvbiB0eXBlKG9iaikge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gZmx1c2hDYWxsYmFja3MkMSh2bSkge1xuICAgIGlmICh2bS5fX25leHRfdGlja19jYWxsYmFja3MgJiYgdm0uX19uZXh0X3RpY2tfY2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuVlVFX0FQUF9ERUJVRykge1xuICAgICAgICAgICAgdmFyIG1wSW5zdGFuY2UgPSB2bS4kc2NvcGU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnWycgKyAoK25ldyBEYXRlKSArICddWycgKyAobXBJbnN0YW5jZS5pcyB8fCBtcEluc3RhbmNlLnJvdXRlKSArICddWycgKyB2bS5fdWlkICtcbiAgICAgICAgICAgICAgICAnXTpmbHVzaENhbGxiYWNrc1snICsgdm0uX19uZXh0X3RpY2tfY2FsbGJhY2tzLmxlbmd0aCArICddJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvcGllcyA9IHZtLl9fbmV4dF90aWNrX2NhbGxiYWNrcy5zbGljZSgwKTtcbiAgICAgICAgdm0uX19uZXh0X3RpY2tfY2FsbGJhY2tzLmxlbmd0aCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29waWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb3BpZXNbaV0oKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFzUmVuZGVyV2F0Y2hlcih2bSkge1xuICAgIHJldHVybiBxdWV1ZS5maW5kKGZ1bmN0aW9uICh3YXRjaGVyKSB7IHJldHVybiB2bS5fd2F0Y2hlciA9PT0gd2F0Y2hlcjsgfSlcbn1cblxuZnVuY3Rpb24gbmV4dFRpY2skMSh2bSwgY2IpIHtcbiAgICAvLzEubmV4dFRpY2sg5LmL5YmNIOW3siBzZXREYXRhIOS4lCBzZXREYXRhIOi/mOacquWbnuiwg+WujOaIkFxuICAgIC8vMi5uZXh0VGljayDkuYvliY3lrZjlnKggcmVuZGVyIHdhdGNoZXJcbiAgICBpZiAoIXZtLl9fbmV4dF90aWNrX3BlbmRpbmcgJiYgIWhhc1JlbmRlcldhdGNoZXIodm0pKSB7XG4gICAgICAgIGlmKHByb2Nlc3MuZW52LlZVRV9BUFBfREVCVUcpe1xuICAgICAgICAgICAgdmFyIG1wSW5zdGFuY2UgPSB2bS4kc2NvcGU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnWycgKyAoK25ldyBEYXRlKSArICddWycgKyAobXBJbnN0YW5jZS5pcyB8fCBtcEluc3RhbmNlLnJvdXRlKSArICddWycgKyB2bS5fdWlkICtcbiAgICAgICAgICAgICAgICAnXTpuZXh0VnVlVGljaycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0VGljayhjYiwgdm0pXG4gICAgfWVsc2V7XG4gICAgICAgIGlmKHByb2Nlc3MuZW52LlZVRV9BUFBfREVCVUcpe1xuICAgICAgICAgICAgdmFyIG1wSW5zdGFuY2UkMSA9IHZtLiRzY29wZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbJyArICgrbmV3IERhdGUpICsgJ11bJyArIChtcEluc3RhbmNlJDEuaXMgfHwgbXBJbnN0YW5jZSQxLnJvdXRlKSArICddWycgKyB2bS5fdWlkICtcbiAgICAgICAgICAgICAgICAnXTpuZXh0TVBUaWNrJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIF9yZXNvbHZlO1xuICAgIGlmICghdm0uX19uZXh0X3RpY2tfY2FsbGJhY2tzKSB7XG4gICAgICAgIHZtLl9fbmV4dF90aWNrX2NhbGxiYWNrcyA9IFtdO1xuICAgIH1cbiAgICB2bS5fX25leHRfdGlja19jYWxsYmFja3MucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChjYikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjYi5jYWxsKHZtKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihlLCB2bSwgJ25leHRUaWNrJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoX3Jlc29sdmUpIHtcbiAgICAgICAgICAgIF9yZXNvbHZlKHZtKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgIGlmICghY2IgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB9KVxuICAgIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGNsZWFySW5zdGFuY2Uoa2V5LCB2YWx1ZSkge1xuICAvLyDnroDmmJPljrvpmaQgVnVlIOWSjOWwj+eoi+W6j+e7hOS7tuWunuS+i1xuICBpZiAodmFsdWUpIHtcbiAgICBpZiAodmFsdWUuX2lzVnVlIHx8IHZhbHVlLl9fdl9pc01QQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbmZ1bmN0aW9uIGNsb25lV2l0aERhdGEodm0pIHtcbiAgLy8g56Gu5L+d5b2T5YmNIHZtIOaJgOacieaVsOaNruiiq+WQjOatpVxuICB2YXIgcmV0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdmFyIGRhdGFLZXlzID0gW10uY29uY2F0KFxuICAgIE9iamVjdC5rZXlzKHZtLl9kYXRhIHx8IHt9KSxcbiAgICBPYmplY3Qua2V5cyh2bS5fY29tcHV0ZWRXYXRjaGVycyB8fCB7fSkpO1xuXG4gIGRhdGFLZXlzLnJlZHVjZShmdW5jdGlvbihyZXQsIGtleSkge1xuICAgIHJldFtrZXldID0gdm1ba2V5XTtcbiAgICByZXR1cm4gcmV0XG4gIH0sIHJldCk7XG5cbiAgLy8gdnVlLWNvbXBvc2l0aW9uLWFwaVxuICB2YXIgY29tcG9zaXRpb25BcGlTdGF0ZSA9IHZtLl9fY29tcG9zaXRpb25fYXBpX3N0YXRlX18gfHwgdm0uX19zZWNyZXRfdmZhX3N0YXRlX187XG4gIHZhciByYXdCaW5kaW5ncyA9IGNvbXBvc2l0aW9uQXBpU3RhdGUgJiYgY29tcG9zaXRpb25BcGlTdGF0ZS5yYXdCaW5kaW5ncztcbiAgaWYgKHJhd0JpbmRpbmdzKSB7XG4gICAgT2JqZWN0LmtleXMocmF3QmluZGluZ3MpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0W2tleV0gPSB2bVtrZXldO1xuICAgIH0pO1xuICB9XG5cbiAgLy9UT0RPIOmcgOimgeaKiuaXoOeUqOaVsOaNruWkhOeQhuaOie+8jOavlOWmgiBsaXN0PT5sMCDliJkgbGlzdCDpnIDopoHnp7vpmaTvvIzlkKbliJnlpJrkvKDovpPkuIDku73mlbDmja5cbiAgT2JqZWN0LmFzc2lnbihyZXQsIHZtLiRtcC5kYXRhIHx8IHt9KTtcbiAgaWYgKFxuICAgIEFycmF5LmlzQXJyYXkodm0uJG9wdGlvbnMuYmVoYXZpb3JzKSAmJlxuICAgIHZtLiRvcHRpb25zLmJlaGF2aW9ycy5pbmRleE9mKCd1bmk6Ly9mb3JtLWZpZWxkJykgIT09IC0xXG4gICkgeyAvL2Zvcm0tZmllbGRcbiAgICByZXRbJ25hbWUnXSA9IHZtLm5hbWU7XG4gICAgcmV0Wyd2YWx1ZSddID0gdm0udmFsdWU7XG4gIH1cblxuICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXQsIGNsZWFySW5zdGFuY2UpKVxufVxuXG52YXIgcGF0Y2ggPSBmdW5jdGlvbihvbGRWbm9kZSwgdm5vZGUpIHtcbiAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgaWYgKHZub2RlID09PSBudWxsKSB7IC8vZGVzdHJveVxuICAgIHJldHVyblxuICB9XG4gIGlmICh0aGlzLm1wVHlwZSA9PT0gJ3BhZ2UnIHx8IHRoaXMubXBUeXBlID09PSAnY29tcG9uZW50Jykge1xuICAgIHZhciBtcEluc3RhbmNlID0gdGhpcy4kc2NvcGU7XG4gICAgdmFyIGRhdGEgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRyeSB7XG4gICAgICBkYXRhID0gY2xvbmVXaXRoRGF0YSh0aGlzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9XG4gICAgZGF0YS5fX3dlYnZpZXdJZF9fID0gbXBJbnN0YW5jZS5kYXRhLl9fd2Vidmlld0lkX187XG4gICAgdmFyIG1wRGF0YSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgT2JqZWN0LmtleXMoZGF0YSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IC8v5LuF5ZCM5q2lIGRhdGEg5Lit5pyJ55qE5pWw5o2uXG4gICAgICBtcERhdGFba2V5XSA9IG1wSW5zdGFuY2UuZGF0YVtrZXldO1xuICAgIH0pO1xuICAgIHZhciBkaWZmRGF0YSA9IHRoaXMuJHNob3VsZERpZmZEYXRhID09PSBmYWxzZSA/IGRhdGEgOiBkaWZmKGRhdGEsIG1wRGF0YSk7XG4gICAgaWYgKE9iamVjdC5rZXlzKGRpZmZEYXRhKS5sZW5ndGgpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5WVUVfQVBQX0RFQlVHKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbJyArICgrbmV3IERhdGUpICsgJ11bJyArIChtcEluc3RhbmNlLmlzIHx8IG1wSW5zdGFuY2Uucm91dGUpICsgJ11bJyArIHRoaXMuX3VpZCArXG4gICAgICAgICAgJ13lt67ph4/mm7TmlrAnLFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGRpZmZEYXRhKSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9fbmV4dF90aWNrX3BlbmRpbmcgPSB0cnVlO1xuICAgICAgbXBJbnN0YW5jZS5zZXREYXRhKGRpZmZEYXRhLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMkMS5fX25leHRfdGlja19wZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIGZsdXNoQ2FsbGJhY2tzJDEodGhpcyQxKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmbHVzaENhbGxiYWNrcyQxKHRoaXMpO1xuICAgIH1cbiAgfVxufTtcblxuLyogICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUVtcHR5UmVuZGVyKCkge1xuXG59XG5cbmZ1bmN0aW9uIG1vdW50Q29tcG9uZW50JDEoXG4gIHZtLFxuICBlbCxcbiAgaHlkcmF0aW5nXG4pIHtcbiAgaWYgKCF2bS5tcFR5cGUpIHsvL21haW4uanMg5Lit55qEIG5ldyBWdWVcbiAgICByZXR1cm4gdm1cbiAgfVxuICBpZiAodm0ubXBUeXBlID09PSAnYXBwJykge1xuICAgIHZtLiRvcHRpb25zLnJlbmRlciA9IGNyZWF0ZUVtcHR5UmVuZGVyO1xuICB9XG4gIGlmICghdm0uJG9wdGlvbnMucmVuZGVyKSB7XG4gICAgdm0uJG9wdGlvbnMucmVuZGVyID0gY3JlYXRlRW1wdHlSZW5kZXI7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKCh2bS4kb3B0aW9ucy50ZW1wbGF0ZSAmJiB2bS4kb3B0aW9ucy50ZW1wbGF0ZS5jaGFyQXQoMCkgIT09ICcjJykgfHxcbiAgICAgICAgdm0uJG9wdGlvbnMuZWwgfHwgZWwpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAnWW91IGFyZSB1c2luZyB0aGUgcnVudGltZS1vbmx5IGJ1aWxkIG9mIFZ1ZSB3aGVyZSB0aGUgdGVtcGxhdGUgJyArXG4gICAgICAgICAgJ2NvbXBpbGVyIGlzIG5vdCBhdmFpbGFibGUuIEVpdGhlciBwcmUtY29tcGlsZSB0aGUgdGVtcGxhdGVzIGludG8gJyArXG4gICAgICAgICAgJ3JlbmRlciBmdW5jdGlvbnMsIG9yIHVzZSB0aGUgY29tcGlsZXItaW5jbHVkZWQgYnVpbGQuJyxcbiAgICAgICAgICB2bVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAnRmFpbGVkIHRvIG1vdW50IGNvbXBvbmVudDogdGVtcGxhdGUgb3IgcmVuZGVyIGZ1bmN0aW9uIG5vdCBkZWZpbmVkLicsXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gICF2bS5fJGZhbGxiYWNrICYmIGNhbGxIb29rKHZtLCAnYmVmb3JlTW91bnQnKTtcblxuICB2YXIgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkge1xuICAgIHZtLl91cGRhdGUodm0uX3JlbmRlcigpLCBoeWRyYXRpbmcpO1xuICB9O1xuXG4gIC8vIHdlIHNldCB0aGlzIHRvIHZtLl93YXRjaGVyIGluc2lkZSB0aGUgd2F0Y2hlcidzIGNvbnN0cnVjdG9yXG4gIC8vIHNpbmNlIHRoZSB3YXRjaGVyJ3MgaW5pdGlhbCBwYXRjaCBtYXkgY2FsbCAkZm9yY2VVcGRhdGUgKGUuZy4gaW5zaWRlIGNoaWxkXG4gIC8vIGNvbXBvbmVudCdzIG1vdW50ZWQgaG9vayksIHdoaWNoIHJlbGllcyBvbiB2bS5fd2F0Y2hlciBiZWluZyBhbHJlYWR5IGRlZmluZWRcbiAgbmV3IFdhdGNoZXIodm0sIHVwZGF0ZUNvbXBvbmVudCwgbm9vcCwge1xuICAgIGJlZm9yZTogZnVuY3Rpb24gYmVmb3JlKCkge1xuICAgICAgaWYgKHZtLl9pc01vdW50ZWQgJiYgIXZtLl9pc0Rlc3Ryb3llZCkge1xuICAgICAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZVVwZGF0ZScpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgdHJ1ZSAvKiBpc1JlbmRlcldhdGNoZXIgKi8pO1xuICBoeWRyYXRpbmcgPSBmYWxzZTtcbiAgcmV0dXJuIHZtXG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiByZW5kZXJDbGFzcyAoXG4gIHN0YXRpY0NsYXNzLFxuICBkeW5hbWljQ2xhc3Ncbikge1xuICBpZiAoaXNEZWYoc3RhdGljQ2xhc3MpIHx8IGlzRGVmKGR5bmFtaWNDbGFzcykpIHtcbiAgICByZXR1cm4gY29uY2F0KHN0YXRpY0NsYXNzLCBzdHJpbmdpZnlDbGFzcyhkeW5hbWljQ2xhc3MpKVxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiAnJ1xufVxuXG5mdW5jdGlvbiBjb25jYXQgKGEsIGIpIHtcbiAgcmV0dXJuIGEgPyBiID8gKGEgKyAnICcgKyBiKSA6IGEgOiAoYiB8fCAnJylcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5Q2xhc3MgKHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBzdHJpbmdpZnlBcnJheSh2YWx1ZSlcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIHN0cmluZ2lmeU9iamVjdCh2YWx1ZSlcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiAnJ1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlBcnJheSAodmFsdWUpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICB2YXIgc3RyaW5naWZpZWQ7XG4gIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKGlzRGVmKHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5Q2xhc3ModmFsdWVbaV0pKSAmJiBzdHJpbmdpZmllZCAhPT0gJycpIHtcbiAgICAgIGlmIChyZXMpIHsgcmVzICs9ICcgJzsgfVxuICAgICAgcmVzICs9IHN0cmluZ2lmaWVkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdCAodmFsdWUpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAodmFsdWVba2V5XSkge1xuICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9XG4gICAgICByZXMgKz0ga2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbi8qICAqL1xuXG52YXIgcGFyc2VTdHlsZVRleHQgPSBjYWNoZWQoZnVuY3Rpb24gKGNzc1RleHQpIHtcbiAgdmFyIHJlcyA9IHt9O1xuICB2YXIgbGlzdERlbGltaXRlciA9IC87KD8hW14oXSpcXCkpL2c7XG4gIHZhciBwcm9wZXJ0eURlbGltaXRlciA9IC86KC4rKS87XG4gIGNzc1RleHQuc3BsaXQobGlzdERlbGltaXRlcikuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIGlmIChpdGVtKSB7XG4gICAgICB2YXIgdG1wID0gaXRlbS5zcGxpdChwcm9wZXJ0eURlbGltaXRlcik7XG4gICAgICB0bXAubGVuZ3RoID4gMSAmJiAocmVzW3RtcFswXS50cmltKCldID0gdG1wWzFdLnRyaW0oKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc1xufSk7XG5cbi8vIG5vcm1hbGl6ZSBwb3NzaWJsZSBhcnJheSAvIHN0cmluZyB2YWx1ZXMgaW50byBPYmplY3RcbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0eWxlQmluZGluZyAoYmluZGluZ1N0eWxlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGJpbmRpbmdTdHlsZSkpIHtcbiAgICByZXR1cm4gdG9PYmplY3QoYmluZGluZ1N0eWxlKVxuICB9XG4gIGlmICh0eXBlb2YgYmluZGluZ1N0eWxlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBwYXJzZVN0eWxlVGV4dChiaW5kaW5nU3R5bGUpXG4gIH1cbiAgcmV0dXJuIGJpbmRpbmdTdHlsZVxufVxuXG4vKiAgKi9cblxudmFyIE1QX01FVEhPRFMgPSBbJ2NyZWF0ZVNlbGVjdG9yUXVlcnknLCAnY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXInLCAnc2VsZWN0QWxsQ29tcG9uZW50cycsICdzZWxlY3RDb21wb25lbnQnXTtcblxuZnVuY3Rpb24gZ2V0VGFyZ2V0KG9iaiwgcGF0aCkge1xuICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gIHZhciBrZXkgPSBwYXJ0c1swXTtcbiAgaWYgKGtleS5pbmRleE9mKCdfXyRuJykgPT09IDApIHsgLy9udW1iZXIgaW5kZXhcbiAgICBrZXkgPSBwYXJzZUludChrZXkucmVwbGFjZSgnX18kbicsICcnKSk7XG4gIH1cbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBvYmpba2V5XVxuICB9XG4gIHJldHVybiBnZXRUYXJnZXQob2JqW2tleV0sIHBhcnRzLnNsaWNlKDEpLmpvaW4oJy4nKSlcbn1cblxuZnVuY3Rpb24gaW50ZXJuYWxNaXhpbihWdWUpIHtcblxuICBWdWUuY29uZmlnLmVycm9ySGFuZGxlciA9IGZ1bmN0aW9uKGVyciwgdm0sIGluZm8pIHtcbiAgICBWdWUudXRpbC53YXJuKChcIkVycm9yIGluIFwiICsgaW5mbyArIFwiOiBcXFwiXCIgKyAoZXJyLnRvU3RyaW5nKCkpICsgXCJcXFwiXCIpLCB2bSk7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgdmFyIGFwcCA9IHR5cGVvZiBnZXRBcHAgPT09ICdmdW5jdGlvbicgJiYgZ2V0QXBwKCk7XG4gICAgaWYgKGFwcCAmJiBhcHAub25FcnJvcikge1xuICAgICAgYXBwLm9uRXJyb3IoZXJyKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIG9sZEVtaXQgPSBWdWUucHJvdG90eXBlLiRlbWl0O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJGVtaXQgPSBmdW5jdGlvbihldmVudCkge1xuICAgIGlmICh0aGlzLiRzY29wZSAmJiBldmVudCkge1xuICAgICAgdmFyIHRyaWdnZXJFdmVudCA9IHRoaXMuJHNjb3BlWydfdHJpZ2dlckV2ZW50J10gfHwgdGhpcy4kc2NvcGVbJ3RyaWdnZXJFdmVudCddO1xuICAgICAgaWYgKHRyaWdnZXJFdmVudCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudC5jYWxsKHRoaXMuJHNjb3BlLCBldmVudCwge1xuICAgICAgICAgICAgX19hcmdzX186IHRvQXJyYXkoYXJndW1lbnRzLCAxKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9sZEVtaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJG5leHRUaWNrID0gZnVuY3Rpb24oZm4pIHtcbiAgICByZXR1cm4gbmV4dFRpY2skMSh0aGlzLCBmbilcbiAgfTtcblxuICBNUF9NRVRIT0RTLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgIFZ1ZS5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgIGlmICh0aGlzLiRzY29wZSAmJiB0aGlzLiRzY29wZVttZXRob2RdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRzY29wZVttZXRob2RdKGFyZ3MpXG4gICAgICB9XG4gICAgICAvLyBtcC1hbGlwYXlcbiAgICAgIGlmICh0eXBlb2YgbXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKG1ldGhvZCA9PT0gJ2NyZWF0ZVNlbGVjdG9yUXVlcnknKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgICAgIHJldHVybiBteS5jcmVhdGVTZWxlY3RvclF1ZXJ5KGFyZ3MpXG4gICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gJ2NyZWF0ZUludGVyc2VjdGlvbk9ic2VydmVyJykge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuICAgICAgICByZXR1cm4gbXkuY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoYXJncylcbiAgICAgIH1cbiAgICAgIC8vIFRPRE8gbXAtYWxpcGF5IOaaguS4jeaUr+aMgSBzZWxlY3RBbGxDb21wb25lbnRzLHNlbGVjdENvbXBvbmVudFxuICAgIH07XG4gIH0pO1xuXG4gIFZ1ZS5wcm90b3R5cGUuX19pbml0X3Byb3ZpZGUgPSBpbml0UHJvdmlkZTtcblxuICBWdWUucHJvdG90eXBlLl9faW5pdF9pbmplY3Rpb25zID0gaW5pdEluamVjdGlvbnM7XG5cbiAgVnVlLnByb3RvdHlwZS5fX2NhbGxfaG9vayA9IGZ1bmN0aW9uKGhvb2ssIGFyZ3MpIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIC8vICM3NTczIGRpc2FibGUgZGVwIGNvbGxlY3Rpb24gd2hlbiBpbnZva2luZyBsaWZlY3ljbGUgaG9va3NcbiAgICBwdXNoVGFyZ2V0KCk7XG4gICAgdmFyIGhhbmRsZXJzID0gdm0uJG9wdGlvbnNbaG9va107XG4gICAgdmFyIGluZm8gPSBob29rICsgXCIgaG9va1wiO1xuICAgIHZhciByZXQ7XG4gICAgaWYgKGhhbmRsZXJzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGhhbmRsZXJzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICByZXQgPSBpbnZva2VXaXRoRXJyb3JIYW5kbGluZyhoYW5kbGVyc1tpXSwgdm0sIGFyZ3MgPyBbYXJnc10gOiBudWxsLCB2bSwgaW5mbyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2bS5faGFzSG9va0V2ZW50KSB7XG4gICAgICB2bS4kZW1pdCgnaG9vazonICsgaG9vaywgYXJncyk7XG4gICAgfVxuICAgIHBvcFRhcmdldCgpO1xuICAgIHJldHVybiByZXRcbiAgfTtcblxuICBWdWUucHJvdG90eXBlLl9fc2V0X21vZGVsID0gZnVuY3Rpb24odGFyZ2V0LCBrZXksIHZhbHVlLCBtb2RpZmllcnMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RpZmllcnMpKSB7XG4gICAgICBpZiAobW9kaWZpZXJzLmluZGV4T2YoJ3RyaW0nKSAhPT0gLTEpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gICAgICB9XG4gICAgICBpZiAobW9kaWZpZXJzLmluZGV4T2YoJ251bWJlcicpICE9PSAtMSkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuX24odmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGFyZ2V0ID0gdGhpcztcbiAgICB9XG4gICAgLy8g6Kej5Yaz5Yqo5oCB5bGe5oCn5re75YqgXG4gICAgVnVlLnNldCh0YXJnZXQsIGtleSwgdmFsdWUpO1xuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuX19zZXRfc3luYyA9IGZ1bmN0aW9uKHRhcmdldCwga2V5LCB2YWx1ZSkge1xuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICB0YXJnZXQgPSB0aGlzO1xuICAgIH1cbiAgICAvLyDop6PlhrPliqjmgIHlsZ7mgKfmt7vliqBcbiAgICBWdWUuc2V0KHRhcmdldCwga2V5LCB2YWx1ZSk7XG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS5fX2dldF9vcmlnID0gZnVuY3Rpb24oaXRlbSkge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KGl0ZW0pKSB7XG4gICAgICByZXR1cm4gaXRlbVsnJG9yaWcnXSB8fCBpdGVtXG4gICAgfVxuICAgIHJldHVybiBpdGVtXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS5fX2dldF92YWx1ZSA9IGZ1bmN0aW9uKGRhdGFQYXRoLCB0YXJnZXQpIHtcbiAgICByZXR1cm4gZ2V0VGFyZ2V0KHRhcmdldCB8fCB0aGlzLCBkYXRhUGF0aClcbiAgfTtcblxuXG4gIFZ1ZS5wcm90b3R5cGUuX19nZXRfY2xhc3MgPSBmdW5jdGlvbihkeW5hbWljQ2xhc3MsIHN0YXRpY0NsYXNzKSB7XG4gICAgcmV0dXJuIHJlbmRlckNsYXNzKHN0YXRpY0NsYXNzLCBkeW5hbWljQ2xhc3MpXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS5fX2dldF9zdHlsZSA9IGZ1bmN0aW9uKGR5bmFtaWNTdHlsZSwgc3RhdGljU3R5bGUpIHtcbiAgICBpZiAoIWR5bmFtaWNTdHlsZSAmJiAhc3RhdGljU3R5bGUpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgICB2YXIgZHluYW1pY1N0eWxlT2JqID0gbm9ybWFsaXplU3R5bGVCaW5kaW5nKGR5bmFtaWNTdHlsZSk7XG4gICAgdmFyIHN0eWxlT2JqID0gc3RhdGljU3R5bGUgPyBleHRlbmQoc3RhdGljU3R5bGUsIGR5bmFtaWNTdHlsZU9iaikgOiBkeW5hbWljU3R5bGVPYmo7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHN0eWxlT2JqKS5tYXAoZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuICgoaHlwaGVuYXRlKG5hbWUpKSArIFwiOlwiICsgKHN0eWxlT2JqW25hbWVdKSk7IH0pLmpvaW4oJzsnKVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuX19tYXAgPSBmdW5jdGlvbih2YWwsIGl0ZXJhdGVlKSB7XG4gICAgLy9UT0RPIOaaguS4jeiAg+iZkSBzdHJpbmdcbiAgICB2YXIgcmV0LCBpLCBsLCBrZXlzLCBrZXk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgcmV0ID0gbmV3IEFycmF5KHZhbC5sZW5ndGgpO1xuICAgICAgZm9yIChpID0gMCwgbCA9IHZhbC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgcmV0W2ldID0gaXRlcmF0ZWUodmFsW2ldLCBpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXRcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbCkpIHtcbiAgICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgICAgcmV0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIGZvciAoaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICByZXRba2V5XSA9IGl0ZXJhdGVlKHZhbFtrZXldLCBrZXksIGkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldCA9IG5ldyBBcnJheSh2YWwpO1xuICAgICAgZm9yIChpID0gMCwgbCA9IHZhbDsgaSA8IGw7IGkrKykge1xuICAgICAgICAvLyDnrKzkuIDkuKrlj4LmlbDmmoLml7bku43lkozlsI/nqIvluo/kuIDoh7RcbiAgICAgICAgcmV0W2ldID0gaXRlcmF0ZWUoaSwgaSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0XG4gICAgfVxuICAgIHJldHVybiBbXVxuICB9O1xuXG59XG5cbi8qICAqL1xuXG52YXIgTElGRUNZQ0xFX0hPT0tTJDEgPSBbXG4gICAgLy9BcHBcbiAgICAnb25MYXVuY2gnLFxuICAgICdvblNob3cnLFxuICAgICdvbkhpZGUnLFxuICAgICdvblVuaU5WaWV3TWVzc2FnZScsXG4gICAgJ29uUGFnZU5vdEZvdW5kJyxcbiAgICAnb25UaGVtZUNoYW5nZScsXG4gICAgJ29uRXJyb3InLFxuICAgICdvblVuaGFuZGxlZFJlamVjdGlvbicsXG4gICAgLy9QYWdlXG4gICAgJ29uSW5pdCcsXG4gICAgJ29uTG9hZCcsXG4gICAgLy8gJ29uU2hvdycsXG4gICAgJ29uUmVhZHknLFxuICAgIC8vICdvbkhpZGUnLFxuICAgICdvblVubG9hZCcsXG4gICAgJ29uUHVsbERvd25SZWZyZXNoJyxcbiAgICAnb25SZWFjaEJvdHRvbScsXG4gICAgJ29uVGFiSXRlbVRhcCcsXG4gICAgJ29uQWRkVG9GYXZvcml0ZXMnLFxuICAgICdvblNoYXJlVGltZWxpbmUnLFxuICAgICdvblNoYXJlQXBwTWVzc2FnZScsXG4gICAgJ29uUmVzaXplJyxcbiAgICAnb25QYWdlU2Nyb2xsJyxcbiAgICAnb25OYXZpZ2F0aW9uQmFyQnV0dG9uVGFwJyxcbiAgICAnb25CYWNrUHJlc3MnLFxuICAgICdvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQnLFxuICAgICdvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENvbmZpcm1lZCcsXG4gICAgJ29uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCcsXG4gICAgLy9Db21wb25lbnRcbiAgICAvLyAnb25SZWFkeScsIC8vIOWFvOWuueaXp+eJiOacrO+8jOW6lOivpeenu+mZpOivpeS6i+S7tlxuICAgICdvblBhZ2VTaG93JyxcbiAgICAnb25QYWdlSGlkZScsXG4gICAgJ29uUGFnZVJlc2l6ZScsXG4gICAgJ29uVXBsb2FkRG91eWluVmlkZW8nXG5dO1xuZnVuY3Rpb24gbGlmZWN5Y2xlTWl4aW4kMShWdWUpIHtcblxuICAgIC8vZml4ZWQgdnVlLWNsYXNzLWNvbXBvbmVudFxuICAgIHZhciBvbGRFeHRlbmQgPSBWdWUuZXh0ZW5kO1xuICAgIFZ1ZS5leHRlbmQgPSBmdW5jdGlvbihleHRlbmRPcHRpb25zKSB7XG4gICAgICAgIGV4dGVuZE9wdGlvbnMgPSBleHRlbmRPcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHZhciBtZXRob2RzID0gZXh0ZW5kT3B0aW9ucy5tZXRob2RzO1xuICAgICAgICBpZiAobWV0aG9kcykge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMobWV0aG9kcykuZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChMSUZFQ1lDTEVfSE9PS1MkMS5pbmRleE9mKG1ldGhvZE5hbWUpIT09LTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kT3B0aW9uc1ttZXRob2ROYW1lXSA9IG1ldGhvZHNbbWV0aG9kTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtZXRob2RzW21ldGhvZE5hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9sZEV4dGVuZC5jYWxsKHRoaXMsIGV4dGVuZE9wdGlvbnMpXG4gICAgfTtcblxuICAgIHZhciBzdHJhdGVnaWVzID0gVnVlLmNvbmZpZy5vcHRpb25NZXJnZVN0cmF0ZWdpZXM7XG4gICAgdmFyIG1lcmdlSG9vayA9IHN0cmF0ZWdpZXMuY3JlYXRlZDtcbiAgICBMSUZFQ1lDTEVfSE9PS1MkMS5mb3JFYWNoKGZ1bmN0aW9uIChob29rKSB7XG4gICAgICAgIHN0cmF0ZWdpZXNbaG9va10gPSBtZXJnZUhvb2s7XG4gICAgfSk7XG5cbiAgICBWdWUucHJvdG90eXBlLl9fbGlmZWN5Y2xlX2hvb2tzX18gPSBMSUZFQ1lDTEVfSE9PS1MkMTtcbn1cblxuLyogICovXG5cbi8vIGluc3RhbGwgcGxhdGZvcm0gcGF0Y2ggZnVuY3Rpb25cblZ1ZS5wcm90b3R5cGUuX19wYXRjaF9fID0gcGF0Y2g7XG5cbi8vIHB1YmxpYyBtb3VudCBtZXRob2RcblZ1ZS5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24oXG4gICAgZWwgLFxuICAgIGh5ZHJhdGluZyBcbikge1xuICAgIHJldHVybiBtb3VudENvbXBvbmVudCQxKHRoaXMsIGVsLCBoeWRyYXRpbmcpXG59O1xuXG5saWZlY3ljbGVNaXhpbiQxKFZ1ZSk7XG5pbnRlcm5hbE1peGluKFZ1ZSk7XG5cbi8qICAqL1xuXG5leHBvcnQgZGVmYXVsdCBWdWU7XG4iLCIvKiBnbG9iYWxzIF9fVlVFX1NTUl9DT05URVhUX18gKi9cblxuLy8gSU1QT1JUQU5UOiBEbyBOT1QgdXNlIEVTMjAxNSBmZWF0dXJlcyBpbiB0aGlzIGZpbGUgKGV4Y2VwdCBmb3IgbW9kdWxlcykuXG4vLyBUaGlzIG1vZHVsZSBpcyBhIHJ1bnRpbWUgdXRpbGl0eSBmb3IgY2xlYW5lciBjb21wb25lbnQgbW9kdWxlIG91dHB1dCBhbmQgd2lsbFxuLy8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHdlYnBhY2sgdXNlciBidW5kbGUuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbXBvbmVudCAoXG4gIHNjcmlwdEV4cG9ydHMsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmdW5jdGlvbmFsVGVtcGxhdGUsXG4gIGluamVjdFN0eWxlcyxcbiAgc2NvcGVJZCxcbiAgbW9kdWxlSWRlbnRpZmllciwgLyogc2VydmVyIG9ubHkgKi9cbiAgc2hhZG93TW9kZSwgLyogdnVlLWNsaSBvbmx5ICovXG4gIGNvbXBvbmVudHMsIC8vIGZpeGVkIGJ5IHh4eHh4eCBhdXRvIGNvbXBvbmVudHNcbiAgcmVuZGVyanMgLy8gZml4ZWQgYnkgeHh4eHh4IHJlbmRlcmpzXG4pIHtcbiAgLy8gVnVlLmV4dGVuZCBjb25zdHJ1Y3RvciBleHBvcnQgaW50ZXJvcFxuICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzY3JpcHRFeHBvcnRzID09PSAnZnVuY3Rpb24nXG4gICAgPyBzY3JpcHRFeHBvcnRzLm9wdGlvbnNcbiAgICA6IHNjcmlwdEV4cG9ydHNcblxuICAvLyBmaXhlZCBieSB4eHh4eHggYXV0byBjb21wb25lbnRzXG4gIGlmIChjb21wb25lbnRzKSB7XG4gICAgaWYgKCFvcHRpb25zLmNvbXBvbmVudHMpIHtcbiAgICAgIG9wdGlvbnMuY29tcG9uZW50cyA9IHt9XG4gICAgfVxuICAgIHZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICAgZm9yICh2YXIgbmFtZSBpbiBjb21wb25lbnRzKSB7XG4gICAgICBpZiAoaGFzT3duLmNhbGwoY29tcG9uZW50cywgbmFtZSkgJiYgIWhhc093bi5jYWxsKG9wdGlvbnMuY29tcG9uZW50cywgbmFtZSkpIHtcbiAgICAgICAgb3B0aW9ucy5jb21wb25lbnRzW25hbWVdID0gY29tcG9uZW50c1tuYW1lXVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBmaXhlZCBieSB4eHh4eHggcmVuZGVyanNcbiAgaWYgKHJlbmRlcmpzKSB7XG4gICAgKHJlbmRlcmpzLmJlZm9yZUNyZWF0ZSB8fCAocmVuZGVyanMuYmVmb3JlQ3JlYXRlID0gW10pKS51bnNoaWZ0KGZ1bmN0aW9uKCkge1xuICAgICAgdGhpc1tyZW5kZXJqcy5fX21vZHVsZV0gPSB0aGlzXG4gICAgfSk7XG4gICAgKG9wdGlvbnMubWl4aW5zIHx8IChvcHRpb25zLm1peGlucyA9IFtdKSkucHVzaChyZW5kZXJqcylcbiAgfVxuXG4gIC8vIHJlbmRlciBmdW5jdGlvbnNcbiAgaWYgKHJlbmRlcikge1xuICAgIG9wdGlvbnMucmVuZGVyID0gcmVuZGVyXG4gICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnNcbiAgICBvcHRpb25zLl9jb21waWxlZCA9IHRydWVcbiAgfVxuXG4gIC8vIGZ1bmN0aW9uYWwgdGVtcGxhdGVcbiAgaWYgKGZ1bmN0aW9uYWxUZW1wbGF0ZSkge1xuICAgIG9wdGlvbnMuZnVuY3Rpb25hbCA9IHRydWVcbiAgfVxuXG4gIC8vIHNjb3BlZElkXG4gIGlmIChzY29wZUlkKSB7XG4gICAgb3B0aW9ucy5fc2NvcGVJZCA9ICdkYXRhLXYtJyArIHNjb3BlSWRcbiAgfVxuXG4gIHZhciBob29rXG4gIGlmIChtb2R1bGVJZGVudGlmaWVyKSB7IC8vIHNlcnZlciBidWlsZFxuICAgIGhvb2sgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgLy8gMi4zIGluamVjdGlvblxuICAgICAgY29udGV4dCA9XG4gICAgICAgIGNvbnRleHQgfHwgLy8gY2FjaGVkIGNhbGxcbiAgICAgICAgKHRoaXMuJHZub2RlICYmIHRoaXMuJHZub2RlLnNzckNvbnRleHQpIHx8IC8vIHN0YXRlZnVsXG4gICAgICAgICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC4kdm5vZGUgJiYgdGhpcy5wYXJlbnQuJHZub2RlLnNzckNvbnRleHQpIC8vIGZ1bmN0aW9uYWxcbiAgICAgIC8vIDIuMiB3aXRoIHJ1bkluTmV3Q29udGV4dDogdHJ1ZVxuICAgICAgaWYgKCFjb250ZXh0ICYmIHR5cGVvZiBfX1ZVRV9TU1JfQ09OVEVYVF9fICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb250ZXh0ID0gX19WVUVfU1NSX0NPTlRFWFRfX1xuICAgICAgfVxuICAgICAgLy8gaW5qZWN0IGNvbXBvbmVudCBzdHlsZXNcbiAgICAgIGlmIChpbmplY3RTdHlsZXMpIHtcbiAgICAgICAgaW5qZWN0U3R5bGVzLmNhbGwodGhpcywgY29udGV4dClcbiAgICAgIH1cbiAgICAgIC8vIHJlZ2lzdGVyIGNvbXBvbmVudCBtb2R1bGUgaWRlbnRpZmllciBmb3IgYXN5bmMgY2h1bmsgaW5mZXJyZW5jZVxuICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5fcmVnaXN0ZXJlZENvbXBvbmVudHMpIHtcbiAgICAgICAgY29udGV4dC5fcmVnaXN0ZXJlZENvbXBvbmVudHMuYWRkKG1vZHVsZUlkZW50aWZpZXIpXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHVzZWQgYnkgc3NyIGluIGNhc2UgY29tcG9uZW50IGlzIGNhY2hlZCBhbmQgYmVmb3JlQ3JlYXRlXG4gICAgLy8gbmV2ZXIgZ2V0cyBjYWxsZWRcbiAgICBvcHRpb25zLl9zc3JSZWdpc3RlciA9IGhvb2tcbiAgfSBlbHNlIGlmIChpbmplY3RTdHlsZXMpIHtcbiAgICBob29rID0gc2hhZG93TW9kZVxuICAgICAgPyBmdW5jdGlvbiAoKSB7IGluamVjdFN0eWxlcy5jYWxsKHRoaXMsIHRoaXMuJHJvb3QuJG9wdGlvbnMuc2hhZG93Um9vdCkgfVxuICAgICAgOiBpbmplY3RTdHlsZXNcbiAgfVxuXG4gIGlmIChob29rKSB7XG4gICAgaWYgKG9wdGlvbnMuZnVuY3Rpb25hbCkge1xuICAgICAgLy8gZm9yIHRlbXBsYXRlLW9ubHkgaG90LXJlbG9hZCBiZWNhdXNlIGluIHRoYXQgY2FzZSB0aGUgcmVuZGVyIGZuIGRvZXNuJ3RcbiAgICAgIC8vIGdvIHRocm91Z2ggdGhlIG5vcm1hbGl6ZXJcbiAgICAgIG9wdGlvbnMuX2luamVjdFN0eWxlcyA9IGhvb2tcbiAgICAgIC8vIHJlZ2lzdGVyIGZvciBmdW5jdGlvYWwgY29tcG9uZW50IGluIHZ1ZSBmaWxlXG4gICAgICB2YXIgb3JpZ2luYWxSZW5kZXIgPSBvcHRpb25zLnJlbmRlclxuICAgICAgb3B0aW9ucy5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXJXaXRoU3R5bGVJbmplY3Rpb24gKGgsIGNvbnRleHQpIHtcbiAgICAgICAgaG9vay5jYWxsKGNvbnRleHQpXG4gICAgICAgIHJldHVybiBvcmlnaW5hbFJlbmRlcihoLCBjb250ZXh0KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50IHJlZ2lzdHJhdGlvbiBhcyBiZWZvcmVDcmVhdGUgaG9va1xuICAgICAgdmFyIGV4aXN0aW5nID0gb3B0aW9ucy5iZWZvcmVDcmVhdGVcbiAgICAgIG9wdGlvbnMuYmVmb3JlQ3JlYXRlID0gZXhpc3RpbmdcbiAgICAgICAgPyBbXS5jb25jYXQoZXhpc3RpbmcsIGhvb2spXG4gICAgICAgIDogW2hvb2tdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBleHBvcnRzOiBzY3JpcHRFeHBvcnRzLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgfVxufVxuIiwiY29uc3Qgc2hvd01vZGFsID0gKHRpdGxlLCBjb250ZW50LCBjYikgPT4ge1xyXG5cdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0dGl0bGUsXHJcblx0XHRjb250ZW50LFxyXG5cdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRjb21wbGV0ZTogKCkgPT4ge1xyXG5cdFx0XHRpZiAoY2IpIGNiKCk7XHJcblx0XHR9XHJcblx0fSk7XHJcbn07XHJcbmNvbnN0IHNob3dMb2FkaW5nID0gKHRpdGxlKSA9PiB7XHJcblx0dW5pLnNob3dMb2FkaW5nKHtcclxuICAgICAgICB0aXRsZSxcclxuICAgICAgICBtYXNrOnRydWUsXHJcbiAgICB9KTtcclxufTtcclxuY29uc3QgaGlkZUxvYWRpbmcgPSAoKSA9PiB7XHJcblx0dW5pLmhpZGVMb2FkaW5nKCk7XHJcbn07XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cdHNob3dNb2RhbCxcclxuXHRzaG93TG9hZGluZyxcclxuXHRoaWRlTG9hZGluZ1xyXG59O1xyXG5cclxuIiwiXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9lY0JMRUpELmpzJylcclxuIiwiY29uc3QgbG9nRW5hYmxlID0gZmFsc2U7XG5sZXQgaXNBbmRyb2lkID0gZmFsc2U7XG5sZXQgZWNCbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2VDYWxsYmFjayA9ICgpID0+IHsgfTtcbmxldCBlY0JMRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZUNhbGxiYWNrID0gKCkgPT4geyB9O1xubGV0IGVjRGV2aWNlSWQgPSAnJztcbmxldCBlY0dhdHRTZXJ2ZXJVVUlEID0gJyc7XG5jb25zdCBlY0dhdHRTZXJ2ZXJVVUlET3B0aW9uMSA9ICcwMDAwRkZGMC0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkInO1xuY29uc3QgZWNHYXR0U2VydmVyVVVJRE9wdGlvbjIgPSAnRkZGMCc7XG5sZXQgZWNHYXR0Q2hhcmFjdGVyaXN0aWNXcml0ZVVVSUQgPSAnJztcbmNvbnN0IGVjR2F0dENoYXJhY3RlcmlzdGljV3JpdGVVVUlET3B0aW9uMSA9ICcwMDAwRkZGMi0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkInO1xuY29uc3QgZWNHYXR0Q2hhcmFjdGVyaXN0aWNXcml0ZVVVSURPcHRpb24yID0gJ0ZGRjInO1xuY29uc3QgbG9nID0gZGF0YSA9PiB7XG4gICAgaWYgKGxvZ0VuYWJsZSkge1xuICAgICAgICBjb25zb2xlLmxvZygnW2VjaW90XTonICsgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgIH1cbn07XG5jb25zdCBvbkJsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZSA9IGNiID0+IHtcbiAgICBlY0JsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZUNhbGxiYWNrID0gY2I7XG59O1xuLy8gY29uc3QgZ2V0U2V0dGluZyA9ICgpID0+IHtcbi8vICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbi8vICAgICBqZC5nZXRTZXR0aW5nKHtcbi8vICAgICAgIHN1Y2Nlc3MocmVzKSB7XG4vLyAgICAgICAgIGxvZyhyZXMpO1xuLy8gICAgICAgICBpZiAocmVzLmF1dGhTZXR0aW5nICYmIHJlcy5hdXRoU2V0dGluZ1snc2NvcGUuYmx1ZXRvb3RoJ10pIHtcbi8vICAgICAgICAgICByZXNvbHZlKHtcbi8vICAgICAgICAgICAgIG9rOiB0cnVlLFxuLy8gICAgICAgICAgICAgZXJyQ29kZTogMCxcbi8vICAgICAgICAgICAgIGVyck1zZzogJydcbi8vICAgICAgICAgICB9KTtcbi8vICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICByZXNvbHZlKHtcbi8vICAgICAgICAgICAgIG9rOiBmYWxzZSxcbi8vICAgICAgICAgICAgIGVyckNvZGU6IDMwMDAxLFxuLy8gICAgICAgICAgICAgZXJyTXNnOiAnZ2V0U2V0dGluZyBmYWlsJ1xuLy8gICAgICAgICAgIH0pO1xuLy8gICAgICAgICB9XG4vLyAgICAgICB9LFxuLy8gICAgICAgZmFpbChyZXMpIHtcbi8vICAgICAgICAgbG9nKHJlcyk7XG4vLyAgICAgICAgIHJlc29sdmUoe1xuLy8gICAgICAgICAgIG9rOiBmYWxzZSxcbi8vICAgICAgICAgICBlcnJDb2RlOiByZXMuZXJyQ29kZSA/IHJlcy5lcnJDb2RlIDogMzAwMDAsXG4vLyAgICAgICAgICAgZXJyTXNnOiByZXMuZXJyTXNnID8gcmVzLmVyck1zZyA6ICdnZXRTZXR0aW5nIGZhaWwnXG4vLyAgICAgICAgIH0pO1xuLy8gICAgICAgfVxuLy8gICAgIH0pO1xuLy8gICB9KTtcbi8vIH07XG4vLyBjb25zdCBhdXRob3JpemUgPSAoKSA9PiB7XG4vLyAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4vLyAgICAgamQuYXV0aG9yaXplKHtcbi8vICAgICAgIHNjb3BlOiAnc2NvcGUuYmx1ZXRvb3RoJyxcbi8vICAgICAgIHN1Y2Nlc3MocmVzKSB7XG4vLyAgICAgICAgIGxvZyhyZXMpO1xuLy8gICAgICAgICByZXNvbHZlKHtcbi8vICAgICAgICAgICBvazogdHJ1ZSxcbi8vICAgICAgICAgICBlcnJDb2RlOiAwLFxuLy8gICAgICAgICAgIGVyck1zZzogJydcbi8vICAgICAgICAgfSk7XG4vLyAgICAgICB9LFxuLy8gICAgICAgZmFpbChyZXMpIHtcbi8vICAgICAgICAgbG9nKHJlcyk7XG4vLyAgICAgICAgIC8vIHtcImVyck1zZ1wiOlwiYXV0aG9yaXplOmZhaWw6YXV0aCBkZW55XCJ9XG4vLyAgICAgICAgIHJlc29sdmUoe1xuLy8gICAgICAgICAgIG9rOiBmYWxzZSxcbi8vICAgICAgICAgICBlcnJDb2RlOiAzMDAwMCxcbi8vICAgICAgICAgICBlcnJNc2c6IHJlcy5lcnJNc2dcbi8vICAgICAgICAgfSk7XG4vLyAgICAgICB9XG4vLyAgICAgfSk7XG4vLyAgIH0pO1xuLy8gfTtcbmNvbnN0IF9vcGVuQmx1ZXRvb3RoQWRhcHRlciA9ICgpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBqZC5vcGVuQmx1ZXRvb3RoQWRhcHRlcih7XG4gICAgICAgICAgICBzdWNjZXNzKHJlcykge1xuICAgICAgICAgICAgICAgIGxvZyhyZXMpO1xuICAgICAgICAgICAgICAgIC8vIHtlcnJubzogMCwgZXJyTXNnOiBcIm9wZW5CbHVldG9vdGhBZGFwdGVyOm9rXCJ9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIG9rOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlcnJDb2RlOiAwLFxuICAgICAgICAgICAgICAgICAgICBlcnJNc2c6ICcnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmFpbChyZXMpIHtcbiAgICAgICAgICAgICAgICBsb2cocmVzKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBlcnJDb2RlOiByZXMuZXJyQ29kZSA/IHJlcy5lcnJDb2RlIDogMzAwMDAsXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZzogcmVzLmVyck1zZ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5jb25zdCBvcGVuQmx1ZXRvb3RoQWRhcHRlciA9IGFzeW5jICgpID0+IHtcbiAgICAvLyBhd2FpdCBfb3BlbkJsdWV0b290aEFkYXB0ZXIoKVxuICAgIGNvbnN0IHN5c3RlbUluZm8gPSBqZC5nZXRTeXN0ZW1JbmZvU3luYygpO1xuICAgIGxvZyhzeXN0ZW1JbmZvKTtcbiAgICBpZiAoc3lzdGVtSW5mby5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpID09PSAnYW5kcm9pZCcpIHtcbiAgICAgICAgaXNBbmRyb2lkID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gICBpZiAoIXN5c3RlbUluZm8uYmx1ZXRvb3RoRW5hYmxlZCkge1xuICAgIC8vICAgICBlY0JsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZUNhbGxiYWNrKHtcbiAgICAvLyAgICAgICBvazogZmFsc2UsXG4gICAgLy8gICAgICAgZXJyQ29kZTogMzAwMDEsXG4gICAgLy8gICAgICAgZXJyTXNnOiAn6K+35omT5byA57O757uf6JOd54mZ5byA5YWzJ1xuICAgIC8vICAgICB9KTtcbiAgICAvLyAgICAgcmV0dXJuO1xuICAgIC8vICAgfVxuICAgIC8vICAgaWYgKGlzQW5kcm9pZCAmJiAhc3lzdGVtSW5mby5sb2NhdGlvbkVuYWJsZWQpIHtcbiAgICAvLyAgICAgZWNCbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2VDYWxsYmFjayh7XG4gICAgLy8gICAgICAgb2s6IGZhbHNlLFxuICAgIC8vICAgICAgIGVyckNvZGU6IDMwMDAyLFxuICAgIC8vICAgICAgIGVyck1zZzogJ+ivt+aJk+W8gOezu+e7n+WumuS9jeW8gOWFsydcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gICAgIHJldHVybjtcbiAgICAvLyAgIH1cbiAgICAvLyAgIGlmIChpc0FuZHJvaWQgJiYgIXN5c3RlbUluZm8ubG9jYXRpb25BdXRob3JpemVkKSB7XG4gICAgLy8gICAgIGVjQmx1ZXRvb3RoQWRhcHRlclN0YXRlQ2hhbmdlQ2FsbGJhY2soe1xuICAgIC8vICAgICAgIG9rOiBmYWxzZSxcbiAgICAvLyAgICAgICBlcnJDb2RlOiAzMDAwMyxcbiAgICAvLyAgICAgICBlcnJNc2c6ICfor7fmiZPlvIDlvq7kv6HlrprkvY3mnYPpmZDvvIzlhYHorrjlvq7kv6Hkvb/nlKjmgqjnmoTkvY3nva7kv6Hmga8nXG4gICAgLy8gICAgIH0pO1xuICAgIC8vICAgICByZXR1cm47XG4gICAgLy8gICB9XG4gICAgLy8gICBjb25zdCBzZXR0aW5nID0gYXdhaXQgZ2V0U2V0dGluZygpOyAvL+Wwj+eoi+W6j+iTneeJmeadg+mZkFxuICAgIC8vICAgaWYgKCFzZXR0aW5nLm9rKSB7XG4gICAgLy8gICAgIGNvbnN0IGF1dGhSZXMgPSBhd2FpdCBhdXRob3JpemUoKTtcbiAgICAvLyAgICAgaWYgKCFhdXRoUmVzLm9rKSB7XG4gICAgLy8gICAgICAgZWNCbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2VDYWxsYmFjayh7XG4gICAgLy8gICAgICAgICBvazogZmFsc2UsXG4gICAgLy8gICAgICAgICBlcnJDb2RlOiAzMDAwNCxcbiAgICAvLyAgICAgICAgIGVyck1zZzogJ+ivt+aJk+W8gOWwj+eoi+W6j+iTneeJmeW8gOWFs++8jOeCueWHu+WPs+S4iuinkuS4ieS4queCue+8jOeEtuWQjueCueWHu+iuvue9ridcbiAgICAvLyAgICAgICB9KTtcbiAgICAvLyAgICAgICByZXR1cm47XG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH1cbiAgICBqZC5vZmZCbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2UoKTtcbiAgICBqZC5vbkJsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZShyZXMgPT4ge1xuICAgICAgICBsb2cocmVzKTsgLy8ge2F2YWlsYWJsZTogdHJ1ZSwgZGlzY292ZXJpbmc6IHRydWV9XG4gICAgICAgIGlmICghcmVzLmF2YWlsYWJsZSkge1xuICAgICAgICAgICAgZWNCbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2VDYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVyckNvZGU6IDMwMDA1LFxuICAgICAgICAgICAgICAgIGVyck1zZzogJ+iTneeJmemAgumFjeWZqOS4jeWPr+eUqCdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3Qgb3BlblJlcyA9IGF3YWl0IF9vcGVuQmx1ZXRvb3RoQWRhcHRlcigpO1xuICAgIGVjQmx1ZXRvb3RoQWRhcHRlclN0YXRlQ2hhbmdlQ2FsbGJhY2sob3BlblJlcyk7XG59O1xuY29uc3Qgb25CbHVldG9vdGhEZXZpY2VGb3VuZCA9IGNiID0+IHtcbiAgICBqZC5vZmZCbHVldG9vdGhEZXZpY2VGb3VuZCgpO1xuICAgIGpkLm9uQmx1ZXRvb3RoRGV2aWNlRm91bmQocmVzID0+IHtcbiAgICAgICAgLy8gbG9nKHJlcyk7XG4gICAgICAgIGNvbnN0IGRldmljZSA9IHJlcy5kZXZpY2VzWzBdO1xuICAgICAgICBjb25zdCBuYW1lID0gZGV2aWNlLm5hbWUgPyBkZXZpY2UubmFtZSA6IGRldmljZS5sb2NhbE5hbWU7XG4gICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpZCA9IGRldmljZS5kZXZpY2VJZDtcbiAgICAgICAgbGV0IHJzc2kgPSBkZXZpY2UuUlNTSTtcbiAgICAgICAgY2Ioe1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcnNzaVxuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5jb25zdCBzdGFydEJsdWV0b290aERldmljZXNEaXNjb3ZlcnkgPSAoKSA9PiB7XG4gICAgamQuc3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5KHtcbiAgICAgICAgLy9zZXJ2aWNlczogW2VjU2VydmVySWRdLFxuICAgICAgICBhbGxvd0R1cGxpY2F0ZXNLZXk6IHRydWUsXG4gICAgICAgIHBvd2VyTGV2ZWw6ICdoaWdoJyxcbiAgICAgICAgY29tcGxldGUocmVzKSB7XG4gICAgICAgICAgICBsb2cocmVzKTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcbmNvbnN0IHN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5ID0gKCkgPT4ge1xuICAgIGpkLnN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5KHtcbiAgICAgICAgY29tcGxldGUocmVzKSB7XG4gICAgICAgICAgICAvLyB7ZXJybm86IDAsIGVyck1zZzogXCJzdG9wQmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeTpva1wiLCBpc0Rpc2NvdmVyaW5nOiBmYWxzZX1cbiAgICAgICAgICAgIGxvZyhyZXMpO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuY29uc3Qgb25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2UgPSBjYiA9PiB7XG4gICAgZWNCTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2VDYWxsYmFjayA9IGNiO1xufTtcbmNvbnN0IF9jcmVhdGVCTEVDb25uZWN0aW9uID0gKCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGpkLmNyZWF0ZUJMRUNvbm5lY3Rpb24oe1xuICAgICAgICAgICAgZGV2aWNlSWQ6IGVjRGV2aWNlSWQsXG4gICAgICAgICAgICBzdWNjZXNzKHJlcykge1xuICAgICAgICAgICAgICAgIGxvZyhyZXMpO1xuICAgICAgICAgICAgICAgIC8vIHtcImVycm5vXCI6MCxcImVyckNvZGVcIjowLFwiZXJyTXNnXCI6XCJjcmVhdGVCTEVDb25uZWN0aW9uOm9rXCJ9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIG9rOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlcnJDb2RlOiAwLFxuICAgICAgICAgICAgICAgICAgICBlcnJNc2c6ICcnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmFpbChyZXMpIHtcbiAgICAgICAgICAgICAgICBsb2cocmVzKTtcbiAgICAgICAgICAgICAgICAvLyB7XCJlcnJub1wiOjEwMDEsXCJlcnJNc2dcIjpcImNyZWF0ZUJMRUNvbm5lY3Rpb246ZmFpbCBwYXJhbWV0ZXIgZXJyb3I6IHBhcmFtZXRlci5kZXZpY2VJZCBzaG91bGQgYmUgU3RyaW5nIGluc3RlYWQgb2YgVW5kZWZpbmVkO1wifVxuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGVyckNvZGU6IHJlcy5lcnJDb2RlID8gcmVzLmVyckNvZGUgOiByZXMuZXJybm8sXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZzogcmVzLmVyck1zZ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFpc0FuZHJvaWQpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGpkLmNyZWF0ZUJMRUNvbm5lY3Rpb24oe1xuICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZDogZWNEZXZpY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyhyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhyZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8ge1wiZXJybm9cIjowLFwiZXJyQ29kZVwiOjAsXCJlcnJNc2dcIjpcImNyZWF0ZUJMRUNvbm5lY3Rpb246b2tcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyckNvZGU6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyTXNnOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZhaWwocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2cocmVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHtcImVycm5vXCI6MTAwMSxcImVyck1zZ1wiOlwiY3JlYXRlQkxFQ29ubmVjdGlvbjpmYWlsIHBhcmFtZXRlciBlcnJvcjogcGFyYW1ldGVyLmRldmljZUlkIHNob3VsZCBiZSBTdHJpbmcgaW5zdGVhZCBvZiBVbmRlZmluZWQ7XCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyQ29kZTogcmVzLmVyckNvZGUgPyByZXMuZXJyQ29kZSA6IHJlcy5lcnJubyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJNc2c6IHJlcy5lcnJNc2dcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCAxMDAwKVxuICAgICAgICB9XG4gICAgfSk7XG59O1xuY29uc3QgZ2V0QkxFRGV2aWNlU2VydmljZXMgPSAoKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgamQuZ2V0QkxFRGV2aWNlU2VydmljZXMoe1xuICAgICAgICAgICAgZGV2aWNlSWQ6IGVjRGV2aWNlSWQsXG4gICAgICAgICAgICBzdWNjZXNzKHJlcykge1xuICAgICAgICAgICAgICAgIGxvZyhyZXMpO1xuICAgICAgICAgICAgICAgIC8ve1wic2VydmljZXNcIjpbe1widXVpZFwiOlwiMDAwMEZGRjAtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCXCIsXCJpc1ByaW1hcnlcIjp0cnVlfV0sXCJlcnJDb2RlXCI6MCxcImVycm5vXCI6MCxcImVyck1zZ1wiOlwiZ2V0QkxFRGV2aWNlU2VydmljZXM6b2tcIn1cbiAgICAgICAgICAgICAgICAvLyB7XCJlcnJub1wiOjAsXCJkZXZpY2VJZFwiOlwiN0M3RTIwRjItQ0I3NS02REE4LUY4REYtRkZGNzAyQjBENjNGXCIsXCJzZXJ2aWNlc1wiOlt7XCJpc1ByaW1hcnlcIjp0cnVlLFwidXVpZFwiOlwiMDAwMEZGRjAtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCXCJ9XSxcImVyck1zZ1wiOlwiZ2V0QkxFRGV2aWNlU2VydmljZXM6b2tcIixcImVyckNvZGVcIjowfVxuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICBvazogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyQ29kZTogMCxcbiAgICAgICAgICAgICAgICAgICAgZXJyTXNnOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgc2VydmljZXM6IHJlcy5zZXJ2aWNlc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhaWwocmVzKSB7XG4gICAgICAgICAgICAgICAgbG9nKHJlcyk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyQ29kZTogcmVzLmVyckNvZGUsXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZzogcmVzLmVyck1zZ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5jb25zdCBnZXRCTEVEZXZpY2VDaGFyYWN0ZXJpc3RpY3MgPSBzZXJ2aWNlSWQgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGpkLmdldEJMRURldmljZUNoYXJhY3RlcmlzdGljcyh7XG4gICAgICAgICAgICBkZXZpY2VJZDogZWNEZXZpY2VJZCxcbiAgICAgICAgICAgIHNlcnZpY2VJZCxcbiAgICAgICAgICAgIHN1Y2Nlc3MocmVzKSB7XG4gICAgICAgICAgICAgICAgbG9nKHJlcyk7XG4gICAgICAgICAgICAgICAgLy8ge1wiY2hhcmFjdGVyaXN0aWNzXCI6W3tcInV1aWRcIjpcIjAwMDBGRkYyLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQlwiLFwiaGFuZGxlXCI6MyxcInByb3BlcnRpZXNcIjp7XCJyZWFkXCI6ZmFsc2UsXCJ3cml0ZVwiOnRydWUsXCJub3RpZnlcIjpmYWxzZSxcImluZGljYXRlXCI6ZmFsc2UsXCJ3cml0ZU5vUmVzcG9uc2VcIjp0cnVlLFwid3JpdGVEZWZhdWx0XCI6dHJ1ZX19LHtcInV1aWRcIjpcIjAwMDBGRkYxLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQlwiLFwiaGFuZGxlXCI6NSxcInByb3BlcnRpZXNcIjp7XCJyZWFkXCI6dHJ1ZSxcIndyaXRlXCI6dHJ1ZSxcIm5vdGlmeVwiOnRydWUsXCJpbmRpY2F0ZVwiOmZhbHNlLFwid3JpdGVOb1Jlc3BvbnNlXCI6dHJ1ZSxcIndyaXRlRGVmYXVsdFwiOnRydWV9fV0sXCJlcnJDb2RlXCI6MCxcImVycm5vXCI6MCxcImVyck1zZ1wiOlwiZ2V0QkxFRGV2aWNlQ2hhcmFjdGVyaXN0aWNzOm9rXCJ9XG4gICAgICAgICAgICAgICAgLy8ge1wiY2hhcmFjdGVyaXN0aWNzXCI6W3tcInByb3BlcnRpZXNcIjp7XCJ3cml0ZURlZmF1bHRcIjp0cnVlLFwibm90aWZ5XCI6ZmFsc2UsXCJ3cml0ZVwiOnRydWUsXCJpbmRpY2F0ZVwiOmZhbHNlLFwicmVhZFwiOmZhbHNlLFwid3JpdGVOb1Jlc3BvbnNlXCI6dHJ1ZX0sXCJ1dWlkXCI6XCIwMDAwRkZGMi0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkJcIn0se1wicHJvcGVydGllc1wiOntcIndyaXRlRGVmYXVsdFwiOnRydWUsXCJub3RpZnlcIjp0cnVlLFwid3JpdGVcIjp0cnVlLFwiaW5kaWNhdGVcIjpmYWxzZSxcInJlYWRcIjp0cnVlLFwid3JpdGVOb1Jlc3BvbnNlXCI6dHJ1ZX0sXCJ1dWlkXCI6XCIwMDAwRkZGMS0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkJcIn1dLFwiZGV2aWNlSWRcIjpcIjdDN0UyMEYyLUNCNzUtNkRBOC1GOERGLUZGRjcwMkIwRDYzRlwiLFwic2VydmljZUlkXCI6XCIwMDAwRkZGMC0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkJcIixcImVycm5vXCI6MCxcImVyck1zZ1wiOlwiZ2V0QkxFRGV2aWNlQ2hhcmFjdGVyaXN0aWNzOm9rXCIsXCJlcnJDb2RlXCI6MH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgb2s6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGVyckNvZGU6IDAsXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZzogJycsXG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcmlzdGljczogcmVzLmNoYXJhY3RlcmlzdGljc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhaWwocmVzKSB7XG4gICAgICAgICAgICAgICAgbG9nKHJlcyk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyQ29kZTogcmVzLmVyckNvZGUsXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZzogcmVzLmVyck1zZ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5jb25zdCBub3RpZnlCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlID0gKHNlcnZpY2VJZCwgY2hhcmFjdGVyaXN0aWNJZCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGpkLm5vdGlmeUJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2Uoe1xuICAgICAgICAgICAgc3RhdGU6IHRydWUsXG4gICAgICAgICAgICBkZXZpY2VJZDogZWNEZXZpY2VJZCxcbiAgICAgICAgICAgIHNlcnZpY2VJZCxcbiAgICAgICAgICAgIGNoYXJhY3RlcmlzdGljSWQsXG4gICAgICAgICAgICBzdWNjZXNzKHJlcykge1xuICAgICAgICAgICAgICAgIGxvZyhyZXMpO1xuICAgICAgICAgICAgICAgIC8vIHtcImVyckNvZGVcIjowLFwiZXJybm9cIjowLFwiZXJyTXNnXCI6XCJub3RpZnlCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlOm9rXCJ9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIG9rOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlcnJDb2RlOiAwLFxuICAgICAgICAgICAgICAgICAgICBlcnJNc2c6ICcnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmFpbChyZXMpIHtcbiAgICAgICAgICAgICAgICBsb2cocmVzKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBlcnJDb2RlOiByZXMuZXJyQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyTXNnOiByZXMuZXJyTXNnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcbmNvbnN0IHNldEJMRU1UVSA9IG10dSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgamQuc2V0QkxFTVRVKHtcbiAgICAgICAgICAgIGRldmljZUlkOiBlY0RldmljZUlkLFxuICAgICAgICAgICAgbXR1LFxuICAgICAgICAgICAgc3VjY2VzcyhyZXMpIHtcbiAgICAgICAgICAgICAgICBsb2cocmVzKTtcbiAgICAgICAgICAgICAgICAvLyB7XCJlcnJNc2dcIjpcInNldEJMRU1UVTpva1wiLFwiZXJybm9cIjowLFwiZXJyQ29kZVwiOjAsXCJtdHVcIjo1MH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgb2s6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGVyckNvZGU6IDAsXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZzogJydcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmYWlsKHJlcykge1xuICAgICAgICAgICAgICAgIGxvZyhyZXMpO1xuICAgICAgICAgICAgICAgIC8vIHtcImVyckNvZGVcIjotMSxcImVycm5vXCI6MTUwMDEwNCxcImVyck1zZ1wiOlwic2V0QkxFTVRVOmZhaWw6aW50ZXJuYWwgZXJyb3JcIn1cbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBlcnJDb2RlOiByZXMuZXJyQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyTXNnOiByZXMuZXJyTXNnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcbi8v5ZKM6K6+5aSH5bu656uL6L+e5o6lXG5jb25zdCBjcmVhdGVCTEVDb25uZWN0aW9uID0gYXN5bmMgaWQgPT4ge1xuICAgIGVjRGV2aWNlSWQgPSBpZDtcbiAgICBqZC5vZmZCTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2UoKTtcbiAgICBqZC5vbkJMRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZShhc3luYyByZXMgPT4ge1xuICAgICAgICBsb2cocmVzKTtcbiAgICAgICAgLy8ge1wiZGV2aWNlSWRcIjpcIkVDOjIyOjA1OjEzOjc4OjQ5XCIsXCJjb25uZWN0ZWRcIjp0cnVlfVxuICAgICAgICBpZiAocmVzLmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgY29uc3Qgc2VydmljZXNSZXN1bHQgPSBhd2FpdCBnZXRCTEVEZXZpY2VTZXJ2aWNlcygpO1xuICAgICAgICAgICAgaWYgKCFzZXJ2aWNlc1Jlc3VsdC5vaykge1xuICAgICAgICAgICAgICAgIGVjQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlQ2FsbGJhY2soc2VydmljZXNSZXN1bHQpO1xuICAgICAgICAgICAgICAgIGNsb3NlQkxFQ29ubmVjdGlvbigpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VydmljZSBvZiBzZXJ2aWNlc1Jlc3VsdC5zZXJ2aWNlcykge1xuICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlLnV1aWQudG9VcHBlckNhc2UoKSA9PT0gZWNHYXR0U2VydmVyVVVJRE9wdGlvbjEgfHwgc2VydmljZS51dWlkLnRvVXBwZXJDYXNlKCkgPT09IGVjR2F0dFNlcnZlclVVSURPcHRpb24yKSB7XG4gICAgICAgICAgICAgICAgICAgIGVjR2F0dFNlcnZlclVVSUQgPSBzZXJ2aWNlLnV1aWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJhY3RlcmlzdGljc1Jlc3VsdCA9IGF3YWl0IGdldEJMRURldmljZUNoYXJhY3RlcmlzdGljcyhzZXJ2aWNlLnV1aWQpO1xuICAgICAgICAgICAgICAgIGlmICghY2hhcmFjdGVyaXN0aWNzUmVzdWx0Lm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIGVjQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlQ2FsbGJhY2soY2hhcmFjdGVyaXN0aWNzUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VCTEVDb25uZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjaGFyYWN0ZXJpc3RpYyBvZiBjaGFyYWN0ZXJpc3RpY3NSZXN1bHQuY2hhcmFjdGVyaXN0aWNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJpc3RpYy5wcm9wZXJ0aWVzICYmIGNoYXJhY3RlcmlzdGljLnByb3BlcnRpZXMubm90aWZ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3RpZnlSZXN1bHQgPSBhd2FpdCBub3RpZnlCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlKHNlcnZpY2UudXVpZCwgY2hhcmFjdGVyaXN0aWMudXVpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5vdGlmeVJlc3VsdC5vaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlQ2FsbGJhY2soe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyckNvZGU6IDMwMDAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJNc2c6ICdub3RpZnkgZXJyb3InXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VCTEVDb25uZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJpc3RpYy51dWlkLnRvVXBwZXJDYXNlKCkgPT09IGVjR2F0dENoYXJhY3RlcmlzdGljV3JpdGVVVUlET3B0aW9uMSB8fCBjaGFyYWN0ZXJpc3RpYy51dWlkLnRvVXBwZXJDYXNlKCkgPT09IGVjR2F0dENoYXJhY3RlcmlzdGljV3JpdGVVVUlET3B0aW9uMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWNHYXR0Q2hhcmFjdGVyaXN0aWNXcml0ZVVVSUQgPSBjaGFyYWN0ZXJpc3RpYy51dWlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzQW5kcm9pZCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHNldEJMRU1UVSgyNDcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWNCTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2VDYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgb2s6IHRydWUsXG4gICAgICAgICAgICAgICAgZXJyQ29kZTogMCxcbiAgICAgICAgICAgICAgICBlcnJNc2c6ICcnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVjQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlQ2FsbGJhY2soe1xuICAgICAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJDb2RlOiAwLFxuICAgICAgICAgICAgICAgIGVyck1zZzogJ2Rpc2Nvbm5lY3QnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IF9jcmVhdGVCTEVDb25uZWN0aW9uKCk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgZWNCTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2VDYWxsYmFjayhyZXMpO1xuICAgIH1cbn07XG4vL+WFs+mXreW9k+WJjei/nuaOpVxuY29uc3QgY2xvc2VCTEVDb25uZWN0aW9uID0gKCkgPT4ge1xuICAgIGpkLmNsb3NlQkxFQ29ubmVjdGlvbih7XG4gICAgICAgIGRldmljZUlkOiBlY0RldmljZUlkLFxuICAgICAgICBjb21wbGV0ZShyZXMpIHtcbiAgICAgICAgICAgIGxvZyhyZXMpO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuY29uc3Qgb25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlID0gY2IgPT4ge1xuICAgIGpkLm9mZkJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2UoKTtcbiAgICBqZC5vbkJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2UocmVzID0+IHtcbiAgICAgICAgbG9nKHJlcyk7XG4gICAgICAgIGxldCB4ID0gbmV3IFVpbnQ4QXJyYXkocmVzLnZhbHVlKTtcbiAgICAgICAgbG9nKHgpO1xuICAgICAgICBsZXQgc3RyID0gdXRmOEJ5dGVzVG9TdHIoeCk7XG4gICAgICAgIGxldCBzdHJIZXggPSAnJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzdHJIZXggPSBzdHJIZXggKyB4W2ldLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nKHN0cik7XG4gICAgICAgIGxvZyhzdHJIZXgpO1xuICAgICAgICBjYihzdHIsIHN0ckhleCk7XG4gICAgfSk7XG59O1xuY29uc3QgX3dyaXRlQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZSA9IGJ1ZmZlciA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgamQud3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlKHtcbiAgICAgICAgICAgIGRldmljZUlkOiBlY0RldmljZUlkLFxuICAgICAgICAgICAgc2VydmljZUlkOiBlY0dhdHRTZXJ2ZXJVVUlELFxuICAgICAgICAgICAgY2hhcmFjdGVyaXN0aWNJZDogZWNHYXR0Q2hhcmFjdGVyaXN0aWNXcml0ZVVVSUQsXG4gICAgICAgICAgICB2YWx1ZTogYnVmZmVyLFxuICAgICAgICAgICAgd3JpdGVUeXBlOiAnd3JpdGVOb1Jlc3BvbnNlJyxcbiAgICAgICAgICAgIHN1Y2Nlc3MocmVzKSB7XG4gICAgICAgICAgICAgICAgbG9nKHJlcyk7XG4gICAgICAgICAgICAgICAgLy8ge1wiZXJybm9cIjowLFwiZXJyQ29kZVwiOjAsXCJlcnJNc2dcIjpcIndyaXRlQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZTpva1wifVxuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICBvazogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyQ29kZTogMCxcbiAgICAgICAgICAgICAgICAgICAgZXJyTXNnOiAnJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhaWwocmVzKSB7XG4gICAgICAgICAgICAgICAgbG9nKHJlcyk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyQ29kZTogcmVzLmVyckNvZGUsXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZzogcmVzLmVyck1zZ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5jb25zdCB3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWUgPSBhc3luYyAoc3RyLCBpc0hleCkgPT4ge1xuICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSByZXR1cm4ge1xuICAgICAgICBvazogZmFsc2UsXG4gICAgICAgIGVyckNvZGU6IDMwMDAwLFxuICAgICAgICBlcnJNc2c6ICdkYXRhIGlzIG51bGwnXG4gICAgfTtcbiAgICBsZXQgYnVmZmVyO1xuICAgIGlmIChpc0hleCkge1xuICAgICAgICBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCAvIDIpO1xuICAgICAgICBsZXQgeCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgeFtpXSA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMiAqIGksIDIpLCAxNik7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHJUb1V0ZjhCeXRlcyhzdHIpKS5idWZmZXI7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBfd3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlKGJ1ZmZlcik7XG59O1xuY29uc3QgdXRmOEJ5dGVzVG9TdHIgPSB1dGY4Qnl0ZXMgPT4ge1xuICAgIGxldCB1bmljb2RlU3RyID0gJyc7XG4gICAgZm9yIChsZXQgcG9zID0gMDsgcG9zIDwgdXRmOEJ5dGVzLmxlbmd0aDspIHtcbiAgICAgICAgbGV0IGZsYWcgPSB1dGY4Qnl0ZXNbcG9zXTtcbiAgICAgICAgbGV0IHVuaWNvZGUgPSAwO1xuICAgICAgICBpZiAoZmxhZyA+Pj4gNyA9PT0gMCkge1xuICAgICAgICAgICAgdW5pY29kZVN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHV0ZjhCeXRlc1twb3NdKTtcbiAgICAgICAgICAgIHBvcyArPSAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVsc2UgaWYgKChmbGFnICYgMHhGQykgPT09IDB4RkMpIHtcbiAgICAgICAgLy8gICAgIHVuaWNvZGUgPSAodXRmOEJ5dGVzW3Bvc10gJiAweDMpIDw8IDMwXG4gICAgICAgIC8vICAgICB1bmljb2RlIHw9ICh1dGY4Qnl0ZXNbcG9zICsgMV0gJiAweDNGKSA8PCAyNFxuICAgICAgICAvLyAgICAgdW5pY29kZSB8PSAodXRmOEJ5dGVzW3BvcyArIDJdICYgMHgzRikgPDwgMThcbiAgICAgICAgLy8gICAgIHVuaWNvZGUgfD0gKHV0ZjhCeXRlc1twb3MgKyAzXSAmIDB4M0YpIDw8IDEyXG4gICAgICAgIC8vICAgICB1bmljb2RlIHw9ICh1dGY4Qnl0ZXNbcG9zICsgNF0gJiAweDNGKSA8PCA2XG4gICAgICAgIC8vICAgICB1bmljb2RlIHw9ICh1dGY4Qnl0ZXNbcG9zICsgNV0gJiAweDNGKVxuICAgICAgICAvLyAgICAgdW5pY29kZVN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGUpXG4gICAgICAgIC8vICAgICBwb3MgKz0gNlxuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGVsc2UgaWYgKChmbGFnICYgMHhGOCkgPT09IDB4RjgpIHtcbiAgICAgICAgLy8gICAgIHVuaWNvZGUgPSAodXRmOEJ5dGVzW3Bvc10gJiAweDcpIDw8IDI0XG4gICAgICAgIC8vICAgICB1bmljb2RlIHw9ICh1dGY4Qnl0ZXNbcG9zICsgMV0gJiAweDNGKSA8PCAxOFxuICAgICAgICAvLyAgICAgdW5pY29kZSB8PSAodXRmOEJ5dGVzW3BvcyArIDJdICYgMHgzRikgPDwgMTJcbiAgICAgICAgLy8gICAgIHVuaWNvZGUgfD0gKHV0ZjhCeXRlc1twb3MgKyAzXSAmIDB4M0YpIDw8IDZcbiAgICAgICAgLy8gICAgIHVuaWNvZGUgfD0gKHV0ZjhCeXRlc1twb3MgKyA0XSAmIDB4M0YpXG4gICAgICAgIC8vICAgICB1bmljb2RlU3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodW5pY29kZSlcbiAgICAgICAgLy8gICAgIHBvcyArPSA1XG4gICAgICAgIC8vIH1cbiAgICAgICAgZWxzZSBpZiAoKGZsYWcgJiAweGYwKSA9PT0gMHhmMCkge1xuICAgICAgICAgICAgdW5pY29kZSA9ICh1dGY4Qnl0ZXNbcG9zXSAmIDB4ZikgPDwgMTg7XG4gICAgICAgICAgICB1bmljb2RlIHw9ICh1dGY4Qnl0ZXNbcG9zICsgMV0gJiAweDNmKSA8PCAxMjtcbiAgICAgICAgICAgIHVuaWNvZGUgfD0gKHV0ZjhCeXRlc1twb3MgKyAyXSAmIDB4M2YpIDw8IDY7XG4gICAgICAgICAgICB1bmljb2RlIHw9IHV0ZjhCeXRlc1twb3MgKyAzXSAmIDB4M2Y7XG4gICAgICAgICAgICB1bmljb2RlU3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodW5pY29kZSk7XG4gICAgICAgICAgICBwb3MgKz0gNDtcbiAgICAgICAgfSBlbHNlIGlmICgoZmxhZyAmIDB4ZTApID09PSAweGUwKSB7XG4gICAgICAgICAgICB1bmljb2RlID0gKHV0ZjhCeXRlc1twb3NdICYgMHgxZikgPDwgMTI7XG4gICAgICAgICAgICB1bmljb2RlIHw9ICh1dGY4Qnl0ZXNbcG9zICsgMV0gJiAweDNmKSA8PCA2O1xuICAgICAgICAgICAgdW5pY29kZSB8PSB1dGY4Qnl0ZXNbcG9zICsgMl0gJiAweDNmO1xuICAgICAgICAgICAgdW5pY29kZVN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGUpO1xuICAgICAgICAgICAgcG9zICs9IDM7XG4gICAgICAgIH0gZWxzZSBpZiAoKGZsYWcgJiAweGMwKSA9PT0gMHhjMCkge1xuICAgICAgICAgICAgLy8xMTBcbiAgICAgICAgICAgIHVuaWNvZGUgPSAodXRmOEJ5dGVzW3Bvc10gJiAweDNmKSA8PCA2O1xuICAgICAgICAgICAgdW5pY29kZSB8PSB1dGY4Qnl0ZXNbcG9zICsgMV0gJiAweDNmO1xuICAgICAgICAgICAgdW5pY29kZVN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGUpO1xuICAgICAgICAgICAgcG9zICs9IDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1bmljb2RlU3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodXRmOEJ5dGVzW3Bvc10pO1xuICAgICAgICAgICAgcG9zICs9IDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuaWNvZGVTdHI7XG59O1xuY29uc3Qgc3RyVG9VdGY4Qnl0ZXMgPSBzdHIgPT4ge1xuICAgIGxldCBieXRlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGxldCBjb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjb2RlID49IDB4MTAwMDAgJiYgY29kZSA8PSAweDEwZmZmZikge1xuICAgICAgICAgICAgYnl0ZXMucHVzaChjb2RlID4+IDE4IHwgMHhmMCk7IC8vIOesrOS4gOS4quWtl+iKglxuICAgICAgICAgICAgYnl0ZXMucHVzaChjb2RlID4+IDEyICYgMHgzZiB8IDB4ODApO1xuICAgICAgICAgICAgYnl0ZXMucHVzaChjb2RlID4+IDYgJiAweDNmIHwgMHg4MCk7XG4gICAgICAgICAgICBieXRlcy5wdXNoKGNvZGUgJiAweDNmIHwgMHg4MCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA+PSAweDgwMCAmJiBjb2RlIDw9IDB4ZmZmZikge1xuICAgICAgICAgICAgYnl0ZXMucHVzaChjb2RlID4+IDEyIHwgMHhlMCk7XG4gICAgICAgICAgICBieXRlcy5wdXNoKGNvZGUgPj4gNiAmIDB4M2YgfCAweDgwKTtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goY29kZSAmIDB4M2YgfCAweDgwKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID49IDB4ODAgJiYgY29kZSA8PSAweDdmZikge1xuICAgICAgICAgICAgYnl0ZXMucHVzaChjb2RlID4+IDYgfCAweGMwKTtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goY29kZSAmIDB4M2YgfCAweDgwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goY29kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzO1xufTtcbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG9uQmx1ZXRvb3RoQWRhcHRlclN0YXRlQ2hhbmdlLFxuICAgIG9wZW5CbHVldG9vdGhBZGFwdGVyLFxuXG4gICAgb25CbHVldG9vdGhEZXZpY2VGb3VuZCxcbiAgICBzdGFydEJsdWV0b290aERldmljZXNEaXNjb3ZlcnksXG4gICAgc3RvcEJsdWV0b290aERldmljZXNEaXNjb3ZlcnksXG5cbiAgICBvbkJMRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZSxcbiAgICBjcmVhdGVCTEVDb25uZWN0aW9uLFxuICAgIGNsb3NlQkxFQ29ubmVjdGlvbixcblxuICAgIG9uQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSxcbiAgICB3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWVcbn07IiwiLy8gVE9ETyhCYWJlbCA4KTogUmVtb3ZlIHRoaXMgZmlsZS5cblxudmFyIHJ1bnRpbWUgPSByZXF1aXJlKCdAYmFiZWwvcnVudGltZS9oZWxwZXJzL3JlZ2VuZXJhdG9yUnVudGltZScpKClcbm1vZHVsZS5leHBvcnRzID0gcnVudGltZVxuIiwidmFyIF90eXBlb2YgPSByZXF1aXJlKFwiLi90eXBlb2YuanNcIilbXCJkZWZhdWx0XCJdO1xuZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7IC8qISByZWdlbmVyYXRvci1ydW50aW1lIC0tIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLiAtLSBsaWNlbnNlIChNSVQpOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvYmxvYi9tYWluL0xJQ0VOU0UgKi9cbiAgbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lID0gZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHtcbiAgICByZXR1cm4gZXhwb3J0cztcbiAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzO1xuICB2YXIgZXhwb3J0cyA9IHt9LFxuICAgIE9wID0gT2JqZWN0LnByb3RvdHlwZSxcbiAgICBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eSxcbiAgICBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBmdW5jdGlvbiAob2JqLCBrZXksIGRlc2MpIHtcbiAgICAgIG9ialtrZXldID0gZGVzYy52YWx1ZTtcbiAgICB9LFxuICAgICRTeW1ib2wgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCA6IHt9LFxuICAgIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIixcbiAgICBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCIsXG4gICAgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuICBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwXG4gICAgfSksIG9ialtrZXldO1xuICB9XG4gIHRyeSB7XG4gICAgZGVmaW5lKHt9LCBcIlwiKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3IsXG4gICAgICBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSksXG4gICAgICBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShnZW5lcmF0b3IsIFwiX2ludm9rZVwiLCB7XG4gICAgICB2YWx1ZTogbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KVxuICAgIH0pLCBnZW5lcmF0b3I7XG4gIH1cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwibm9ybWFsXCIsXG4gICAgICAgIGFyZzogZm4uY2FsbChvYmosIGFyZylcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcInRocm93XCIsXG4gICAgICAgIGFyZzogZXJyXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBleHBvcnRzLndyYXAgPSB3cmFwO1xuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIGRlZmluZShJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSk7XG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZixcbiAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiYgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkgJiYgKEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUpO1xuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvciwgUHJvbWlzZUltcGwpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAoXCJ0aHJvd1wiICE9PSByZWNvcmQudHlwZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZyxcbiAgICAgICAgICB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlICYmIFwib2JqZWN0XCIgPT0gX3R5cGVvZih2YWx1ZSkgJiYgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSA/IFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KSA6IFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24gKHVud3JhcHBlZCkge1xuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZCwgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gaW52b2tlKFwidGhyb3dcIiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgIH1cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuICAgIGRlZmluZVByb3BlcnR5KHRoaXMsIFwiX2ludm9rZVwiLCB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUobWV0aG9kLCBhcmcpIHtcbiAgICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9IHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoXCJleGVjdXRpbmdcIiA9PT0gc3RhdGUpIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICBpZiAoXCJjb21wbGV0ZWRcIiA9PT0gc3RhdGUpIHtcbiAgICAgICAgaWYgKFwidGhyb3dcIiA9PT0gbWV0aG9kKSB0aHJvdyBhcmc7XG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnRleHQubWV0aG9kID0gbWV0aG9kLCBjb250ZXh0LmFyZyA9IGFyZzs7KSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwibmV4dFwiID09PSBjb250ZXh0Lm1ldGhvZCkgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO2Vsc2UgaWYgKFwidGhyb3dcIiA9PT0gY29udGV4dC5tZXRob2QpIHtcbiAgICAgICAgICBpZiAoXCJzdXNwZW5kZWRTdGFydFwiID09PSBzdGF0ZSkgdGhyb3cgc3RhdGUgPSBcImNvbXBsZXRlZFwiLCBjb250ZXh0LmFyZztcbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcbiAgICAgICAgfSBlbHNlIFwicmV0dXJuXCIgPT09IGNvbnRleHQubWV0aG9kICYmIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgc3RhdGUgPSBcImV4ZWN1dGluZ1wiO1xuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChcIm5vcm1hbFwiID09PSByZWNvcmQudHlwZSkge1xuICAgICAgICAgIGlmIChzdGF0ZSA9IGNvbnRleHQuZG9uZSA/IFwiY29tcGxldGVkXCIgOiBcInN1c3BlbmRlZFlpZWxkXCIsIHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXCJ0aHJvd1wiID09PSByZWNvcmQudHlwZSAmJiAoc3RhdGUgPSBcImNvbXBsZXRlZFwiLCBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIiwgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kTmFtZSA9IGNvbnRleHQubWV0aG9kLFxuICAgICAgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbbWV0aG9kTmFtZV07XG4gICAgaWYgKHVuZGVmaW5lZCA9PT0gbWV0aG9kKSByZXR1cm4gY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIFwidGhyb3dcIiA9PT0gbWV0aG9kTmFtZSAmJiBkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXSAmJiAoY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCwgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCksIFwidGhyb3dcIiA9PT0gY29udGV4dC5tZXRob2QpIHx8IFwicmV0dXJuXCIgIT09IG1ldGhvZE5hbWUgJiYgKGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiLCBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICdcIiArIG1ldGhvZE5hbWUgKyBcIicgbWV0aG9kXCIpKSwgQ29udGludWVTZW50aW5lbDtcbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuICAgIGlmIChcInRocm93XCIgPT09IHJlY29yZC50eXBlKSByZXR1cm4gY29udGV4dC5tZXRob2QgPSBcInRocm93XCIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZywgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWw7XG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuICAgIHJldHVybiBpbmZvID8gaW5mby5kb25lID8gKGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlLCBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jLCBcInJldHVyblwiICE9PSBjb250ZXh0Lm1ldGhvZCAmJiAoY29udGV4dC5tZXRob2QgPSBcIm5leHRcIiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQpLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbCkgOiBpbmZvIDogKGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiLCBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKSwgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWwpO1xuICB9XG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0ge1xuICAgICAgdHJ5TG9jOiBsb2NzWzBdXG4gICAgfTtcbiAgICAxIGluIGxvY3MgJiYgKGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXSksIDIgaW4gbG9jcyAmJiAoZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl0sIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiLCBkZWxldGUgcmVjb3JkLmFyZywgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3tcbiAgICAgIHRyeUxvYzogXCJyb290XCJcbiAgICB9XSwgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpLCB0aGlzLnJlc2V0KCEwKTtcbiAgfVxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgaXRlcmFibGUubmV4dCkgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsXG4gICAgICAgICAgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICBmb3IgKDsgKytpIDwgaXRlcmFibGUubGVuZ3RoOykge1xuICAgICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSByZXR1cm4gbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldLCBuZXh0LmRvbmUgPSAhMSwgbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXh0LnZhbHVlID0gdW5kZWZpbmVkLCBuZXh0LmRvbmUgPSAhMCwgbmV4dDtcbiAgICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGRvbmVSZXN1bHRcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICBkb25lOiAhMFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmVQcm9wZXJ0eShHcCwgXCJjb25zdHJ1Y3RvclwiLCB7XG4gICAgdmFsdWU6IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLFxuICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgfSksIGRlZmluZVByb3BlcnR5KEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBcImNvbnN0cnVjdG9yXCIsIHtcbiAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb24sXG4gICAgY29uZmlndXJhYmxlOiAhMFxuICB9KSwgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpLCBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAoZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGdlbkZ1biAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuICEhY3RvciAmJiAoY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHwgXCJHZW5lcmF0b3JGdW5jdGlvblwiID09PSAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpKTtcbiAgfSwgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24gKGdlbkZ1bikge1xuICAgIHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAoZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmUoZ2VuRnVuLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKSksIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKSwgZ2VuRnVuO1xuICB9LCBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24gKGFyZykge1xuICAgIHJldHVybiB7XG4gICAgICBfX2F3YWl0OiBhcmdcbiAgICB9O1xuICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGFzeW5jSXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSksIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3IsIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbiAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QsIFByb21pc2VJbXBsKSB7XG4gICAgdm9pZCAwID09PSBQcm9taXNlSW1wbCAmJiAoUHJvbWlzZUltcGwgPSBQcm9taXNlKTtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLCBQcm9taXNlSW1wbCk7XG4gICAgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKSA/IGl0ZXIgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgIH0pO1xuICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApLCBkZWZpbmUoR3AsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvclwiKSwgZGVmaW5lKEdwLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KSwgZGVmaW5lKEdwLCBcInRvU3RyaW5nXCIsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfSksIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB2YXIgb2JqZWN0ID0gT2JqZWN0KHZhbCksXG4gICAgICBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiBrZXlzLnJldmVyc2UoKSwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGZvciAoOyBrZXlzLmxlbmd0aDspIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSByZXR1cm4gbmV4dC52YWx1ZSA9IGtleSwgbmV4dC5kb25lID0gITEsIG5leHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7XG4gICAgfTtcbiAgfSwgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXMsIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldChza2lwVGVtcFJlc2V0KSB7XG4gICAgICBpZiAodGhpcy5wcmV2ID0gMCwgdGhpcy5uZXh0ID0gMCwgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZCwgdGhpcy5kb25lID0gITEsIHRoaXMuZGVsZWdhdGUgPSBudWxsLCB0aGlzLm1ldGhvZCA9IFwibmV4dFwiLCB0aGlzLmFyZyA9IHVuZGVmaW5lZCwgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSksICFza2lwVGVtcFJlc2V0KSBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgXCJ0XCIgPT09IG5hbWUuY2hhckF0KDApICYmIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmICFpc05hTigrbmFtZS5zbGljZSgxKSkgJiYgKHRoaXNbbmFtZV0gPSB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIHRoaXMuZG9uZSA9ICEwO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSB0aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjtcbiAgICAgIGlmIChcInRocm93XCIgPT09IHJvb3RSZWNvcmQudHlwZSkgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uIGRpc3BhdGNoRXhjZXB0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJldHVybiByZWNvcmQudHlwZSA9IFwidGhyb3dcIiwgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbiwgY29udGV4dC5uZXh0ID0gbG9jLCBjYXVnaHQgJiYgKGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCIsIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkKSwgISFjYXVnaHQ7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXSxcbiAgICAgICAgICByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICBpZiAoXCJyb290XCIgPT09IGVudHJ5LnRyeUxvYykgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKSxcbiAgICAgICAgICAgIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgITApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc0ZpbmFsbHkpIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uIGFicnVwdCh0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJiBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZpbmFsbHlFbnRyeSAmJiAoXCJicmVha1wiID09PSB0eXBlIHx8IFwiY29udGludWVcIiA9PT0gdHlwZSkgJiYgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiYgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jICYmIChmaW5hbGx5RW50cnkgPSBudWxsKTtcbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmV0dXJuIHJlY29yZC50eXBlID0gdHlwZSwgcmVjb3JkLmFyZyA9IGFyZywgZmluYWxseUVudHJ5ID8gKHRoaXMubWV0aG9kID0gXCJuZXh0XCIsIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jLCBDb250aW51ZVNlbnRpbmVsKSA6IHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICB9LFxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZShyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAoXCJ0aHJvd1wiID09PSByZWNvcmQudHlwZSkgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIHJldHVybiBcImJyZWFrXCIgPT09IHJlY29yZC50eXBlIHx8IFwiY29udGludWVcIiA9PT0gcmVjb3JkLnR5cGUgPyB0aGlzLm5leHQgPSByZWNvcmQuYXJnIDogXCJyZXR1cm5cIiA9PT0gcmVjb3JkLnR5cGUgPyAodGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnLCB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCIsIHRoaXMubmV4dCA9IFwiZW5kXCIpIDogXCJub3JtYWxcIiA9PT0gcmVjb3JkLnR5cGUgJiYgYWZ0ZXJMb2MgJiYgKHRoaXMubmV4dCA9IGFmdGVyTG9jKSwgQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuICAgIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykgcmV0dXJuIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpLCByZXNldFRyeUVudHJ5KGVudHJ5KSwgQ29udGludWVTZW50aW5lbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24gX2NhdGNoKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChcInRocm93XCIgPT09IHJlY29yZC50eXBlKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbiBkZWxlZ2F0ZVlpZWxkKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH0sIFwibmV4dFwiID09PSB0aGlzLm1ldGhvZCAmJiAodGhpcy5hcmcgPSB1bmRlZmluZWQpLCBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfSwgZXhwb3J0cztcbn1cbm1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHtcbiAgdHJ5IHtcbiAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZWplY3QoZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaW5mby5kb25lKSB7XG4gICAgcmVzb2x2ZSh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpO1xuICB9XG59XG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIGVycik7XG4gICAgICB9XG4gICAgICBfbmV4dCh1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBfYXN5bmNUb0dlbmVyYXRvciwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyJdLCJzb3VyY2VSb290IjoiIn0=