module.exports = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = "/"; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 55); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports) { module.exports = require("react"); /***/ }), /* 1 */ /***/ (function(module, exports) { module.exports = require("winston"); /***/ }), /* 2 */ /***/ (function(module, exports) { module.exports = require("react-redux"); /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function SiteConfig() { var _this = this; this.analytics = { googleId: 'default' }; this.assetDefaults = { description: 'An asset published on Spee.ch', thumbnail: 'https://spee.ch/assets/img/video_thumb_default.png', title: 'Spee.ch' }; this.auth = { sessionKey: 'default' }; this.componentsConfig = { components: {}, containers: {}, pages: {} }; this.details = { description: 'Open-source, decentralized image and video sharing.', host: 'default', port: 3000, title: 'Spee.ch', twitter: '@spee_ch' }; this.publishing = { additionalClaimAddresses: [], disabled: false, disabledMessage: 'Please check back soon.', primaryClaimAddress: 'default', thumbnailChannel: 'default', thumbnailChannelId: 'default', uploadDirectory: '/home/lbry/Uploads' }; this.configure = function (config) { if (!config) { return console.log('No site config received.'); } var analytics = config.analytics, assetDefaults = config.assetDefaults, auth = config.auth, componentsConfig = config.componentsConfig, details = config.details, publishing = config.publishing; _this.analytics = analytics; _this.assetDefaults = assetDefaults; _this.auth = auth; _this.details = details; _this.publishing = publishing; _this.componentsConfig = componentsConfig; }; }; module.exports = new SiteConfig(); /***/ }), /* 4 */ /***/ (function(module, exports) { module.exports = require("react-router-dom"); /***/ }), /* 5 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var Sequelize = __webpack_require__(32); var logger = __webpack_require__(1); console.log('exporting sequelize models'); var _require = __webpack_require__(29), database = _require.database, username = _require.username, password = _require.password; var db = {}; // set sequelize options var sequelize = new Sequelize(database, username, password, { host: 'localhost', dialect: 'mysql', dialectOptions: { decimalNumbers: true }, // fix to ensure DECIMAL will not be stored as a string logging: false, pool: { max: 5, min: 0, idle: 10000, acquire: 10000 } }); // establish mysql connection sequelize.authenticate().then(function () { logger.info('Sequelize has established mysql connection successfully.'); }).catch(function (err) { logger.error('Sequelize was unable to connect to the database:', err); }); // manually add each model to the db object var Certificate = __webpack_require__(72); var Channel = __webpack_require__(73); var Claim = __webpack_require__(74); var File = __webpack_require__(75); var Request = __webpack_require__(76); var User = __webpack_require__(77); db['Certificate'] = sequelize.import('Certificate', Certificate); db['Channel'] = sequelize.import('Channel', Channel); db['Claim'] = sequelize.import('Claim', Claim); db['File'] = sequelize.import('File', File); db['Request'] = sequelize.import('Request', Request); db['User'] = sequelize.import('User', User); // run model.association for each model in the db object that has an association Object.keys(db).forEach(function (modelName) { if (db[modelName].associate) { logger.info('Associating model:', modelName); db[modelName].associate(db); } }); db.sequelize = sequelize; db.Sequelize = Sequelize; // add an 'upsert' method to the db object db.upsert = function (Model, values, condition, tableName) { return Model.findOne({ where: condition }).then(function (obj) { if (obj) { // update logger.debug('updating record in db.' + tableName); return obj.update(values); } else { // insert logger.debug('creating record in db.' + tableName); return Model.create(values); } }).catch(function (error) { logger.error(tableName + '.upsert error', error); throw error; }); }; module.exports = db; /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); exports.default = request; __webpack_require__(93); /** * Parses the JSON returned by a network request * * @param {object} response A response from a network request * * @return {object} The parsed JSON from the request */ function parseJSON(response) { if (response.status === 204 || response.status === 205) { return null; } return response.json(); } /** * Parses the status returned by a network request * * @param {object} response A response from a network request * @param {object} response The parsed JSON from the network request * * @return {object | undefined} Returns object with status and statusText, or undefined */ function checkStatus(response, jsonResponse) { if (response.status >= 200 && response.status < 300) { return jsonResponse; } var error = new Error(jsonResponse.message); error.response = response; throw error; } /** * Requests a URL, returning a promise * * @param {string} url The URL we want to request * @param {object} [options] The options we want to pass to "fetch" * * @return {object} The response data */ function request(url, options) { return fetch(url, options).then(function (response) { return Promise.all([response, parseJSON(response)]); }).then(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), response = _ref2[0], jsonResponse = _ref2[1]; return checkStatus(response, jsonResponse); }); } /***/ }), /* 7 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.onHandleShowPageUri = onHandleShowPageUri; exports.onRequestError = onRequestError; exports.onNewChannelRequest = onNewChannelRequest; exports.onNewAssetRequest = onNewAssetRequest; exports.onRequestUpdate = onRequestUpdate; exports.addRequestToRequestList = addRequestToRequestList; exports.addAssetToAssetList = addAssetToAssetList; exports.addNewChannelToChannelList = addNewChannelToChannelList; exports.onUpdateChannelClaims = onUpdateChannelClaims; exports.updateChannelClaims = updateChannelClaims; exports.fileRequested = fileRequested; exports.updateFileAvailability = updateFileAvailability; exports.updateDisplayAssetError = updateDisplayAssetError; var _show_action_types = __webpack_require__(9); var actions = _interopRequireWildcard(_show_action_types); var _show_request_types = __webpack_require__(51); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } // basic request parsing function onHandleShowPageUri(params) { return { type: actions.HANDLE_SHOW_URI, data: params }; }; function onRequestError(error) { return { type: actions.REQUEST_ERROR, data: error }; }; function onNewChannelRequest(channelName, channelId) { var requestType = _show_request_types.CHANNEL; var requestId = 'cr#' + channelName + '#' + channelId; return { type: actions.CHANNEL_REQUEST_NEW, data: { requestType: requestType, requestId: requestId, channelName: channelName, channelId: channelId } }; }; function onNewAssetRequest(name, id, channelName, channelId, extension) { var requestType = extension ? _show_request_types.ASSET_LITE : _show_request_types.ASSET_DETAILS; var requestId = 'ar#' + name + '#' + id + '#' + channelName + '#' + channelId; return { type: actions.ASSET_REQUEST_NEW, data: { requestType: requestType, requestId: requestId, name: name, modifier: { id: id, channel: { name: channelName, id: channelId } } } }; }; function onRequestUpdate(requestType, requestId) { return { type: actions.REQUEST_UPDATE, data: { requestType: requestType, requestId: requestId } }; }; function addRequestToRequestList(id, error, key) { return { type: actions.REQUEST_LIST_ADD, data: { id: id, error: error, key: key } }; }; // asset actions function addAssetToAssetList(id, error, name, claimId, shortId, claimData) { return { type: actions.ASSET_ADD, data: { id: id, error: error, name: name, claimId: claimId, shortId: shortId, claimData: claimData } }; } // channel actions function addNewChannelToChannelList(id, name, shortId, longId, claimsData) { return { type: actions.CHANNEL_ADD, data: { id: id, name: name, shortId: shortId, longId: longId, claimsData: claimsData } }; }; function onUpdateChannelClaims(channelKey, name, longId, page) { return { type: actions.CHANNEL_CLAIMS_UPDATE_ASYNC, data: { channelKey: channelKey, name: name, longId: longId, page: page } }; }; function updateChannelClaims(channelListId, claimsData) { return { type: actions.CHANNEL_CLAIMS_UPDATE_SUCCESS, data: { channelListId: channelListId, claimsData: claimsData } }; }; // display a file function fileRequested(name, claimId) { return { type: actions.FILE_REQUESTED, data: { name: name, claimId: claimId } }; }; function updateFileAvailability(status) { return { type: actions.FILE_AVAILABILITY_UPDATE, data: status }; }; function updateDisplayAssetError(error) { return { type: actions.DISPLAY_ASSET_ERROR, data: error }; }; /***/ }), /* 8 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(2); var _channel = __webpack_require__(24); var _publish = __webpack_require__(25); var _view = __webpack_require__(95); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var channel = _ref.channel, site = _ref.site; return { channelName: channel.loggedInChannel.name, channelShortId: channel.loggedInChannel.shortId, channelLongId: channel.loggedInChannel.longId, siteDescription: site.description }; }; var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { onChannelLogin: function onChannelLogin(name, shortId, longId) { dispatch((0, _channel.updateLoggedInChannel)(name, shortId, longId)); dispatch((0, _publish.updateSelectedChannel)(name)); }, onChannelLogout: function onChannelLogout() { dispatch((0, _channel.updateLoggedInChannel)(null, null, null)); } }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 9 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); // request actions var HANDLE_SHOW_URI = exports.HANDLE_SHOW_URI = 'HANDLE_SHOW_URI'; var REQUEST_ERROR = exports.REQUEST_ERROR = 'REQUEST_ERROR'; var REQUEST_UPDATE = exports.REQUEST_UPDATE = 'REQUEST_UPDATE'; var ASSET_REQUEST_NEW = exports.ASSET_REQUEST_NEW = 'ASSET_REQUEST_NEW'; var CHANNEL_REQUEST_NEW = exports.CHANNEL_REQUEST_NEW = 'CHANNEL_REQUEST_NEW'; var REQUEST_LIST_ADD = exports.REQUEST_LIST_ADD = 'REQUEST_LIST_ADD'; // asset actions var ASSET_ADD = exports.ASSET_ADD = 'ASSET_ADD'; // channel actions var CHANNEL_ADD = exports.CHANNEL_ADD = 'CHANNEL_ADD'; var CHANNEL_CLAIMS_UPDATE_ASYNC = exports.CHANNEL_CLAIMS_UPDATE_ASYNC = 'CHANNEL_CLAIMS_UPDATE_ASYNC'; var CHANNEL_CLAIMS_UPDATE_SUCCESS = exports.CHANNEL_CLAIMS_UPDATE_SUCCESS = 'CHANNEL_CLAIMS_UPDATE_SUCCESS'; // asset/file display actions var FILE_REQUESTED = exports.FILE_REQUESTED = 'FILE_REQUESTED'; var FILE_AVAILABILITY_UPDATE = exports.FILE_AVAILABILITY_UPDATE = 'FILE_AVAILABILITY_UPDATE'; var DISPLAY_ASSET_ERROR = exports.DISPLAY_ASSET_ERROR = 'DISPLAY_ASSET_ERROR'; /***/ }), /* 10 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(2); var _view = __webpack_require__(98); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var site = _ref.site; var defaultDescription = site.defaultDescription, defaultThumbnail = site.defaultThumbnail, siteDescription = site.description, siteHost = site.host, siteTitle = site.title, siteTwitter = site.twitter; return { defaultDescription: defaultDescription, defaultThumbnail: defaultThumbnail, siteDescription: siteDescription, siteHost: siteHost, siteTitle: siteTitle, siteTwitter: siteTwitter }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var selectAsset = exports.selectAsset = function selectAsset(show) { var request = show.requestList[show.request.id]; var assetKey = request.key; return show.assetList[assetKey]; }; var selectShowState = exports.selectShowState = function selectShowState(state) { return state.show; }; /***/ }), /* 12 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _require = __webpack_require__(35), lstatSync = _require.lstatSync, readdirSync = _require.readdirSync; var _require2 = __webpack_require__(15), join = _require2.join; var getSubDirectoryNames = function getSubDirectoryNames(root) { console.log('getting sub directories for:', root); return readdirSync(root).filter(function (name) { console.log('module found:', name); var fullPath = join(root, name); return lstatSync(fullPath).isDirectory(); }); }; module.exports = function (root) { var allModules = {}; getSubDirectoryNames(root).forEach(function (name) { console.log('importing module:', name); allModules[name] = __webpack_require__(145)("./" + name).default; }); return allModules; }; /***/ }), /* 13 */ /***/ (function(module, exports) { module.exports = require("react-helmet"); /***/ }), /* 14 */ /***/ (function(module, exports) { module.exports = require("redux-saga/effects"); /***/ }), /* 15 */ /***/ (function(module, exports) { module.exports = require("path"); /***/ }), /* 16 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var axios = __webpack_require__(69); var logger = __webpack_require__(1); var _require = __webpack_require__(70), _require$api = _require.api, apiHost = _require$api.apiHost, apiPort = _require$api.apiPort; var lbryApiUri = 'http://' + apiHost + ':' + apiPort; var _require2 = __webpack_require__(17), chooseGaLbrynetPublishLabel = _require2.chooseGaLbrynetPublishLabel, sendGATimingEvent = _require2.sendGATimingEvent; var handleLbrynetResponse = function handleLbrynetResponse(_ref, resolve, reject) { var data = _ref.data; logger.debug('lbry api data:', data); if (data.result) { // check for an error if (data.result.error) { logger.debug('Lbrynet api error:', data.result.error); reject(new Error(data.result.error)); return; }; resolve(data.result); return; } // fallback in case it just timed out reject(JSON.stringify(data)); }; module.exports = { publishClaim: function publishClaim(publishParams) { logger.debug('lbryApi >> Publishing claim to "' + publishParams.name + '"'); var gaStartTime = Date.now(); return new Promise(function (resolve, reject) { axios.post(lbryApiUri, { method: 'publish', params: publishParams }).then(function (response) { sendGATimingEvent('lbrynet', 'publish', chooseGaLbrynetPublishLabel(publishParams), gaStartTime, Date.now()); handleLbrynetResponse(response, resolve, reject); }).catch(function (error) { reject(error); }); }); }, getClaim: function getClaim(uri) { logger.debug('lbryApi >> Getting Claim for "' + uri + '"'); var gaStartTime = Date.now(); return new Promise(function (resolve, reject) { axios.post(lbryApiUri, { method: 'get', params: { uri: uri, timeout: 20 } }).then(function (response) { sendGATimingEvent('lbrynet', 'getClaim', 'GET', gaStartTime, Date.now()); handleLbrynetResponse(response, resolve, reject); }).catch(function (error) { reject(error); }); }); }, getClaimList: function getClaimList(claimName) { logger.debug('lbryApi >> Getting claim_list for "' + claimName + '"'); var gaStartTime = Date.now(); return new Promise(function (resolve, reject) { axios.post(lbryApiUri, { method: 'claim_list', params: { name: claimName } }).then(function (response) { sendGATimingEvent('lbrynet', 'getClaimList', 'CLAIM_LIST', gaStartTime, Date.now()); handleLbrynetResponse(response, resolve, reject); }).catch(function (error) { reject(error); }); }); }, resolveUri: function resolveUri(uri) { logger.debug('lbryApi >> Resolving URI for "' + uri + '"'); var gaStartTime = Date.now(); return new Promise(function (resolve, reject) { axios.post(lbryApiUri, { method: 'resolve', params: { uri: uri } }).then(function (_ref2) { var data = _ref2.data; sendGATimingEvent('lbrynet', 'resolveUri', 'RESOLVE', gaStartTime, Date.now()); if (data.result[uri].error) { // check for errors reject(data.result[uri].error); } else { // if no errors, resolve resolve(data.result[uri]); } }).catch(function (error) { reject(error); }); }); }, getDownloadDirectory: function getDownloadDirectory() { logger.debug('lbryApi >> Retrieving the download directory path from lbry daemon...'); var gaStartTime = Date.now(); return new Promise(function (resolve, reject) { axios.post(lbryApiUri, { method: 'settings_get' }).then(function (_ref3) { var data = _ref3.data; sendGATimingEvent('lbrynet', 'getDownloadDirectory', 'SETTINGS_GET', gaStartTime, Date.now()); if (data.result) { resolve(data.result.download_directory); } else { return new Error('Successfully connected to lbry daemon, but unable to retrieve the download directory.'); } }).catch(function (error) { logger.error('Lbrynet Error:', error); resolve('/home/lbry/Downloads/'); }); }); }, createChannel: function createChannel(name) { logger.debug('lbryApi >> Creating channel for ' + name + '...'); var gaStartTime = Date.now(); return new Promise(function (resolve, reject) { axios.post(lbryApiUri, { method: 'channel_new', params: { channel_name: name, amount: 0.1 } }).then(function (response) { sendGATimingEvent('lbrynet', 'createChannel', 'CHANNEL_NEW', gaStartTime, Date.now()); handleLbrynetResponse(response, resolve, reject); }).catch(function (error) { reject(error); }); }); } }; /***/ }), /* 17 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(1); var ua = __webpack_require__(71); var _require = __webpack_require__(3), googleId = _require.analytics.googleId, title = _require.details.title; function createServeEventParams(headers, ip, originalUrl) { return { eventCategory: 'client requests', eventAction: 'serve request', eventLabel: originalUrl, ipOverride: ip, userAgentOverride: headers['user-agent'] }; }; function createPublishTimingEventParams(category, variable, label, startTime, endTime) { var duration = endTime - startTime; return { userTimingCategory: category, userTimingVariableName: variable, userTimingTime: duration, userTimingLabel: label }; }; function sendGoogleAnalyticsEvent(ip, params) { var visitorId = ip.replace(/\./g, '-'); var visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true }); visitor.event(params, function (err) { if (err) { logger.error('Google Analytics Event Error >>', err); } }); }; function sendGoogleAnalyticsTiming(visitorId, params) { var visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true }); visitor.timing(params, function (err) { if (err) { logger.error('Google Analytics Event Error >>', err); } logger.debug('Timing event successfully sent to google analytics'); }); }; module.exports = { sendGAServeEvent: function sendGAServeEvent(headers, ip, originalUrl) { var params = createServeEventParams(headers, ip, originalUrl); sendGoogleAnalyticsEvent(ip, params); }, sendGATimingEvent: function sendGATimingEvent(category, variable, label, startTime, endTime) { var params = createPublishTimingEventParams(category, variable, label, startTime, endTime); sendGoogleAnalyticsTiming(title, params); }, chooseGaLbrynetPublishLabel: function chooseGaLbrynetPublishLabel(_ref) { var channelName = _ref.channel_name, channelId = _ref.channel_id; return channelName || channelId ? 'PUBLISH_IN_CHANNEL_CLAIM' : 'PUBLISH_ANONYMOUS_CLAIM'; } }; /***/ }), /* 18 */ /***/ (function(module, exports) { module.exports = require("redux"); /***/ }), /* 19 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _require = __webpack_require__(3), componentsConfig = _require.componentsConfig; function getDeepestChildValue(parent, childrenKeys) { var childKey = childrenKeys.shift(); // .shift() retrieves the first element of array and removes it from array var child = parent[childKey]; if (childrenKeys.length >= 1) { return getDeepestChildValue(child, childrenKeys); } return child; } var dynamicImport = exports.dynamicImport = function dynamicImport(filePath) { // validate inputs if (!filePath) { throw new Error('no file path provided to dynamicImport()'); } if (typeof filePath !== 'string') { console.log('dynamicImport > filePath:', filePath); console.log('dynamicImport > filePath type:', typeof filePath === 'undefined' ? 'undefined' : _typeof(filePath)); throw new Error('file path provided to dynamicImport() must be a string'); } if (!componentsConfig) { console.log('no componentsConfig found in siteConfig.js'); return __webpack_require__(46)("" + filePath); } // split out the file folders // filter out any empty or white-space-only strings var folders = filePath.split('/').filter(function (folderName) { return folderName.replace(/\s/g, '').length; }); // check for the component corresponding to file path in the site config object // i.e. componentsConfig[folders[0]][folders[2][...][folders[n]] var customComponent = getDeepestChildValue(componentsConfig, folders); if (customComponent) { return customComponent; // return custom component } else { return __webpack_require__(46)("" + filePath); } }; /***/ }), /* 20 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var createBasicCanonicalLink = function createBasicCanonicalLink(page, siteHost) { return siteHost + "/" + page; }; var createAssetCanonicalLink = function createAssetCanonicalLink(asset, siteHost) { var channelName = void 0, certificateId = void 0, name = void 0, claimId = void 0; if (asset.claimData) { var _asset$claimData = asset.claimData; channelName = _asset$claimData.channelName; certificateId = _asset$claimData.certificateId; name = _asset$claimData.name; claimId = _asset$claimData.claimId; }; if (channelName) { return siteHost + "/" + channelName + ":" + certificateId + "/" + name; }; return siteHost + "/" + claimId + "/" + name; }; var createChannelCanonicalLink = function createChannelCanonicalLink(channel, siteHost) { var name = channel.name, longId = channel.longId; return siteHost + "/" + name + ":" + longId; }; var createCanonicalLink = exports.createCanonicalLink = function createCanonicalLink(asset, channel, page, siteHost) { if (asset) { return createAssetCanonicalLink(asset, siteHost); } if (channel) { return createChannelCanonicalLink(channel, siteHost); } return createBasicCanonicalLink(page, siteHost); }; /***/ }), /* 21 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); module.exports = { REGEXP_INVALID_CLAIM: /[^A-Za-z0-9-]/g, REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g, REGEXP_ADDRESS: /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/, CHANNEL_CHAR: '@', parseIdentifier: function parseIdentifier(identifier) { var componentsRegex = new RegExp('([^:$#/]*)' + // value (stops at the first separator or end) '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end) ); var _componentsRegex$exec = componentsRegex // eslint-disable-line no-unused-vars .exec(identifier).map(function (match) { return match || null; }), _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 4), proto = _componentsRegex$exec2[0], value = _componentsRegex$exec2[1], modifierSeperator = _componentsRegex$exec2[2], modifier = _componentsRegex$exec2[3]; // Validate and process name if (!value) { throw new Error('Check your URL. No channel name provided before "' + modifierSeperator + '"'); } var isChannel = value.startsWith(module.exports.CHANNEL_CHAR); var channelName = isChannel ? value : null; var claimId = void 0; if (isChannel) { if (!channelName) { throw new Error('Check your URL. No channel name after "@".'); } var nameBadChars = channelName.match(module.exports.REGEXP_INVALID_CHANNEL); if (nameBadChars) { throw new Error('Check your URL. Invalid characters in channel name: "' + nameBadChars.join(', ') + '".'); } } else { claimId = value; } // Validate and process modifier var channelClaimId = void 0; if (modifierSeperator) { if (!modifier) { throw new Error('Check your URL. No modifier provided after separator "' + modifierSeperator + '"'); } if (modifierSeperator === ':') { channelClaimId = modifier; } else { throw new Error('Check your URL. The "' + modifierSeperator + '" modifier is not currently supported'); } } return { isChannel: isChannel, channelName: channelName, channelClaimId: channelClaimId || null, claimId: claimId || null }; }, parseClaim: function parseClaim(name) { var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first extension) '([:$#.]?)([^/]*)' // extension separator, extension (stops at the first path separator or end) ); var _componentsRegex$exec3 = componentsRegex // eslint-disable-line no-unused-vars .exec(name).map(function (match) { return match || null; }), _componentsRegex$exec4 = _slicedToArray(_componentsRegex$exec3, 4), proto = _componentsRegex$exec4[0], claimName = _componentsRegex$exec4[1], extensionSeperator = _componentsRegex$exec4[2], extension = _componentsRegex$exec4[3]; // Validate and process name if (!claimName) { throw new Error('Check your URL. No claim name provided before "."'); } var nameBadChars = claimName.match(module.exports.REGEXP_INVALID_CLAIM); if (nameBadChars) { throw new Error('Check your URL. Invalid characters in claim name: "' + nameBadChars.join(', ') + '".'); } // Validate and process extension if (extensionSeperator) { if (!extension) { throw new Error('Check your URL. No file extension provided after separator "' + extensionSeperator + '".'); } if (extensionSeperator !== '.') { throw new Error('Check your URL. The "' + extensionSeperator + '" separator is not supported in the claim name.'); } } return { claimName: claimName, extension: extension || null }; } }; /***/ }), /* 22 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var determineOgThumbnailContentType = function determineOgThumbnailContentType(thumbnail) { if (thumbnail) { var fileExt = thumbnail.substring(thumbnail.lastIndexOf('.')); switch (fileExt) { case 'jpeg': case 'jpg': return 'image/jpeg'; case 'png': return 'image/png'; case 'gif': return 'image/gif'; case 'mp4': return 'video/mp4'; default: return 'image/jpeg'; } } return ''; }; var createBasicMetaTags = function createBasicMetaTags(siteHost, siteDescription, siteTitle, siteTwitter) { return [{ property: 'og:title', content: siteTitle }, { property: 'og:url', content: siteHost }, { property: 'og:site_name', content: siteTitle }, { property: 'og:description', content: siteDescription }, { property: 'twitter:site', content: siteTwitter }, { property: 'twitter:card', content: 'summary' }]; }; var createChannelMetaTags = function createChannelMetaTags(siteTitle, siteHost, siteTwitter, channel) { var name = channel.name, longId = channel.longId; return [{ property: 'og:title', content: name + ' on ' + siteTitle }, { property: 'og:url', content: siteHost + '/' + name + ':' + longId }, { property: 'og:site_name', content: siteTitle }, { property: 'og:description', content: name + ', a channel on ' + siteTitle }, { property: 'twitter:site', content: siteTwitter }, { property: 'twitter:card', content: 'summary' }]; }; var createAssetMetaTags = function createAssetMetaTags(siteHost, siteTitle, siteTwitter, asset, defaultDescription, defaultThumbnail) { var claimData = asset.claimData; var contentType = claimData.contentType; var embedUrl = siteHost + '/' + claimData.claimId + '/' + claimData.name; var showUrl = siteHost + '/' + claimData.claimId + '/' + claimData.name; var source = siteHost + '/' + claimData.claimId + '/' + claimData.name + '.' + claimData.fileExt; var ogTitle = claimData.title || claimData.name; var ogDescription = claimData.description || defaultDescription; var ogThumbnailContentType = determineOgThumbnailContentType(claimData.thumbnail); var ogThumbnail = claimData.thumbnail || defaultThumbnail; var metaTags = [{ property: 'og:title', content: ogTitle }, { property: 'og:url', content: showUrl }, { property: 'og:site_name', content: siteTitle }, { property: 'og:description', content: ogDescription }, { property: 'og:image:width', content: 600 }, { property: 'og:image:height', content: 315 }, { property: 'twitter:site', content: siteTwitter }]; if (contentType === 'video/mp4' || contentType === 'video/webm') { metaTags.push({ property: 'og:video', content: source }); metaTags.push({ property: 'og:video:secure_url', content: source }); metaTags.push({ property: 'og:video:type', content: contentType }); metaTags.push({ property: 'og:image', content: ogThumbnail }); metaTags.push({ property: 'og:image:type', content: ogThumbnailContentType }); metaTags.push({ property: 'og:type', content: 'video' }); metaTags.push({ property: 'twitter:card', content: 'player' }); metaTags.push({ property: 'twitter:player', content: embedUrl }); metaTags.push({ property: 'twitter:player:width', content: 600 }); metaTags.push({ property: 'twitter:text:player_width', content: 600 }); metaTags.push({ property: 'twitter:player:height', content: 337 }); metaTags.push({ property: 'twitter:player:stream', content: source }); metaTags.push({ property: 'twitter:player:stream:content_type', content: contentType }); } else { metaTags.push({ property: 'og:image', content: source }); metaTags.push({ property: 'og:image:type', content: contentType }); metaTags.push({ property: 'og:type', content: 'article' }); metaTags.push({ property: 'twitter:card', content: 'summary_large_image' }); } return metaTags; }; var createMetaTags = exports.createMetaTags = function createMetaTags(siteDescription, siteHost, siteTitle, siteTwitter, asset, channel, defaultDescription, defaultThumbnail) { if (asset) { return createAssetMetaTags(siteHost, siteTitle, siteTwitter, asset, defaultDescription, defaultThumbnail); }; if (channel) { return createChannelMetaTags(siteHost, siteTitle, siteTwitter, channel); }; return createBasicMetaTags(siteDescription, siteHost, siteTitle, siteTwitter); }; /***/ }), /* 23 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var createPageTitle = exports.createPageTitle = function createPageTitle(siteTitle, pageTitle) { if (!pageTitle) { return "" + siteTitle; } return siteTitle + " - " + pageTitle; }; /***/ }), /* 24 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.updateLoggedInChannel = updateLoggedInChannel; var _channel_action_types = __webpack_require__(42); var actions = _interopRequireWildcard(_channel_action_types); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } // export action creators function updateLoggedInChannel(name, shortId, longId) { return { type: actions.CHANNEL_UPDATE, data: { name: name, shortId: shortId, longId: longId } }; }; /***/ }), /* 25 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.selectFile = selectFile; exports.clearFile = clearFile; exports.updateMetadata = updateMetadata; exports.updateClaim = updateClaim; exports.setPublishInChannel = setPublishInChannel; exports.updatePublishStatus = updatePublishStatus; exports.updateError = updateError; exports.updateSelectedChannel = updateSelectedChannel; exports.toggleMetadataInputs = toggleMetadataInputs; exports.onNewThumbnail = onNewThumbnail; exports.startPublish = startPublish; var _publish_action_types = __webpack_require__(41); var actions = _interopRequireWildcard(_publish_action_types); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } // export action creators function selectFile(file) { return { type: actions.FILE_SELECTED, data: file }; }; function clearFile() { return { type: actions.FILE_CLEAR }; }; function updateMetadata(name, value) { return { type: actions.METADATA_UPDATE, data: { name: name, value: value } }; }; function updateClaim(value) { return { type: actions.CLAIM_UPDATE, data: value }; }; function setPublishInChannel(channel) { return { type: actions.SET_PUBLISH_IN_CHANNEL, channel: channel }; }; function updatePublishStatus(status, message) { return { type: actions.PUBLISH_STATUS_UPDATE, data: { status: status, message: message } }; }; function updateError(name, value) { return { type: actions.ERROR_UPDATE, data: { name: name, value: value } }; }; function updateSelectedChannel(channelName) { return { type: actions.SELECTED_CHANNEL_UPDATE, data: channelName }; }; function toggleMetadataInputs(showMetadataInputs) { return { type: actions.TOGGLE_METADATA_INPUTS, data: showMetadataInputs }; }; function onNewThumbnail(file) { return { type: actions.THUMBNAIL_NEW, data: file }; }; function startPublish(history) { return { type: actions.PUBLISH_START, data: { history: history } }; } /***/ }), /* 26 */ /***/ (function(module, exports) { module.exports = require("prop-types"); /***/ }), /* 27 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _propTypes = __webpack_require__(26); var _propTypes2 = _interopRequireDefault(_propTypes); var _NavBar = __webpack_require__(8); var _NavBar2 = _interopRequireDefault(_NavBar); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ErrorPage = function (_React$Component) { _inherits(ErrorPage, _React$Component); function ErrorPage() { _classCallCheck(this, ErrorPage); return _possibleConstructorReturn(this, (ErrorPage.__proto__ || Object.getPrototypeOf(ErrorPage)).apply(this, arguments)); } _createClass(ErrorPage, [{ key: 'render', value: function render() { var error = this.props.error; return _react2.default.createElement( 'div', null, _react2.default.createElement(_NavBar2.default, null), _react2.default.createElement( 'div', { className: 'row row--padded' }, _react2.default.createElement( 'p', null, error ) ) ); } }]); return ErrorPage; }(_react2.default.Component); ; ErrorPage.propTypes = { error: _propTypes2.default.string.isRequired }; exports.default = ErrorPage; /***/ }), /* 28 */ /***/ (function(module, exports) { module.exports = require("passport"); /***/ }), /* 29 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function MysqlConfig() { var _this = this; this.database = 'default'; this.username = 'default'; this.password = 'default'; this.configure = function (config) { if (!config) { return console.log('No MySQL config received.'); } var database = config.database, username = config.username, password = config.password; _this.database = database; _this.username = username; _this.password = password; }; }; module.exports = new MysqlConfig(); /***/ }), /* 30 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function SlackConfig() { var _this = this; this.slackWebHook = 'default'; this.slackErrorChannel = 'default'; this.slackInfoChannel = 'default'; this.configure = function (config) { if (!config) { return console.log('No slack config received.'); } var slackWebHook = config.slackWebHook, slackErrorChannel = config.slackErrorChannel, slackInfoChannel = config.slackInfoChannel; _this.slackWebHook = slackWebHook; _this.slackErrorChannel = slackErrorChannel; _this.slackInfoChannel = slackInfoChannel; }; }; module.exports = new SlackConfig(); /***/ }), /* 31 */ /***/ (function(module, exports) { module.exports = require("passport-local"); /***/ }), /* 32 */ /***/ (function(module, exports) { module.exports = require("sequelize"); /***/ }), /* 33 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = { returnShortId: function returnShortId(claimsArray, longId) { var claimIndex = void 0; var shortId = longId.substring(0, 1); // default short id is the first letter var shortIdLength = 0; // find the index of this claim id claimIndex = claimsArray.findIndex(function (element) { return element.claimId === longId; }); if (claimIndex < 0) { throw new Error('claim id not found in claims list'); } // get an array of all claims with lower height var possibleMatches = claimsArray.slice(0, claimIndex); // remove certificates with the same prefixes until none are left. while (possibleMatches.length > 0) { shortIdLength += 1; shortId = longId.substring(0, shortIdLength); possibleMatches = possibleMatches.filter(function (element) { return element.claimId && element.claimId.substring(0, shortIdLength) === shortId; }); } return shortId; } }; /***/ }), /* 34 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(1); var fs = __webpack_require__(35); var _require = __webpack_require__(3), details = _require.details, publishing = _require.publishing; module.exports = { parsePublishApiRequestBody: function parsePublishApiRequestBody(_ref) { var name = _ref.name, nsfw = _ref.nsfw, license = _ref.license, title = _ref.title, description = _ref.description, thumbnail = _ref.thumbnail; // validate name if (!name) { throw new Error('no name field found in request'); } var invalidNameCharacters = /[^A-Za-z0-9,-]/.exec(name); if (invalidNameCharacters) { throw new Error('The claim name you provided is not allowed. Only the following characters are allowed: A-Z, a-z, 0-9, and "-"'); } // optional parameters nsfw = nsfw === 'true'; license = license || null; title = title || null; description = description || null; thumbnail = thumbnail || null; // return results return { name: name, nsfw: nsfw, license: license, title: title, description: description, thumbnail: thumbnail }; }, parsePublishApiRequestFiles: function parsePublishApiRequestFiles(_ref2) { var file = _ref2.file, thumbnail = _ref2.thumbnail; // make sure a file was provided if (!file) { throw new Error('no file with key of [file] found in request'); } if (!file.path) { throw new Error('no file path found'); } if (!file.type) { throw new Error('no file type found'); } if (!file.size) { throw new Error('no file type found'); } // validate the file name if (/'/.test(file.name)) { throw new Error('apostrophes are not allowed in the file name'); } // validate the file module.exports.validateFileTypeAndSize(file); // return results return { fileName: file.name, filePath: file.path, fileType: file.type, thumbnailFileName: thumbnail ? thumbnail.name : null, thumbnailFilePath: thumbnail ? thumbnail.path : null, thumbnailFileType: thumbnail ? thumbnail.type : null }; }, validateFileTypeAndSize: function validateFileTypeAndSize(file) { // check file type and size switch (file.type) { case 'image/jpeg': case 'image/jpg': case 'image/png': if (file.size > 10000000) { logger.debug('publish > file validation > .jpeg/.jpg/.png was too big'); throw new Error('Sorry, images are limited to 10 megabytes.'); } break; case 'image/gif': if (file.size > 50000000) { logger.debug('publish > file validation > .gif was too big'); throw new Error('Sorry, .gifs are limited to 50 megabytes.'); } break; case 'video/mp4': if (file.size > 50000000) { logger.debug('publish > file validation > .mp4 was too big'); throw new Error('Sorry, videos are limited to 50 megabytes.'); } break; default: logger.debug('publish > file validation > unrecognized file type'); throw new Error('The ' + file.type + ' content type is not supported. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.'); } return file; }, createBasicPublishParams: function createBasicPublishParams(filePath, name, title, description, license, nsfw, thumbnail) { logger.debug('Creating Publish Parameters'); // provide defaults for title if (title === null || title.trim() === '') { title = name; } // provide default for description if (description === null || description.trim() === '') { description = ''; } // provide default for license if (license === null || license.trim() === '') { license = ' '; // default to empty string } // create the publish params var publishParams = { name: name, file_path: filePath, bid: 0.01, metadata: { description: description, title: title, author: details.title, language: 'en', license: license, nsfw: nsfw }, claim_address: publishing.primaryClaimAddress }; // add thumbnail to channel if video if (thumbnail) { publishParams['metadata']['thumbnail'] = thumbnail; } return publishParams; }, createThumbnailPublishParams: function createThumbnailPublishParams(thumbnailFilePath, claimName, license, nsfw) { if (!thumbnailFilePath) { return; } logger.debug('Creating Thumbnail Publish Parameters'); // create the publish params return { name: claimName + '-thumb', file_path: thumbnailFilePath, bid: 0.01, metadata: { title: claimName + ' thumbnail', description: 'a thumbnail for ' + claimName, author: details.title, language: 'en', license: license, nsfw: nsfw }, claim_address: publishing.primaryClaimAddress, channel_name: publishing.thumbnailChannel, channel_id: publishing.thumbnailChannelId }; }, deleteTemporaryFile: function deleteTemporaryFile(filePath) { fs.unlink(filePath, function (err) { if (err) { logger.error('error deleting temporary file ' + filePath); throw err; } logger.debug('successfully deleted ' + filePath); }); }, addGetResultsToFileData: function addGetResultsToFileData(fileInfo, getResult) { fileInfo.fileName = getResult.file_name; fileInfo.filePath = getResult.download_path; return fileInfo; }, createFileData: function createFileData(_ref3) { var name = _ref3.name, claimId = _ref3.claimId, outpoint = _ref3.outpoint, height = _ref3.height, address = _ref3.address, nsfw = _ref3.nsfw, contentType = _ref3.contentType; return { name: name, claimId: claimId, outpoint: outpoint, height: height, address: address, fileName: '', filePath: '', fileType: contentType, nsfw: nsfw }; } }; /***/ }), /* 35 */ /***/ (function(module, exports) { module.exports = require("fs"); /***/ }), /* 36 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var logger = __webpack_require__(1); module.exports = { handleErrorResponse: function handleErrorResponse(originalUrl, ip, error, res) { logger.error('Error on ' + originalUrl, module.exports.useObjectPropertiesIfNoKeys(error)); var _module$exports$retur = module.exports.returnErrorMessageAndStatus(error), _module$exports$retur2 = _slicedToArray(_module$exports$retur, 2), status = _module$exports$retur2[0], message = _module$exports$retur2[1]; res.status(status).json(module.exports.createErrorResponsePayload(status, message)); }, returnErrorMessageAndStatus: function returnErrorMessageAndStatus(error) { var status = void 0, message = void 0; // check for daemon being turned off if (error.code === 'ECONNREFUSED') { status = 503; message = 'Connection refused. The daemon may not be running.'; // fallback for everything else } else { status = 400; if (error.message) { message = error.message; } else { message = error; }; }; return [status, message]; }, useObjectPropertiesIfNoKeys: function useObjectPropertiesIfNoKeys(err) { if (Object.keys(err).length === 0) { var newErrorObject = {}; Object.getOwnPropertyNames(err).forEach(function (key) { newErrorObject[key] = err[key]; }); return newErrorObject; } return err; }, createErrorResponsePayload: function createErrorResponsePayload(status, message) { return { status: status, success: false, message: message }; } }; /***/ }), /* 37 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var db = __webpack_require__(5); var logger = __webpack_require__(1); var _require = __webpack_require__(85), returnPaginatedChannelClaims = _require.returnPaginatedChannelClaims; var NO_CHANNEL = 'NO_CHANNEL'; var NO_CLAIM = 'NO_CLAIM'; var NO_FILE = 'NO_FILE'; module.exports = { getClaimId: function getClaimId(channelName, channelClaimId, name, claimId) { if (channelName) { return module.exports.getClaimIdByChannel(channelName, channelClaimId, name); } else { return module.exports.getClaimIdByClaim(name, claimId); } }, getClaimIdByClaim: function getClaimIdByClaim(claimName, claimId) { logger.debug('getClaimIdByClaim(' + claimName + ', ' + claimId + ')'); return new Promise(function (resolve, reject) { db.Claim.getLongClaimId(claimName, claimId).then(function (longClaimId) { if (!longClaimId) { resolve(NO_CLAIM); } resolve(longClaimId); }).catch(function (error) { reject(error); }); }); }, getClaimIdByChannel: function getClaimIdByChannel(channelName, channelClaimId, claimName) { logger.debug('getClaimIdByChannel(' + channelName + ', ' + channelClaimId + ', ' + claimName + ')'); return new Promise(function (resolve, reject) { db.Certificate.getLongChannelId(channelName, channelClaimId) // 1. get the long channel id .then(function (longChannelId) { if (!longChannelId) { return [null, null]; } return Promise.all([longChannelId, db.Claim.getClaimIdByLongChannelId(longChannelId, claimName)]); // 2. get the long claim id }).then(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), longChannelId = _ref2[0], longClaimId = _ref2[1]; if (!longChannelId) { return resolve(NO_CHANNEL); } if (!longClaimId) { return resolve(NO_CLAIM); } resolve(longClaimId); }).catch(function (error) { reject(error); }); }); }, getChannelData: function getChannelData(channelName, channelClaimId, page) { return new Promise(function (resolve, reject) { // 1. get the long channel Id (make sure channel exists) db.Certificate.getLongChannelId(channelName, channelClaimId).then(function (longChannelClaimId) { if (!longChannelClaimId) { return [null, null, null]; } // 2. get the short ID and all claims for that channel return Promise.all([longChannelClaimId, db.Certificate.getShortChannelIdFromLongChannelId(longChannelClaimId, channelName)]); }).then(function (_ref3) { var _ref4 = _slicedToArray(_ref3, 2), longChannelClaimId = _ref4[0], shortChannelClaimId = _ref4[1]; if (!longChannelClaimId) { return resolve(NO_CHANNEL); } // 3. return all the channel information resolve({ channelName: channelName, longChannelClaimId: longChannelClaimId, shortChannelClaimId: shortChannelClaimId }); }).catch(function (error) { reject(error); }); }); }, getChannelClaims: function getChannelClaims(channelName, channelClaimId, page) { return new Promise(function (resolve, reject) { // 1. get the long channel Id (make sure channel exists) db.Certificate.getLongChannelId(channelName, channelClaimId).then(function (longChannelClaimId) { if (!longChannelClaimId) { return [null, null, null]; } // 2. get the short ID and all claims for that channel return Promise.all([longChannelClaimId, db.Claim.getAllChannelClaims(longChannelClaimId)]); }).then(function (_ref5) { var _ref6 = _slicedToArray(_ref5, 2), longChannelClaimId = _ref6[0], channelClaimsArray = _ref6[1]; if (!longChannelClaimId) { return resolve(NO_CHANNEL); } // 3. format the data for the view, including pagination var paginatedChannelViewData = returnPaginatedChannelClaims(channelName, longChannelClaimId, channelClaimsArray, page); // 4. return all the channel information and contents resolve(paginatedChannelViewData); }).catch(function (error) { reject(error); }); }); }, getLocalFileRecord: function getLocalFileRecord(claimId, name) { return db.File.findOne({ where: { claimId: claimId, name: name } }).then(function (file) { if (!file) { return NO_FILE; } return file.dataValues; }); } }; /***/ }), /* 38 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _server = __webpack_require__(39); var _redux = __webpack_require__(18); var _index = __webpack_require__(40); var _index2 = _interopRequireDefault(_index); var _reactRedux = __webpack_require__(2); var _reactRouterDom = __webpack_require__(4); var _index3 = __webpack_require__(44); var _index4 = _interopRequireDefault(_index3); var _app = __webpack_require__(45); var _app2 = _interopRequireDefault(_app); var _renderFullPage = __webpack_require__(53); var _renderFullPage2 = _interopRequireDefault(_renderFullPage); var _reactHelmet = __webpack_require__(13); var _reactHelmet2 = _interopRequireDefault(_reactHelmet); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } module.exports = function (req, res) { var context = {}; // create a new Redux store instance var store = (0, _redux.createStore)(_index2.default); // render component to a string var html = (0, _server.renderToString)(_react2.default.createElement( _reactRedux.Provider, { store: store }, _react2.default.createElement( _reactRouterDom.StaticRouter, { location: req.url, context: context }, _react2.default.createElement( _index4.default, null, _react2.default.createElement(_app2.default, null) ) ) )); // get head tags from helmet var helmet = _reactHelmet2.default.renderStatic(); // check for a redirect if (context.url) { // Somewhere a `` was rendered return res.redirect(301, context.url); } else {} // we're good, send the response // get the initial state from our Redux store var preloadedState = store.getState(); // send the rendered page back to the client res.send((0, _renderFullPage2.default)(helmet, html, preloadedState)); }; /***/ }), /* 39 */ /***/ (function(module, exports) { module.exports = require("react-dom/server"); /***/ }), /* 40 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _redux = __webpack_require__(18); var _publish = __webpack_require__(87); var _publish2 = _interopRequireDefault(_publish); var _channel = __webpack_require__(89); var _channel2 = _interopRequireDefault(_channel); var _show = __webpack_require__(90); var _show2 = _interopRequireDefault(_show); var _site = __webpack_require__(91); var _site2 = _interopRequireDefault(_site); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.default = (0, _redux.combineReducers)({ channel: _channel2.default, publish: _publish2.default, show: _show2.default, site: _site2.default }); /***/ }), /* 41 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var FILE_SELECTED = exports.FILE_SELECTED = 'FILE_SELECTED'; var FILE_CLEAR = exports.FILE_CLEAR = 'FILE_CLEAR'; var METADATA_UPDATE = exports.METADATA_UPDATE = 'METADATA_UPDATE'; var CLAIM_UPDATE = exports.CLAIM_UPDATE = 'CLAIM_UPDATE'; var SET_PUBLISH_IN_CHANNEL = exports.SET_PUBLISH_IN_CHANNEL = 'SET_PUBLISH_IN_CHANNEL'; var PUBLISH_STATUS_UPDATE = exports.PUBLISH_STATUS_UPDATE = 'PUBLISH_STATUS_UPDATE'; var ERROR_UPDATE = exports.ERROR_UPDATE = 'ERROR_UPDATE'; var SELECTED_CHANNEL_UPDATE = exports.SELECTED_CHANNEL_UPDATE = 'SELECTED_CHANNEL_UPDATE'; var TOGGLE_METADATA_INPUTS = exports.TOGGLE_METADATA_INPUTS = 'TOGGLE_METADATA_INPUTS'; var THUMBNAIL_NEW = exports.THUMBNAIL_NEW = 'THUMBNAIL_NEW'; var PUBLISH_START = exports.PUBLISH_START = 'PUBLISH_START'; /***/ }), /* 42 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var CHANNEL_UPDATE = exports.CHANNEL_UPDATE = 'CHANNEL_UPDATE'; /***/ }), /* 43 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var LOCAL_CHECK = exports.LOCAL_CHECK = 'LOCAL_CHECK'; var UNAVAILABLE = exports.UNAVAILABLE = 'UNAVAILABLE'; var ERROR = exports.ERROR = 'ERROR'; var AVAILABLE = exports.AVAILABLE = 'AVAILABLE'; /***/ }), /* 44 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactGa = __webpack_require__(92); var _reactGa2 = _interopRequireDefault(_reactGa); var _reactRouterDom = __webpack_require__(4); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var _require = __webpack_require__(3), googleId = _require.analytics.googleId; _reactGa2.default.initialize(googleId); var GAListener = function (_React$Component) { _inherits(GAListener, _React$Component); function GAListener() { _classCallCheck(this, GAListener); return _possibleConstructorReturn(this, (GAListener.__proto__ || Object.getPrototypeOf(GAListener)).apply(this, arguments)); } _createClass(GAListener, [{ key: 'componentDidMount', value: function componentDidMount() { this.sendPageView(this.props.history.location); this.props.history.listen(this.sendPageView); } }, { key: 'sendPageView', value: function sendPageView(location) { _reactGa2.default.set({ page: location.pathname }); _reactGa2.default.pageview(location.pathname); } }, { key: 'render', value: function render() { return this.props.children; } }]); return GAListener; }(_react2.default.Component); exports.default = (0, _reactRouterDom.withRouter)(GAListener); /***/ }), /* 45 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactRouterDom = __webpack_require__(4); var _dynamicImport = __webpack_require__(19); var _AboutPage = __webpack_require__(94); var _AboutPage2 = _interopRequireDefault(_AboutPage); var _LoginPage = __webpack_require__(99); var _LoginPage2 = _interopRequireDefault(_LoginPage); var _ShowPage = __webpack_require__(107); var _ShowPage2 = _interopRequireDefault(_ShowPage); var _FourOhFourPage = __webpack_require__(124); var _FourOhFourPage2 = _interopRequireDefault(_FourOhFourPage); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var HomePage = (0, _dynamicImport.dynamicImport)('pages/HomePage'); // or use the provided local homepage var App = function App() { return _react2.default.createElement( _reactRouterDom.Switch, null, _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/', component: HomePage }), _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/about', component: _AboutPage2.default }), _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/login', component: _LoginPage2.default }), _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/:identifier/:claim', component: _ShowPage2.default }), _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/:claim', component: _ShowPage2.default }), _react2.default.createElement(_reactRouterDom.Route, { component: _FourOhFourPage2.default }) ); }; exports.default = App; /***/ }), /* 46 */ /***/ (function(module, exports, __webpack_require__) { var map = { "./canonicalLink": 20, "./canonicalLink.js": 20, "./dynamicImport": 19, "./dynamicImport.js": 19, "./file": 47, "./file.js": 47, "./lbryUri": 21, "./lbryUri.js": 21, "./metaTags": 22, "./metaTags.js": 22, "./pageTitle": 23, "./pageTitle.js": 23, "./publish": 48, "./publish.js": 48, "./request": 6, "./request.js": 6, "./validate": 49, "./validate.js": 49 }; function webpackContext(req) { return __webpack_require__(webpackContextResolve(req)); }; function webpackContextResolve(req) { var id = map[req]; if(!(id + 1)) // check for number or string throw new Error("Cannot find module '" + req + "'."); return id; }; webpackContext.keys = function webpackContextKeys() { return Object.keys(map); }; webpackContext.resolve = webpackContextResolve; module.exports = webpackContext; webpackContext.id = 46; /***/ }), /* 47 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = { validateFile: function validateFile(file) { if (!file) { throw new Error('no file provided'); } if (/'/.test(file.name)) { throw new Error('apostrophes are not allowed in the file name'); } // validate size and type switch (file.type) { case 'image/jpeg': case 'image/jpg': case 'image/png': if (file.size > 10000000) { throw new Error('Sorry, images are limited to 10 megabytes.'); } break; case 'image/gif': if (file.size > 50000000) { throw new Error('Sorry, GIFs are limited to 50 megabytes.'); } break; case 'video/mp4': if (file.size > 50000000) { throw new Error('Sorry, videos are limited to 50 megabytes.'); } break; default: throw new Error(file.type + ' is not a supported file type. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.'); } } }; /***/ }), /* 48 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var createPublishMetadata = exports.createPublishMetadata = function createPublishMetadata(claim, _ref, _ref2, publishInChannel, selectedChannel) { var type = _ref.type; var title = _ref2.title, description = _ref2.description, license = _ref2.license, nsfw = _ref2.nsfw; var metadata = { name: claim, title: title, description: description, license: license, nsfw: nsfw, type: type }; if (publishInChannel) { metadata['channelName'] = selectedChannel; } return metadata; }; var createPublishFormData = exports.createPublishFormData = function createPublishFormData(file, thumbnail, metadata) { var fd = new FormData(); // append file fd.append('file', file); // append thumbnail if (thumbnail) { fd.append('thumbnail', thumbnail); } // append metadata for (var key in metadata) { if (metadata.hasOwnProperty(key)) { fd.append(key, metadata[key]); } } return fd; }; var createThumbnailUrl = exports.createThumbnailUrl = function createThumbnailUrl(channel, channelId, claim, host) { return host + '/' + channel + ':' + channelId + '/' + claim + '-thumb.png'; }; /***/ }), /* 49 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var validateChannelSelection = exports.validateChannelSelection = function validateChannelSelection(publishInChannel, selectedChannel, loggedInChannel) { if (publishInChannel && selectedChannel !== loggedInChannel.name) { throw new Error('Log in to a channel or select Anonymous'); } }; var validatePublishParams = exports.validatePublishParams = function validatePublishParams(file, claim, urlError) { if (!file) { throw new Error('Please choose a file'); } if (!claim) { throw new Error('Please enter a URL'); } if (urlError) { throw new Error('Fix the url'); } }; /***/ }), /* 50 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _propTypes = __webpack_require__(26); var _propTypes2 = _interopRequireDefault(_propTypes); var _ActiveStatusBar = __webpack_require__(105); var _ActiveStatusBar2 = _interopRequireDefault(_ActiveStatusBar); var _InactiveStatusBar = __webpack_require__(106); var _InactiveStatusBar2 = _interopRequireDefault(_InactiveStatusBar); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ProgressBar = function (_React$Component) { _inherits(ProgressBar, _React$Component); function ProgressBar(props) { _classCallCheck(this, ProgressBar); var _this = _possibleConstructorReturn(this, (ProgressBar.__proto__ || Object.getPrototypeOf(ProgressBar)).call(this, props)); _this.state = { bars: [], index: 0, incrementer: 1 }; _this.createBars = _this.createBars.bind(_this); _this.startProgressBar = _this.startProgressBar.bind(_this); _this.updateProgressBar = _this.updateProgressBar.bind(_this); _this.stopProgressBar = _this.stopProgressBar.bind(_this); return _this; } _createClass(ProgressBar, [{ key: 'componentDidMount', value: function componentDidMount() { this.createBars(); this.startProgressBar(); } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { this.stopProgressBar(); } }, { key: 'createBars', value: function createBars() { var bars = []; for (var i = 0; i <= this.props.size; i++) { bars.push({ isActive: false }); } this.setState({ bars: bars }); } }, { key: 'startProgressBar', value: function startProgressBar() { this.updateInterval = setInterval(this.updateProgressBar.bind(this), 300); } }, { key: 'updateProgressBar', value: function updateProgressBar() { var index = this.state.index; var incrementer = this.state.incrementer; var bars = this.state.bars; // flip incrementer if necessary, to stay in bounds if (index < 0 || index > this.props.size) { incrementer = incrementer * -1; index += incrementer; } // update the indexed bar if (incrementer > 0) { bars[index].isActive = true; } else { bars[index].isActive = false; }; // increment index index += incrementer; // update state this.setState({ bars: bars, incrementer: incrementer, index: index }); } }, { key: 'stopProgressBar', value: function stopProgressBar() { clearInterval(this.updateInterval); } }, { key: 'render', value: function render() { return _react2.default.createElement( 'div', null, this.state.bars.map(function (bar, index) { return bar.isActive ? _react2.default.createElement(_ActiveStatusBar2.default, { key: index }) : _react2.default.createElement(_InactiveStatusBar2.default, { key: index }); }) ); } }]); return ProgressBar; }(_react2.default.Component); ; ProgressBar.propTypes = { size: _propTypes2.default.number.isRequired }; exports.default = ProgressBar; /***/ }), /* 51 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var CHANNEL = exports.CHANNEL = 'CHANNEL'; var ASSET_LITE = exports.ASSET_LITE = 'ASSET_LITE'; var ASSET_DETAILS = exports.ASSET_DETAILS = 'ASSET_DETAILS'; /***/ }), /* 52 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(2); var _view = __webpack_require__(111); var _view2 = _interopRequireDefault(_view); var _show = __webpack_require__(7); var _show2 = __webpack_require__(11); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var show = _ref.show; // select error and status var error = show.displayAsset.error; var status = show.displayAsset.status; // select asset var asset = (0, _show2.selectAsset)(show); // return props return { error: error, status: status, asset: asset }; }; var mapDispatchToProps = function mapDispatchToProps(dispatch) { return { onFileRequest: function onFileRequest(name, claimId) { dispatch((0, _show.fileRequested)(name, claimId)); } }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 53 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = function (helmet, html, preloadedState) { // take the html and preloadedState and return the full page return '\n \n \n \n \n \n \n \n ' + helmet.title.toString() + '\n ' + helmet.meta.toString() + '\n ' + helmet.link.toString() + '\n \n \n \n \n \n \n \n \n
\n
' + html + '
\n
\n \n \n \n \n '; }; /***/ }), /* 54 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var selectSiteState = exports.selectSiteState = function selectSiteState(state) { return state.site; }; var selectSiteHost = exports.selectSiteHost = function selectSiteHost(state) { return state.site.host; }; /***/ }), /* 55 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(56); __webpack_require__(57); module.exports = __webpack_require__(58); /***/ }), /* 56 */ /***/ (function(module, exports) { module.exports = require("babel-polyfill"); /***/ }), /* 57 */ /***/ (function(module, exports) { module.exports = require("whatwg-fetch"); /***/ }), /* 58 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var Server = __webpack_require__(59); var Components = __webpack_require__(141); var Containers = __webpack_require__(143); var Pages = __webpack_require__(144); var _exports = { Server: Server, Components: Components, Containers: Containers, Pages: Pages }; module.exports = _exports; /***/ }), /* 59 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // app dependencies var express = __webpack_require__(60); var bodyParser = __webpack_require__(61); var expressHandlebars = __webpack_require__(62); var Handlebars = __webpack_require__(63); var helmet = __webpack_require__(64); var passport = __webpack_require__(28); var _require = __webpack_require__(65), serializeSpeechUser = _require.serializeSpeechUser, deserializeSpeechUser = _require.deserializeSpeechUser; var cookieSession = __webpack_require__(66); var http = __webpack_require__(67); // logging dependencies var logger = __webpack_require__(1); function Server() { var _this = this; this.configureMysql = function (mysqlConfig) { __webpack_require__(29).configure(mysqlConfig); }; this.configureSite = function (siteConfig) { __webpack_require__(3).configure(siteConfig); console.log(__webpack_require__(3)); _this.sessionKey = siteConfig.auth.sessionKey; _this.PORT = siteConfig.details.port; }; this.configureSlack = function (slackConfig) { __webpack_require__(30).configure(slackConfig); }; this.createApp = function () { // create an Express application var app = express(); // trust the proxy to get ip address for us app.enable('trust proxy'); // add middleware app.use(helmet()); // set HTTP headers to protect against well-known web vulnerabilties app.use(express.static(__dirname + '/public')); // 'express.static' to serve static files from public directory app.use(bodyParser.json()); // 'body parser' for parsing application/json app.use(bodyParser.urlencoded({ extended: true })); // 'body parser' for parsing application/x-www-form-urlencoded app.use(function (req, res, next) { // custom logging middleware to log all incoming http requests logger.verbose('Request on ' + req.originalUrl + ' from ' + req.ip); next(); }); // configure passport passport.serializeUser(serializeSpeechUser); passport.deserializeUser(deserializeSpeechUser); var localSignupStrategy = __webpack_require__(68); var localLoginStrategy = __webpack_require__(79); passport.use('local-signup', localSignupStrategy); passport.use('local-login', localLoginStrategy); // initialize passport app.use(cookieSession({ name: 'session', keys: [_this.sessionKey], maxAge: 24 * 60 * 60 * 1000 // i.e. 24 hours })); app.use(passport.initialize()); app.use(passport.session()); // configure handlebars & register it with express app var hbs = expressHandlebars.create({ defaultLayout: 'embed', handlebars: Handlebars }); app.engine('handlebars', hbs.engine); app.set('view engine', 'handlebars'); // set the routes on the app __webpack_require__(80)(app); __webpack_require__(81)(app); __webpack_require__(86)(app); __webpack_require__(126)(app); __webpack_require__(136)(app); _this.app = app; }; this.initialize = function () { __webpack_require__(137)(logger); __webpack_require__(139)(logger); _this.createApp(); _this.server = http.Server(_this.app); }; this.start = function () { var db = __webpack_require__(5); // sync sequelize db.sequelize.sync() // start the server .then(function () { _this.server.listen(_this.PORT, function () { logger.info('Server is listening on PORT ' + _this.PORT); }); }).catch(function (error) { logger.error('Startup Error:', error); }); }; }; module.exports = Server; /***/ }), /* 60 */ /***/ (function(module, exports) { module.exports = require("express"); /***/ }), /* 61 */ /***/ (function(module, exports) { module.exports = require("body-parser"); /***/ }), /* 62 */ /***/ (function(module, exports) { module.exports = require("express-handlebars"); /***/ }), /* 63 */ /***/ (function(module, exports) { module.exports = require("handlebars"); /***/ }), /* 64 */ /***/ (function(module, exports) { module.exports = require("helmet"); /***/ }), /* 65 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(1); module.exports = { serializeSpeechUser: function serializeSpeechUser(user, done) { // returns user data to be serialized into session logger.debug('serializing user'); done(null, user); }, deserializeSpeechUser: function deserializeSpeechUser(user, done) { // deserializes session and populates additional info to req.user logger.debug('deserializing user'); done(null, user); } }; /***/ }), /* 66 */ /***/ (function(module, exports) { module.exports = require("cookie-session"); /***/ }), /* 67 */ /***/ (function(module, exports) { module.exports = require("http"); /***/ }), /* 68 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var PassportLocalStrategy = __webpack_require__(31).Strategy; var lbryApi = __webpack_require__(16); var logger = __webpack_require__(1); var db = __webpack_require__(5); module.exports = new PassportLocalStrategy({ usernameField: 'username', passwordField: 'password' }, function (username, password, done) { logger.verbose('new channel signup request. user: ' + username + ' pass: ' + password + ' .'); var userInfo = {}; // server-side validaton of inputs (username, password) // create the channel and retrieve the metadata return lbryApi.createChannel('@' + username).then(function (tx) { // create user record var userData = { userName: username, password: password }; logger.verbose('userData >', userData); // create user record var channelData = { channelName: '@' + username, channelClaimId: tx.claim_id }; logger.verbose('channelData >', channelData); // create certificate record var certificateData = { claimId: tx.claim_id, name: '@' + username // address, }; logger.verbose('certificateData >', certificateData); // save user and certificate to db return Promise.all([db.User.create(userData), db.Channel.create(channelData), db.Certificate.create(certificateData)]); }).then(function (_ref) { var _ref2 = _slicedToArray(_ref, 3), newUser = _ref2[0], newChannel = _ref2[1], newCertificate = _ref2[2]; logger.verbose('user and certificate successfully created'); // store the relevant newUser info to be passed back for req.User userInfo['id'] = newUser.id; userInfo['userName'] = newUser.userName; userInfo['channelName'] = newChannel.channelName; userInfo['channelClaimId'] = newChannel.channelClaimId; // associate the instances return Promise.all([newCertificate.setChannel(newChannel), newChannel.setUser(newUser)]); }).then(function () { logger.verbose('user and certificate successfully associated'); return db.Certificate.getShortChannelIdFromLongChannelId(userInfo.channelClaimId, userInfo.channelName); }).then(function (shortChannelId) { userInfo['shortChannelId'] = shortChannelId; return done(null, userInfo); }).catch(function (error) { logger.error('signup error', error); return done(error); }); }); /***/ }), /* 69 */ /***/ (function(module, exports) { module.exports = require("axios"); /***/ }), /* 70 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var lbryConfig = { api: { apiHost: 'localhost', apiPort: '5279' } }; module.exports = lbryConfig; /***/ }), /* 71 */ /***/ (function(module, exports) { module.exports = require("universal-analytics"); /***/ }), /* 72 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(1); var _require = __webpack_require__(33), returnShortId = _require.returnShortId; module.exports = function (sequelize, _ref) { var STRING = _ref.STRING, BOOLEAN = _ref.BOOLEAN, INTEGER = _ref.INTEGER, TEXT = _ref.TEXT, DECIMAL = _ref.DECIMAL; var Certificate = sequelize.define('Certificate', { address: { type: STRING, default: null }, amount: { type: DECIMAL(19, 8), default: null }, claimId: { type: STRING, default: null }, claimSequence: { type: INTEGER, default: null }, decodedClaim: { type: BOOLEAN, default: null }, depth: { type: INTEGER, default: null }, effectiveAmount: { type: DECIMAL(19, 8), default: null }, hasSignature: { type: BOOLEAN, default: null }, height: { type: INTEGER, default: null }, hex: { type: TEXT('long'), default: null }, name: { type: STRING, default: null }, nout: { type: INTEGER, default: null }, txid: { type: STRING, default: null }, validAtHeight: { type: INTEGER, default: null }, outpoint: { type: STRING, default: null }, valueVersion: { type: STRING, default: null }, claimType: { type: STRING, default: null }, certificateVersion: { type: STRING, default: null }, keyType: { type: STRING, default: null }, publicKey: { type: TEXT('long'), default: null } }, { freezeTableName: true }); Certificate.associate = function (db) { Certificate.belongsTo(db.Channel, { foreignKey: { allowNull: true } }); }; Certificate.getShortChannelIdFromLongChannelId = function (longChannelId, channelName) { var _this = this; logger.debug('getShortChannelIdFromLongChannelId ' + channelName + ':' + longChannelId); return new Promise(function (resolve, reject) { _this.findAll({ where: { name: channelName }, order: [['height', 'ASC']] }).then(function (result) { switch (result.length) { case 0: throw new Error('No channel(s) found with that channel name'); default: return resolve(returnShortId(result, longChannelId)); } }).catch(function (error) { reject(error); }); }); }; Certificate.getLongChannelIdFromShortChannelId = function (channelName, channelClaimId) { var _this2 = this; logger.debug('getLongChannelIdFromShortChannelId(' + channelName + ', ' + channelClaimId + ')'); return new Promise(function (resolve, reject) { _this2.findAll({ where: { name: channelName, claimId: { $like: channelClaimId + '%' } }, order: [['height', 'ASC']] }).then(function (result) { switch (result.length) { case 0: return resolve(null); default: // note results must be sorted return resolve(result[0].claimId); } }).catch(function (error) { reject(error); }); }); }; Certificate.getLongChannelIdFromChannelName = function (channelName) { var _this3 = this; logger.debug('getLongChannelIdFromChannelName(' + channelName + ')'); return new Promise(function (resolve, reject) { _this3.findAll({ where: { name: channelName }, order: [['effectiveAmount', 'DESC'], ['height', 'ASC']] }).then(function (result) { switch (result.length) { case 0: return resolve(null); default: return resolve(result[0].claimId); } }).catch(function (error) { reject(error); }); }); }; Certificate.validateLongChannelId = function (name, claimId) { var _this4 = this; logger.debug('validateLongChannelId(' + name + ', ' + claimId + ')'); return new Promise(function (resolve, reject) { _this4.findOne({ where: { name: name, claimId: claimId } }).then(function (result) { if (!result) { return resolve(null); }; resolve(claimId); }).catch(function (error) { reject(error); }); }); }; Certificate.getLongChannelId = function (channelName, channelClaimId) { logger.debug('getLongChannelId(' + channelName + ', ' + channelClaimId + ')'); if (channelClaimId && channelClaimId.length === 40) { // if a full channel id is provided return this.validateLongChannelId(channelName, channelClaimId); } else if (channelClaimId && channelClaimId.length < 40) { // if a short channel id is provided return this.getLongChannelIdFromShortChannelId(channelName, channelClaimId); } else { return this.getLongChannelIdFromChannelName(channelName); // if no channel id provided } }; return Certificate; }; /***/ }), /* 73 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = function (sequelize, _ref) { var STRING = _ref.STRING; var Channel = sequelize.define('Channel', { channelName: { type: STRING, allowNull: false }, channelClaimId: { type: STRING, allowNull: false } }, { freezeTableName: true }); Channel.associate = function (db) { Channel.belongsTo(db.User); Channel.hasOne(db.Certificate); }; return Channel; }; /***/ }), /* 74 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(1); var _require = __webpack_require__(33), returnShortId = _require.returnShortId; var _require2 = __webpack_require__(3), defaultThumbnail = _require2.assetDefaults.thumbnail, host = _require2.details.host; function determineFileExtensionFromContentType(contentType) { switch (contentType) { case 'image/jpeg': case 'image/jpg': return 'jpeg'; case 'image/png': return 'png'; case 'image/gif': return 'gif'; case 'video/mp4': return 'mp4'; default: logger.debug('setting unknown file type as file extension jpeg'); return 'jpeg'; } }; function determineThumbnail(storedThumbnail, defaultThumbnail) { if (storedThumbnail === '') { return defaultThumbnail; } return storedThumbnail; }; function prepareClaimData(claim) { // logger.debug('preparing claim data based on resolved data:', claim); claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail); claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType); claim['host'] = host; return claim; }; module.exports = function (sequelize, _ref) { var STRING = _ref.STRING, BOOLEAN = _ref.BOOLEAN, INTEGER = _ref.INTEGER, TEXT = _ref.TEXT, DECIMAL = _ref.DECIMAL; var Claim = sequelize.define('Claim', { address: { type: STRING, default: null }, amount: { type: DECIMAL(19, 8), default: null }, claimId: { type: STRING, default: null }, claimSequence: { type: INTEGER, default: null }, decodedClaim: { type: BOOLEAN, default: null }, depth: { type: INTEGER, default: null }, effectiveAmount: { type: DECIMAL(19, 8), default: null }, hasSignature: { type: BOOLEAN, default: null }, height: { type: INTEGER, default: null }, hex: { type: TEXT('long'), default: null }, name: { type: STRING, default: null }, nout: { type: INTEGER, default: null }, txid: { type: STRING, default: null }, validAtHeight: { type: INTEGER, default: null }, outpoint: { type: STRING, default: null }, claimType: { type: STRING, default: null }, certificateId: { type: STRING, default: null }, author: { type: STRING, default: null }, description: { type: TEXT('long'), default: null }, language: { type: STRING, default: null }, license: { type: STRING, default: null }, licenseUrl: { type: STRING, default: null }, nsfw: { type: BOOLEAN, default: null }, preview: { type: STRING, default: null }, thumbnail: { type: STRING, default: null }, title: { type: STRING, default: null }, metadataVersion: { type: STRING, default: null }, contentType: { type: STRING, default: null }, source: { type: STRING, default: null }, sourceType: { type: STRING, default: null }, sourceVersion: { type: STRING, default: null }, streamVersion: { type: STRING, default: null }, valueVersion: { type: STRING, default: null }, channelName: { type: STRING, allowNull: true, default: null } }, { freezeTableName: true }); Claim.associate = function (db) { Claim.belongsTo(db.File, { foreignKey: { allowNull: true } }); }; Claim.getShortClaimIdFromLongClaimId = function (claimId, claimName) { var _this = this; logger.debug('Claim.getShortClaimIdFromLongClaimId for ' + claimName + '#' + claimId); return new Promise(function (resolve, reject) { _this.findAll({ where: { name: claimName }, order: [['height', 'ASC']] }).then(function (result) { switch (result.length) { case 0: throw new Error('No claim(s) found with that claim name'); default: resolve(returnShortId(result, claimId)); } }).catch(function (error) { reject(error); }); }); }; Claim.getAllChannelClaims = function (channelClaimId) { var _this2 = this; logger.debug('Claim.getAllChannelClaims for ' + channelClaimId); return new Promise(function (resolve, reject) { _this2.findAll({ where: { certificateId: channelClaimId }, order: [['height', 'ASC']], raw: true // returns an array of only data, not an array of instances }).then(function (channelClaimsArray) { // logger.debug('channelclaimsarray length:', channelClaimsArray.length); switch (channelClaimsArray.length) { case 0: return resolve(null); default: channelClaimsArray.forEach(function (claim) { claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType); claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail); return claim; }); return resolve(channelClaimsArray); } }).catch(function (error) { reject(error); }); }); }; Claim.getClaimIdByLongChannelId = function (channelClaimId, claimName) { var _this3 = this; logger.debug('finding claim id for claim ' + claimName + ' from channel ' + channelClaimId); return new Promise(function (resolve, reject) { _this3.findAll({ where: { name: claimName, certificateId: channelClaimId }, order: [['id', 'ASC']] }).then(function (result) { switch (result.length) { case 0: return resolve(null); case 1: return resolve(result[0].claimId); default: logger.error(result.length + ' records found for "' + claimName + '" in channel "' + channelClaimId + '"'); return resolve(result[0].claimId); } }).catch(function (error) { reject(error); }); }); }; Claim.getLongClaimIdFromShortClaimId = function (name, shortId) { var _this4 = this; return new Promise(function (resolve, reject) { _this4.findAll({ where: { name: name, claimId: { $like: shortId + '%' } }, order: [['height', 'ASC']] }).then(function (result) { switch (result.length) { case 0: return resolve(null); default: // note results must be sorted return resolve(result[0].claimId); } }).catch(function (error) { reject(error); }); }); }; Claim.getTopFreeClaimIdByClaimName = function (name) { var _this5 = this; return new Promise(function (resolve, reject) { _this5.findAll({ where: { name: name }, order: [['effectiveAmount', 'DESC'], ['height', 'ASC']] // note: maybe height and effective amount need to switch? }).then(function (result) { logger.debug('length of result', result.length); switch (result.length) { case 0: return resolve(null); default: return resolve(result[0].dataValues.claimId); } }).catch(function (error) { reject(error); }); }); }; Claim.validateLongClaimId = function (name, claimId) { var _this6 = this; return new Promise(function (resolve, reject) { _this6.findOne({ where: { name: name, claimId: claimId } }).then(function (result) { if (!result) { return resolve(null); }; resolve(claimId); }).catch(function (error) { reject(error); }); }); }; Claim.getLongClaimId = function (claimName, claimId) { logger.debug('getLongClaimId(' + claimName + ', ' + claimId + ')'); if (claimId && claimId.length === 40) { // if a full claim id is provided return this.validateLongClaimId(claimName, claimId); } else if (claimId && claimId.length < 40) { return this.getLongClaimIdFromShortClaimId(claimName, claimId); // if a short claim id is provided } else { return this.getTopFreeClaimIdByClaimName(claimName); // if no claim id is provided } }; Claim.resolveClaim = function (name, claimId) { var _this7 = this; logger.debug('Claim.resolveClaim: ' + name + ' ' + claimId); return new Promise(function (resolve, reject) { _this7.findAll({ where: { name: name, claimId: claimId } }).then(function (claimArray) { switch (claimArray.length) { case 0: return resolve(null); case 1: return resolve(prepareClaimData(claimArray[0].dataValues)); default: logger.error('more than one record matches ' + name + '#' + claimId + ' in db.Claim'); return resolve(prepareClaimData(claimArray[0].dataValues)); } }).catch(function (error) { reject(error); }); }); }; return Claim; }; /***/ }), /* 75 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = function (sequelize, _ref) { var STRING = _ref.STRING, BOOLEAN = _ref.BOOLEAN, INTEGER = _ref.INTEGER; var File = sequelize.define('File', { name: { type: STRING, allowNull: false }, claimId: { type: STRING, allowNull: false }, address: { type: STRING, allowNull: false }, outpoint: { type: STRING, allowNull: false }, height: { type: INTEGER, allowNull: false, default: 0 }, fileName: { type: STRING, allowNull: false }, filePath: { type: STRING, allowNull: false }, fileType: { type: STRING }, nsfw: { type: BOOLEAN, allowNull: false, defaultValue: false }, trendingEligible: { type: BOOLEAN, allowNull: false, defaultValue: true } }, { freezeTableName: true }); File.associate = function (db) { File.hasMany(db.Request); File.hasOne(db.Claim); }; File.getRecentClaims = function () { return this.findAll({ where: { nsfw: false, trendingEligible: true }, order: [['createdAt', 'DESC']], limit: 25 }); }; return File; }; /***/ }), /* 76 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = function (sequelize, _ref) { var STRING = _ref.STRING, BOOLEAN = _ref.BOOLEAN, TEXT = _ref.TEXT; var Request = sequelize.define('Request', { action: { type: STRING, allowNull: false }, url: { type: STRING, allowNull: false }, ipAddress: { type: STRING, allowNull: true }, result: { type: TEXT('long'), allowNull: true, default: null } }, { freezeTableName: true }); Request.associate = function (db) { Request.belongsTo(db.File, { foreignKey: { allowNull: true } }); }; return Request; }; /***/ }), /* 77 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var bcrypt = __webpack_require__(78); var logger = __webpack_require__(1); module.exports = function (sequelize, _ref) { var STRING = _ref.STRING; var User = sequelize.define('User', { userName: { type: STRING, allowNull: false }, password: { type: STRING, allowNull: false } }, { freezeTableName: true }); User.associate = function (db) { User.hasOne(db.Channel); }; User.prototype.comparePassword = function (password) { return bcrypt.compare(password, this.password); }; User.prototype.changePassword = function (newPassword) { var _this = this; return new Promise(function (resolve, reject) { // generate a salt string to use for hashing bcrypt.genSalt(function (saltError, salt) { if (saltError) { logger.error('salt error', saltError); reject(saltError); return; } // generate a hashed version of the user's password bcrypt.hash(newPassword, salt, function (hashError, hash) { // if there is an error with the hash generation return the error if (hashError) { logger.error('hash error', hashError); reject(hashError); return; } // replace the current password with the new hash _this.update({ password: hash }).then(function () { resolve(); }).catch(function (error) { reject(error); }); }); }); }); }; // pre-save hook method to hash the user's password before the user's info is saved to the db. User.hook('beforeCreate', function (user, options) { logger.debug('User.beforeCreate hook...'); return new Promise(function (resolve, reject) { // generate a salt string to use for hashing bcrypt.genSalt(function (saltError, salt) { if (saltError) { logger.error('salt error', saltError); reject(saltError); return; } // generate a hashed version of the user's password bcrypt.hash(user.password, salt, function (hashError, hash) { // if there is an error with the hash generation return the error if (hashError) { logger.error('hash error', hashError); reject(hashError); return; } // replace the password string with the hash password value user.password = hash; resolve(); }); }); }); }); return User; }; /***/ }), /* 78 */ /***/ (function(module, exports) { module.exports = require("bcrypt"); /***/ }), /* 79 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var PassportLocalStrategy = __webpack_require__(31).Strategy; var logger = __webpack_require__(1); var db = __webpack_require__(5); var returnUserAndChannelInfo = function returnUserAndChannelInfo(userInstance) { return new Promise(function (resolve, reject) { var userInfo = {}; userInfo['id'] = userInstance.id; userInfo['userName'] = userInstance.userName; userInstance.getChannel().then(function (_ref) { var channelName = _ref.channelName, channelClaimId = _ref.channelClaimId; userInfo['channelName'] = channelName; userInfo['channelClaimId'] = channelClaimId; return db.Certificate.getShortChannelIdFromLongChannelId(channelClaimId, channelName); }).then(function (shortChannelId) { userInfo['shortChannelId'] = shortChannelId; resolve(userInfo); }).catch(function (error) { reject(error); }); }); }; module.exports = new PassportLocalStrategy({ usernameField: 'username', passwordField: 'password' }, function (username, password, done) { return db.User.findOne({ where: { userName: username } }).then(function (user) { if (!user) { logger.debug('no user found'); return done(null, false, { message: 'Incorrect username or password' }); } return user.comparePassword(password).then(function (isMatch) { if (!isMatch) { logger.debug('incorrect password'); return done(null, false, { message: 'Incorrect username or password' }); } logger.debug('Password was a match, returning User'); return returnUserAndChannelInfo(user).then(function (userInfo) { return done(null, userInfo); }).catch(function (error) { return error; }); }).catch(function (error) { return error; }); }).catch(function (error) { return done(error); }); }); /***/ }), /* 80 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(1); var passport = __webpack_require__(28); module.exports = function (app) { // route for sign up app.post('/signup', passport.authenticate('local-signup'), function (req, res) { logger.verbose('successful signup for ' + req.user.channelName); res.status(200).json({ success: true, channelName: req.user.channelName, channelClaimId: req.user.channelClaimId, shortChannelId: req.user.shortChannelId }); }); // route for log in app.post('/login', function (req, res, next) { passport.authenticate('local-login', function (err, user, info) { if (err) { return next(err); } if (!user) { return res.status(400).json({ success: false, message: info.message }); } logger.debug('successful login'); req.logIn(user, function (err) { if (err) { return next(err); } return res.status(200).json({ success: true, channelName: req.user.channelName, channelClaimId: req.user.channelClaimId, shortChannelId: req.user.shortChannelId }); }); })(req, res, next); }); // route to log out app.get('/logout', function (req, res) { req.logout(); res.status(200).json({ success: true, message: 'you successfully logged out' }); }); // see if user is authenticated, and return credentials if so app.get('/user', function (req, res) { if (req.user) { res.status(200).json({ success: true, data: req.user }); } else { res.status(401).json({ success: false, message: 'user is not logged in' }); } }); }; /***/ }), /* 81 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var logger = __webpack_require__(1); var multipart = __webpack_require__(82); var _require = __webpack_require__(3), uploadDirectory = _require.publishing.uploadDirectory, host = _require.details.host; var multipartMiddleware = multipart({ uploadDir: uploadDirectory }); var db = __webpack_require__(5); var _require2 = __webpack_require__(83), claimNameIsAvailable = _require2.claimNameIsAvailable, checkChannelAvailability = _require2.checkChannelAvailability, publish = _require2.publish; var _require3 = __webpack_require__(16), getClaimList = _require3.getClaimList, resolveUri = _require3.resolveUri, getClaim = _require3.getClaim; var _require4 = __webpack_require__(34), addGetResultsToFileData = _require4.addGetResultsToFileData, createBasicPublishParams = _require4.createBasicPublishParams, createThumbnailPublishParams = _require4.createThumbnailPublishParams, parsePublishApiRequestBody = _require4.parsePublishApiRequestBody, parsePublishApiRequestFiles = _require4.parsePublishApiRequestFiles, createFileData = _require4.createFileData; var errorHandlers = __webpack_require__(36); var _require5 = __webpack_require__(17), sendGATimingEvent = _require5.sendGATimingEvent; var _require6 = __webpack_require__(84), authenticateUser = _require6.authenticateUser; var _require7 = __webpack_require__(37), getChannelData = _require7.getChannelData, getChannelClaims = _require7.getChannelClaims, getClaimId = _require7.getClaimId; var NO_CHANNEL = 'NO_CHANNEL'; var NO_CLAIM = 'NO_CLAIM'; module.exports = function (app) { // route to check whether site has published to a channel app.get('/api/channel/availability/:name', function (_ref, res) { var ip = _ref.ip, originalUrl = _ref.originalUrl, name = _ref.params.name; var gaStartTime = Date.now(); checkChannelAvailability(name).then(function (availableName) { res.status(200).json(availableName); sendGATimingEvent('end-to-end', 'claim name availability', name, gaStartTime, Date.now()); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); // route to get a short channel id from long channel Id app.get('/api/channel/short-id/:longId/:name', function (_ref2, res) { var ip = _ref2.ip, originalUrl = _ref2.originalUrl, params = _ref2.params; db.Certificate.getShortChannelIdFromLongChannelId(params.longId, params.name).then(function (shortId) { res.status(200).json(shortId); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); app.get('/api/channel/data/:channelName/:channelClaimId', function (_ref3, res) { var ip = _ref3.ip, originalUrl = _ref3.originalUrl, body = _ref3.body, params = _ref3.params; var channelName = params.channelName; var channelClaimId = params.channelClaimId; if (channelClaimId === 'none') channelClaimId = null; getChannelData(channelName, channelClaimId, 0).then(function (data) { if (data === NO_CHANNEL) { return res.status(404).json({ success: false, message: 'No matching channel was found' }); } res.status(200).json({ success: true, data: data }); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); app.get('/api/channel/claims/:channelName/:channelClaimId/:page', function (_ref4, res) { var ip = _ref4.ip, originalUrl = _ref4.originalUrl, body = _ref4.body, params = _ref4.params; var channelName = params.channelName; var channelClaimId = params.channelClaimId; if (channelClaimId === 'none') channelClaimId = null; var page = params.page; getChannelClaims(channelName, channelClaimId, page).then(function (data) { if (data === NO_CHANNEL) { return res.status(404).json({ success: false, message: 'No matching channel was found' }); } res.status(200).json({ success: true, data: data }); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); // route to run a claim_list request on the daemon app.get('/api/claim/list/:name', function (_ref5, res) { var ip = _ref5.ip, originalUrl = _ref5.originalUrl, params = _ref5.params; getClaimList(params.name).then(function (claimsList) { res.status(200).json(claimsList); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); // route to get an asset app.get('/api/claim/get/:name/:claimId', function (_ref6, res) { var ip = _ref6.ip, originalUrl = _ref6.originalUrl, params = _ref6.params; var name = params.name; var claimId = params.claimId; // resolve the claim db.Claim.resolveClaim(name, claimId).then(function (resolveResult) { // make sure a claim actually exists at that uri if (!resolveResult) { throw new Error('No matching uri found in Claim table'); } var fileData = createFileData(resolveResult); // get the claim return Promise.all([fileData, getClaim(name + '#' + claimId)]); }).then(function (_ref7) { var _ref8 = _slicedToArray(_ref7, 2), fileData = _ref8[0], getResult = _ref8[1]; fileData = addGetResultsToFileData(fileData, getResult); return Promise.all([db.upsert(db.File, fileData, { name: name, claimId: claimId }, 'File'), getResult]); }).then(function (_ref9) { var _ref10 = _slicedToArray(_ref9, 2), fileRecord = _ref10[0], _ref10$ = _ref10[1], message = _ref10$.message, completed = _ref10$.completed; res.status(200).json({ success: true, message: message, completed: completed }); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); // route to check whether this site published to a claim app.get('/api/claim/availability/:name', function (_ref11, res) { var ip = _ref11.ip, originalUrl = _ref11.originalUrl, name = _ref11.params.name; var gaStartTime = Date.now(); claimNameIsAvailable(name).then(function (result) { res.status(200).json(result); sendGATimingEvent('end-to-end', 'claim name availability', name, gaStartTime, Date.now()); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); // route to run a resolve request on the daemon app.get('/api/claim/resolve/:name/:claimId', function (_ref12, res) { var headers = _ref12.headers, ip = _ref12.ip, originalUrl = _ref12.originalUrl, params = _ref12.params; resolveUri(params.name + '#' + params.claimId).then(function (resolvedUri) { res.status(200).json(resolvedUri); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); // route to run a publish request on the daemon app.post('/api/claim/publish', multipartMiddleware, function (_ref13, res) { var body = _ref13.body, files = _ref13.files, headers = _ref13.headers, ip = _ref13.ip, originalUrl = _ref13.originalUrl, user = _ref13.user; // define variables var channelName = void 0, channelId = void 0, channelPassword = void 0, description = void 0, fileName = void 0, filePath = void 0, fileType = void 0, gaStartTime = void 0, license = void 0, name = void 0, nsfw = void 0, thumbnail = void 0, thumbnailFileName = void 0, thumbnailFilePath = void 0, thumbnailFileType = void 0, title = void 0; // record the start time of the request gaStartTime = Date.now(); // validate the body and files of the request try { var _parsePublishApiReque = parsePublishApiRequestBody(body); // validateApiPublishRequest(body, files); name = _parsePublishApiReque.name; nsfw = _parsePublishApiReque.nsfw; license = _parsePublishApiReque.license; title = _parsePublishApiReque.title; description = _parsePublishApiReque.description; thumbnail = _parsePublishApiReque.thumbnail; var _parsePublishApiReque2 = parsePublishApiRequestFiles(files); fileName = _parsePublishApiReque2.fileName; filePath = _parsePublishApiReque2.filePath; fileType = _parsePublishApiReque2.fileType; thumbnailFileName = _parsePublishApiReque2.thumbnailFileName; thumbnailFilePath = _parsePublishApiReque2.thumbnailFilePath; thumbnailFileType = _parsePublishApiReque2.thumbnailFileType; channelName = body.channelName; channelId = body.channelId; channelPassword = body.channelPassword; } catch (error) { return res.status(400).json({ success: false, message: error.message }); } // check channel authorization Promise.all([authenticateUser(channelName, channelId, channelPassword, user), claimNameIsAvailable(name), createBasicPublishParams(filePath, name, title, description, license, nsfw, thumbnail), createThumbnailPublishParams(thumbnailFilePath, name, license, nsfw)]).then(function (_ref14) { var _ref15 = _slicedToArray(_ref14, 4), _ref15$ = _ref15[0], channelName = _ref15$.channelName, channelClaimId = _ref15$.channelClaimId, validatedClaimName = _ref15[1], publishParams = _ref15[2], thumbnailPublishParams = _ref15[3]; // add channel details to the publish params if (channelName && channelClaimId) { publishParams['channel_name'] = channelName; publishParams['channel_id'] = channelClaimId; } // publish the thumbnail if (thumbnailPublishParams) { publish(thumbnailPublishParams, thumbnailFileName, thumbnailFileType); } // publish the asset return publish(publishParams, fileName, fileType); }).then(function (result) { res.status(200).json({ success: true, message: 'publish completed successfully', data: { name: name, claimId: result.claim_id, url: host + '/' + result.claim_id + '/' + name, lbryTx: result } }); // record the publish end time and send to google analytics sendGATimingEvent('end-to-end', 'publish', fileType, gaStartTime, Date.now()); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); // route to get a short claim id from long claim Id app.get('/api/claim/short-id/:longId/:name', function (_ref16, res) { var ip = _ref16.ip, originalUrl = _ref16.originalUrl, body = _ref16.body, params = _ref16.params; db.Claim.getShortClaimIdFromLongClaimId(params.longId, params.name).then(function (shortId) { res.status(200).json({ success: true, data: shortId }); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); app.post('/api/claim/long-id', function (_ref17, res) { var ip = _ref17.ip, originalUrl = _ref17.originalUrl, body = _ref17.body, params = _ref17.params; logger.debug('body:', body); var channelName = body.channelName; var channelClaimId = body.channelClaimId; var claimName = body.claimName; var claimId = body.claimId; getClaimId(channelName, channelClaimId, claimName, claimId).then(function (result) { if (result === NO_CHANNEL) { return res.status(404).json({ success: false, message: 'No matching channel could be found' }); } if (result === NO_CLAIM) { return res.status(404).json({ success: false, message: 'No matching claim id could be found' }); } res.status(200).json({ success: true, data: result }); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); app.get('/api/claim/data/:claimName/:claimId', function (_ref18, res) { var ip = _ref18.ip, originalUrl = _ref18.originalUrl, body = _ref18.body, params = _ref18.params; var claimName = params.claimName; var claimId = params.claimId; if (claimId === 'none') claimId = null; db.Claim.resolveClaim(claimName, claimId).then(function (claimInfo) { if (!claimInfo) { return res.status(404).json({ success: false, message: 'No claim could be found' }); } res.status(200).json({ success: true, data: claimInfo }); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); // route to see if asset is available locally app.get('/api/file/availability/:name/:claimId', function (_ref19, res) { var ip = _ref19.ip, originalUrl = _ref19.originalUrl, params = _ref19.params; var name = params.name; var claimId = params.claimId; db.File.findOne({ where: { name: name, claimId: claimId } }).then(function (result) { if (result) { return res.status(200).json({ success: true, data: true }); } res.status(200).json({ success: true, data: false }); }).catch(function (error) { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); }); }; /***/ }), /* 82 */ /***/ (function(module, exports) { module.exports = require("connect-multiparty"); /***/ }), /* 83 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var logger = __webpack_require__(1); var db = __webpack_require__(5); var lbryApi = __webpack_require__(16); var publishHelpers = __webpack_require__(34); var _require = __webpack_require__(3), _require$publishing = _require.publishing, primaryClaimAddress = _require$publishing.primaryClaimAddress, additionalClaimAddresses = _require$publishing.additionalClaimAddresses; var Sequelize = __webpack_require__(32); var Op = Sequelize.Op; module.exports = { publish: function publish(publishParams, fileName, fileType) { return new Promise(function (resolve, reject) { var publishResults = void 0, certificateId = void 0, channelName = void 0; // publish the file return lbryApi.publishClaim(publishParams).then(function (tx) { logger.info('Successfully published ' + publishParams.name + ' ' + fileName, tx); publishResults = tx; // get the channel information if (publishParams.channel_name) { logger.debug('this claim was published in channel: ' + publishParams.channel_name); return db.Channel.findOne({ where: { channelName: publishParams.channel_name } }); } else { logger.debug('this claim was not published in a channel'); return null; } }).then(function (channel) { // set channel information certificateId = null; channelName = null; if (channel) { certificateId = channel.channelClaimId; channelName = channel.channelName; } logger.debug('certificateId: ' + certificateId); }).then(function () { // create the File record var fileRecord = { name: publishParams.name, claimId: publishResults.claim_id, title: publishParams.metadata.title, description: publishParams.metadata.description, address: publishParams.claim_address, outpoint: publishResults.txid + ':' + publishResults.nout, height: 0, fileName: fileName, filePath: publishParams.file_path, fileType: fileType, nsfw: publishParams.metadata.nsfw }; // create the Claim record var claimRecord = { name: publishParams.name, claimId: publishResults.claim_id, title: publishParams.metadata.title, description: publishParams.metadata.description, address: publishParams.claim_address, thumbnail: publishParams.metadata.thumbnail, outpoint: publishResults.txid + ':' + publishResults.nout, height: 0, contentType: fileType, nsfw: publishParams.metadata.nsfw, amount: publishParams.bid, certificateId: certificateId, channelName: channelName }; // upsert criteria var upsertCriteria = { name: publishParams.name, claimId: publishResults.claim_id }; // upsert the records return Promise.all([db.upsert(db.File, fileRecord, upsertCriteria, 'File'), db.upsert(db.Claim, claimRecord, upsertCriteria, 'Claim')]); }).then(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), file = _ref2[0], claim = _ref2[1]; logger.debug('File and Claim records successfully created'); return Promise.all([file.setClaim(claim), claim.setFile(file)]); }).then(function () { logger.debug('File and Claim records successfully associated'); resolve(publishResults); // resolve the promise with the result from lbryApi.publishClaim; }).catch(function (error) { logger.error('PUBLISH ERROR', error); publishHelpers.deleteTemporaryFile(publishParams.file_path); // delete the local file reject(error); }); }); }, claimNameIsAvailable: function claimNameIsAvailable(name) { var claimAddresses = additionalClaimAddresses || []; claimAddresses.push(primaryClaimAddress); // find any records where the name is used return db.Claim.findAll({ attributes: ['address'], where: { name: name, address: _defineProperty({}, Op.or, claimAddresses) } }).then(function (result) { if (result.length >= 1) { throw new Error('That claim is already in use'); }; return name; }).catch(function (error) { throw error; }); }, checkChannelAvailability: function checkChannelAvailability(name) { return db.Channel.findAll({ where: { channelName: name } }).then(function (result) { if (result.length >= 1) { throw new Error('That channel has already been claimed'); } return name; }).catch(function (error) { throw error; }); } }; /***/ }), /* 84 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var db = __webpack_require__(5); var logger = __webpack_require__(1); module.exports = { authenticateUser: function authenticateUser(channelName, channelId, channelPassword, user) { // case: no channelName or channel Id are provided (anonymous), regardless of whether user token is provided if (!channelName && !channelId) { return { channelName: null, channelClaimId: null }; } // case: channelName or channel Id are provided with user token if (user) { if (channelName && channelName !== user.channelName) { throw new Error('the provided channel name does not match user credentials'); } if (channelId && channelId !== user.channelClaimId) { throw new Error('the provided channel id does not match user credentials'); } return { channelName: user.channelName, channelClaimId: user.channelClaimId }; } // case: channelName or channel Id are provided with password instead of user token if (!channelPassword) throw new Error('no channel password provided'); return module.exports.authenticateChannelCredentials(channelName, channelId, channelPassword); }, authenticateChannelCredentials: function authenticateChannelCredentials(channelName, channelId, userPassword) { return new Promise(function (resolve, reject) { // hoisted variables var channelData = void 0; // build the params for finding the channel var channelFindParams = {}; if (channelName) channelFindParams['channelName'] = channelName; if (channelId) channelFindParams['channelClaimId'] = channelId; // find the channel db.Channel.findOne({ where: channelFindParams }).then(function (channel) { if (!channel) { logger.debug('no channel found'); throw new Error('Authentication failed, you do not have access to that channel'); } channelData = channel.get(); logger.debug('channel data:', channelData); return db.User.findOne({ where: { userName: channelData.channelName.substring(1) } }); }).then(function (user) { if (!user) { logger.debug('no user found'); throw new Error('Authentication failed, you do not have access to that channel'); } return user.comparePassword(userPassword); }).then(function (isMatch) { if (!isMatch) { logger.debug('incorrect password'); throw new Error('Authentication failed, you do not have access to that channel'); } logger.debug('...password was a match...'); resolve(channelData); }).catch(function (error) { reject(error); }); }); } }; /***/ }), /* 85 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var CLAIMS_PER_PAGE = 12; module.exports = { returnPaginatedChannelClaims: function returnPaginatedChannelClaims(channelName, longChannelClaimId, claims, page) { var totalPages = module.exports.determineTotalPages(claims); var paginationPage = module.exports.getPageFromQuery(page); var viewData = { channelName: channelName, longChannelClaimId: longChannelClaimId, claims: module.exports.extractPageFromClaims(claims, paginationPage), previousPage: module.exports.determinePreviousPage(paginationPage), currentPage: paginationPage, nextPage: module.exports.determineNextPage(totalPages, paginationPage), totalPages: totalPages, totalResults: module.exports.determineTotalClaims(claims) }; return viewData; }, getPageFromQuery: function getPageFromQuery(page) { if (page) { return parseInt(page); } return 1; }, extractPageFromClaims: function extractPageFromClaims(claims, pageNumber) { if (!claims) { return []; // if no claims, return this default } // logger.debug('claims is array?', Array.isArray(claims)); // logger.debug(`pageNumber ${pageNumber} is number?`, Number.isInteger(pageNumber)); var claimStartIndex = (pageNumber - 1) * CLAIMS_PER_PAGE; var claimEndIndex = claimStartIndex + CLAIMS_PER_PAGE; var pageOfClaims = claims.slice(claimStartIndex, claimEndIndex); return pageOfClaims; }, determineTotalPages: function determineTotalPages(claims) { if (!claims) { return 0; } else { var totalClaims = claims.length; if (totalClaims < CLAIMS_PER_PAGE) { return 1; } var fullPages = Math.floor(totalClaims / CLAIMS_PER_PAGE); var remainder = totalClaims % CLAIMS_PER_PAGE; if (remainder === 0) { return fullPages; } return fullPages + 1; } }, determinePreviousPage: function determinePreviousPage(currentPage) { if (currentPage === 1) { return null; } return currentPage - 1; }, determineNextPage: function determineNextPage(totalPages, currentPage) { if (currentPage === totalPages) { return null; } return currentPage + 1; }, determineTotalClaims: function determineTotalClaims(claims) { if (!claims) { return 0; } return claims.length; } }; /***/ }), /* 86 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _require = __webpack_require__(3), host = _require.details; var handlePageRender = __webpack_require__(38); module.exports = function (app) { // route for the home page app.get('/', function (req, res) { handlePageRender(req, res); }); // route to display login page app.get('/login', function (req, res) { handlePageRender(req, res); }); // route to show 'about' page app.get('/about', function (req, res) { handlePageRender(req, res); }); // route to display a list of the trending images app.get('/trending', function (req, res) { res.status(301).redirect('/popular'); }); app.get('/popular', function (req, res) { handlePageRender(req, res); }); // route to display a list of the trending images app.get('/new', function (req, res) { handlePageRender(req, res); }); // route to send embedable video player (for twitter) app.get('/embed/:claimId/:name', function (_ref, res) { var params = _ref.params; var claimId = params.claimId; var name = params.name; // get and render the content res.status(200).render('embed', { layout: 'embed', host: host, claimId: claimId, name: name }); }); }; /***/ }), /* 87 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function () { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; var action = arguments[1]; switch (action.type) { case actions.FILE_SELECTED: return Object.assign({}, initialState, { // note: clears to initial state file: action.data }); case actions.FILE_CLEAR: return initialState; case actions.METADATA_UPDATE: return Object.assign({}, state, { metadata: Object.assign({}, state.metadata, _defineProperty({}, action.data.name, action.data.value)) }); case actions.CLAIM_UPDATE: return Object.assign({}, state, { claim: action.data }); case actions.SET_PUBLISH_IN_CHANNEL: return Object.assign({}, state, { publishInChannel: action.channel }); case actions.PUBLISH_STATUS_UPDATE: return Object.assign({}, state, { status: action.data }); case actions.ERROR_UPDATE: return Object.assign({}, state, { error: Object.assign({}, state.error, _defineProperty({}, action.data.name, action.data.value)) }); case actions.SELECTED_CHANNEL_UPDATE: return Object.assign({}, state, { selectedChannel: action.data }); case actions.TOGGLE_METADATA_INPUTS: return Object.assign({}, state, { showMetadataInputs: action.data }); case actions.THUMBNAIL_NEW: return Object.assign({}, state, { thumbnail: action.data }); default: return state; } }; var _publish_action_types = __webpack_require__(41); var actions = _interopRequireWildcard(_publish_action_types); var _publish_channel_select_states = __webpack_require__(88); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var _require = __webpack_require__(3), publishing = _require.publishing; var initialState = { disabled: publishing.disabled, disabledMessage: publishing.disabledMessage, publishInChannel: false, selectedChannel: _publish_channel_select_states.LOGIN, showMetadataInputs: false, status: { status: null, message: null }, error: { file: null, url: null, channel: null, publishSubmit: null }, file: null, claim: '', metadata: { title: '', description: '', license: '', nsfw: false }, thumbnail: null }; /***/ }), /* 88 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var LOGIN = exports.LOGIN = 'Existing'; var CREATE = exports.CREATE = 'New'; /***/ }), /* 89 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function () { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; var action = arguments[1]; switch (action.type) { case actions.CHANNEL_UPDATE: return Object.assign({}, state, { loggedInChannel: action.data }); default: return state; } }; var _channel_action_types = __webpack_require__(42); var actions = _interopRequireWildcard(_channel_action_types); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } var initialState = { loggedInChannel: { name: null, shortId: null, longId: null } }; /***/ }), /* 90 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function () { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; var action = arguments[1]; switch (action.type) { // handle request case actions.REQUEST_ERROR: return Object.assign({}, state, { request: Object.assign({}, state.request, { error: action.data }) }); case actions.REQUEST_UPDATE: return Object.assign({}, state, { request: Object.assign({}, state.request, { type: action.data.requestType, id: action.data.requestId }) }); // store requests case actions.REQUEST_LIST_ADD: return Object.assign({}, state, { requestList: Object.assign({}, state.requestList, _defineProperty({}, action.data.id, { error: action.data.error, key: action.data.key })) }); // asset data case actions.ASSET_ADD: return Object.assign({}, state, { assetList: Object.assign({}, state.assetList, _defineProperty({}, action.data.id, { error: action.data.error, name: action.data.name, claimId: action.data.claimId, shortId: action.data.shortId, claimData: action.data.claimData })) }); // channel data case actions.CHANNEL_ADD: return Object.assign({}, state, { channelList: Object.assign({}, state.channelList, _defineProperty({}, action.data.id, { name: action.data.name, longId: action.data.longId, shortId: action.data.shortId, claimsData: action.data.claimsData })) }); case actions.CHANNEL_CLAIMS_UPDATE_SUCCESS: return Object.assign({}, state, { channelList: Object.assign({}, state.channelList, _defineProperty({}, action.data.channelListId, Object.assign({}, state.channelList[action.data.channelListId], { claimsData: action.data.claimsData }))) }); // display an asset case actions.FILE_AVAILABILITY_UPDATE: return Object.assign({}, state, { displayAsset: Object.assign({}, state.displayAsset, { status: action.data }) }); case actions.DISPLAY_ASSET_ERROR: return Object.assign({}, state, { displayAsset: Object.assign({}, state.displayAsset, { error: action.data, status: _asset_display_states.ERROR }) }); default: return state; } }; var _show_action_types = __webpack_require__(9); var actions = _interopRequireWildcard(_show_action_types); var _asset_display_states = __webpack_require__(43); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var initialState = { request: { error: null, type: null, id: null }, requestList: {}, channelList: {}, assetList: {}, displayAsset: { error: null, status: _asset_display_states.LOCAL_CHECK } }; /***/ }), /* 91 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function () { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; var action = arguments[1]; switch (action.type) { default: return state; } }; var siteConfig = __webpack_require__(3); var googleAnalyticsId = siteConfig.analytics.googleId, _siteConfig$assetDefa = siteConfig.assetDefaults, defaultThumbnail = _siteConfig$assetDefa.thumbnail, defaultDescription = _siteConfig$assetDefa.description, _siteConfig$details = siteConfig.details, description = _siteConfig$details.description, host = _siteConfig$details.host, title = _siteConfig$details.title, twitter = _siteConfig$details.twitter; var initialState = { description: description, googleAnalyticsId: googleAnalyticsId, host: host, title: title, twitter: twitter, defaultDescription: defaultDescription, defaultThumbnail: defaultThumbnail }; /***/ }), /* 92 */ /***/ (function(module, exports) { module.exports = require("react-ga"); /***/ }), /* 93 */ /***/ (function(module, exports) { module.exports = require("cross-fetch/polyfill"); /***/ }), /* 94 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _NavBar = __webpack_require__(8); var _NavBar2 = _interopRequireDefault(_NavBar); var _SEO = __webpack_require__(10); var _SEO2 = _interopRequireDefault(_SEO); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var AboutPage = function (_React$Component) { _inherits(AboutPage, _React$Component); function AboutPage() { _classCallCheck(this, AboutPage); return _possibleConstructorReturn(this, (AboutPage.__proto__ || Object.getPrototypeOf(AboutPage)).apply(this, arguments)); } _createClass(AboutPage, [{ key: 'render', value: function render() { return _react2.default.createElement( 'div', null, _react2.default.createElement(_SEO2.default, { pageTitle: 'About', pageUri: 'about' }), _react2.default.createElement(_NavBar2.default, null), _react2.default.createElement( 'div', { className: 'row row--padded' }, _react2.default.createElement( 'div', { className: 'column column--5 column--med-10 align-content-top' }, _react2.default.createElement( 'div', { className: 'column column--8 column--med-10' }, _react2.default.createElement( 'p', { className: 'pull-quote' }, 'Spee.ch is an open-source project. Please contribute to the existing site, or fork it and make your own.' ), _react2.default.createElement( 'p', null, _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://twitter.com/spee_ch' }, 'TWITTER' ) ), _react2.default.createElement( 'p', null, _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://github.com/lbryio/spee.ch' }, 'GITHUB' ) ), _react2.default.createElement( 'p', null, _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://discord.gg/YjYbwhS' }, 'DISCORD CHANNEL' ) ), _react2.default.createElement( 'p', null, _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://github.com/lbryio/spee.ch/blob/master/README.md' }, 'DOCUMENTATION' ) ) ) ), _react2.default.createElement( 'div', { className: 'column column--5 column--med-10 align-content-top' }, _react2.default.createElement( 'div', { className: 'column column--8 column--med-10' }, _react2.default.createElement( 'p', null, 'Spee.ch is a media-hosting site that reads from and publishes content to the ', _react2.default.createElement( 'a', { className: 'link--primary', href: 'https://lbry.io' }, 'LBRY' ), ' blockchain.' ), _react2.default.createElement( 'p', null, 'Spee.ch is a hosting service, but with the added benefit that it stores your content on a decentralized network of computers -- the ', _react2.default.createElement( 'a', { className: 'link--primary', href: 'https://lbry.io/get' }, 'LBRY' ), ' network. This means that your images are stored in multiple locations without a single point of failure.' ), _react2.default.createElement( 'h3', null, 'Contribute' ), _react2.default.createElement( 'p', null, 'If you have an idea for your own spee.ch-like site on top of LBRY, fork our ', _react2.default.createElement( 'a', { className: 'link--primary', href: 'https://github.com/lbryio/spee.ch' }, 'github repo' ), ' and go to town!' ), _react2.default.createElement( 'p', null, 'If you want to improve spee.ch, join our ', _react2.default.createElement( 'a', { className: 'link--primary', href: 'https://discord.gg/YjYbwhS' }, 'discord channel' ), ' or solve one of our ', _react2.default.createElement( 'a', { className: 'link--primary', href: 'https://github.com/lbryio/spee.ch/issues' }, 'github issues' ), '.' ) ) ) ) ); } }]); return AboutPage; }(_react2.default.Component); ; exports.default = AboutPage; /***/ }), /* 95 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactRouterDom = __webpack_require__(4); var _Logo = __webpack_require__(96); var _Logo2 = _interopRequireDefault(_Logo); var _NavBarChannelOptionsDropdown = __webpack_require__(97); var _NavBarChannelOptionsDropdown2 = _interopRequireDefault(_NavBarChannelOptionsDropdown); var _request = __webpack_require__(6); var _request2 = _interopRequireDefault(_request); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var VIEW = 'VIEW'; var LOGOUT = 'LOGOUT'; var NavBar = function (_React$Component) { _inherits(NavBar, _React$Component); function NavBar(props) { _classCallCheck(this, NavBar); var _this = _possibleConstructorReturn(this, (NavBar.__proto__ || Object.getPrototypeOf(NavBar)).call(this, props)); _this.checkForLoggedInUser = _this.checkForLoggedInUser.bind(_this); _this.logoutUser = _this.logoutUser.bind(_this); _this.handleSelection = _this.handleSelection.bind(_this); return _this; } _createClass(NavBar, [{ key: 'componentDidMount', value: function componentDidMount() { // check to see if the user is already logged in this.checkForLoggedInUser(); } }, { key: 'checkForLoggedInUser', value: function checkForLoggedInUser() { var _this2 = this; var params = { credentials: 'include' }; (0, _request2.default)('/user', params).then(function (_ref) { var data = _ref.data; _this2.props.onChannelLogin(data.channelName, data.shortChannelId, data.channelClaimId); }).catch(function (error) { console.log('/user error:', error.message); }); } }, { key: 'logoutUser', value: function logoutUser() { var _this3 = this; var params = { credentials: 'include' }; (0, _request2.default)('/logout', params).then(function () { _this3.props.onChannelLogout(); }).catch(function (error) { console.log('/logout error', error.message); }); } }, { key: 'handleSelection', value: function handleSelection(event) { var value = event.target.selectedOptions[0].value; switch (value) { case LOGOUT: this.logoutUser(); break; case VIEW: // redirect to channel page this.props.history.push('/' + this.props.channelName + ':' + this.props.channelLongId); break; default: break; } } }, { key: 'render', value: function render() { var siteDescription = this.props.siteDescription; return _react2.default.createElement( 'div', { className: 'row row--wide nav-bar' }, _react2.default.createElement( 'div', { className: 'row row--padded row--short flex-container--row flex-container--space-between-center' }, _react2.default.createElement(_Logo2.default, null), _react2.default.createElement( 'div', { className: 'nav-bar--center' }, _react2.default.createElement( 'span', { className: 'nav-bar-tagline' }, siteDescription ) ), _react2.default.createElement( 'div', { className: 'nav-bar--right' }, _react2.default.createElement( _reactRouterDom.NavLink, { className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/', exact: true }, 'Publish' ), _react2.default.createElement( _reactRouterDom.NavLink, { className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/about' }, 'About' ), this.props.channelName ? _react2.default.createElement(_NavBarChannelOptionsDropdown2.default, { channelName: this.props.channelName, handleSelection: this.handleSelection, defaultSelection: this.props.channelName, VIEW: VIEW, LOGOUT: LOGOUT }) : _react2.default.createElement( _reactRouterDom.NavLink, { id: 'nav-bar-login-link', className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/login' }, 'Channel' ) ) ) ); } }]); return NavBar; }(_react2.default.Component); exports.default = (0, _reactRouterDom.withRouter)(NavBar); /***/ }), /* 96 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactRouterDom = __webpack_require__(4); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function Logo() { return _react2.default.createElement( 'svg', { version: '1.1', id: 'Layer_1', x: '0px', y: '0px', height: '24px', viewBox: '0 0 80 31', enableBackground: 'new 0 0 80 31', className: 'nav-bar-logo' }, _react2.default.createElement( _reactRouterDom.Link, { to: '/' }, _react2.default.createElement( 'title', null, 'Logo' ), _react2.default.createElement( 'desc', null, 'Spee.ch logo' ), _react2.default.createElement( 'g', { id: 'About' }, _react2.default.createElement( 'g', { id: 'Publish-Form-V2-_x28_filled_x29_', transform: 'translate(-42.000000, -23.000000)' }, _react2.default.createElement( 'g', { id: 'Group-17', transform: 'translate(42.000000, 22.000000)' }, _react2.default.createElement( 'text', { transform: 'matrix(1 0 0 1 0 20)', fontSize: '25', fontFamily: 'Roboto' }, 'Spee' }) : _react2.default.createElement('input', { type: 'text', id: 'embed-text', className: 'input-disabled input-text--full-width', readOnly: true, onClick: this.select, spellCheck: 'false', value: '' }) ), _react2.default.createElement('div', { className: 'column column--1' }), _react2.default.createElement( 'div', { className: 'column column--2' }, _react2.default.createElement( 'button', { className: 'button--primary button--wide', 'data-elementtocopy': 'embed-text', onClick: this.copyToClipboard }, 'copy' ) ) ) ) ) ), _react2.default.createElement( 'div', { className: 'flex-container--row flex-container--space-between-bottom' }, _react2.default.createElement( _reactRouterDom.Link, { className: 'link--primary', to: '/' + shortId + '/' + name + '.' + fileExt }, _react2.default.createElement( 'span', { className: 'text' }, 'Direct Link' ) ), _react2.default.createElement( 'a', { className: 'link--primary', href: host + '/' + claimId + '/' + name + '.' + fileExt, download: name }, 'Download' ), _react2.default.createElement( 'a', { className: 'link--primary', target: '_blank', href: 'https://lbry.io/dmca' }, 'Report' ) ) ); } }]); return AssetInfo; }(_react2.default.Component); ; exports.default = AssetInfo; /***/ }), /* 118 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(2); var _view = __webpack_require__(119); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var show = _ref.show; // select request info var requestId = show.request.id; // select request var previousRequest = show.requestList[requestId] || null; // select channel var channel = void 0; if (previousRequest) { var channelKey = previousRequest.key; channel = show.channelList[channelKey] || null; } return { channel: channel }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 119 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _SEO = __webpack_require__(10); var _SEO2 = _interopRequireDefault(_SEO); var _ErrorPage = __webpack_require__(27); var _ErrorPage2 = _interopRequireDefault(_ErrorPage); var _NavBar = __webpack_require__(8); var _NavBar2 = _interopRequireDefault(_NavBar); var _ChannelClaimsDisplay = __webpack_require__(120); var _ChannelClaimsDisplay2 = _interopRequireDefault(_ChannelClaimsDisplay); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ShowChannel = function (_React$Component) { _inherits(ShowChannel, _React$Component); function ShowChannel() { _classCallCheck(this, ShowChannel); return _possibleConstructorReturn(this, (ShowChannel.__proto__ || Object.getPrototypeOf(ShowChannel)).apply(this, arguments)); } _createClass(ShowChannel, [{ key: 'render', value: function render() { var channel = this.props.channel; if (channel) { var name = channel.name, longId = channel.longId, shortId = channel.shortId; return _react2.default.createElement( 'div', null, _react2.default.createElement(_SEO2.default, { pageTitle: name, channel: channel }), _react2.default.createElement(_NavBar2.default, null), _react2.default.createElement( 'div', { className: 'row row--tall row--padded' }, _react2.default.createElement( 'div', { className: 'column column--10' }, _react2.default.createElement( 'h2', null, 'channel name: ', name ), _react2.default.createElement( 'p', { className: 'fine-print' }, 'full channel id: ', longId ), _react2.default.createElement( 'p', { className: 'fine-print' }, 'short channel id: ', shortId ) ), _react2.default.createElement( 'div', { className: 'column column--10' }, _react2.default.createElement(_ChannelClaimsDisplay2.default, null) ) ) ); }; return _react2.default.createElement(_ErrorPage2.default, { error: 'loading channel data...' }); } }]); return ShowChannel; }(_react2.default.Component); ; exports.default = ShowChannel; /***/ }), /* 120 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(2); var _show = __webpack_require__(7); var _view = __webpack_require__(121); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var show = _ref.show; // select channel key var request = show.requestList[show.request.id]; var channelKey = request.key; // select channel claims var channel = show.channelList[channelKey] || null; // return props return { channelKey: channelKey, channel: channel }; }; var mapDispatchToProps = { onUpdateChannelClaims: _show.onUpdateChannelClaims }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); /***/ }), /* 121 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _AssetPreview = __webpack_require__(122); var _AssetPreview2 = _interopRequireDefault(_AssetPreview); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ChannelClaimsDisplay = function (_React$Component) { _inherits(ChannelClaimsDisplay, _React$Component); function ChannelClaimsDisplay(props) { _classCallCheck(this, ChannelClaimsDisplay); var _this = _possibleConstructorReturn(this, (ChannelClaimsDisplay.__proto__ || Object.getPrototypeOf(ChannelClaimsDisplay)).call(this, props)); _this.showNextResultsPage = _this.showNextResultsPage.bind(_this); _this.showPreviousResultsPage = _this.showPreviousResultsPage.bind(_this); return _this; } _createClass(ChannelClaimsDisplay, [{ key: 'showPreviousResultsPage', value: function showPreviousResultsPage() { var currentPage = this.props.channel.claimsData.currentPage; var previousPage = parseInt(currentPage) - 1; this.showNewPage(previousPage); } }, { key: 'showNextResultsPage', value: function showNextResultsPage() { var currentPage = this.props.channel.claimsData.currentPage; var nextPage = parseInt(currentPage) + 1; this.showNewPage(nextPage); } }, { key: 'showNewPage', value: function showNewPage(page) { var _props = this.props, channelKey = _props.channelKey, _props$channel = _props.channel, name = _props$channel.name, longId = _props$channel.longId; this.props.onUpdateChannelClaims(channelKey, name, longId, page); } }, { key: 'render', value: function render() { var _props$channel$claims = this.props.channel.claimsData, claims = _props$channel$claims.claims, currentPage = _props$channel$claims.currentPage, totalPages = _props$channel$claims.totalPages; return _react2.default.createElement( 'div', { className: 'row row--tall' }, claims.length > 0 ? _react2.default.createElement( 'div', null, claims.map(function (claim, index) { return _react2.default.createElement(_AssetPreview2.default, { claimData: claim, key: claim.name + '-' + index }); }), _react2.default.createElement( 'div', null, currentPage > 1 && _react2.default.createElement( 'button', { className: 'button--secondary', onClick: this.showPreviousResultsPage }, 'Previous Page' ), currentPage < totalPages && _react2.default.createElement( 'button', { className: 'button--secondary', onClick: this.showNextResultsPage }, 'Next Page' ) ) ) : _react2.default.createElement( 'p', null, 'There are no claims in this channel' ) ); } }]); return ChannelClaimsDisplay; }(_react2.default.Component); ; exports.default = ChannelClaimsDisplay; /***/ }), /* 122 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(2); var _view = __webpack_require__(123); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var defaultThumbnail = _ref.site.defaults.defaultThumbnail; return { defaultThumbnail: defaultThumbnail }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 123 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactRouterDom = __webpack_require__(4); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var AssetPreview = function AssetPreview(_ref) { var defaultThumbnail = _ref.defaultThumbnail, _ref$claimData = _ref.claimData, name = _ref$claimData.name, claimId = _ref$claimData.claimId, fileExt = _ref$claimData.fileExt, contentType = _ref$claimData.contentType, thumbnail = _ref$claimData.thumbnail; var directSourceLink = claimId + '/' + name + '.' + fileExt; var showUrlLink = '/' + claimId + '/' + name; return _react2.default.createElement( 'div', { className: 'asset-holder' }, _react2.default.createElement( _reactRouterDom.Link, { to: showUrlLink }, function () { switch (contentType) { case 'image/jpeg': case 'image/jpg': case 'image/png': case 'image/gif': return _react2.default.createElement('img', { className: 'asset-preview', src: directSourceLink, alt: name }); case 'video/mp4': return _react2.default.createElement('img', { className: 'asset-preview video', src: thumbnail || defaultThumbnail, alt: name }); default: return _react2.default.createElement( 'p', null, 'unsupported file type' ); } }() ) ); }; exports.default = AssetPreview; /***/ }), /* 124 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _reactRedux = __webpack_require__(2); var _view = __webpack_require__(125); var _view2 = _interopRequireDefault(_view); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var mapStateToProps = function mapStateToProps(_ref) { var _ref$site = _ref.site, host = _ref$site.host, title = _ref$site.title; return { host: host, title: title }; }; exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); /***/ }), /* 125 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _NavBar = __webpack_require__(8); var _NavBar2 = _interopRequireDefault(_NavBar); var _reactHelmet = __webpack_require__(13); var _reactHelmet2 = _interopRequireDefault(_reactHelmet); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var FourOhForPage = function (_React$Component) { _inherits(FourOhForPage, _React$Component); function FourOhForPage() { _classCallCheck(this, FourOhForPage); return _possibleConstructorReturn(this, (FourOhForPage.__proto__ || Object.getPrototypeOf(FourOhForPage)).apply(this, arguments)); } _createClass(FourOhForPage, [{ key: 'render', value: function render() { var _props = this.props, title = _props.title, host = _props.host; return _react2.default.createElement( 'div', null, _react2.default.createElement( _reactHelmet2.default, null, _react2.default.createElement( 'title', null, title, ' - 404' ), _react2.default.createElement('link', { rel: 'canonical', href: host + '/404' }) ), _react2.default.createElement(_NavBar2.default, null), _react2.default.createElement( 'div', { className: 'row row--padded' }, _react2.default.createElement( 'h2', null, '404' ), _react2.default.createElement( 'p', null, 'That page does not exist' ) ) ); } }]); return FourOhForPage; }(_react2.default.Component); ; exports.default = FourOhForPage; /***/ }), /* 126 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _require = __webpack_require__(17), sendGAServeEvent = _require.sendGAServeEvent; var _require2 = __webpack_require__(127), determineResponseType = _require2.determineResponseType, flipClaimNameAndIdForBackwardsCompatibility = _require2.flipClaimNameAndIdForBackwardsCompatibility, logRequestData = _require2.logRequestData, getClaimIdAndServeAsset = _require2.getClaimIdAndServeAsset; var lbryUri = __webpack_require__(128); var handleShowRender = __webpack_require__(129); var SERVE = 'SERVE'; module.exports = function (app) { // route to serve a specific asset using the channel or claim id app.get('/:identifier/:claim', function (req, res) { var headers = req.headers, ip = req.ip, originalUrl = req.originalUrl, params = req.params; // decide if this is a show request var hasFileExtension = void 0; try { var _lbryUri$parseModifie = lbryUri.parseModifier(params.claim); hasFileExtension = _lbryUri$parseModifie.hasFileExtension; } catch (error) { return res.status(400).json({ success: false, message: error.message }); } var responseType = determineResponseType(hasFileExtension, headers); if (responseType !== SERVE) { return handleShowRender(req, res); } // handle serve request // send google analytics sendGAServeEvent(headers, ip, originalUrl); // parse the claim var claimName = void 0; try { var _lbryUri$parseClaim = lbryUri.parseClaim(params.claim); claimName = _lbryUri$parseClaim.claimName; } catch (error) { return res.status(400).json({ success: false, message: error.message }); } // parse the identifier var isChannel = void 0, channelName = void 0, channelClaimId = void 0, claimId = void 0; try { var _lbryUri$parseIdentif = lbryUri.parseIdentifier(params.identifier); isChannel = _lbryUri$parseIdentif.isChannel; channelName = _lbryUri$parseIdentif.channelName; channelClaimId = _lbryUri$parseIdentif.channelClaimId; claimId = _lbryUri$parseIdentif.claimId; } catch (error) { return res.status(400).json({ success: false, message: error.message }); } if (!isChannel) { var _flipClaimNameAndIdFo = flipClaimNameAndIdForBackwardsCompatibility(claimId, claimName); var _flipClaimNameAndIdFo2 = _slicedToArray(_flipClaimNameAndIdFo, 2); claimId = _flipClaimNameAndIdFo2[0]; claimName = _flipClaimNameAndIdFo2[1]; } // log the request data for debugging logRequestData(responseType, claimName, channelName, claimId); // get the claim Id and then serve the asset getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res); }); // route to serve the winning asset at a claim or a channel page app.get('/:claim', function (req, res) { var headers = req.headers, ip = req.ip, originalUrl = req.originalUrl, params = req.params; // decide if this is a show request var hasFileExtension = void 0; try { var _lbryUri$parseModifie2 = lbryUri.parseModifier(params.claim); hasFileExtension = _lbryUri$parseModifie2.hasFileExtension; } catch (error) { return res.status(400).json({ success: false, message: error.message }); } var responseType = determineResponseType(hasFileExtension, headers); if (responseType !== SERVE) { return handleShowRender(req, res); } // handle serve request // send google analytics sendGAServeEvent(headers, ip, originalUrl); // parse the claim var claimName = void 0; try { var _lbryUri$parseClaim2 = lbryUri.parseClaim(params.claim); claimName = _lbryUri$parseClaim2.claimName; } catch (error) { return res.status(400).json({ success: false, message: error.message }); } // log the request data for debugging logRequestData(responseType, claimName, null, null); // get the claim Id and then serve the asset getClaimIdAndServeAsset(null, null, claimName, null, originalUrl, ip, res); }); }; /***/ }), /* 127 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger = __webpack_require__(1); var _require = __webpack_require__(37), getClaimId = _require.getClaimId, getLocalFileRecord = _require.getLocalFileRecord; var _require2 = __webpack_require__(36), handleErrorResponse = _require2.handleErrorResponse; var SERVE = 'SERVE'; var SHOW = 'SHOW'; var NO_FILE = 'NO_FILE'; var NO_CHANNEL = 'NO_CHANNEL'; var NO_CLAIM = 'NO_CLAIM'; function clientAcceptsHtml(_ref) { var accept = _ref.accept; return accept && accept.match(/text\/html/); }; function requestIsFromBrowser(headers) { return headers['user-agent'] && headers['user-agent'].match(/Mozilla/); }; function clientWantsAsset(_ref2) { var accept = _ref2.accept, range = _ref2.range; var imageIsWanted = accept && accept.match(/image\/.*/) && !accept.match(/text\/html/) && !accept.match(/text\/\*/); var videoIsWanted = accept && range; return imageIsWanted || videoIsWanted; }; function isValidClaimId(claimId) { return claimId.length === 40 && !/[^A-Za-z0-9]/g.test(claimId); }; function isValidShortId(claimId) { return claimId.length === 1; // it should really evaluate the short url itself }; function isValidShortIdOrClaimId(input) { return isValidClaimId(input) || isValidShortId(input); }; function serveAssetToClient(claimId, name, res) { return getLocalFileRecord(claimId, name).then(function (fileRecord) { // check that a local record was found if (fileRecord === NO_FILE) { return res.status(307).redirect('/api/claim/get/' + name + '/' + claimId); } // serve the file var filePath = fileRecord.filePath, fileType = fileRecord.fileType; logger.verbose('serving file: ' + filePath); var sendFileOptions = { headers: { 'X-Content-Type-Options': 'nosniff', 'Content-Type': fileType || 'image/jpeg' } }; res.status(200).sendFile(filePath, sendFileOptions); }).catch(function (error) { throw error; }); }; module.exports = { getClaimIdAndServeAsset: function getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res) { // get the claim Id and then serve the asset getClaimId(channelName, channelClaimId, claimName, claimId).then(function (fullClaimId) { if (fullClaimId === NO_CLAIM) { return res.status(404).json({ success: false, message: 'no claim id could be found' }); } else if (fullClaimId === NO_CHANNEL) { return res.status(404).json({ success: false, message: 'no channel id could be found' }); } serveAssetToClient(fullClaimId, claimName, res); // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'success'); }).catch(function (error) { handleErrorResponse(originalUrl, ip, error, res); // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'fail'); }); }, determineResponseType: function determineResponseType(hasFileExtension, headers) { var responseType = void 0; if (hasFileExtension) { responseType = SERVE; // assume a serve request if file extension is present if (clientAcceptsHtml(headers)) { // if the request comes from a browser, change it to a show request responseType = SHOW; } } else { responseType = SHOW; if (clientWantsAsset(headers) && requestIsFromBrowser(headers)) { // this is in case someone embeds a show url logger.debug('Show request came from browser but wants an image/video. Changing response to serve...'); responseType = SERVE; } } return responseType; }, flipClaimNameAndIdForBackwardsCompatibility: function flipClaimNameAndIdForBackwardsCompatibility(identifier, name) { // this is a patch for backwards compatability with '/name/claim_id' url format if (isValidShortIdOrClaimId(name) && !isValidShortIdOrClaimId(identifier)) { var tempName = name; name = identifier; identifier = tempName; } return [identifier, name]; }, logRequestData: function logRequestData(responseType, claimName, channelName, claimId) { logger.debug('responseType ===', responseType); logger.debug('claim name === ', claimName); logger.debug('channel name ===', channelName); logger.debug('claim id ===', claimId); } }; /***/ }), /* 128 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var logger = __webpack_require__(1); module.exports = { REGEXP_INVALID_CLAIM: /[^A-Za-z0-9-]/g, REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g, REGEXP_ADDRESS: /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/, CHANNEL_CHAR: '@', parseIdentifier: function parseIdentifier(identifier) { logger.debug('parsing identifier:', identifier); var componentsRegex = new RegExp('([^:$#/]*)' + // value (stops at the first separator or end) '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end) ); var _componentsRegex$exec = componentsRegex.exec(identifier).map(function (match) { return match || null; }), _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 4), proto = _componentsRegex$exec2[0], value = _componentsRegex$exec2[1], modifierSeperator = _componentsRegex$exec2[2], modifier = _componentsRegex$exec2[3]; logger.debug(proto + ', ' + value + ', ' + modifierSeperator + ', ' + modifier); // Validate and process name if (!value) { throw new Error('Check your url. No channel name provided before "' + modifierSeperator + '"'); } var isChannel = value.startsWith(module.exports.CHANNEL_CHAR); var channelName = isChannel ? value : null; var claimId = void 0; if (isChannel) { if (!channelName) { throw new Error('No channel name after @.'); } var nameBadChars = channelName.match(module.exports.REGEXP_INVALID_CHANNEL); if (nameBadChars) { throw new Error('Invalid characters in channel name: ' + nameBadChars.join(', ') + '.'); } } else { claimId = value; } // Validate and process modifier var channelClaimId = void 0; if (modifierSeperator) { if (!modifier) { throw new Error('No modifier provided after separator "' + modifierSeperator + '"'); } if (modifierSeperator === ':') { channelClaimId = modifier; } else { throw new Error('The "' + modifierSeperator + '" modifier is not currently supported'); } } return { isChannel: isChannel, channelName: channelName, channelClaimId: channelClaimId, claimId: claimId }; }, parseClaim: function parseClaim(claim) { logger.debug('parsing name:', claim); var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first modifier) '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end) ); var _componentsRegex$exec3 = componentsRegex.exec(claim).map(function (match) { return match || null; }), _componentsRegex$exec4 = _slicedToArray(_componentsRegex$exec3, 4), proto = _componentsRegex$exec4[0], claimName = _componentsRegex$exec4[1], modifierSeperator = _componentsRegex$exec4[2], modifier = _componentsRegex$exec4[3]; logger.debug(proto + ', ' + claimName + ', ' + modifierSeperator + ', ' + modifier); // Validate and process name if (!claimName) { throw new Error('No claim name provided before .'); } var nameBadChars = claimName.match(module.exports.REGEXP_INVALID_CLAIM); if (nameBadChars) { throw new Error('Invalid characters in claim name: ' + nameBadChars.join(', ') + '.'); } // Validate and process modifier if (modifierSeperator) { if (!modifier) { throw new Error('No file extension provided after separator ' + modifierSeperator + '.'); } if (modifierSeperator !== '.') { throw new Error('The ' + modifierSeperator + ' modifier is not supported in the claim name'); } } // return results return { claimName: claimName }; }, parseModifier: function parseModifier(claim) { logger.debug('parsing modifier:', claim); var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first modifier) '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end) ); var _componentsRegex$exec5 = componentsRegex.exec(claim).map(function (match) { return match || null; }), _componentsRegex$exec6 = _slicedToArray(_componentsRegex$exec5, 4), proto = _componentsRegex$exec6[0], claimName = _componentsRegex$exec6[1], modifierSeperator = _componentsRegex$exec6[2], modifier = _componentsRegex$exec6[3]; logger.debug(proto + ', ' + claimName + ', ' + modifierSeperator + ', ' + modifier); // Validate and process modifier var hasFileExtension = false; if (modifierSeperator) { hasFileExtension = true; } return { hasFileExtension: hasFileExtension }; } }; /***/ }), /* 129 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _server = __webpack_require__(39); var _redux = __webpack_require__(18); var _index = __webpack_require__(40); var _index2 = _interopRequireDefault(_index); var _reactRedux = __webpack_require__(2); var _reactRouterDom = __webpack_require__(4); var _index3 = __webpack_require__(44); var _index4 = _interopRequireDefault(_index3); var _app = __webpack_require__(45); var _app2 = _interopRequireDefault(_app); var _renderFullPage = __webpack_require__(53); var _renderFullPage2 = _interopRequireDefault(_renderFullPage); var _reduxSaga = __webpack_require__(130); var _reduxSaga2 = _interopRequireDefault(_reduxSaga); var _effects = __webpack_require__(14); var _show_uri = __webpack_require__(131); var _show = __webpack_require__(7); var _reactHelmet = __webpack_require__(13); var _reactHelmet2 = _interopRequireDefault(_reactHelmet); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var returnSagaWithParams = function returnSagaWithParams(saga, params) { return (/*#__PURE__*/regeneratorRuntime.mark(function _callee() { return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return (0, _effects.call)(saga, params); case 2: case 'end': return _context.stop(); } } }, _callee, this); }) ); }; module.exports = function (req, res) { var context = {}; // create and apply middleware var sagaMiddleware = (0, _reduxSaga2.default)(); var middleware = (0, _redux.applyMiddleware)(sagaMiddleware); // create a new Redux store instance var store = (0, _redux.createStore)(_index2.default, middleware); // create saga var action = (0, _show.onHandleShowPageUri)(req.params); var saga = returnSagaWithParams(_show_uri.handleShowPageUri, action); // run the saga middleware sagaMiddleware.run(saga).done.then(function () { // render component to a string var html = (0, _server.renderToString)(_react2.default.createElement( _reactRedux.Provider, { store: store }, _react2.default.createElement( _reactRouterDom.StaticRouter, { location: req.url, context: context }, _react2.default.createElement( _index4.default, null, _react2.default.createElement(_app2.default, null) ) ) )); // get head tags from helmet var helmet = _reactHelmet2.default.renderStatic(); // check for a redirect if (context.url) { return res.redirect(301, context.url); } // get the initial state from our Redux store var preloadedState = store.getState(); // send the rendered page back to the client res.send((0, _renderFullPage2.default)(helmet, html, preloadedState)); }); }; /***/ }), /* 130 */ /***/ (function(module, exports) { module.exports = require("redux-saga"); /***/ }), /* 131 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.handleShowPageUri = handleShowPageUri; exports.watchHandleShowPageUri = watchHandleShowPageUri; var _effects = __webpack_require__(14); var _show_action_types = __webpack_require__(9); var actions = _interopRequireWildcard(_show_action_types); var _show = __webpack_require__(7); var _show_asset = __webpack_require__(132); var _show_channel = __webpack_require__(134); var _lbryUri = __webpack_require__(21); var _lbryUri2 = _interopRequireDefault(_lbryUri); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } var _marked = /*#__PURE__*/regeneratorRuntime.mark(parseAndUpdateIdentifierAndClaim), _marked2 = /*#__PURE__*/regeneratorRuntime.mark(parseAndUpdateClaimOnly), _marked3 = /*#__PURE__*/regeneratorRuntime.mark(handleShowPageUri), _marked4 = /*#__PURE__*/regeneratorRuntime.mark(watchHandleShowPageUri); function parseAndUpdateIdentifierAndClaim(modifier, claim) { var isChannel, channelName, channelClaimId, claimId, claimName, extension, _lbryUri$parseIdentif, _lbryUri$parseClaim; return regeneratorRuntime.wrap(function parseAndUpdateIdentifierAndClaim$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: // this is a request for an asset // claim will be an asset claim // the identifier could be a channel or a claim id isChannel = void 0, channelName = void 0, channelClaimId = void 0, claimId = void 0, claimName = void 0, extension = void 0; _context.prev = 1; _lbryUri$parseIdentif = _lbryUri2.default.parseIdentifier(modifier); isChannel = _lbryUri$parseIdentif.isChannel; channelName = _lbryUri$parseIdentif.channelName; channelClaimId = _lbryUri$parseIdentif.channelClaimId; claimId = _lbryUri$parseIdentif.claimId; _lbryUri$parseClaim = _lbryUri2.default.parseClaim(claim); claimName = _lbryUri$parseClaim.claimName; extension = _lbryUri$parseClaim.extension; _context.next = 17; break; case 12: _context.prev = 12; _context.t0 = _context['catch'](1); _context.next = 16; return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message)); case 16: return _context.abrupt('return', _context.sent); case 17: if (!isChannel) { _context.next = 21; break; } _context.next = 20; return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, null, channelName, channelClaimId, extension)); case 20: return _context.abrupt('return', _context.sent); case 21: ; _context.next = 24; return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, claimId, null, null, extension)); case 24: case 'end': return _context.stop(); } } }, _marked, this, [[1, 12]]); } function parseAndUpdateClaimOnly(claim) { var isChannel, channelName, channelClaimId, _lbryUri$parseIdentif2, claimName, extension, _lbryUri$parseClaim2; return regeneratorRuntime.wrap(function parseAndUpdateClaimOnly$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: // this could be a request for an asset or a channel page // claim could be an asset claim or a channel claim isChannel = void 0, channelName = void 0, channelClaimId = void 0; _context2.prev = 1; _lbryUri$parseIdentif2 = _lbryUri2.default.parseIdentifier(claim); isChannel = _lbryUri$parseIdentif2.isChannel; channelName = _lbryUri$parseIdentif2.channelName; channelClaimId = _lbryUri$parseIdentif2.channelClaimId; _context2.next = 13; break; case 8: _context2.prev = 8; _context2.t0 = _context2['catch'](1); _context2.next = 12; return (0, _effects.put)((0, _show.onRequestError)(_context2.t0.message)); case 12: return _context2.abrupt('return', _context2.sent); case 13: if (!isChannel) { _context2.next = 17; break; } _context2.next = 16; return (0, _effects.call)(_show_channel.newChannelRequest, (0, _show.onNewChannelRequest)(channelName, channelClaimId)); case 16: return _context2.abrupt('return', _context2.sent); case 17: // if not for a channel, parse the claim request claimName = void 0, extension = void 0; _context2.prev = 18; _lbryUri$parseClaim2 = _lbryUri2.default.parseClaim(claim); claimName = _lbryUri$parseClaim2.claimName; extension = _lbryUri$parseClaim2.extension; _context2.next = 29; break; case 24: _context2.prev = 24; _context2.t1 = _context2['catch'](18); _context2.next = 28; return (0, _effects.put)((0, _show.onRequestError)(_context2.t1.message)); case 28: return _context2.abrupt('return', _context2.sent); case 29: _context2.next = 31; return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, null, null, null, extension)); case 31: case 'end': return _context2.stop(); } } }, _marked2, this, [[1, 8], [18, 24]]); } function handleShowPageUri(action) { var _action$data, identifier, claim; return regeneratorRuntime.wrap(function handleShowPageUri$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _action$data = action.data, identifier = _action$data.identifier, claim = _action$data.claim; if (!identifier) { _context3.next = 5; break; } _context3.next = 4; return (0, _effects.call)(parseAndUpdateIdentifierAndClaim, identifier, claim); case 4: return _context3.abrupt('return', _context3.sent); case 5: _context3.next = 7; return (0, _effects.call)(parseAndUpdateClaimOnly, claim); case 7: case 'end': return _context3.stop(); } } }, _marked3, this); }; function watchHandleShowPageUri() { return regeneratorRuntime.wrap(function watchHandleShowPageUri$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: _context4.next = 2; return (0, _effects.takeLatest)(actions.HANDLE_SHOW_URI, handleShowPageUri); case 2: case 'end': return _context4.stop(); } } }, _marked4, this); }; /***/ }), /* 132 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.newAssetRequest = newAssetRequest; exports.watchNewAssetRequest = watchNewAssetRequest; var _effects = __webpack_require__(14); var _show_action_types = __webpack_require__(9); var actions = _interopRequireWildcard(_show_action_types); var _show = __webpack_require__(7); var _assetApi = __webpack_require__(133); var _show2 = __webpack_require__(11); var _site = __webpack_require__(54); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } var _marked = /*#__PURE__*/regeneratorRuntime.mark(newAssetRequest), _marked2 = /*#__PURE__*/regeneratorRuntime.mark(watchNewAssetRequest); function newAssetRequest(action) { var _action$data, requestType, requestId, name, modifier, state, host, longId, _ref, assetKey, shortId, _ref2, claimData, _ref3; return regeneratorRuntime.wrap(function newAssetRequest$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _action$data = action.data, requestType = _action$data.requestType, requestId = _action$data.requestId, name = _action$data.name, modifier = _action$data.modifier; // put an action to update the request in redux _context.next = 3; return (0, _effects.put)((0, _show.onRequestUpdate)(requestType, requestId)); case 3: _context.next = 5; return (0, _effects.select)(_show2.selectShowState); case 5: state = _context.sent; _context.next = 8; return (0, _effects.select)(_site.selectSiteHost); case 8: host = _context.sent; if (!state.requestList[requestId]) { _context.next = 11; break; } return _context.abrupt('return', null); case 11: // get long id && add request to request list longId = void 0; _context.prev = 12; _context.next = 15; return (0, _effects.call)(_assetApi.getLongClaimId, host, name, modifier); case 15: _ref = _context.sent; longId = _ref.data; _context.next = 24; break; case 19: _context.prev = 19; _context.t0 = _context['catch'](12); _context.next = 23; return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message)); case 23: return _context.abrupt('return', _context.sent); case 24: assetKey = 'a#' + name + '#' + longId; _context.next = 27; return (0, _effects.put)((0, _show.addRequestToRequestList)(requestId, null, assetKey)); case 27: if (!state.assetList[assetKey]) { _context.next = 29; break; } return _context.abrupt('return', null); case 29: // get short Id shortId = void 0; _context.prev = 30; _context.next = 33; return (0, _effects.call)(_assetApi.getShortId, host, name, longId); case 33: _ref2 = _context.sent; shortId = _ref2.data; _context.next = 42; break; case 37: _context.prev = 37; _context.t1 = _context['catch'](30); _context.next = 41; return (0, _effects.put)((0, _show.onRequestError)(_context.t1.message)); case 41: return _context.abrupt('return', _context.sent); case 42: // get asset claim data claimData = void 0; _context.prev = 43; _context.next = 46; return (0, _effects.call)(_assetApi.getClaimData, host, name, longId); case 46: _ref3 = _context.sent; claimData = _ref3.data; _context.next = 55; break; case 50: _context.prev = 50; _context.t2 = _context['catch'](43); _context.next = 54; return (0, _effects.put)((0, _show.onRequestError)(_context.t2.message)); case 54: return _context.abrupt('return', _context.sent); case 55: _context.next = 57; return (0, _effects.put)((0, _show.addAssetToAssetList)(assetKey, null, name, longId, shortId, claimData)); case 57: _context.next = 59; return (0, _effects.put)((0, _show.onRequestError)(null)); case 59: case 'end': return _context.stop(); } } }, _marked, this, [[12, 19], [30, 37], [43, 50]]); }; function watchNewAssetRequest() { return regeneratorRuntime.wrap(function watchNewAssetRequest$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return (0, _effects.takeLatest)(actions.ASSET_REQUEST_NEW, newAssetRequest); case 2: case 'end': return _context2.stop(); } } }, _marked2, this); }; /***/ }), /* 133 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getLongClaimId = getLongClaimId; exports.getShortId = getShortId; exports.getClaimData = getClaimData; var _request = __webpack_require__(6); var _request2 = _interopRequireDefault(_request); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function getLongClaimId(host, name, modifier) { var body = {}; // create request params if (modifier) { if (modifier.id) { body['claimId'] = modifier.id; } else { body['channelName'] = modifier.channel.name; body['channelClaimId'] = modifier.channel.id; } } body['claimName'] = name; var params = { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }; // create url var url = host + '/api/claim/long-id'; // return the request promise return (0, _request2.default)(url, params); }; function getShortId(host, name, claimId) { var url = host + '/api/claim/short-id/' + claimId + '/' + name; return (0, _request2.default)(url); }; function getClaimData(host, name, claimId) { var url = host + '/api/claim/data/' + name + '/' + claimId; return (0, _request2.default)(url); }; /***/ }), /* 134 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.newChannelRequest = newChannelRequest; exports.watchNewChannelRequest = watchNewChannelRequest; exports.watchUpdateChannelClaims = watchUpdateChannelClaims; var _effects = __webpack_require__(14); var _show_action_types = __webpack_require__(9); var actions = _interopRequireWildcard(_show_action_types); var _show = __webpack_require__(7); var _channelApi = __webpack_require__(135); var _show2 = __webpack_require__(11); var _site = __webpack_require__(54); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } var _marked = /*#__PURE__*/regeneratorRuntime.mark(newChannelRequest), _marked2 = /*#__PURE__*/regeneratorRuntime.mark(watchNewChannelRequest), _marked3 = /*#__PURE__*/regeneratorRuntime.mark(getNewClaimsAndUpdateChannel), _marked4 = /*#__PURE__*/regeneratorRuntime.mark(watchUpdateChannelClaims); function newChannelRequest(action) { var _action$data, requestType, requestId, channelName, channelId, state, host, longId, shortId, _ref, _ref$data, channelKey, claimsData, _ref2; return regeneratorRuntime.wrap(function newChannelRequest$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _action$data = action.data, requestType = _action$data.requestType, requestId = _action$data.requestId, channelName = _action$data.channelName, channelId = _action$data.channelId; // put an action to update the request in redux _context.next = 3; return (0, _effects.put)((0, _show.onRequestUpdate)(requestType, requestId)); case 3: _context.next = 5; return (0, _effects.select)(_show2.selectShowState); case 5: state = _context.sent; _context.next = 8; return (0, _effects.select)(_site.selectSiteHost); case 8: host = _context.sent; if (!state.requestList[requestId]) { _context.next = 11; break; } return _context.abrupt('return', null); case 11: // get channel long id longId = void 0, shortId = void 0; _context.prev = 12; _context.next = 15; return (0, _effects.call)(_channelApi.getChannelData, host, channelName, channelId); case 15: _ref = _context.sent; _ref$data = _ref.data; longId = _ref$data.longChannelClaimId; shortId = _ref$data.shortChannelClaimId; _context.next = 26; break; case 21: _context.prev = 21; _context.t0 = _context['catch'](12); _context.next = 25; return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message)); case 25: return _context.abrupt('return', _context.sent); case 26: // store the request in the channel requests list channelKey = 'c#' + channelName + '#' + longId; _context.next = 29; return (0, _effects.put)((0, _show.addRequestToRequestList)(requestId, null, channelKey)); case 29: if (!state.channelList[channelKey]) { _context.next = 31; break; } return _context.abrupt('return', null); case 31: // get channel claims data claimsData = void 0; _context.prev = 32; _context.next = 35; return (0, _effects.call)(_channelApi.getChannelClaims, host, longId, channelName, 1); case 35: _ref2 = _context.sent; claimsData = _ref2.data; _context.next = 44; break; case 39: _context.prev = 39; _context.t1 = _context['catch'](32); _context.next = 43; return (0, _effects.put)((0, _show.onRequestError)(_context.t1.message)); case 43: return _context.abrupt('return', _context.sent); case 44: _context.next = 46; return (0, _effects.put)((0, _show.addNewChannelToChannelList)(channelKey, channelName, shortId, longId, claimsData)); case 46: _context.next = 48; return (0, _effects.put)((0, _show.onRequestError)(null)); case 48: case 'end': return _context.stop(); } } }, _marked, this, [[12, 21], [32, 39]]); } function watchNewChannelRequest() { return regeneratorRuntime.wrap(function watchNewChannelRequest$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return (0, _effects.takeLatest)(actions.CHANNEL_REQUEST_NEW, newChannelRequest); case 2: case 'end': return _context2.stop(); } } }, _marked2, this); }; function getNewClaimsAndUpdateChannel(action) { var _action$data2, channelKey, name, longId, page, host, claimsData, _ref3; return regeneratorRuntime.wrap(function getNewClaimsAndUpdateChannel$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _action$data2 = action.data, channelKey = _action$data2.channelKey, name = _action$data2.name, longId = _action$data2.longId, page = _action$data2.page; _context3.next = 3; return (0, _effects.select)(_site.selectSiteHost); case 3: host = _context3.sent; claimsData = void 0; _context3.prev = 5; _context3.next = 8; return (0, _effects.call)(_channelApi.getChannelClaims, host, longId, name, page); case 8: _ref3 = _context3.sent; claimsData = _ref3.data; _context3.next = 17; break; case 12: _context3.prev = 12; _context3.t0 = _context3['catch'](5); _context3.next = 16; return (0, _effects.put)((0, _show.onRequestError)(_context3.t0.message)); case 16: return _context3.abrupt('return', _context3.sent); case 17: _context3.next = 19; return (0, _effects.put)((0, _show.updateChannelClaims)(channelKey, claimsData)); case 19: case 'end': return _context3.stop(); } } }, _marked3, this, [[5, 12]]); } function watchUpdateChannelClaims() { return regeneratorRuntime.wrap(function watchUpdateChannelClaims$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: _context4.next = 2; return (0, _effects.takeLatest)(actions.CHANNEL_CLAIMS_UPDATE_ASYNC, getNewClaimsAndUpdateChannel); case 2: case 'end': return _context4.stop(); } } }, _marked4, this); } /***/ }), /* 135 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getChannelData = getChannelData; exports.getChannelClaims = getChannelClaims; var _request = __webpack_require__(6); var _request2 = _interopRequireDefault(_request); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function getChannelData(host, id, name) { if (!id) id = 'none'; var url = host + '/api/channel/data/' + name + '/' + id; return (0, _request2.default)(url); }; function getChannelClaims(host, longId, name, page) { if (!page) page = 1; var url = host + '/api/channel/claims/' + name + '/' + longId + '/' + page; return (0, _request2.default)(url); }; /***/ }), /* 136 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var handlePageRender = __webpack_require__(38); module.exports = function (app) { // a catch-all route if someone visits a page that does not exist app.use('*', function (req, res) { // send response handlePageRender(req, res); }); }; /***/ }), /* 137 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _require = __webpack_require__(138), logLevel = _require.logLevel; module.exports = function (winston) { // configure winston.configure({ transports: [new winston.transports.Console({ level: logLevel, timestamp: false, colorize: true, prettyPrint: true, handleExceptions: true, humanReadableUnhandledException: true })] }); // test all the log levels winston.error('Level 0'); winston.warn('Level 1'); winston.info('Level 2'); winston.verbose('Level 3'); winston.debug('Level 4'); winston.silly('Level 5'); }; /***/ }), /* 138 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var loggerConfig = { logLevel: 'debug' // options: silly, debug, verbose, info }; module.exports = loggerConfig; /***/ }), /* 139 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var winstonSlackWebHook = __webpack_require__(140).SlackWebHook; var slackConfig = __webpack_require__(30); module.exports = function (winston) { var slackWebHook = slackConfig.slackWebHook, slackErrorChannel = slackConfig.slackErrorChannel, slackInfoChannel = slackConfig.slackInfoChannel; if (slackWebHook) { // add a transport for errors to slack if (slackErrorChannel) { winston.add(winstonSlackWebHook, { name: 'slack-errors-transport', level: 'warn', webhookUrl: slackWebHook, channel: slackErrorChannel, username: 'spee.ch', iconEmoji: ':face_with_head_bandage:' }); }; if (slackInfoChannel) { winston.add(winstonSlackWebHook, { name: 'slack-info-transport', level: 'info', webhookUrl: slackWebHook, channel: slackInfoChannel, username: 'spee.ch', iconEmoji: ':nerd_face:' }); }; // send test message winston.error('Slack "error" logging is online.'); winston.info('Slack "info" logging is online.'); } else { winston.warn('Slack logging is not enabled because no slackWebHook config var provided.'); } }; /***/ }), /* 140 */ /***/ (function(module, exports) { module.exports = require("winston-slack-webhook"); /***/ }), /* 141 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var Path = __webpack_require__(15); var importSubModules = __webpack_require__(12); var thisFolder = Path.resolve(__dirname, 'client/components'); module.exports = importSubModules(thisFolder); /***/ }), /* 142 */, /* 143 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var Path = __webpack_require__(15); var importSubModules = __webpack_require__(12); var thisFolder = Path.resolve(__dirname, 'client/containers/'); module.exports = importSubModules(thisFolder); /***/ }), /* 144 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var Path = __webpack_require__(15); var importSubModules = __webpack_require__(12); var thisFolder = Path.resolve(__dirname, 'client/pages/'); module.exports = importSubModules(thisFolder); /***/ }), /* 145 */ /***/ (function(module, exports, __webpack_require__) { var map = { "./importSubModules": 12, "./importSubModules.js": 12 }; function webpackContext(req) { return __webpack_require__(webpackContextResolve(req)); }; function webpackContextResolve(req) { var id = map[req]; if(!(id + 1)) // check for number or string throw new Error("Cannot find module '" + req + "'."); return id; }; webpackContext.keys = function webpackContextKeys() { return Object.keys(map); }; webpackContext.resolve = webpackContextResolve; module.exports = webpackContext; webpackContext.id = 145; /***/ }) /******/ ]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgMDM0MTM3ZGUxODNkOGI5ZjdmZjUiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3RcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJ3aW5zdG9uXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3QtcmVkdXhcIiIsIndlYnBhY2s6Ly8vLi9jb25maWcvc2l0ZUNvbmZpZy5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJyZWFjdC1yb3V0ZXItZG9tXCIiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL21vZGVscy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvdXRpbHMvcmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvYWN0aW9ucy9zaG93LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL05hdkJhci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29uc3RhbnRzL3Nob3dfYWN0aW9uX3R5cGVzLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb21wb25lbnRzL1NFTy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvc2VsZWN0b3JzL3Nob3cuanMiLCJ3ZWJwYWNrOi8vLy4vYnVpbGQvdXRpbHMvaW1wb3J0U3ViTW9kdWxlcy5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJyZWFjdC1oZWxtZXRcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJyZWR1eC1zYWdhL2VmZmVjdHNcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJwYXRoXCIiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL2hlbHBlcnMvbGJyeUFwaS5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaGVscGVycy9nb29nbGVBbmFseXRpY3MuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVkdXhcIiIsIndlYnBhY2s6Ly8vLi9jbGllbnQvdXRpbHMvZHluYW1pY0ltcG9ydC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvdXRpbHMvY2Fub25pY2FsTGluay5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvdXRpbHMvbGJyeVVyaS5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvdXRpbHMvbWV0YVRhZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3V0aWxzL3BhZ2VUaXRsZS5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvYWN0aW9ucy9jaGFubmVsLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9hY3Rpb25zL3B1Ymxpc2guanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicHJvcC10eXBlc1wiIiwid2VicGFjazovLy8uL2NsaWVudC9wYWdlcy9FcnJvclBhZ2UvaW5kZXguanN4Iiwid2VicGFjazovLy9leHRlcm5hbCBcInBhc3Nwb3J0XCIiLCJ3ZWJwYWNrOi8vLy4vY29uZmlnL215c3FsQ29uZmlnLmpzIiwid2VicGFjazovLy8uL2NvbmZpZy9zbGFja0NvbmZpZy5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJwYXNzcG9ydC1sb2NhbFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcInNlcXVlbGl6ZVwiIiwid2VicGFjazovLy8uL3NlcnZlci9oZWxwZXJzL3NlcXVlbGl6ZUhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL2hlbHBlcnMvcHVibGlzaEhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiZnNcIiIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaGVscGVycy9lcnJvckhhbmRsZXJzLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9jb250cm9sbGVycy9zZXJ2ZUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL2hlbHBlcnMvaGFuZGxlUGFnZVJlbmRlci5qc3giLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3QtZG9tL3NlcnZlclwiIiwid2VicGFjazovLy8uL2NsaWVudC9yZWR1Y2Vycy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29uc3RhbnRzL3B1Ymxpc2hfYWN0aW9uX3R5cGVzLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb25zdGFudHMvY2hhbm5lbF9hY3Rpb25fdHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnN0YW50cy9hc3NldF9kaXNwbGF5X3N0YXRlcy5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29tcG9uZW50cy9HQUxpc3RlbmVyL2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvYXBwLmpzIiwid2VicGFjazovLy8uL2NsaWVudC91dGlscyBeLiokIiwid2VicGFjazovLy8uL2NsaWVudC91dGlscy9maWxlLmpzIiwid2VicGFjazovLy8uL2NsaWVudC91dGlscy9wdWJsaXNoLmpzIiwid2VicGFjazovLy8uL2NsaWVudC91dGlscy92YWxpZGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29tcG9uZW50cy9Qcm9ncmVzc0Jhci9pbmRleC5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnN0YW50cy9zaG93X3JlcXVlc3RfdHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvQXNzZXREaXNwbGF5L2luZGV4LmpzIiwid2VicGFjazovLy8uL3NlcnZlci9oZWxwZXJzL3JlbmRlckZ1bGxQYWdlLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9zZWxlY3RvcnMvc2l0ZS5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJiYWJlbC1wb2x5ZmlsbFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcIndoYXR3Zy1mZXRjaFwiIiwid2VicGFjazovLy8uL3NwZWVjaC5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvc2VydmVyLmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcImV4cHJlc3NcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJib2R5LXBhcnNlclwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImV4cHJlc3MtaGFuZGxlYmFyc1wiIiwid2VicGFjazovLy9leHRlcm5hbCBcImhhbmRsZWJhcnNcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJoZWxtZXRcIiIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaGVscGVycy9hdXRoSGVscGVycy5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJjb29raWUtc2Vzc2lvblwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImh0dHBcIiIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvcGFzc3BvcnQvbG9jYWwtc2lnbnVwLmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcImF4aW9zXCIiLCJ3ZWJwYWNrOi8vLy4vY29uZmlnL2xicnlDb25maWcuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwidW5pdmVyc2FsLWFuYWx5dGljc1wiIiwid2VicGFjazovLy8uL3NlcnZlci9tb2RlbHMvY2VydGlmaWNhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL21vZGVscy9jaGFubmVsLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9tb2RlbHMvY2xhaW0uanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL21vZGVscy9maWxlLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9tb2RlbHMvcmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvbW9kZWxzL3VzZXIuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiYmNyeXB0XCIiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3Bhc3Nwb3J0L2xvY2FsLWxvZ2luLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9yb3V0ZXMvYXV0aC1yb3V0ZXMuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3JvdXRlcy9hcGktcm91dGVzLmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcImNvbm5lY3QtbXVsdGlwYXJ0eVwiIiwid2VicGFjazovLy8uL3NlcnZlci9jb250cm9sbGVycy9wdWJsaXNoQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvYXV0aC9hdXRoZW50aWNhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaGVscGVycy9jaGFubmVsUGFnaW5hdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvcm91dGVzL3BhZ2Utcm91dGVzLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9yZWR1Y2Vycy9wdWJsaXNoLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb25zdGFudHMvcHVibGlzaF9jaGFubmVsX3NlbGVjdF9zdGF0ZXMuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3JlZHVjZXJzL2NoYW5uZWwuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3JlZHVjZXJzL3Nob3cuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3JlZHVjZXJzL3NpdGUuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3QtZ2FcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJjcm9zcy1mZXRjaC9wb2x5ZmlsbFwiIiwid2VicGFjazovLy8uL2NsaWVudC9wYWdlcy9BYm91dFBhZ2UvaW5kZXguanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL05hdkJhci92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29tcG9uZW50cy9Mb2dvL2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29tcG9uZW50cy9OYXZCYXJDaGFubmVsT3B0aW9uc0Ryb3Bkb3duL2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29tcG9uZW50cy9TRU8vdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3BhZ2VzL0xvZ2luUGFnZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvcGFnZXMvTG9naW5QYWdlL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0NoYW5uZWxMb2dpbkZvcm0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvQ2hhbm5lbExvZ2luRm9ybS92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9DaGFubmVsQ3JlYXRlRm9ybS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9DaGFubmVsQ3JlYXRlRm9ybS92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29tcG9uZW50cy9BY3RpdmVTdGF0dXNCYXIvaW5kZXguanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb21wb25lbnRzL0luYWN0aXZlU3RhdHVzQmFyL2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvcGFnZXMvU2hvd1BhZ2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3BhZ2VzL1Nob3dQYWdlL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL1Nob3dBc3NldExpdGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvU2hvd0Fzc2V0TGl0ZS92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9Bc3NldERpc3BsYXkvdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvU2hvd0Fzc2V0RGV0YWlscy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9TaG93QXNzZXREZXRhaWxzL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0Fzc2V0VGl0bGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvQXNzZXRUaXRsZS92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9Bc3NldEluZm8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvQXNzZXRJbmZvL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL1Nob3dDaGFubmVsL2luZGV4LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL1Nob3dDaGFubmVsL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0NoYW5uZWxDbGFpbXNEaXNwbGF5L2luZGV4LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0NoYW5uZWxDbGFpbXNEaXNwbGF5L3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb21wb25lbnRzL0Fzc2V0UHJldmlldy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29tcG9uZW50cy9Bc3NldFByZXZpZXcvdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvRm91ck9oRm91clBhZ2UvaW5kZXguanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0ZvdXJPaEZvdXJQYWdlL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL3NlcnZlci9yb3V0ZXMvYXNzZXQtcm91dGVzLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9oZWxwZXJzL3NlcnZlSGVscGVycy5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaGVscGVycy9sYnJ5VXJpLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9oZWxwZXJzL2hhbmRsZVNob3dSZW5kZXIuanN4Iiwid2VicGFjazovLy9leHRlcm5hbCBcInJlZHV4LXNhZ2FcIiIsIndlYnBhY2s6Ly8vLi9jbGllbnQvc2FnYXMvc2hvd191cmkuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3NhZ2FzL3Nob3dfYXNzZXQuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2FwaS9hc3NldEFwaS5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvc2FnYXMvc2hvd19jaGFubmVsLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9hcGkvY2hhbm5lbEFwaS5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvcm91dGVzL2ZhbGxiYWNrLXJvdXRlcy5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaGVscGVycy9jb25maWd1cmVMb2dnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vY29uZmlnL2xvZ2dlckNvbmZpZy5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaGVscGVycy9jb25maWd1cmVTbGFjay5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJ3aW5zdG9uLXNsYWNrLXdlYmhvb2tcIiIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29tcG9uZW50cy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvcGFnZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vYnVpbGQvdXRpbHMgXlxcLlxcLy4qJCJdLCJuYW1lcyI6WyJTaXRlQ29uZmlnIiwiYW5hbHl0aWNzIiwiZ29vZ2xlSWQiLCJhc3NldERlZmF1bHRzIiwiZGVzY3JpcHRpb24iLCJ0aHVtYm5haWwiLCJ0aXRsZSIsImF1dGgiLCJzZXNzaW9uS2V5IiwiY29tcG9uZW50c0NvbmZpZyIsImNvbXBvbmVudHMiLCJjb250YWluZXJzIiwicGFnZXMiLCJkZXRhaWxzIiwiaG9zdCIsInBvcnQiLCJ0d2l0dGVyIiwicHVibGlzaGluZyIsImFkZGl0aW9uYWxDbGFpbUFkZHJlc3NlcyIsImRpc2FibGVkIiwiZGlzYWJsZWRNZXNzYWdlIiwicHJpbWFyeUNsYWltQWRkcmVzcyIsInRodW1ibmFpbENoYW5uZWwiLCJ0aHVtYm5haWxDaGFubmVsSWQiLCJ1cGxvYWREaXJlY3RvcnkiLCJjb25maWd1cmUiLCJjb25maWciLCJjb25zb2xlIiwibG9nIiwibW9kdWxlIiwiZXhwb3J0cyIsIlNlcXVlbGl6ZSIsInJlcXVpcmUiLCJsb2dnZXIiLCJkYXRhYmFzZSIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJkYiIsInNlcXVlbGl6ZSIsImRpYWxlY3QiLCJkaWFsZWN0T3B0aW9ucyIsImRlY2ltYWxOdW1iZXJzIiwibG9nZ2luZyIsInBvb2wiLCJtYXgiLCJtaW4iLCJpZGxlIiwiYWNxdWlyZSIsImF1dGhlbnRpY2F0ZSIsInRoZW4iLCJpbmZvIiwiY2F0Y2giLCJlcnJvciIsImVyciIsIkNlcnRpZmljYXRlIiwiQ2hhbm5lbCIsIkNsYWltIiwiRmlsZSIsIlJlcXVlc3QiLCJVc2VyIiwiaW1wb3J0IiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJtb2RlbE5hbWUiLCJhc3NvY2lhdGUiLCJ1cHNlcnQiLCJNb2RlbCIsInZhbHVlcyIsImNvbmRpdGlvbiIsInRhYmxlTmFtZSIsImZpbmRPbmUiLCJ3aGVyZSIsIm9iaiIsImRlYnVnIiwidXBkYXRlIiwiY3JlYXRlIiwicmVxdWVzdCIsInBhcnNlSlNPTiIsInJlc3BvbnNlIiwic3RhdHVzIiwianNvbiIsImNoZWNrU3RhdHVzIiwianNvblJlc3BvbnNlIiwiRXJyb3IiLCJtZXNzYWdlIiwidXJsIiwib3B0aW9ucyIsImZldGNoIiwiUHJvbWlzZSIsImFsbCIsIm9uSGFuZGxlU2hvd1BhZ2VVcmkiLCJvblJlcXVlc3RFcnJvciIsIm9uTmV3Q2hhbm5lbFJlcXVlc3QiLCJvbk5ld0Fzc2V0UmVxdWVzdCIsIm9uUmVxdWVzdFVwZGF0ZSIsImFkZFJlcXVlc3RUb1JlcXVlc3RMaXN0IiwiYWRkQXNzZXRUb0Fzc2V0TGlzdCIsImFkZE5ld0NoYW5uZWxUb0NoYW5uZWxMaXN0Iiwib25VcGRhdGVDaGFubmVsQ2xhaW1zIiwidXBkYXRlQ2hhbm5lbENsYWltcyIsImZpbGVSZXF1ZXN0ZWQiLCJ1cGRhdGVGaWxlQXZhaWxhYmlsaXR5IiwidXBkYXRlRGlzcGxheUFzc2V0RXJyb3IiLCJhY3Rpb25zIiwicGFyYW1zIiwidHlwZSIsIkhBTkRMRV9TSE9XX1VSSSIsImRhdGEiLCJSRVFVRVNUX0VSUk9SIiwiY2hhbm5lbE5hbWUiLCJjaGFubmVsSWQiLCJyZXF1ZXN0VHlwZSIsInJlcXVlc3RJZCIsIkNIQU5ORUxfUkVRVUVTVF9ORVciLCJuYW1lIiwiaWQiLCJleHRlbnNpb24iLCJBU1NFVF9SRVFVRVNUX05FVyIsIm1vZGlmaWVyIiwiY2hhbm5lbCIsIlJFUVVFU1RfVVBEQVRFIiwia2V5IiwiUkVRVUVTVF9MSVNUX0FERCIsImNsYWltSWQiLCJzaG9ydElkIiwiY2xhaW1EYXRhIiwiQVNTRVRfQUREIiwibG9uZ0lkIiwiY2xhaW1zRGF0YSIsIkNIQU5ORUxfQUREIiwiY2hhbm5lbEtleSIsInBhZ2UiLCJDSEFOTkVMX0NMQUlNU19VUERBVEVfQVNZTkMiLCJjaGFubmVsTGlzdElkIiwiQ0hBTk5FTF9DTEFJTVNfVVBEQVRFX1NVQ0NFU1MiLCJGSUxFX1JFUVVFU1RFRCIsIkZJTEVfQVZBSUxBQklMSVRZX1VQREFURSIsIkRJU1BMQVlfQVNTRVRfRVJST1IiLCJtYXBTdGF0ZVRvUHJvcHMiLCJzaXRlIiwibG9nZ2VkSW5DaGFubmVsIiwiY2hhbm5lbFNob3J0SWQiLCJjaGFubmVsTG9uZ0lkIiwic2l0ZURlc2NyaXB0aW9uIiwibWFwRGlzcGF0Y2hUb1Byb3BzIiwib25DaGFubmVsTG9naW4iLCJkaXNwYXRjaCIsIm9uQ2hhbm5lbExvZ291dCIsImRlZmF1bHREZXNjcmlwdGlvbiIsImRlZmF1bHRUaHVtYm5haWwiLCJzaXRlSG9zdCIsInNpdGVUaXRsZSIsInNpdGVUd2l0dGVyIiwic2VsZWN0QXNzZXQiLCJzaG93IiwicmVxdWVzdExpc3QiLCJhc3NldEtleSIsImFzc2V0TGlzdCIsInNlbGVjdFNob3dTdGF0ZSIsInN0YXRlIiwibHN0YXRTeW5jIiwicmVhZGRpclN5bmMiLCJqb2luIiwiZ2V0U3ViRGlyZWN0b3J5TmFtZXMiLCJyb290IiwiZmlsdGVyIiwiZnVsbFBhdGgiLCJpc0RpcmVjdG9yeSIsImFsbE1vZHVsZXMiLCJkZWZhdWx0IiwiYXhpb3MiLCJhcGkiLCJhcGlIb3N0IiwiYXBpUG9ydCIsImxicnlBcGlVcmkiLCJjaG9vc2VHYUxicnluZXRQdWJsaXNoTGFiZWwiLCJzZW5kR0FUaW1pbmdFdmVudCIsImhhbmRsZUxicnluZXRSZXNwb25zZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZXN1bHQiLCJKU09OIiwic3RyaW5naWZ5IiwicHVibGlzaENsYWltIiwicHVibGlzaFBhcmFtcyIsImdhU3RhcnRUaW1lIiwiRGF0ZSIsIm5vdyIsInBvc3QiLCJtZXRob2QiLCJnZXRDbGFpbSIsInVyaSIsInRpbWVvdXQiLCJnZXRDbGFpbUxpc3QiLCJjbGFpbU5hbWUiLCJyZXNvbHZlVXJpIiwiZ2V0RG93bmxvYWREaXJlY3RvcnkiLCJkb3dubG9hZF9kaXJlY3RvcnkiLCJjcmVhdGVDaGFubmVsIiwiY2hhbm5lbF9uYW1lIiwiYW1vdW50IiwidWEiLCJjcmVhdGVTZXJ2ZUV2ZW50UGFyYW1zIiwiaGVhZGVycyIsImlwIiwib3JpZ2luYWxVcmwiLCJldmVudENhdGVnb3J5IiwiZXZlbnRBY3Rpb24iLCJldmVudExhYmVsIiwiaXBPdmVycmlkZSIsInVzZXJBZ2VudE92ZXJyaWRlIiwiY3JlYXRlUHVibGlzaFRpbWluZ0V2ZW50UGFyYW1zIiwiY2F0ZWdvcnkiLCJ2YXJpYWJsZSIsImxhYmVsIiwic3RhcnRUaW1lIiwiZW5kVGltZSIsImR1cmF0aW9uIiwidXNlclRpbWluZ0NhdGVnb3J5IiwidXNlclRpbWluZ1ZhcmlhYmxlTmFtZSIsInVzZXJUaW1pbmdUaW1lIiwidXNlclRpbWluZ0xhYmVsIiwic2VuZEdvb2dsZUFuYWx5dGljc0V2ZW50IiwidmlzaXRvcklkIiwicmVwbGFjZSIsInZpc2l0b3IiLCJzdHJpY3RDaWRGb3JtYXQiLCJodHRwcyIsImV2ZW50Iiwic2VuZEdvb2dsZUFuYWx5dGljc1RpbWluZyIsInRpbWluZyIsInNlbmRHQVNlcnZlRXZlbnQiLCJjaGFubmVsX2lkIiwiZ2V0RGVlcGVzdENoaWxkVmFsdWUiLCJwYXJlbnQiLCJjaGlsZHJlbktleXMiLCJjaGlsZEtleSIsInNoaWZ0IiwiY2hpbGQiLCJsZW5ndGgiLCJkeW5hbWljSW1wb3J0IiwiZmlsZVBhdGgiLCJmb2xkZXJzIiwic3BsaXQiLCJmb2xkZXJOYW1lIiwiY3VzdG9tQ29tcG9uZW50IiwiY3JlYXRlQmFzaWNDYW5vbmljYWxMaW5rIiwiY3JlYXRlQXNzZXRDYW5vbmljYWxMaW5rIiwiYXNzZXQiLCJjZXJ0aWZpY2F0ZUlkIiwiY3JlYXRlQ2hhbm5lbENhbm9uaWNhbExpbmsiLCJjcmVhdGVDYW5vbmljYWxMaW5rIiwiUkVHRVhQX0lOVkFMSURfQ0xBSU0iLCJSRUdFWFBfSU5WQUxJRF9DSEFOTkVMIiwiUkVHRVhQX0FERFJFU1MiLCJDSEFOTkVMX0NIQVIiLCJwYXJzZUlkZW50aWZpZXIiLCJpZGVudGlmaWVyIiwiY29tcG9uZW50c1JlZ2V4IiwiUmVnRXhwIiwiZXhlYyIsIm1hcCIsIm1hdGNoIiwicHJvdG8iLCJ2YWx1ZSIsIm1vZGlmaWVyU2VwZXJhdG9yIiwiaXNDaGFubmVsIiwic3RhcnRzV2l0aCIsIm5hbWVCYWRDaGFycyIsImNoYW5uZWxDbGFpbUlkIiwicGFyc2VDbGFpbSIsImV4dGVuc2lvblNlcGVyYXRvciIsImRldGVybWluZU9nVGh1bWJuYWlsQ29udGVudFR5cGUiLCJmaWxlRXh0Iiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJjcmVhdGVCYXNpY01ldGFUYWdzIiwicHJvcGVydHkiLCJjb250ZW50IiwiY3JlYXRlQ2hhbm5lbE1ldGFUYWdzIiwiY3JlYXRlQXNzZXRNZXRhVGFncyIsImNvbnRlbnRUeXBlIiwiZW1iZWRVcmwiLCJzaG93VXJsIiwic291cmNlIiwib2dUaXRsZSIsIm9nRGVzY3JpcHRpb24iLCJvZ1RodW1ibmFpbENvbnRlbnRUeXBlIiwib2dUaHVtYm5haWwiLCJtZXRhVGFncyIsInB1c2giLCJjcmVhdGVNZXRhVGFncyIsImNyZWF0ZVBhZ2VUaXRsZSIsInBhZ2VUaXRsZSIsInVwZGF0ZUxvZ2dlZEluQ2hhbm5lbCIsIkNIQU5ORUxfVVBEQVRFIiwic2VsZWN0RmlsZSIsImNsZWFyRmlsZSIsInVwZGF0ZU1ldGFkYXRhIiwidXBkYXRlQ2xhaW0iLCJzZXRQdWJsaXNoSW5DaGFubmVsIiwidXBkYXRlUHVibGlzaFN0YXR1cyIsInVwZGF0ZUVycm9yIiwidXBkYXRlU2VsZWN0ZWRDaGFubmVsIiwidG9nZ2xlTWV0YWRhdGFJbnB1dHMiLCJvbk5ld1RodW1ibmFpbCIsInN0YXJ0UHVibGlzaCIsImZpbGUiLCJGSUxFX1NFTEVDVEVEIiwiRklMRV9DTEVBUiIsIk1FVEFEQVRBX1VQREFURSIsIkNMQUlNX1VQREFURSIsIlNFVF9QVUJMSVNIX0lOX0NIQU5ORUwiLCJQVUJMSVNIX1NUQVRVU19VUERBVEUiLCJFUlJPUl9VUERBVEUiLCJTRUxFQ1RFRF9DSEFOTkVMX1VQREFURSIsInNob3dNZXRhZGF0YUlucHV0cyIsIlRPR0dMRV9NRVRBREFUQV9JTlBVVFMiLCJUSFVNQk5BSUxfTkVXIiwiaGlzdG9yeSIsIlBVQkxJU0hfU1RBUlQiLCJFcnJvclBhZ2UiLCJwcm9wcyIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIsInN0cmluZyIsImlzUmVxdWlyZWQiLCJNeXNxbENvbmZpZyIsIlNsYWNrQ29uZmlnIiwic2xhY2tXZWJIb29rIiwic2xhY2tFcnJvckNoYW5uZWwiLCJzbGFja0luZm9DaGFubmVsIiwicmV0dXJuU2hvcnRJZCIsImNsYWltc0FycmF5IiwiY2xhaW1JbmRleCIsInNob3J0SWRMZW5ndGgiLCJmaW5kSW5kZXgiLCJlbGVtZW50IiwicG9zc2libGVNYXRjaGVzIiwic2xpY2UiLCJmcyIsInBhcnNlUHVibGlzaEFwaVJlcXVlc3RCb2R5IiwibnNmdyIsImxpY2Vuc2UiLCJpbnZhbGlkTmFtZUNoYXJhY3RlcnMiLCJwYXJzZVB1Ymxpc2hBcGlSZXF1ZXN0RmlsZXMiLCJwYXRoIiwic2l6ZSIsInRlc3QiLCJ2YWxpZGF0ZUZpbGVUeXBlQW5kU2l6ZSIsImZpbGVOYW1lIiwiZmlsZVR5cGUiLCJ0aHVtYm5haWxGaWxlTmFtZSIsInRodW1ibmFpbEZpbGVQYXRoIiwidGh1bWJuYWlsRmlsZVR5cGUiLCJjcmVhdGVCYXNpY1B1Ymxpc2hQYXJhbXMiLCJ0cmltIiwiZmlsZV9wYXRoIiwiYmlkIiwibWV0YWRhdGEiLCJhdXRob3IiLCJsYW5ndWFnZSIsImNsYWltX2FkZHJlc3MiLCJjcmVhdGVUaHVtYm5haWxQdWJsaXNoUGFyYW1zIiwiZGVsZXRlVGVtcG9yYXJ5RmlsZSIsInVubGluayIsImFkZEdldFJlc3VsdHNUb0ZpbGVEYXRhIiwiZmlsZUluZm8iLCJnZXRSZXN1bHQiLCJmaWxlX25hbWUiLCJkb3dubG9hZF9wYXRoIiwiY3JlYXRlRmlsZURhdGEiLCJvdXRwb2ludCIsImhlaWdodCIsImFkZHJlc3MiLCJoYW5kbGVFcnJvclJlc3BvbnNlIiwicmVzIiwidXNlT2JqZWN0UHJvcGVydGllc0lmTm9LZXlzIiwicmV0dXJuRXJyb3JNZXNzYWdlQW5kU3RhdHVzIiwiY3JlYXRlRXJyb3JSZXNwb25zZVBheWxvYWQiLCJjb2RlIiwibmV3RXJyb3JPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwic3VjY2VzcyIsInJldHVyblBhZ2luYXRlZENoYW5uZWxDbGFpbXMiLCJOT19DSEFOTkVMIiwiTk9fQ0xBSU0iLCJOT19GSUxFIiwiZ2V0Q2xhaW1JZCIsImdldENsYWltSWRCeUNoYW5uZWwiLCJnZXRDbGFpbUlkQnlDbGFpbSIsImdldExvbmdDbGFpbUlkIiwibG9uZ0NsYWltSWQiLCJnZXRMb25nQ2hhbm5lbElkIiwibG9uZ0NoYW5uZWxJZCIsImdldENsYWltSWRCeUxvbmdDaGFubmVsSWQiLCJnZXRDaGFubmVsRGF0YSIsImxvbmdDaGFubmVsQ2xhaW1JZCIsImdldFNob3J0Q2hhbm5lbElkRnJvbUxvbmdDaGFubmVsSWQiLCJzaG9ydENoYW5uZWxDbGFpbUlkIiwiZ2V0Q2hhbm5lbENsYWltcyIsImdldEFsbENoYW5uZWxDbGFpbXMiLCJjaGFubmVsQ2xhaW1zQXJyYXkiLCJwYWdpbmF0ZWRDaGFubmVsVmlld0RhdGEiLCJnZXRMb2NhbEZpbGVSZWNvcmQiLCJkYXRhVmFsdWVzIiwicmVxIiwiY29udGV4dCIsInN0b3JlIiwiaHRtbCIsImhlbG1ldCIsInJlbmRlclN0YXRpYyIsInJlZGlyZWN0IiwicHJlbG9hZGVkU3RhdGUiLCJnZXRTdGF0ZSIsInNlbmQiLCJwdWJsaXNoIiwiTE9DQUxfQ0hFQ0siLCJVTkFWQUlMQUJMRSIsIkVSUk9SIiwiQVZBSUxBQkxFIiwiaW5pdGlhbGl6ZSIsIkdBTGlzdGVuZXIiLCJzZW5kUGFnZVZpZXciLCJsb2NhdGlvbiIsImxpc3RlbiIsInNldCIsInBhdGhuYW1lIiwicGFnZXZpZXciLCJjaGlsZHJlbiIsIkhvbWVQYWdlIiwiQXBwIiwidmFsaWRhdGVGaWxlIiwiY3JlYXRlUHVibGlzaE1ldGFkYXRhIiwiY2xhaW0iLCJwdWJsaXNoSW5DaGFubmVsIiwic2VsZWN0ZWRDaGFubmVsIiwiY3JlYXRlUHVibGlzaEZvcm1EYXRhIiwiZmQiLCJGb3JtRGF0YSIsImFwcGVuZCIsImhhc093blByb3BlcnR5IiwiY3JlYXRlVGh1bWJuYWlsVXJsIiwidmFsaWRhdGVDaGFubmVsU2VsZWN0aW9uIiwidmFsaWRhdGVQdWJsaXNoUGFyYW1zIiwidXJsRXJyb3IiLCJQcm9ncmVzc0JhciIsImJhcnMiLCJpbmRleCIsImluY3JlbWVudGVyIiwiY3JlYXRlQmFycyIsImJpbmQiLCJzdGFydFByb2dyZXNzQmFyIiwidXBkYXRlUHJvZ3Jlc3NCYXIiLCJzdG9wUHJvZ3Jlc3NCYXIiLCJpIiwiaXNBY3RpdmUiLCJzZXRTdGF0ZSIsInVwZGF0ZUludGVydmFsIiwic2V0SW50ZXJ2YWwiLCJjbGVhckludGVydmFsIiwiYmFyIiwibnVtYmVyIiwiQ0hBTk5FTCIsIkFTU0VUX0xJVEUiLCJBU1NFVF9ERVRBSUxTIiwiZGlzcGxheUFzc2V0Iiwib25GaWxlUmVxdWVzdCIsInRvU3RyaW5nIiwibWV0YSIsImxpbmsiLCJzZWxlY3RTaXRlU3RhdGUiLCJzZWxlY3RTaXRlSG9zdCIsIlNlcnZlciIsIkNvbXBvbmVudHMiLCJDb250YWluZXJzIiwiUGFnZXMiLCJleHByZXNzIiwiYm9keVBhcnNlciIsImV4cHJlc3NIYW5kbGViYXJzIiwiSGFuZGxlYmFycyIsInBhc3Nwb3J0Iiwic2VyaWFsaXplU3BlZWNoVXNlciIsImRlc2VyaWFsaXplU3BlZWNoVXNlciIsImNvb2tpZVNlc3Npb24iLCJodHRwIiwiY29uZmlndXJlTXlzcWwiLCJteXNxbENvbmZpZyIsImNvbmZpZ3VyZVNpdGUiLCJzaXRlQ29uZmlnIiwiUE9SVCIsImNvbmZpZ3VyZVNsYWNrIiwic2xhY2tDb25maWciLCJjcmVhdGVBcHAiLCJhcHAiLCJlbmFibGUiLCJ1c2UiLCJzdGF0aWMiLCJfX2Rpcm5hbWUiLCJ1cmxlbmNvZGVkIiwiZXh0ZW5kZWQiLCJuZXh0IiwidmVyYm9zZSIsInNlcmlhbGl6ZVVzZXIiLCJkZXNlcmlhbGl6ZVVzZXIiLCJsb2NhbFNpZ251cFN0cmF0ZWd5IiwibG9jYWxMb2dpblN0cmF0ZWd5IiwibWF4QWdlIiwic2Vzc2lvbiIsImhicyIsImRlZmF1bHRMYXlvdXQiLCJoYW5kbGViYXJzIiwiZW5naW5lIiwic2VydmVyIiwic3RhcnQiLCJzeW5jIiwidXNlciIsImRvbmUiLCJQYXNzcG9ydExvY2FsU3RyYXRlZ3kiLCJTdHJhdGVneSIsImxicnlBcGkiLCJ1c2VybmFtZUZpZWxkIiwicGFzc3dvcmRGaWVsZCIsInVzZXJJbmZvIiwidXNlckRhdGEiLCJ1c2VyTmFtZSIsImNoYW5uZWxEYXRhIiwidHgiLCJjbGFpbV9pZCIsImNlcnRpZmljYXRlRGF0YSIsIm5ld1VzZXIiLCJuZXdDaGFubmVsIiwibmV3Q2VydGlmaWNhdGUiLCJzZXRDaGFubmVsIiwic2V0VXNlciIsInNob3J0Q2hhbm5lbElkIiwibGJyeUNvbmZpZyIsIlNUUklORyIsIkJPT0xFQU4iLCJJTlRFR0VSIiwiVEVYVCIsIkRFQ0lNQUwiLCJkZWZpbmUiLCJjbGFpbVNlcXVlbmNlIiwiZGVjb2RlZENsYWltIiwiZGVwdGgiLCJlZmZlY3RpdmVBbW91bnQiLCJoYXNTaWduYXR1cmUiLCJoZXgiLCJub3V0IiwidHhpZCIsInZhbGlkQXRIZWlnaHQiLCJ2YWx1ZVZlcnNpb24iLCJjbGFpbVR5cGUiLCJjZXJ0aWZpY2F0ZVZlcnNpb24iLCJrZXlUeXBlIiwicHVibGljS2V5IiwiZnJlZXplVGFibGVOYW1lIiwiYmVsb25nc1RvIiwiZm9yZWlnbktleSIsImFsbG93TnVsbCIsImZpbmRBbGwiLCJvcmRlciIsImdldExvbmdDaGFubmVsSWRGcm9tU2hvcnRDaGFubmVsSWQiLCIkbGlrZSIsImdldExvbmdDaGFubmVsSWRGcm9tQ2hhbm5lbE5hbWUiLCJ2YWxpZGF0ZUxvbmdDaGFubmVsSWQiLCJoYXNPbmUiLCJkZXRlcm1pbmVGaWxlRXh0ZW5zaW9uRnJvbUNvbnRlbnRUeXBlIiwiZGV0ZXJtaW5lVGh1bWJuYWlsIiwic3RvcmVkVGh1bWJuYWlsIiwicHJlcGFyZUNsYWltRGF0YSIsImxpY2Vuc2VVcmwiLCJwcmV2aWV3IiwibWV0YWRhdGFWZXJzaW9uIiwic291cmNlVHlwZSIsInNvdXJjZVZlcnNpb24iLCJzdHJlYW1WZXJzaW9uIiwiZ2V0U2hvcnRDbGFpbUlkRnJvbUxvbmdDbGFpbUlkIiwicmF3IiwiZ2V0TG9uZ0NsYWltSWRGcm9tU2hvcnRDbGFpbUlkIiwiZ2V0VG9wRnJlZUNsYWltSWRCeUNsYWltTmFtZSIsInZhbGlkYXRlTG9uZ0NsYWltSWQiLCJyZXNvbHZlQ2xhaW0iLCJjbGFpbUFycmF5IiwiZGVmYXVsdFZhbHVlIiwidHJlbmRpbmdFbGlnaWJsZSIsImhhc01hbnkiLCJnZXRSZWNlbnRDbGFpbXMiLCJsaW1pdCIsImFjdGlvbiIsImlwQWRkcmVzcyIsImJjcnlwdCIsInByb3RvdHlwZSIsImNvbXBhcmVQYXNzd29yZCIsImNvbXBhcmUiLCJjaGFuZ2VQYXNzd29yZCIsIm5ld1Bhc3N3b3JkIiwiZ2VuU2FsdCIsInNhbHRFcnJvciIsInNhbHQiLCJoYXNoIiwiaGFzaEVycm9yIiwiaG9vayIsInJldHVyblVzZXJBbmRDaGFubmVsSW5mbyIsInVzZXJJbnN0YW5jZSIsImdldENoYW5uZWwiLCJpc01hdGNoIiwibG9nSW4iLCJnZXQiLCJsb2dvdXQiLCJtdWx0aXBhcnQiLCJtdWx0aXBhcnRNaWRkbGV3YXJlIiwidXBsb2FkRGlyIiwiY2xhaW1OYW1lSXNBdmFpbGFibGUiLCJjaGVja0NoYW5uZWxBdmFpbGFiaWxpdHkiLCJlcnJvckhhbmRsZXJzIiwiYXV0aGVudGljYXRlVXNlciIsImF2YWlsYWJsZU5hbWUiLCJib2R5IiwiY2xhaW1zTGlzdCIsInJlc29sdmVSZXN1bHQiLCJmaWxlRGF0YSIsImZpbGVSZWNvcmQiLCJjb21wbGV0ZWQiLCJyZXNvbHZlZFVyaSIsImZpbGVzIiwiY2hhbm5lbFBhc3N3b3JkIiwidmFsaWRhdGVkQ2xhaW1OYW1lIiwidGh1bWJuYWlsUHVibGlzaFBhcmFtcyIsImxicnlUeCIsImNsYWltSW5mbyIsInB1Ymxpc2hIZWxwZXJzIiwiT3AiLCJwdWJsaXNoUmVzdWx0cyIsImNsYWltUmVjb3JkIiwidXBzZXJ0Q3JpdGVyaWEiLCJzZXRDbGFpbSIsInNldEZpbGUiLCJjbGFpbUFkZHJlc3NlcyIsImF0dHJpYnV0ZXMiLCJvciIsImF1dGhlbnRpY2F0ZUNoYW5uZWxDcmVkZW50aWFscyIsInVzZXJQYXNzd29yZCIsImNoYW5uZWxGaW5kUGFyYW1zIiwiQ0xBSU1TX1BFUl9QQUdFIiwiY2xhaW1zIiwidG90YWxQYWdlcyIsImRldGVybWluZVRvdGFsUGFnZXMiLCJwYWdpbmF0aW9uUGFnZSIsImdldFBhZ2VGcm9tUXVlcnkiLCJ2aWV3RGF0YSIsImV4dHJhY3RQYWdlRnJvbUNsYWltcyIsInByZXZpb3VzUGFnZSIsImRldGVybWluZVByZXZpb3VzUGFnZSIsImN1cnJlbnRQYWdlIiwibmV4dFBhZ2UiLCJkZXRlcm1pbmVOZXh0UGFnZSIsInRvdGFsUmVzdWx0cyIsImRldGVybWluZVRvdGFsQ2xhaW1zIiwicGFyc2VJbnQiLCJwYWdlTnVtYmVyIiwiY2xhaW1TdGFydEluZGV4IiwiY2xhaW1FbmRJbmRleCIsInBhZ2VPZkNsYWltcyIsInRvdGFsQ2xhaW1zIiwiZnVsbFBhZ2VzIiwiTWF0aCIsImZsb29yIiwicmVtYWluZGVyIiwiaGFuZGxlUGFnZVJlbmRlciIsInJlbmRlciIsImxheW91dCIsImluaXRpYWxTdGF0ZSIsImFzc2lnbiIsInB1Ymxpc2hTdWJtaXQiLCJMT0dJTiIsIkNSRUFURSIsImNoYW5uZWxMaXN0IiwiZ29vZ2xlQW5hbHl0aWNzSWQiLCJBYm91dFBhZ2UiLCJWSUVXIiwiTE9HT1VUIiwiTmF2QmFyIiwiY2hlY2tGb3JMb2dnZWRJblVzZXIiLCJsb2dvdXRVc2VyIiwiaGFuZGxlU2VsZWN0aW9uIiwiY3JlZGVudGlhbHMiLCJ0YXJnZXQiLCJzZWxlY3RlZE9wdGlvbnMiLCJMb2dvIiwiTmF2QmFyQ2hhbm5lbERyb3Bkb3duIiwiZGVmYXVsdFNlbGVjdGlvbiIsIlNFTyIsInBhZ2VVcmkiLCJjYW5vbmljYWxMaW5rIiwicmVsIiwiaHJlZiIsIm9iamVjdCIsImxvZ2dlZEluQ2hhbm5lbE5hbWUiLCJMb2dpblBhZ2UiLCJuZXdQcm9wcyIsIkNoYW5uZWxMb2dpbkZvcm0iLCJoYW5kbGVJbnB1dCIsImxvZ2luVG9DaGFubmVsIiwicHJldmVudERlZmF1bHQiLCJIZWFkZXJzIiwiQ2hhbm5lbENyZWF0ZUZvcm0iLCJoYW5kbGVDaGFubmVsSW5wdXQiLCJpbnB1dCIsImNsZWFuc2VDaGFubmVsSW5wdXQiLCJ1cGRhdGVJc0NoYW5uZWxBdmFpbGFibGUiLCJjaGFubmVsV2l0aEF0U3ltYm9sIiwiY2hlY2tJc1Bhc3N3b3JkUHJvdmlkZWQiLCJjaGVja0lzQ2hhbm5lbEF2YWlsYWJsZSIsIm1ha2VQdWJsaXNoQ2hhbm5lbFJlcXVlc3QiLCJBY3RpdmVTdGF0dXNCYXIiLCJJbmFjdGl2ZVN0YXR1c0JhciIsIlNob3dQYWdlIiwibmV4dFByb3BzIiwiU2hvd0xpdGUiLCJBc3NldERpc3BsYXkiLCJTaG93QXNzZXREZXRhaWxzIiwiQXNzZXRUaXRsZSIsIkFzc2V0SW5mbyIsImNvcHlUb0NsaXBib2FyZCIsImVsZW1lbnRUb0NvcHkiLCJkYXRhc2V0IiwiZWxlbWVudHRvY29weSIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJzZWxlY3QiLCJleGVjQ29tbWFuZCIsInByZXZpb3VzUmVxdWVzdCIsIlNob3dDaGFubmVsIiwiQ2hhbm5lbENsYWltc0Rpc3BsYXkiLCJzaG93TmV4dFJlc3VsdHNQYWdlIiwic2hvd1ByZXZpb3VzUmVzdWx0c1BhZ2UiLCJzaG93TmV3UGFnZSIsImRlZmF1bHRzIiwiQXNzZXRQcmV2aWV3IiwiZGlyZWN0U291cmNlTGluayIsInNob3dVcmxMaW5rIiwiRm91ck9oRm9yUGFnZSIsImRldGVybWluZVJlc3BvbnNlVHlwZSIsImZsaXBDbGFpbU5hbWVBbmRJZEZvckJhY2t3YXJkc0NvbXBhdGliaWxpdHkiLCJsb2dSZXF1ZXN0RGF0YSIsImdldENsYWltSWRBbmRTZXJ2ZUFzc2V0IiwibGJyeVVyaSIsImhhbmRsZVNob3dSZW5kZXIiLCJTRVJWRSIsImhhc0ZpbGVFeHRlbnNpb24iLCJwYXJzZU1vZGlmaWVyIiwicmVzcG9uc2VUeXBlIiwiU0hPVyIsImNsaWVudEFjY2VwdHNIdG1sIiwiYWNjZXB0IiwicmVxdWVzdElzRnJvbUJyb3dzZXIiLCJjbGllbnRXYW50c0Fzc2V0IiwicmFuZ2UiLCJpbWFnZUlzV2FudGVkIiwidmlkZW9Jc1dhbnRlZCIsImlzVmFsaWRDbGFpbUlkIiwiaXNWYWxpZFNob3J0SWQiLCJpc1ZhbGlkU2hvcnRJZE9yQ2xhaW1JZCIsInNlcnZlQXNzZXRUb0NsaWVudCIsInNlbmRGaWxlT3B0aW9ucyIsInNlbmRGaWxlIiwiZnVsbENsYWltSWQiLCJ0ZW1wTmFtZSIsInJldHVyblNhZ2FXaXRoUGFyYW1zIiwic2FnYSIsInNhZ2FNaWRkbGV3YXJlIiwibWlkZGxld2FyZSIsInJ1biIsImhhbmRsZVNob3dQYWdlVXJpIiwid2F0Y2hIYW5kbGVTaG93UGFnZVVyaSIsInBhcnNlQW5kVXBkYXRlSWRlbnRpZmllckFuZENsYWltIiwicGFyc2VBbmRVcGRhdGVDbGFpbU9ubHkiLCJuZXdBc3NldFJlcXVlc3QiLCJ3YXRjaE5ld0Fzc2V0UmVxdWVzdCIsImdldFNob3J0SWQiLCJnZXRDbGFpbURhdGEiLCJuZXdDaGFubmVsUmVxdWVzdCIsIndhdGNoTmV3Q2hhbm5lbFJlcXVlc3QiLCJ3YXRjaFVwZGF0ZUNoYW5uZWxDbGFpbXMiLCJnZXROZXdDbGFpbXNBbmRVcGRhdGVDaGFubmVsIiwibG9nTGV2ZWwiLCJ3aW5zdG9uIiwidHJhbnNwb3J0cyIsIkNvbnNvbGUiLCJsZXZlbCIsInRpbWVzdGFtcCIsImNvbG9yaXplIiwicHJldHR5UHJpbnQiLCJoYW5kbGVFeGNlcHRpb25zIiwiaHVtYW5SZWFkYWJsZVVuaGFuZGxlZEV4Y2VwdGlvbiIsIndhcm4iLCJzaWxseSIsImxvZ2dlckNvbmZpZyIsIndpbnN0b25TbGFja1dlYkhvb2siLCJTbGFja1dlYkhvb2siLCJhZGQiLCJ3ZWJob29rVXJsIiwiaWNvbkVtb2ppIiwiUGF0aCIsImltcG9ydFN1Yk1vZHVsZXMiLCJ0aGlzRm9sZGVyIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7O0FDN0RBLGtDOzs7Ozs7QUNBQSxvQzs7Ozs7O0FDQUEsd0M7Ozs7Ozs7OztBQ0FBLFNBQVNBLFVBQVQsR0FBdUI7QUFBQTs7QUFDckIsT0FBS0MsU0FBTCxHQUFpQjtBQUNmQyxjQUFVO0FBREssR0FBakI7QUFHQSxPQUFLQyxhQUFMLEdBQXFCO0FBQ25CQyxpQkFBYSwrQkFETTtBQUVuQkMsZUFBYSxvREFGTTtBQUduQkMsV0FBYTtBQUhNLEdBQXJCO0FBS0EsT0FBS0MsSUFBTCxHQUFZO0FBQ1ZDLGdCQUFZO0FBREYsR0FBWjtBQUdBLE9BQUtDLGdCQUFMLEdBQXdCO0FBQ3RCQyxnQkFBWSxFQURVO0FBRXRCQyxnQkFBWSxFQUZVO0FBR3RCQyxXQUFZO0FBSFUsR0FBeEI7QUFLQSxPQUFLQyxPQUFMLEdBQWU7QUFDYlQsaUJBQWEscURBREE7QUFF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QixhQUFhRixLQUFLbm5CLE9BQUwsQ0FBYWdVLFNBQWIsRUFBd0IsbUJBQXhCLENBQW5CO0FBQ0F0ZCxPQUFPQyxPQUFQLEdBQWlCeXdCLGlCQUFpQkMsVUFBakIsQ0FBakIsQzs7Ozs7Ozs7OztBQ0hBLElBQU1GLE9BQU8sbUJBQUF0d0IsQ0FBUSxFQUFSLENBQWI7QUFDQSxJQUFNdXdCLG1CQUFtQixtQkFBQXZ3QixDQUFRLEVBQVIsQ0FBekI7QUFDQSxJQUFNd3dCLGFBQWFGLEtBQUtubkIsT0FBTCxDQUFhZ1UsU0FBYixFQUF3QixvQkFBeEIsQ0FBbkI7QUFDQXRkLE9BQU9DLE9BQVAsR0FBaUJ5d0IsaUJBQWlCQyxVQUFqQixDQUFqQixDOzs7Ozs7Ozs7QUNIQSxJQUFNRixPQUFPLG1CQUFBdHdCLENBQVEsRUFBUixDQUFiO0FBQ0EsSUFBTXV3QixtQkFBbUIsbUJBQUF2d0IsQ0FBUSxFQUFSLENBQXpCO0FBQ0EsSUFBTXd3QixhQUFhRixLQUFLbm5CLE9BQUwsQ0FBYWdVLFNBQWIsRUFBd0IsZUFBeEIsQ0FBbkI7QUFDQXRkLE9BQU9DLE9BQVAsR0FBaUJ5d0IsaUJBQWlCQyxVQUFqQixDQUFqQixDOzs7Ozs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QiIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIi9cIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA1NSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgMDM0MTM3ZGUxODNkOGI5ZjdmZjUiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInJlYWN0XCJcbi8vIG1vZHVsZSBpZCA9IDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwid2luc3RvblwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcIndpbnN0b25cIlxuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdC1yZWR1eFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInJlYWN0LXJlZHV4XCJcbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiZnVuY3Rpb24gU2l0ZUNvbmZpZyAoKSB7XG4gIHRoaXMuYW5hbHl0aWNzID0ge1xuICAgIGdvb2dsZUlkOiAnZGVmYXVsdCcsXG4gIH07XG4gIHRoaXMuYXNzZXREZWZhdWx0cyA9IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FuIGFzc2V0IHB1Ymxpc2hlZCBvbiBTcGVlLmNoJyxcbiAgICB0aHVtYm5haWwgIDogJ2h0dHBzOi8vc3BlZS5jaC9hc3NldHMvaW1nL3ZpZGVvX3RodW1iX2RlZmF1bHQucG5nJyxcbiAgICB0aXRsZSAgICAgIDogJ1NwZWUuY2gnLFxuICB9O1xuICB0aGlzLmF1dGggPSB7XG4gICAgc2Vzc2lvbktleTogJ2RlZmF1bHQnLFxuICB9O1xuICB0aGlzLmNvbXBvbmVudHNDb25maWcgPSB7XG4gICAgY29tcG9uZW50czoge30sXG4gICAgY29udGFpbmVyczoge30sXG4gICAgcGFnZXMgICAgIDoge30sXG4gIH07XG4gIHRoaXMuZGV0YWlscyA9IHtcbiAgICBkZXNjcmlwdGlvbjogJ09wZW4tc291cmNlLCBkZWNlbnRyYWxpemVkIGltYWdlIGFuZCB2aWRlbyBzaGFyaW5nLicsXG4gICAgaG9zdCAgICAgICA6ICdkZWZhdWx0JyxcbiAgICBwb3J0ICAgICAgIDogMzAwMCxcbiAgICB0aXRsZSAgICAgIDogJ1NwZWUuY2gnLFxuICAgIHR3aXR0ZXIgICAgOiAnQHNwZWVfY2gnLFxuICB9O1xuICB0aGlzLnB1Ymxpc2hpbmcgPSB7XG4gICAgYWRkaXRpb25hbENsYWltQWRkcmVzc2VzOiBbXSxcbiAgICBkaXNhYmxlZCAgICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgIGRpc2FibGVkTWVzc2FnZSAgICAgICAgIDogJ1BsZWFzZSBjaGVjayBiYWNrIHNvb24uJyxcbiAgICBwcmltYXJ5Q2xhaW1BZGRyZXNzICAgICA6ICdkZWZhdWx0JyxcbiAgICB0aHVtYm5haWxDaGFubmVsICAgICAgICA6ICdkZWZhdWx0JyxcbiAgICB0aHVtYm5haWxDaGFubmVsSWQgICAgICA6ICdkZWZhdWx0JyxcbiAgICB1cGxvYWREaXJlY3RvcnkgICAgICAgICA6ICcvaG9tZS9sYnJ5L1VwbG9hZHMnLFxuICB9O1xuICB0aGlzLmNvbmZpZ3VyZSA9IChjb25maWcpID0+IHtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKCdObyBzaXRlIGNvbmZpZyByZWNlaXZlZC4nKTtcbiAgICB9XG4gICAgY29uc3QgeyBhbmFseXRpY3MsIGFzc2V0RGVmYXVsdHMsIGF1dGgsIGNvbXBvbmVudHNDb25maWcsIGRldGFpbHMsIHB1Ymxpc2hpbmcgfSA9IGNvbmZpZztcbiAgICB0aGlzLmFuYWx5dGljcyA9IGFuYWx5dGljcztcbiAgICB0aGlzLmFzc2V0RGVmYXVsdHMgPSBhc3NldERlZmF1bHRzO1xuICAgIHRoaXMuYXV0aCA9IGF1dGg7XG4gICAgdGhpcy5kZXRhaWxzID0gZGV0YWlscztcbiAgICB0aGlzLnB1Ymxpc2hpbmcgPSBwdWJsaXNoaW5nO1xuICAgIHRoaXMuY29tcG9uZW50c0NvbmZpZyA9IGNvbXBvbmVudHNDb25maWc7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTaXRlQ29uZmlnKCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jb25maWcvc2l0ZUNvbmZpZy5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LXJvdXRlci1kb21cIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJyZWFjdC1yb3V0ZXItZG9tXCJcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiY29uc3QgU2VxdWVsaXplID0gcmVxdWlyZSgnc2VxdWVsaXplJyk7XG5jb25zdCBsb2dnZXIgPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5cbmNvbnNvbGUubG9nKCdleHBvcnRpbmcgc2VxdWVsaXplIG1vZGVscycpO1xuY29uc3QgeyBkYXRhYmFzZSwgdXNlcm5hbWUsIHBhc3N3b3JkIH0gPSByZXF1aXJlKCcuLi8uLi9jb25maWcvbXlzcWxDb25maWcnKTtcbmNvbnN0IGRiID0ge307XG4vLyBzZXQgc2VxdWVsaXplIG9wdGlvbnNcbmNvbnN0IHNlcXVlbGl6ZSA9IG5ldyBTZXF1ZWxpemUoZGF0YWJhc2UsIHVzZXJuYW1lLCBwYXNzd29yZCwge1xuICBob3N0ICAgICAgICAgIDogJ2xvY2FsaG9zdCcsXG4gIGRpYWxlY3QgICAgICAgOiAnbXlzcWwnLFxuICBkaWFsZWN0T3B0aW9uczoge2RlY2ltYWxOdW1iZXJzOiB0cnVlfSwgLy8gZml4IHRvIGVuc3VyZSBERUNJTUFMIHdpbGwgbm90IGJlIHN0b3JlZCBhcyBhIHN0cmluZ1xuICBsb2dnaW5nICAgICAgIDogZmFsc2UsXG4gIHBvb2wgICAgICAgICAgOiB7XG4gICAgbWF4ICAgIDogNSxcbiAgICBtaW4gICAgOiAwLFxuICAgIGlkbGUgICA6IDEwMDAwLFxuICAgIGFjcXVpcmU6IDEwMDAwLFxuICB9LFxufSk7XG5cbi8vIGVzdGFibGlzaCBteXNxbCBjb25uZWN0aW9uXG5zZXF1ZWxpemVcbiAgLmF1dGhlbnRpY2F0ZSgpXG4gIC50aGVuKCgpID0+IHtcbiAgICBsb2dnZXIuaW5mbygnU2VxdWVsaXplIGhhcyBlc3RhYmxpc2hlZCBteXNxbCBjb25uZWN0aW9uIHN1Y2Nlc3NmdWxseS4nKTtcbiAgfSlcbiAgLmNhdGNoKGVyciA9PiB7XG4gICAgbG9nZ2VyLmVycm9yKCdTZXF1ZWxpemUgd2FzIHVuYWJsZSB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZTonLCBlcnIpO1xuICB9KTtcblxuLy8gbWFudWFsbHkgYWRkIGVhY2ggbW9kZWwgdG8gdGhlIGRiIG9iamVjdFxuY29uc3QgQ2VydGlmaWNhdGUgPSByZXF1aXJlKCcuL2NlcnRpZmljYXRlLmpzJyk7XG5jb25zdCBDaGFubmVsID0gcmVxdWlyZSgnLi9jaGFubmVsLmpzJyk7XG5jb25zdCBDbGFpbSA9IHJlcXVpcmUoJy4vY2xhaW0uanMnKTtcbmNvbnN0IEZpbGUgPSByZXF1aXJlKCcuL2ZpbGUuanMnKTtcbmNvbnN0IFJlcXVlc3QgPSByZXF1aXJlKCcuL3JlcXVlc3QuanMnKTtcbmNvbnN0IFVzZXIgPSByZXF1aXJlKCcuL3VzZXIuanMnKTtcbmRiWydDZXJ0aWZpY2F0ZSddID0gc2VxdWVsaXplLmltcG9ydCgnQ2VydGlmaWNhdGUnLCBDZXJ0aWZpY2F0ZSk7XG5kYlsnQ2hhbm5lbCddID0gc2VxdWVsaXplLmltcG9ydCgnQ2hhbm5lbCcsIENoYW5uZWwpO1xuZGJbJ0NsYWltJ10gPSBzZXF1ZWxpemUuaW1wb3J0KCdDbGFpbScsIENsYWltKTtcbmRiWydGaWxlJ10gPSBzZXF1ZWxpemUuaW1wb3J0KCdGaWxlJywgRmlsZSk7XG5kYlsnUmVxdWVzdCddID0gc2VxdWVsaXplLmltcG9ydCgnUmVxdWVzdCcsIFJlcXVlc3QpO1xuZGJbJ1VzZXInXSA9IHNlcXVlbGl6ZS5pbXBvcnQoJ1VzZXInLCBVc2VyKTtcblxuLy8gcnVuIG1vZGVsLmFzc29jaWF0aW9uIGZvciBlYWNoIG1vZGVsIGluIHRoZSBkYiBvYmplY3QgdGhhdCBoYXMgYW4gYXNzb2NpYXRpb25cbk9iamVjdC5rZXlzKGRiKS5mb3JFYWNoKG1vZGVsTmFtZSA9PiB7XG4gIGlmIChkYlttb2RlbE5hbWVdLmFzc29jaWF0ZSkge1xuICAgIGxvZ2dlci5pbmZvKCdBc3NvY2lhdGluZyBtb2RlbDonLCBtb2RlbE5hbWUpO1xuICAgIGRiW21vZGVsTmFtZV0uYXNzb2NpYXRlKGRiKTtcbiAgfVxufSk7XG5cbmRiLnNlcXVlbGl6ZSA9IHNlcXVlbGl6ZTtcbmRiLlNlcXVlbGl6ZSA9IFNlcXVlbGl6ZTtcblxuLy8gYWRkIGFuICd1cHNlcnQnIG1ldGhvZCB0byB0aGUgZGIgb2JqZWN0XG5kYi51cHNlcnQgPSAoTW9kZWwsIHZhbHVlcywgY29uZGl0aW9uLCB0YWJsZU5hbWUpID0+IHtcbiAgcmV0dXJuIE1vZGVsXG4gICAgLmZpbmRPbmUoe1xuICAgICAgd2hlcmU6IGNvbmRpdGlvbixcbiAgICB9KVxuICAgIC50aGVuKG9iaiA9PiB7XG4gICAgICBpZiAob2JqKSB7ICAvLyB1cGRhdGVcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGB1cGRhdGluZyByZWNvcmQgaW4gZGIuJHt0YWJsZU5hbWV9YCk7XG4gICAgICAgIHJldHVybiBvYmoudXBkYXRlKHZhbHVlcyk7XG4gICAgICB9IGVsc2UgeyAgLy8gaW5zZXJ0XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgY3JlYXRpbmcgcmVjb3JkIGluIGRiLiR7dGFibGVOYW1lfWApO1xuICAgICAgICByZXR1cm4gTW9kZWwuY3JlYXRlKHZhbHVlcyk7XG4gICAgICB9XG4gICAgfSlcbiAgICAuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYCR7dGFibGVOYW1lfS51cHNlcnQgZXJyb3JgLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZGI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvbW9kZWxzL2luZGV4LmpzIiwiaW1wb3J0ICdjcm9zcy1mZXRjaC9wb2x5ZmlsbCc7XG5cbi8qKlxuICogUGFyc2VzIHRoZSBKU09OIHJldHVybmVkIGJ5IGEgbmV0d29yayByZXF1ZXN0XG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSByZXNwb25zZSBBIHJlc3BvbnNlIGZyb20gYSBuZXR3b3JrIHJlcXVlc3RcbiAqXG4gKiBAcmV0dXJuIHtvYmplY3R9ICAgICAgICAgIFRoZSBwYXJzZWQgSlNPTiBmcm9tIHRoZSByZXF1ZXN0XG4gKi9cbmZ1bmN0aW9uIHBhcnNlSlNPTiAocmVzcG9uc2UpIHtcbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0IHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA1KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIHN0YXR1cyByZXR1cm5lZCBieSBhIG5ldHdvcmsgcmVxdWVzdFxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gcmVzcG9uc2UgICBBIHJlc3BvbnNlIGZyb20gYSBuZXR3b3JrIHJlcXVlc3RcbiAqIEBwYXJhbSAge29iamVjdH0gcmVzcG9uc2UgICBUaGUgcGFyc2VkIEpTT04gZnJvbSB0aGUgbmV0d29yayByZXF1ZXN0XG4gKlxuICogQHJldHVybiB7b2JqZWN0IHwgdW5kZWZpbmVkfSBSZXR1cm5zIG9iamVjdCB3aXRoIHN0YXR1cyBhbmQgc3RhdHVzVGV4dCwgb3IgdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIGNoZWNrU3RhdHVzIChyZXNwb25zZSwganNvblJlc3BvbnNlKSB7XG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1cyA8IDMwMCkge1xuICAgIHJldHVybiBqc29uUmVzcG9uc2U7XG4gIH1cbiAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoanNvblJlc3BvbnNlLm1lc3NhZ2UpO1xuICBlcnJvci5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICB0aHJvdyBlcnJvcjtcbn1cblxuLyoqXG4gKiBSZXF1ZXN0cyBhIFVSTCwgcmV0dXJuaW5nIGEgcHJvbWlzZVxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gdXJsICAgICAgIFRoZSBVUkwgd2Ugd2FudCB0byByZXF1ZXN0XG4gKiBAcGFyYW0gIHtvYmplY3R9IFtvcHRpb25zXSBUaGUgb3B0aW9ucyB3ZSB3YW50IHRvIHBhc3MgdG8gXCJmZXRjaFwiXG4gKlxuICogQHJldHVybiB7b2JqZWN0fSAgICAgICAgICAgVGhlIHJlc3BvbnNlIGRhdGFcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXF1ZXN0ICh1cmwsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGZldGNoKHVybCwgb3B0aW9ucylcbiAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3Jlc3BvbnNlLCBwYXJzZUpTT04ocmVzcG9uc2UpXSk7XG4gICAgfSlcbiAgICAudGhlbigoW3Jlc3BvbnNlLCBqc29uUmVzcG9uc2VdKSA9PiB7XG4gICAgICByZXR1cm4gY2hlY2tTdGF0dXMocmVzcG9uc2UsIGpzb25SZXNwb25zZSk7XG4gICAgfSk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvdXRpbHMvcmVxdWVzdC5qcyIsImltcG9ydCAqIGFzIGFjdGlvbnMgZnJvbSAnY29uc3RhbnRzL3Nob3dfYWN0aW9uX3R5cGVzJztcblxuaW1wb3J0IHsgQ0hBTk5FTCwgQVNTRVRfTElURSwgQVNTRVRfREVUQUlMUyB9IGZyb20gJ2NvbnN0YW50cy9zaG93X3JlcXVlc3RfdHlwZXMnO1xuXG4vLyBiYXNpYyByZXF1ZXN0IHBhcnNpbmdcbmV4cG9ydCBmdW5jdGlvbiBvbkhhbmRsZVNob3dQYWdlVXJpIChwYXJhbXMpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkhBTkRMRV9TSE9XX1VSSSxcbiAgICBkYXRhOiBwYXJhbXMsXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gb25SZXF1ZXN0RXJyb3IgKGVycm9yKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5SRVFVRVNUX0VSUk9SLFxuICAgIGRhdGE6IGVycm9yLFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG9uTmV3Q2hhbm5lbFJlcXVlc3QgKGNoYW5uZWxOYW1lLCBjaGFubmVsSWQpIHtcbiAgY29uc3QgcmVxdWVzdFR5cGUgPSBDSEFOTkVMO1xuICBjb25zdCByZXF1ZXN0SWQgPSBgY3IjJHtjaGFubmVsTmFtZX0jJHtjaGFubmVsSWR9YDtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkNIQU5ORUxfUkVRVUVTVF9ORVcsXG4gICAgZGF0YTogeyByZXF1ZXN0VHlwZSwgcmVxdWVzdElkLCBjaGFubmVsTmFtZSwgY2hhbm5lbElkIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gb25OZXdBc3NldFJlcXVlc3QgKG5hbWUsIGlkLCBjaGFubmVsTmFtZSwgY2hhbm5lbElkLCBleHRlbnNpb24pIHtcbiAgY29uc3QgcmVxdWVzdFR5cGUgPSBleHRlbnNpb24gPyBBU1NFVF9MSVRFIDogQVNTRVRfREVUQUlMUztcbiAgY29uc3QgcmVxdWVzdElkID0gYGFyIyR7bmFtZX0jJHtpZH0jJHtjaGFubmVsTmFtZX0jJHtjaGFubmVsSWR9YDtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkFTU0VUX1JFUVVFU1RfTkVXLFxuICAgIGRhdGE6IHtcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgcmVxdWVzdElkLFxuICAgICAgbmFtZSxcbiAgICAgIG1vZGlmaWVyOiB7XG4gICAgICAgIGlkLFxuICAgICAgICBjaGFubmVsOiB7XG4gICAgICAgICAgbmFtZTogY2hhbm5lbE5hbWUsXG4gICAgICAgICAgaWQgIDogY2hhbm5lbElkLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG9uUmVxdWVzdFVwZGF0ZSAocmVxdWVzdFR5cGUsIHJlcXVlc3RJZCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuUkVRVUVTVF9VUERBVEUsXG4gICAgZGF0YToge1xuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICByZXF1ZXN0SWQsXG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRSZXF1ZXN0VG9SZXF1ZXN0TGlzdCAoaWQsIGVycm9yLCBrZXkpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLlJFUVVFU1RfTElTVF9BREQsXG4gICAgZGF0YTogeyBpZCwgZXJyb3IsIGtleSB9LFxuICB9O1xufTtcblxuLy8gYXNzZXQgYWN0aW9uc1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkQXNzZXRUb0Fzc2V0TGlzdCAoaWQsIGVycm9yLCBuYW1lLCBjbGFpbUlkLCBzaG9ydElkLCBjbGFpbURhdGEpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkFTU0VUX0FERCxcbiAgICBkYXRhOiB7IGlkLCBlcnJvciwgbmFtZSwgY2xhaW1JZCwgc2hvcnRJZCwgY2xhaW1EYXRhIH0sXG4gIH07XG59XG5cbi8vIGNoYW5uZWwgYWN0aW9uc1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkTmV3Q2hhbm5lbFRvQ2hhbm5lbExpc3QgKGlkLCBuYW1lLCBzaG9ydElkLCBsb25nSWQsIGNsYWltc0RhdGEpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkNIQU5ORUxfQURELFxuICAgIGRhdGE6IHsgaWQsIG5hbWUsIHNob3J0SWQsIGxvbmdJZCwgY2xhaW1zRGF0YSB9LFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG9uVXBkYXRlQ2hhbm5lbENsYWltcyAoY2hhbm5lbEtleSwgbmFtZSwgbG9uZ0lkLCBwYWdlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5DSEFOTkVMX0NMQUlNU19VUERBVEVfQVNZTkMsXG4gICAgZGF0YToge2NoYW5uZWxLZXksIG5hbWUsIGxvbmdJZCwgcGFnZX0sXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQ2hhbm5lbENsYWltcyAoY2hhbm5lbExpc3RJZCwgY2xhaW1zRGF0YSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuQ0hBTk5FTF9DTEFJTVNfVVBEQVRFX1NVQ0NFU1MsXG4gICAgZGF0YToge2NoYW5uZWxMaXN0SWQsIGNsYWltc0RhdGF9LFxuICB9O1xufTtcblxuLy8gZGlzcGxheSBhIGZpbGVcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbGVSZXF1ZXN0ZWQgKG5hbWUsIGNsYWltSWQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkZJTEVfUkVRVUVTVEVELFxuICAgIGRhdGE6IHsgbmFtZSwgY2xhaW1JZCB9LFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUZpbGVBdmFpbGFiaWxpdHkgKHN0YXR1cykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuRklMRV9BVkFJTEFCSUxJVFlfVVBEQVRFLFxuICAgIGRhdGE6IHN0YXR1cyxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVEaXNwbGF5QXNzZXRFcnJvciAoZXJyb3IpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkRJU1BMQVlfQVNTRVRfRVJST1IsXG4gICAgZGF0YTogZXJyb3IsXG4gIH07XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2FjdGlvbnMvc2hvdy5qcyIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgeyB1cGRhdGVMb2dnZWRJbkNoYW5uZWwgfSBmcm9tICdhY3Rpb25zL2NoYW5uZWwnO1xuaW1wb3J0IHt1cGRhdGVTZWxlY3RlZENoYW5uZWx9IGZyb20gJ2FjdGlvbnMvcHVibGlzaCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBjaGFubmVsLCBzaXRlIH0pID0+IHtcbiAgcmV0dXJuIHtcbiAgICBjaGFubmVsTmFtZSAgIDogY2hhbm5lbC5sb2dnZWRJbkNoYW5uZWwubmFtZSxcbiAgICBjaGFubmVsU2hvcnRJZDogY2hhbm5lbC5sb2dnZWRJbkNoYW5uZWwuc2hvcnRJZCxcbiAgICBjaGFubmVsTG9uZ0lkIDogY2hhbm5lbC5sb2dnZWRJbkNoYW5uZWwubG9uZ0lkLFxuICAgIHNpdGVEZXNjcmlwdGlvbjogc2l0ZS5kZXNjcmlwdGlvbixcbiAgfTtcbn07XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IGRpc3BhdGNoID0+IHtcbiAgcmV0dXJuIHtcbiAgICBvbkNoYW5uZWxMb2dpbjogKG5hbWUsIHNob3J0SWQsIGxvbmdJZCkgPT4ge1xuICAgICAgZGlzcGF0Y2godXBkYXRlTG9nZ2VkSW5DaGFubmVsKG5hbWUsIHNob3J0SWQsIGxvbmdJZCkpO1xuICAgICAgZGlzcGF0Y2godXBkYXRlU2VsZWN0ZWRDaGFubmVsKG5hbWUpKTtcbiAgICB9LFxuICAgIG9uQ2hhbm5lbExvZ291dDogKCkgPT4ge1xuICAgICAgZGlzcGF0Y2godXBkYXRlTG9nZ2VkSW5DaGFubmVsKG51bGwsIG51bGwsIG51bGwpKTtcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9OYXZCYXIvaW5kZXguanMiLCIvLyByZXF1ZXN0IGFjdGlvbnNcbmV4cG9ydCBjb25zdCBIQU5ETEVfU0hPV19VUkkgPSAnSEFORExFX1NIT1dfVVJJJztcbmV4cG9ydCBjb25zdCBSRVFVRVNUX0VSUk9SID0gJ1JFUVVFU1RfRVJST1InO1xuZXhwb3J0IGNvbnN0IFJFUVVFU1RfVVBEQVRFID0gJ1JFUVVFU1RfVVBEQVRFJztcbmV4cG9ydCBjb25zdCBBU1NFVF9SRVFVRVNUX05FVyA9ICdBU1NFVF9SRVFVRVNUX05FVyc7XG5leHBvcnQgY29uc3QgQ0hBTk5FTF9SRVFVRVNUX05FVyA9ICdDSEFOTkVMX1JFUVVFU1RfTkVXJztcbmV4cG9ydCBjb25zdCBSRVFVRVNUX0xJU1RfQUREID0gJ1JFUVVFU1RfTElTVF9BREQnO1xuXG4vLyBhc3NldCBhY3Rpb25zXG5leHBvcnQgY29uc3QgQVNTRVRfQUREID0gYEFTU0VUX0FERGA7XG5cbi8vIGNoYW5uZWwgYWN0aW9uc1xuZXhwb3J0IGNvbnN0IENIQU5ORUxfQUREID0gJ0NIQU5ORUxfQUREJztcblxuZXhwb3J0IGNvbnN0IENIQU5ORUxfQ0xBSU1TX1VQREFURV9BU1lOQyA9ICdDSEFOTkVMX0NMQUlNU19VUERBVEVfQVNZTkMnO1xuZXhwb3J0IGNvbnN0IENIQU5ORUxfQ0xBSU1TX1VQREFURV9TVUNDRVNTID0gJ0NIQU5ORUxfQ0xBSU1TX1VQREFURV9TVUNDRVNTJztcblxuLy8gYXNzZXQvZmlsZSBkaXNwbGF5IGFjdGlvbnNcbmV4cG9ydCBjb25zdCBGSUxFX1JFUVVFU1RFRCA9ICdGSUxFX1JFUVVFU1RFRCc7XG5leHBvcnQgY29uc3QgRklMRV9BVkFJTEFCSUxJVFlfVVBEQVRFID0gJ0ZJTEVfQVZBSUxBQklMSVRZX1VQREFURSc7XG5leHBvcnQgY29uc3QgRElTUExBWV9BU1NFVF9FUlJPUiA9ICdESVNQTEFZX0FTU0VUX0VSUk9SJztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb25zdGFudHMvc2hvd19hY3Rpb25fdHlwZXMuanMiLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgc2l0ZSB9KSA9PiB7XG4gIGNvbnN0IHsgZGVmYXVsdERlc2NyaXB0aW9uLCBkZWZhdWx0VGh1bWJuYWlsLCBkZXNjcmlwdGlvbjogc2l0ZURlc2NyaXB0aW9uLCBob3N0OiBzaXRlSG9zdCwgdGl0bGU6IHNpdGVUaXRsZSwgdHdpdHRlcjogc2l0ZVR3aXR0ZXIgfSA9IHNpdGU7XG4gIHJldHVybiB7XG4gICAgZGVmYXVsdERlc2NyaXB0aW9uLFxuICAgIGRlZmF1bHRUaHVtYm5haWwsXG4gICAgc2l0ZURlc2NyaXB0aW9uLFxuICAgIHNpdGVIb3N0LFxuICAgIHNpdGVUaXRsZSxcbiAgICBzaXRlVHdpdHRlcixcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBudWxsKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb21wb25lbnRzL1NFTy9pbmRleC5qcyIsImV4cG9ydCBjb25zdCBzZWxlY3RBc3NldCA9IChzaG93KSA9PiB7XG4gIGNvbnN0IHJlcXVlc3QgPSBzaG93LnJlcXVlc3RMaXN0W3Nob3cucmVxdWVzdC5pZF07XG4gIGNvbnN0IGFzc2V0S2V5ID0gcmVxdWVzdC5rZXk7XG4gIHJldHVybiBzaG93LmFzc2V0TGlzdFthc3NldEtleV07XG59O1xuXG5leHBvcnQgY29uc3Qgc2VsZWN0U2hvd1N0YXRlID0gKHN0YXRlKSA9PiB7XG4gIHJldHVybiBzdGF0ZS5zaG93O1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9zZWxlY3RvcnMvc2hvdy5qcyIsImNvbnN0IHsgbHN0YXRTeW5jLCByZWFkZGlyU3luYyB9ID0gcmVxdWlyZSgnZnMnKTtcclxuY29uc3QgeyBqb2luIH0gPSByZXF1aXJlKCdwYXRoJyk7XHJcblxyXG5jb25zdCBnZXRTdWJEaXJlY3RvcnlOYW1lcyA9IChyb290KSA9PiB7XHJcbiAgY29uc29sZS5sb2coJ2dldHRpbmcgc3ViIGRpcmVjdG9yaWVzIGZvcjonLCByb290KTtcclxuICByZXR1cm4gcmVhZGRpclN5bmMocm9vdClcclxuICAgIC5maWx0ZXIobmFtZSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdtb2R1bGUgZm91bmQ6JywgbmFtZSk7XHJcbiAgICAgIGxldCBmdWxsUGF0aCA9IGpvaW4ocm9vdCwgbmFtZSk7XHJcbiAgICAgIHJldHVybiBsc3RhdFN5bmMoZnVsbFBhdGgpLmlzRGlyZWN0b3J5KCk7XHJcbiAgICB9KTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gKHJvb3QpID0+IHtcclxuICBsZXQgYWxsTW9kdWxlcyA9IHt9O1xyXG4gIGdldFN1YkRpcmVjdG9yeU5hbWVzKHJvb3QpXHJcbiAgICAuZm9yRWFjaCgobmFtZSkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygnaW1wb3J0aW5nIG1vZHVsZTonLCBuYW1lKTtcclxuICAgICAgYWxsTW9kdWxlc1tuYW1lXSA9IHJlcXVpcmUoYC4vJHtuYW1lfWApLmRlZmF1bHQ7XHJcbiAgICB9KTtcclxuICByZXR1cm4gYWxsTW9kdWxlcztcclxufTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vYnVpbGQvdXRpbHMvaW1wb3J0U3ViTW9kdWxlcy5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWhlbG1ldFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInJlYWN0LWhlbG1ldFwiXG4vLyBtb2R1bGUgaWQgPSAxM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWR1eC1zYWdhL2VmZmVjdHNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJyZWR1eC1zYWdhL2VmZmVjdHNcIlxuLy8gbW9kdWxlIGlkID0gMTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicGF0aFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInBhdGhcIlxuLy8gbW9kdWxlIGlkID0gMTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiY29uc3QgYXhpb3MgPSByZXF1aXJlKCdheGlvcycpO1xuY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuY29uc3QgeyBhcGk6IHsgYXBpSG9zdCwgYXBpUG9ydCB9IH0gPSByZXF1aXJlKCcuLi8uLi9jb25maWcvbGJyeUNvbmZpZy5qcycpO1xuY29uc3QgbGJyeUFwaVVyaSA9ICdodHRwOi8vJyArIGFwaUhvc3QgKyAnOicgKyBhcGlQb3J0O1xuY29uc3QgeyBjaG9vc2VHYUxicnluZXRQdWJsaXNoTGFiZWwsIHNlbmRHQVRpbWluZ0V2ZW50IH0gPSByZXF1aXJlKCcuL2dvb2dsZUFuYWx5dGljcy5qcycpO1xuXG5jb25zdCBoYW5kbGVMYnJ5bmV0UmVzcG9uc2UgPSAoeyBkYXRhIH0sIHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICBsb2dnZXIuZGVidWcoJ2xicnkgYXBpIGRhdGE6JywgZGF0YSk7XG4gIGlmIChkYXRhLnJlc3VsdCkge1xuICAgIC8vIGNoZWNrIGZvciBhbiBlcnJvclxuICAgIGlmIChkYXRhLnJlc3VsdC5lcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdMYnJ5bmV0IGFwaSBlcnJvcjonLCBkYXRhLnJlc3VsdC5lcnJvcik7XG4gICAgICByZWplY3QobmV3IEVycm9yKGRhdGEucmVzdWx0LmVycm9yKSk7XG4gICAgICByZXR1cm47XG4gICAgfTtcbiAgICByZXNvbHZlKGRhdGEucmVzdWx0KTtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gZmFsbGJhY2sgaW4gY2FzZSBpdCBqdXN0IHRpbWVkIG91dFxuICByZWplY3QoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHB1Ymxpc2hDbGFpbSAocHVibGlzaFBhcmFtcykge1xuICAgIGxvZ2dlci5kZWJ1ZyhgbGJyeUFwaSA+PiBQdWJsaXNoaW5nIGNsYWltIHRvIFwiJHtwdWJsaXNoUGFyYW1zLm5hbWV9XCJgKTtcbiAgICBjb25zdCBnYVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGF4aW9zXG4gICAgICAgIC5wb3N0KGxicnlBcGlVcmksIHtcbiAgICAgICAgICBtZXRob2Q6ICdwdWJsaXNoJyxcbiAgICAgICAgICBwYXJhbXM6IHB1Ymxpc2hQYXJhbXMsXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBzZW5kR0FUaW1pbmdFdmVudCgnbGJyeW5ldCcsICdwdWJsaXNoJywgY2hvb3NlR2FMYnJ5bmV0UHVibGlzaExhYmVsKHB1Ymxpc2hQYXJhbXMpLCBnYVN0YXJ0VGltZSwgRGF0ZS5ub3coKSk7XG4gICAgICAgICAgaGFuZGxlTGJyeW5ldFJlc3BvbnNlKHJlc3BvbnNlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBnZXRDbGFpbSAodXJpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBsYnJ5QXBpID4+IEdldHRpbmcgQ2xhaW0gZm9yIFwiJHt1cml9XCJgKTtcbiAgICBjb25zdCBnYVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGF4aW9zXG4gICAgICAgIC5wb3N0KGxicnlBcGlVcmksIHtcbiAgICAgICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgICAgIHBhcmFtczogeyB1cmksIHRpbWVvdXQ6IDIwIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBzZW5kR0FUaW1pbmdFdmVudCgnbGJyeW5ldCcsICdnZXRDbGFpbScsICdHRVQnLCBnYVN0YXJ0VGltZSwgRGF0ZS5ub3coKSk7XG4gICAgICAgICAgaGFuZGxlTGJyeW5ldFJlc3BvbnNlKHJlc3BvbnNlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBnZXRDbGFpbUxpc3QgKGNsYWltTmFtZSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgbGJyeUFwaSA+PiBHZXR0aW5nIGNsYWltX2xpc3QgZm9yIFwiJHtjbGFpbU5hbWV9XCJgKTtcbiAgICBjb25zdCBnYVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGF4aW9zXG4gICAgICAgIC5wb3N0KGxicnlBcGlVcmksIHtcbiAgICAgICAgICBtZXRob2Q6ICdjbGFpbV9saXN0JyxcbiAgICAgICAgICBwYXJhbXM6IHsgbmFtZTogY2xhaW1OYW1lIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBzZW5kR0FUaW1pbmdFdmVudCgnbGJyeW5ldCcsICdnZXRDbGFpbUxpc3QnLCAnQ0xBSU1fTElTVCcsIGdhU3RhcnRUaW1lLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICBoYW5kbGVMYnJ5bmV0UmVzcG9uc2UocmVzcG9uc2UsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIHJlc29sdmVVcmkgKHVyaSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgbGJyeUFwaSA+PiBSZXNvbHZpbmcgVVJJIGZvciBcIiR7dXJpfVwiYCk7XG4gICAgY29uc3QgZ2FTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBheGlvc1xuICAgICAgICAucG9zdChsYnJ5QXBpVXJpLCB7XG4gICAgICAgICAgbWV0aG9kOiAncmVzb2x2ZScsXG4gICAgICAgICAgcGFyYW1zOiB7IHVyaSB9LFxuICAgICAgICB9KVxuICAgICAgICAudGhlbigoeyBkYXRhIH0pID0+IHtcbiAgICAgICAgICBzZW5kR0FUaW1pbmdFdmVudCgnbGJyeW5ldCcsICdyZXNvbHZlVXJpJywgJ1JFU09MVkUnLCBnYVN0YXJ0VGltZSwgRGF0ZS5ub3coKSk7XG4gICAgICAgICAgaWYgKGRhdGEucmVzdWx0W3VyaV0uZXJyb3IpIHsgIC8vIGNoZWNrIGZvciBlcnJvcnNcbiAgICAgICAgICAgIHJlamVjdChkYXRhLnJlc3VsdFt1cmldLmVycm9yKTtcbiAgICAgICAgICB9IGVsc2UgeyAgLy8gaWYgbm8gZXJyb3JzLCByZXNvbHZlXG4gICAgICAgICAgICByZXNvbHZlKGRhdGEucmVzdWx0W3VyaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgZ2V0RG93bmxvYWREaXJlY3RvcnkgKCkge1xuICAgIGxvZ2dlci5kZWJ1ZygnbGJyeUFwaSA+PiBSZXRyaWV2aW5nIHRoZSBkb3dubG9hZCBkaXJlY3RvcnkgcGF0aCBmcm9tIGxicnkgZGFlbW9uLi4uJyk7XG4gICAgY29uc3QgZ2FTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBheGlvc1xuICAgICAgICAucG9zdChsYnJ5QXBpVXJpLCB7XG4gICAgICAgICAgbWV0aG9kOiAnc2V0dGluZ3NfZ2V0JyxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgc2VuZEdBVGltaW5nRXZlbnQoJ2xicnluZXQnLCAnZ2V0RG93bmxvYWREaXJlY3RvcnknLCAnU0VUVElOR1NfR0VUJywgZ2FTdGFydFRpbWUsIERhdGUubm93KCkpO1xuICAgICAgICAgIGlmIChkYXRhLnJlc3VsdCkge1xuICAgICAgICAgICAgcmVzb2x2ZShkYXRhLnJlc3VsdC5kb3dubG9hZF9kaXJlY3RvcnkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdTdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIGxicnkgZGFlbW9uLCBidXQgdW5hYmxlIHRvIHJldHJpZXZlIHRoZSBkb3dubG9hZCBkaXJlY3RvcnkuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignTGJyeW5ldCBFcnJvcjonLCBlcnJvcik7XG4gICAgICAgICAgcmVzb2x2ZSgnL2hvbWUvbGJyeS9Eb3dubG9hZHMvJyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBjcmVhdGVDaGFubmVsIChuYW1lKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBsYnJ5QXBpID4+IENyZWF0aW5nIGNoYW5uZWwgZm9yICR7bmFtZX0uLi5gKTtcbiAgICBjb25zdCBnYVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGF4aW9zXG4gICAgICAgIC5wb3N0KGxicnlBcGlVcmksIHtcbiAgICAgICAgICBtZXRob2Q6ICdjaGFubmVsX25ldycsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBjaGFubmVsX25hbWU6IG5hbWUsXG4gICAgICAgICAgICBhbW91bnQgICAgICA6IDAuMSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgc2VuZEdBVGltaW5nRXZlbnQoJ2xicnluZXQnLCAnY3JlYXRlQ2hhbm5lbCcsICdDSEFOTkVMX05FVycsIGdhU3RhcnRUaW1lLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICBoYW5kbGVMYnJ5bmV0UmVzcG9uc2UocmVzcG9uc2UsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL2hlbHBlcnMvbGJyeUFwaS5qcyIsImNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcbmNvbnN0IHVhID0gcmVxdWlyZSgndW5pdmVyc2FsLWFuYWx5dGljcycpO1xuY29uc3QgeyBhbmFseXRpY3MgOiB7IGdvb2dsZUlkIH0sIGRldGFpbHM6IHsgdGl0bGUgfSB9ID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnL3NpdGVDb25maWcuanMnKTtcblxuZnVuY3Rpb24gY3JlYXRlU2VydmVFdmVudFBhcmFtcyAoaGVhZGVycywgaXAsIG9yaWdpbmFsVXJsKSB7XG4gIHJldHVybiB7XG4gICAgZXZlbnRDYXRlZ29yeSAgICA6ICdjbGllbnQgcmVxdWVzdHMnLFxuICAgIGV2ZW50QWN0aW9uICAgICAgOiAnc2VydmUgcmVxdWVzdCcsXG4gICAgZXZlbnRMYWJlbCAgICAgICA6IG9yaWdpbmFsVXJsLFxuICAgIGlwT3ZlcnJpZGUgICAgICAgOiBpcCxcbiAgICB1c2VyQWdlbnRPdmVycmlkZTogaGVhZGVyc1sndXNlci1hZ2VudCddLFxuICB9O1xufTtcblxuZnVuY3Rpb24gY3JlYXRlUHVibGlzaFRpbWluZ0V2ZW50UGFyYW1zIChjYXRlZ29yeSwgdmFyaWFibGUsIGxhYmVsLCBzdGFydFRpbWUsIGVuZFRpbWUpIHtcbiAgY29uc3QgZHVyYXRpb24gPSBlbmRUaW1lIC0gc3RhcnRUaW1lO1xuICByZXR1cm4ge1xuICAgIHVzZXJUaW1pbmdDYXRlZ29yeSAgICA6IGNhdGVnb3J5LFxuICAgIHVzZXJUaW1pbmdWYXJpYWJsZU5hbWU6IHZhcmlhYmxlLFxuICAgIHVzZXJUaW1pbmdUaW1lICAgICAgICA6IGR1cmF0aW9uLFxuICAgIHVzZXJUaW1pbmdMYWJlbCAgICAgICA6IGxhYmVsLFxuICB9O1xufTtcblxuZnVuY3Rpb24gc2VuZEdvb2dsZUFuYWx5dGljc0V2ZW50IChpcCwgcGFyYW1zKSB7XG4gIGNvbnN0IHZpc2l0b3JJZCA9IGlwLnJlcGxhY2UoL1xcLi9nLCAnLScpO1xuICBjb25zdCB2aXNpdG9yID0gdWEoZ29vZ2xlSWQsIHZpc2l0b3JJZCwgeyBzdHJpY3RDaWRGb3JtYXQ6IGZhbHNlLCBodHRwczogdHJ1ZSB9KTtcbiAgdmlzaXRvci5ldmVudChwYXJhbXMsIChlcnIpID0+IHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0dvb2dsZSBBbmFseXRpY3MgRXZlbnQgRXJyb3IgPj4nLCBlcnIpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBzZW5kR29vZ2xlQW5hbHl0aWNzVGltaW5nICh2aXNpdG9ySWQsIHBhcmFtcykge1xuICBjb25zdCB2aXNpdG9yID0gdWEoZ29vZ2xlSWQsIHZpc2l0b3JJZCwgeyBzdHJpY3RDaWRGb3JtYXQ6IGZhbHNlLCBodHRwczogdHJ1ZSB9KTtcbiAgdmlzaXRvci50aW1pbmcocGFyYW1zLCAoZXJyKSA9PiB7XG4gICAgaWYgKGVycikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdHb29nbGUgQW5hbHl0aWNzIEV2ZW50IEVycm9yID4+JywgZXJyKTtcbiAgICB9XG4gICAgbG9nZ2VyLmRlYnVnKGBUaW1pbmcgZXZlbnQgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gZ29vZ2xlIGFuYWx5dGljc2ApO1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZW5kR0FTZXJ2ZUV2ZW50IChoZWFkZXJzLCBpcCwgb3JpZ2luYWxVcmwpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBjcmVhdGVTZXJ2ZUV2ZW50UGFyYW1zKGhlYWRlcnMsIGlwLCBvcmlnaW5hbFVybCk7XG4gICAgc2VuZEdvb2dsZUFuYWx5dGljc0V2ZW50KGlwLCBwYXJhbXMpO1xuICB9LFxuICBzZW5kR0FUaW1pbmdFdmVudCAoY2F0ZWdvcnksIHZhcmlhYmxlLCBsYWJlbCwgc3RhcnRUaW1lLCBlbmRUaW1lKSB7XG4gICAgY29uc3QgcGFyYW1zID0gY3JlYXRlUHVibGlzaFRpbWluZ0V2ZW50UGFyYW1zKGNhdGVnb3J5LCB2YXJpYWJsZSwgbGFiZWwsIHN0YXJ0VGltZSwgZW5kVGltZSk7XG4gICAgc2VuZEdvb2dsZUFuYWx5dGljc1RpbWluZyh0aXRsZSwgcGFyYW1zKTtcbiAgfSxcbiAgY2hvb3NlR2FMYnJ5bmV0UHVibGlzaExhYmVsICh7IGNoYW5uZWxfbmFtZTogY2hhbm5lbE5hbWUsIGNoYW5uZWxfaWQ6IGNoYW5uZWxJZCB9KSB7XG4gICAgcmV0dXJuIChjaGFubmVsTmFtZSB8fCBjaGFubmVsSWQgPyAnUFVCTElTSF9JTl9DSEFOTkVMX0NMQUlNJyA6ICdQVUJMSVNIX0FOT05ZTU9VU19DTEFJTScpO1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9oZWxwZXJzL2dvb2dsZUFuYWx5dGljcy5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlZHV4XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwicmVkdXhcIlxuLy8gbW9kdWxlIGlkID0gMThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiY29uc3QgeyBjb21wb25lbnRzQ29uZmlnIH0gPSByZXF1aXJlKCcuLi8uLi9jb25maWcvc2l0ZUNvbmZpZy5qcycpO1xuXG5mdW5jdGlvbiBnZXREZWVwZXN0Q2hpbGRWYWx1ZSAocGFyZW50LCBjaGlsZHJlbktleXMpIHtcbiAgbGV0IGNoaWxkS2V5ID0gY2hpbGRyZW5LZXlzLnNoaWZ0KCk7IC8vIC5zaGlmdCgpIHJldHJpZXZlcyB0aGUgZmlyc3QgZWxlbWVudCBvZiBhcnJheSBhbmQgcmVtb3ZlcyBpdCBmcm9tIGFycmF5XG4gIGxldCBjaGlsZCA9IHBhcmVudFtjaGlsZEtleV07XG4gIGlmIChjaGlsZHJlbktleXMubGVuZ3RoID49IDEpIHtcbiAgICByZXR1cm4gZ2V0RGVlcGVzdENoaWxkVmFsdWUoY2hpbGQsIGNoaWxkcmVuS2V5cyk7XG4gIH1cbiAgcmV0dXJuIGNoaWxkO1xufVxuXG5leHBvcnQgY29uc3QgZHluYW1pY0ltcG9ydCA9IChmaWxlUGF0aCkgPT4ge1xuICAvLyB2YWxpZGF0ZSBpbnB1dHNcbiAgaWYgKCFmaWxlUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm8gZmlsZSBwYXRoIHByb3ZpZGVkIHRvIGR5bmFtaWNJbXBvcnQoKScpO1xuICB9XG4gIGlmICh0eXBlb2YgZmlsZVBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgY29uc29sZS5sb2coJ2R5bmFtaWNJbXBvcnQgPiBmaWxlUGF0aDonLCBmaWxlUGF0aCk7XG4gICAgY29uc29sZS5sb2coJ2R5bmFtaWNJbXBvcnQgPiBmaWxlUGF0aCB0eXBlOicsIHR5cGVvZiBmaWxlUGF0aCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdmaWxlIHBhdGggcHJvdmlkZWQgdG8gZHluYW1pY0ltcG9ydCgpIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgfVxuICBpZiAoIWNvbXBvbmVudHNDb25maWcpIHtcbiAgICBjb25zb2xlLmxvZygnbm8gY29tcG9uZW50c0NvbmZpZyBmb3VuZCBpbiBzaXRlQ29uZmlnLmpzJyk7XG4gICAgcmV0dXJuIHJlcXVpcmUoYCR7ZmlsZVBhdGh9YCk7XG4gIH1cbiAgLy8gc3BsaXQgb3V0IHRoZSBmaWxlIGZvbGRlcnMgIC8vIGZpbHRlciBvdXQgYW55IGVtcHR5IG9yIHdoaXRlLXNwYWNlLW9ubHkgc3RyaW5nc1xuICBjb25zdCBmb2xkZXJzID0gZmlsZVBhdGguc3BsaXQoJy8nKS5maWx0ZXIoZm9sZGVyTmFtZSA9PiBmb2xkZXJOYW1lLnJlcGxhY2UoL1xccy9nLCAnJykubGVuZ3RoKTtcbiAgLy8gY2hlY2sgZm9yIHRoZSBjb21wb25lbnQgY29ycmVzcG9uZGluZyB0byBmaWxlIHBhdGggaW4gdGhlIHNpdGUgY29uZmlnIG9iamVjdFxuICAvLyBpLmUuIGNvbXBvbmVudHNDb25maWdbZm9sZGVyc1swXV1bZm9sZGVyc1syXVsuLi5dW2ZvbGRlcnNbbl1dXG4gIGNvbnN0IGN1c3RvbUNvbXBvbmVudCA9IGdldERlZXBlc3RDaGlsZFZhbHVlKGNvbXBvbmVudHNDb25maWcsIGZvbGRlcnMpO1xuICBpZiAoY3VzdG9tQ29tcG9uZW50KSB7XG4gICAgcmV0dXJuIGN1c3RvbUNvbXBvbmVudDsgIC8vIHJldHVybiBjdXN0b20gY29tcG9uZW50XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlcXVpcmUoYCR7ZmlsZVBhdGh9YCk7XG4gIH1cbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvdXRpbHMvZHluYW1pY0ltcG9ydC5qcyIsImNvbnN0IGNyZWF0ZUJhc2ljQ2Fub25pY2FsTGluayA9IChwYWdlLCBzaXRlSG9zdCkgPT4ge1xuICByZXR1cm4gYCR7c2l0ZUhvc3R9LyR7cGFnZX1gO1xufTtcblxuY29uc3QgY3JlYXRlQXNzZXRDYW5vbmljYWxMaW5rID0gKGFzc2V0LCBzaXRlSG9zdCkgPT4ge1xuICBsZXQgY2hhbm5lbE5hbWUsIGNlcnRpZmljYXRlSWQsIG5hbWUsIGNsYWltSWQ7XG4gIGlmIChhc3NldC5jbGFpbURhdGEpIHtcbiAgICAoeyBjaGFubmVsTmFtZSwgY2VydGlmaWNhdGVJZCwgbmFtZSwgY2xhaW1JZCB9ID0gYXNzZXQuY2xhaW1EYXRhKTtcbiAgfTtcbiAgaWYgKGNoYW5uZWxOYW1lKSB7XG4gICAgcmV0dXJuIGAke3NpdGVIb3N0fS8ke2NoYW5uZWxOYW1lfToke2NlcnRpZmljYXRlSWR9LyR7bmFtZX1gO1xuICB9O1xuICByZXR1cm4gYCR7c2l0ZUhvc3R9LyR7Y2xhaW1JZH0vJHtuYW1lfWA7XG59O1xuXG5jb25zdCBjcmVhdGVDaGFubmVsQ2Fub25pY2FsTGluayA9IChjaGFubmVsLCBzaXRlSG9zdCkgPT4ge1xuICBjb25zdCB7IG5hbWUsIGxvbmdJZCB9ID0gY2hhbm5lbDtcbiAgcmV0dXJuIGAke3NpdGVIb3N0fS8ke25hbWV9OiR7bG9uZ0lkfWA7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQ2Fub25pY2FsTGluayA9IChhc3NldCwgY2hhbm5lbCwgcGFnZSwgc2l0ZUhvc3QpID0+IHtcbiAgaWYgKGFzc2V0KSB7XG4gICAgcmV0dXJuIGNyZWF0ZUFzc2V0Q2Fub25pY2FsTGluayhhc3NldCwgc2l0ZUhvc3QpO1xuICB9XG4gIGlmIChjaGFubmVsKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNoYW5uZWxDYW5vbmljYWxMaW5rKGNoYW5uZWwsIHNpdGVIb3N0KTtcbiAgfVxuICByZXR1cm4gY3JlYXRlQmFzaWNDYW5vbmljYWxMaW5rKHBhZ2UsIHNpdGVIb3N0KTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvdXRpbHMvY2Fub25pY2FsTGluay5qcyIsIm1vZHVsZS5leHBvcnRzID0ge1xuICBSRUdFWFBfSU5WQUxJRF9DTEFJTSAgOiAvW15BLVphLXowLTktXS9nLFxuICBSRUdFWFBfSU5WQUxJRF9DSEFOTkVMOiAvW15BLVphLXowLTktQF0vZyxcbiAgUkVHRVhQX0FERFJFU1MgICAgICAgIDogL15iKD89W14wT0lsXXszMiwzM30pWzAtOUEtWmEtel17MzIsMzN9JC8sXG4gIENIQU5ORUxfQ0hBUiAgICAgICAgICA6ICdAJyxcbiAgcGFyc2VJZGVudGlmaWVyICAgICAgIDogZnVuY3Rpb24gKGlkZW50aWZpZXIpIHtcbiAgICBjb25zdCBjb21wb25lbnRzUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgJyhbXjokIy9dKiknICsgLy8gdmFsdWUgKHN0b3BzIGF0IHRoZSBmaXJzdCBzZXBhcmF0b3Igb3IgZW5kKVxuICAgICAgJyhbOiQjXT8pKFteL10qKScgLy8gbW9kaWZpZXIgc2VwYXJhdG9yLCBtb2RpZmllciAoc3RvcHMgYXQgdGhlIGZpcnN0IHBhdGggc2VwYXJhdG9yIG9yIGVuZClcbiAgICApO1xuICAgIGNvbnN0IFtwcm90bywgdmFsdWUsIG1vZGlmaWVyU2VwZXJhdG9yLCBtb2RpZmllcl0gPSBjb21wb25lbnRzUmVnZXggIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIC5leGVjKGlkZW50aWZpZXIpXG4gICAgICAubWFwKG1hdGNoID0+IG1hdGNoIHx8IG51bGwpO1xuXG4gICAgLy8gVmFsaWRhdGUgYW5kIHByb2Nlc3MgbmFtZVxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2hlY2sgeW91ciBVUkwuICBObyBjaGFubmVsIG5hbWUgcHJvdmlkZWQgYmVmb3JlIFwiJHttb2RpZmllclNlcGVyYXRvcn1cImApO1xuICAgIH1cbiAgICBjb25zdCBpc0NoYW5uZWwgPSB2YWx1ZS5zdGFydHNXaXRoKG1vZHVsZS5leHBvcnRzLkNIQU5ORUxfQ0hBUik7XG4gICAgY29uc3QgY2hhbm5lbE5hbWUgPSBpc0NoYW5uZWwgPyB2YWx1ZSA6IG51bGw7XG4gICAgbGV0IGNsYWltSWQ7XG4gICAgaWYgKGlzQ2hhbm5lbCkge1xuICAgICAgaWYgKCFjaGFubmVsTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoZWNrIHlvdXIgVVJMLiAgTm8gY2hhbm5lbCBuYW1lIGFmdGVyIFwiQFwiLicpO1xuICAgICAgfVxuICAgICAgY29uc3QgbmFtZUJhZENoYXJzID0gKGNoYW5uZWxOYW1lKS5tYXRjaChtb2R1bGUuZXhwb3J0cy5SRUdFWFBfSU5WQUxJRF9DSEFOTkVMKTtcbiAgICAgIGlmIChuYW1lQmFkQ2hhcnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaGVjayB5b3VyIFVSTC4gIEludmFsaWQgY2hhcmFjdGVycyBpbiBjaGFubmVsIG5hbWU6IFwiJHtuYW1lQmFkQ2hhcnMuam9pbignLCAnKX1cIi5gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY2xhaW1JZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGFuZCBwcm9jZXNzIG1vZGlmaWVyXG4gICAgbGV0IGNoYW5uZWxDbGFpbUlkO1xuICAgIGlmIChtb2RpZmllclNlcGVyYXRvcikge1xuICAgICAgaWYgKCFtb2RpZmllcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENoZWNrIHlvdXIgVVJMLiAgTm8gbW9kaWZpZXIgcHJvdmlkZWQgYWZ0ZXIgc2VwYXJhdG9yIFwiJHttb2RpZmllclNlcGVyYXRvcn1cImApO1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kaWZpZXJTZXBlcmF0b3IgPT09ICc6Jykge1xuICAgICAgICBjaGFubmVsQ2xhaW1JZCA9IG1vZGlmaWVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaGVjayB5b3VyIFVSTC4gIFRoZSBcIiR7bW9kaWZpZXJTZXBlcmF0b3J9XCIgbW9kaWZpZXIgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWRgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzQ2hhbm5lbCxcbiAgICAgIGNoYW5uZWxOYW1lLFxuICAgICAgY2hhbm5lbENsYWltSWQ6IGNoYW5uZWxDbGFpbUlkIHx8IG51bGwsXG4gICAgICBjbGFpbUlkICAgICAgIDogY2xhaW1JZCB8fCBudWxsLFxuICAgIH07XG4gIH0sXG4gIHBhcnNlQ2xhaW06IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgY29uc3QgY29tcG9uZW50c1JlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICcoW146JCMvLl0qKScgKyAvLyBuYW1lIChzdG9wcyBhdCB0aGUgZmlyc3QgZXh0ZW5zaW9uKVxuICAgICAgJyhbOiQjLl0/KShbXi9dKiknIC8vIGV4dGVuc2lvbiBzZXBhcmF0b3IsIGV4dGVuc2lvbiAoc3RvcHMgYXQgdGhlIGZpcnN0IHBhdGggc2VwYXJhdG9yIG9yIGVuZClcbiAgICApO1xuICAgIGNvbnN0IFtwcm90bywgY2xhaW1OYW1lLCBleHRlbnNpb25TZXBlcmF0b3IsIGV4dGVuc2lvbl0gPSBjb21wb25lbnRzUmVnZXggLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgLmV4ZWMobmFtZSlcbiAgICAgIC5tYXAobWF0Y2ggPT4gbWF0Y2ggfHwgbnVsbCk7XG5cbiAgICAvLyBWYWxpZGF0ZSBhbmQgcHJvY2VzcyBuYW1lXG4gICAgaWYgKCFjbGFpbU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2hlY2sgeW91ciBVUkwuICBObyBjbGFpbSBuYW1lIHByb3ZpZGVkIGJlZm9yZSBcIi5cIicpO1xuICAgIH1cbiAgICBjb25zdCBuYW1lQmFkQ2hhcnMgPSAoY2xhaW1OYW1lKS5tYXRjaChtb2R1bGUuZXhwb3J0cy5SRUdFWFBfSU5WQUxJRF9DTEFJTSk7XG4gICAgaWYgKG5hbWVCYWRDaGFycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaGVjayB5b3VyIFVSTC4gIEludmFsaWQgY2hhcmFjdGVycyBpbiBjbGFpbSBuYW1lOiBcIiR7bmFtZUJhZENoYXJzLmpvaW4oJywgJyl9XCIuYCk7XG4gICAgfVxuICAgIC8vIFZhbGlkYXRlIGFuZCBwcm9jZXNzIGV4dGVuc2lvblxuICAgIGlmIChleHRlbnNpb25TZXBlcmF0b3IpIHtcbiAgICAgIGlmICghZXh0ZW5zaW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2hlY2sgeW91ciBVUkwuICBObyBmaWxlIGV4dGVuc2lvbiBwcm92aWRlZCBhZnRlciBzZXBhcmF0b3IgXCIke2V4dGVuc2lvblNlcGVyYXRvcn1cIi5gKTtcbiAgICAgIH1cbiAgICAgIGlmIChleHRlbnNpb25TZXBlcmF0b3IgIT09ICcuJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENoZWNrIHlvdXIgVVJMLiAgVGhlIFwiJHtleHRlbnNpb25TZXBlcmF0b3J9XCIgc2VwYXJhdG9yIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGNsYWltIG5hbWUuYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjbGFpbU5hbWUsXG4gICAgICBleHRlbnNpb246IGV4dGVuc2lvbiB8fCBudWxsLFxuICAgIH07XG4gIH0sXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3V0aWxzL2xicnlVcmkuanMiLCJjb25zdCBkZXRlcm1pbmVPZ1RodW1ibmFpbENvbnRlbnRUeXBlID0gKHRodW1ibmFpbCkgPT4ge1xuICBpZiAodGh1bWJuYWlsKSB7XG4gICAgY29uc3QgZmlsZUV4dCA9IHRodW1ibmFpbC5zdWJzdHJpbmcodGh1bWJuYWlsLmxhc3RJbmRleE9mKCcuJykpO1xuICAgIHN3aXRjaCAoZmlsZUV4dCkge1xuICAgICAgY2FzZSAnanBlZyc6XG4gICAgICBjYXNlICdqcGcnOlxuICAgICAgICByZXR1cm4gJ2ltYWdlL2pwZWcnO1xuICAgICAgY2FzZSAncG5nJzpcbiAgICAgICAgcmV0dXJuICdpbWFnZS9wbmcnO1xuICAgICAgY2FzZSAnZ2lmJzpcbiAgICAgICAgcmV0dXJuICdpbWFnZS9naWYnO1xuICAgICAgY2FzZSAnbXA0JzpcbiAgICAgICAgcmV0dXJuICd2aWRlby9tcDQnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdpbWFnZS9qcGVnJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufTtcblxuY29uc3QgY3JlYXRlQmFzaWNNZXRhVGFncyA9IChzaXRlSG9zdCwgc2l0ZURlc2NyaXB0aW9uLCBzaXRlVGl0bGUsIHNpdGVUd2l0dGVyKSA9PiB7XG4gIHJldHVybiBbXG4gICAge3Byb3BlcnR5OiAnb2c6dGl0bGUnLCBjb250ZW50OiBzaXRlVGl0bGV9LFxuICAgIHtwcm9wZXJ0eTogJ29nOnVybCcsIGNvbnRlbnQ6IHNpdGVIb3N0fSxcbiAgICB7cHJvcGVydHk6ICdvZzpzaXRlX25hbWUnLCBjb250ZW50OiBzaXRlVGl0bGV9LFxuICAgIHtwcm9wZXJ0eTogJ29nOmRlc2NyaXB0aW9uJywgY29udGVudDogc2l0ZURlc2NyaXB0aW9ufSxcbiAgICB7cHJvcGVydHk6ICd0d2l0dGVyOnNpdGUnLCBjb250ZW50OiBzaXRlVHdpdHRlcn0sXG4gICAge3Byb3BlcnR5OiAndHdpdHRlcjpjYXJkJywgY29udGVudDogJ3N1bW1hcnknfSxcbiAgXTtcbn07XG5cbmNvbnN0IGNyZWF0ZUNoYW5uZWxNZXRhVGFncyA9IChzaXRlVGl0bGUsIHNpdGVIb3N0LCBzaXRlVHdpdHRlciwgY2hhbm5lbCkgPT4ge1xuICBjb25zdCB7IG5hbWUsIGxvbmdJZCB9ID0gY2hhbm5lbDtcbiAgcmV0dXJuIFtcbiAgICB7cHJvcGVydHk6ICdvZzp0aXRsZScsIGNvbnRlbnQ6IGAke25hbWV9IG9uICR7c2l0ZVRpdGxlfWB9LFxuICAgIHtwcm9wZXJ0eTogJ29nOnVybCcsIGNvbnRlbnQ6IGAke3NpdGVIb3N0fS8ke25hbWV9OiR7bG9uZ0lkfWB9LFxuICAgIHtwcm9wZXJ0eTogJ29nOnNpdGVfbmFtZScsIGNvbnRlbnQ6IHNpdGVUaXRsZX0sXG4gICAge3Byb3BlcnR5OiAnb2c6ZGVzY3JpcHRpb24nLCBjb250ZW50OiBgJHtuYW1lfSwgYSBjaGFubmVsIG9uICR7c2l0ZVRpdGxlfWB9LFxuICAgIHtwcm9wZXJ0eTogJ3R3aXR0ZXI6c2l0ZScsIGNvbnRlbnQ6IHNpdGVUd2l0dGVyfSxcbiAgICB7cHJvcGVydHk6ICd0d2l0dGVyOmNhcmQnLCBjb250ZW50OiAnc3VtbWFyeSd9LFxuICBdO1xufTtcblxuY29uc3QgY3JlYXRlQXNzZXRNZXRhVGFncyA9IChzaXRlSG9zdCwgc2l0ZVRpdGxlLCBzaXRlVHdpdHRlciwgYXNzZXQsIGRlZmF1bHREZXNjcmlwdGlvbiwgZGVmYXVsdFRodW1ibmFpbCkgPT4ge1xuICBjb25zdCB7IGNsYWltRGF0YSB9ID0gYXNzZXQ7XG4gIGNvbnN0IHsgY29udGVudFR5cGUgfSA9IGNsYWltRGF0YTtcbiAgY29uc3QgZW1iZWRVcmwgPSBgJHtzaXRlSG9zdH0vJHtjbGFpbURhdGEuY2xhaW1JZH0vJHtjbGFpbURhdGEubmFtZX1gO1xuICBjb25zdCBzaG93VXJsID0gYCR7c2l0ZUhvc3R9LyR7Y2xhaW1EYXRhLmNsYWltSWR9LyR7Y2xhaW1EYXRhLm5hbWV9YDtcbiAgY29uc3Qgc291cmNlID0gYCR7c2l0ZUhvc3R9LyR7Y2xhaW1EYXRhLmNsYWltSWR9LyR7Y2xhaW1EYXRhLm5hbWV9LiR7Y2xhaW1EYXRhLmZpbGVFeHR9YDtcbiAgY29uc3Qgb2dUaXRsZSA9IGNsYWltRGF0YS50aXRsZSB8fCBjbGFpbURhdGEubmFtZTtcbiAgY29uc3Qgb2dEZXNjcmlwdGlvbiA9IGNsYWltRGF0YS5kZXNjcmlwdGlvbiB8fCBkZWZhdWx0RGVzY3JpcHRpb247XG4gIGNvbnN0IG9nVGh1bWJuYWlsQ29udGVudFR5cGUgPSBkZXRlcm1pbmVPZ1RodW1ibmFpbENvbnRlbnRUeXBlKGNsYWltRGF0YS50aHVtYm5haWwpO1xuICBjb25zdCBvZ1RodW1ibmFpbCA9IGNsYWltRGF0YS50aHVtYm5haWwgfHwgZGVmYXVsdFRodW1ibmFpbDtcbiAgY29uc3QgbWV0YVRhZ3MgPSBbXG4gICAge3Byb3BlcnR5OiAnb2c6dGl0bGUnLCBjb250ZW50OiBvZ1RpdGxlfSxcbiAgICB7cHJvcGVydHk6ICdvZzp1cmwnLCBjb250ZW50OiBzaG93VXJsfSxcbiAgICB7cHJvcGVydHk6ICdvZzpzaXRlX25hbWUnLCBjb250ZW50OiBzaXRlVGl0bGV9LFxuICAgIHtwcm9wZXJ0eTogJ29nOmRlc2NyaXB0aW9uJywgY29udGVudDogb2dEZXNjcmlwdGlvbn0sXG4gICAge3Byb3BlcnR5OiAnb2c6aW1hZ2U6d2lkdGgnLCBjb250ZW50OiA2MDB9LFxuICAgIHtwcm9wZXJ0eTogJ29nOmltYWdlOmhlaWdodCcsIGNvbnRlbnQ6IDMxNX0sXG4gICAge3Byb3BlcnR5OiAndHdpdHRlcjpzaXRlJywgY29udGVudDogc2l0ZVR3aXR0ZXJ9LFxuICBdO1xuICBpZiAoY29udGVudFR5cGUgPT09ICd2aWRlby9tcDQnIHx8IGNvbnRlbnRUeXBlID09PSAndmlkZW8vd2VibScpIHtcbiAgICBtZXRhVGFncy5wdXNoKHtwcm9wZXJ0eTogJ29nOnZpZGVvJywgY29udGVudDogc291cmNlfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICdvZzp2aWRlbzpzZWN1cmVfdXJsJywgY29udGVudDogc291cmNlfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICdvZzp2aWRlbzp0eXBlJywgY29udGVudDogY29udGVudFR5cGV9KTtcbiAgICBtZXRhVGFncy5wdXNoKHtwcm9wZXJ0eTogJ29nOmltYWdlJywgY29udGVudDogb2dUaHVtYm5haWx9KTtcbiAgICBtZXRhVGFncy5wdXNoKHtwcm9wZXJ0eTogJ29nOmltYWdlOnR5cGUnLCBjb250ZW50OiBvZ1RodW1ibmFpbENvbnRlbnRUeXBlfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICdvZzp0eXBlJywgY29udGVudDogJ3ZpZGVvJ30pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAndHdpdHRlcjpjYXJkJywgY29udGVudDogJ3BsYXllcid9KTtcbiAgICBtZXRhVGFncy5wdXNoKHtwcm9wZXJ0eTogJ3R3aXR0ZXI6cGxheWVyJywgY29udGVudDogZW1iZWRVcmx9KTtcbiAgICBtZXRhVGFncy5wdXNoKHtwcm9wZXJ0eTogJ3R3aXR0ZXI6cGxheWVyOndpZHRoJywgY29udGVudDogNjAwfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICd0d2l0dGVyOnRleHQ6cGxheWVyX3dpZHRoJywgY29udGVudDogNjAwfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICd0d2l0dGVyOnBsYXllcjpoZWlnaHQnLCBjb250ZW50OiAzMzd9KTtcbiAgICBtZXRhVGFncy5wdXNoKHtwcm9wZXJ0eTogJ3R3aXR0ZXI6cGxheWVyOnN0cmVhbScsIGNvbnRlbnQ6IHNvdXJjZX0pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAndHdpdHRlcjpwbGF5ZXI6c3RyZWFtOmNvbnRlbnRfdHlwZScsIGNvbnRlbnQ6IGNvbnRlbnRUeXBlfSk7XG4gIH0gZWxzZSB7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICdvZzppbWFnZScsIGNvbnRlbnQ6IHNvdXJjZX0pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAnb2c6aW1hZ2U6dHlwZScsIGNvbnRlbnQ6IGNvbnRlbnRUeXBlfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICdvZzp0eXBlJywgY29udGVudDogJ2FydGljbGUnfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICd0d2l0dGVyOmNhcmQnLCBjb250ZW50OiAnc3VtbWFyeV9sYXJnZV9pbWFnZSd9KTtcbiAgfVxuICByZXR1cm4gbWV0YVRhZ3M7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTWV0YVRhZ3MgPSAoc2l0ZURlc2NyaXB0aW9uLCBzaXRlSG9zdCwgc2l0ZVRpdGxlLCBzaXRlVHdpdHRlciwgYXNzZXQsIGNoYW5uZWwsIGRlZmF1bHREZXNjcmlwdGlvbiwgZGVmYXVsdFRodW1ibmFpbCkgPT4ge1xuICBpZiAoYXNzZXQpIHtcbiAgICByZXR1cm4gY3JlYXRlQXNzZXRNZXRhVGFncyhzaXRlSG9zdCwgc2l0ZVRpdGxlLCBzaXRlVHdpdHRlciwgYXNzZXQsIGRlZmF1bHREZXNjcmlwdGlvbiwgZGVmYXVsdFRodW1ibmFpbCk7XG4gIH07XG4gIGlmIChjaGFubmVsKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNoYW5uZWxNZXRhVGFncyhzaXRlSG9zdCwgc2l0ZVRpdGxlLCBzaXRlVHdpdHRlciwgY2hhbm5lbCk7XG4gIH07XG4gIHJldHVybiBjcmVhdGVCYXNpY01ldGFUYWdzKHNpdGVEZXNjcmlwdGlvbiwgc2l0ZUhvc3QsIHNpdGVUaXRsZSwgc2l0ZVR3aXR0ZXIpO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC91dGlscy9tZXRhVGFncy5qcyIsImV4cG9ydCBjb25zdCBjcmVhdGVQYWdlVGl0bGUgPSAoc2l0ZVRpdGxlLCBwYWdlVGl0bGUpID0+IHtcbiAgaWYgKCFwYWdlVGl0bGUpIHtcbiAgICByZXR1cm4gYCR7c2l0ZVRpdGxlfWA7XG4gIH1cbiAgcmV0dXJuIGAke3NpdGVUaXRsZX0gLSAke3BhZ2VUaXRsZX1gO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC91dGlscy9wYWdlVGl0bGUuanMiLCJpbXBvcnQgKiBhcyBhY3Rpb25zIGZyb20gJ2NvbnN0YW50cy9jaGFubmVsX2FjdGlvbl90eXBlcyc7XG5cbi8vIGV4cG9ydCBhY3Rpb24gY3JlYXRvcnNcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxvZ2dlZEluQ2hhbm5lbCAobmFtZSwgc2hvcnRJZCwgbG9uZ0lkKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5DSEFOTkVMX1VQREFURSxcbiAgICBkYXRhOiB7XG4gICAgICBuYW1lLFxuICAgICAgc2hvcnRJZCxcbiAgICAgIGxvbmdJZCxcbiAgICB9LFxuICB9O1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9hY3Rpb25zL2NoYW5uZWwuanMiLCJpbXBvcnQgKiBhcyBhY3Rpb25zIGZyb20gJ2NvbnN0YW50cy9wdWJsaXNoX2FjdGlvbl90eXBlcyc7XG5cbi8vIGV4cG9ydCBhY3Rpb24gY3JlYXRvcnNcbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RGaWxlIChmaWxlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5GSUxFX1NFTEVDVEVELFxuICAgIGRhdGE6IGZpbGUsXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJGaWxlICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkZJTEVfQ0xFQVIsXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTWV0YWRhdGEgKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5NRVRBREFUQV9VUERBVEUsXG4gICAgZGF0YToge1xuICAgICAgbmFtZSxcbiAgICAgIHZhbHVlLFxuICAgIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQ2xhaW0gKHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5DTEFJTV9VUERBVEUsXG4gICAgZGF0YTogdmFsdWUsXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0UHVibGlzaEluQ2hhbm5lbCAoY2hhbm5lbCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuU0VUX1BVQkxJU0hfSU5fQ0hBTk5FTCxcbiAgICBjaGFubmVsLFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVB1Ymxpc2hTdGF0dXMgKHN0YXR1cywgbWVzc2FnZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuUFVCTElTSF9TVEFUVVNfVVBEQVRFLFxuICAgIGRhdGE6IHtcbiAgICAgIHN0YXR1cyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVFcnJvciAobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkVSUk9SX1VQREFURSxcbiAgICBkYXRhOiB7XG4gICAgICBuYW1lLFxuICAgICAgdmFsdWUsXG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTZWxlY3RlZENoYW5uZWwgKGNoYW5uZWxOYW1lKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5TRUxFQ1RFRF9DSEFOTkVMX1VQREFURSxcbiAgICBkYXRhOiBjaGFubmVsTmFtZSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB0b2dnbGVNZXRhZGF0YUlucHV0cyAoc2hvd01ldGFkYXRhSW5wdXRzKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5UT0dHTEVfTUVUQURBVEFfSU5QVVRTLFxuICAgIGRhdGE6IHNob3dNZXRhZGF0YUlucHV0cyxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvbk5ld1RodW1ibmFpbCAoZmlsZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuVEhVTUJOQUlMX05FVyxcbiAgICBkYXRhOiBmaWxlLFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0UHVibGlzaCAoaGlzdG9yeSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuUFVCTElTSF9TVEFSVCxcbiAgICBkYXRhOiB7IGhpc3RvcnkgfSxcbiAgfTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9hY3Rpb25zL3B1Ymxpc2guanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwicHJvcC10eXBlc1wiXG4vLyBtb2R1bGUgaWQgPSAyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBOYXZCYXIgZnJvbSAnY29udGFpbmVycy9OYXZCYXInO1xuXG5jbGFzcyBFcnJvclBhZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgZXJyb3IgfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIDxOYXZCYXIgLz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCc+XG4gICAgICAgICAgPHA+e2Vycm9yfTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5FcnJvclBhZ2UucHJvcFR5cGVzID0ge1xuICBlcnJvcjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgRXJyb3JQYWdlO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3BhZ2VzL0Vycm9yUGFnZS9pbmRleC5qc3giLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJwYXNzcG9ydFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInBhc3Nwb3J0XCJcbi8vIG1vZHVsZSBpZCA9IDI4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImZ1bmN0aW9uIE15c3FsQ29uZmlnICgpIHtcbiAgdGhpcy5kYXRhYmFzZSA9ICdkZWZhdWx0JztcbiAgdGhpcy51c2VybmFtZSA9ICdkZWZhdWx0JztcbiAgdGhpcy5wYXNzd29yZCA9ICdkZWZhdWx0JztcbiAgdGhpcy5jb25maWd1cmUgPSAoY29uZmlnKSA9PiB7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmxvZygnTm8gTXlTUUwgY29uZmlnIHJlY2VpdmVkLicpO1xuICAgIH1cbiAgICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJuYW1lLCBwYXNzd29yZH0gPSBjb25maWc7XG4gICAgdGhpcy5kYXRhYmFzZSA9IGRhdGFiYXNlO1xuICAgIHRoaXMudXNlcm5hbWUgPSB1c2VybmFtZTtcbiAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBNeXNxbENvbmZpZygpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY29uZmlnL215c3FsQ29uZmlnLmpzIiwiZnVuY3Rpb24gU2xhY2tDb25maWcgKCkge1xuICB0aGlzLnNsYWNrV2ViSG9vayAgICAgID0gJ2RlZmF1bHQnO1xuICB0aGlzLnNsYWNrRXJyb3JDaGFubmVsID0gJ2RlZmF1bHQnO1xuICB0aGlzLnNsYWNrSW5mb0NoYW5uZWwgID0gJ2RlZmF1bHQnO1xuICB0aGlzLmNvbmZpZ3VyZSA9IChjb25maWcpID0+IHtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKCdObyBzbGFjayBjb25maWcgcmVjZWl2ZWQuJyk7XG4gICAgfVxuICAgIGNvbnN0IHtzbGFja1dlYkhvb2ssIHNsYWNrRXJyb3JDaGFubmVsLCBzbGFja0luZm9DaGFubmVsfSA9IGNvbmZpZztcbiAgICB0aGlzLnNsYWNrV2ViSG9vayA9IHNsYWNrV2ViSG9vaztcbiAgICB0aGlzLnNsYWNrRXJyb3JDaGFubmVsID0gc2xhY2tFcnJvckNoYW5uZWw7XG4gICAgdGhpcy5zbGFja0luZm9DaGFubmVsID0gc2xhY2tJbmZvQ2hhbm5lbDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFNsYWNrQ29uZmlnKCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jb25maWcvc2xhY2tDb25maWcuanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJwYXNzcG9ydC1sb2NhbFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInBhc3Nwb3J0LWxvY2FsXCJcbi8vIG1vZHVsZSBpZCA9IDMxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInNlcXVlbGl6ZVwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInNlcXVlbGl6ZVwiXG4vLyBtb2R1bGUgaWQgPSAzMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgcmV0dXJuU2hvcnRJZDogZnVuY3Rpb24gKGNsYWltc0FycmF5LCBsb25nSWQpIHtcbiAgICBsZXQgY2xhaW1JbmRleDtcbiAgICBsZXQgc2hvcnRJZCA9IGxvbmdJZC5zdWJzdHJpbmcoMCwgMSk7IC8vIGRlZmF1bHQgc2hvcnQgaWQgaXMgdGhlIGZpcnN0IGxldHRlclxuICAgIGxldCBzaG9ydElkTGVuZ3RoID0gMDtcbiAgICAvLyBmaW5kIHRoZSBpbmRleCBvZiB0aGlzIGNsYWltIGlkXG4gICAgY2xhaW1JbmRleCA9IGNsYWltc0FycmF5LmZpbmRJbmRleChlbGVtZW50ID0+IHtcbiAgICAgIHJldHVybiBlbGVtZW50LmNsYWltSWQgPT09IGxvbmdJZDtcbiAgICB9KTtcbiAgICBpZiAoY2xhaW1JbmRleCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2xhaW0gaWQgbm90IGZvdW5kIGluIGNsYWltcyBsaXN0Jyk7XG4gICAgfVxuICAgIC8vIGdldCBhbiBhcnJheSBvZiBhbGwgY2xhaW1zIHdpdGggbG93ZXIgaGVpZ2h0XG4gICAgbGV0IHBvc3NpYmxlTWF0Y2hlcyA9IGNsYWltc0FycmF5LnNsaWNlKDAsIGNsYWltSW5kZXgpO1xuICAgIC8vIHJlbW92ZSBjZXJ0aWZpY2F0ZXMgd2l0aCB0aGUgc2FtZSBwcmVmaXhlcyB1bnRpbCBub25lIGFyZSBsZWZ0LlxuICAgIHdoaWxlIChwb3NzaWJsZU1hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgc2hvcnRJZExlbmd0aCArPSAxO1xuICAgICAgc2hvcnRJZCA9IGxvbmdJZC5zdWJzdHJpbmcoMCwgc2hvcnRJZExlbmd0aCk7XG4gICAgICBwb3NzaWJsZU1hdGNoZXMgPSBwb3NzaWJsZU1hdGNoZXMuZmlsdGVyKGVsZW1lbnQgPT4ge1xuICAgICAgICByZXR1cm4gKGVsZW1lbnQuY2xhaW1JZCAmJiAoZWxlbWVudC5jbGFpbUlkLnN1YnN0cmluZygwLCBzaG9ydElkTGVuZ3RoKSA9PT0gc2hvcnRJZCkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzaG9ydElkO1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9oZWxwZXJzL3NlcXVlbGl6ZUhlbHBlcnMuanMiLCJjb25zdCBsb2dnZXIgPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5cbmNvbnN0IHsgZGV0YWlscywgcHVibGlzaGluZyB9ID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnL3NpdGVDb25maWcuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBhcnNlUHVibGlzaEFwaVJlcXVlc3RCb2R5ICh7bmFtZSwgbnNmdywgbGljZW5zZSwgdGl0bGUsIGRlc2NyaXB0aW9uLCB0aHVtYm5haWx9KSB7XG4gICAgLy8gdmFsaWRhdGUgbmFtZVxuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBuYW1lIGZpZWxkIGZvdW5kIGluIHJlcXVlc3QnKTtcbiAgICB9XG4gICAgY29uc3QgaW52YWxpZE5hbWVDaGFyYWN0ZXJzID0gL1teQS1aYS16MC05LC1dLy5leGVjKG5hbWUpO1xuICAgIGlmIChpbnZhbGlkTmFtZUNoYXJhY3RlcnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNsYWltIG5hbWUgeW91IHByb3ZpZGVkIGlzIG5vdCBhbGxvd2VkLiAgT25seSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgYXJlIGFsbG93ZWQ6IEEtWiwgYS16LCAwLTksIGFuZCBcIi1cIicpO1xuICAgIH1cbiAgICAvLyBvcHRpb25hbCBwYXJhbWV0ZXJzXG4gICAgbnNmdyA9IChuc2Z3ID09PSAndHJ1ZScpO1xuICAgIGxpY2Vuc2UgPSBsaWNlbnNlIHx8IG51bGw7XG4gICAgdGl0bGUgPSB0aXRsZSB8fCBudWxsO1xuICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gfHwgbnVsbDtcbiAgICB0aHVtYm5haWwgPSB0aHVtYm5haWwgfHwgbnVsbDtcbiAgICAvLyByZXR1cm4gcmVzdWx0c1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgbnNmdyxcbiAgICAgIGxpY2Vuc2UsXG4gICAgICB0aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgdGh1bWJuYWlsLFxuICAgIH07XG4gIH0sXG4gIHBhcnNlUHVibGlzaEFwaVJlcXVlc3RGaWxlcyAoe2ZpbGUsIHRodW1ibmFpbH0pIHtcbiAgICAvLyBtYWtlIHN1cmUgYSBmaWxlIHdhcyBwcm92aWRlZFxuICAgIGlmICghZmlsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBmaWxlIHdpdGgga2V5IG9mIFtmaWxlXSBmb3VuZCBpbiByZXF1ZXN0Jyk7XG4gICAgfVxuICAgIGlmICghZmlsZS5wYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGZpbGUgcGF0aCBmb3VuZCcpO1xuICAgIH1cbiAgICBpZiAoIWZpbGUudHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBmaWxlIHR5cGUgZm91bmQnKTtcbiAgICB9XG4gICAgaWYgKCFmaWxlLnNpemUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gZmlsZSB0eXBlIGZvdW5kJyk7XG4gICAgfVxuICAgIC8vIHZhbGlkYXRlIHRoZSBmaWxlIG5hbWVcbiAgICBpZiAoLycvLnRlc3QoZmlsZS5uYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhcG9zdHJvcGhlcyBhcmUgbm90IGFsbG93ZWQgaW4gdGhlIGZpbGUgbmFtZScpO1xuICAgIH1cbiAgICAvLyB2YWxpZGF0ZSB0aGUgZmlsZVxuICAgIG1vZHVsZS5leHBvcnRzLnZhbGlkYXRlRmlsZVR5cGVBbmRTaXplKGZpbGUpO1xuICAgIC8vIHJldHVybiByZXN1bHRzXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVOYW1lICAgICAgICAgOiBmaWxlLm5hbWUsXG4gICAgICBmaWxlUGF0aCAgICAgICAgIDogZmlsZS5wYXRoLFxuICAgICAgZmlsZVR5cGUgICAgICAgICA6IGZpbGUudHlwZSxcbiAgICAgIHRodW1ibmFpbEZpbGVOYW1lOiAodGh1bWJuYWlsID8gdGh1bWJuYWlsLm5hbWUgOiBudWxsKSxcbiAgICAgIHRodW1ibmFpbEZpbGVQYXRoOiAodGh1bWJuYWlsID8gdGh1bWJuYWlsLnBhdGggOiBudWxsKSxcbiAgICAgIHRodW1ibmFpbEZpbGVUeXBlOiAodGh1bWJuYWlsID8gdGh1bWJuYWlsLnR5cGUgOiBudWxsKSxcbiAgICB9O1xuICB9LFxuICB2YWxpZGF0ZUZpbGVUeXBlQW5kU2l6ZSAoZmlsZSkge1xuICAgIC8vIGNoZWNrIGZpbGUgdHlwZSBhbmQgc2l6ZVxuICAgIHN3aXRjaCAoZmlsZS50eXBlKSB7XG4gICAgICBjYXNlICdpbWFnZS9qcGVnJzpcbiAgICAgIGNhc2UgJ2ltYWdlL2pwZyc6XG4gICAgICBjYXNlICdpbWFnZS9wbmcnOlxuICAgICAgICBpZiAoZmlsZS5zaXplID4gMTAwMDAwMDApIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ3B1Ymxpc2ggPiBmaWxlIHZhbGlkYXRpb24gPiAuanBlZy8uanBnLy5wbmcgd2FzIHRvbyBiaWcnKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvcnJ5LCBpbWFnZXMgYXJlIGxpbWl0ZWQgdG8gMTAgbWVnYWJ5dGVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaW1hZ2UvZ2lmJzpcbiAgICAgICAgaWYgKGZpbGUuc2l6ZSA+IDUwMDAwMDAwKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdwdWJsaXNoID4gZmlsZSB2YWxpZGF0aW9uID4gLmdpZiB3YXMgdG9vIGJpZycpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU29ycnksIC5naWZzIGFyZSBsaW1pdGVkIHRvIDUwIG1lZ2FieXRlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3ZpZGVvL21wNCc6XG4gICAgICAgIGlmIChmaWxlLnNpemUgPiA1MDAwMDAwMCkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygncHVibGlzaCA+IGZpbGUgdmFsaWRhdGlvbiA+IC5tcDQgd2FzIHRvbyBiaWcnKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvcnJ5LCB2aWRlb3MgYXJlIGxpbWl0ZWQgdG8gNTAgbWVnYWJ5dGVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdwdWJsaXNoID4gZmlsZSB2YWxpZGF0aW9uID4gdW5yZWNvZ25pemVkIGZpbGUgdHlwZScpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSAnICsgZmlsZS50eXBlICsgJyBjb250ZW50IHR5cGUgaXMgbm90IHN1cHBvcnRlZC4gIE9ubHksIC5qcGVnLCAucG5nLCAuZ2lmLCBhbmQgLm1wNCBmaWxlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGU7XG4gIH0sXG4gIGNyZWF0ZUJhc2ljUHVibGlzaFBhcmFtcyAoZmlsZVBhdGgsIG5hbWUsIHRpdGxlLCBkZXNjcmlwdGlvbiwgbGljZW5zZSwgbnNmdywgdGh1bWJuYWlsKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBDcmVhdGluZyBQdWJsaXNoIFBhcmFtZXRlcnNgKTtcbiAgICAvLyBwcm92aWRlIGRlZmF1bHRzIGZvciB0aXRsZVxuICAgIGlmICh0aXRsZSA9PT0gbnVsbCB8fCB0aXRsZS50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aXRsZSA9IG5hbWU7XG4gICAgfVxuICAgIC8vIHByb3ZpZGUgZGVmYXVsdCBmb3IgZGVzY3JpcHRpb25cbiAgICBpZiAoZGVzY3JpcHRpb24gPT09IG51bGwgfHwgZGVzY3JpcHRpb24udHJpbSgpID09PSAnJykge1xuICAgICAgZGVzY3JpcHRpb24gPSAnJztcbiAgICB9XG4gICAgLy8gcHJvdmlkZSBkZWZhdWx0IGZvciBsaWNlbnNlXG4gICAgaWYgKGxpY2Vuc2UgPT09IG51bGwgfHwgbGljZW5zZS50cmltKCkgPT09ICcnKSB7XG4gICAgICBsaWNlbnNlID0gJyAnOyAgLy8gZGVmYXVsdCB0byBlbXB0eSBzdHJpbmdcbiAgICB9XG4gICAgLy8gY3JlYXRlIHRoZSBwdWJsaXNoIHBhcmFtc1xuICAgIGNvbnN0IHB1Ymxpc2hQYXJhbXMgPSB7XG4gICAgICBuYW1lLFxuICAgICAgZmlsZV9wYXRoOiBmaWxlUGF0aCxcbiAgICAgIGJpZCAgICAgIDogMC4wMSxcbiAgICAgIG1ldGFkYXRhIDoge1xuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGF1dGhvciAgOiBkZXRhaWxzLnRpdGxlLFxuICAgICAgICBsYW5ndWFnZTogJ2VuJyxcbiAgICAgICAgbGljZW5zZSxcbiAgICAgICAgbnNmdyxcbiAgICAgIH0sXG4gICAgICBjbGFpbV9hZGRyZXNzOiBwdWJsaXNoaW5nLnByaW1hcnlDbGFpbUFkZHJlc3MsXG4gICAgfTtcbiAgICAvLyBhZGQgdGh1bWJuYWlsIHRvIGNoYW5uZWwgaWYgdmlkZW9cbiAgICBpZiAodGh1bWJuYWlsKSB7XG4gICAgICBwdWJsaXNoUGFyYW1zWydtZXRhZGF0YSddWyd0aHVtYm5haWwnXSA9IHRodW1ibmFpbDtcbiAgICB9XG4gICAgcmV0dXJuIHB1Ymxpc2hQYXJhbXM7XG4gIH0sXG4gIGNyZWF0ZVRodW1ibmFpbFB1Ymxpc2hQYXJhbXMgKHRodW1ibmFpbEZpbGVQYXRoLCBjbGFpbU5hbWUsIGxpY2Vuc2UsIG5zZncpIHtcbiAgICBpZiAoIXRodW1ibmFpbEZpbGVQYXRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhgQ3JlYXRpbmcgVGh1bWJuYWlsIFB1Ymxpc2ggUGFyYW1ldGVyc2ApO1xuICAgIC8vIGNyZWF0ZSB0aGUgcHVibGlzaCBwYXJhbXNcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSAgICAgOiBgJHtjbGFpbU5hbWV9LXRodW1iYCxcbiAgICAgIGZpbGVfcGF0aDogdGh1bWJuYWlsRmlsZVBhdGgsXG4gICAgICBiaWQgICAgICA6IDAuMDEsXG4gICAgICBtZXRhZGF0YSA6IHtcbiAgICAgICAgdGl0bGUgICAgICA6IGAke2NsYWltTmFtZX0gdGh1bWJuYWlsYCxcbiAgICAgICAgZGVzY3JpcHRpb246IGBhIHRodW1ibmFpbCBmb3IgJHtjbGFpbU5hbWV9YCxcbiAgICAgICAgYXV0aG9yICAgICA6IGRldGFpbHMudGl0bGUsXG4gICAgICAgIGxhbmd1YWdlICAgOiAnZW4nLFxuICAgICAgICBsaWNlbnNlLFxuICAgICAgICBuc2Z3LFxuICAgICAgfSxcbiAgICAgIGNsYWltX2FkZHJlc3M6IHB1Ymxpc2hpbmcucHJpbWFyeUNsYWltQWRkcmVzcyxcbiAgICAgIGNoYW5uZWxfbmFtZSA6IHB1Ymxpc2hpbmcudGh1bWJuYWlsQ2hhbm5lbCxcbiAgICAgIGNoYW5uZWxfaWQgICA6IHB1Ymxpc2hpbmcudGh1bWJuYWlsQ2hhbm5lbElkLFxuICAgIH07XG4gIH0sXG4gIGRlbGV0ZVRlbXBvcmFyeUZpbGUgKGZpbGVQYXRoKSB7XG4gICAgZnMudW5saW5rKGZpbGVQYXRoLCBlcnIgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYGVycm9yIGRlbGV0aW5nIHRlbXBvcmFyeSBmaWxlICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5kZWJ1Zyhgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgJHtmaWxlUGF0aH1gKTtcbiAgICB9KTtcbiAgfSxcbiAgYWRkR2V0UmVzdWx0c1RvRmlsZURhdGEgKGZpbGVJbmZvLCBnZXRSZXN1bHQpIHtcbiAgICBmaWxlSW5mby5maWxlTmFtZSA9IGdldFJlc3VsdC5maWxlX25hbWU7XG4gICAgZmlsZUluZm8uZmlsZVBhdGggPSBnZXRSZXN1bHQuZG93bmxvYWRfcGF0aDtcbiAgICByZXR1cm4gZmlsZUluZm87XG4gIH0sXG4gIGNyZWF0ZUZpbGVEYXRhICh7IG5hbWUsIGNsYWltSWQsIG91dHBvaW50LCBoZWlnaHQsIGFkZHJlc3MsIG5zZncsIGNvbnRlbnRUeXBlIH0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIGNsYWltSWQsXG4gICAgICBvdXRwb2ludCxcbiAgICAgIGhlaWdodCxcbiAgICAgIGFkZHJlc3MsXG4gICAgICBmaWxlTmFtZTogJycsXG4gICAgICBmaWxlUGF0aDogJycsXG4gICAgICBmaWxlVHlwZTogY29udGVudFR5cGUsXG4gICAgICBuc2Z3LFxuICAgIH07XG4gIH0sXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL2hlbHBlcnMvcHVibGlzaEhlbHBlcnMuanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJmc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcImZzXCJcbi8vIG1vZHVsZSBpZCA9IDM1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGhhbmRsZUVycm9yUmVzcG9uc2U6IGZ1bmN0aW9uIChvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpIHtcbiAgICBsb2dnZXIuZXJyb3IoYEVycm9yIG9uICR7b3JpZ2luYWxVcmx9YCwgbW9kdWxlLmV4cG9ydHMudXNlT2JqZWN0UHJvcGVydGllc0lmTm9LZXlzKGVycm9yKSk7XG4gICAgY29uc3QgW3N0YXR1cywgbWVzc2FnZV0gPSBtb2R1bGUuZXhwb3J0cy5yZXR1cm5FcnJvck1lc3NhZ2VBbmRTdGF0dXMoZXJyb3IpO1xuICAgIHJlc1xuICAgICAgLnN0YXR1cyhzdGF0dXMpXG4gICAgICAuanNvbihtb2R1bGUuZXhwb3J0cy5jcmVhdGVFcnJvclJlc3BvbnNlUGF5bG9hZChzdGF0dXMsIG1lc3NhZ2UpKTtcbiAgfSxcbiAgcmV0dXJuRXJyb3JNZXNzYWdlQW5kU3RhdHVzOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICBsZXQgc3RhdHVzLCBtZXNzYWdlO1xuICAgIC8vIGNoZWNrIGZvciBkYWVtb24gYmVpbmcgdHVybmVkIG9mZlxuICAgIGlmIChlcnJvci5jb2RlID09PSAnRUNPTk5SRUZVU0VEJykge1xuICAgICAgc3RhdHVzID0gNTAzO1xuICAgICAgbWVzc2FnZSA9ICdDb25uZWN0aW9uIHJlZnVzZWQuICBUaGUgZGFlbW9uIG1heSBub3QgYmUgcnVubmluZy4nO1xuICAgICAgLy8gZmFsbGJhY2sgZm9yIGV2ZXJ5dGhpbmcgZWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0dXMgPSA0MDA7XG4gICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICBtZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lc3NhZ2UgPSBlcnJvcjtcbiAgICAgIH07XG4gICAgfTtcbiAgICByZXR1cm4gW3N0YXR1cywgbWVzc2FnZV07XG4gIH0sXG4gIHVzZU9iamVjdFByb3BlcnRpZXNJZk5vS2V5czogZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChPYmplY3Qua2V5cyhlcnIpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbGV0IG5ld0Vycm9yT2JqZWN0ID0ge307XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlcnIpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBuZXdFcnJvck9iamVjdFtrZXldID0gZXJyW2tleV07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXdFcnJvck9iamVjdDtcbiAgICB9XG4gICAgcmV0dXJuIGVycjtcbiAgfSxcbiAgY3JlYXRlRXJyb3JSZXNwb25zZVBheWxvYWQgKHN0YXR1cywgbWVzc2FnZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXMsXG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIG1lc3NhZ2UsXG4gICAgfTtcbiAgfSxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvaGVscGVycy9lcnJvckhhbmRsZXJzLmpzIiwiY29uc3QgZGIgPSByZXF1aXJlKCcuLi9tb2RlbHMvaW5kZXgnKTtcbmNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcbmNvbnN0IHsgcmV0dXJuUGFnaW5hdGVkQ2hhbm5lbENsYWltcyB9ID0gcmVxdWlyZSgnLi4vaGVscGVycy9jaGFubmVsUGFnaW5hdGlvbi5qcycpO1xuXG5jb25zdCBOT19DSEFOTkVMID0gJ05PX0NIQU5ORUwnO1xuY29uc3QgTk9fQ0xBSU0gPSAnTk9fQ0xBSU0nO1xuY29uc3QgTk9fRklMRSA9ICdOT19GSUxFJztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENsYWltSWQgKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCwgbmFtZSwgY2xhaW1JZCkge1xuICAgIGlmIChjaGFubmVsTmFtZSkge1xuICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzLmdldENsYWltSWRCeUNoYW5uZWwoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzLmdldENsYWltSWRCeUNsYWltKG5hbWUsIGNsYWltSWQpO1xuICAgIH1cbiAgfSxcbiAgZ2V0Q2xhaW1JZEJ5Q2xhaW0gKGNsYWltTmFtZSwgY2xhaW1JZCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgZ2V0Q2xhaW1JZEJ5Q2xhaW0oJHtjbGFpbU5hbWV9LCAke2NsYWltSWR9KWApO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBkYi5DbGFpbS5nZXRMb25nQ2xhaW1JZChjbGFpbU5hbWUsIGNsYWltSWQpXG4gICAgICAgIC50aGVuKGxvbmdDbGFpbUlkID0+IHtcbiAgICAgICAgICBpZiAoIWxvbmdDbGFpbUlkKSB7XG4gICAgICAgICAgICByZXNvbHZlKE5PX0NMQUlNKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShsb25nQ2xhaW1JZCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIGdldENsYWltSWRCeUNoYW5uZWwgKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCwgY2xhaW1OYW1lKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBnZXRDbGFpbUlkQnlDaGFubmVsKCR7Y2hhbm5lbE5hbWV9LCAke2NoYW5uZWxDbGFpbUlkfSwgJHtjbGFpbU5hbWV9KWApO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBkYi5DZXJ0aWZpY2F0ZS5nZXRMb25nQ2hhbm5lbElkKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCkgLy8gMS4gZ2V0IHRoZSBsb25nIGNoYW5uZWwgaWRcbiAgICAgICAgLnRoZW4obG9uZ0NoYW5uZWxJZCA9PiB7XG4gICAgICAgICAgaWYgKCFsb25nQ2hhbm5lbElkKSB7XG4gICAgICAgICAgICByZXR1cm4gW251bGwsIG51bGxdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW2xvbmdDaGFubmVsSWQsIGRiLkNsYWltLmdldENsYWltSWRCeUxvbmdDaGFubmVsSWQobG9uZ0NoYW5uZWxJZCwgY2xhaW1OYW1lKV0pOyAgLy8gMi4gZ2V0IHRoZSBsb25nIGNsYWltIGlkXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKChbbG9uZ0NoYW5uZWxJZCwgbG9uZ0NsYWltSWRdKSA9PiB7XG4gICAgICAgICAgaWYgKCFsb25nQ2hhbm5lbElkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShOT19DSEFOTkVMKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFsb25nQ2xhaW1JZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoTk9fQ0xBSU0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKGxvbmdDbGFpbUlkKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgZ2V0Q2hhbm5lbERhdGEgKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCwgcGFnZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyAxLiBnZXQgdGhlIGxvbmcgY2hhbm5lbCBJZCAobWFrZSBzdXJlIGNoYW5uZWwgZXhpc3RzKVxuICAgICAgZGIuQ2VydGlmaWNhdGUuZ2V0TG9uZ0NoYW5uZWxJZChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQpXG4gICAgICAgIC50aGVuKGxvbmdDaGFubmVsQ2xhaW1JZCA9PiB7XG4gICAgICAgICAgaWYgKCFsb25nQ2hhbm5lbENsYWltSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBbbnVsbCwgbnVsbCwgbnVsbF07XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIDIuIGdldCB0aGUgc2hvcnQgSUQgYW5kIGFsbCBjbGFpbXMgZm9yIHRoYXQgY2hhbm5lbFxuICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbbG9uZ0NoYW5uZWxDbGFpbUlkLCBkYi5DZXJ0aWZpY2F0ZS5nZXRTaG9ydENoYW5uZWxJZEZyb21Mb25nQ2hhbm5lbElkKGxvbmdDaGFubmVsQ2xhaW1JZCwgY2hhbm5lbE5hbWUpXSk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKChbbG9uZ0NoYW5uZWxDbGFpbUlkLCBzaG9ydENoYW5uZWxDbGFpbUlkXSkgPT4ge1xuICAgICAgICAgIGlmICghbG9uZ0NoYW5uZWxDbGFpbUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShOT19DSEFOTkVMKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gMy4gcmV0dXJuIGFsbCB0aGUgY2hhbm5lbCBpbmZvcm1hdGlvblxuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgY2hhbm5lbE5hbWUsXG4gICAgICAgICAgICBsb25nQ2hhbm5lbENsYWltSWQsXG4gICAgICAgICAgICBzaG9ydENoYW5uZWxDbGFpbUlkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBnZXRDaGFubmVsQ2xhaW1zIChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIHBhZ2UpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gMS4gZ2V0IHRoZSBsb25nIGNoYW5uZWwgSWQgKG1ha2Ugc3VyZSBjaGFubmVsIGV4aXN0cylcbiAgICAgIGRiLkNlcnRpZmljYXRlLmdldExvbmdDaGFubmVsSWQoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkKVxuICAgICAgICAudGhlbihsb25nQ2hhbm5lbENsYWltSWQgPT4ge1xuICAgICAgICAgIGlmICghbG9uZ0NoYW5uZWxDbGFpbUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gW251bGwsIG51bGwsIG51bGxdO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyAyLiBnZXQgdGhlIHNob3J0IElEIGFuZCBhbGwgY2xhaW1zIGZvciB0aGF0IGNoYW5uZWxcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW2xvbmdDaGFubmVsQ2xhaW1JZCwgZGIuQ2xhaW0uZ2V0QWxsQ2hhbm5lbENsYWltcyhsb25nQ2hhbm5lbENsYWltSWQpXSk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKChbbG9uZ0NoYW5uZWxDbGFpbUlkLCBjaGFubmVsQ2xhaW1zQXJyYXldKSA9PiB7XG4gICAgICAgICAgaWYgKCFsb25nQ2hhbm5lbENsYWltSWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKE5PX0NIQU5ORUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyAzLiBmb3JtYXQgdGhlIGRhdGEgZm9yIHRoZSB2aWV3LCBpbmNsdWRpbmcgcGFnaW5hdGlvblxuICAgICAgICAgIGxldCBwYWdpbmF0ZWRDaGFubmVsVmlld0RhdGEgPSByZXR1cm5QYWdpbmF0ZWRDaGFubmVsQ2xhaW1zKGNoYW5uZWxOYW1lLCBsb25nQ2hhbm5lbENsYWltSWQsIGNoYW5uZWxDbGFpbXNBcnJheSwgcGFnZSk7XG4gICAgICAgICAgLy8gNC4gcmV0dXJuIGFsbCB0aGUgY2hhbm5lbCBpbmZvcm1hdGlvbiBhbmQgY29udGVudHNcbiAgICAgICAgICByZXNvbHZlKHBhZ2luYXRlZENoYW5uZWxWaWV3RGF0YSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIGdldExvY2FsRmlsZVJlY29yZCAoY2xhaW1JZCwgbmFtZSkge1xuICAgIHJldHVybiBkYi5GaWxlLmZpbmRPbmUoe3doZXJlOiB7Y2xhaW1JZCwgbmFtZX19KVxuICAgICAgLnRoZW4oZmlsZSA9PiB7XG4gICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgIHJldHVybiBOT19GSUxFO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWxlLmRhdGFWYWx1ZXM7XG4gICAgICB9KTtcbiAgfSxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvY29udHJvbGxlcnMvc2VydmVDb250cm9sbGVyLmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHJlbmRlclRvU3RyaW5nIH0gZnJvbSAncmVhY3QtZG9tL3NlcnZlcic7XG5pbXBvcnQgeyBjcmVhdGVTdG9yZSB9IGZyb20gJ3JlZHV4JztcbmltcG9ydCBSZWR1Y2VyIGZyb20gJy4uLy4uL2NsaWVudC9yZWR1Y2Vycy9pbmRleCc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IFN0YXRpY1JvdXRlciB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuaW1wb3J0IEdBTGlzdGVuZXIgZnJvbSAnLi4vLi4vY2xpZW50L2NvbXBvbmVudHMvR0FMaXN0ZW5lci9pbmRleCc7XG5pbXBvcnQgQXBwIGZyb20gJy4uLy4uL2NsaWVudC9hcHAnO1xuaW1wb3J0IHJlbmRlckZ1bGxQYWdlIGZyb20gJy4vcmVuZGVyRnVsbFBhZ2UuanMnO1xuaW1wb3J0IEhlbG1ldCBmcm9tICdyZWFjdC1oZWxtZXQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChyZXEsIHJlcykgPT4ge1xuICBsZXQgY29udGV4dCA9IHt9O1xuXG4gIC8vIGNyZWF0ZSBhIG5ldyBSZWR1eCBzdG9yZSBpbnN0YW5jZVxuICBjb25zdCBzdG9yZSA9IGNyZWF0ZVN0b3JlKFJlZHVjZXIpO1xuXG4gIC8vIHJlbmRlciBjb21wb25lbnQgdG8gYSBzdHJpbmdcbiAgY29uc3QgaHRtbCA9IHJlbmRlclRvU3RyaW5nKFxuICAgIDxQcm92aWRlciBzdG9yZT17c3RvcmV9PlxuICAgICAgPFN0YXRpY1JvdXRlciBsb2NhdGlvbj17cmVxLnVybH0gY29udGV4dD17Y29udGV4dH0+XG4gICAgICAgIDxHQUxpc3RlbmVyPlxuICAgICAgICAgIDxBcHAgLz5cbiAgICAgICAgPC9HQUxpc3RlbmVyPlxuICAgICAgPC9TdGF0aWNSb3V0ZXI+XG4gICAgPC9Qcm92aWRlcj5cbiAgKTtcblxuICAvLyBnZXQgaGVhZCB0YWdzIGZyb20gaGVsbWV0XG4gIGNvbnN0IGhlbG1ldCA9IEhlbG1ldC5yZW5kZXJTdGF0aWMoKTtcblxuICAvLyBjaGVjayBmb3IgYSByZWRpcmVjdFxuICBpZiAoY29udGV4dC51cmwpIHtcbiAgICAvLyBTb21ld2hlcmUgYSBgPFJlZGlyZWN0PmAgd2FzIHJlbmRlcmVkXG4gICAgcmV0dXJuIHJlcy5yZWRpcmVjdCgzMDEsIGNvbnRleHQudXJsKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB3ZSdyZSBnb29kLCBzZW5kIHRoZSByZXNwb25zZVxuICB9XG5cbiAgLy8gZ2V0IHRoZSBpbml0aWFsIHN0YXRlIGZyb20gb3VyIFJlZHV4IHN0b3JlXG4gIGNvbnN0IHByZWxvYWRlZFN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcblxuICAvLyBzZW5kIHRoZSByZW5kZXJlZCBwYWdlIGJhY2sgdG8gdGhlIGNsaWVudFxuICByZXMuc2VuZChyZW5kZXJGdWxsUGFnZShoZWxtZXQsIGh0bWwsIHByZWxvYWRlZFN0YXRlKSk7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL2hlbHBlcnMvaGFuZGxlUGFnZVJlbmRlci5qc3giLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdC1kb20vc2VydmVyXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwicmVhY3QtZG9tL3NlcnZlclwiXG4vLyBtb2R1bGUgaWQgPSAzOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgeyBjb21iaW5lUmVkdWNlcnMgfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQgUHVibGlzaFJlZHVjZXIgZnJvbSAncmVkdWNlcnMvcHVibGlzaCc7XG5pbXBvcnQgQ2hhbm5lbFJlZHVjZXIgZnJvbSAncmVkdWNlcnMvY2hhbm5lbCc7XG5pbXBvcnQgU2hvd1JlZHVjZXIgZnJvbSAncmVkdWNlcnMvc2hvdyc7XG5pbXBvcnQgU2l0ZVJlZHVjZXIgZnJvbSAncmVkdWNlcnMvc2l0ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbWJpbmVSZWR1Y2Vycyh7XG4gIGNoYW5uZWw6IENoYW5uZWxSZWR1Y2VyLFxuICBwdWJsaXNoOiBQdWJsaXNoUmVkdWNlcixcbiAgc2hvdyAgIDogU2hvd1JlZHVjZXIsXG4gIHNpdGUgICA6IFNpdGVSZWR1Y2VyLFxufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvcmVkdWNlcnMvaW5kZXguanMiLCJleHBvcnQgY29uc3QgRklMRV9TRUxFQ1RFRCA9ICdGSUxFX1NFTEVDVEVEJztcbmV4cG9ydCBjb25zdCBGSUxFX0NMRUFSID0gJ0ZJTEVfQ0xFQVInO1xuZXhwb3J0IGNvbnN0IE1FVEFEQVRBX1VQREFURSA9ICdNRVRBREFUQV9VUERBVEUnO1xuZXhwb3J0IGNvbnN0IENMQUlNX1VQREFURSA9ICdDTEFJTV9VUERBVEUnO1xuZXhwb3J0IGNvbnN0IFNFVF9QVUJMSVNIX0lOX0NIQU5ORUwgPSAnU0VUX1BVQkxJU0hfSU5fQ0hBTk5FTCc7XG5leHBvcnQgY29uc3QgUFVCTElTSF9TVEFUVVNfVVBEQVRFID0gJ1BVQkxJU0hfU1RBVFVTX1VQREFURSc7XG5leHBvcnQgY29uc3QgRVJST1JfVVBEQVRFID0gJ0VSUk9SX1VQREFURSc7XG5leHBvcnQgY29uc3QgU0VMRUNURURfQ0hBTk5FTF9VUERBVEUgPSAnU0VMRUNURURfQ0hBTk5FTF9VUERBVEUnO1xuZXhwb3J0IGNvbnN0IFRPR0dMRV9NRVRBREFUQV9JTlBVVFMgPSAnVE9HR0xFX01FVEFEQVRBX0lOUFVUUyc7XG5leHBvcnQgY29uc3QgVEhVTUJOQUlMX05FVyA9ICdUSFVNQk5BSUxfTkVXJztcbmV4cG9ydCBjb25zdCBQVUJMSVNIX1NUQVJUID0gJ1BVQkxJU0hfU1RBUlQnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnN0YW50cy9wdWJsaXNoX2FjdGlvbl90eXBlcy5qcyIsImV4cG9ydCBjb25zdCBDSEFOTkVMX1VQREFURSA9ICdDSEFOTkVMX1VQREFURSc7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29uc3RhbnRzL2NoYW5uZWxfYWN0aW9uX3R5cGVzLmpzIiwiZXhwb3J0IGNvbnN0IExPQ0FMX0NIRUNLID0gJ0xPQ0FMX0NIRUNLJztcbmV4cG9ydCBjb25zdCBVTkFWQUlMQUJMRSA9ICdVTkFWQUlMQUJMRSc7XG5leHBvcnQgY29uc3QgRVJST1IgPSAnRVJST1InO1xuZXhwb3J0IGNvbnN0IEFWQUlMQUJMRSA9ICdBVkFJTEFCTEUnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnN0YW50cy9hc3NldF9kaXNwbGF5X3N0YXRlcy5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgR29vZ2xlQW5hbHl0aWNzIGZyb20gJ3JlYWN0LWdhJztcbmltcG9ydCB7IHdpdGhSb3V0ZXIgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmNvbnN0IHsgYW5hbHl0aWNzOiB7IGdvb2dsZUlkIH0gfSA9IHJlcXVpcmUoJy4uLy4uLy4uL2NvbmZpZy9zaXRlQ29uZmlnLmpzJyk7XG5cbkdvb2dsZUFuYWx5dGljcy5pbml0aWFsaXplKGdvb2dsZUlkKTtcblxuY2xhc3MgR0FMaXN0ZW5lciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICB0aGlzLnNlbmRQYWdlVmlldyh0aGlzLnByb3BzLmhpc3RvcnkubG9jYXRpb24pO1xuICAgIHRoaXMucHJvcHMuaGlzdG9yeS5saXN0ZW4odGhpcy5zZW5kUGFnZVZpZXcpO1xuICB9XG5cbiAgc2VuZFBhZ2VWaWV3IChsb2NhdGlvbikge1xuICAgIEdvb2dsZUFuYWx5dGljcy5zZXQoeyBwYWdlOiBsb2NhdGlvbi5wYXRobmFtZSB9KTtcbiAgICBHb29nbGVBbmFseXRpY3MucGFnZXZpZXcobG9jYXRpb24ucGF0aG5hbWUpO1xuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB3aXRoUm91dGVyKEdBTGlzdGVuZXIpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbXBvbmVudHMvR0FMaXN0ZW5lci9pbmRleC5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUm91dGUsIFN3aXRjaCB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuaW1wb3J0IHsgZHluYW1pY0ltcG9ydCB9IGZyb20gJ3V0aWxzL2R5bmFtaWNJbXBvcnQnO1xuaW1wb3J0IEFib3V0UGFnZSBmcm9tICdwYWdlcy9BYm91dFBhZ2UnO1xuaW1wb3J0IExvZ2luUGFnZSBmcm9tICdwYWdlcy9Mb2dpblBhZ2UnO1xuaW1wb3J0IFNob3dQYWdlIGZyb20gJ3BhZ2VzL1Nob3dQYWdlJztcbmltcG9ydCBGb3VyT2hGb3VyUGFnZSBmcm9tICdjb250YWluZXJzL0ZvdXJPaEZvdXJQYWdlJztcbmNvbnN0IEhvbWVQYWdlID0gZHluYW1pY0ltcG9ydCgncGFnZXMvSG9tZVBhZ2UnKTsgLy8gb3IgdXNlIHRoZSBwcm92aWRlZCBsb2NhbCBob21lcGFnZVxuXG5jb25zdCBBcHAgPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPFN3aXRjaD5cbiAgICAgIDxSb3V0ZSBleGFjdCBwYXRoPScvJyBjb21wb25lbnQ9e0hvbWVQYWdlfSAvPlxuICAgICAgPFJvdXRlIGV4YWN0IHBhdGg9Jy9hYm91dCcgY29tcG9uZW50PXtBYm91dFBhZ2V9IC8+XG4gICAgICA8Um91dGUgZXhhY3QgcGF0aD0nL2xvZ2luJyBjb21wb25lbnQ9e0xvZ2luUGFnZX0gLz5cbiAgICAgIDxSb3V0ZSBleGFjdCBwYXRoPScvOmlkZW50aWZpZXIvOmNsYWltJyBjb21wb25lbnQ9e1Nob3dQYWdlfSAvPlxuICAgICAgPFJvdXRlIGV4YWN0IHBhdGg9Jy86Y2xhaW0nIGNvbXBvbmVudD17U2hvd1BhZ2V9IC8+XG4gICAgICA8Um91dGUgY29tcG9uZW50PXtGb3VyT2hGb3VyUGFnZX0gLz5cbiAgICA8L1N3aXRjaD5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFwcDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9hcHAuanMiLCJ2YXIgbWFwID0ge1xuXHRcIi4vY2Fub25pY2FsTGlua1wiOiAyMCxcblx0XCIuL2Nhbm9uaWNhbExpbmsuanNcIjogMjAsXG5cdFwiLi9keW5hbWljSW1wb3J0XCI6IDE5LFxuXHRcIi4vZHluYW1pY0ltcG9ydC5qc1wiOiAxOSxcblx0XCIuL2ZpbGVcIjogNDcsXG5cdFwiLi9maWxlLmpzXCI6IDQ3LFxuXHRcIi4vbGJyeVVyaVwiOiAyMSxcblx0XCIuL2xicnlVcmkuanNcIjogMjEsXG5cdFwiLi9tZXRhVGFnc1wiOiAyMixcblx0XCIuL21ldGFUYWdzLmpzXCI6IDIyLFxuXHRcIi4vcGFnZVRpdGxlXCI6IDIzLFxuXHRcIi4vcGFnZVRpdGxlLmpzXCI6IDIzLFxuXHRcIi4vcHVibGlzaFwiOiA0OCxcblx0XCIuL3B1Ymxpc2guanNcIjogNDgsXG5cdFwiLi9yZXF1ZXN0XCI6IDYsXG5cdFwiLi9yZXF1ZXN0LmpzXCI6IDYsXG5cdFwiLi92YWxpZGF0ZVwiOiA0OSxcblx0XCIuL3ZhbGlkYXRlLmpzXCI6IDQ5XG59O1xuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpKTtcbn07XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdHZhciBpZCA9IG1hcFtyZXFdO1xuXHRpZighKGlkICsgMSkpIC8vIGNoZWNrIGZvciBudW1iZXIgb3Igc3RyaW5nXG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJy5cIik7XG5cdHJldHVybiBpZDtcbn07XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gNDY7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9jbGllbnQvdXRpbHMgXi4qJFxuLy8gbW9kdWxlIGlkID0gNDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIHZhbGlkYXRlRmlsZSAoZmlsZSkge1xuICAgIGlmICghZmlsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBmaWxlIHByb3ZpZGVkJyk7XG4gICAgfVxuICAgIGlmICgvJy8udGVzdChmaWxlLm5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Fwb3N0cm9waGVzIGFyZSBub3QgYWxsb3dlZCBpbiB0aGUgZmlsZSBuYW1lJyk7XG4gICAgfVxuICAgIC8vIHZhbGlkYXRlIHNpemUgYW5kIHR5cGVcbiAgICBzd2l0Y2ggKGZpbGUudHlwZSkge1xuICAgICAgY2FzZSAnaW1hZ2UvanBlZyc6XG4gICAgICBjYXNlICdpbWFnZS9qcGcnOlxuICAgICAgY2FzZSAnaW1hZ2UvcG5nJzpcbiAgICAgICAgaWYgKGZpbGUuc2l6ZSA+IDEwMDAwMDAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb3JyeSwgaW1hZ2VzIGFyZSBsaW1pdGVkIHRvIDEwIG1lZ2FieXRlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ltYWdlL2dpZic6XG4gICAgICAgIGlmIChmaWxlLnNpemUgPiA1MDAwMDAwMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU29ycnksIEdJRnMgYXJlIGxpbWl0ZWQgdG8gNTAgbWVnYWJ5dGVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndmlkZW8vbXA0JzpcbiAgICAgICAgaWYgKGZpbGUuc2l6ZSA+IDUwMDAwMDAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb3JyeSwgdmlkZW9zIGFyZSBsaW1pdGVkIHRvIDUwIG1lZ2FieXRlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihmaWxlLnR5cGUgKyAnIGlzIG5vdCBhIHN1cHBvcnRlZCBmaWxlIHR5cGUuIE9ubHksIC5qcGVnLCAucG5nLCAuZ2lmLCBhbmQgLm1wNCBmaWxlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gIH0sXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3V0aWxzL2ZpbGUuanMiLCJleHBvcnQgY29uc3QgY3JlYXRlUHVibGlzaE1ldGFkYXRhID0gKGNsYWltLCB7IHR5cGUgfSwgeyB0aXRsZSwgZGVzY3JpcHRpb24sIGxpY2Vuc2UsIG5zZncgfSwgcHVibGlzaEluQ2hhbm5lbCwgc2VsZWN0ZWRDaGFubmVsKSA9PiB7XG4gIGxldCBtZXRhZGF0YSA9IHtcbiAgICBuYW1lOiBjbGFpbSxcbiAgICB0aXRsZSxcbiAgICBkZXNjcmlwdGlvbixcbiAgICBsaWNlbnNlLFxuICAgIG5zZncsXG4gICAgdHlwZSxcbiAgfTtcbiAgaWYgKHB1Ymxpc2hJbkNoYW5uZWwpIHtcbiAgICBtZXRhZGF0YVsnY2hhbm5lbE5hbWUnXSA9IHNlbGVjdGVkQ2hhbm5lbDtcbiAgfVxuICByZXR1cm4gbWV0YWRhdGE7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUHVibGlzaEZvcm1EYXRhID0gKGZpbGUsIHRodW1ibmFpbCwgbWV0YWRhdGEpID0+IHtcbiAgbGV0IGZkID0gbmV3IEZvcm1EYXRhKCk7XG4gIC8vIGFwcGVuZCBmaWxlXG4gIGZkLmFwcGVuZCgnZmlsZScsIGZpbGUpO1xuICAvLyBhcHBlbmQgdGh1bWJuYWlsXG4gIGlmICh0aHVtYm5haWwpIHtcbiAgICBmZC5hcHBlbmQoJ3RodW1ibmFpbCcsIHRodW1ibmFpbCk7XG4gIH1cbiAgLy8gYXBwZW5kIG1ldGFkYXRhXG4gIGZvciAobGV0IGtleSBpbiBtZXRhZGF0YSkge1xuICAgIGlmIChtZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBmZC5hcHBlbmQoa2V5LCBtZXRhZGF0YVtrZXldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZkO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVRodW1ibmFpbFVybCA9IChjaGFubmVsLCBjaGFubmVsSWQsIGNsYWltLCBob3N0KSA9PiB7XG4gIHJldHVybiBgJHtob3N0fS8ke2NoYW5uZWx9OiR7Y2hhbm5lbElkfS8ke2NsYWltfS10aHVtYi5wbmdgO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC91dGlscy9wdWJsaXNoLmpzIiwiZXhwb3J0IGNvbnN0IHZhbGlkYXRlQ2hhbm5lbFNlbGVjdGlvbiA9IChwdWJsaXNoSW5DaGFubmVsLCBzZWxlY3RlZENoYW5uZWwsIGxvZ2dlZEluQ2hhbm5lbCkgPT4ge1xuICBpZiAocHVibGlzaEluQ2hhbm5lbCAmJiAoc2VsZWN0ZWRDaGFubmVsICE9PSBsb2dnZWRJbkNoYW5uZWwubmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvZyBpbiB0byBhIGNoYW5uZWwgb3Igc2VsZWN0IEFub255bW91cycpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVQdWJsaXNoUGFyYW1zID0gKGZpbGUsIGNsYWltLCB1cmxFcnJvcikgPT4ge1xuICBpZiAoIWZpbGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBjaG9vc2UgYSBmaWxlJyk7XG4gIH1cbiAgaWYgKCFjbGFpbSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIGVudGVyIGEgVVJMJyk7XG4gIH1cbiAgaWYgKHVybEVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaXggdGhlIHVybCcpO1xuICB9XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3V0aWxzL3ZhbGlkYXRlLmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgQWN0aXZlU3RhdHVzQmFyIGZyb20gJ2NvbXBvbmVudHMvQWN0aXZlU3RhdHVzQmFyJztcbmltcG9ydCBJbmFjdGl2ZVN0YXR1c0JhciBmcm9tICdjb21wb25lbnRzL0luYWN0aXZlU3RhdHVzQmFyJztcblxuY2xhc3MgUHJvZ3Jlc3NCYXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGJhcnMgICAgICAgOiBbXSxcbiAgICAgIGluZGV4ICAgICAgOiAwLFxuICAgICAgaW5jcmVtZW50ZXI6IDEsXG4gICAgfTtcbiAgICB0aGlzLmNyZWF0ZUJhcnMgPSB0aGlzLmNyZWF0ZUJhcnMuYmluZCh0aGlzKTtcbiAgICB0aGlzLnN0YXJ0UHJvZ3Jlc3NCYXIgPSB0aGlzLnN0YXJ0UHJvZ3Jlc3NCYXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLnVwZGF0ZVByb2dyZXNzQmFyID0gdGhpcy51cGRhdGVQcm9ncmVzc0Jhci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuc3RvcFByb2dyZXNzQmFyID0gdGhpcy5zdG9wUHJvZ3Jlc3NCYXIuYmluZCh0aGlzKTtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgdGhpcy5jcmVhdGVCYXJzKCk7XG4gICAgdGhpcy5zdGFydFByb2dyZXNzQmFyKCk7XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQgKCkge1xuICAgIHRoaXMuc3RvcFByb2dyZXNzQmFyKCk7XG4gIH1cbiAgY3JlYXRlQmFycyAoKSB7XG4gICAgY29uc3QgYmFycyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHRoaXMucHJvcHMuc2l6ZTsgaSsrKSB7XG4gICAgICBiYXJzLnB1c2goe2lzQWN0aXZlOiBmYWxzZX0pO1xuICAgIH1cbiAgICB0aGlzLnNldFN0YXRlKHsgYmFycyB9KTtcbiAgfVxuICBzdGFydFByb2dyZXNzQmFyICgpIHtcbiAgICB0aGlzLnVwZGF0ZUludGVydmFsID0gc2V0SW50ZXJ2YWwodGhpcy51cGRhdGVQcm9ncmVzc0Jhci5iaW5kKHRoaXMpLCAzMDApO1xuICB9O1xuICB1cGRhdGVQcm9ncmVzc0JhciAoKSB7XG4gICAgbGV0IGluZGV4ID0gdGhpcy5zdGF0ZS5pbmRleDtcbiAgICBsZXQgaW5jcmVtZW50ZXIgPSB0aGlzLnN0YXRlLmluY3JlbWVudGVyO1xuICAgIGxldCBiYXJzID0gdGhpcy5zdGF0ZS5iYXJzO1xuICAgIC8vIGZsaXAgaW5jcmVtZW50ZXIgaWYgbmVjZXNzYXJ5LCB0byBzdGF5IGluIGJvdW5kc1xuICAgIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPiB0aGlzLnByb3BzLnNpemUpKSB7XG4gICAgICBpbmNyZW1lbnRlciA9IGluY3JlbWVudGVyICogLTE7XG4gICAgICBpbmRleCArPSBpbmNyZW1lbnRlcjtcbiAgICB9XG4gICAgLy8gdXBkYXRlIHRoZSBpbmRleGVkIGJhclxuICAgIGlmIChpbmNyZW1lbnRlciA+IDApIHtcbiAgICAgIGJhcnNbaW5kZXhdLmlzQWN0aXZlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmFyc1tpbmRleF0uaXNBY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuICAgIC8vIGluY3JlbWVudCBpbmRleFxuICAgIGluZGV4ICs9IGluY3JlbWVudGVyO1xuICAgIC8vIHVwZGF0ZSBzdGF0ZVxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgYmFycyxcbiAgICAgIGluY3JlbWVudGVyLFxuICAgICAgaW5kZXgsXG4gICAgfSk7XG4gIH07XG4gIHN0b3BQcm9ncmVzc0JhciAoKSB7XG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLnVwZGF0ZUludGVydmFsKTtcbiAgfTtcbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAge3RoaXMuc3RhdGUuYmFycy5tYXAoKGJhciwgaW5kZXgpID0+IGJhci5pc0FjdGl2ZSA/IDxBY3RpdmVTdGF0dXNCYXIga2V5PXtpbmRleH0gLz4gOiA8SW5hY3RpdmVTdGF0dXNCYXIga2V5PXtpbmRleH0vPil9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5Qcm9ncmVzc0Jhci5wcm9wVHlwZXMgPSB7XG4gIHNpemU6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFByb2dyZXNzQmFyO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbXBvbmVudHMvUHJvZ3Jlc3NCYXIvaW5kZXguanN4IiwiZXhwb3J0IGNvbnN0IENIQU5ORUwgPSAnQ0hBTk5FTCc7XG5leHBvcnQgY29uc3QgQVNTRVRfTElURSA9ICdBU1NFVF9MSVRFJztcbmV4cG9ydCBjb25zdCBBU1NFVF9ERVRBSUxTID0gJ0FTU0VUX0RFVEFJTFMnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnN0YW50cy9zaG93X3JlcXVlc3RfdHlwZXMuanMiLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcbmltcG9ydCB7IGZpbGVSZXF1ZXN0ZWQgfSBmcm9tICdhY3Rpb25zL3Nob3cnO1xuaW1wb3J0IHsgc2VsZWN0QXNzZXQgfSBmcm9tICdzZWxlY3RvcnMvc2hvdyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IHNob3cgfSkgPT4ge1xuICAvLyBzZWxlY3QgZXJyb3IgYW5kIHN0YXR1c1xuICBjb25zdCBlcnJvciAgPSBzaG93LmRpc3BsYXlBc3NldC5lcnJvcjtcbiAgY29uc3Qgc3RhdHVzID0gc2hvdy5kaXNwbGF5QXNzZXQuc3RhdHVzO1xuICAvLyBzZWxlY3QgYXNzZXRcbiAgY29uc3QgYXNzZXQgPSBzZWxlY3RBc3NldChzaG93KTtcbiAgLy8gIHJldHVybiBwcm9wc1xuICByZXR1cm4ge1xuICAgIGVycm9yLFxuICAgIHN0YXR1cyxcbiAgICBhc3NldCxcbiAgfTtcbn07XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IGRpc3BhdGNoID0+IHtcbiAgcmV0dXJuIHtcbiAgICBvbkZpbGVSZXF1ZXN0OiAobmFtZSwgY2xhaW1JZCkgPT4ge1xuICAgICAgZGlzcGF0Y2goZmlsZVJlcXVlc3RlZChuYW1lLCBjbGFpbUlkKSk7XG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvQXNzZXREaXNwbGF5L2luZGV4LmpzIiwibW9kdWxlLmV4cG9ydHMgPSAoaGVsbWV0LCBodG1sLCBwcmVsb2FkZWRTdGF0ZSkgPT4ge1xuICAvLyB0YWtlIHRoZSBodG1sIGFuZCBwcmVsb2FkZWRTdGF0ZSBhbmQgcmV0dXJuIHRoZSBmdWxsIHBhZ2VcbiAgcmV0dXJuIGBcbiAgICA8IURPQ1RZUEUgaHRtbD5cbiAgICA8aHRtbCBsYW5nPVwiZW5cIiBwcmVmaXg9XCJvZzogaHR0cDovL29ncC5tZS9ucyMgZmI6IGh0dHA6Ly9vZ3AubWUvbnMvZmIjXCI+XG4gICAgICAgIDxoZWFkPlxuICAgICAgICAgICAgPG1ldGEgY2hhcnNldD1cIlVURi04XCI+XG4gICAgICAgICAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLCB1c2VyLXNjYWxhYmxlPW5vXCI+XG4gICAgICAgICAgICA8bWV0YSBodHRwLWVxdWl2PVwiWC1VQS1Db21wYXRpYmxlXCIgY29udGVudD1cImllPWVkZ2VcIj5cbiAgICAgICAgICAgIDwhLS1oZWxtZXQtLT5cbiAgICAgICAgICAgICR7aGVsbWV0LnRpdGxlLnRvU3RyaW5nKCl9XG4gICAgICAgICAgICAke2hlbG1ldC5tZXRhLnRvU3RyaW5nKCl9XG4gICAgICAgICAgICAke2hlbG1ldC5saW5rLnRvU3RyaW5nKCl9XG4gICAgICAgICAgICA8IS0tc3R5bGUgc2hlZXRzLS0+XG4gICAgICAgICAgICA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIi9hc3NldHMvY3NzL3Jlc2V0LmNzc1wiIHR5cGU9XCJ0ZXh0L2Nzc1wiPlxuICAgICAgICAgICAgPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIGhyZWY9XCIvYXNzZXRzL2Nzcy9nZW5lcmFsLmNzc1wiIHR5cGU9XCJ0ZXh0L2Nzc1wiPlxuICAgICAgICAgICAgPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIGhyZWY9XCIvYXNzZXRzL2Nzcy9tZWRpYVF1ZXJpZXMuY3NzXCIgdHlwZT1cInRleHQvY3NzXCI+XG4gICAgICAgICAgICA8IS0tZ29vZ2xlIGZvbnQtLT5cbiAgICAgICAgICAgIDxsaW5rIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Um9ib3RvOjMwMFwiIHJlbD1cInN0eWxlc2hlZXRcIj5cbiAgICAgICAgPC9oZWFkPlxuICAgICAgICA8Ym9keSBpZD1cIm1haW4tYm9keVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyByb3ctLXRhbGwgZmxleC1jb250YWluZXItLWNvbHVtblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJyZWFjdC1hcHBcIiBjbGFzcz1cInJvdyByb3ctLXRhbGwgZmxleC1jb250YWluZXItLWNvbHVtblwiPiR7aHRtbH08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICB3aW5kb3cuX19QUkVMT0FERURfU1RBVEVfXyA9ICR7SlNPTi5zdHJpbmdpZnkocHJlbG9hZGVkU3RhdGUpLnJlcGxhY2UoLzwvZywgJ1xcXFxcXHUwMDNjJyl9XG4gICAgICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgICAgIDxzY3JpcHQgc3JjPVwiL2J1bmRsZS9idW5kbGUuanNcIj48L3NjcmlwdD5cbiAgICAgICAgPC9ib2R5PlxuICAgIDwvaHRtbD5cbiAgYDtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvaGVscGVycy9yZW5kZXJGdWxsUGFnZS5qcyIsImV4cG9ydCBjb25zdCBzZWxlY3RTaXRlU3RhdGUgPSAoc3RhdGUpID0+IHtcbiAgcmV0dXJuIHN0YXRlLnNpdGU7XG59O1xuXG5leHBvcnQgY29uc3Qgc2VsZWN0U2l0ZUhvc3QgPSAoc3RhdGUpID0+IHtcbiAgcmV0dXJuIHN0YXRlLnNpdGUuaG9zdDtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvc2VsZWN0b3JzL3NpdGUuanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJiYWJlbC1wb2x5ZmlsbFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcImJhYmVsLXBvbHlmaWxsXCJcbi8vIG1vZHVsZSBpZCA9IDU2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIndoYXR3Zy1mZXRjaFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcIndoYXR3Zy1mZXRjaFwiXG4vLyBtb2R1bGUgaWQgPSA1N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJjb25zdCBTZXJ2ZXIgPSByZXF1aXJlKCcuL3NlcnZlci9zZXJ2ZXIuanMnKTtcclxuY29uc3QgQ29tcG9uZW50cyA9IHJlcXVpcmUoJy4vY2xpZW50L2NvbXBvbmVudHMvaW5kZXgnKTtcclxuY29uc3QgQ29udGFpbmVycyA9IHJlcXVpcmUoJy4vY2xpZW50L2NvbnRhaW5lcnMvaW5kZXgnKTtcclxuY29uc3QgUGFnZXMgPSByZXF1aXJlKCcuL2NsaWVudC9wYWdlcy9pbmRleCcpO1xyXG5cclxuY29uc3QgZXhwb3J0cyA9IHtcclxuICBTZXJ2ZXIsXHJcbiAgQ29tcG9uZW50cyxcclxuICBDb250YWluZXJzLFxyXG4gIFBhZ2VzLFxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzO1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcGVlY2guanMiLCIvLyBhcHAgZGVwZW5kZW5jaWVzXG5jb25zdCBleHByZXNzID0gcmVxdWlyZSgnZXhwcmVzcycpO1xuY29uc3QgYm9keVBhcnNlciA9IHJlcXVpcmUoJ2JvZHktcGFyc2VyJyk7XG5jb25zdCBleHByZXNzSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2V4cHJlc3MtaGFuZGxlYmFycycpO1xuY29uc3QgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMnKTtcbmNvbnN0IGhlbG1ldCA9IHJlcXVpcmUoJ2hlbG1ldCcpO1xuY29uc3QgcGFzc3BvcnQgPSByZXF1aXJlKCdwYXNzcG9ydCcpO1xuY29uc3QgeyBzZXJpYWxpemVTcGVlY2hVc2VyLCBkZXNlcmlhbGl6ZVNwZWVjaFVzZXIgfSA9IHJlcXVpcmUoJy4vaGVscGVycy9hdXRoSGVscGVycy5qcycpO1xuY29uc3QgY29va2llU2Vzc2lvbiA9IHJlcXVpcmUoJ2Nvb2tpZS1zZXNzaW9uJyk7XG5jb25zdCBodHRwID0gcmVxdWlyZSgnaHR0cCcpO1xuLy8gbG9nZ2luZyBkZXBlbmRlbmNpZXNcbmNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcblxuZnVuY3Rpb24gU2VydmVyICgpIHtcbiAgdGhpcy5jb25maWd1cmVNeXNxbCA9IChteXNxbENvbmZpZykgPT4ge1xuICAgIHJlcXVpcmUoJy4uL2NvbmZpZy9teXNxbENvbmZpZy5qcycpLmNvbmZpZ3VyZShteXNxbENvbmZpZyk7XG4gIH07XG4gIHRoaXMuY29uZmlndXJlU2l0ZSA9IChzaXRlQ29uZmlnKSA9PiB7XG4gICAgcmVxdWlyZSgnLi4vY29uZmlnL3NpdGVDb25maWcuanMnKS5jb25maWd1cmUoc2l0ZUNvbmZpZyk7XG4gICAgY29uc29sZS5sb2cocmVxdWlyZSgnLi4vY29uZmlnL3NpdGVDb25maWcuanMnKSk7XG4gICAgdGhpcy5zZXNzaW9uS2V5ID0gc2l0ZUNvbmZpZy5hdXRoLnNlc3Npb25LZXk7XG4gICAgdGhpcy5QT1JUID0gc2l0ZUNvbmZpZy5kZXRhaWxzLnBvcnQ7XG4gIH07XG4gIHRoaXMuY29uZmlndXJlU2xhY2sgPSAoc2xhY2tDb25maWcpID0+IHtcbiAgICByZXF1aXJlKCcuLi9jb25maWcvc2xhY2tDb25maWcuanMnKS5jb25maWd1cmUoc2xhY2tDb25maWcpO1xuICB9O1xuICB0aGlzLmNyZWF0ZUFwcCA9ICgpID0+IHtcbiAgICAvLyBjcmVhdGUgYW4gRXhwcmVzcyBhcHBsaWNhdGlvblxuICAgIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcblxuICAgIC8vIHRydXN0IHRoZSBwcm94eSB0byBnZXQgaXAgYWRkcmVzcyBmb3IgdXNcbiAgICBhcHAuZW5hYmxlKCd0cnVzdCBwcm94eScpO1xuXG4gICAgLy8gYWRkIG1pZGRsZXdhcmVcbiAgICBhcHAudXNlKGhlbG1ldCgpKTsgLy8gc2V0IEhUVFAgaGVhZGVycyB0byBwcm90ZWN0IGFnYWluc3Qgd2VsbC1rbm93biB3ZWIgdnVsbmVyYWJpbHRpZXNcbiAgICBhcHAudXNlKGV4cHJlc3Muc3RhdGljKGAke19fZGlybmFtZX0vcHVibGljYCkpOyAvLyAnZXhwcmVzcy5zdGF0aWMnIHRvIHNlcnZlIHN0YXRpYyBmaWxlcyBmcm9tIHB1YmxpYyBkaXJlY3RvcnlcbiAgICBhcHAudXNlKGJvZHlQYXJzZXIuanNvbigpKTsgLy8gJ2JvZHkgcGFyc2VyJyBmb3IgcGFyc2luZyBhcHBsaWNhdGlvbi9qc29uXG4gICAgYXBwLnVzZShib2R5UGFyc2VyLnVybGVuY29kZWQoeyBleHRlbmRlZDogdHJ1ZSB9KSk7IC8vICdib2R5IHBhcnNlcicgZm9yIHBhcnNpbmcgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXG4gICAgYXBwLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHsgIC8vIGN1c3RvbSBsb2dnaW5nIG1pZGRsZXdhcmUgdG8gbG9nIGFsbCBpbmNvbWluZyBodHRwIHJlcXVlc3RzXG4gICAgICBsb2dnZXIudmVyYm9zZShgUmVxdWVzdCBvbiAke3JlcS5vcmlnaW5hbFVybH0gZnJvbSAke3JlcS5pcH1gKTtcbiAgICAgIG5leHQoKTtcbiAgICB9KTtcblxuICAgIC8vIGNvbmZpZ3VyZSBwYXNzcG9ydFxuICAgIHBhc3Nwb3J0LnNlcmlhbGl6ZVVzZXIoc2VyaWFsaXplU3BlZWNoVXNlcik7XG4gICAgcGFzc3BvcnQuZGVzZXJpYWxpemVVc2VyKGRlc2VyaWFsaXplU3BlZWNoVXNlcik7XG4gICAgY29uc3QgbG9jYWxTaWdudXBTdHJhdGVneSA9IHJlcXVpcmUoJy4vcGFzc3BvcnQvbG9jYWwtc2lnbnVwLmpzJyk7XG4gICAgY29uc3QgbG9jYWxMb2dpblN0cmF0ZWd5ID0gcmVxdWlyZSgnLi9wYXNzcG9ydC9sb2NhbC1sb2dpbi5qcycpO1xuICAgIHBhc3Nwb3J0LnVzZSgnbG9jYWwtc2lnbnVwJywgbG9jYWxTaWdudXBTdHJhdGVneSk7XG4gICAgcGFzc3BvcnQudXNlKCdsb2NhbC1sb2dpbicsIGxvY2FsTG9naW5TdHJhdGVneSk7XG4gICAgLy8gaW5pdGlhbGl6ZSBwYXNzcG9ydFxuICAgIGFwcC51c2UoY29va2llU2Vzc2lvbih7XG4gICAgICBuYW1lICA6ICdzZXNzaW9uJyxcbiAgICAgIGtleXMgIDogW3RoaXMuc2Vzc2lvbktleV0sXG4gICAgICBtYXhBZ2U6IDI0ICogNjAgKiA2MCAqIDEwMDAsIC8vIGkuZS4gMjQgaG91cnNcbiAgICB9KSk7XG4gICAgYXBwLnVzZShwYXNzcG9ydC5pbml0aWFsaXplKCkpO1xuICAgIGFwcC51c2UocGFzc3BvcnQuc2Vzc2lvbigpKTtcblxuICAgIC8vIGNvbmZpZ3VyZSBoYW5kbGViYXJzICYgcmVnaXN0ZXIgaXQgd2l0aCBleHByZXNzIGFwcFxuICAgIGNvbnN0IGhicyA9IGV4cHJlc3NIYW5kbGViYXJzLmNyZWF0ZSh7XG4gICAgICBkZWZhdWx0TGF5b3V0OiAnZW1iZWQnLFxuICAgICAgaGFuZGxlYmFycyAgIDogSGFuZGxlYmFycyxcbiAgICB9KTtcbiAgICBhcHAuZW5naW5lKCdoYW5kbGViYXJzJywgaGJzLmVuZ2luZSk7XG4gICAgYXBwLnNldCgndmlldyBlbmdpbmUnLCAnaGFuZGxlYmFycycpO1xuXG4gICAgLy8gc2V0IHRoZSByb3V0ZXMgb24gdGhlIGFwcFxuICAgIHJlcXVpcmUoJy4vcm91dGVzL2F1dGgtcm91dGVzLmpzJykoYXBwKTtcbiAgICByZXF1aXJlKCcuL3JvdXRlcy9hcGktcm91dGVzLmpzJykoYXBwKTtcbiAgICByZXF1aXJlKCcuL3JvdXRlcy9wYWdlLXJvdXRlcy5qcycpKGFwcCk7XG4gICAgcmVxdWlyZSgnLi9yb3V0ZXMvYXNzZXQtcm91dGVzLmpzJykoYXBwKTtcbiAgICByZXF1aXJlKCcuL3JvdXRlcy9mYWxsYmFjay1yb3V0ZXMuanMnKShhcHApO1xuXG4gICAgdGhpcy5hcHAgPSBhcHA7XG4gIH07XG4gIHRoaXMuaW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICByZXF1aXJlKCcuL2hlbHBlcnMvY29uZmlndXJlTG9nZ2VyLmpzJykobG9nZ2VyKTtcbiAgICByZXF1aXJlKCcuL2hlbHBlcnMvY29uZmlndXJlU2xhY2suanMnKShsb2dnZXIpO1xuICAgIHRoaXMuY3JlYXRlQXBwKCk7XG4gICAgdGhpcy5zZXJ2ZXIgPSBodHRwLlNlcnZlcih0aGlzLmFwcCk7XG4gIH07XG4gIHRoaXMuc3RhcnQgPSAoKSA9PiB7XG4gICAgY29uc3QgZGIgPSByZXF1aXJlKCcuL21vZGVscy9pbmRleCcpO1xuICAgIC8vIHN5bmMgc2VxdWVsaXplXG4gICAgZGIuc2VxdWVsaXplLnN5bmMoKVxuICAgICAgLy8gc3RhcnQgdGhlIHNlcnZlclxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnNlcnZlci5saXN0ZW4odGhpcy5QT1JULCAoKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFNlcnZlciBpcyBsaXN0ZW5pbmcgb24gUE9SVCAke3RoaXMuUE9SVH1gKTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFN0YXJ0dXAgRXJyb3I6YCwgZXJyb3IpO1xuICAgICAgfSk7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNlcnZlcjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9zZXJ2ZXIuanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJleHByZXNzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiZXhwcmVzc1wiXG4vLyBtb2R1bGUgaWQgPSA2MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib2R5LXBhcnNlclwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcImJvZHktcGFyc2VyXCJcbi8vIG1vZHVsZSBpZCA9IDYxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImV4cHJlc3MtaGFuZGxlYmFyc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcImV4cHJlc3MtaGFuZGxlYmFyc1wiXG4vLyBtb2R1bGUgaWQgPSA2MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJoYW5kbGViYXJzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiaGFuZGxlYmFyc1wiXG4vLyBtb2R1bGUgaWQgPSA2M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJoZWxtZXRcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJoZWxtZXRcIlxuLy8gbW9kdWxlIGlkID0gNjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2VyaWFsaXplU3BlZWNoVXNlciAodXNlciwgZG9uZSkgeyAgLy8gcmV0dXJucyB1c2VyIGRhdGEgdG8gYmUgc2VyaWFsaXplZCBpbnRvIHNlc3Npb25cbiAgICBsb2dnZXIuZGVidWcoJ3NlcmlhbGl6aW5nIHVzZXInKTtcbiAgICBkb25lKG51bGwsIHVzZXIpO1xuICB9LFxuICBkZXNlcmlhbGl6ZVNwZWVjaFVzZXIgKHVzZXIsIGRvbmUpIHsgIC8vIGRlc2VyaWFsaXplcyBzZXNzaW9uIGFuZCBwb3B1bGF0ZXMgYWRkaXRpb25hbCBpbmZvIHRvIHJlcS51c2VyXG4gICAgbG9nZ2VyLmRlYnVnKCdkZXNlcmlhbGl6aW5nIHVzZXInKTtcbiAgICBkb25lKG51bGwsIHVzZXIpO1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9oZWxwZXJzL2F1dGhIZWxwZXJzLmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29va2llLXNlc3Npb25cIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJjb29raWUtc2Vzc2lvblwiXG4vLyBtb2R1bGUgaWQgPSA2NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJodHRwXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiaHR0cFwiXG4vLyBtb2R1bGUgaWQgPSA2N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJjb25zdCBQYXNzcG9ydExvY2FsU3RyYXRlZ3kgPSByZXF1aXJlKCdwYXNzcG9ydC1sb2NhbCcpLlN0cmF0ZWd5O1xuY29uc3QgbGJyeUFwaSA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvbGJyeUFwaS5qcycpO1xuY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuY29uc3QgZGIgPSByZXF1aXJlKCcuLi9tb2RlbHMvaW5kZXgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgUGFzc3BvcnRMb2NhbFN0cmF0ZWd5KFxuICB7XG4gICAgdXNlcm5hbWVGaWVsZDogJ3VzZXJuYW1lJyxcbiAgICBwYXNzd29yZEZpZWxkOiAncGFzc3dvcmQnLFxuICB9LFxuICAodXNlcm5hbWUsIHBhc3N3b3JkLCBkb25lKSA9PiB7XG4gICAgbG9nZ2VyLnZlcmJvc2UoYG5ldyBjaGFubmVsIHNpZ251cCByZXF1ZXN0LiB1c2VyOiAke3VzZXJuYW1lfSBwYXNzOiAke3Bhc3N3b3JkfSAuYCk7XG4gICAgbGV0IHVzZXJJbmZvID0ge307XG4gICAgLy8gc2VydmVyLXNpZGUgdmFsaWRhdG9uIG9mIGlucHV0cyAodXNlcm5hbWUsIHBhc3N3b3JkKVxuXG4gICAgLy8gY3JlYXRlIHRoZSBjaGFubmVsIGFuZCByZXRyaWV2ZSB0aGUgbWV0YWRhdGFcbiAgICByZXR1cm4gbGJyeUFwaS5jcmVhdGVDaGFubmVsKGBAJHt1c2VybmFtZX1gKVxuICAgICAgLnRoZW4odHggPT4ge1xuICAgICAgICAvLyBjcmVhdGUgdXNlciByZWNvcmRcbiAgICAgICAgY29uc3QgdXNlckRhdGEgPSB7XG4gICAgICAgICAgdXNlck5hbWU6IHVzZXJuYW1lLFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgICAgfTtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoJ3VzZXJEYXRhID4nLCB1c2VyRGF0YSk7XG4gICAgICAgIC8vIGNyZWF0ZSB1c2VyIHJlY29yZFxuICAgICAgICBjb25zdCBjaGFubmVsRGF0YSA9IHtcbiAgICAgICAgICBjaGFubmVsTmFtZSAgIDogYEAke3VzZXJuYW1lfWAsXG4gICAgICAgICAgY2hhbm5lbENsYWltSWQ6IHR4LmNsYWltX2lkLFxuICAgICAgICB9O1xuICAgICAgICBsb2dnZXIudmVyYm9zZSgnY2hhbm5lbERhdGEgPicsIGNoYW5uZWxEYXRhKTtcbiAgICAgICAgLy8gY3JlYXRlIGNlcnRpZmljYXRlIHJlY29yZFxuICAgICAgICBjb25zdCBjZXJ0aWZpY2F0ZURhdGEgPSB7XG4gICAgICAgICAgY2xhaW1JZDogdHguY2xhaW1faWQsXG4gICAgICAgICAgbmFtZSAgIDogYEAke3VzZXJuYW1lfWAsXG4gICAgICAgICAgLy8gYWRkcmVzcyxcbiAgICAgICAgfTtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoJ2NlcnRpZmljYXRlRGF0YSA+JywgY2VydGlmaWNhdGVEYXRhKTtcbiAgICAgICAgLy8gc2F2ZSB1c2VyIGFuZCBjZXJ0aWZpY2F0ZSB0byBkYlxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW2RiLlVzZXIuY3JlYXRlKHVzZXJEYXRhKSwgZGIuQ2hhbm5lbC5jcmVhdGUoY2hhbm5lbERhdGEpLCBkYi5DZXJ0aWZpY2F0ZS5jcmVhdGUoY2VydGlmaWNhdGVEYXRhKV0pO1xuICAgICAgfSlcbiAgICAgIC50aGVuKChbbmV3VXNlciwgbmV3Q2hhbm5lbCwgbmV3Q2VydGlmaWNhdGVdKSA9PiB7XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKCd1c2VyIGFuZCBjZXJ0aWZpY2F0ZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCcpO1xuICAgICAgICAvLyBzdG9yZSB0aGUgcmVsZXZhbnQgbmV3VXNlciBpbmZvIHRvIGJlIHBhc3NlZCBiYWNrIGZvciByZXEuVXNlclxuICAgICAgICB1c2VySW5mb1snaWQnXSA9IG5ld1VzZXIuaWQ7XG4gICAgICAgIHVzZXJJbmZvWyd1c2VyTmFtZSddID0gbmV3VXNlci51c2VyTmFtZTtcbiAgICAgICAgdXNlckluZm9bJ2NoYW5uZWxOYW1lJ10gPSBuZXdDaGFubmVsLmNoYW5uZWxOYW1lO1xuICAgICAgICB1c2VySW5mb1snY2hhbm5lbENsYWltSWQnXSA9IG5ld0NoYW5uZWwuY2hhbm5lbENsYWltSWQ7XG4gICAgICAgIC8vIGFzc29jaWF0ZSB0aGUgaW5zdGFuY2VzXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbbmV3Q2VydGlmaWNhdGUuc2V0Q2hhbm5lbChuZXdDaGFubmVsKSwgbmV3Q2hhbm5lbC5zZXRVc2VyKG5ld1VzZXIpXSk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBsb2dnZXIudmVyYm9zZSgndXNlciBhbmQgY2VydGlmaWNhdGUgc3VjY2Vzc2Z1bGx5IGFzc29jaWF0ZWQnKTtcbiAgICAgICAgcmV0dXJuIGRiLkNlcnRpZmljYXRlLmdldFNob3J0Q2hhbm5lbElkRnJvbUxvbmdDaGFubmVsSWQodXNlckluZm8uY2hhbm5lbENsYWltSWQsIHVzZXJJbmZvLmNoYW5uZWxOYW1lKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihzaG9ydENoYW5uZWxJZCA9PiB7XG4gICAgICAgIHVzZXJJbmZvWydzaG9ydENoYW5uZWxJZCddID0gc2hvcnRDaGFubmVsSWQ7XG4gICAgICAgIHJldHVybiBkb25lKG51bGwsIHVzZXJJbmZvKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ3NpZ251cCBlcnJvcicsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIGRvbmUoZXJyb3IpO1xuICAgICAgfSk7XG4gIH1cbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvcGFzc3BvcnQvbG9jYWwtc2lnbnVwLmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYXhpb3NcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJheGlvc1wiXG4vLyBtb2R1bGUgaWQgPSA2OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJjb25zdCBsYnJ5Q29uZmlnID0ge1xuICBhcGk6IHtcbiAgICBhcGlIb3N0OiAnbG9jYWxob3N0JyxcbiAgICBhcGlQb3J0OiAnNTI3OScsXG4gIH0sXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxicnlDb25maWc7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jb25maWcvbGJyeUNvbmZpZy5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInVuaXZlcnNhbC1hbmFseXRpY3NcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJ1bml2ZXJzYWwtYW5hbHl0aWNzXCJcbi8vIG1vZHVsZSBpZCA9IDcxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcbmNvbnN0IHsgcmV0dXJuU2hvcnRJZCB9ID0gcmVxdWlyZSgnLi4vaGVscGVycy9zZXF1ZWxpemVIZWxwZXJzLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKHNlcXVlbGl6ZSwgeyBTVFJJTkcsIEJPT0xFQU4sIElOVEVHRVIsIFRFWFQsIERFQ0lNQUwgfSkgPT4ge1xuICBjb25zdCBDZXJ0aWZpY2F0ZSA9IHNlcXVlbGl6ZS5kZWZpbmUoXG4gICAgJ0NlcnRpZmljYXRlJyxcbiAgICB7XG4gICAgICBhZGRyZXNzOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBhbW91bnQ6IHtcbiAgICAgICAgdHlwZSAgIDogREVDSU1BTCgxOSwgOCksXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgY2xhaW1JZDoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgY2xhaW1TZXF1ZW5jZToge1xuICAgICAgICB0eXBlICAgOiBJTlRFR0VSLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGRlY29kZWRDbGFpbToge1xuICAgICAgICB0eXBlICAgOiBCT09MRUFOLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGRlcHRoOiB7XG4gICAgICAgIHR5cGUgICA6IElOVEVHRVIsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgZWZmZWN0aXZlQW1vdW50OiB7XG4gICAgICAgIHR5cGUgICA6IERFQ0lNQUwoMTksIDgpLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGhhc1NpZ25hdHVyZToge1xuICAgICAgICB0eXBlICAgOiBCT09MRUFOLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGhlaWdodDoge1xuICAgICAgICB0eXBlICAgOiBJTlRFR0VSLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGhleDoge1xuICAgICAgICB0eXBlICAgOiBURVhUKCdsb25nJyksXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgbmFtZToge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgbm91dDoge1xuICAgICAgICB0eXBlICAgOiBJTlRFR0VSLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHR4aWQ6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHZhbGlkQXRIZWlnaHQ6IHtcbiAgICAgICAgdHlwZSAgIDogSU5URUdFUixcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBvdXRwb2ludDoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdmFsdWVWZXJzaW9uOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBjbGFpbVR5cGU6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGNlcnRpZmljYXRlVmVyc2lvbjoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAga2V5VHlwZToge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgcHVibGljS2V5OiB7XG4gICAgICAgIHR5cGUgICA6IFRFWFQoJ2xvbmcnKSxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBmcmVlemVUYWJsZU5hbWU6IHRydWUsXG4gICAgfVxuICApO1xuXG4gIENlcnRpZmljYXRlLmFzc29jaWF0ZSA9IGRiID0+IHtcbiAgICBDZXJ0aWZpY2F0ZS5iZWxvbmdzVG8oZGIuQ2hhbm5lbCwge1xuICAgICAgZm9yZWlnbktleToge1xuICAgICAgICBhbGxvd051bGw6IHRydWUsXG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xuXG4gIENlcnRpZmljYXRlLmdldFNob3J0Q2hhbm5lbElkRnJvbUxvbmdDaGFubmVsSWQgPSBmdW5jdGlvbiAobG9uZ0NoYW5uZWxJZCwgY2hhbm5lbE5hbWUpIHtcbiAgICBsb2dnZXIuZGVidWcoYGdldFNob3J0Q2hhbm5lbElkRnJvbUxvbmdDaGFubmVsSWQgJHtjaGFubmVsTmFtZX06JHtsb25nQ2hhbm5lbElkfWApO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzXG4gICAgICAgIC5maW5kQWxsKHtcbiAgICAgICAgICB3aGVyZToge25hbWU6IGNoYW5uZWxOYW1lfSxcbiAgICAgICAgICBvcmRlcjogW1snaGVpZ2h0JywgJ0FTQyddXSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBjaGFubmVsKHMpIGZvdW5kIHdpdGggdGhhdCBjaGFubmVsIG5hbWUnKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJldHVyblNob3J0SWQocmVzdWx0LCBsb25nQ2hhbm5lbElkKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIENlcnRpZmljYXRlLmdldExvbmdDaGFubmVsSWRGcm9tU2hvcnRDaGFubmVsSWQgPSBmdW5jdGlvbiAoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBnZXRMb25nQ2hhbm5lbElkRnJvbVNob3J0Q2hhbm5lbElkKCR7Y2hhbm5lbE5hbWV9LCAke2NoYW5uZWxDbGFpbUlkfSlgKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpc1xuICAgICAgICAuZmluZEFsbCh7XG4gICAgICAgICAgd2hlcmU6IHtcbiAgICAgICAgICAgIG5hbWUgICA6IGNoYW5uZWxOYW1lLFxuICAgICAgICAgICAgY2xhaW1JZDoge1xuICAgICAgICAgICAgICAkbGlrZTogYCR7Y2hhbm5lbENsYWltSWR9JWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgb3JkZXI6IFtbJ2hlaWdodCcsICdBU0MnXV0sXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgc3dpdGNoIChyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgZGVmYXVsdDogLy8gbm90ZSByZXN1bHRzIG11c3QgYmUgc29ydGVkXG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJlc3VsdFswXS5jbGFpbUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgQ2VydGlmaWNhdGUuZ2V0TG9uZ0NoYW5uZWxJZEZyb21DaGFubmVsTmFtZSA9IGZ1bmN0aW9uIChjaGFubmVsTmFtZSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgZ2V0TG9uZ0NoYW5uZWxJZEZyb21DaGFubmVsTmFtZSgke2NoYW5uZWxOYW1lfSlgKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpc1xuICAgICAgICAuZmluZEFsbCh7XG4gICAgICAgICAgd2hlcmU6IHsgbmFtZTogY2hhbm5lbE5hbWUgfSxcbiAgICAgICAgICBvcmRlcjogW1snZWZmZWN0aXZlQW1vdW50JywgJ0RFU0MnXSwgWydoZWlnaHQnLCAnQVNDJ11dLFxuICAgICAgICB9KVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIHN3aXRjaCAocmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJlc3VsdFswXS5jbGFpbUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgQ2VydGlmaWNhdGUudmFsaWRhdGVMb25nQ2hhbm5lbElkID0gZnVuY3Rpb24gKG5hbWUsIGNsYWltSWQpIHtcbiAgICBsb2dnZXIuZGVidWcoYHZhbGlkYXRlTG9uZ0NoYW5uZWxJZCgke25hbWV9LCAke2NsYWltSWR9KWApO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmZpbmRPbmUoe1xuICAgICAgICB3aGVyZToge25hbWUsIGNsYWltSWR9LFxuICAgICAgfSlcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXNvbHZlKGNsYWltSWQpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIENlcnRpZmljYXRlLmdldExvbmdDaGFubmVsSWQgPSBmdW5jdGlvbiAoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBnZXRMb25nQ2hhbm5lbElkKCR7Y2hhbm5lbE5hbWV9LCAke2NoYW5uZWxDbGFpbUlkfSlgKTtcbiAgICBpZiAoY2hhbm5lbENsYWltSWQgJiYgKGNoYW5uZWxDbGFpbUlkLmxlbmd0aCA9PT0gNDApKSB7ICAvLyBpZiBhIGZ1bGwgY2hhbm5lbCBpZCBpcyBwcm92aWRlZFxuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVMb25nQ2hhbm5lbElkKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCk7XG4gICAgfSBlbHNlIGlmIChjaGFubmVsQ2xhaW1JZCAmJiBjaGFubmVsQ2xhaW1JZC5sZW5ndGggPCA0MCkgeyAgLy8gaWYgYSBzaG9ydCBjaGFubmVsIGlkIGlzIHByb3ZpZGVkXG4gICAgICByZXR1cm4gdGhpcy5nZXRMb25nQ2hhbm5lbElkRnJvbVNob3J0Q2hhbm5lbElkKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmdldExvbmdDaGFubmVsSWRGcm9tQ2hhbm5lbE5hbWUoY2hhbm5lbE5hbWUpOyAgLy8gaWYgbm8gY2hhbm5lbCBpZCBwcm92aWRlZFxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gQ2VydGlmaWNhdGU7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL21vZGVscy9jZXJ0aWZpY2F0ZS5qcyIsIm1vZHVsZS5leHBvcnRzID0gKHNlcXVlbGl6ZSwgeyBTVFJJTkcgfSkgPT4ge1xuICBjb25zdCBDaGFubmVsID0gc2VxdWVsaXplLmRlZmluZShcbiAgICAnQ2hhbm5lbCcsXG4gICAge1xuICAgICAgY2hhbm5lbE5hbWU6IHtcbiAgICAgICAgdHlwZSAgICAgOiBTVFJJTkcsXG4gICAgICAgIGFsbG93TnVsbDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgY2hhbm5lbENsYWltSWQ6IHtcbiAgICAgICAgdHlwZSAgICAgOiBTVFJJTkcsXG4gICAgICAgIGFsbG93TnVsbDogZmFsc2UsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgZnJlZXplVGFibGVOYW1lOiB0cnVlLFxuICAgIH1cbiAgKTtcblxuICBDaGFubmVsLmFzc29jaWF0ZSA9IGRiID0+IHtcbiAgICBDaGFubmVsLmJlbG9uZ3NUbyhkYi5Vc2VyKTtcbiAgICBDaGFubmVsLmhhc09uZShkYi5DZXJ0aWZpY2F0ZSk7XG4gIH07XG5cbiAgcmV0dXJuIENoYW5uZWw7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL21vZGVscy9jaGFubmVsLmpzIiwiY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuY29uc3QgeyByZXR1cm5TaG9ydElkIH0gPSByZXF1aXJlKCcuLi9oZWxwZXJzL3NlcXVlbGl6ZUhlbHBlcnMuanMnKTtcbmNvbnN0IHsgYXNzZXREZWZhdWx0czogeyB0aHVtYm5haWw6IGRlZmF1bHRUaHVtYm5haWwgfSwgZGV0YWlsczogeyBob3N0IH0gfSA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZy9zaXRlQ29uZmlnLmpzJyk7XG5cbmZ1bmN0aW9uIGRldGVybWluZUZpbGVFeHRlbnNpb25Gcm9tQ29udGVudFR5cGUgKGNvbnRlbnRUeXBlKSB7XG4gIHN3aXRjaCAoY29udGVudFR5cGUpIHtcbiAgICBjYXNlICdpbWFnZS9qcGVnJzpcbiAgICBjYXNlICdpbWFnZS9qcGcnOlxuICAgICAgcmV0dXJuICdqcGVnJztcbiAgICBjYXNlICdpbWFnZS9wbmcnOlxuICAgICAgcmV0dXJuICdwbmcnO1xuICAgIGNhc2UgJ2ltYWdlL2dpZic6XG4gICAgICByZXR1cm4gJ2dpZic7XG4gICAgY2FzZSAndmlkZW8vbXA0JzpcbiAgICAgIHJldHVybiAnbXA0JztcbiAgICBkZWZhdWx0OlxuICAgICAgbG9nZ2VyLmRlYnVnKCdzZXR0aW5nIHVua25vd24gZmlsZSB0eXBlIGFzIGZpbGUgZXh0ZW5zaW9uIGpwZWcnKTtcbiAgICAgIHJldHVybiAnanBlZyc7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGRldGVybWluZVRodW1ibmFpbCAoc3RvcmVkVGh1bWJuYWlsLCBkZWZhdWx0VGh1bWJuYWlsKSB7XG4gIGlmIChzdG9yZWRUaHVtYm5haWwgPT09ICcnKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRUaHVtYm5haWw7XG4gIH1cbiAgcmV0dXJuIHN0b3JlZFRodW1ibmFpbDtcbn07XG5cbmZ1bmN0aW9uIHByZXBhcmVDbGFpbURhdGEgKGNsYWltKSB7XG4gIC8vIGxvZ2dlci5kZWJ1ZygncHJlcGFyaW5nIGNsYWltIGRhdGEgYmFzZWQgb24gcmVzb2x2ZWQgZGF0YTonLCBjbGFpbSk7XG4gIGNsYWltWyd0aHVtYm5haWwnXSA9IGRldGVybWluZVRodW1ibmFpbChjbGFpbS50aHVtYm5haWwsIGRlZmF1bHRUaHVtYm5haWwpO1xuICBjbGFpbVsnZmlsZUV4dCddID0gZGV0ZXJtaW5lRmlsZUV4dGVuc2lvbkZyb21Db250ZW50VHlwZShjbGFpbS5jb250ZW50VHlwZSk7XG4gIGNsYWltWydob3N0J10gPSBob3N0O1xuICByZXR1cm4gY2xhaW07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IChzZXF1ZWxpemUsIHsgU1RSSU5HLCBCT09MRUFOLCBJTlRFR0VSLCBURVhULCBERUNJTUFMIH0pID0+IHtcbiAgY29uc3QgQ2xhaW0gPSBzZXF1ZWxpemUuZGVmaW5lKFxuICAgICdDbGFpbScsXG4gICAge1xuICAgICAgYWRkcmVzczoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgYW1vdW50OiB7XG4gICAgICAgIHR5cGUgICA6IERFQ0lNQUwoMTksIDgpLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGNsYWltSWQ6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGNsYWltU2VxdWVuY2U6IHtcbiAgICAgICAgdHlwZSAgIDogSU5URUdFUixcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBkZWNvZGVkQ2xhaW06IHtcbiAgICAgICAgdHlwZSAgIDogQk9PTEVBTixcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBkZXB0aDoge1xuICAgICAgICB0eXBlICAgOiBJTlRFR0VSLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGVmZmVjdGl2ZUFtb3VudDoge1xuICAgICAgICB0eXBlICAgOiBERUNJTUFMKDE5LCA4KSxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBoYXNTaWduYXR1cmU6IHtcbiAgICAgICAgdHlwZSAgIDogQk9PTEVBTixcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBoZWlnaHQ6IHtcbiAgICAgICAgdHlwZSAgIDogSU5URUdFUixcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBoZXg6IHtcbiAgICAgICAgdHlwZSAgIDogVEVYVCgnbG9uZycpLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIG5hbWU6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIG5vdXQ6IHtcbiAgICAgICAgdHlwZSAgIDogSU5URUdFUixcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICB0eGlkOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICB2YWxpZEF0SGVpZ2h0OiB7XG4gICAgICAgIHR5cGUgICA6IElOVEVHRVIsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgb3V0cG9pbnQ6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGNsYWltVHlwZToge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgY2VydGlmaWNhdGVJZDoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgYXV0aG9yOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBkZXNjcmlwdGlvbjoge1xuICAgICAgICB0eXBlICAgOiBURVhUKCdsb25nJyksXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgbGFuZ3VhZ2U6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGxpY2Vuc2U6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGxpY2Vuc2VVcmw6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIG5zZnc6IHtcbiAgICAgICAgdHlwZSAgIDogQk9PTEVBTixcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBwcmV2aWV3OiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICB0aHVtYm5haWw6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHRpdGxlOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBtZXRhZGF0YVZlcnNpb246IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGNvbnRlbnRUeXBlOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBzb3VyY2U6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHNvdXJjZVR5cGU6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHNvdXJjZVZlcnNpb246IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHN0cmVhbVZlcnNpb246IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHZhbHVlVmVyc2lvbjoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgY2hhbm5lbE5hbWU6IHtcbiAgICAgICAgdHlwZSAgICAgOiBTVFJJTkcsXG4gICAgICAgIGFsbG93TnVsbDogdHJ1ZSxcbiAgICAgICAgZGVmYXVsdCAgOiBudWxsLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGZyZWV6ZVRhYmxlTmFtZTogdHJ1ZSxcbiAgICB9XG4gICk7XG5cbiAgQ2xhaW0uYXNzb2NpYXRlID0gZGIgPT4ge1xuICAgIENsYWltLmJlbG9uZ3NUbyhkYi5GaWxlLCB7XG4gICAgICBmb3JlaWduS2V5OiB7XG4gICAgICAgIGFsbG93TnVsbDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG5cbiAgQ2xhaW0uZ2V0U2hvcnRDbGFpbUlkRnJvbUxvbmdDbGFpbUlkID0gZnVuY3Rpb24gKGNsYWltSWQsIGNsYWltTmFtZSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgQ2xhaW0uZ2V0U2hvcnRDbGFpbUlkRnJvbUxvbmdDbGFpbUlkIGZvciAke2NsYWltTmFtZX0jJHtjbGFpbUlkfWApO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzXG4gICAgICAgIC5maW5kQWxsKHtcbiAgICAgICAgICB3aGVyZTogeyBuYW1lOiBjbGFpbU5hbWUgfSxcbiAgICAgICAgICBvcmRlcjogW1snaGVpZ2h0JywgJ0FTQyddXSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBjbGFpbShzKSBmb3VuZCB3aXRoIHRoYXQgY2xhaW0gbmFtZScpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5TaG9ydElkKHJlc3VsdCwgY2xhaW1JZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBDbGFpbS5nZXRBbGxDaGFubmVsQ2xhaW1zID0gZnVuY3Rpb24gKGNoYW5uZWxDbGFpbUlkKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBDbGFpbS5nZXRBbGxDaGFubmVsQ2xhaW1zIGZvciAke2NoYW5uZWxDbGFpbUlkfWApO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzXG4gICAgICAgIC5maW5kQWxsKHtcbiAgICAgICAgICB3aGVyZTogeyBjZXJ0aWZpY2F0ZUlkOiBjaGFubmVsQ2xhaW1JZCB9LFxuICAgICAgICAgIG9yZGVyOiBbWydoZWlnaHQnLCAnQVNDJ11dLFxuICAgICAgICAgIHJhdyAgOiB0cnVlLCAgLy8gcmV0dXJucyBhbiBhcnJheSBvZiBvbmx5IGRhdGEsIG5vdCBhbiBhcnJheSBvZiBpbnN0YW5jZXNcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oY2hhbm5lbENsYWltc0FycmF5ID0+IHtcbiAgICAgICAgICAvLyBsb2dnZXIuZGVidWcoJ2NoYW5uZWxjbGFpbXNhcnJheSBsZW5ndGg6JywgY2hhbm5lbENsYWltc0FycmF5Lmxlbmd0aCk7XG4gICAgICAgICAgc3dpdGNoIChjaGFubmVsQ2xhaW1zQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgY2hhbm5lbENsYWltc0FycmF5LmZvckVhY2goY2xhaW0gPT4ge1xuICAgICAgICAgICAgICAgIGNsYWltWydmaWxlRXh0J10gPSBkZXRlcm1pbmVGaWxlRXh0ZW5zaW9uRnJvbUNvbnRlbnRUeXBlKGNsYWltLmNvbnRlbnRUeXBlKTtcbiAgICAgICAgICAgICAgICBjbGFpbVsndGh1bWJuYWlsJ10gPSBkZXRlcm1pbmVUaHVtYm5haWwoY2xhaW0udGh1bWJuYWlsLCBkZWZhdWx0VGh1bWJuYWlsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhaW07XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShjaGFubmVsQ2xhaW1zQXJyYXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBDbGFpbS5nZXRDbGFpbUlkQnlMb25nQ2hhbm5lbElkID0gZnVuY3Rpb24gKGNoYW5uZWxDbGFpbUlkLCBjbGFpbU5hbWUpIHtcbiAgICBsb2dnZXIuZGVidWcoYGZpbmRpbmcgY2xhaW0gaWQgZm9yIGNsYWltICR7Y2xhaW1OYW1lfSBmcm9tIGNoYW5uZWwgJHtjaGFubmVsQ2xhaW1JZH1gKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpc1xuICAgICAgICAuZmluZEFsbCh7XG4gICAgICAgICAgd2hlcmU6IHsgbmFtZTogY2xhaW1OYW1lLCBjZXJ0aWZpY2F0ZUlkOiBjaGFubmVsQ2xhaW1JZCB9LFxuICAgICAgICAgIG9yZGVyOiBbWydpZCcsICdBU0MnXV0sXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgc3dpdGNoIChyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXN1bHRbMF0uY2xhaW1JZCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYCR7cmVzdWx0Lmxlbmd0aH0gcmVjb3JkcyBmb3VuZCBmb3IgXCIke2NsYWltTmFtZX1cIiBpbiBjaGFubmVsIFwiJHtjaGFubmVsQ2xhaW1JZH1cImApO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXN1bHRbMF0uY2xhaW1JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIENsYWltLmdldExvbmdDbGFpbUlkRnJvbVNob3J0Q2xhaW1JZCA9IGZ1bmN0aW9uIChuYW1lLCBzaG9ydElkKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXNcbiAgICAgICAgLmZpbmRBbGwoe1xuICAgICAgICAgIHdoZXJlOiB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgY2xhaW1JZDoge1xuICAgICAgICAgICAgICAkbGlrZTogYCR7c2hvcnRJZH0lYCxcbiAgICAgICAgICAgIH19LFxuICAgICAgICAgIG9yZGVyOiBbWydoZWlnaHQnLCAnQVNDJ11dLFxuICAgICAgICB9KVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIHN3aXRjaCAocmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6IC8vIG5vdGUgcmVzdWx0cyBtdXN0IGJlIHNvcnRlZFxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXN1bHRbMF0uY2xhaW1JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIENsYWltLmdldFRvcEZyZWVDbGFpbUlkQnlDbGFpbU5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzXG4gICAgICAgIC5maW5kQWxsKHtcbiAgICAgICAgICB3aGVyZTogeyBuYW1lIH0sXG4gICAgICAgICAgb3JkZXI6IFtbJ2VmZmVjdGl2ZUFtb3VudCcsICdERVNDJ10sIFsnaGVpZ2h0JywgJ0FTQyddXSwgIC8vIG5vdGU6IG1heWJlIGhlaWdodCBhbmQgZWZmZWN0aXZlIGFtb3VudCBuZWVkIHRvIHN3aXRjaD9cbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ2xlbmd0aCBvZiByZXN1bHQnLCByZXN1bHQubGVuZ3RoKTtcbiAgICAgICAgICBzd2l0Y2ggKHJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXN1bHRbMF0uZGF0YVZhbHVlcy5jbGFpbUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgQ2xhaW0udmFsaWRhdGVMb25nQ2xhaW1JZCA9IGZ1bmN0aW9uIChuYW1lLCBjbGFpbUlkKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZmluZE9uZSh7XG4gICAgICAgIHdoZXJlOiB7bmFtZSwgY2xhaW1JZH0sXG4gICAgICB9KVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJlc29sdmUoY2xhaW1JZCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgQ2xhaW0uZ2V0TG9uZ0NsYWltSWQgPSBmdW5jdGlvbiAoY2xhaW1OYW1lLCBjbGFpbUlkKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBnZXRMb25nQ2xhaW1JZCgke2NsYWltTmFtZX0sICR7Y2xhaW1JZH0pYCk7XG4gICAgaWYgKGNsYWltSWQgJiYgKGNsYWltSWQubGVuZ3RoID09PSA0MCkpIHsgIC8vIGlmIGEgZnVsbCBjbGFpbSBpZCBpcyBwcm92aWRlZFxuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVMb25nQ2xhaW1JZChjbGFpbU5hbWUsIGNsYWltSWQpO1xuICAgIH0gZWxzZSBpZiAoY2xhaW1JZCAmJiBjbGFpbUlkLmxlbmd0aCA8IDQwKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRMb25nQ2xhaW1JZEZyb21TaG9ydENsYWltSWQoY2xhaW1OYW1lLCBjbGFpbUlkKTsgIC8vIGlmIGEgc2hvcnQgY2xhaW0gaWQgaXMgcHJvdmlkZWRcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9wRnJlZUNsYWltSWRCeUNsYWltTmFtZShjbGFpbU5hbWUpOyAgLy8gaWYgbm8gY2xhaW0gaWQgaXMgcHJvdmlkZWRcbiAgICB9XG4gIH07XG5cbiAgQ2xhaW0ucmVzb2x2ZUNsYWltID0gZnVuY3Rpb24gKG5hbWUsIGNsYWltSWQpIHtcbiAgICBsb2dnZXIuZGVidWcoYENsYWltLnJlc29sdmVDbGFpbTogJHtuYW1lfSAke2NsYWltSWR9YCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXNcbiAgICAgICAgLmZpbmRBbGwoe1xuICAgICAgICAgIHdoZXJlOiB7IG5hbWUsIGNsYWltSWQgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oY2xhaW1BcnJheSA9PiB7XG4gICAgICAgICAgc3dpdGNoIChjbGFpbUFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocHJlcGFyZUNsYWltRGF0YShjbGFpbUFycmF5WzBdLmRhdGFWYWx1ZXMpKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgbW9yZSB0aGFuIG9uZSByZWNvcmQgbWF0Y2hlcyAke25hbWV9IyR7Y2xhaW1JZH0gaW4gZGIuQ2xhaW1gKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocHJlcGFyZUNsYWltRGF0YShjbGFpbUFycmF5WzBdLmRhdGFWYWx1ZXMpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIENsYWltO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9tb2RlbHMvY2xhaW0uanMiLCJtb2R1bGUuZXhwb3J0cyA9IChzZXF1ZWxpemUsIHsgU1RSSU5HLCBCT09MRUFOLCBJTlRFR0VSIH0pID0+IHtcbiAgY29uc3QgRmlsZSA9IHNlcXVlbGl6ZS5kZWZpbmUoXG4gICAgJ0ZpbGUnLFxuICAgIHtcbiAgICAgIG5hbWU6IHtcbiAgICAgICAgdHlwZSAgICAgOiBTVFJJTkcsXG4gICAgICAgIGFsbG93TnVsbDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgY2xhaW1JZDoge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBhZGRyZXNzOiB7XG4gICAgICAgIHR5cGUgICAgIDogU1RSSU5HLFxuICAgICAgICBhbGxvd051bGw6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIG91dHBvaW50OiB7XG4gICAgICAgIHR5cGUgICAgIDogU1RSSU5HLFxuICAgICAgICBhbGxvd051bGw6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGhlaWdodDoge1xuICAgICAgICB0eXBlICAgICA6IElOVEVHRVIsXG4gICAgICAgIGFsbG93TnVsbDogZmFsc2UsXG4gICAgICAgIGRlZmF1bHQgIDogMCxcbiAgICAgIH0sXG4gICAgICBmaWxlTmFtZToge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBmaWxlUGF0aDoge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBmaWxlVHlwZToge1xuICAgICAgICB0eXBlOiBTVFJJTkcsXG4gICAgICB9LFxuICAgICAgbnNmdzoge1xuICAgICAgICB0eXBlICAgICAgICA6IEJPT0xFQU4sXG4gICAgICAgIGFsbG93TnVsbCAgIDogZmFsc2UsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgdHJlbmRpbmdFbGlnaWJsZToge1xuICAgICAgICB0eXBlICAgICAgICA6IEJPT0xFQU4sXG4gICAgICAgIGFsbG93TnVsbCAgIDogZmFsc2UsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBmcmVlemVUYWJsZU5hbWU6IHRydWUsXG4gICAgfVxuICApO1xuXG4gIEZpbGUuYXNzb2NpYXRlID0gZGIgPT4ge1xuICAgIEZpbGUuaGFzTWFueShkYi5SZXF1ZXN0KTtcbiAgICBGaWxlLmhhc09uZShkYi5DbGFpbSk7XG4gIH07XG5cbiAgRmlsZS5nZXRSZWNlbnRDbGFpbXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluZEFsbCh7XG4gICAgICB3aGVyZTogeyBuc2Z3OiBmYWxzZSwgdHJlbmRpbmdFbGlnaWJsZTogdHJ1ZSB9LFxuICAgICAgb3JkZXI6IFtbJ2NyZWF0ZWRBdCcsICdERVNDJ11dLFxuICAgICAgbGltaXQ6IDI1LFxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBGaWxlO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9tb2RlbHMvZmlsZS5qcyIsIm1vZHVsZS5leHBvcnRzID0gKHNlcXVlbGl6ZSwgeyBTVFJJTkcsIEJPT0xFQU4sIFRFWFQgfSkgPT4ge1xuICBjb25zdCBSZXF1ZXN0ID0gc2VxdWVsaXplLmRlZmluZShcbiAgICAnUmVxdWVzdCcsXG4gICAge1xuICAgICAgYWN0aW9uOiB7XG4gICAgICAgIHR5cGUgICAgIDogU1RSSU5HLFxuICAgICAgICBhbGxvd051bGw6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHVybDoge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBpcEFkZHJlc3M6IHtcbiAgICAgICAgdHlwZSAgICAgOiBTVFJJTkcsXG4gICAgICAgIGFsbG93TnVsbDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICByZXN1bHQ6IHtcbiAgICAgICAgdHlwZSAgICAgOiBURVhUKCdsb25nJyksXG4gICAgICAgIGFsbG93TnVsbDogdHJ1ZSxcbiAgICAgICAgZGVmYXVsdCAgOiBudWxsLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGZyZWV6ZVRhYmxlTmFtZTogdHJ1ZSxcbiAgICB9XG4gICk7XG5cbiAgUmVxdWVzdC5hc3NvY2lhdGUgPSBkYiA9PiB7XG4gICAgUmVxdWVzdC5iZWxvbmdzVG8oZGIuRmlsZSwge1xuICAgICAgZm9yZWlnbktleToge1xuICAgICAgICBhbGxvd051bGw6IHRydWUsXG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBSZXF1ZXN0O1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9tb2RlbHMvcmVxdWVzdC5qcyIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IGJjcnlwdCA9IHJlcXVpcmUoJ2JjcnlwdCcpO1xuY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChzZXF1ZWxpemUsIHsgU1RSSU5HIH0pID0+IHtcbiAgY29uc3QgVXNlciA9IHNlcXVlbGl6ZS5kZWZpbmUoXG4gICAgJ1VzZXInLFxuICAgIHtcbiAgICAgIHVzZXJOYW1lOiB7XG4gICAgICAgIHR5cGUgICAgIDogU1RSSU5HLFxuICAgICAgICBhbGxvd051bGw6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHBhc3N3b3JkOiB7XG4gICAgICAgIHR5cGUgICAgIDogU1RSSU5HLFxuICAgICAgICBhbGxvd051bGw6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGZyZWV6ZVRhYmxlTmFtZTogdHJ1ZSxcbiAgICB9XG4gICk7XG5cbiAgVXNlci5hc3NvY2lhdGUgPSBkYiA9PiB7XG4gICAgVXNlci5oYXNPbmUoZGIuQ2hhbm5lbCk7XG4gIH07XG5cbiAgVXNlci5wcm90b3R5cGUuY29tcGFyZVBhc3N3b3JkID0gZnVuY3Rpb24gKHBhc3N3b3JkKSB7XG4gICAgcmV0dXJuIGJjcnlwdC5jb21wYXJlKHBhc3N3b3JkLCB0aGlzLnBhc3N3b3JkKTtcbiAgfTtcblxuICBVc2VyLnByb3RvdHlwZS5jaGFuZ2VQYXNzd29yZCA9IGZ1bmN0aW9uIChuZXdQYXNzd29yZCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBnZW5lcmF0ZSBhIHNhbHQgc3RyaW5nIHRvIHVzZSBmb3IgaGFzaGluZ1xuICAgICAgYmNyeXB0LmdlblNhbHQoKHNhbHRFcnJvciwgc2FsdCkgPT4ge1xuICAgICAgICBpZiAoc2FsdEVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdzYWx0IGVycm9yJywgc2FsdEVycm9yKTtcbiAgICAgICAgICByZWplY3Qoc2FsdEVycm9yKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZ2VuZXJhdGUgYSBoYXNoZWQgdmVyc2lvbiBvZiB0aGUgdXNlcidzIHBhc3N3b3JkXG4gICAgICAgIGJjcnlwdC5oYXNoKG5ld1Bhc3N3b3JkLCBzYWx0LCAoaGFzaEVycm9yLCBoYXNoKSA9PiB7XG4gICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2l0aCB0aGUgaGFzaCBnZW5lcmF0aW9uIHJldHVybiB0aGUgZXJyb3JcbiAgICAgICAgICBpZiAoaGFzaEVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ2hhc2ggZXJyb3InLCBoYXNoRXJyb3IpO1xuICAgICAgICAgICAgcmVqZWN0KGhhc2hFcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGN1cnJlbnQgcGFzc3dvcmQgd2l0aCB0aGUgbmV3IGhhc2hcbiAgICAgICAgICB0aGlzXG4gICAgICAgICAgICAudXBkYXRlKHtwYXNzd29yZDogaGFzaH0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gcHJlLXNhdmUgaG9vayBtZXRob2QgdG8gaGFzaCB0aGUgdXNlcidzIHBhc3N3b3JkIGJlZm9yZSB0aGUgdXNlcidzIGluZm8gaXMgc2F2ZWQgdG8gdGhlIGRiLlxuICBVc2VyLmhvb2soJ2JlZm9yZUNyZWF0ZScsICh1c2VyLCBvcHRpb25zKSA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKCdVc2VyLmJlZm9yZUNyZWF0ZSBob29rLi4uJyk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIGdlbmVyYXRlIGEgc2FsdCBzdHJpbmcgdG8gdXNlIGZvciBoYXNoaW5nXG4gICAgICBiY3J5cHQuZ2VuU2FsdCgoc2FsdEVycm9yLCBzYWx0KSA9PiB7XG4gICAgICAgIGlmIChzYWx0RXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ3NhbHQgZXJyb3InLCBzYWx0RXJyb3IpO1xuICAgICAgICAgIHJlamVjdChzYWx0RXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBnZW5lcmF0ZSBhIGhhc2hlZCB2ZXJzaW9uIG9mIHRoZSB1c2VyJ3MgcGFzc3dvcmRcbiAgICAgICAgYmNyeXB0Lmhhc2godXNlci5wYXNzd29yZCwgc2FsdCwgKGhhc2hFcnJvciwgaGFzaCkgPT4ge1xuICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yIHdpdGggdGhlIGhhc2ggZ2VuZXJhdGlvbiByZXR1cm4gdGhlIGVycm9yXG4gICAgICAgICAgaWYgKGhhc2hFcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdoYXNoIGVycm9yJywgaGFzaEVycm9yKTtcbiAgICAgICAgICAgIHJlamVjdChoYXNoRXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyByZXBsYWNlIHRoZSBwYXNzd29yZCBzdHJpbmcgd2l0aCB0aGUgaGFzaCBwYXNzd29yZCB2YWx1ZVxuICAgICAgICAgIHVzZXIucGFzc3dvcmQgPSBoYXNoO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIFVzZXI7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL21vZGVscy91c2VyLmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYmNyeXB0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiYmNyeXB0XCJcbi8vIG1vZHVsZSBpZCA9IDc4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImNvbnN0IFBhc3Nwb3J0TG9jYWxTdHJhdGVneSA9IHJlcXVpcmUoJ3Bhc3Nwb3J0LWxvY2FsJykuU3RyYXRlZ3k7XG5jb25zdCBsb2dnZXIgPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5jb25zdCBkYiA9IHJlcXVpcmUoJy4uL21vZGVscy9pbmRleCcpO1xuXG5jb25zdCByZXR1cm5Vc2VyQW5kQ2hhbm5lbEluZm8gPSAodXNlckluc3RhbmNlKSA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IHVzZXJJbmZvID0ge307XG4gICAgdXNlckluZm9bJ2lkJ10gPSB1c2VySW5zdGFuY2UuaWQ7XG4gICAgdXNlckluZm9bJ3VzZXJOYW1lJ10gPSB1c2VySW5zdGFuY2UudXNlck5hbWU7XG4gICAgdXNlckluc3RhbmNlXG4gICAgICAuZ2V0Q2hhbm5lbCgpXG4gICAgICAudGhlbigoe2NoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZH0pID0+IHtcbiAgICAgICAgdXNlckluZm9bJ2NoYW5uZWxOYW1lJ10gPSBjaGFubmVsTmFtZTtcbiAgICAgICAgdXNlckluZm9bJ2NoYW5uZWxDbGFpbUlkJ10gPSBjaGFubmVsQ2xhaW1JZDtcbiAgICAgICAgcmV0dXJuIGRiLkNlcnRpZmljYXRlLmdldFNob3J0Q2hhbm5lbElkRnJvbUxvbmdDaGFubmVsSWQoY2hhbm5lbENsYWltSWQsIGNoYW5uZWxOYW1lKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihzaG9ydENoYW5uZWxJZCA9PiB7XG4gICAgICAgIHVzZXJJbmZvWydzaG9ydENoYW5uZWxJZCddID0gc2hvcnRDaGFubmVsSWQ7XG4gICAgICAgIHJlc29sdmUodXNlckluZm8pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBQYXNzcG9ydExvY2FsU3RyYXRlZ3koXG4gIHtcbiAgICB1c2VybmFtZUZpZWxkOiAndXNlcm5hbWUnLFxuICAgIHBhc3N3b3JkRmllbGQ6ICdwYXNzd29yZCcsXG4gIH0sXG4gICh1c2VybmFtZSwgcGFzc3dvcmQsIGRvbmUpID0+IHtcbiAgICByZXR1cm4gZGIuVXNlclxuICAgICAgLmZpbmRPbmUoe1xuICAgICAgICB3aGVyZToge3VzZXJOYW1lOiB1c2VybmFtZX0sXG4gICAgICB9KVxuICAgICAgLnRoZW4odXNlciA9PiB7XG4gICAgICAgIGlmICghdXNlcikge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1Zygnbm8gdXNlciBmb3VuZCcpO1xuICAgICAgICAgIHJldHVybiBkb25lKG51bGwsIGZhbHNlLCB7bWVzc2FnZTogJ0luY29ycmVjdCB1c2VybmFtZSBvciBwYXNzd29yZCd9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXNlci5jb21wYXJlUGFzc3dvcmQocGFzc3dvcmQpXG4gICAgICAgICAgLnRoZW4oaXNNYXRjaCA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzTWF0Y2gpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdpbmNvcnJlY3QgcGFzc3dvcmQnKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGRvbmUobnVsbCwgZmFsc2UsIHttZXNzYWdlOiAnSW5jb3JyZWN0IHVzZXJuYW1lIG9yIHBhc3N3b3JkJ30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdQYXNzd29yZCB3YXMgYSBtYXRjaCwgcmV0dXJuaW5nIFVzZXInKTtcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5Vc2VyQW5kQ2hhbm5lbEluZm8odXNlcilcbiAgICAgICAgICAgICAgLnRoZW4odXNlckluZm8gPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBkb25lKG51bGwsIHVzZXJJbmZvKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICByZXR1cm4gZG9uZShlcnJvcik7XG4gICAgICB9KTtcbiAgfSxcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvcGFzc3BvcnQvbG9jYWwtbG9naW4uanMiLCJjb25zdCBsb2dnZXIgPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5jb25zdCBwYXNzcG9ydCA9IHJlcXVpcmUoJ3Bhc3Nwb3J0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKGFwcCkgPT4ge1xuICAvLyByb3V0ZSBmb3Igc2lnbiB1cFxuICBhcHAucG9zdCgnL3NpZ251cCcsIHBhc3Nwb3J0LmF1dGhlbnRpY2F0ZSgnbG9jYWwtc2lnbnVwJyksIChyZXEsIHJlcykgPT4ge1xuICAgIGxvZ2dlci52ZXJib3NlKGBzdWNjZXNzZnVsIHNpZ251cCBmb3IgJHtyZXEudXNlci5jaGFubmVsTmFtZX1gKTtcbiAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7XG4gICAgICBzdWNjZXNzICAgICAgIDogdHJ1ZSxcbiAgICAgIGNoYW5uZWxOYW1lICAgOiByZXEudXNlci5jaGFubmVsTmFtZSxcbiAgICAgIGNoYW5uZWxDbGFpbUlkOiByZXEudXNlci5jaGFubmVsQ2xhaW1JZCxcbiAgICAgIHNob3J0Q2hhbm5lbElkOiByZXEudXNlci5zaG9ydENoYW5uZWxJZCxcbiAgICB9KTtcbiAgfSk7XG4gIC8vIHJvdXRlIGZvciBsb2cgaW5cbiAgYXBwLnBvc3QoJy9sb2dpbicsIChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgIHBhc3Nwb3J0LmF1dGhlbnRpY2F0ZSgnbG9jYWwtbG9naW4nLCAoZXJyLCB1c2VyLCBpbmZvKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBuZXh0KGVycik7XG4gICAgICB9XG4gICAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBpbmZvLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmRlYnVnKCdzdWNjZXNzZnVsIGxvZ2luJyk7XG4gICAgICByZXEubG9nSW4odXNlciwgKGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIG5leHQoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLmpzb24oe1xuICAgICAgICAgIHN1Y2Nlc3MgICAgICAgOiB0cnVlLFxuICAgICAgICAgIGNoYW5uZWxOYW1lICAgOiByZXEudXNlci5jaGFubmVsTmFtZSxcbiAgICAgICAgICBjaGFubmVsQ2xhaW1JZDogcmVxLnVzZXIuY2hhbm5lbENsYWltSWQsXG4gICAgICAgICAgc2hvcnRDaGFubmVsSWQ6IHJlcS51c2VyLnNob3J0Q2hhbm5lbElkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pKHJlcSwgcmVzLCBuZXh0KTtcbiAgfSk7XG4gIC8vIHJvdXRlIHRvIGxvZyBvdXRcbiAgYXBwLmdldCgnL2xvZ291dCcsIChyZXEsIHJlcykgPT4ge1xuICAgIHJlcS5sb2dvdXQoKTtcbiAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7c3VjY2VzczogdHJ1ZSwgbWVzc2FnZTogJ3lvdSBzdWNjZXNzZnVsbHkgbG9nZ2VkIG91dCd9KTtcbiAgfSk7XG4gIC8vIHNlZSBpZiB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQsIGFuZCByZXR1cm4gY3JlZGVudGlhbHMgaWYgc29cbiAgYXBwLmdldCgnL3VzZXInLCAocmVxLCByZXMpID0+IHtcbiAgICBpZiAocmVxLnVzZXIpIHtcbiAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtzdWNjZXNzOiB0cnVlLCBkYXRhOiByZXEudXNlcn0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMuc3RhdHVzKDQwMSkuanNvbih7c3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6ICd1c2VyIGlzIG5vdCBsb2dnZWQgaW4nfSk7XG4gICAgfVxuICB9KTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvcm91dGVzL2F1dGgtcm91dGVzLmpzIiwiY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuY29uc3QgbXVsdGlwYXJ0ID0gcmVxdWlyZSgnY29ubmVjdC1tdWx0aXBhcnR5Jyk7XG5jb25zdCB7IHB1Ymxpc2hpbmc6IHsgdXBsb2FkRGlyZWN0b3J5IH0sIGRldGFpbHM6IHsgaG9zdCB9IH0gPSByZXF1aXJlKCcuLi8uLi9jb25maWcvc2l0ZUNvbmZpZy5qcycpO1xuY29uc3QgbXVsdGlwYXJ0TWlkZGxld2FyZSA9IG11bHRpcGFydCh7dXBsb2FkRGlyOiB1cGxvYWREaXJlY3Rvcnl9KTtcbmNvbnN0IGRiID0gcmVxdWlyZSgnLi4vbW9kZWxzL2luZGV4Jyk7XG5jb25zdCB7IGNsYWltTmFtZUlzQXZhaWxhYmxlLCBjaGVja0NoYW5uZWxBdmFpbGFiaWxpdHksIHB1Ymxpc2ggfSA9IHJlcXVpcmUoJy4uL2NvbnRyb2xsZXJzL3B1Ymxpc2hDb250cm9sbGVyLmpzJyk7XG5jb25zdCB7IGdldENsYWltTGlzdCwgcmVzb2x2ZVVyaSwgZ2V0Q2xhaW0gfSA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvbGJyeUFwaS5qcycpO1xuY29uc3QgeyBhZGRHZXRSZXN1bHRzVG9GaWxlRGF0YSwgY3JlYXRlQmFzaWNQdWJsaXNoUGFyYW1zLCBjcmVhdGVUaHVtYm5haWxQdWJsaXNoUGFyYW1zLCBwYXJzZVB1Ymxpc2hBcGlSZXF1ZXN0Qm9keSwgcGFyc2VQdWJsaXNoQXBpUmVxdWVzdEZpbGVzLCBjcmVhdGVGaWxlRGF0YSB9ID0gcmVxdWlyZSgnLi4vaGVscGVycy9wdWJsaXNoSGVscGVycy5qcycpO1xuY29uc3QgZXJyb3JIYW5kbGVycyA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvZXJyb3JIYW5kbGVycy5qcycpO1xuY29uc3QgeyBzZW5kR0FUaW1pbmdFdmVudCB9ID0gcmVxdWlyZSgnLi4vaGVscGVycy9nb29nbGVBbmFseXRpY3MuanMnKTtcbmNvbnN0IHsgYXV0aGVudGljYXRlVXNlciB9ID0gcmVxdWlyZSgnLi4vYXV0aC9hdXRoZW50aWNhdGlvbi5qcycpO1xuY29uc3QgeyBnZXRDaGFubmVsRGF0YSwgZ2V0Q2hhbm5lbENsYWltcywgZ2V0Q2xhaW1JZCB9ID0gcmVxdWlyZSgnLi4vY29udHJvbGxlcnMvc2VydmVDb250cm9sbGVyLmpzJyk7XG5cbmNvbnN0IE5PX0NIQU5ORUwgPSAnTk9fQ0hBTk5FTCc7XG5jb25zdCBOT19DTEFJTSA9ICdOT19DTEFJTSc7XG5cbm1vZHVsZS5leHBvcnRzID0gKGFwcCkgPT4ge1xuICAvLyByb3V0ZSB0byBjaGVjayB3aGV0aGVyIHNpdGUgaGFzIHB1Ymxpc2hlZCB0byBhIGNoYW5uZWxcbiAgYXBwLmdldCgnL2FwaS9jaGFubmVsL2F2YWlsYWJpbGl0eS86bmFtZScsICh7IGlwLCBvcmlnaW5hbFVybCwgcGFyYW1zOiB7IG5hbWUgfSB9LCByZXMpID0+IHtcbiAgICBjb25zdCBnYVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY2hlY2tDaGFubmVsQXZhaWxhYmlsaXR5KG5hbWUpXG4gICAgICAudGhlbihhdmFpbGFibGVOYW1lID0+IHtcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oYXZhaWxhYmxlTmFtZSk7XG4gICAgICAgIHNlbmRHQVRpbWluZ0V2ZW50KCdlbmQtdG8tZW5kJywgJ2NsYWltIG5hbWUgYXZhaWxhYmlsaXR5JywgbmFtZSwgZ2FTdGFydFRpbWUsIERhdGUubm93KCkpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGVycm9ySGFuZGxlcnMuaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xuICAgICAgfSk7XG4gIH0pO1xuICAvLyByb3V0ZSB0byBnZXQgYSBzaG9ydCBjaGFubmVsIGlkIGZyb20gbG9uZyBjaGFubmVsIElkXG4gIGFwcC5nZXQoJy9hcGkvY2hhbm5lbC9zaG9ydC1pZC86bG9uZ0lkLzpuYW1lJywgKHsgaXAsIG9yaWdpbmFsVXJsLCBwYXJhbXMgfSwgcmVzKSA9PiB7XG4gICAgZGIuQ2VydGlmaWNhdGUuZ2V0U2hvcnRDaGFubmVsSWRGcm9tTG9uZ0NoYW5uZWxJZChwYXJhbXMubG9uZ0lkLCBwYXJhbXMubmFtZSlcbiAgICAgIC50aGVuKHNob3J0SWQgPT4ge1xuICAgICAgICByZXMuc3RhdHVzKDIwMCkuanNvbihzaG9ydElkKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBlcnJvckhhbmRsZXJzLmhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcbiAgICAgIH0pO1xuICB9KTtcbiAgYXBwLmdldCgnL2FwaS9jaGFubmVsL2RhdGEvOmNoYW5uZWxOYW1lLzpjaGFubmVsQ2xhaW1JZCcsICh7IGlwLCBvcmlnaW5hbFVybCwgYm9keSwgcGFyYW1zIH0sIHJlcykgPT4ge1xuICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gcGFyYW1zLmNoYW5uZWxOYW1lO1xuICAgIGxldCBjaGFubmVsQ2xhaW1JZCA9IHBhcmFtcy5jaGFubmVsQ2xhaW1JZDtcbiAgICBpZiAoY2hhbm5lbENsYWltSWQgPT09ICdub25lJykgY2hhbm5lbENsYWltSWQgPSBudWxsO1xuICAgIGdldENoYW5uZWxEYXRhKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCwgMClcbiAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICBpZiAoZGF0YSA9PT0gTk9fQ0hBTk5FTCkge1xuICAgICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuanNvbih7c3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6ICdObyBtYXRjaGluZyBjaGFubmVsIHdhcyBmb3VuZCd9KTtcbiAgICAgICAgfVxuICAgICAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7c3VjY2VzczogdHJ1ZSwgZGF0YX0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGVycm9ySGFuZGxlcnMuaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xuICAgICAgfSk7XG4gIH0pO1xuICBhcHAuZ2V0KCcvYXBpL2NoYW5uZWwvY2xhaW1zLzpjaGFubmVsTmFtZS86Y2hhbm5lbENsYWltSWQvOnBhZ2UnLCAoeyBpcCwgb3JpZ2luYWxVcmwsIGJvZHksIHBhcmFtcyB9LCByZXMpID0+IHtcbiAgICBjb25zdCBjaGFubmVsTmFtZSA9IHBhcmFtcy5jaGFubmVsTmFtZTtcbiAgICBsZXQgY2hhbm5lbENsYWltSWQgPSBwYXJhbXMuY2hhbm5lbENsYWltSWQ7XG4gICAgaWYgKGNoYW5uZWxDbGFpbUlkID09PSAnbm9uZScpIGNoYW5uZWxDbGFpbUlkID0gbnVsbDtcbiAgICBjb25zdCBwYWdlID0gcGFyYW1zLnBhZ2U7XG4gICAgZ2V0Q2hhbm5lbENsYWltcyhjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIHBhZ2UpXG4gICAgICAudGhlbihkYXRhID0+IHtcbiAgICAgICAgaWYgKGRhdGEgPT09IE5PX0NIQU5ORUwpIHtcbiAgICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiAnTm8gbWF0Y2hpbmcgY2hhbm5lbCB3YXMgZm91bmQnfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oe3N1Y2Nlc3M6IHRydWUsIGRhdGF9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBlcnJvckhhbmRsZXJzLmhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcbiAgICAgIH0pO1xuICB9KTtcbiAgLy8gcm91dGUgdG8gcnVuIGEgY2xhaW1fbGlzdCByZXF1ZXN0IG9uIHRoZSBkYWVtb25cbiAgYXBwLmdldCgnL2FwaS9jbGFpbS9saXN0LzpuYW1lJywgKHsgaXAsIG9yaWdpbmFsVXJsLCBwYXJhbXMgfSwgcmVzKSA9PiB7XG4gICAgZ2V0Q2xhaW1MaXN0KHBhcmFtcy5uYW1lKVxuICAgICAgLnRoZW4oY2xhaW1zTGlzdCA9PiB7XG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKGNsYWltc0xpc3QpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGVycm9ySGFuZGxlcnMuaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xuICAgICAgfSk7XG4gIH0pO1xuICAvLyByb3V0ZSB0byBnZXQgYW4gYXNzZXRcbiAgYXBwLmdldCgnL2FwaS9jbGFpbS9nZXQvOm5hbWUvOmNsYWltSWQnLCAoeyBpcCwgb3JpZ2luYWxVcmwsIHBhcmFtcyB9LCByZXMpID0+IHtcbiAgICBjb25zdCBuYW1lID0gcGFyYW1zLm5hbWU7XG4gICAgY29uc3QgY2xhaW1JZCA9IHBhcmFtcy5jbGFpbUlkO1xuICAgIC8vIHJlc29sdmUgdGhlIGNsYWltXG4gICAgZGIuQ2xhaW0ucmVzb2x2ZUNsYWltKG5hbWUsIGNsYWltSWQpXG4gICAgICAudGhlbihyZXNvbHZlUmVzdWx0ID0+IHtcbiAgICAgICAgLy8gbWFrZSBzdXJlIGEgY2xhaW0gYWN0dWFsbHkgZXhpc3RzIGF0IHRoYXQgdXJpXG4gICAgICAgIGlmICghcmVzb2x2ZVJlc3VsdCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gbWF0Y2hpbmcgdXJpIGZvdW5kIGluIENsYWltIHRhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpbGVEYXRhID0gY3JlYXRlRmlsZURhdGEocmVzb2x2ZVJlc3VsdCk7XG4gICAgICAgIC8vIGdldCB0aGUgY2xhaW1cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtmaWxlRGF0YSwgZ2V0Q2xhaW0oYCR7bmFtZX0jJHtjbGFpbUlkfWApXSk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oKFsgZmlsZURhdGEsIGdldFJlc3VsdCBdKSA9PiB7XG4gICAgICAgIGZpbGVEYXRhID0gYWRkR2V0UmVzdWx0c1RvRmlsZURhdGEoZmlsZURhdGEsIGdldFJlc3VsdCk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbZGIudXBzZXJ0KGRiLkZpbGUsIGZpbGVEYXRhLCB7bmFtZSwgY2xhaW1JZH0sICdGaWxlJyksIGdldFJlc3VsdF0pO1xuICAgICAgfSlcbiAgICAgIC50aGVuKChbIGZpbGVSZWNvcmQsIHttZXNzYWdlLCBjb21wbGV0ZWR9IF0pID0+IHtcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oeyBzdWNjZXNzOiB0cnVlLCBtZXNzYWdlLCBjb21wbGV0ZWQgfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgZXJyb3JIYW5kbGVycy5oYW5kbGVFcnJvclJlc3BvbnNlKG9yaWdpbmFsVXJsLCBpcCwgZXJyb3IsIHJlcyk7XG4gICAgICB9KTtcbiAgfSk7XG4gIC8vIHJvdXRlIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBzaXRlIHB1Ymxpc2hlZCB0byBhIGNsYWltXG4gIGFwcC5nZXQoJy9hcGkvY2xhaW0vYXZhaWxhYmlsaXR5LzpuYW1lJywgKHsgaXAsIG9yaWdpbmFsVXJsLCBwYXJhbXM6IHsgbmFtZSB9IH0sIHJlcykgPT4ge1xuICAgIGNvbnN0IGdhU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjbGFpbU5hbWVJc0F2YWlsYWJsZShuYW1lKVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24ocmVzdWx0KTtcbiAgICAgICAgc2VuZEdBVGltaW5nRXZlbnQoJ2VuZC10by1lbmQnLCAnY2xhaW0gbmFtZSBhdmFpbGFiaWxpdHknLCBuYW1lLCBnYVN0YXJ0VGltZSwgRGF0ZS5ub3coKSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgZXJyb3JIYW5kbGVycy5oYW5kbGVFcnJvclJlc3BvbnNlKG9yaWdpbmFsVXJsLCBpcCwgZXJyb3IsIHJlcyk7XG4gICAgICB9KTtcbiAgfSk7XG4gIC8vIHJvdXRlIHRvIHJ1biBhIHJlc29sdmUgcmVxdWVzdCBvbiB0aGUgZGFlbW9uXG4gIGFwcC5nZXQoJy9hcGkvY2xhaW0vcmVzb2x2ZS86bmFtZS86Y2xhaW1JZCcsICh7IGhlYWRlcnMsIGlwLCBvcmlnaW5hbFVybCwgcGFyYW1zIH0sIHJlcykgPT4ge1xuICAgIHJlc29sdmVVcmkoYCR7cGFyYW1zLm5hbWV9IyR7cGFyYW1zLmNsYWltSWR9YClcbiAgICAgIC50aGVuKHJlc29sdmVkVXJpID0+IHtcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24ocmVzb2x2ZWRVcmkpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGVycm9ySGFuZGxlcnMuaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xuICAgICAgfSk7XG4gIH0pO1xuICAvLyByb3V0ZSB0byBydW4gYSBwdWJsaXNoIHJlcXVlc3Qgb24gdGhlIGRhZW1vblxuICBhcHAucG9zdCgnL2FwaS9jbGFpbS9wdWJsaXNoJywgbXVsdGlwYXJ0TWlkZGxld2FyZSwgKHsgYm9keSwgZmlsZXMsIGhlYWRlcnMsIGlwLCBvcmlnaW5hbFVybCwgdXNlciB9LCByZXMpID0+IHtcbiAgICAvLyBkZWZpbmUgdmFyaWFibGVzXG4gICAgbGV0ICBjaGFubmVsTmFtZSwgY2hhbm5lbElkLCBjaGFubmVsUGFzc3dvcmQsIGRlc2NyaXB0aW9uLCBmaWxlTmFtZSwgZmlsZVBhdGgsIGZpbGVUeXBlLCBnYVN0YXJ0VGltZSwgbGljZW5zZSwgbmFtZSwgbnNmdywgdGh1bWJuYWlsLCB0aHVtYm5haWxGaWxlTmFtZSwgdGh1bWJuYWlsRmlsZVBhdGgsIHRodW1ibmFpbEZpbGVUeXBlLCB0aXRsZTtcbiAgICAvLyByZWNvcmQgdGhlIHN0YXJ0IHRpbWUgb2YgdGhlIHJlcXVlc3RcbiAgICBnYVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgLy8gdmFsaWRhdGUgdGhlIGJvZHkgYW5kIGZpbGVzIG9mIHRoZSByZXF1ZXN0XG4gICAgdHJ5IHtcbiAgICAgIC8vIHZhbGlkYXRlQXBpUHVibGlzaFJlcXVlc3QoYm9keSwgZmlsZXMpO1xuICAgICAgKHtuYW1lLCBuc2Z3LCBsaWNlbnNlLCB0aXRsZSwgZGVzY3JpcHRpb24sIHRodW1ibmFpbH0gPSBwYXJzZVB1Ymxpc2hBcGlSZXF1ZXN0Qm9keShib2R5KSk7XG4gICAgICAoe2ZpbGVOYW1lLCBmaWxlUGF0aCwgZmlsZVR5cGUsIHRodW1ibmFpbEZpbGVOYW1lLCB0aHVtYm5haWxGaWxlUGF0aCwgdGh1bWJuYWlsRmlsZVR5cGV9ID0gcGFyc2VQdWJsaXNoQXBpUmVxdWVzdEZpbGVzKGZpbGVzKSk7XG4gICAgICAoe2NoYW5uZWxOYW1lLCBjaGFubmVsSWQsIGNoYW5uZWxQYXNzd29yZH0gPSBib2R5KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogZXJyb3IubWVzc2FnZX0pO1xuICAgIH1cbiAgICAvLyBjaGVjayBjaGFubmVsIGF1dGhvcml6YXRpb25cbiAgICBQcm9taXNlLmFsbChbXG4gICAgICBhdXRoZW50aWNhdGVVc2VyKGNoYW5uZWxOYW1lLCBjaGFubmVsSWQsIGNoYW5uZWxQYXNzd29yZCwgdXNlciksXG4gICAgICBjbGFpbU5hbWVJc0F2YWlsYWJsZShuYW1lKSxcbiAgICAgIGNyZWF0ZUJhc2ljUHVibGlzaFBhcmFtcyhmaWxlUGF0aCwgbmFtZSwgdGl0bGUsIGRlc2NyaXB0aW9uLCBsaWNlbnNlLCBuc2Z3LCB0aHVtYm5haWwpLFxuICAgICAgY3JlYXRlVGh1bWJuYWlsUHVibGlzaFBhcmFtcyh0aHVtYm5haWxGaWxlUGF0aCwgbmFtZSwgbGljZW5zZSwgbnNmdyksXG4gICAgXSlcbiAgICAgIC50aGVuKChbe2NoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZH0sIHZhbGlkYXRlZENsYWltTmFtZSwgcHVibGlzaFBhcmFtcywgdGh1bWJuYWlsUHVibGlzaFBhcmFtc10pID0+IHtcbiAgICAgICAgLy8gYWRkIGNoYW5uZWwgZGV0YWlscyB0byB0aGUgcHVibGlzaCBwYXJhbXNcbiAgICAgICAgaWYgKGNoYW5uZWxOYW1lICYmIGNoYW5uZWxDbGFpbUlkKSB7XG4gICAgICAgICAgcHVibGlzaFBhcmFtc1snY2hhbm5lbF9uYW1lJ10gPSBjaGFubmVsTmFtZTtcbiAgICAgICAgICBwdWJsaXNoUGFyYW1zWydjaGFubmVsX2lkJ10gPSBjaGFubmVsQ2xhaW1JZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBwdWJsaXNoIHRoZSB0aHVtYm5haWxcbiAgICAgICAgaWYgKHRodW1ibmFpbFB1Ymxpc2hQYXJhbXMpIHtcbiAgICAgICAgICBwdWJsaXNoKHRodW1ibmFpbFB1Ymxpc2hQYXJhbXMsIHRodW1ibmFpbEZpbGVOYW1lLCB0aHVtYm5haWxGaWxlVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcHVibGlzaCB0aGUgYXNzZXRcbiAgICAgICAgcmV0dXJuIHB1Ymxpc2gocHVibGlzaFBhcmFtcywgZmlsZU5hbWUsIGZpbGVUeXBlKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiAncHVibGlzaCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5JyxcbiAgICAgICAgICBkYXRhICAgOiB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgY2xhaW1JZDogcmVzdWx0LmNsYWltX2lkLFxuICAgICAgICAgICAgdXJsICAgIDogYCR7aG9zdH0vJHtyZXN1bHQuY2xhaW1faWR9LyR7bmFtZX1gLFxuICAgICAgICAgICAgbGJyeVR4IDogcmVzdWx0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyByZWNvcmQgdGhlIHB1Ymxpc2ggZW5kIHRpbWUgYW5kIHNlbmQgdG8gZ29vZ2xlIGFuYWx5dGljc1xuICAgICAgICBzZW5kR0FUaW1pbmdFdmVudCgnZW5kLXRvLWVuZCcsICdwdWJsaXNoJywgZmlsZVR5cGUsIGdhU3RhcnRUaW1lLCBEYXRlLm5vdygpKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBlcnJvckhhbmRsZXJzLmhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcbiAgICAgIH0pO1xuICB9KTtcbiAgLy8gcm91dGUgdG8gZ2V0IGEgc2hvcnQgY2xhaW0gaWQgZnJvbSBsb25nIGNsYWltIElkXG4gIGFwcC5nZXQoJy9hcGkvY2xhaW0vc2hvcnQtaWQvOmxvbmdJZC86bmFtZScsICh7IGlwLCBvcmlnaW5hbFVybCwgYm9keSwgcGFyYW1zIH0sIHJlcykgPT4ge1xuICAgIGRiLkNsYWltLmdldFNob3J0Q2xhaW1JZEZyb21Mb25nQ2xhaW1JZChwYXJhbXMubG9uZ0lkLCBwYXJhbXMubmFtZSlcbiAgICAgIC50aGVuKHNob3J0SWQgPT4ge1xuICAgICAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7c3VjY2VzczogdHJ1ZSwgZGF0YTogc2hvcnRJZH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGVycm9ySGFuZGxlcnMuaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xuICAgICAgfSk7XG4gIH0pO1xuICBhcHAucG9zdCgnL2FwaS9jbGFpbS9sb25nLWlkJywgKHsgaXAsIG9yaWdpbmFsVXJsLCBib2R5LCBwYXJhbXMgfSwgcmVzKSA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKCdib2R5OicsIGJvZHkpO1xuICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gYm9keS5jaGFubmVsTmFtZTtcbiAgICBjb25zdCBjaGFubmVsQ2xhaW1JZCA9IGJvZHkuY2hhbm5lbENsYWltSWQ7XG4gICAgY29uc3QgY2xhaW1OYW1lID0gYm9keS5jbGFpbU5hbWU7XG4gICAgY29uc3QgY2xhaW1JZCA9IGJvZHkuY2xhaW1JZDtcbiAgICBnZXRDbGFpbUlkKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCwgY2xhaW1OYW1lLCBjbGFpbUlkKVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gTk9fQ0hBTk5FTCkge1xuICAgICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuanNvbih7c3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6ICdObyBtYXRjaGluZyBjaGFubmVsIGNvdWxkIGJlIGZvdW5kJ30pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQgPT09IE5PX0NMQUlNKSB7XG4gICAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogJ05vIG1hdGNoaW5nIGNsYWltIGlkIGNvdWxkIGJlIGZvdW5kJ30pO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtzdWNjZXNzOiB0cnVlLCBkYXRhOiByZXN1bHR9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBlcnJvckhhbmRsZXJzLmhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcbiAgICAgIH0pO1xuICB9KTtcbiAgYXBwLmdldCgnL2FwaS9jbGFpbS9kYXRhLzpjbGFpbU5hbWUvOmNsYWltSWQnLCAoeyBpcCwgb3JpZ2luYWxVcmwsIGJvZHksIHBhcmFtcyB9LCByZXMpID0+IHtcbiAgICBjb25zdCBjbGFpbU5hbWUgPSBwYXJhbXMuY2xhaW1OYW1lO1xuICAgIGxldCBjbGFpbUlkID0gcGFyYW1zLmNsYWltSWQ7XG4gICAgaWYgKGNsYWltSWQgPT09ICdub25lJykgY2xhaW1JZCA9IG51bGw7XG4gICAgZGIuQ2xhaW0ucmVzb2x2ZUNsYWltKGNsYWltTmFtZSwgY2xhaW1JZClcbiAgICAgIC50aGVuKGNsYWltSW5mbyA9PiB7XG4gICAgICAgIGlmICghY2xhaW1JbmZvKSB7XG4gICAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogJ05vIGNsYWltIGNvdWxkIGJlIGZvdW5kJ30pO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtzdWNjZXNzOiB0cnVlLCBkYXRhOiBjbGFpbUluZm99KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBlcnJvckhhbmRsZXJzLmhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcbiAgICAgIH0pO1xuICB9KTtcbiAgLy8gcm91dGUgdG8gc2VlIGlmIGFzc2V0IGlzIGF2YWlsYWJsZSBsb2NhbGx5XG4gIGFwcC5nZXQoJy9hcGkvZmlsZS9hdmFpbGFiaWxpdHkvOm5hbWUvOmNsYWltSWQnLCAoeyBpcCwgb3JpZ2luYWxVcmwsIHBhcmFtcyB9LCByZXMpID0+IHtcbiAgICBjb25zdCBuYW1lID0gcGFyYW1zLm5hbWU7XG4gICAgY29uc3QgY2xhaW1JZCA9IHBhcmFtcy5jbGFpbUlkO1xuICAgIGRiLkZpbGUuZmluZE9uZSh7d2hlcmU6IHtuYW1lLCBjbGFpbUlkfX0pXG4gICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtzdWNjZXNzOiB0cnVlLCBkYXRhOiB0cnVlfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oe3N1Y2Nlc3M6IHRydWUsIGRhdGE6IGZhbHNlfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgZXJyb3JIYW5kbGVycy5oYW5kbGVFcnJvclJlc3BvbnNlKG9yaWdpbmFsVXJsLCBpcCwgZXJyb3IsIHJlcyk7XG4gICAgICB9KTtcbiAgfSk7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL3JvdXRlcy9hcGktcm91dGVzLmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29ubmVjdC1tdWx0aXBhcnR5XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiY29ubmVjdC1tdWx0aXBhcnR5XCJcbi8vIG1vZHVsZSBpZCA9IDgyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcbmNvbnN0IGRiID0gcmVxdWlyZSgnLi4vbW9kZWxzL2luZGV4Jyk7XG5jb25zdCBsYnJ5QXBpID0gcmVxdWlyZSgnLi4vaGVscGVycy9sYnJ5QXBpLmpzJyk7XG5jb25zdCBwdWJsaXNoSGVscGVycyA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvcHVibGlzaEhlbHBlcnMuanMnKTtcbmNvbnN0IHsgcHVibGlzaGluZzogeyBwcmltYXJ5Q2xhaW1BZGRyZXNzLCBhZGRpdGlvbmFsQ2xhaW1BZGRyZXNzZXMgfSB9ID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnL3NpdGVDb25maWcuanMnKTtcbmNvbnN0IFNlcXVlbGl6ZSA9IHJlcXVpcmUoJ3NlcXVlbGl6ZScpO1xuY29uc3QgT3AgPSBTZXF1ZWxpemUuT3A7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBwdWJsaXNoIChwdWJsaXNoUGFyYW1zLCBmaWxlTmFtZSwgZmlsZVR5cGUpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHB1Ymxpc2hSZXN1bHRzLCBjZXJ0aWZpY2F0ZUlkLCBjaGFubmVsTmFtZTtcbiAgICAgIC8vIHB1Ymxpc2ggdGhlIGZpbGVcbiAgICAgIHJldHVybiBsYnJ5QXBpLnB1Ymxpc2hDbGFpbShwdWJsaXNoUGFyYW1zKVxuICAgICAgICAudGhlbih0eCA9PiB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFN1Y2Nlc3NmdWxseSBwdWJsaXNoZWQgJHtwdWJsaXNoUGFyYW1zLm5hbWV9ICR7ZmlsZU5hbWV9YCwgdHgpO1xuICAgICAgICAgIHB1Ymxpc2hSZXN1bHRzID0gdHg7XG4gICAgICAgICAgLy8gZ2V0IHRoZSBjaGFubmVsIGluZm9ybWF0aW9uXG4gICAgICAgICAgaWYgKHB1Ymxpc2hQYXJhbXMuY2hhbm5lbF9uYW1lKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYHRoaXMgY2xhaW0gd2FzIHB1Ymxpc2hlZCBpbiBjaGFubmVsOiAke3B1Ymxpc2hQYXJhbXMuY2hhbm5lbF9uYW1lfWApO1xuICAgICAgICAgICAgcmV0dXJuIGRiLkNoYW5uZWwuZmluZE9uZSh7d2hlcmU6IHtjaGFubmVsTmFtZTogcHVibGlzaFBhcmFtcy5jaGFubmVsX25hbWV9fSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygndGhpcyBjbGFpbSB3YXMgbm90IHB1Ymxpc2hlZCBpbiBhIGNoYW5uZWwnKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oY2hhbm5lbCA9PiB7XG4gICAgICAgIC8vIHNldCBjaGFubmVsIGluZm9ybWF0aW9uXG4gICAgICAgICAgY2VydGlmaWNhdGVJZCA9IG51bGw7XG4gICAgICAgICAgY2hhbm5lbE5hbWUgPSBudWxsO1xuICAgICAgICAgIGlmIChjaGFubmVsKSB7XG4gICAgICAgICAgICBjZXJ0aWZpY2F0ZUlkID0gY2hhbm5lbC5jaGFubmVsQ2xhaW1JZDtcbiAgICAgICAgICAgIGNoYW5uZWxOYW1lID0gY2hhbm5lbC5jaGFubmVsTmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBjZXJ0aWZpY2F0ZUlkOiAke2NlcnRpZmljYXRlSWR9YCk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gY3JlYXRlIHRoZSBGaWxlIHJlY29yZFxuICAgICAgICAgIGNvbnN0IGZpbGVSZWNvcmQgPSB7XG4gICAgICAgICAgICBuYW1lICAgICAgIDogcHVibGlzaFBhcmFtcy5uYW1lLFxuICAgICAgICAgICAgY2xhaW1JZCAgICA6IHB1Ymxpc2hSZXN1bHRzLmNsYWltX2lkLFxuICAgICAgICAgICAgdGl0bGUgICAgICA6IHB1Ymxpc2hQYXJhbXMubWV0YWRhdGEudGl0bGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogcHVibGlzaFBhcmFtcy5tZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGFkZHJlc3MgICAgOiBwdWJsaXNoUGFyYW1zLmNsYWltX2FkZHJlc3MsXG4gICAgICAgICAgICBvdXRwb2ludCAgIDogYCR7cHVibGlzaFJlc3VsdHMudHhpZH06JHtwdWJsaXNoUmVzdWx0cy5ub3V0fWAsXG4gICAgICAgICAgICBoZWlnaHQgICAgIDogMCxcbiAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgZmlsZVBhdGggICA6IHB1Ymxpc2hQYXJhbXMuZmlsZV9wYXRoLFxuICAgICAgICAgICAgZmlsZVR5cGUsXG4gICAgICAgICAgICBuc2Z3ICAgICAgIDogcHVibGlzaFBhcmFtcy5tZXRhZGF0YS5uc2Z3LFxuICAgICAgICAgIH07XG4gICAgICAgICAgLy8gY3JlYXRlIHRoZSBDbGFpbSByZWNvcmRcbiAgICAgICAgICBjb25zdCBjbGFpbVJlY29yZCA9IHtcbiAgICAgICAgICAgIG5hbWUgICAgICAgOiBwdWJsaXNoUGFyYW1zLm5hbWUsXG4gICAgICAgICAgICBjbGFpbUlkICAgIDogcHVibGlzaFJlc3VsdHMuY2xhaW1faWQsXG4gICAgICAgICAgICB0aXRsZSAgICAgIDogcHVibGlzaFBhcmFtcy5tZXRhZGF0YS50aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBwdWJsaXNoUGFyYW1zLm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgYWRkcmVzcyAgICA6IHB1Ymxpc2hQYXJhbXMuY2xhaW1fYWRkcmVzcyxcbiAgICAgICAgICAgIHRodW1ibmFpbCAgOiBwdWJsaXNoUGFyYW1zLm1ldGFkYXRhLnRodW1ibmFpbCxcbiAgICAgICAgICAgIG91dHBvaW50ICAgOiBgJHtwdWJsaXNoUmVzdWx0cy50eGlkfToke3B1Ymxpc2hSZXN1bHRzLm5vdXR9YCxcbiAgICAgICAgICAgIGhlaWdodCAgICAgOiAwLFxuICAgICAgICAgICAgY29udGVudFR5cGU6IGZpbGVUeXBlLFxuICAgICAgICAgICAgbnNmdyAgICAgICA6IHB1Ymxpc2hQYXJhbXMubWV0YWRhdGEubnNmdyxcbiAgICAgICAgICAgIGFtb3VudCAgICAgOiBwdWJsaXNoUGFyYW1zLmJpZCxcbiAgICAgICAgICAgIGNlcnRpZmljYXRlSWQsXG4gICAgICAgICAgICBjaGFubmVsTmFtZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIC8vIHVwc2VydCBjcml0ZXJpYVxuICAgICAgICAgIGNvbnN0IHVwc2VydENyaXRlcmlhID0ge1xuICAgICAgICAgICAgbmFtZSAgIDogcHVibGlzaFBhcmFtcy5uYW1lLFxuICAgICAgICAgICAgY2xhaW1JZDogcHVibGlzaFJlc3VsdHMuY2xhaW1faWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyB1cHNlcnQgdGhlIHJlY29yZHNcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW2RiLnVwc2VydChkYi5GaWxlLCBmaWxlUmVjb3JkLCB1cHNlcnRDcml0ZXJpYSwgJ0ZpbGUnKSwgZGIudXBzZXJ0KGRiLkNsYWltLCBjbGFpbVJlY29yZCwgdXBzZXJ0Q3JpdGVyaWEsICdDbGFpbScpXSk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKChbZmlsZSwgY2xhaW1dKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGaWxlIGFuZCBDbGFpbSByZWNvcmRzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkJyk7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtmaWxlLnNldENsYWltKGNsYWltKSwgY2xhaW0uc2V0RmlsZShmaWxlKV0pO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGaWxlIGFuZCBDbGFpbSByZWNvcmRzIHN1Y2Nlc3NmdWxseSBhc3NvY2lhdGVkJyk7XG4gICAgICAgICAgcmVzb2x2ZShwdWJsaXNoUmVzdWx0cyk7IC8vIHJlc29sdmUgdGhlIHByb21pc2Ugd2l0aCB0aGUgcmVzdWx0IGZyb20gbGJyeUFwaS5wdWJsaXNoQ2xhaW07XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdQVUJMSVNIIEVSUk9SJywgZXJyb3IpO1xuICAgICAgICAgIHB1Ymxpc2hIZWxwZXJzLmRlbGV0ZVRlbXBvcmFyeUZpbGUocHVibGlzaFBhcmFtcy5maWxlX3BhdGgpOyAvLyBkZWxldGUgdGhlIGxvY2FsIGZpbGVcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgY2xhaW1OYW1lSXNBdmFpbGFibGUgKG5hbWUpIHtcbiAgICBjb25zdCBjbGFpbUFkZHJlc3NlcyA9IGFkZGl0aW9uYWxDbGFpbUFkZHJlc3NlcyB8fCBbXTtcbiAgICBjbGFpbUFkZHJlc3Nlcy5wdXNoKHByaW1hcnlDbGFpbUFkZHJlc3MpO1xuICAgIC8vIGZpbmQgYW55IHJlY29yZHMgd2hlcmUgdGhlIG5hbWUgaXMgdXNlZFxuICAgIHJldHVybiBkYi5DbGFpbVxuICAgICAgLmZpbmRBbGwoe1xuICAgICAgICBhdHRyaWJ1dGVzOiBbJ2FkZHJlc3MnXSxcbiAgICAgICAgd2hlcmUgICAgIDoge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgYWRkcmVzczoge1xuICAgICAgICAgICAgW09wLm9yXTogY2xhaW1BZGRyZXNzZXMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGF0IGNsYWltIGlzIGFscmVhZHkgaW4gdXNlJyk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSk7XG4gIH0sXG4gIGNoZWNrQ2hhbm5lbEF2YWlsYWJpbGl0eSAobmFtZSkge1xuICAgIHJldHVybiBkYi5DaGFubmVsXG4gICAgICAuZmluZEFsbCh7XG4gICAgICAgIHdoZXJlOiB7IGNoYW5uZWxOYW1lOiBuYW1lIH0sXG4gICAgICB9KVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPj0gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhhdCBjaGFubmVsIGhhcyBhbHJlYWR5IGJlZW4gY2xhaW1lZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSk7XG4gIH0sXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL2NvbnRyb2xsZXJzL3B1Ymxpc2hDb250cm9sbGVyLmpzIiwiY29uc3QgZGIgPSByZXF1aXJlKCcuLi9tb2RlbHMvaW5kZXgnKTtcbmNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGF1dGhlbnRpY2F0ZVVzZXIgKGNoYW5uZWxOYW1lLCBjaGFubmVsSWQsIGNoYW5uZWxQYXNzd29yZCwgdXNlcikge1xuICAgIC8vIGNhc2U6IG5vIGNoYW5uZWxOYW1lIG9yIGNoYW5uZWwgSWQgYXJlIHByb3ZpZGVkIChhbm9ueW1vdXMpLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdXNlciB0b2tlbiBpcyBwcm92aWRlZFxuICAgIGlmICghY2hhbm5lbE5hbWUgJiYgIWNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbm5lbE5hbWUgICA6IG51bGwsXG4gICAgICAgIGNoYW5uZWxDbGFpbUlkOiBudWxsLFxuICAgICAgfTtcbiAgICB9XG4gICAgLy8gY2FzZTogY2hhbm5lbE5hbWUgb3IgY2hhbm5lbCBJZCBhcmUgcHJvdmlkZWQgd2l0aCB1c2VyIHRva2VuXG4gICAgaWYgKHVzZXIpIHtcbiAgICAgIGlmIChjaGFubmVsTmFtZSAmJiBjaGFubmVsTmFtZSAhPT0gdXNlci5jaGFubmVsTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZSBwcm92aWRlZCBjaGFubmVsIG5hbWUgZG9lcyBub3QgbWF0Y2ggdXNlciBjcmVkZW50aWFscycpO1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5uZWxJZCAmJiBjaGFubmVsSWQgIT09IHVzZXIuY2hhbm5lbENsYWltSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgcHJvdmlkZWQgY2hhbm5lbCBpZCBkb2VzIG5vdCBtYXRjaCB1c2VyIGNyZWRlbnRpYWxzJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjaGFubmVsTmFtZSAgIDogdXNlci5jaGFubmVsTmFtZSxcbiAgICAgICAgY2hhbm5lbENsYWltSWQ6IHVzZXIuY2hhbm5lbENsYWltSWQsXG4gICAgICB9O1xuICAgIH1cbiAgICAvLyBjYXNlOiBjaGFubmVsTmFtZSBvciBjaGFubmVsIElkIGFyZSBwcm92aWRlZCB3aXRoIHBhc3N3b3JkIGluc3RlYWQgb2YgdXNlciB0b2tlblxuICAgIGlmICghY2hhbm5lbFBhc3N3b3JkKSB0aHJvdyBuZXcgRXJyb3IoJ25vIGNoYW5uZWwgcGFzc3dvcmQgcHJvdmlkZWQnKTtcbiAgICByZXR1cm4gbW9kdWxlLmV4cG9ydHMuYXV0aGVudGljYXRlQ2hhbm5lbENyZWRlbnRpYWxzKGNoYW5uZWxOYW1lLCBjaGFubmVsSWQsIGNoYW5uZWxQYXNzd29yZCk7XG4gIH0sXG4gIGF1dGhlbnRpY2F0ZUNoYW5uZWxDcmVkZW50aWFscyAoY2hhbm5lbE5hbWUsIGNoYW5uZWxJZCwgdXNlclBhc3N3b3JkKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIGhvaXN0ZWQgdmFyaWFibGVzXG4gICAgICBsZXQgY2hhbm5lbERhdGE7XG4gICAgICAvLyBidWlsZCB0aGUgcGFyYW1zIGZvciBmaW5kaW5nIHRoZSBjaGFubmVsXG4gICAgICBsZXQgY2hhbm5lbEZpbmRQYXJhbXMgPSB7fTtcbiAgICAgIGlmIChjaGFubmVsTmFtZSkgY2hhbm5lbEZpbmRQYXJhbXNbJ2NoYW5uZWxOYW1lJ10gPSBjaGFubmVsTmFtZTtcbiAgICAgIGlmIChjaGFubmVsSWQpIGNoYW5uZWxGaW5kUGFyYW1zWydjaGFubmVsQ2xhaW1JZCddID0gY2hhbm5lbElkO1xuICAgICAgLy8gZmluZCB0aGUgY2hhbm5lbFxuICAgICAgZGIuQ2hhbm5lbFxuICAgICAgICAuZmluZE9uZSh7XG4gICAgICAgICAgd2hlcmU6IGNoYW5uZWxGaW5kUGFyYW1zLFxuICAgICAgICB9KVxuICAgICAgICAudGhlbihjaGFubmVsID0+IHtcbiAgICAgICAgICBpZiAoIWNoYW5uZWwpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zygnbm8gY2hhbm5lbCBmb3VuZCcpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoZW50aWNhdGlvbiBmYWlsZWQsIHlvdSBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhhdCBjaGFubmVsJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNoYW5uZWxEYXRhID0gY2hhbm5lbC5nZXQoKTtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ2NoYW5uZWwgZGF0YTonLCBjaGFubmVsRGF0YSk7XG4gICAgICAgICAgcmV0dXJuIGRiLlVzZXIuZmluZE9uZSh7XG4gICAgICAgICAgICB3aGVyZTogeyB1c2VyTmFtZTogY2hhbm5lbERhdGEuY2hhbm5lbE5hbWUuc3Vic3RyaW5nKDEpIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHVzZXIgPT4ge1xuICAgICAgICAgIGlmICghdXNlcikge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdubyB1c2VyIGZvdW5kJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGhlbnRpY2F0aW9uIGZhaWxlZCwgeW91IGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGF0IGNoYW5uZWwnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVzZXIuY29tcGFyZVBhc3N3b3JkKHVzZXJQYXNzd29yZCk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKGlzTWF0Y2ggPT4ge1xuICAgICAgICAgIGlmICghaXNNYXRjaCkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdpbmNvcnJlY3QgcGFzc3dvcmQnKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkLCB5b3UgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoYXQgY2hhbm5lbCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsb2dnZXIuZGVidWcoJy4uLnBhc3N3b3JkIHdhcyBhIG1hdGNoLi4uJyk7XG4gICAgICAgICAgcmVzb2x2ZShjaGFubmVsRGF0YSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL2F1dGgvYXV0aGVudGljYXRpb24uanMiLCJjb25zdCBDTEFJTVNfUEVSX1BBR0UgPSAxMjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHJldHVyblBhZ2luYXRlZENoYW5uZWxDbGFpbXMgKGNoYW5uZWxOYW1lLCBsb25nQ2hhbm5lbENsYWltSWQsIGNsYWltcywgcGFnZSkge1xuICAgIGNvbnN0IHRvdGFsUGFnZXMgPSBtb2R1bGUuZXhwb3J0cy5kZXRlcm1pbmVUb3RhbFBhZ2VzKGNsYWltcyk7XG4gICAgY29uc3QgcGFnaW5hdGlvblBhZ2UgPSBtb2R1bGUuZXhwb3J0cy5nZXRQYWdlRnJvbVF1ZXJ5KHBhZ2UpO1xuICAgIGNvbnN0IHZpZXdEYXRhID0ge1xuICAgICAgY2hhbm5lbE5hbWUgICAgICAgOiBjaGFubmVsTmFtZSxcbiAgICAgIGxvbmdDaGFubmVsQ2xhaW1JZDogbG9uZ0NoYW5uZWxDbGFpbUlkLFxuICAgICAgY2xhaW1zICAgICAgICAgICAgOiBtb2R1bGUuZXhwb3J0cy5leHRyYWN0UGFnZUZyb21DbGFpbXMoY2xhaW1zLCBwYWdpbmF0aW9uUGFnZSksXG4gICAgICBwcmV2aW91c1BhZ2UgICAgICA6IG1vZHVsZS5leHBvcnRzLmRldGVybWluZVByZXZpb3VzUGFnZShwYWdpbmF0aW9uUGFnZSksXG4gICAgICBjdXJyZW50UGFnZSAgICAgICA6IHBhZ2luYXRpb25QYWdlLFxuICAgICAgbmV4dFBhZ2UgICAgICAgICAgOiBtb2R1bGUuZXhwb3J0cy5kZXRlcm1pbmVOZXh0UGFnZSh0b3RhbFBhZ2VzLCBwYWdpbmF0aW9uUGFnZSksXG4gICAgICB0b3RhbFBhZ2VzICAgICAgICA6IHRvdGFsUGFnZXMsXG4gICAgICB0b3RhbFJlc3VsdHMgICAgICA6IG1vZHVsZS5leHBvcnRzLmRldGVybWluZVRvdGFsQ2xhaW1zKGNsYWltcyksXG4gICAgfTtcbiAgICByZXR1cm4gdmlld0RhdGE7XG4gIH0sXG4gIGdldFBhZ2VGcm9tUXVlcnkgKHBhZ2UpIHtcbiAgICBpZiAocGFnZSkge1xuICAgICAgcmV0dXJuIHBhcnNlSW50KHBhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgZXh0cmFjdFBhZ2VGcm9tQ2xhaW1zIChjbGFpbXMsIHBhZ2VOdW1iZXIpIHtcbiAgICBpZiAoIWNsYWltcykge1xuICAgICAgcmV0dXJuIFtdOyAgLy8gaWYgbm8gY2xhaW1zLCByZXR1cm4gdGhpcyBkZWZhdWx0XG4gICAgfVxuICAgIC8vIGxvZ2dlci5kZWJ1ZygnY2xhaW1zIGlzIGFycmF5PycsIEFycmF5LmlzQXJyYXkoY2xhaW1zKSk7XG4gICAgLy8gbG9nZ2VyLmRlYnVnKGBwYWdlTnVtYmVyICR7cGFnZU51bWJlcn0gaXMgbnVtYmVyP2AsIE51bWJlci5pc0ludGVnZXIocGFnZU51bWJlcikpO1xuICAgIGNvbnN0IGNsYWltU3RhcnRJbmRleCA9IChwYWdlTnVtYmVyIC0gMSkgKiBDTEFJTVNfUEVSX1BBR0U7XG4gICAgY29uc3QgY2xhaW1FbmRJbmRleCA9IGNsYWltU3RhcnRJbmRleCArIENMQUlNU19QRVJfUEFHRTtcbiAgICBjb25zdCBwYWdlT2ZDbGFpbXMgPSBjbGFpbXMuc2xpY2UoY2xhaW1TdGFydEluZGV4LCBjbGFpbUVuZEluZGV4KTtcbiAgICByZXR1cm4gcGFnZU9mQ2xhaW1zO1xuICB9LFxuICBkZXRlcm1pbmVUb3RhbFBhZ2VzIChjbGFpbXMpIHtcbiAgICBpZiAoIWNsYWltcykge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRvdGFsQ2xhaW1zID0gY2xhaW1zLmxlbmd0aDtcbiAgICAgIGlmICh0b3RhbENsYWltcyA8IENMQUlNU19QRVJfUEFHRSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZ1bGxQYWdlcyA9IE1hdGguZmxvb3IodG90YWxDbGFpbXMgLyBDTEFJTVNfUEVSX1BBR0UpO1xuICAgICAgY29uc3QgcmVtYWluZGVyID0gdG90YWxDbGFpbXMgJSBDTEFJTVNfUEVSX1BBR0U7XG4gICAgICBpZiAocmVtYWluZGVyID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmdWxsUGFnZXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVsbFBhZ2VzICsgMTtcbiAgICB9XG4gIH0sXG4gIGRldGVybWluZVByZXZpb3VzUGFnZSAoY3VycmVudFBhZ2UpIHtcbiAgICBpZiAoY3VycmVudFBhZ2UgPT09IDEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudFBhZ2UgLSAxO1xuICB9LFxuICBkZXRlcm1pbmVOZXh0UGFnZSAodG90YWxQYWdlcywgY3VycmVudFBhZ2UpIHtcbiAgICBpZiAoY3VycmVudFBhZ2UgPT09IHRvdGFsUGFnZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudFBhZ2UgKyAxO1xuICB9LFxuICBkZXRlcm1pbmVUb3RhbENsYWltcyAoY2xhaW1zKSB7XG4gICAgaWYgKCFjbGFpbXMpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gY2xhaW1zLmxlbmd0aDtcbiAgfSxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvaGVscGVycy9jaGFubmVsUGFnaW5hdGlvbi5qcyIsImNvbnN0IHsgZGV0YWlsczogaG9zdCB9ID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnL3NpdGVDb25maWcuanMnKTtcbmNvbnN0IGhhbmRsZVBhZ2VSZW5kZXIgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2hhbmRsZVBhZ2VSZW5kZXIuanN4Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKGFwcCkgPT4ge1xuICAvLyByb3V0ZSBmb3IgdGhlIGhvbWUgcGFnZVxuICBhcHAuZ2V0KCcvJywgKHJlcSwgcmVzKSA9PiB7XG4gICAgaGFuZGxlUGFnZVJlbmRlcihyZXEsIHJlcyk7XG4gIH0pO1xuICAvLyByb3V0ZSB0byBkaXNwbGF5IGxvZ2luIHBhZ2VcbiAgYXBwLmdldCgnL2xvZ2luJywgKHJlcSwgcmVzKSA9PiB7XG4gICAgaGFuZGxlUGFnZVJlbmRlcihyZXEsIHJlcyk7XG4gIH0pO1xuICAvLyByb3V0ZSB0byBzaG93ICdhYm91dCcgcGFnZVxuICBhcHAuZ2V0KCcvYWJvdXQnLCAocmVxLCByZXMpID0+IHtcbiAgICBoYW5kbGVQYWdlUmVuZGVyKHJlcSwgcmVzKTtcbiAgfSk7XG4gIC8vIHJvdXRlIHRvIGRpc3BsYXkgYSBsaXN0IG9mIHRoZSB0cmVuZGluZyBpbWFnZXNcbiAgYXBwLmdldCgnL3RyZW5kaW5nJywgKHJlcSwgcmVzKSA9PiB7XG4gICAgcmVzLnN0YXR1cygzMDEpLnJlZGlyZWN0KCcvcG9wdWxhcicpO1xuICB9KTtcbiAgYXBwLmdldCgnL3BvcHVsYXInLCAocmVxLCByZXMpID0+IHtcbiAgICBoYW5kbGVQYWdlUmVuZGVyKHJlcSwgcmVzKTtcbiAgfSk7XG4gIC8vIHJvdXRlIHRvIGRpc3BsYXkgYSBsaXN0IG9mIHRoZSB0cmVuZGluZyBpbWFnZXNcbiAgYXBwLmdldCgnL25ldycsIChyZXEsIHJlcykgPT4ge1xuICAgIGhhbmRsZVBhZ2VSZW5kZXIocmVxLCByZXMpO1xuICB9KTtcbiAgLy8gcm91dGUgdG8gc2VuZCBlbWJlZGFibGUgdmlkZW8gcGxheWVyIChmb3IgdHdpdHRlcilcbiAgYXBwLmdldCgnL2VtYmVkLzpjbGFpbUlkLzpuYW1lJywgKHsgcGFyYW1zIH0sIHJlcykgPT4ge1xuICAgIGNvbnN0IGNsYWltSWQgPSBwYXJhbXMuY2xhaW1JZDtcbiAgICBjb25zdCBuYW1lID0gcGFyYW1zLm5hbWU7XG4gICAgLy8gZ2V0IGFuZCByZW5kZXIgdGhlIGNvbnRlbnRcbiAgICByZXMuc3RhdHVzKDIwMCkucmVuZGVyKCdlbWJlZCcsIHsgbGF5b3V0OiAnZW1iZWQnLCBob3N0LCBjbGFpbUlkLCBuYW1lIH0pO1xuICB9KTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvcm91dGVzL3BhZ2Utcm91dGVzLmpzIiwiaW1wb3J0ICogYXMgYWN0aW9ucyBmcm9tICdjb25zdGFudHMvcHVibGlzaF9hY3Rpb25fdHlwZXMnO1xuaW1wb3J0IHsgTE9HSU4gfSBmcm9tICdjb25zdGFudHMvcHVibGlzaF9jaGFubmVsX3NlbGVjdF9zdGF0ZXMnO1xuY29uc3QgeyBwdWJsaXNoaW5nIH0gPSByZXF1aXJlKCcuLi8uLi9jb25maWcvc2l0ZUNvbmZpZy5qcycpO1xuXG5jb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gIGRpc2FibGVkICAgICAgICAgIDogcHVibGlzaGluZy5kaXNhYmxlZCxcbiAgZGlzYWJsZWRNZXNzYWdlICAgOiBwdWJsaXNoaW5nLmRpc2FibGVkTWVzc2FnZSxcbiAgcHVibGlzaEluQ2hhbm5lbCAgOiBmYWxzZSxcbiAgc2VsZWN0ZWRDaGFubmVsICAgOiBMT0dJTixcbiAgc2hvd01ldGFkYXRhSW5wdXRzOiBmYWxzZSxcbiAgc3RhdHVzICAgICAgICAgICAgOiB7XG4gICAgc3RhdHVzIDogbnVsbCxcbiAgICBtZXNzYWdlOiBudWxsLFxuICB9LFxuICBlcnJvcjoge1xuICAgIGZpbGUgICAgICAgICA6IG51bGwsXG4gICAgdXJsICAgICAgICAgIDogbnVsbCxcbiAgICBjaGFubmVsICAgICAgOiBudWxsLFxuICAgIHB1Ymxpc2hTdWJtaXQ6IG51bGwsXG4gIH0sXG4gIGZpbGUgICAgOiBudWxsLFxuICBjbGFpbSAgIDogJycsXG4gIG1ldGFkYXRhOiB7XG4gICAgdGl0bGUgICAgICA6ICcnLFxuICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICBsaWNlbnNlICAgIDogJycsXG4gICAgbnNmdyAgICAgICA6IGZhbHNlLFxuICB9LFxuICB0aHVtYm5haWw6IG51bGwsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoc3RhdGUgPSBpbml0aWFsU3RhdGUsIGFjdGlvbikge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBhY3Rpb25zLkZJTEVfU0VMRUNURUQ6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgaW5pdGlhbFN0YXRlLCB7ICAvLyBub3RlOiBjbGVhcnMgdG8gaW5pdGlhbCBzdGF0ZVxuICAgICAgICBmaWxlOiBhY3Rpb24uZGF0YSxcbiAgICAgIH0pO1xuICAgIGNhc2UgYWN0aW9ucy5GSUxFX0NMRUFSOlxuICAgICAgcmV0dXJuIGluaXRpYWxTdGF0ZTtcbiAgICBjYXNlIGFjdGlvbnMuTUVUQURBVEFfVVBEQVRFOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIG1ldGFkYXRhOiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5tZXRhZGF0YSwge1xuICAgICAgICAgIFthY3Rpb24uZGF0YS5uYW1lXTogYWN0aW9uLmRhdGEudmFsdWUsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG4gICAgY2FzZSBhY3Rpb25zLkNMQUlNX1VQREFURTpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBjbGFpbTogYWN0aW9uLmRhdGEsXG4gICAgICB9KTtcbiAgICBjYXNlIGFjdGlvbnMuU0VUX1BVQkxJU0hfSU5fQ0hBTk5FTDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBwdWJsaXNoSW5DaGFubmVsOiBhY3Rpb24uY2hhbm5lbCxcbiAgICAgIH0pO1xuICAgIGNhc2UgYWN0aW9ucy5QVUJMSVNIX1NUQVRVU19VUERBVEU6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgc3RhdHVzOiBhY3Rpb24uZGF0YSxcbiAgICAgIH0pO1xuICAgIGNhc2UgYWN0aW9ucy5FUlJPUl9VUERBVEU6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgZXJyb3I6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmVycm9yLCB7XG4gICAgICAgICAgW2FjdGlvbi5kYXRhLm5hbWVdOiBhY3Rpb24uZGF0YS52YWx1ZSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICBjYXNlIGFjdGlvbnMuU0VMRUNURURfQ0hBTk5FTF9VUERBVEU6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgc2VsZWN0ZWRDaGFubmVsOiBhY3Rpb24uZGF0YSxcbiAgICAgIH0pO1xuICAgIGNhc2UgYWN0aW9ucy5UT0dHTEVfTUVUQURBVEFfSU5QVVRTOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIHNob3dNZXRhZGF0YUlucHV0czogYWN0aW9uLmRhdGEsXG4gICAgICB9KTtcbiAgICBjYXNlIGFjdGlvbnMuVEhVTUJOQUlMX05FVzpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICB0aHVtYm5haWw6IGFjdGlvbi5kYXRhLFxuICAgICAgfSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3JlZHVjZXJzL3B1Ymxpc2guanMiLCJleHBvcnQgY29uc3QgTE9HSU4gPSAnRXhpc3RpbmcnO1xuZXhwb3J0IGNvbnN0IENSRUFURSA9ICdOZXcnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnN0YW50cy9wdWJsaXNoX2NoYW5uZWxfc2VsZWN0X3N0YXRlcy5qcyIsImltcG9ydCAqIGFzIGFjdGlvbnMgZnJvbSAnY29uc3RhbnRzL2NoYW5uZWxfYWN0aW9uX3R5cGVzJztcblxuY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICBsb2dnZWRJbkNoYW5uZWw6IHtcbiAgICBuYW1lICAgOiBudWxsLFxuICAgIHNob3J0SWQ6IG51bGwsXG4gICAgbG9uZ0lkIDogbnVsbCxcbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzdGF0ZSA9IGluaXRpYWxTdGF0ZSwgYWN0aW9uKSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIGFjdGlvbnMuQ0hBTk5FTF9VUERBVEU6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgbG9nZ2VkSW5DaGFubmVsOiBhY3Rpb24uZGF0YSxcbiAgICAgIH0pO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9yZWR1Y2Vycy9jaGFubmVsLmpzIiwiaW1wb3J0ICogYXMgYWN0aW9ucyBmcm9tICdjb25zdGFudHMvc2hvd19hY3Rpb25fdHlwZXMnO1xuaW1wb3J0IHsgTE9DQUxfQ0hFQ0ssIEVSUk9SIH0gZnJvbSAnY29uc3RhbnRzL2Fzc2V0X2Rpc3BsYXlfc3RhdGVzJztcblxuY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICByZXF1ZXN0OiB7XG4gICAgZXJyb3I6IG51bGwsXG4gICAgdHlwZSA6IG51bGwsXG4gICAgaWQgICA6IG51bGwsXG4gIH0sXG4gIHJlcXVlc3RMaXN0IDoge30sXG4gIGNoYW5uZWxMaXN0IDoge30sXG4gIGFzc2V0TGlzdCAgIDoge30sXG4gIGRpc3BsYXlBc3NldDoge1xuICAgIGVycm9yIDogbnVsbCxcbiAgICBzdGF0dXM6IExPQ0FMX0NIRUNLLFxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24pIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIC8vIGhhbmRsZSByZXF1ZXN0XG4gICAgY2FzZSBhY3Rpb25zLlJFUVVFU1RfRVJST1I6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgcmVxdWVzdDogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVxdWVzdCwge1xuICAgICAgICAgIGVycm9yOiBhY3Rpb24uZGF0YSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICBjYXNlIGFjdGlvbnMuUkVRVUVTVF9VUERBVEU6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgcmVxdWVzdDogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVxdWVzdCwge1xuICAgICAgICAgIHR5cGU6IGFjdGlvbi5kYXRhLnJlcXVlc3RUeXBlLFxuICAgICAgICAgIGlkICA6IGFjdGlvbi5kYXRhLnJlcXVlc3RJZCxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICAvLyBzdG9yZSByZXF1ZXN0c1xuICAgIGNhc2UgYWN0aW9ucy5SRVFVRVNUX0xJU1RfQUREOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIHJlcXVlc3RMaXN0OiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZXF1ZXN0TGlzdCwge1xuICAgICAgICAgIFthY3Rpb24uZGF0YS5pZF06IHtcbiAgICAgICAgICAgIGVycm9yOiBhY3Rpb24uZGF0YS5lcnJvcixcbiAgICAgICAgICAgIGtleSAgOiBhY3Rpb24uZGF0YS5rZXksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICAvLyBhc3NldCBkYXRhXG4gICAgY2FzZSBhY3Rpb25zLkFTU0VUX0FERDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBhc3NldExpc3Q6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmFzc2V0TGlzdCwge1xuICAgICAgICAgIFthY3Rpb24uZGF0YS5pZF06IHtcbiAgICAgICAgICAgIGVycm9yICAgIDogYWN0aW9uLmRhdGEuZXJyb3IsXG4gICAgICAgICAgICBuYW1lICAgICA6IGFjdGlvbi5kYXRhLm5hbWUsXG4gICAgICAgICAgICBjbGFpbUlkICA6IGFjdGlvbi5kYXRhLmNsYWltSWQsXG4gICAgICAgICAgICBzaG9ydElkICA6IGFjdGlvbi5kYXRhLnNob3J0SWQsXG4gICAgICAgICAgICBjbGFpbURhdGE6IGFjdGlvbi5kYXRhLmNsYWltRGF0YSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIC8vIGNoYW5uZWwgZGF0YVxuICAgIGNhc2UgYWN0aW9ucy5DSEFOTkVMX0FERDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBjaGFubmVsTGlzdDogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuY2hhbm5lbExpc3QsIHtcbiAgICAgICAgICBbYWN0aW9uLmRhdGEuaWRdOiB7XG4gICAgICAgICAgICBuYW1lICAgICAgOiBhY3Rpb24uZGF0YS5uYW1lLFxuICAgICAgICAgICAgbG9uZ0lkICAgIDogYWN0aW9uLmRhdGEubG9uZ0lkLFxuICAgICAgICAgICAgc2hvcnRJZCAgIDogYWN0aW9uLmRhdGEuc2hvcnRJZCxcbiAgICAgICAgICAgIGNsYWltc0RhdGE6IGFjdGlvbi5kYXRhLmNsYWltc0RhdGEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICBjYXNlIGFjdGlvbnMuQ0hBTk5FTF9DTEFJTVNfVVBEQVRFX1NVQ0NFU1M6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgY2hhbm5lbExpc3Q6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmNoYW5uZWxMaXN0LCB7XG4gICAgICAgICAgW2FjdGlvbi5kYXRhLmNoYW5uZWxMaXN0SWRdOiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5jaGFubmVsTGlzdFthY3Rpb24uZGF0YS5jaGFubmVsTGlzdElkXSwge1xuICAgICAgICAgICAgY2xhaW1zRGF0YTogYWN0aW9uLmRhdGEuY2xhaW1zRGF0YSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICAvLyBkaXNwbGF5IGFuIGFzc2V0XG4gICAgY2FzZSBhY3Rpb25zLkZJTEVfQVZBSUxBQklMSVRZX1VQREFURTpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBkaXNwbGF5QXNzZXQ6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmRpc3BsYXlBc3NldCwge1xuICAgICAgICAgIHN0YXR1czogYWN0aW9uLmRhdGEsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG4gICAgY2FzZSBhY3Rpb25zLkRJU1BMQVlfQVNTRVRfRVJST1I6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgZGlzcGxheUFzc2V0OiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5kaXNwbGF5QXNzZXQsIHtcbiAgICAgICAgICBlcnJvciA6IGFjdGlvbi5kYXRhLFxuICAgICAgICAgIHN0YXR1czogRVJST1IsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3JlZHVjZXJzL3Nob3cuanMiLCJjb25zdCBzaXRlQ29uZmlnID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnL3NpdGVDb25maWcuanMnKTtcblxuY29uc3Qge1xuICBhbmFseXRpY3M6IHtcbiAgICBnb29nbGVJZDogZ29vZ2xlQW5hbHl0aWNzSWQsXG4gIH0sXG4gIGFzc2V0RGVmYXVsdHM6IHtcbiAgICB0aHVtYm5haWw6IGRlZmF1bHRUaHVtYm5haWwsXG4gICAgZGVzY3JpcHRpb246IGRlZmF1bHREZXNjcmlwdGlvbixcbiAgfSxcbiAgZGV0YWlsczoge1xuICAgIGRlc2NyaXB0aW9uLFxuICAgIGhvc3QsXG4gICAgdGl0bGUsXG4gICAgdHdpdHRlcixcbiAgfSxcbn0gPSBzaXRlQ29uZmlnO1xuXG5jb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gIGRlc2NyaXB0aW9uLFxuICBnb29nbGVBbmFseXRpY3NJZCxcbiAgaG9zdCxcbiAgdGl0bGUsXG4gIHR3aXR0ZXIsXG4gIGRlZmF1bHREZXNjcmlwdGlvbixcbiAgZGVmYXVsdFRodW1ibmFpbCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzdGF0ZSA9IGluaXRpYWxTdGF0ZSwgYWN0aW9uKSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvcmVkdWNlcnMvc2l0ZS5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWdhXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwicmVhY3QtZ2FcIlxuLy8gbW9kdWxlIGlkID0gOTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY3Jvc3MtZmV0Y2gvcG9seWZpbGxcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJjcm9zcy1mZXRjaC9wb2x5ZmlsbFwiXG4vLyBtb2R1bGUgaWQgPSA5M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IE5hdkJhciBmcm9tICdjb250YWluZXJzL05hdkJhcic7XG5pbXBvcnQgU0VPIGZyb20gJ2NvbXBvbmVudHMvU0VPJztcblxuY2xhc3MgQWJvdXRQYWdlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAgPFNFTyBwYWdlVGl0bGU9eydBYm91dCd9IHBhZ2VVcmk9eydhYm91dCd9IC8+XG4gICAgICAgIDxOYXZCYXIgLz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCc+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTUgY29sdW1uLS1tZWQtMTAgYWxpZ24tY29udGVudC10b3AnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTggY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9J3B1bGwtcXVvdGUnPlNwZWUuY2ggaXMgYW4gb3Blbi1zb3VyY2UgcHJvamVjdC4gIFBsZWFzZSBjb250cmlidXRlIHRvIHRoZSBleGlzdGluZyBzaXRlLCBvciBmb3JrIGl0IGFuZCBtYWtlIHlvdXIgb3duLjwvcD5cbiAgICAgICAgICAgICAgPHA+PGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyB0YXJnZXQ9J19ibGFuaycgaHJlZj0naHR0cHM6Ly90d2l0dGVyLmNvbS9zcGVlX2NoJz5UV0lUVEVSPC9hPjwvcD5cbiAgICAgICAgICAgICAgPHA+PGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyB0YXJnZXQ9J19ibGFuaycgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL2xicnlpby9zcGVlLmNoJz5HSVRIVUI8L2E+PC9wPlxuICAgICAgICAgICAgICA8cD48YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRhcmdldD0nX2JsYW5rJyBocmVmPSdodHRwczovL2Rpc2NvcmQuZ2cvWWpZYndoUyc+RElTQ09SRCBDSEFOTkVMPC9hPjwvcD5cbiAgICAgICAgICAgICAgPHA+PGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyB0YXJnZXQ9J19ibGFuaycgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL2xicnlpby9zcGVlLmNoL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCc+RE9DVU1FTlRBVElPTjwvYT48L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj48ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tNSBjb2x1bW4tLW1lZC0xMCBhbGlnbi1jb250ZW50LXRvcCc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tOCBjb2x1bW4tLW1lZC0xMCc+XG4gICAgICAgICAgICAgIDxwPlNwZWUuY2ggaXMgYSBtZWRpYS1ob3N0aW5nIHNpdGUgdGhhdCByZWFkcyBmcm9tIGFuZCBwdWJsaXNoZXMgY29udGVudCB0byB0aGUgPGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyBocmVmPSdodHRwczovL2xicnkuaW8nPkxCUlk8L2E+IGJsb2NrY2hhaW4uPC9wPlxuICAgICAgICAgICAgICA8cD5TcGVlLmNoIGlzIGEgaG9zdGluZyBzZXJ2aWNlLCBidXQgd2l0aCB0aGUgYWRkZWQgYmVuZWZpdCB0aGF0IGl0IHN0b3JlcyB5b3VyIGNvbnRlbnQgb24gYSBkZWNlbnRyYWxpemVkIG5ldHdvcmsgb2YgY29tcHV0ZXJzIC0tIHRoZSA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIGhyZWY9J2h0dHBzOi8vbGJyeS5pby9nZXQnPkxCUlk8L2E+IG5ldHdvcmsuICBUaGlzIG1lYW5zIHRoYXQgeW91ciBpbWFnZXMgYXJlIHN0b3JlZCBpbiBtdWx0aXBsZSBsb2NhdGlvbnMgd2l0aG91dCBhIHNpbmdsZSBwb2ludCBvZiBmYWlsdXJlLjwvcD5cbiAgICAgICAgICAgICAgPGgzPkNvbnRyaWJ1dGU8L2gzPlxuICAgICAgICAgICAgICA8cD5JZiB5b3UgaGF2ZSBhbiBpZGVhIGZvciB5b3VyIG93biBzcGVlLmNoLWxpa2Ugc2l0ZSBvbiB0b3Agb2YgTEJSWSwgZm9yayBvdXIgPGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vbGJyeWlvL3NwZWUuY2gnPmdpdGh1YiByZXBvPC9hPiBhbmQgZ28gdG8gdG93biE8L3A+XG4gICAgICAgICAgICAgIDxwPklmIHlvdSB3YW50IHRvIGltcHJvdmUgc3BlZS5jaCwgam9pbiBvdXIgPGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyBocmVmPSdodHRwczovL2Rpc2NvcmQuZ2cvWWpZYndoUyc+ZGlzY29yZCBjaGFubmVsPC9hPiBvciBzb2x2ZSBvbmUgb2Ygb3VyIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL2xicnlpby9zcGVlLmNoL2lzc3Vlcyc+Z2l0aHViIGlzc3VlczwvYT4uPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQWJvdXRQYWdlO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3BhZ2VzL0Fib3V0UGFnZS9pbmRleC5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTmF2TGluaywgd2l0aFJvdXRlciB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuaW1wb3J0IExvZ28gZnJvbSAnY29tcG9uZW50cy9Mb2dvJztcbmltcG9ydCBOYXZCYXJDaGFubmVsRHJvcGRvd24gZnJvbSAnY29tcG9uZW50cy9OYXZCYXJDaGFubmVsT3B0aW9uc0Ryb3Bkb3duJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJ3V0aWxzL3JlcXVlc3QnO1xuXG5jb25zdCBWSUVXID0gJ1ZJRVcnO1xuY29uc3QgTE9HT1VUID0gJ0xPR09VVCc7XG5cbmNsYXNzIE5hdkJhciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmNoZWNrRm9yTG9nZ2VkSW5Vc2VyID0gdGhpcy5jaGVja0ZvckxvZ2dlZEluVXNlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMubG9nb3V0VXNlciA9IHRoaXMubG9nb3V0VXNlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlU2VsZWN0aW9uID0gdGhpcy5oYW5kbGVTZWxlY3Rpb24uYmluZCh0aGlzKTtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSB1c2VyIGlzIGFscmVhZHkgbG9nZ2VkIGluXG4gICAgdGhpcy5jaGVja0ZvckxvZ2dlZEluVXNlcigpO1xuICB9XG4gIGNoZWNrRm9yTG9nZ2VkSW5Vc2VyICgpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7Y3JlZGVudGlhbHM6ICdpbmNsdWRlJ307XG4gICAgcmVxdWVzdCgnL3VzZXInLCBwYXJhbXMpXG4gICAgICAudGhlbigoeyBkYXRhIH0pID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5uZWxMb2dpbihkYXRhLmNoYW5uZWxOYW1lLCBkYXRhLnNob3J0Q2hhbm5lbElkLCBkYXRhLmNoYW5uZWxDbGFpbUlkKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnL3VzZXIgZXJyb3I6JywgZXJyb3IubWVzc2FnZSk7XG4gICAgICB9KTtcbiAgfVxuICBsb2dvdXRVc2VyICgpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7Y3JlZGVudGlhbHM6ICdpbmNsdWRlJ307XG4gICAgcmVxdWVzdCgnL2xvZ291dCcsIHBhcmFtcylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5uZWxMb2dvdXQoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnL2xvZ291dCBlcnJvcicsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfSk7XG4gIH1cbiAgaGFuZGxlU2VsZWN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnNlbGVjdGVkT3B0aW9uc1swXS52YWx1ZTtcbiAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICBjYXNlIExPR09VVDpcbiAgICAgICAgdGhpcy5sb2dvdXRVc2VyKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWSUVXOlxuICAgICAgICAvLyByZWRpcmVjdCB0byBjaGFubmVsIHBhZ2VcbiAgICAgICAgdGhpcy5wcm9wcy5oaXN0b3J5LnB1c2goYC8ke3RoaXMucHJvcHMuY2hhbm5lbE5hbWV9OiR7dGhpcy5wcm9wcy5jaGFubmVsTG9uZ0lkfWApO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgc2l0ZURlc2NyaXB0aW9uIH0gPSAgdGhpcy5wcm9wcztcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXdpZGUgbmF2LWJhcic+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQgcm93LS1zaG9ydCBmbGV4LWNvbnRhaW5lci0tcm93IGZsZXgtY29udGFpbmVyLS1zcGFjZS1iZXR3ZWVuLWNlbnRlcic+XG4gICAgICAgICAgPExvZ28gLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nbmF2LWJhci0tY2VudGVyJz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nbmF2LWJhci10YWdsaW5lJz57c2l0ZURlc2NyaXB0aW9ufTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nbmF2LWJhci0tcmlnaHQnPlxuICAgICAgICAgICAgPE5hdkxpbmsgY2xhc3NOYW1lPSduYXYtYmFyLWxpbmsgbGluay0tbmF2JyBhY3RpdmVDbGFzc05hbWU9J2xpbmstLW5hdi1hY3RpdmUnIHRvPScvJyBleGFjdD5QdWJsaXNoPC9OYXZMaW5rPlxuICAgICAgICAgICAgPE5hdkxpbmsgY2xhc3NOYW1lPSduYXYtYmFyLWxpbmsgbGluay0tbmF2JyAgYWN0aXZlQ2xhc3NOYW1lPSdsaW5rLS1uYXYtYWN0aXZlJyB0bz0nL2Fib3V0Jz5BYm91dDwvTmF2TGluaz5cbiAgICAgICAgICAgIHsgdGhpcy5wcm9wcy5jaGFubmVsTmFtZSA/IChcbiAgICAgICAgICAgICAgPE5hdkJhckNoYW5uZWxEcm9wZG93blxuICAgICAgICAgICAgICAgIGNoYW5uZWxOYW1lPXt0aGlzLnByb3BzLmNoYW5uZWxOYW1lfVxuICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdGlvbj17dGhpcy5oYW5kbGVTZWxlY3Rpb259XG4gICAgICAgICAgICAgICAgZGVmYXVsdFNlbGVjdGlvbj17dGhpcy5wcm9wcy5jaGFubmVsTmFtZX1cbiAgICAgICAgICAgICAgICBWSUVXPXtWSUVXfVxuICAgICAgICAgICAgICAgIExPR09VVD17TE9HT1VUfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPE5hdkxpbmsgaWQ9J25hdi1iYXItbG9naW4tbGluaycgY2xhc3NOYW1lPSduYXYtYmFyLWxpbmsgbGluay0tbmF2JyBhY3RpdmVDbGFzc05hbWU9J2xpbmstLW5hdi1hY3RpdmUnIHRvPScvbG9naW4nPkNoYW5uZWw8L05hdkxpbms+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgd2l0aFJvdXRlcihOYXZCYXIpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvTmF2QmFyL3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IExpbmsgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcblxuZnVuY3Rpb24gTG9nbyAoKSB7XG4gIHJldHVybiAoXG4gICAgPHN2ZyB2ZXJzaW9uPScxLjEnIGlkPSdMYXllcl8xJyB4PScwcHgnIHk9JzBweCcgaGVpZ2h0PScyNHB4JyB2aWV3Qm94PScwIDAgODAgMzEnIGVuYWJsZUJhY2tncm91bmQ9J25ldyAwIDAgODAgMzEnIGNsYXNzTmFtZT0nbmF2LWJhci1sb2dvJz5cbiAgICAgIDxMaW5rIHRvPScvJz5cbiAgICAgICAgPHRpdGxlPkxvZ288L3RpdGxlPlxuICAgICAgICA8ZGVzYz5TcGVlLmNoIGxvZ288L2Rlc2M+XG4gICAgICAgIDxnIGlkPSdBYm91dCc+XG4gICAgICAgICAgPGcgaWQ9J1B1Ymxpc2gtRm9ybS1WMi1feDI4X2ZpbGxlZF94MjlfJyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgtNDIuMDAwMDAwLCAtMjMuMDAwMDAwKSc+XG4gICAgICAgICAgICA8ZyBpZD0nR3JvdXAtMTcnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKDQyLjAwMDAwMCwgMjIuMDAwMDAwKSc+XG4gICAgICAgICAgICAgIDx0ZXh0IHRyYW5zZm9ybT0nbWF0cml4KDEgMCAwIDEgMCAyMCknIGZvbnRTaXplPScyNScgZm9udEZhbWlseT0nUm9ib3RvJz5TcGVlJmx0O2g8L3RleHQ+XG4gICAgICAgICAgICAgIDxnIGlkPSdHcm91cC0xNicgdHJhbnNmb3JtPSd0cmFuc2xhdGUoMC4wMDAwMDAsIDMwLjAwMDAwMCknPlxuICAgICAgICAgICAgICAgIDxwYXRoIGlkPSdMaW5lLTgnIGZpbGw9J25vbmUnIHN0cm9rZT0nIzA5RjkxMScgc3Ryb2tlV2lkdGg9JzEnIHN0cm9rZUxpbmVjYXA9J3NxdWFyZScgZD0nTTAuNSwxLjVoMTUnIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggaWQ9J0xpbmUtOC1Db3B5JyBmaWxsPSdub25lJyBzdHJva2U9JyMwMjlENzQnIHN0cm9rZVdpZHRoPScxJyBzdHJva2VMaW5lY2FwPSdzcXVhcmUnIGQ9J00xNi41LDEuNWgxNScgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBpZD0nTGluZS04LUNvcHktMicgZmlsbD0nbm9uZScgc3Ryb2tlPScjRTM1QkQ4JyBzdHJva2VXaWR0aD0nMScgc3Ryb2tlTGluZWNhcD0nc3F1YXJlJyBkPSdNMzIuNSwxLjVoMTUnIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggaWQ9J0xpbmUtOC1Db3B5LTMnIGZpbGw9J25vbmUnIHN0cm9rZT0nIzQxNTZDNScgc3Ryb2tlV2lkdGg9JzEnIHN0cm9rZUxpbmVjYXA9J3NxdWFyZScgZD0nTTQ4LjUsMS41aDE1JyAvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGlkPSdMaW5lLTgtQ29weS00JyBmaWxsPSdub25lJyBzdHJva2U9JyM2MzU2ODgnIHN0cm9rZVdpZHRoPScxJyBzdHJva2VMaW5lY2FwPSdzcXVhcmUnIGQ9J002NC41LDEuNWgxNScgLz5cbiAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPC9nPlxuICAgICAgICAgIDwvZz5cbiAgICAgICAgPC9nPlxuICAgICAgPC9MaW5rPlxuICAgIDwvc3ZnPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTG9nbztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb21wb25lbnRzL0xvZ28vaW5kZXguanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZnVuY3Rpb24gTmF2QmFyQ2hhbm5lbERyb3Bkb3duICh7IGNoYW5uZWxOYW1lLCBoYW5kbGVTZWxlY3Rpb24sIGRlZmF1bHRTZWxlY3Rpb24sIFZJRVcsIExPR09VVCB9KSB7XG4gIHJldHVybiAoXG4gICAgPHNlbGVjdCB0eXBlPSd0ZXh0JyBpZD0nbmF2LWJhci1jaGFubmVsLXNlbGVjdCcgY2xhc3NOYW1lPSdzZWxlY3Qgc2VsZWN0LS1hcnJvdyBsaW5rLS1uYXYnIG9uQ2hhbmdlPXtoYW5kbGVTZWxlY3Rpb259IHZhbHVlPXtkZWZhdWx0U2VsZWN0aW9ufT5cbiAgICAgIDxvcHRpb24gaWQ9J25hdi1iYXItY2hhbm5lbC1zZWxlY3QtY2hhbm5lbC1vcHRpb24nPntjaGFubmVsTmFtZX08L29wdGlvbj5cbiAgICAgIDxvcHRpb24gdmFsdWU9e1ZJRVd9PlZpZXc8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gdmFsdWU9e0xPR09VVH0+TG9nb3V0PC9vcHRpb24+XG4gICAgPC9zZWxlY3Q+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBOYXZCYXJDaGFubmVsRHJvcGRvd247XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29tcG9uZW50cy9OYXZCYXJDaGFubmVsT3B0aW9uc0Ryb3Bkb3duL2luZGV4LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgSGVsbWV0IGZyb20gJ3JlYWN0LWhlbG1ldCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5pbXBvcnQgeyBjcmVhdGVQYWdlVGl0bGUgfSBmcm9tICd1dGlscy9wYWdlVGl0bGUnO1xuaW1wb3J0IHsgY3JlYXRlTWV0YVRhZ3MgfSBmcm9tICd1dGlscy9tZXRhVGFncyc7XG5pbXBvcnQgeyBjcmVhdGVDYW5vbmljYWxMaW5rIH0gZnJvbSAndXRpbHMvY2Fub25pY2FsTGluayc7XG5cbmNsYXNzIFNFTyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgLy8gcHJvcHMgZnJvbSBzdGF0ZVxuICAgIGNvbnN0IHsgZGVmYXVsdERlc2NyaXB0aW9uLCBkZWZhdWx0VGh1bWJuYWlsLCBzaXRlRGVzY3JpcHRpb24sIHNpdGVIb3N0LCBzaXRlVGl0bGUsIHNpdGVUd2l0dGVyIH0gPSB0aGlzLnByb3BzO1xuICAgIC8vIHByb3BzIGZyb20gcGFyZW50XG4gICAgY29uc3QgeyBhc3NldCwgY2hhbm5lbCwgcGFnZVVyaSB9ID0gdGhpcy5wcm9wcztcbiAgICBsZXQgeyBwYWdlVGl0bGUgfSA9IHRoaXMucHJvcHM7XG4gICAgLy8gY3JlYXRlIHBhZ2UgdGl0bGUsIHRhZ3MsIGFuZCBjYW5vbmljYWwgbGlua1xuICAgIHBhZ2VUaXRsZSA9IGNyZWF0ZVBhZ2VUaXRsZShzaXRlVGl0bGUsIHBhZ2VUaXRsZSk7XG4gICAgY29uc3QgbWV0YVRhZ3MgPSBjcmVhdGVNZXRhVGFncyhzaXRlRGVzY3JpcHRpb24sIHNpdGVIb3N0LCBzaXRlVGl0bGUsIHNpdGVUd2l0dGVyLCBhc3NldCwgY2hhbm5lbCwgZGVmYXVsdERlc2NyaXB0aW9uLCBkZWZhdWx0VGh1bWJuYWlsKTtcbiAgICBjb25zdCBjYW5vbmljYWxMaW5rID0gY3JlYXRlQ2Fub25pY2FsTGluayhhc3NldCwgY2hhbm5lbCwgcGFnZVVyaSwgc2l0ZUhvc3QpO1xuICAgIC8vIHJlbmRlciByZXN1bHRzXG4gICAgcmV0dXJuIChcbiAgICAgIDxIZWxtZXRcbiAgICAgICAgdGl0bGU9e3BhZ2VUaXRsZX1cbiAgICAgICAgbWV0YT17bWV0YVRhZ3N9XG4gICAgICAgIGxpbms9e1t7cmVsOiAnY2Fub25pY2FsJywgaHJlZjogY2Fub25pY2FsTGlua31dfVxuICAgICAgLz5cbiAgICApO1xuICB9XG59O1xuXG5TRU8ucHJvcFR5cGVzID0ge1xuICBwYWdlVGl0bGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHBhZ2VVcmkgIDogUHJvcFR5cGVzLnN0cmluZyxcbiAgY2hhbm5lbCAgOiBQcm9wVHlwZXMub2JqZWN0LFxuICBhc3NldCAgICA6IFByb3BUeXBlcy5vYmplY3QsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBTRU87XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29tcG9uZW50cy9TRU8vdmlldy5qc3giLCJpbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IGNoYW5uZWwgfSkgPT4ge1xuICByZXR1cm4ge1xuICAgIGxvZ2dlZEluQ2hhbm5lbE5hbWU6IGNoYW5uZWwubG9nZ2VkSW5DaGFubmVsLm5hbWUsXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbnVsbCkoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvcGFnZXMvTG9naW5QYWdlL2luZGV4LmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHdpdGhSb3V0ZXIgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCBTRU8gZnJvbSAnY29tcG9uZW50cy9TRU8nO1xuaW1wb3J0IE5hdkJhciBmcm9tICdjb250YWluZXJzL05hdkJhcic7XG5pbXBvcnQgQ2hhbm5lbExvZ2luRm9ybSBmcm9tICdjb250YWluZXJzL0NoYW5uZWxMb2dpbkZvcm0nO1xuaW1wb3J0IENoYW5uZWxDcmVhdGVGb3JtIGZyb20gJ2NvbnRhaW5lcnMvQ2hhbm5lbENyZWF0ZUZvcm0nO1xuXG5jbGFzcyBMb2dpblBhZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIChuZXdQcm9wcykge1xuICAgIC8vIHJlLXJvdXRlIHRoZSB1c2VyIHRvIHRoZSBob21lcGFnZSBpZiB0aGUgdXNlciBpcyBsb2dnZWQgaW5cbiAgICBpZiAobmV3UHJvcHMubG9nZ2VkSW5DaGFubmVsTmFtZSAhPT0gdGhpcy5wcm9wcy5sb2dnZWRJbkNoYW5uZWxOYW1lKSB7XG4gICAgICB0aGlzLnByb3BzLmhpc3RvcnkucHVzaChgL2ApO1xuICAgIH1cbiAgfVxuICByZW5kZXIgKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2PlxuICAgICAgICA8U0VPIHBhZ2VUaXRsZT17J0xvZ2luJ30gcGFnZVVyaT17J2xvZ2luJ30gLz5cbiAgICAgICAgPE5hdkJhciAvPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkJz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tNSBjb2x1bW4tLW1lZC0xMCBhbGlnbi1jb250ZW50LXRvcCc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tOCBjb2x1bW4tLW1lZC0xMCc+XG4gICAgICAgICAgICAgIDxwPkNoYW5uZWxzIGFsbG93IHlvdSB0byBwdWJsaXNoIGFuZCBncm91cCBjb250ZW50IHVuZGVyIGFuIGlkZW50aXR5LiBZb3UgY2FuIGNyZWF0ZSBhIGNoYW5uZWwgZm9yIHlvdXJzZWxmLCBvciBzaGFyZSBvbmUgd2l0aCBsaWtlLW1pbmRlZCBmcmllbmRzLiAgWW91IGNhbiBjcmVhdGUgMSBjaGFubmVsLCBvciAxMDAsIHNvIHdoZXRoZXIgeW91J3JlIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9Jy9AY2F0YWxvbmlhMjAxNzo0M2RjZjQ3MTYzY2FhMjFkODQwNGQ5ZmU5YjMwZjc4ZWYzZTE0NmE4Jz5kb2N1bWVudGluZyBpbXBvcnRhbnQgZXZlbnRzPC9hPiwgb3IgbWFraW5nIGEgcHVibGljIHJlcG9zaXRvcnkgZm9yIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9Jy9AY2F0R2lmcyc+Y2F0IGdpZnM8L2E+IChwYXNzd29yZDogJzEyMzQnKSwgdHJ5IGNyZWF0aW5nIGEgY2hhbm5lbCBmb3IgaXQhPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+PGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTUgY29sdW1uLS1tZWQtMTAgYWxpZ24tY29udGVudC10b3AnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTggY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPSdoMy0tbm8tYm90dG9tJz5Mb2cgaW4gdG8gYW4gZXhpc3RpbmcgY2hhbm5lbDo8L2gzPlxuICAgICAgICAgICAgICA8Q2hhbm5lbExvZ2luRm9ybSAvPlxuICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPSdoMy0tbm8tYm90dG9tJz5DcmVhdGUgYSBicmFuZCBuZXcgY2hhbm5lbDo8L2gzPlxuICAgICAgICAgICAgICA8Q2hhbm5lbENyZWF0ZUZvcm0gLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhSb3V0ZXIoTG9naW5QYWdlKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9wYWdlcy9Mb2dpblBhZ2Uvdmlldy5qc3giLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHsgdXBkYXRlTG9nZ2VkSW5DaGFubmVsIH0gZnJvbSAnYWN0aW9ucy9jaGFubmVsJztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5pbXBvcnQge3VwZGF0ZVNlbGVjdGVkQ2hhbm5lbH0gZnJvbSAnLi4vLi4vYWN0aW9ucy9wdWJsaXNoJztcblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gZGlzcGF0Y2ggPT4ge1xuICByZXR1cm4ge1xuICAgIG9uQ2hhbm5lbExvZ2luOiAobmFtZSwgc2hvcnRJZCwgbG9uZ0lkKSA9PiB7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVMb2dnZWRJbkNoYW5uZWwobmFtZSwgc2hvcnRJZCwgbG9uZ0lkKSk7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVTZWxlY3RlZENoYW5uZWwobmFtZSkpO1xuICAgIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG51bGwsIG1hcERpc3BhdGNoVG9Qcm9wcykoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9DaGFubmVsTG9naW5Gb3JtL2luZGV4LmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCByZXF1ZXN0IGZyb20gJ3V0aWxzL3JlcXVlc3QnO1xuXG5jbGFzcyBDaGFubmVsTG9naW5Gb3JtIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBlcnJvciAgIDogbnVsbCxcbiAgICAgIG5hbWUgICAgOiAnJyxcbiAgICAgIHBhc3N3b3JkOiAnJyxcbiAgICB9O1xuICAgIHRoaXMuaGFuZGxlSW5wdXQgPSB0aGlzLmhhbmRsZUlucHV0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5sb2dpblRvQ2hhbm5lbCA9IHRoaXMubG9naW5Ub0NoYW5uZWwuYmluZCh0aGlzKTtcbiAgfVxuICBoYW5kbGVJbnB1dCAoZXZlbnQpIHtcbiAgICBjb25zdCBuYW1lID0gZXZlbnQudGFyZ2V0Lm5hbWU7XG4gICAgY29uc3QgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5zZXRTdGF0ZSh7W25hbWVdOiB2YWx1ZX0pO1xuICB9XG4gIGxvZ2luVG9DaGFubmVsIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbWV0aG9kIDogJ1BPU1QnLFxuICAgICAgYm9keSAgIDogSlNPTi5zdHJpbmdpZnkoe3VzZXJuYW1lOiB0aGlzLnN0YXRlLm5hbWUsIHBhc3N3b3JkOiB0aGlzLnN0YXRlLnBhc3N3b3JkfSksXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9KSxcbiAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgfTtcbiAgICByZXF1ZXN0KCdsb2dpbicsIHBhcmFtcylcbiAgICAgIC50aGVuKCh7c3VjY2VzcywgY2hhbm5lbE5hbWUsIHNob3J0Q2hhbm5lbElkLCBjaGFubmVsQ2xhaW1JZCwgbWVzc2FnZX0pID0+IHtcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbm5lbExvZ2luKGNoYW5uZWxOYW1lLCBzaG9ydENoYW5uZWxJZCwgY2hhbm5lbENsYWltSWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeydlcnJvcic6IG1lc3NhZ2V9KTtcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeydlcnJvcic6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsnZXJyb3InOiBlcnJvcn0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuICByZW5kZXIgKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8Zm9ybSBpZD0nY2hhbm5lbC1sb2dpbi1mb3JtJz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXdpZGUgcm93LS1zaG9ydCc+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTMgY29sdW1uLS1zbWwtMTAnPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0nbGFiZWwnIGh0bWxGb3I9J2NoYW5uZWwtbG9naW4tbmFtZS1pbnB1dCc+TmFtZTo8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PjxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS02IGNvbHVtbi0tc21sLTEwJz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdpbnB1dC10ZXh0LS1wcmltYXJ5IGZsZXgtY29udGFpbmVyLS1yb3cgZmxleC1jb250YWluZXItLWxlZnQtYm90dG9tJz5cbiAgICAgICAgICAgICAgPHNwYW4+QDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9J3RleHQnIGlkPSdjaGFubmVsLWxvZ2luLW5hbWUtaW5wdXQnIGNsYXNzTmFtZT0naW5wdXQtdGV4dCcgbmFtZT0nbmFtZScgcGxhY2Vob2xkZXI9J1lvdXIgQ2hhbm5lbCBOYW1lJyB2YWx1ZT17dGhpcy5zdGF0ZS5jaGFubmVsTmFtZX0gb25DaGFuZ2U9e3RoaXMuaGFuZGxlSW5wdXR9IC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS13aWRlIHJvdy0tc2hvcnQnPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0zIGNvbHVtbi0tc21sLTEwJz5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9J2xhYmVsJyBodG1sRm9yPSdjaGFubmVsLWxvZ2luLXBhc3N3b3JkLWlucHV0JyA+UGFzc3dvcmQ6PC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj48ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tNiBjb2x1bW4tLXNtbC0xMCc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0naW5wdXQtdGV4dC0tcHJpbWFyeSc+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdwYXNzd29yZCcgaWQ9J2NoYW5uZWwtbG9naW4tcGFzc3dvcmQtaW5wdXQnIG5hbWU9J3Bhc3N3b3JkJyBjbGFzc05hbWU9J2lucHV0LXRleHQnIHBsYWNlaG9sZGVyPScnIHZhbHVlPXt0aGlzLnN0YXRlLmNoYW5uZWxQYXNzd29yZH0gb25DaGFuZ2U9e3RoaXMuaGFuZGxlSW5wdXR9IC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHsgdGhpcy5zdGF0ZS5lcnJvciA/IChcbiAgICAgICAgICA8cCBjbGFzc05hbWU9J2luZm8tbWVzc2FnZS0tZmFpbHVyZSc+e3RoaXMuc3RhdGUuZXJyb3J9PC9wPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxwIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlJz5FbnRlciB0aGUgbmFtZSBhbmQgcGFzc3dvcmQgZm9yIHlvdXIgY2hhbm5lbDwvcD5cbiAgICAgICAgKX1cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXdpZGUnPlxuICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPSdidXR0b24tLXByaW1hcnknIG9uQ2xpY2s9e3RoaXMubG9naW5Ub0NoYW5uZWx9PkF1dGhlbnRpY2F0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZm9ybT5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENoYW5uZWxMb2dpbkZvcm07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9DaGFubmVsTG9naW5Gb3JtL3ZpZXcuanN4IiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IHVwZGF0ZUxvZ2dlZEluQ2hhbm5lbCB9IGZyb20gJ2FjdGlvbnMvY2hhbm5lbCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuaW1wb3J0IHt1cGRhdGVTZWxlY3RlZENoYW5uZWx9IGZyb20gJ2FjdGlvbnMvcHVibGlzaCc7XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IGRpc3BhdGNoID0+IHtcbiAgcmV0dXJuIHtcbiAgICBvbkNoYW5uZWxMb2dpbjogKG5hbWUsIHNob3J0SWQsIGxvbmdJZCkgPT4ge1xuICAgICAgZGlzcGF0Y2godXBkYXRlTG9nZ2VkSW5DaGFubmVsKG5hbWUsIHNob3J0SWQsIGxvbmdJZCkpO1xuICAgICAgZGlzcGF0Y2godXBkYXRlU2VsZWN0ZWRDaGFubmVsKG5hbWUpKTtcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChudWxsLCBtYXBEaXNwYXRjaFRvUHJvcHMpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvQ2hhbm5lbENyZWF0ZUZvcm0vaW5kZXguanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb2dyZXNzQmFyIGZyb20gJ2NvbXBvbmVudHMvUHJvZ3Jlc3NCYXInO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAndXRpbHMvcmVxdWVzdCc7XG5cbmNsYXNzIENoYW5uZWxDcmVhdGVGb3JtIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBlcnJvciAgIDogbnVsbCxcbiAgICAgIGNoYW5uZWwgOiAnJyxcbiAgICAgIHBhc3N3b3JkOiAnJyxcbiAgICAgIHN0YXR1cyAgOiBudWxsLFxuICAgIH07XG4gICAgdGhpcy5oYW5kbGVDaGFubmVsSW5wdXQgPSB0aGlzLmhhbmRsZUNoYW5uZWxJbnB1dC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlSW5wdXQgPSB0aGlzLmhhbmRsZUlucHV0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5jcmVhdGVDaGFubmVsID0gdGhpcy5jcmVhdGVDaGFubmVsLmJpbmQodGhpcyk7XG4gIH1cbiAgY2xlYW5zZUNoYW5uZWxJbnB1dCAoaW5wdXQpIHtcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL1xccysvZywgJy0nKTsgLy8gcmVwbGFjZSBzcGFjZXMgd2l0aCBkYXNoZXNcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL1teQS1aYS16MC05LV0vZywgJycpOyAgLy8gcmVtb3ZlIGFsbCBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBBLVosIGEteiwgMC05LCBvciAnLSdcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbiAgaGFuZGxlQ2hhbm5lbElucHV0IChldmVudCkge1xuICAgIGxldCB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICB2YWx1ZSA9IHRoaXMuY2xlYW5zZUNoYW5uZWxJbnB1dCh2YWx1ZSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7Y2hhbm5lbDogdmFsdWV9KTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMudXBkYXRlSXNDaGFubmVsQXZhaWxhYmxlKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7ZXJyb3I6ICdQbGVhc2UgZW50ZXIgYSBjaGFubmVsIG5hbWUnfSk7XG4gICAgfVxuICB9XG4gIGhhbmRsZUlucHV0IChldmVudCkge1xuICAgIGNvbnN0IG5hbWUgPSBldmVudC50YXJnZXQubmFtZTtcbiAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICB0aGlzLnNldFN0YXRlKHtbbmFtZV06IHZhbHVlfSk7XG4gIH1cbiAgdXBkYXRlSXNDaGFubmVsQXZhaWxhYmxlIChjaGFubmVsKSB7XG4gICAgY29uc3QgY2hhbm5lbFdpdGhBdFN5bWJvbCA9IGBAJHtjaGFubmVsfWA7XG4gICAgcmVxdWVzdChgL2FwaS9jaGFubmVsL2F2YWlsYWJpbGl0eS8ke2NoYW5uZWxXaXRoQXRTeW1ib2x9YClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7J2Vycm9yJzogbnVsbH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7J2Vycm9yJzogZXJyb3IubWVzc2FnZX0pO1xuICAgICAgfSk7XG4gIH1cbiAgY2hlY2tJc0NoYW5uZWxBdmFpbGFibGUgKGNoYW5uZWwpIHtcbiAgICBjb25zdCBjaGFubmVsV2l0aEF0U3ltYm9sID0gYEAke2NoYW5uZWx9YDtcbiAgICByZXR1cm4gcmVxdWVzdChgL2FwaS9jaGFubmVsL2F2YWlsYWJpbGl0eS8ke2NoYW5uZWxXaXRoQXRTeW1ib2x9YCk7XG4gIH1cbiAgY2hlY2tJc1Bhc3N3b3JkUHJvdmlkZWQgKHBhc3N3b3JkKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghcGFzc3dvcmQgfHwgcGFzc3dvcmQubGVuZ3RoIDwgMSkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgYSBwYXNzd29yZCcpKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfVxuICBtYWtlUHVibGlzaENoYW5uZWxSZXF1ZXN0ICh1c2VybmFtZSwgcGFzc3dvcmQpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBtZXRob2QgOiAnUE9TVCcsXG4gICAgICBib2R5ICAgOiBKU09OLnN0cmluZ2lmeSh7dXNlcm5hbWUsIHBhc3N3b3JkfSksXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9KSxcbiAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVxdWVzdCgnL3NpZ251cCcsIHBhcmFtcylcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFVuZm9ydHVuYXRlbHksIHdlIGVuY291bnRlcmVkIGFuIGVycm9yIHdoaWxlIGNyZWF0aW5nIHlvdXIgY2hhbm5lbC4gUGxlYXNlIGxldCB1cyBrbm93IGluIERpc2NvcmQhICR7ZXJyb3IubWVzc2FnZX1gKSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIGNyZWF0ZUNoYW5uZWwgKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmNoZWNrSXNQYXNzd29yZFByb3ZpZGVkKHRoaXMuc3RhdGUucGFzc3dvcmQpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrSXNDaGFubmVsQXZhaWxhYmxlKHRoaXMuc3RhdGUuY2hhbm5lbCk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtzdGF0dXM6ICdXZSBhcmUgcHVibGlzaGluZyB5b3VyIG5ldyBjaGFubmVsLiAgU2l0IHRpZ2h0Li4uJ30pO1xuICAgICAgICByZXR1cm4gdGhpcy5tYWtlUHVibGlzaENoYW5uZWxSZXF1ZXN0KHRoaXMuc3RhdGUuY2hhbm5lbCwgdGhpcy5zdGF0ZS5wYXNzd29yZCk7XG4gICAgICB9KVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c3RhdHVzOiBudWxsfSk7XG4gICAgICAgIHRoaXMucHJvcHMub25DaGFubmVsTG9naW4ocmVzdWx0LmNoYW5uZWxOYW1lLCByZXN1bHQuc2hvcnRDaGFubmVsSWQsIHJlc3VsdC5jaGFubmVsQ2xhaW1JZCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeydlcnJvcic6IGVycm9yLm1lc3NhZ2UsIHN0YXR1czogbnVsbH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeydlcnJvcic6IGVycm9yLCBzdGF0dXM6IG51bGx9KTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG4gIHJlbmRlciAoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIHsgIXRoaXMuc3RhdGUuc3RhdHVzID8gKFxuICAgICAgICAgIDxmb3JtIGlkPSdwdWJsaXNoLWNoYW5uZWwtZm9ybSc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0td2lkZSByb3ctLXNob3J0Jz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTMgY29sdW1uLS1zbWwtMTAnPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9J2xhYmVsJyBodG1sRm9yPSduZXctY2hhbm5lbC1uYW1lJz5OYW1lOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PjxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS02IGNvbHVtbi0tc21sLTEwJz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0naW5wdXQtdGV4dC0tcHJpbWFyeSBmbGV4LWNvbnRhaW5lci0tcm93IGZsZXgtY29udGFpbmVyLS1sZWZ0LWJvdHRvbSBzcGFuLS1yZWxhdGl2ZSc+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5APC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2NoYW5uZWwnIGlkPSduZXctY2hhbm5lbC1uYW1lJyBjbGFzc05hbWU9J2lucHV0LXRleHQnIHBsYWNlaG9sZGVyPSdleGFtcGxlQ2hhbm5lbE5hbWUnIHZhbHVlPXt0aGlzLnN0YXRlLmNoYW5uZWx9IG9uQ2hhbmdlPXt0aGlzLmhhbmRsZUNoYW5uZWxJbnB1dH0gLz5cbiAgICAgICAgICAgICAgICAgIHsgKHRoaXMuc3RhdGUuY2hhbm5lbCAmJiAhdGhpcy5zdGF0ZS5lcnJvcikgJiYgPHNwYW4gaWQ9J2lucHV0LXN1Y2Nlc3MtY2hhbm5lbC1uYW1lJyBjbGFzc05hbWU9J2luZm8tbWVzc2FnZS0tc3VjY2VzcyBzcGFuLS1hYnNvbHV0ZSc+eydcXHUyNzEzJ308L3NwYW4+IH1cbiAgICAgICAgICAgICAgICAgIHsgdGhpcy5zdGF0ZS5lcnJvciAmJiA8c3BhbiBpZD0naW5wdXQtc3VjY2Vzcy1jaGFubmVsLW5hbWUnIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlLS1mYWlsdXJlIHNwYW4tLWFic29sdXRlJz57J1xcdTI3MTYnfTwvc3Bhbj4gfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXdpZGUgcm93LS1zaG9ydCc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0zIGNvbHVtbi0tc21sLTEwJz5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSdsYWJlbCcgaHRtbEZvcj0nbmV3LWNoYW5uZWwtcGFzc3dvcmQnPlBhc3N3b3JkOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PjxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS02IGNvbHVtbi0tc21sLTEwJz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0naW5wdXQtdGV4dC0tcHJpbWFyeSc+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ncGFzc3dvcmQnIG5hbWU9J3Bhc3N3b3JkJyBpZD0nbmV3LWNoYW5uZWwtcGFzc3dvcmQnIGNsYXNzTmFtZT0naW5wdXQtdGV4dCcgIHBsYWNlaG9sZGVyPScnIHZhbHVlPXt0aGlzLnN0YXRlLnBhc3N3b3JkfSBvbkNoYW5nZT17dGhpcy5oYW5kbGVJbnB1dH0gLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIHt0aGlzLnN0YXRlLmVycm9yID8gKFxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9J2luZm8tbWVzc2FnZS0tZmFpbHVyZSc+e3RoaXMuc3RhdGUuZXJyb3J9PC9wPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdpbmZvLW1lc3NhZ2UnPkNob29zZSBhIG5hbWUgYW5kIHBhc3N3b3JkIGZvciB5b3VyIGNoYW5uZWw8L3A+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXdpZGUnPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT0nYnV0dG9uLS1wcmltYXJ5JyBvbkNsaWNrPXt0aGlzLmNyZWF0ZUNoYW5uZWx9PkNyZWF0ZSBDaGFubmVsPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0nZmluZS1wcmludCc+e3RoaXMuc3RhdGUuc3RhdHVzfTwvcD5cbiAgICAgICAgICAgIDxQcm9ncmVzc0JhciBzaXplPXsxMn0gLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2hhbm5lbENyZWF0ZUZvcm07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9DaGFubmVsQ3JlYXRlRm9ybS92aWV3LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmNvbnN0IEFjdGl2ZVN0YXR1c0JhciA9ICgpID0+IHtcbiAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT0ncHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci0tYWN0aXZlJz58IDwvc3Bhbj47XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBY3RpdmVTdGF0dXNCYXI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29tcG9uZW50cy9BY3RpdmVTdGF0dXNCYXIvaW5kZXguanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuY29uc3QgSW5hY3RpdmVTdGF0dXNCYXIgPSAoKSA9PiB7XG4gIHJldHVybiA8c3BhbiBjbGFzc05hbWU9J3Byb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItLWluYWN0aXZlJz58IDwvc3Bhbj47XG59O1xuXG5leHBvcnQgZGVmYXVsdCBJbmFjdGl2ZVN0YXR1c0JhcjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb21wb25lbnRzL0luYWN0aXZlU3RhdHVzQmFyL2luZGV4LmpzeCIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgeyBvbkhhbmRsZVNob3dQYWdlVXJpIH0gZnJvbSAnYWN0aW9ucy9zaG93JztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IHNob3cgfSkgPT4ge1xuICByZXR1cm4ge1xuICAgIGVycm9yICAgICAgOiBzaG93LnJlcXVlc3QuZXJyb3IsXG4gICAgcmVxdWVzdFR5cGU6IHNob3cucmVxdWVzdC50eXBlLFxuICB9O1xufTtcblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0ge1xuICBvbkhhbmRsZVNob3dQYWdlVXJpLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvcGFnZXMvU2hvd1BhZ2UvaW5kZXguanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEVycm9yUGFnZSBmcm9tICdwYWdlcy9FcnJvclBhZ2UnO1xuaW1wb3J0IFNob3dBc3NldExpdGUgZnJvbSAnY29udGFpbmVycy9TaG93QXNzZXRMaXRlJztcbmltcG9ydCBTaG93QXNzZXREZXRhaWxzIGZyb20gJ2NvbnRhaW5lcnMvU2hvd0Fzc2V0RGV0YWlscyc7XG5pbXBvcnQgU2hvd0NoYW5uZWwgZnJvbSAnY29udGFpbmVycy9TaG93Q2hhbm5lbCc7XG5cbmltcG9ydCB7IENIQU5ORUwsIEFTU0VUX0xJVEUsIEFTU0VUX0RFVEFJTFMgfSBmcm9tICdjb25zdGFudHMvc2hvd19yZXF1ZXN0X3R5cGVzJztcblxuY2xhc3MgU2hvd1BhZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgdGhpcy5wcm9wcy5vbkhhbmRsZVNob3dQYWdlVXJpKHRoaXMucHJvcHMubWF0Y2gucGFyYW1zKTtcbiAgfVxuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIChuZXh0UHJvcHMpIHtcbiAgICBpZiAobmV4dFByb3BzLm1hdGNoLnBhcmFtcyAhPT0gdGhpcy5wcm9wcy5tYXRjaC5wYXJhbXMpIHtcbiAgICAgIHRoaXMucHJvcHMub25IYW5kbGVTaG93UGFnZVVyaShuZXh0UHJvcHMubWF0Y2gucGFyYW1zKTtcbiAgICB9XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGVycm9yLCByZXF1ZXN0VHlwZSB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxFcnJvclBhZ2UgZXJyb3I9e2Vycm9yfSAvPlxuICAgICAgKTtcbiAgICB9XG4gICAgc3dpdGNoIChyZXF1ZXN0VHlwZSkge1xuICAgICAgY2FzZSBDSEFOTkVMOlxuICAgICAgICByZXR1cm4gPFNob3dDaGFubmVsIC8+O1xuICAgICAgY2FzZSBBU1NFVF9MSVRFOlxuICAgICAgICByZXR1cm4gPFNob3dBc3NldExpdGUgLz47XG4gICAgICBjYXNlIEFTU0VUX0RFVEFJTFM6XG4gICAgICAgIHJldHVybiA8U2hvd0Fzc2V0RGV0YWlscyAvPjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiA8cD5sb2FkaW5nLi4uPC9wPjtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNob3dQYWdlO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3BhZ2VzL1Nob3dQYWdlL3ZpZXcuanN4IiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IHNob3cgfSkgPT4ge1xuICAvLyBzZWxlY3QgcmVxdWVzdCBpbmZvXG4gIGNvbnN0IHJlcXVlc3RJZCA9IHNob3cucmVxdWVzdC5pZDtcbiAgLy8gc2VsZWN0IGFzc2V0IGluZm9cbiAgbGV0IGFzc2V0O1xuICBjb25zdCByZXF1ZXN0ID0gc2hvdy5yZXF1ZXN0TGlzdFtyZXF1ZXN0SWRdIHx8IG51bGw7XG4gIGNvbnN0IGFzc2V0TGlzdCA9IHNob3cuYXNzZXRMaXN0O1xuICBpZiAocmVxdWVzdCAmJiBhc3NldExpc3QpIHtcbiAgICBjb25zdCBhc3NldEtleSA9IHJlcXVlc3Qua2V5OyAgLy8gbm90ZToganVzdCBzdG9yZSB0aGlzIGluIHRoZSByZXF1ZXN0XG4gICAgYXNzZXQgPSBhc3NldExpc3RbYXNzZXRLZXldIHx8IG51bGw7XG4gIH07XG4gIC8vIHJldHVybiBwcm9wc1xuICByZXR1cm4ge1xuICAgIGFzc2V0LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG51bGwpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvU2hvd0Fzc2V0TGl0ZS9pbmRleC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgU0VPIGZyb20gJ2NvbXBvbmVudHMvU0VPJztcbmltcG9ydCB7IExpbmsgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCBBc3NldERpc3BsYXkgZnJvbSAnY29udGFpbmVycy9Bc3NldERpc3BsYXknO1xuXG5jbGFzcyBTaG93TGl0ZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBhc3NldCB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoYXNzZXQpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgY2xhaW1JZCB9ID0gYXNzZXQuY2xhaW1EYXRhO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXRhbGwgZmxleC1jb250YWluZXItLWNvbHVtbiBmbGV4LWNvbnRhaW5lci0tY2VudGVyLWNlbnRlciBzaG93LWxpdGUtY29udGFpbmVyJz5cbiAgICAgICAgICA8U0VPIHBhZ2VUaXRsZT17bmFtZX0gYXNzZXQ9e2Fzc2V0fSAvPlxuICAgICAgICAgIDxBc3NldERpc3BsYXkgLz5cbiAgICAgICAgICA8TGluayBpZD0nYXNzZXQtYm9pbGVycGF0ZScgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5IGZpbmUtcHJpbnQnIHRvPXtgLyR7Y2xhaW1JZH0vJHtuYW1lfWB9Pmhvc3RlZFxuICAgICAgICAgICAgdmlhIFNwZWUuY2g8L0xpbms+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS10YWxsIHJvdy0tcGFkZGVkIGZsZXgtY29udGFpbmVyLS1jb2x1bW4gZmxleC1jb250YWluZXItLWNlbnRlci1jZW50ZXInPlxuICAgICAgICA8cD5sb2FkaW5nIGFzc2V0IGRhdGEuLi48L3A+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBTaG93TGl0ZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL1Nob3dBc3NldExpdGUvdmlldy5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb2dyZXNzQmFyIGZyb20gJ2NvbXBvbmVudHMvUHJvZ3Jlc3NCYXInO1xuaW1wb3J0IHsgTE9DQUxfQ0hFQ0ssIFVOQVZBSUxBQkxFLCBFUlJPUiwgQVZBSUxBQkxFIH0gZnJvbSAnY29uc3RhbnRzL2Fzc2V0X2Rpc3BsYXlfc3RhdGVzJztcblxuY2xhc3MgQXNzZXREaXNwbGF5IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIGNvbnN0IHsgYXNzZXQ6IHsgY2xhaW1EYXRhOiB7IG5hbWUsIGNsYWltSWQgfSB9IH0gPSB0aGlzLnByb3BzO1xuICAgIHRoaXMucHJvcHMub25GaWxlUmVxdWVzdChuYW1lLCBjbGFpbUlkKTtcbiAgfVxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgc3RhdHVzLCBlcnJvciwgYXNzZXQ6IHsgY2xhaW1EYXRhOiB7IG5hbWUsIGNsYWltSWQsIGNvbnRlbnRUeXBlLCBmaWxlRXh0LCB0aHVtYm5haWwgfSB9IH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGlkPSdhc3NldC1kaXNwbGF5LWNvbXBvbmVudCc+XG4gICAgICAgIHsoc3RhdHVzID09PSBMT0NBTF9DSEVDSykgJiZcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8cD5DaGVja2luZyB0byBzZWUgaWYgU3BlZS5jaCBoYXMgeW91ciBhc3NldCBsb2NhbGx5Li4uPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICB7KHN0YXR1cyA9PT0gVU5BVkFJTEFCTEUpICYmXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHA+U2l0IHRpZ2h0LCB3ZSdyZSBzZWFyY2hpbmcgdGhlIExCUlkgYmxvY2tjaGFpbiBmb3IgeW91ciBhc3NldCE8L3A+XG4gICAgICAgICAgPFByb2dyZXNzQmFyIHNpemU9ezEyfSAvPlxuICAgICAgICAgIDxwPkN1cmlvdXMgd2hhdCBtYWdpYyBpcyBoYXBwZW5pbmcgaGVyZT8gPGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyB0YXJnZXQ9J2JsYW5rJyBocmVmPSdodHRwczovL2xicnkuaW8vZmFxL3doYXQtaXMtbGJyeSc+TGVhcm4gbW9yZS48L2E+PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICB7KHN0YXR1cyA9PT0gRVJST1IpICYmXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHA+VW5mb3J0dW5hdGVseSwgd2UgY291bGRuJ3QgZG93bmxvYWQgeW91ciBhc3NldCBmcm9tIExCUlkuICBZb3UgY2FuIGhlbHAgdXMgb3V0IGJ5IHNoYXJpbmcgdGhlIGJlbG93IGVycm9yIG1lc3NhZ2UgaW4gdGhlIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgaHJlZj0naHR0cHM6Ly9kaXNjb3JkLmdnL1lqWWJ3aFMnIHRhcmdldD0nX2JsYW5rJz5MQlJZIGRpc2NvcmQ8L2E+LjwvcD5cbiAgICAgICAgICA8aT48cCBpZD0nZXJyb3ItbWVzc2FnZSc+e2Vycm9yfTwvcD48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIHsoc3RhdHVzID09PSBBVkFJTEFCTEUpICYmXG4gICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgc3dpdGNoIChjb250ZW50VHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnaW1hZ2UvanBlZyc6XG4gICAgICAgICAgICBjYXNlICdpbWFnZS9qcGcnOlxuICAgICAgICAgICAgY2FzZSAnaW1hZ2UvcG5nJzpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Fzc2V0J1xuICAgICAgICAgICAgICAgICAgc3JjPXtgLyR7Y2xhaW1JZH0vJHtuYW1lfS4ke2ZpbGVFeHR9YH1cbiAgICAgICAgICAgICAgICAgIGFsdD17bmFtZX0gLz5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNhc2UgJ2ltYWdlL2dpZic6XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdhc3NldCdcbiAgICAgICAgICAgICAgICAgIHNyYz17YC8ke2NsYWltSWR9LyR7bmFtZX0uJHtmaWxlRXh0fWB9XG4gICAgICAgICAgICAgICAgICBhbHQ9e25hbWV9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNhc2UgJ3ZpZGVvL21wNCc6XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPHZpZGVvIGNsYXNzTmFtZT0nYXNzZXQgdmlkZW8nIGNvbnRyb2xzIHBvc3Rlcj17dGh1bWJuYWlsfT5cbiAgICAgICAgICAgICAgICAgIDxzb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgc3JjPXtgLyR7Y2xhaW1JZH0vJHtuYW1lfS4ke2ZpbGVFeHR9YH1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8cD5Zb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgPGNvZGU+dmlkZW88L2NvZGU+IGVsZW1lbnQuPC9wPlxuICAgICAgICAgICAgICAgIDwvdmlkZW8+XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxwPlVuc3VwcG9ydGVkIGZpbGUgdHlwZTwvcD5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQXNzZXREaXNwbGF5O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvQXNzZXREaXNwbGF5L3ZpZXcuanN4IiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IHNob3cgfSkgPT4ge1xuICAvLyBzZWxlY3QgcmVxdWVzdCBpbmZvXG4gIGNvbnN0IHJlcXVlc3RJZCA9IHNob3cucmVxdWVzdC5pZDtcbiAgLy8gc2VsZWN0IGFzc2V0IGluZm9cbiAgbGV0IGFzc2V0O1xuICBjb25zdCByZXF1ZXN0ID0gc2hvdy5yZXF1ZXN0TGlzdFtyZXF1ZXN0SWRdIHx8IG51bGw7XG4gIGNvbnN0IGFzc2V0TGlzdCA9IHNob3cuYXNzZXRMaXN0O1xuICBpZiAocmVxdWVzdCAmJiBhc3NldExpc3QpIHtcbiAgICBjb25zdCBhc3NldEtleSA9IHJlcXVlc3Qua2V5OyAgLy8gbm90ZToganVzdCBzdG9yZSB0aGlzIGluIHRoZSByZXF1ZXN0XG4gICAgYXNzZXQgPSBhc3NldExpc3RbYXNzZXRLZXldIHx8IG51bGw7XG4gIH07XG4gIC8vIHJldHVybiBwcm9wc1xuICByZXR1cm4ge1xuICAgIGFzc2V0LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG51bGwpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvU2hvd0Fzc2V0RGV0YWlscy9pbmRleC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgU0VPIGZyb20gJ2NvbXBvbmVudHMvU0VPJztcbmltcG9ydCBOYXZCYXIgZnJvbSAnY29udGFpbmVycy9OYXZCYXInO1xuaW1wb3J0IEVycm9yUGFnZSBmcm9tICdwYWdlcy9FcnJvclBhZ2UnO1xuaW1wb3J0IEFzc2V0VGl0bGUgZnJvbSAnY29udGFpbmVycy9Bc3NldFRpdGxlJztcbmltcG9ydCBBc3NldERpc3BsYXkgZnJvbSAnY29udGFpbmVycy9Bc3NldERpc3BsYXknO1xuaW1wb3J0IEFzc2V0SW5mbyBmcm9tICdjb250YWluZXJzL0Fzc2V0SW5mbyc7XG5cbmNsYXNzIFNob3dBc3NldERldGFpbHMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgYXNzZXQgfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKGFzc2V0KSB7XG4gICAgICBjb25zdCB7IGNsYWltRGF0YTogeyBuYW1lIH0gfSA9IGFzc2V0O1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8U0VPIHBhZ2VUaXRsZT17YCR7bmFtZX0gLSBkZXRhaWxzYH0gYXNzZXQ9e2Fzc2V0fSAvPlxuICAgICAgICAgIDxOYXZCYXIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tdGFsbCByb3ctLXBhZGRlZCc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMTAnPlxuICAgICAgICAgICAgICA8QXNzZXRUaXRsZSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tNSBjb2x1bW4tLXNtbC0xMCBhbGlnbi1jb250ZW50LXRvcCc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQgc2hvdy1kZXRhaWxzLWNvbnRhaW5lcic+XG4gICAgICAgICAgICAgICAgPEFzc2V0RGlzcGxheSAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PjxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS01IGNvbHVtbi0tc21sLTEwIGFsaWduLWNvbnRlbnQtdG9wJz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCc+XG4gICAgICAgICAgICAgICAgPEFzc2V0SW5mbyAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgfTtcbiAgICByZXR1cm4gKFxuICAgICAgPEVycm9yUGFnZSBlcnJvcj17J2xvYWRpbmcgYXNzZXQgZGF0YS4uLid9IC8+XG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgU2hvd0Fzc2V0RGV0YWlscztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL1Nob3dBc3NldERldGFpbHMvdmlldy5qc3giLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcbmltcG9ydCB7IHNlbGVjdEFzc2V0IH0gZnJvbSAnc2VsZWN0b3JzL3Nob3cnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBzaG93IH0pID0+IHtcbiAgY29uc3QgeyBjbGFpbURhdGE6IHsgdGl0bGUgfSB9ID0gc2VsZWN0QXNzZXQoc2hvdyk7XG4gIHJldHVybiB7XG4gICAgdGl0bGUsXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbnVsbCkoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9Bc3NldFRpdGxlL2luZGV4LmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuY29uc3QgQXNzZXRUaXRsZSA9ICh7IHRpdGxlIH0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2PlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPSd0ZXh0LS1sYXJnZSc+e3RpdGxlfTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFzc2V0VGl0bGU7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9Bc3NldFRpdGxlL3ZpZXcuanN4IiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5pbXBvcnQgeyBzZWxlY3RBc3NldCB9IGZyb20gJ3NlbGVjdG9ycy9zaG93JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgc2hvdyB9KSA9PiB7XG4gIC8vIHNlbGVjdCBhc3NldFxuICBjb25zdCBhc3NldCA9IHNlbGVjdEFzc2V0KHNob3cpO1xuICAvLyAgcmV0dXJuIHByb3BzXG4gIHJldHVybiB7XG4gICAgYXNzZXQsXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbnVsbCkoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9Bc3NldEluZm8vaW5kZXguanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuXG5jbGFzcyBBc3NldEluZm8gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5jb3B5VG9DbGlwYm9hcmQgPSB0aGlzLmNvcHlUb0NsaXBib2FyZC5iaW5kKHRoaXMpO1xuICB9XG4gIGNvcHlUb0NsaXBib2FyZCAoZXZlbnQpIHtcbiAgICB2YXIgZWxlbWVudFRvQ29weSA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LmVsZW1lbnR0b2NvcHk7XG4gICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50VG9Db3B5KTtcbiAgICBlbGVtZW50LnNlbGVjdCgpO1xuICAgIHRyeSB7XG4gICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7ZXJyb3I6ICdPb3BzLCB1bmFibGUgdG8gY29weSd9KTtcbiAgICB9XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGFzc2V0OiB7IHNob3J0SWQsIGNsYWltRGF0YSA6IHsgY2hhbm5lbE5hbWUsIGNlcnRpZmljYXRlSWQsIGRlc2NyaXB0aW9uLCBuYW1lLCBjbGFpbUlkLCBmaWxlRXh0LCBjb250ZW50VHlwZSwgdGh1bWJuYWlsLCBob3N0IH0gfSB9ID0gdGhpcy5wcm9wcztcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAge2NoYW5uZWxOYW1lICYmXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQgcm93LS13aWRlIHJvdy0tbm8tdG9wJz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMiBjb2x1bW4tLW1lZC0xMCc+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J3RleHQnPkNoYW5uZWw6PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS04IGNvbHVtbi0tbWVkLTEwJz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0ndGV4dCc+PExpbmsgdG89e2AvJHtjaGFubmVsTmFtZX06JHtjZXJ0aWZpY2F0ZUlkfWB9PntjaGFubmVsTmFtZX08L0xpbms+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIHtkZXNjcmlwdGlvbiAmJlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkIHJvdy0td2lkZSByb3ctLW5vLXRvcCc+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSd0ZXh0Jz57ZGVzY3JpcHRpb259PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXYgaWQ9J3Nob3ctc2hhcmUtYnV0dG9ucyc+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCByb3ctLXdpZGUgcm93LS1uby10b3AnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTIgY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J3RleHQnPlNoYXJlOjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTggY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdyb3cgcm93LS1zaG9ydCByb3ctLXdpZGUgZmxleC1jb250YWluZXItLXJvdyBmbGV4LWNvbnRhaW5lci0tc3BhY2UtYmV0d2Vlbi1ib3R0b20gZmxleC1jb250YWluZXItLXdyYXAnPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9e2BodHRwczovL3R3aXR0ZXIuY29tL2ludGVudC90d2VldD90ZXh0PSR7aG9zdH0vJHtzaG9ydElkfS8ke25hbWV9YH0+dHdpdHRlcjwvYT5cbiAgICAgICAgICAgICAgICA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRhcmdldD0nX2JsYW5rJyBocmVmPXtgaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL3NoYXJlci9zaGFyZXIucGhwP3U9JHtob3N0fS8ke3Nob3J0SWR9LyR7bmFtZX1gfT5mYWNlYm9vazwvYT5cbiAgICAgICAgICAgICAgICA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRhcmdldD0nX2JsYW5rJyBocmVmPXtgaHR0cDovL3R1bWJsci5jb20vd2lkZ2V0cy9zaGFyZS90b29sP2Nhbm9uaWNhbFVybD0ke2hvc3R9LyR7c2hvcnRJZH0vJHtuYW1lfWB9PnR1bWJscjwvYT5cbiAgICAgICAgICAgICAgICA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRhcmdldD0nX2JsYW5rJyBocmVmPXtgaHR0cHM6Ly93d3cucmVkZGl0LmNvbS9zdWJtaXQ/dXJsPSR7aG9zdH0vJHtzaG9ydElkfS8ke25hbWV9JnRpdGxlPSR7bmFtZX1gfT5yZWRkaXQ8L2E+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQgcm93LS13aWRlIHJvdy0tbm8tdG9wJz5cbiAgICAgICAgICA8ZGl2IGlkPSdzaG93LXNob3J0LWxpbmsnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTIgY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J3RleHQnPkxpbms6PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tOCBjb2x1bW4tLW1lZC0xMCc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1zaG9ydCByb3ctLXdpZGUnPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS03Jz5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdpbnB1dC1lcnJvcicgaWQ9J2lucHV0LWVycm9yLWNvcHktc2hvcnQtbGluaycgaGlkZGVuPSd0cnVlJz5lcnJvciBoZXJlPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J3Nob3J0LWxpbmsnIGNsYXNzTmFtZT0naW5wdXQtZGlzYWJsZWQgaW5wdXQtdGV4dC0tZnVsbC13aWR0aCcgcmVhZE9ubHlcbiAgICAgICAgICAgICAgICAgICAgc3BlbGxDaGVjaz0nZmFsc2UnXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtgJHtob3N0fS8ke3Nob3J0SWR9LyR7bmFtZX0uJHtmaWxlRXh0fWB9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuc2VsZWN0fSAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0xJyAvPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0yJz5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPSdidXR0b24tLXByaW1hcnkgYnV0dG9uLS13aWRlJyBkYXRhLWVsZW1lbnR0b2NvcHk9J3Nob3J0LWxpbmsnXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuY29weVRvQ2xpcGJvYXJkfT5jb3B5XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgaWQ9J3Nob3ctZW1iZWQtY29kZSc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMiBjb2x1bW4tLW1lZC0xMCc+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0ndGV4dCc+RW1iZWQ6PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tOCBjb2x1bW4tLW1lZC0xMCc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1zaG9ydCByb3ctLXdpZGUnPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS03Jz5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdpbnB1dC1lcnJvcicgaWQ9J2lucHV0LWVycm9yLWNvcHktZW1iZWQtdGV4dCcgaGlkZGVuPSd0cnVlJz5lcnJvciBoZXJlPC9kaXY+XG4gICAgICAgICAgICAgICAgICB7KGNvbnRlbnRUeXBlID09PSAndmlkZW8vbXA0JykgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nZW1iZWQtdGV4dCcgY2xhc3NOYW1lPSdpbnB1dC1kaXNhYmxlZCBpbnB1dC10ZXh0LS1mdWxsLXdpZHRoJyByZWFkT25seVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuc2VsZWN0fSBzcGVsbENoZWNrPSdmYWxzZSdcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YDx2aWRlbyB3aWR0aD1cIjEwMCVcIiBjb250cm9scyBwb3N0ZXI9XCIke3RodW1ibmFpbH1cIiBzcmM9XCIke2hvc3R9LyR7Y2xhaW1JZH0vJHtuYW1lfS4ke2ZpbGVFeHR9XCIvPjwvdmlkZW8+YH0gLz5cbiAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nZW1iZWQtdGV4dCcgY2xhc3NOYW1lPSdpbnB1dC1kaXNhYmxlZCBpbnB1dC10ZXh0LS1mdWxsLXdpZHRoJyByZWFkT25seVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuc2VsZWN0fSBzcGVsbENoZWNrPSdmYWxzZSdcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YDxpbWcgc3JjPVwiJHtob3N0fS8ke2NsYWltSWR9LyR7bmFtZX0uJHtmaWxlRXh0fVwiLz5gfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMScgLz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMic+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT0nYnV0dG9uLS1wcmltYXJ5IGJ1dHRvbi0td2lkZScgZGF0YS1lbGVtZW50dG9jb3B5PSdlbWJlZC10ZXh0J1xuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmNvcHlUb0NsaXBib2FyZH0+Y29weVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdmbGV4LWNvbnRhaW5lci0tcm93IGZsZXgtY29udGFpbmVyLS1zcGFjZS1iZXR3ZWVuLWJvdHRvbSc+XG4gICAgICAgICAgPExpbmsgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyB0bz17YC8ke3Nob3J0SWR9LyR7bmFtZX0uJHtmaWxlRXh0fWB9PjxzcGFuXG4gICAgICAgICAgICBjbGFzc05hbWU9J3RleHQnPkRpcmVjdCBMaW5rPC9zcGFuPjwvTGluaz5cbiAgICAgICAgICA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIGhyZWY9e2Ake2hvc3R9LyR7Y2xhaW1JZH0vJHtuYW1lfS4ke2ZpbGVFeHR9YH0gZG93bmxvYWQ9e25hbWV9PkRvd25sb2FkPC9hPlxuICAgICAgICAgIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2h0dHBzOi8vbGJyeS5pby9kbWNhJz5SZXBvcnQ8L2E+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBc3NldEluZm87XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9Bc3NldEluZm8vdmlldy5qc3giLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgc2hvdyB9KSA9PiB7XG4gIC8vIHNlbGVjdCByZXF1ZXN0IGluZm9cbiAgY29uc3QgcmVxdWVzdElkID0gc2hvdy5yZXF1ZXN0LmlkO1xuICAvLyBzZWxlY3QgcmVxdWVzdFxuICBjb25zdCBwcmV2aW91c1JlcXVlc3QgPSBzaG93LnJlcXVlc3RMaXN0W3JlcXVlc3RJZF0gfHwgbnVsbDtcbiAgLy8gc2VsZWN0IGNoYW5uZWxcbiAgbGV0IGNoYW5uZWw7XG4gIGlmIChwcmV2aW91c1JlcXVlc3QpIHtcbiAgICBjb25zdCBjaGFubmVsS2V5ID0gcHJldmlvdXNSZXF1ZXN0LmtleTtcbiAgICBjaGFubmVsID0gc2hvdy5jaGFubmVsTGlzdFtjaGFubmVsS2V5XSB8fCBudWxsO1xuICB9XG4gIHJldHVybiB7XG4gICAgY2hhbm5lbCxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBudWxsKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL1Nob3dDaGFubmVsL2luZGV4LmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTRU8gZnJvbSAnY29tcG9uZW50cy9TRU8nO1xuaW1wb3J0IEVycm9yUGFnZSBmcm9tICdwYWdlcy9FcnJvclBhZ2UnO1xuaW1wb3J0IE5hdkJhciBmcm9tICdjb250YWluZXJzL05hdkJhcic7XG5pbXBvcnQgQ2hhbm5lbENsYWltc0Rpc3BsYXkgZnJvbSAnY29udGFpbmVycy9DaGFubmVsQ2xhaW1zRGlzcGxheSc7XG5cbmNsYXNzIFNob3dDaGFubmVsIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGNoYW5uZWwgfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKGNoYW5uZWwpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgbG9uZ0lkLCBzaG9ydElkIH0gPSBjaGFubmVsO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8U0VPIHBhZ2VUaXRsZT17bmFtZX0gY2hhbm5lbD17Y2hhbm5lbH0gLz5cbiAgICAgICAgICA8TmF2QmFyIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXRhbGwgcm93LS1wYWRkZWQnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTEwJz5cbiAgICAgICAgICAgICAgPGgyPmNoYW5uZWwgbmFtZToge25hbWV9PC9oMj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPXsnZmluZS1wcmludCd9PmZ1bGwgY2hhbm5lbCBpZDoge2xvbmdJZH08L3A+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT17J2ZpbmUtcHJpbnQnfT5zaG9ydCBjaGFubmVsIGlkOiB7c2hvcnRJZH08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0xMCc+XG4gICAgICAgICAgICAgIDxDaGFubmVsQ2xhaW1zRGlzcGxheSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICB9O1xuICAgIHJldHVybiAoXG4gICAgICA8RXJyb3JQYWdlIGVycm9yPXsnbG9hZGluZyBjaGFubmVsIGRhdGEuLi4nfSAvPlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNob3dDaGFubmVsO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvU2hvd0NoYW5uZWwvdmlldy5qc3giLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHsgb25VcGRhdGVDaGFubmVsQ2xhaW1zIH0gZnJvbSAnYWN0aW9ucy9zaG93JztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IHNob3cgfSkgPT4ge1xuICAvLyBzZWxlY3QgY2hhbm5lbCBrZXlcbiAgY29uc3QgcmVxdWVzdCA9IHNob3cucmVxdWVzdExpc3Rbc2hvdy5yZXF1ZXN0LmlkXTtcbiAgY29uc3QgY2hhbm5lbEtleSA9IHJlcXVlc3Qua2V5O1xuICAvLyBzZWxlY3QgY2hhbm5lbCBjbGFpbXNcbiAgY29uc3QgY2hhbm5lbCA9IHNob3cuY2hhbm5lbExpc3RbY2hhbm5lbEtleV0gfHwgbnVsbDtcbiAgLy8gcmV0dXJuIHByb3BzXG4gIHJldHVybiB7XG4gICAgY2hhbm5lbEtleSxcbiAgICBjaGFubmVsLFxuICB9O1xufTtcblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0ge1xuICBvblVwZGF0ZUNoYW5uZWxDbGFpbXMsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL0NoYW5uZWxDbGFpbXNEaXNwbGF5L2luZGV4LmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBc3NldFByZXZpZXcgZnJvbSAnY29tcG9uZW50cy9Bc3NldFByZXZpZXcnO1xuXG5jbGFzcyBDaGFubmVsQ2xhaW1zRGlzcGxheSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnNob3dOZXh0UmVzdWx0c1BhZ2UgPSB0aGlzLnNob3dOZXh0UmVzdWx0c1BhZ2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLnNob3dQcmV2aW91c1Jlc3VsdHNQYWdlID0gdGhpcy5zaG93UHJldmlvdXNSZXN1bHRzUGFnZS5iaW5kKHRoaXMpO1xuICB9XG4gIHNob3dQcmV2aW91c1Jlc3VsdHNQYWdlICgpIHtcbiAgICBjb25zdCB7IGNoYW5uZWw6IHsgY2xhaW1zRGF0YTogeyBjdXJyZW50UGFnZSB9IH0gfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgcHJldmlvdXNQYWdlID0gcGFyc2VJbnQoY3VycmVudFBhZ2UpIC0gMTtcbiAgICB0aGlzLnNob3dOZXdQYWdlKHByZXZpb3VzUGFnZSk7XG4gIH1cbiAgc2hvd05leHRSZXN1bHRzUGFnZSAoKSB7XG4gICAgY29uc3QgeyBjaGFubmVsOiB7IGNsYWltc0RhdGE6IHsgY3VycmVudFBhZ2UgfSB9IH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IG5leHRQYWdlID0gcGFyc2VJbnQoY3VycmVudFBhZ2UpICsgMTtcbiAgICB0aGlzLnNob3dOZXdQYWdlKG5leHRQYWdlKTtcbiAgfVxuICBzaG93TmV3UGFnZSAocGFnZSkge1xuICAgIGNvbnN0IHsgY2hhbm5lbEtleSwgY2hhbm5lbDogeyBuYW1lLCBsb25nSWQgfSB9ID0gdGhpcy5wcm9wcztcbiAgICB0aGlzLnByb3BzLm9uVXBkYXRlQ2hhbm5lbENsYWltcyhjaGFubmVsS2V5LCBuYW1lLCBsb25nSWQsIHBhZ2UpO1xuICB9XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBjaGFubmVsOiB7IGNsYWltc0RhdGE6IHsgY2xhaW1zLCBjdXJyZW50UGFnZSwgdG90YWxQYWdlcyB9IH0gfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS10YWxsJz5cbiAgICAgICAgeyhjbGFpbXMubGVuZ3RoID4gMCkgPyAoXG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIHtjbGFpbXMubWFwKChjbGFpbSwgaW5kZXgpID0+IDxBc3NldFByZXZpZXdcbiAgICAgICAgICAgICAgY2xhaW1EYXRhPXtjbGFpbX1cbiAgICAgICAgICAgICAga2V5PXtgJHtjbGFpbS5uYW1lfS0ke2luZGV4fWB9XG4gICAgICAgICAgICAvPil9XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICB7KGN1cnJlbnRQYWdlID4gMSkgJiZcbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9eydidXR0b24tLXNlY29uZGFyeSd9IG9uQ2xpY2s9e3RoaXMuc2hvd1ByZXZpb3VzUmVzdWx0c1BhZ2V9PlByZXZpb3VzIFBhZ2U8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB7KGN1cnJlbnRQYWdlIDwgdG90YWxQYWdlcykgJiZcbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9eydidXR0b24tLXNlY29uZGFyeSd9IG9uQ2xpY2s9e3RoaXMuc2hvd05leHRSZXN1bHRzUGFnZX0+TmV4dCBQYWdlPC9idXR0b24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxwPlRoZXJlIGFyZSBubyBjbGFpbXMgaW4gdGhpcyBjaGFubmVsPC9wPlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQ2hhbm5lbENsYWltc0Rpc3BsYXk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9DaGFubmVsQ2xhaW1zRGlzcGxheS92aWV3LmpzeCIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoe3NpdGU6IHtkZWZhdWx0czogeyBkZWZhdWx0VGh1bWJuYWlsIH19fSkgPT4ge1xuICByZXR1cm4ge1xuICAgIGRlZmF1bHRUaHVtYm5haWwsXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbnVsbCkoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29tcG9uZW50cy9Bc3NldFByZXZpZXcvaW5kZXguanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuXG5jb25zdCBBc3NldFByZXZpZXcgPSAoeyBkZWZhdWx0VGh1bWJuYWlsLCBjbGFpbURhdGE6IHsgbmFtZSwgY2xhaW1JZCwgZmlsZUV4dCwgY29udGVudFR5cGUsIHRodW1ibmFpbCB9IH0pID0+IHtcbiAgY29uc3QgZGlyZWN0U291cmNlTGluayA9IGAke2NsYWltSWR9LyR7bmFtZX0uJHtmaWxlRXh0fWA7XG4gIGNvbnN0IHNob3dVcmxMaW5rID0gYC8ke2NsYWltSWR9LyR7bmFtZX1gO1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPSdhc3NldC1ob2xkZXInPlxuICAgICAgPExpbmsgdG89e3Nob3dVcmxMaW5rfSA+XG4gICAgICAgIHsoKCkgPT4ge1xuICAgICAgICAgIHN3aXRjaCAoY29udGVudFR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2ltYWdlL2pwZWcnOlxuICAgICAgICAgICAgY2FzZSAnaW1hZ2UvanBnJzpcbiAgICAgICAgICAgIGNhc2UgJ2ltYWdlL3BuZyc6XG4gICAgICAgICAgICBjYXNlICdpbWFnZS9naWYnOlxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17J2Fzc2V0LXByZXZpZXcnfVxuICAgICAgICAgICAgICAgICAgc3JjPXtkaXJlY3RTb3VyY2VMaW5rfVxuICAgICAgICAgICAgICAgICAgYWx0PXtuYW1lfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYXNlICd2aWRlby9tcDQnOlxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17J2Fzc2V0LXByZXZpZXcgdmlkZW8nfVxuICAgICAgICAgICAgICAgICAgc3JjPXt0aHVtYm5haWwgfHwgZGVmYXVsdFRodW1ibmFpbH1cbiAgICAgICAgICAgICAgICAgIGFsdD17bmFtZX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8cD51bnN1cHBvcnRlZCBmaWxlIHR5cGU8L3A+XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpfVxuICAgICAgPC9MaW5rPlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQXNzZXRQcmV2aWV3O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbXBvbmVudHMvQXNzZXRQcmV2aWV3L3ZpZXcuanN4IiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IHNpdGU6IHsgaG9zdCwgdGl0bGUgfSB9KSA9PiB7XG4gIHJldHVybiB7XG4gICAgaG9zdCxcbiAgICB0aXRsZSxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBudWxsKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL0ZvdXJPaEZvdXJQYWdlL2luZGV4LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTmF2QmFyIGZyb20gJ2NvbnRhaW5lcnMvTmF2QmFyJztcbmltcG9ydCBIZWxtZXQgZnJvbSAncmVhY3QtaGVsbWV0JztcblxuY2xhc3MgRm91ck9oRm9yUGFnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3Qge3RpdGxlLCBob3N0fSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIDxIZWxtZXQ+XG4gICAgICAgICAgPHRpdGxlPnt0aXRsZX0gLSA0MDQ8L3RpdGxlPlxuICAgICAgICAgIDxsaW5rIHJlbD0nY2Fub25pY2FsJyBocmVmPXtgJHtob3N0fS80MDRgfSAvPlxuICAgICAgICA8L0hlbG1ldD5cbiAgICAgICAgPE5hdkJhciAvPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkJz5cbiAgICAgICAgICA8aDI+NDA0PC9oMj5cbiAgICAgICAgICA8cD5UaGF0IHBhZ2UgZG9lcyBub3QgZXhpc3Q8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgRm91ck9oRm9yUGFnZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL0ZvdXJPaEZvdXJQYWdlL3ZpZXcuanN4IiwiY29uc3QgeyBzZW5kR0FTZXJ2ZUV2ZW50IH0gPSByZXF1aXJlKCcuLi9oZWxwZXJzL2dvb2dsZUFuYWx5dGljcycpO1xuY29uc3QgeyBkZXRlcm1pbmVSZXNwb25zZVR5cGUsIGZsaXBDbGFpbU5hbWVBbmRJZEZvckJhY2t3YXJkc0NvbXBhdGliaWxpdHksIGxvZ1JlcXVlc3REYXRhLCBnZXRDbGFpbUlkQW5kU2VydmVBc3NldCB9ID0gcmVxdWlyZSgnLi4vaGVscGVycy9zZXJ2ZUhlbHBlcnMuanMnKTtcbmNvbnN0IGxicnlVcmkgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2xicnlVcmkuanMnKTtcbmNvbnN0IGhhbmRsZVNob3dSZW5kZXIgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2hhbmRsZVNob3dSZW5kZXIuanN4Jyk7XG5jb25zdCBTRVJWRSA9ICdTRVJWRSc7XG5cbm1vZHVsZS5leHBvcnRzID0gKGFwcCkgPT4ge1xuICAvLyByb3V0ZSB0byBzZXJ2ZSBhIHNwZWNpZmljIGFzc2V0IHVzaW5nIHRoZSBjaGFubmVsIG9yIGNsYWltIGlkXG4gIGFwcC5nZXQoJy86aWRlbnRpZmllci86Y2xhaW0nLCAocmVxLCByZXMpID0+IHtcbiAgICBjb25zdCB7IGhlYWRlcnMsIGlwLCBvcmlnaW5hbFVybCwgcGFyYW1zIH0gPSByZXE7XG4gICAgLy8gZGVjaWRlIGlmIHRoaXMgaXMgYSBzaG93IHJlcXVlc3RcbiAgICBsZXQgaGFzRmlsZUV4dGVuc2lvbjtcbiAgICB0cnkge1xuICAgICAgKHsgaGFzRmlsZUV4dGVuc2lvbiB9ID0gbGJyeVVyaS5wYXJzZU1vZGlmaWVyKHBhcmFtcy5jbGFpbSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgfVxuICAgIGxldCByZXNwb25zZVR5cGUgPSBkZXRlcm1pbmVSZXNwb25zZVR5cGUoaGFzRmlsZUV4dGVuc2lvbiwgaGVhZGVycyk7XG4gICAgaWYgKHJlc3BvbnNlVHlwZSAhPT0gU0VSVkUpIHtcbiAgICAgIHJldHVybiBoYW5kbGVTaG93UmVuZGVyKHJlcSwgcmVzKTtcbiAgICB9XG4gICAgLy8gaGFuZGxlIHNlcnZlIHJlcXVlc3RcbiAgICAvLyBzZW5kIGdvb2dsZSBhbmFseXRpY3NcbiAgICBzZW5kR0FTZXJ2ZUV2ZW50KGhlYWRlcnMsIGlwLCBvcmlnaW5hbFVybCk7XG4gICAgLy8gcGFyc2UgdGhlIGNsYWltXG4gICAgbGV0IGNsYWltTmFtZTtcbiAgICB0cnkge1xuICAgICAgKHsgY2xhaW1OYW1lIH0gPSBsYnJ5VXJpLnBhcnNlQ2xhaW0ocGFyYW1zLmNsYWltKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuanNvbih7c3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICB9XG4gICAgLy8gcGFyc2UgdGhlIGlkZW50aWZpZXJcbiAgICBsZXQgaXNDaGFubmVsLCBjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIGNsYWltSWQ7XG4gICAgdHJ5IHtcbiAgICAgICh7IGlzQ2hhbm5lbCwgY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBjbGFpbUlkIH0gPSBsYnJ5VXJpLnBhcnNlSWRlbnRpZmllcihwYXJhbXMuaWRlbnRpZmllcikpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgfVxuICAgIGlmICghaXNDaGFubmVsKSB7XG4gICAgICBbY2xhaW1JZCwgY2xhaW1OYW1lXSA9IGZsaXBDbGFpbU5hbWVBbmRJZEZvckJhY2t3YXJkc0NvbXBhdGliaWxpdHkoY2xhaW1JZCwgY2xhaW1OYW1lKTtcbiAgICB9XG4gICAgLy8gbG9nIHRoZSByZXF1ZXN0IGRhdGEgZm9yIGRlYnVnZ2luZ1xuICAgIGxvZ1JlcXVlc3REYXRhKHJlc3BvbnNlVHlwZSwgY2xhaW1OYW1lLCBjaGFubmVsTmFtZSwgY2xhaW1JZCk7XG4gICAgLy8gZ2V0IHRoZSBjbGFpbSBJZCBhbmQgdGhlbiBzZXJ2ZSB0aGUgYXNzZXRcbiAgICBnZXRDbGFpbUlkQW5kU2VydmVBc3NldChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIGNsYWltTmFtZSwgY2xhaW1JZCwgb3JpZ2luYWxVcmwsIGlwLCByZXMpO1xuICB9KTtcbiAgLy8gcm91dGUgdG8gc2VydmUgdGhlIHdpbm5pbmcgYXNzZXQgYXQgYSBjbGFpbSBvciBhIGNoYW5uZWwgcGFnZVxuICBhcHAuZ2V0KCcvOmNsYWltJywgKHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3QgeyBoZWFkZXJzLCBpcCwgb3JpZ2luYWxVcmwsIHBhcmFtcyB9ID0gcmVxO1xuICAgIC8vIGRlY2lkZSBpZiB0aGlzIGlzIGEgc2hvdyByZXF1ZXN0XG4gICAgbGV0IGhhc0ZpbGVFeHRlbnNpb247XG4gICAgdHJ5IHtcbiAgICAgICh7IGhhc0ZpbGVFeHRlbnNpb24gfSA9IGxicnlVcmkucGFyc2VNb2RpZmllcihwYXJhbXMuY2xhaW0pKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogZXJyb3IubWVzc2FnZX0pO1xuICAgIH1cbiAgICBsZXQgcmVzcG9uc2VUeXBlID0gZGV0ZXJtaW5lUmVzcG9uc2VUeXBlKGhhc0ZpbGVFeHRlbnNpb24sIGhlYWRlcnMpO1xuICAgIGlmIChyZXNwb25zZVR5cGUgIT09IFNFUlZFKSB7XG4gICAgICByZXR1cm4gaGFuZGxlU2hvd1JlbmRlcihyZXEsIHJlcyk7XG4gICAgfVxuICAgIC8vIGhhbmRsZSBzZXJ2ZSByZXF1ZXN0XG4gICAgLy8gc2VuZCBnb29nbGUgYW5hbHl0aWNzXG4gICAgc2VuZEdBU2VydmVFdmVudChoZWFkZXJzLCBpcCwgb3JpZ2luYWxVcmwpO1xuICAgIC8vIHBhcnNlIHRoZSBjbGFpbVxuICAgIGxldCBjbGFpbU5hbWU7XG4gICAgdHJ5IHtcbiAgICAgICh7Y2xhaW1OYW1lfSA9IGxicnlVcmkucGFyc2VDbGFpbShwYXJhbXMuY2xhaW0pKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogZXJyb3IubWVzc2FnZX0pO1xuICAgIH1cbiAgICAvLyBsb2cgdGhlIHJlcXVlc3QgZGF0YSBmb3IgZGVidWdnaW5nXG4gICAgbG9nUmVxdWVzdERhdGEocmVzcG9uc2VUeXBlLCBjbGFpbU5hbWUsIG51bGwsIG51bGwpO1xuICAgIC8vIGdldCB0aGUgY2xhaW0gSWQgYW5kIHRoZW4gc2VydmUgdGhlIGFzc2V0XG4gICAgZ2V0Q2xhaW1JZEFuZFNlcnZlQXNzZXQobnVsbCwgbnVsbCwgY2xhaW1OYW1lLCBudWxsLCBvcmlnaW5hbFVybCwgaXAsIHJlcyk7XG4gIH0pO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9yb3V0ZXMvYXNzZXQtcm91dGVzLmpzIiwiY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuY29uc3QgeyBnZXRDbGFpbUlkLCBnZXRMb2NhbEZpbGVSZWNvcmQgfSA9IHJlcXVpcmUoJy4uL2NvbnRyb2xsZXJzL3NlcnZlQ29udHJvbGxlci5qcycpO1xuY29uc3QgeyBoYW5kbGVFcnJvclJlc3BvbnNlIH0gPSByZXF1aXJlKCcuL2Vycm9ySGFuZGxlcnMuanMnKTtcblxuY29uc3QgU0VSVkUgPSAnU0VSVkUnO1xuY29uc3QgU0hPVyA9ICdTSE9XJztcbmNvbnN0IE5PX0ZJTEUgPSAnTk9fRklMRSc7XG5jb25zdCBOT19DSEFOTkVMID0gJ05PX0NIQU5ORUwnO1xuY29uc3QgTk9fQ0xBSU0gPSAnTk9fQ0xBSU0nO1xuXG5mdW5jdGlvbiBjbGllbnRBY2NlcHRzSHRtbCAoe2FjY2VwdH0pIHtcbiAgcmV0dXJuIGFjY2VwdCAmJiBhY2NlcHQubWF0Y2goL3RleHRcXC9odG1sLyk7XG59O1xuXG5mdW5jdGlvbiByZXF1ZXN0SXNGcm9tQnJvd3NlciAoaGVhZGVycykge1xuICByZXR1cm4gaGVhZGVyc1sndXNlci1hZ2VudCddICYmIGhlYWRlcnNbJ3VzZXItYWdlbnQnXS5tYXRjaCgvTW96aWxsYS8pO1xufTtcblxuZnVuY3Rpb24gY2xpZW50V2FudHNBc3NldCAoe2FjY2VwdCwgcmFuZ2V9KSB7XG4gIGNvbnN0IGltYWdlSXNXYW50ZWQgPSBhY2NlcHQgJiYgYWNjZXB0Lm1hdGNoKC9pbWFnZVxcLy4qLykgJiYgIWFjY2VwdC5tYXRjaCgvdGV4dFxcL2h0bWwvKSAmJiAhYWNjZXB0Lm1hdGNoKC90ZXh0XFwvXFwqLyk7XG4gIGNvbnN0IHZpZGVvSXNXYW50ZWQgPSBhY2NlcHQgJiYgcmFuZ2U7XG4gIHJldHVybiBpbWFnZUlzV2FudGVkIHx8IHZpZGVvSXNXYW50ZWQ7XG59O1xuXG5mdW5jdGlvbiBpc1ZhbGlkQ2xhaW1JZCAoY2xhaW1JZCkge1xuICByZXR1cm4gKChjbGFpbUlkLmxlbmd0aCA9PT0gNDApICYmICEvW15BLVphLXowLTldL2cudGVzdChjbGFpbUlkKSk7XG59O1xuXG5mdW5jdGlvbiBpc1ZhbGlkU2hvcnRJZCAoY2xhaW1JZCkge1xuICByZXR1cm4gY2xhaW1JZC5sZW5ndGggPT09IDE7ICAvLyBpdCBzaG91bGQgcmVhbGx5IGV2YWx1YXRlIHRoZSBzaG9ydCB1cmwgaXRzZWxmXG59O1xuXG5mdW5jdGlvbiBpc1ZhbGlkU2hvcnRJZE9yQ2xhaW1JZCAoaW5wdXQpIHtcbiAgcmV0dXJuIChpc1ZhbGlkQ2xhaW1JZChpbnB1dCkgfHwgaXNWYWxpZFNob3J0SWQoaW5wdXQpKTtcbn07XG5cbmZ1bmN0aW9uIHNlcnZlQXNzZXRUb0NsaWVudCAoY2xhaW1JZCwgbmFtZSwgcmVzKSB7XG4gIHJldHVybiBnZXRMb2NhbEZpbGVSZWNvcmQoY2xhaW1JZCwgbmFtZSlcbiAgICAudGhlbihmaWxlUmVjb3JkID0+IHtcbiAgICAgIC8vIGNoZWNrIHRoYXQgYSBsb2NhbCByZWNvcmQgd2FzIGZvdW5kXG4gICAgICBpZiAoZmlsZVJlY29yZCA9PT0gTk9fRklMRSkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cygzMDcpLnJlZGlyZWN0KGAvYXBpL2NsYWltL2dldC8ke25hbWV9LyR7Y2xhaW1JZH1gKTtcbiAgICAgIH1cbiAgICAgIC8vIHNlcnZlIHRoZSBmaWxlXG4gICAgICBjb25zdCB7ZmlsZVBhdGgsIGZpbGVUeXBlfSA9IGZpbGVSZWNvcmQ7XG4gICAgICBsb2dnZXIudmVyYm9zZShgc2VydmluZyBmaWxlOiAke2ZpbGVQYXRofWApO1xuICAgICAgY29uc3Qgc2VuZEZpbGVPcHRpb25zID0ge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ1gtQ29udGVudC1UeXBlLU9wdGlvbnMnOiAnbm9zbmlmZicsXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZScgICAgICAgICAgOiBmaWxlVHlwZSB8fCAnaW1hZ2UvanBlZycsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcmVzLnN0YXR1cygyMDApLnNlbmRGaWxlKGZpbGVQYXRoLCBzZW5kRmlsZU9wdGlvbnMpO1xuICAgIH0pXG4gICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENsYWltSWRBbmRTZXJ2ZUFzc2V0IChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIGNsYWltTmFtZSwgY2xhaW1JZCwgb3JpZ2luYWxVcmwsIGlwLCByZXMpIHtcbiAgICAvLyBnZXQgdGhlIGNsYWltIElkIGFuZCB0aGVuIHNlcnZlIHRoZSBhc3NldFxuICAgIGdldENsYWltSWQoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBjbGFpbU5hbWUsIGNsYWltSWQpXG4gICAgICAudGhlbihmdWxsQ2xhaW1JZCA9PiB7XG4gICAgICAgIGlmIChmdWxsQ2xhaW1JZCA9PT0gTk9fQ0xBSU0pIHtcbiAgICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiAnbm8gY2xhaW0gaWQgY291bGQgYmUgZm91bmQnfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZnVsbENsYWltSWQgPT09IE5PX0NIQU5ORUwpIHtcbiAgICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiAnbm8gY2hhbm5lbCBpZCBjb3VsZCBiZSBmb3VuZCd9KTtcbiAgICAgICAgfVxuICAgICAgICBzZXJ2ZUFzc2V0VG9DbGllbnQoZnVsbENsYWltSWQsIGNsYWltTmFtZSwgcmVzKTtcbiAgICAgICAgLy8gcG9zdFRvU3RhdHMocmVzcG9uc2VUeXBlLCBvcmlnaW5hbFVybCwgaXAsIGNsYWltTmFtZSwgZnVsbENsYWltSWQsICdzdWNjZXNzJyk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xuICAgICAgICAvLyBwb3N0VG9TdGF0cyhyZXNwb25zZVR5cGUsIG9yaWdpbmFsVXJsLCBpcCwgY2xhaW1OYW1lLCBmdWxsQ2xhaW1JZCwgJ2ZhaWwnKTtcbiAgICAgIH0pO1xuICB9LFxuICBkZXRlcm1pbmVSZXNwb25zZVR5cGUgKGhhc0ZpbGVFeHRlbnNpb24sIGhlYWRlcnMpIHtcbiAgICBsZXQgcmVzcG9uc2VUeXBlO1xuICAgIGlmIChoYXNGaWxlRXh0ZW5zaW9uKSB7XG4gICAgICByZXNwb25zZVR5cGUgPSBTRVJWRTsgIC8vIGFzc3VtZSBhIHNlcnZlIHJlcXVlc3QgaWYgZmlsZSBleHRlbnNpb24gaXMgcHJlc2VudFxuICAgICAgaWYgKGNsaWVudEFjY2VwdHNIdG1sKGhlYWRlcnMpKSB7ICAvLyBpZiB0aGUgcmVxdWVzdCBjb21lcyBmcm9tIGEgYnJvd3NlciwgY2hhbmdlIGl0IHRvIGEgc2hvdyByZXF1ZXN0XG4gICAgICAgIHJlc3BvbnNlVHlwZSA9IFNIT1c7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3BvbnNlVHlwZSA9IFNIT1c7XG4gICAgICBpZiAoY2xpZW50V2FudHNBc3NldChoZWFkZXJzKSAmJiByZXF1ZXN0SXNGcm9tQnJvd3NlcihoZWFkZXJzKSkgeyAgLy8gdGhpcyBpcyBpbiBjYXNlIHNvbWVvbmUgZW1iZWRzIGEgc2hvdyB1cmxcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdTaG93IHJlcXVlc3QgY2FtZSBmcm9tIGJyb3dzZXIgYnV0IHdhbnRzIGFuIGltYWdlL3ZpZGVvLiBDaGFuZ2luZyByZXNwb25zZSB0byBzZXJ2ZS4uLicpO1xuICAgICAgICByZXNwb25zZVR5cGUgPSBTRVJWRTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlVHlwZTtcbiAgfSxcbiAgZmxpcENsYWltTmFtZUFuZElkRm9yQmFja3dhcmRzQ29tcGF0aWJpbGl0eSAoaWRlbnRpZmllciwgbmFtZSkge1xuICAgIC8vIHRoaXMgaXMgYSBwYXRjaCBmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgd2l0aCAnL25hbWUvY2xhaW1faWQnIHVybCBmb3JtYXRcbiAgICBpZiAoaXNWYWxpZFNob3J0SWRPckNsYWltSWQobmFtZSkgJiYgIWlzVmFsaWRTaG9ydElkT3JDbGFpbUlkKGlkZW50aWZpZXIpKSB7XG4gICAgICBjb25zdCB0ZW1wTmFtZSA9IG5hbWU7XG4gICAgICBuYW1lID0gaWRlbnRpZmllcjtcbiAgICAgIGlkZW50aWZpZXIgPSB0ZW1wTmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIFtpZGVudGlmaWVyLCBuYW1lXTtcbiAgfSxcbiAgbG9nUmVxdWVzdERhdGEgKHJlc3BvbnNlVHlwZSwgY2xhaW1OYW1lLCBjaGFubmVsTmFtZSwgY2xhaW1JZCkge1xuICAgIGxvZ2dlci5kZWJ1ZygncmVzcG9uc2VUeXBlID09PScsIHJlc3BvbnNlVHlwZSk7XG4gICAgbG9nZ2VyLmRlYnVnKCdjbGFpbSBuYW1lID09PSAnLCBjbGFpbU5hbWUpO1xuICAgIGxvZ2dlci5kZWJ1ZygnY2hhbm5lbCBuYW1lID09PScsIGNoYW5uZWxOYW1lKTtcbiAgICBsb2dnZXIuZGVidWcoJ2NsYWltIGlkID09PScsIGNsYWltSWQpO1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9oZWxwZXJzL3NlcnZlSGVscGVycy5qcyIsImNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFJFR0VYUF9JTlZBTElEX0NMQUlNICA6IC9bXkEtWmEtejAtOS1dL2csXG4gIFJFR0VYUF9JTlZBTElEX0NIQU5ORUw6IC9bXkEtWmEtejAtOS1AXS9nLFxuICBSRUdFWFBfQUREUkVTUyAgICAgICAgOiAvXmIoPz1bXjBPSWxdezMyLDMzfSlbMC05QS1aYS16XXszMiwzM30kLyxcbiAgQ0hBTk5FTF9DSEFSICAgICAgICAgIDogJ0AnLFxuICBwYXJzZUlkZW50aWZpZXIgICAgICAgOiBmdW5jdGlvbiAoaWRlbnRpZmllcikge1xuICAgIGxvZ2dlci5kZWJ1ZygncGFyc2luZyBpZGVudGlmaWVyOicsIGlkZW50aWZpZXIpO1xuICAgIGNvbnN0IGNvbXBvbmVudHNSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAnKFteOiQjL10qKScgKyAvLyB2YWx1ZSAoc3RvcHMgYXQgdGhlIGZpcnN0IHNlcGFyYXRvciBvciBlbmQpXG4gICAgICAnKFs6JCNdPykoW14vXSopJyAvLyBtb2RpZmllciBzZXBhcmF0b3IsIG1vZGlmaWVyIChzdG9wcyBhdCB0aGUgZmlyc3QgcGF0aCBzZXBhcmF0b3Igb3IgZW5kKVxuICAgICk7XG4gICAgY29uc3QgW3Byb3RvLCB2YWx1ZSwgbW9kaWZpZXJTZXBlcmF0b3IsIG1vZGlmaWVyXSA9IGNvbXBvbmVudHNSZWdleFxuICAgICAgLmV4ZWMoaWRlbnRpZmllcilcbiAgICAgIC5tYXAobWF0Y2ggPT4gbWF0Y2ggfHwgbnVsbCk7XG4gICAgbG9nZ2VyLmRlYnVnKGAke3Byb3RvfSwgJHt2YWx1ZX0sICR7bW9kaWZpZXJTZXBlcmF0b3J9LCAke21vZGlmaWVyfWApO1xuXG4gICAgLy8gVmFsaWRhdGUgYW5kIHByb2Nlc3MgbmFtZVxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2hlY2sgeW91ciB1cmwuICBObyBjaGFubmVsIG5hbWUgcHJvdmlkZWQgYmVmb3JlIFwiJHttb2RpZmllclNlcGVyYXRvcn1cImApO1xuICAgIH1cbiAgICBjb25zdCBpc0NoYW5uZWwgPSB2YWx1ZS5zdGFydHNXaXRoKG1vZHVsZS5leHBvcnRzLkNIQU5ORUxfQ0hBUik7XG4gICAgY29uc3QgY2hhbm5lbE5hbWUgPSBpc0NoYW5uZWwgPyB2YWx1ZSA6IG51bGw7XG4gICAgbGV0IGNsYWltSWQ7XG4gICAgaWYgKGlzQ2hhbm5lbCkge1xuICAgICAgaWYgKCFjaGFubmVsTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNoYW5uZWwgbmFtZSBhZnRlciBALicpO1xuICAgICAgfVxuICAgICAgY29uc3QgbmFtZUJhZENoYXJzID0gKGNoYW5uZWxOYW1lKS5tYXRjaChtb2R1bGUuZXhwb3J0cy5SRUdFWFBfSU5WQUxJRF9DSEFOTkVMKTtcbiAgICAgIGlmIChuYW1lQmFkQ2hhcnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYXJhY3RlcnMgaW4gY2hhbm5lbCBuYW1lOiAke25hbWVCYWRDaGFycy5qb2luKCcsICcpfS5gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY2xhaW1JZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGFuZCBwcm9jZXNzIG1vZGlmaWVyXG4gICAgbGV0IGNoYW5uZWxDbGFpbUlkO1xuICAgIGlmIChtb2RpZmllclNlcGVyYXRvcikge1xuICAgICAgaWYgKCFtb2RpZmllcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG1vZGlmaWVyIHByb3ZpZGVkIGFmdGVyIHNlcGFyYXRvciBcIiR7bW9kaWZpZXJTZXBlcmF0b3J9XCJgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vZGlmaWVyU2VwZXJhdG9yID09PSAnOicpIHtcbiAgICAgICAgY2hhbm5lbENsYWltSWQgPSBtb2RpZmllcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIFwiJHttb2RpZmllclNlcGVyYXRvcn1cIiBtb2RpZmllciBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZGApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaXNDaGFubmVsLFxuICAgICAgY2hhbm5lbE5hbWUsXG4gICAgICBjaGFubmVsQ2xhaW1JZCxcbiAgICAgIGNsYWltSWQsXG4gICAgfTtcbiAgfSxcbiAgcGFyc2VDbGFpbTogZnVuY3Rpb24gKGNsYWltKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdwYXJzaW5nIG5hbWU6JywgY2xhaW0pO1xuICAgIGNvbnN0IGNvbXBvbmVudHNSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAnKFteOiQjLy5dKiknICsgLy8gbmFtZSAoc3RvcHMgYXQgdGhlIGZpcnN0IG1vZGlmaWVyKVxuICAgICAgJyhbOiQjLl0/KShbXi9dKiknIC8vIG1vZGlmaWVyIHNlcGFyYXRvciwgbW9kaWZpZXIgKHN0b3BzIGF0IHRoZSBmaXJzdCBwYXRoIHNlcGFyYXRvciBvciBlbmQpXG4gICAgKTtcbiAgICBjb25zdCBbcHJvdG8sIGNsYWltTmFtZSwgbW9kaWZpZXJTZXBlcmF0b3IsIG1vZGlmaWVyXSA9IGNvbXBvbmVudHNSZWdleFxuICAgICAgLmV4ZWMoY2xhaW0pXG4gICAgICAubWFwKG1hdGNoID0+IG1hdGNoIHx8IG51bGwpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgJHtwcm90b30sICR7Y2xhaW1OYW1lfSwgJHttb2RpZmllclNlcGVyYXRvcn0sICR7bW9kaWZpZXJ9YCk7XG5cbiAgICAvLyBWYWxpZGF0ZSBhbmQgcHJvY2VzcyBuYW1lXG4gICAgaWYgKCFjbGFpbU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY2xhaW0gbmFtZSBwcm92aWRlZCBiZWZvcmUgLicpO1xuICAgIH1cbiAgICBjb25zdCBuYW1lQmFkQ2hhcnMgPSAoY2xhaW1OYW1lKS5tYXRjaChtb2R1bGUuZXhwb3J0cy5SRUdFWFBfSU5WQUxJRF9DTEFJTSk7XG4gICAgaWYgKG5hbWVCYWRDaGFycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYXJhY3RlcnMgaW4gY2xhaW0gbmFtZTogJHtuYW1lQmFkQ2hhcnMuam9pbignLCAnKX0uYCk7XG4gICAgfVxuICAgIC8vIFZhbGlkYXRlIGFuZCBwcm9jZXNzIG1vZGlmaWVyXG4gICAgaWYgKG1vZGlmaWVyU2VwZXJhdG9yKSB7XG4gICAgICBpZiAoIW1vZGlmaWVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gZmlsZSBleHRlbnNpb24gcHJvdmlkZWQgYWZ0ZXIgc2VwYXJhdG9yICR7bW9kaWZpZXJTZXBlcmF0b3J9LmApO1xuICAgICAgfVxuICAgICAgaWYgKG1vZGlmaWVyU2VwZXJhdG9yICE9PSAnLicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJHttb2RpZmllclNlcGVyYXRvcn0gbW9kaWZpZXIgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgY2xhaW0gbmFtZWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyByZXR1cm4gcmVzdWx0c1xuICAgIHJldHVybiB7XG4gICAgICBjbGFpbU5hbWUsXG4gICAgfTtcbiAgfSxcbiAgcGFyc2VNb2RpZmllcjogZnVuY3Rpb24gKGNsYWltKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdwYXJzaW5nIG1vZGlmaWVyOicsIGNsYWltKTtcbiAgICBjb25zdCBjb21wb25lbnRzUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgJyhbXjokIy8uXSopJyArIC8vIG5hbWUgKHN0b3BzIGF0IHRoZSBmaXJzdCBtb2RpZmllcilcbiAgICAgICcoWzokIy5dPykoW14vXSopJyAvLyBtb2RpZmllciBzZXBhcmF0b3IsIG1vZGlmaWVyIChzdG9wcyBhdCB0aGUgZmlyc3QgcGF0aCBzZXBhcmF0b3Igb3IgZW5kKVxuICAgICk7XG4gICAgY29uc3QgW3Byb3RvLCBjbGFpbU5hbWUsIG1vZGlmaWVyU2VwZXJhdG9yLCBtb2RpZmllcl0gPSBjb21wb25lbnRzUmVnZXhcbiAgICAgIC5leGVjKGNsYWltKVxuICAgICAgLm1hcChtYXRjaCA9PiBtYXRjaCB8fCBudWxsKTtcbiAgICBsb2dnZXIuZGVidWcoYCR7cHJvdG99LCAke2NsYWltTmFtZX0sICR7bW9kaWZpZXJTZXBlcmF0b3J9LCAke21vZGlmaWVyfWApO1xuICAgIC8vIFZhbGlkYXRlIGFuZCBwcm9jZXNzIG1vZGlmaWVyXG4gICAgbGV0IGhhc0ZpbGVFeHRlbnNpb24gPSBmYWxzZTtcbiAgICBpZiAobW9kaWZpZXJTZXBlcmF0b3IpIHtcbiAgICAgIGhhc0ZpbGVFeHRlbnNpb24gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaGFzRmlsZUV4dGVuc2lvbixcbiAgICB9O1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9oZWxwZXJzL2xicnlVcmkuanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyVG9TdHJpbmcgfSBmcm9tICdyZWFjdC1kb20vc2VydmVyJztcbmltcG9ydCB7IGNyZWF0ZVN0b3JlLCBhcHBseU1pZGRsZXdhcmUgfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQgUmVkdWNlciBmcm9tICcuLi8uLi9jbGllbnQvcmVkdWNlcnMvaW5kZXgnO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgeyBTdGF0aWNSb3V0ZXIgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCBHQUxpc3RlbmVyIGZyb20gJy4uLy4uL2NsaWVudC9jb21wb25lbnRzL0dBTGlzdGVuZXIvaW5kZXgnO1xuaW1wb3J0IEFwcCBmcm9tICcuLi8uLi9jbGllbnQvYXBwJztcbmltcG9ydCByZW5kZXJGdWxsUGFnZSBmcm9tICcuL3JlbmRlckZ1bGxQYWdlJztcbmltcG9ydCBjcmVhdGVTYWdhTWlkZGxld2FyZSBmcm9tICdyZWR1eC1zYWdhJztcbmltcG9ydCB7IGNhbGwgfSBmcm9tICdyZWR1eC1zYWdhL2VmZmVjdHMnO1xuaW1wb3J0IHsgaGFuZGxlU2hvd1BhZ2VVcmkgfSBmcm9tICcuLi8uLi9jbGllbnQvc2FnYXMvc2hvd191cmknO1xuaW1wb3J0IHsgb25IYW5kbGVTaG93UGFnZVVyaSB9IGZyb20gJy4uLy4uL2NsaWVudC9hY3Rpb25zL3Nob3cnO1xuXG5pbXBvcnQgSGVsbWV0IGZyb20gJ3JlYWN0LWhlbG1ldCc7XG5cbmNvbnN0IHJldHVyblNhZ2FXaXRoUGFyYW1zID0gKHNhZ2EsIHBhcmFtcykgPT4ge1xuICByZXR1cm4gZnVuY3Rpb24gKiAoKSB7XG4gICAgeWllbGQgY2FsbChzYWdhLCBwYXJhbXMpO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSAocmVxLCByZXMpID0+IHtcbiAgbGV0IGNvbnRleHQgPSB7fTtcblxuICAvLyBjcmVhdGUgYW5kIGFwcGx5IG1pZGRsZXdhcmVcbiAgY29uc3Qgc2FnYU1pZGRsZXdhcmUgPSBjcmVhdGVTYWdhTWlkZGxld2FyZSgpO1xuICBjb25zdCBtaWRkbGV3YXJlID0gYXBwbHlNaWRkbGV3YXJlKHNhZ2FNaWRkbGV3YXJlKTtcblxuICAvLyBjcmVhdGUgYSBuZXcgUmVkdXggc3RvcmUgaW5zdGFuY2VcbiAgY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZShSZWR1Y2VyLCBtaWRkbGV3YXJlKTtcblxuICAvLyBjcmVhdGUgc2FnYVxuICBjb25zdCBhY3Rpb24gPSBvbkhhbmRsZVNob3dQYWdlVXJpKHJlcS5wYXJhbXMpO1xuICBjb25zdCBzYWdhID0gcmV0dXJuU2FnYVdpdGhQYXJhbXMoaGFuZGxlU2hvd1BhZ2VVcmksIGFjdGlvbik7XG5cbiAgLy8gcnVuIHRoZSBzYWdhIG1pZGRsZXdhcmVcbiAgc2FnYU1pZGRsZXdhcmVcbiAgICAucnVuKHNhZ2EpXG4gICAgLmRvbmVcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICAvLyByZW5kZXIgY29tcG9uZW50IHRvIGEgc3RyaW5nXG4gICAgICBjb25zdCBodG1sID0gcmVuZGVyVG9TdHJpbmcoXG4gICAgICAgIDxQcm92aWRlciBzdG9yZT17c3RvcmV9PlxuICAgICAgICAgIDxTdGF0aWNSb3V0ZXIgbG9jYXRpb249e3JlcS51cmx9IGNvbnRleHQ9e2NvbnRleHR9PlxuICAgICAgICAgICAgPEdBTGlzdGVuZXI+XG4gICAgICAgICAgICAgIDxBcHAgLz5cbiAgICAgICAgICAgIDwvR0FMaXN0ZW5lcj5cbiAgICAgICAgICA8L1N0YXRpY1JvdXRlcj5cbiAgICAgICAgPC9Qcm92aWRlcj5cbiAgICAgICk7XG5cbiAgICAgIC8vIGdldCBoZWFkIHRhZ3MgZnJvbSBoZWxtZXRcbiAgICAgIGNvbnN0IGhlbG1ldCA9IEhlbG1ldC5yZW5kZXJTdGF0aWMoKTtcblxuICAgICAgLy8gY2hlY2sgZm9yIGEgcmVkaXJlY3RcbiAgICAgIGlmIChjb250ZXh0LnVybCkge1xuICAgICAgICByZXR1cm4gcmVzLnJlZGlyZWN0KDMwMSwgY29udGV4dC51cmwpO1xuICAgICAgfVxuXG4gICAgICAvLyBnZXQgdGhlIGluaXRpYWwgc3RhdGUgZnJvbSBvdXIgUmVkdXggc3RvcmVcbiAgICAgIGNvbnN0IHByZWxvYWRlZFN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcblxuICAgICAgLy8gc2VuZCB0aGUgcmVuZGVyZWQgcGFnZSBiYWNrIHRvIHRoZSBjbGllbnRcbiAgICAgIHJlcy5zZW5kKHJlbmRlckZ1bGxQYWdlKGhlbG1ldCwgaHRtbCwgcHJlbG9hZGVkU3RhdGUpKTtcbiAgICB9KTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvaGVscGVycy9oYW5kbGVTaG93UmVuZGVyLmpzeCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlZHV4LXNhZ2FcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJyZWR1eC1zYWdhXCJcbi8vIG1vZHVsZSBpZCA9IDEzMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgeyBjYWxsLCBwdXQsIHRha2VMYXRlc3QgfSBmcm9tICdyZWR1eC1zYWdhL2VmZmVjdHMnO1xuaW1wb3J0ICogYXMgYWN0aW9ucyBmcm9tICdjb25zdGFudHMvc2hvd19hY3Rpb25fdHlwZXMnO1xuaW1wb3J0IHsgb25SZXF1ZXN0RXJyb3IsIG9uTmV3Q2hhbm5lbFJlcXVlc3QsIG9uTmV3QXNzZXRSZXF1ZXN0IH0gZnJvbSAnYWN0aW9ucy9zaG93JztcbmltcG9ydCB7IG5ld0Fzc2V0UmVxdWVzdCB9IGZyb20gJ3NhZ2FzL3Nob3dfYXNzZXQnO1xuaW1wb3J0IHsgbmV3Q2hhbm5lbFJlcXVlc3QgfSBmcm9tICdzYWdhcy9zaG93X2NoYW5uZWwnO1xuaW1wb3J0IGxicnlVcmkgZnJvbSAndXRpbHMvbGJyeVVyaSc7XG5cbmZ1bmN0aW9uICogcGFyc2VBbmRVcGRhdGVJZGVudGlmaWVyQW5kQ2xhaW0gKG1vZGlmaWVyLCBjbGFpbSkge1xuICAvLyB0aGlzIGlzIGEgcmVxdWVzdCBmb3IgYW4gYXNzZXRcbiAgLy8gY2xhaW0gd2lsbCBiZSBhbiBhc3NldCBjbGFpbVxuICAvLyB0aGUgaWRlbnRpZmllciBjb3VsZCBiZSBhIGNoYW5uZWwgb3IgYSBjbGFpbSBpZFxuICBsZXQgaXNDaGFubmVsLCBjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIGNsYWltSWQsIGNsYWltTmFtZSwgZXh0ZW5zaW9uO1xuICB0cnkge1xuICAgICh7IGlzQ2hhbm5lbCwgY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBjbGFpbUlkIH0gPSBsYnJ5VXJpLnBhcnNlSWRlbnRpZmllcihtb2RpZmllcikpO1xuICAgICh7IGNsYWltTmFtZSwgZXh0ZW5zaW9uIH0gPSBsYnJ5VXJpLnBhcnNlQ2xhaW0oY2xhaW0pKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geWllbGQgcHV0KG9uUmVxdWVzdEVycm9yKGVycm9yLm1lc3NhZ2UpKTtcbiAgfVxuICAvLyB0cmlnZ2VyIGFuIG5ldyBhY3Rpb24gdG8gdXBkYXRlIHRoZSBzdG9yZVxuICBpZiAoaXNDaGFubmVsKSB7XG4gICAgcmV0dXJuIHlpZWxkIGNhbGwobmV3QXNzZXRSZXF1ZXN0LCBvbk5ld0Fzc2V0UmVxdWVzdChjbGFpbU5hbWUsIG51bGwsIGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCwgZXh0ZW5zaW9uKSk7XG4gIH07XG4gIHlpZWxkIGNhbGwobmV3QXNzZXRSZXF1ZXN0LCBvbk5ld0Fzc2V0UmVxdWVzdChjbGFpbU5hbWUsIGNsYWltSWQsIG51bGwsIG51bGwsIGV4dGVuc2lvbikpO1xufVxuZnVuY3Rpb24gKiBwYXJzZUFuZFVwZGF0ZUNsYWltT25seSAoY2xhaW0pIHtcbiAgLy8gdGhpcyBjb3VsZCBiZSBhIHJlcXVlc3QgZm9yIGFuIGFzc2V0IG9yIGEgY2hhbm5lbCBwYWdlXG4gIC8vIGNsYWltIGNvdWxkIGJlIGFuIGFzc2V0IGNsYWltIG9yIGEgY2hhbm5lbCBjbGFpbVxuICBsZXQgaXNDaGFubmVsLCBjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQ7XG4gIHRyeSB7XG4gICAgKHsgaXNDaGFubmVsLCBjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQgfSA9IGxicnlVcmkucGFyc2VJZGVudGlmaWVyKGNsYWltKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gIH1cbiAgLy8gdHJpZ2dlciBhbiBuZXcgYWN0aW9uIHRvIHVwZGF0ZSB0aGUgc3RvcmVcbiAgLy8gcmV0dXJuIGVhcmx5IGlmIHRoaXMgcmVxdWVzdCBpcyBmb3IgYSBjaGFubmVsXG4gIGlmIChpc0NoYW5uZWwpIHtcbiAgICByZXR1cm4geWllbGQgY2FsbChuZXdDaGFubmVsUmVxdWVzdCwgb25OZXdDaGFubmVsUmVxdWVzdChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQpKTtcbiAgfVxuICAvLyBpZiBub3QgZm9yIGEgY2hhbm5lbCwgcGFyc2UgdGhlIGNsYWltIHJlcXVlc3RcbiAgbGV0IGNsYWltTmFtZSwgZXh0ZW5zaW9uO1xuICB0cnkge1xuICAgICh7Y2xhaW1OYW1lLCBleHRlbnNpb259ID0gbGJyeVVyaS5wYXJzZUNsYWltKGNsYWltKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gIH1cbiAgeWllbGQgY2FsbChuZXdBc3NldFJlcXVlc3QsIG9uTmV3QXNzZXRSZXF1ZXN0KGNsYWltTmFtZSwgbnVsbCwgbnVsbCwgbnVsbCwgZXh0ZW5zaW9uKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiAqIGhhbmRsZVNob3dQYWdlVXJpIChhY3Rpb24pIHtcbiAgY29uc3QgeyBpZGVudGlmaWVyLCBjbGFpbSB9ID0gYWN0aW9uLmRhdGE7XG4gIGlmIChpZGVudGlmaWVyKSB7XG4gICAgcmV0dXJuIHlpZWxkIGNhbGwocGFyc2VBbmRVcGRhdGVJZGVudGlmaWVyQW5kQ2xhaW0sIGlkZW50aWZpZXIsIGNsYWltKTtcbiAgfVxuICB5aWVsZCBjYWxsKHBhcnNlQW5kVXBkYXRlQ2xhaW1Pbmx5LCBjbGFpbSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gKiB3YXRjaEhhbmRsZVNob3dQYWdlVXJpICgpIHtcbiAgeWllbGQgdGFrZUxhdGVzdChhY3Rpb25zLkhBTkRMRV9TSE9XX1VSSSwgaGFuZGxlU2hvd1BhZ2VVcmkpO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9zYWdhcy9zaG93X3VyaS5qcyIsImltcG9ydCB7IGNhbGwsIHB1dCwgc2VsZWN0LCB0YWtlTGF0ZXN0IH0gZnJvbSAncmVkdXgtc2FnYS9lZmZlY3RzJztcbmltcG9ydCAqIGFzIGFjdGlvbnMgZnJvbSAnY29uc3RhbnRzL3Nob3dfYWN0aW9uX3R5cGVzJztcbmltcG9ydCB7IGFkZFJlcXVlc3RUb1JlcXVlc3RMaXN0LCBvblJlcXVlc3RFcnJvciwgb25SZXF1ZXN0VXBkYXRlLCBhZGRBc3NldFRvQXNzZXRMaXN0IH0gZnJvbSAnYWN0aW9ucy9zaG93JztcbmltcG9ydCB7IGdldExvbmdDbGFpbUlkLCBnZXRTaG9ydElkLCBnZXRDbGFpbURhdGEgfSBmcm9tICdhcGkvYXNzZXRBcGknO1xuaW1wb3J0IHsgc2VsZWN0U2hvd1N0YXRlIH0gZnJvbSAnc2VsZWN0b3JzL3Nob3cnO1xuaW1wb3J0IHsgc2VsZWN0U2l0ZUhvc3QgfSBmcm9tICdzZWxlY3RvcnMvc2l0ZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiAqIG5ld0Fzc2V0UmVxdWVzdCAoYWN0aW9uKSB7XG4gIGNvbnN0IHsgcmVxdWVzdFR5cGUsIHJlcXVlc3RJZCwgbmFtZSwgbW9kaWZpZXIgfSA9IGFjdGlvbi5kYXRhO1xuICAvLyBwdXQgYW4gYWN0aW9uIHRvIHVwZGF0ZSB0aGUgcmVxdWVzdCBpbiByZWR1eFxuICB5aWVsZCBwdXQob25SZXF1ZXN0VXBkYXRlKHJlcXVlc3RUeXBlLCByZXF1ZXN0SWQpKTtcbiAgLy8gaXMgdGhpcyBhbiBleGlzdGluZyByZXF1ZXN0P1xuICAvLyBJZiB0aGlzIHVyaSBpcyBpbiB0aGUgcmVxdWVzdCBsaXN0LCBpdCdzIGFscmVhZHkgYmVlbiBmZXRjaGVkXG4gIGNvbnN0IHN0YXRlID0geWllbGQgc2VsZWN0KHNlbGVjdFNob3dTdGF0ZSk7XG4gIGNvbnN0IGhvc3QgPSB5aWVsZCBzZWxlY3Qoc2VsZWN0U2l0ZUhvc3QpO1xuICBpZiAoc3RhdGUucmVxdWVzdExpc3RbcmVxdWVzdElkXSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIGdldCBsb25nIGlkICYmIGFkZCByZXF1ZXN0IHRvIHJlcXVlc3QgbGlzdFxuICBsZXQgbG9uZ0lkO1xuICB0cnkge1xuICAgICh7ZGF0YTogbG9uZ0lkfSA9IHlpZWxkIGNhbGwoZ2V0TG9uZ0NsYWltSWQsIGhvc3QsIG5hbWUsIG1vZGlmaWVyKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gIH1cbiAgY29uc3QgYXNzZXRLZXkgPSBgYSMke25hbWV9IyR7bG9uZ0lkfWA7XG4gIHlpZWxkIHB1dChhZGRSZXF1ZXN0VG9SZXF1ZXN0TGlzdChyZXF1ZXN0SWQsIG51bGwsIGFzc2V0S2V5KSk7XG4gIC8vIGlzIHRoaXMgYW4gZXhpc3RpbmcgYXNzZXQ/XG4gIC8vIElmIHRoaXMgYXNzZXQgaXMgaW4gdGhlIGFzc2V0IGxpc3QsIGl0J3MgYWxyZWFkeSBiZWVuIGZldGNoZWRcbiAgaWYgKHN0YXRlLmFzc2V0TGlzdFthc3NldEtleV0pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBnZXQgc2hvcnQgSWRcbiAgbGV0IHNob3J0SWQ7XG4gIHRyeSB7XG4gICAgKHtkYXRhOiBzaG9ydElkfSA9IHlpZWxkIGNhbGwoZ2V0U2hvcnRJZCwgaG9zdCwgbmFtZSwgbG9uZ0lkKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gIH1cbiAgLy8gZ2V0IGFzc2V0IGNsYWltIGRhdGFcbiAgbGV0IGNsYWltRGF0YTtcbiAgdHJ5IHtcbiAgICAoe2RhdGE6IGNsYWltRGF0YX0gPSB5aWVsZCBjYWxsKGdldENsYWltRGF0YSwgaG9zdCwgbmFtZSwgbG9uZ0lkKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gIH1cbiAgLy8gYWRkIGFzc2V0IHRvIGFzc2V0IGxpc3RcbiAgeWllbGQgcHV0KGFkZEFzc2V0VG9Bc3NldExpc3QoYXNzZXRLZXksIG51bGwsIG5hbWUsIGxvbmdJZCwgc2hvcnRJZCwgY2xhaW1EYXRhKSk7XG4gIC8vIGNsZWFyIGFueSBlcnJvcnMgaW4gcmVxdWVzdCBlcnJvclxuICB5aWVsZCBwdXQob25SZXF1ZXN0RXJyb3IobnVsbCkpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uICogd2F0Y2hOZXdBc3NldFJlcXVlc3QgKCkge1xuICB5aWVsZCB0YWtlTGF0ZXN0KGFjdGlvbnMuQVNTRVRfUkVRVUVTVF9ORVcsIG5ld0Fzc2V0UmVxdWVzdCk7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3NhZ2FzL3Nob3dfYXNzZXQuanMiLCJpbXBvcnQgUmVxdWVzdCBmcm9tICd1dGlscy9yZXF1ZXN0JztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvbmdDbGFpbUlkIChob3N0LCBuYW1lLCBtb2RpZmllcikge1xuICBsZXQgYm9keSA9IHt9O1xuICAvLyBjcmVhdGUgcmVxdWVzdCBwYXJhbXNcbiAgaWYgKG1vZGlmaWVyKSB7XG4gICAgaWYgKG1vZGlmaWVyLmlkKSB7XG4gICAgICBib2R5WydjbGFpbUlkJ10gPSBtb2RpZmllci5pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgYm9keVsnY2hhbm5lbE5hbWUnXSA9IG1vZGlmaWVyLmNoYW5uZWwubmFtZTtcbiAgICAgIGJvZHlbJ2NoYW5uZWxDbGFpbUlkJ10gPSBtb2RpZmllci5jaGFubmVsLmlkO1xuICAgIH1cbiAgfVxuICBib2R5WydjbGFpbU5hbWUnXSA9IG5hbWU7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICBtZXRob2QgOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keSAgIDogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gIH07XG4gIC8vIGNyZWF0ZSB1cmxcbiAgY29uc3QgdXJsID0gYCR7aG9zdH0vYXBpL2NsYWltL2xvbmctaWRgO1xuICAvLyByZXR1cm4gdGhlIHJlcXVlc3QgcHJvbWlzZVxuICByZXR1cm4gUmVxdWVzdCh1cmwsIHBhcmFtcyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2hvcnRJZCAoaG9zdCwgbmFtZSwgY2xhaW1JZCkge1xuICBjb25zdCB1cmwgPSBgJHtob3N0fS9hcGkvY2xhaW0vc2hvcnQtaWQvJHtjbGFpbUlkfS8ke25hbWV9YDtcbiAgcmV0dXJuIFJlcXVlc3QodXJsKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGFpbURhdGEgKGhvc3QsIG5hbWUsIGNsYWltSWQpIHtcbiAgY29uc3QgdXJsID0gYCR7aG9zdH0vYXBpL2NsYWltL2RhdGEvJHtuYW1lfS8ke2NsYWltSWR9YDtcbiAgcmV0dXJuIFJlcXVlc3QodXJsKTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvYXBpL2Fzc2V0QXBpLmpzIiwiaW1wb3J0IHtjYWxsLCBwdXQsIHNlbGVjdCwgdGFrZUxhdGVzdH0gZnJvbSAncmVkdXgtc2FnYS9lZmZlY3RzJztcbmltcG9ydCAqIGFzIGFjdGlvbnMgZnJvbSAnY29uc3RhbnRzL3Nob3dfYWN0aW9uX3R5cGVzJztcbmltcG9ydCB7IGFkZE5ld0NoYW5uZWxUb0NoYW5uZWxMaXN0LCBhZGRSZXF1ZXN0VG9SZXF1ZXN0TGlzdCwgb25SZXF1ZXN0RXJyb3IsIG9uUmVxdWVzdFVwZGF0ZSwgdXBkYXRlQ2hhbm5lbENsYWltcyB9IGZyb20gJ2FjdGlvbnMvc2hvdyc7XG5pbXBvcnQgeyBnZXRDaGFubmVsQ2xhaW1zLCBnZXRDaGFubmVsRGF0YSB9IGZyb20gJ2FwaS9jaGFubmVsQXBpJztcbmltcG9ydCB7IHNlbGVjdFNob3dTdGF0ZSB9IGZyb20gJ3NlbGVjdG9ycy9zaG93JztcbmltcG9ydCB7IHNlbGVjdFNpdGVIb3N0IH0gZnJvbSAnc2VsZWN0b3JzL3NpdGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gKiBuZXdDaGFubmVsUmVxdWVzdCAoYWN0aW9uKSB7XG4gIGNvbnN0IHsgcmVxdWVzdFR5cGUsIHJlcXVlc3RJZCwgY2hhbm5lbE5hbWUsIGNoYW5uZWxJZCB9ID0gYWN0aW9uLmRhdGE7XG4gIC8vIHB1dCBhbiBhY3Rpb24gdG8gdXBkYXRlIHRoZSByZXF1ZXN0IGluIHJlZHV4XG4gIHlpZWxkIHB1dChvblJlcXVlc3RVcGRhdGUocmVxdWVzdFR5cGUsIHJlcXVlc3RJZCkpO1xuICAvLyBpcyB0aGlzIGFuIGV4aXN0aW5nIHJlcXVlc3Q/XG4gIC8vIElmIHRoaXMgdXJpIGlzIGluIHRoZSByZXF1ZXN0IGxpc3QsIGl0J3MgYWxyZWFkeSBiZWVuIGZldGNoZWRcbiAgY29uc3Qgc3RhdGUgPSB5aWVsZCBzZWxlY3Qoc2VsZWN0U2hvd1N0YXRlKTtcbiAgY29uc3QgaG9zdCA9IHlpZWxkIHNlbGVjdChzZWxlY3RTaXRlSG9zdCk7XG4gIGlmIChzdGF0ZS5yZXF1ZXN0TGlzdFtyZXF1ZXN0SWRdKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gZ2V0IGNoYW5uZWwgbG9uZyBpZFxuICBsZXQgbG9uZ0lkLCBzaG9ydElkO1xuICB0cnkge1xuICAgICh7IGRhdGE6IHtsb25nQ2hhbm5lbENsYWltSWQ6IGxvbmdJZCwgc2hvcnRDaGFubmVsQ2xhaW1JZDogc2hvcnRJZH0gfSA9IHlpZWxkIGNhbGwoZ2V0Q2hhbm5lbERhdGEsIGhvc3QsIGNoYW5uZWxOYW1lLCBjaGFubmVsSWQpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geWllbGQgcHV0KG9uUmVxdWVzdEVycm9yKGVycm9yLm1lc3NhZ2UpKTtcbiAgfVxuICAvLyBzdG9yZSB0aGUgcmVxdWVzdCBpbiB0aGUgY2hhbm5lbCByZXF1ZXN0cyBsaXN0XG4gIGNvbnN0IGNoYW5uZWxLZXkgPSBgYyMke2NoYW5uZWxOYW1lfSMke2xvbmdJZH1gO1xuICB5aWVsZCBwdXQoYWRkUmVxdWVzdFRvUmVxdWVzdExpc3QocmVxdWVzdElkLCBudWxsLCBjaGFubmVsS2V5KSk7XG4gIC8vIGlzIHRoaXMgYW4gZXhpc3RpbmcgY2hhbm5lbD9cbiAgLy8gSWYgdGhpcyBjaGFubmVsIGlzIGluIHRoZSBjaGFubmVsIGxpc3QsIGl0J3MgYWxyZWFkeSBiZWVuIGZldGNoZWRcbiAgaWYgKHN0YXRlLmNoYW5uZWxMaXN0W2NoYW5uZWxLZXldKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gZ2V0IGNoYW5uZWwgY2xhaW1zIGRhdGFcbiAgbGV0IGNsYWltc0RhdGE7XG4gIHRyeSB7XG4gICAgKHsgZGF0YTogY2xhaW1zRGF0YSB9ID0geWllbGQgY2FsbChnZXRDaGFubmVsQ2xhaW1zLCBob3N0LCBsb25nSWQsIGNoYW5uZWxOYW1lLCAxKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gIH1cbiAgLy8gc3RvcmUgdGhlIGNoYW5uZWwgZGF0YSBpbiB0aGUgY2hhbm5lbCBsaXN0XG4gIHlpZWxkIHB1dChhZGROZXdDaGFubmVsVG9DaGFubmVsTGlzdChjaGFubmVsS2V5LCBjaGFubmVsTmFtZSwgc2hvcnRJZCwgbG9uZ0lkLCBjbGFpbXNEYXRhKSk7XG4gIC8vIGNsZWFyIGFueSByZXF1ZXN0IGVycm9yc1xuICB5aWVsZCBwdXQob25SZXF1ZXN0RXJyb3IobnVsbCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gKiB3YXRjaE5ld0NoYW5uZWxSZXF1ZXN0ICgpIHtcbiAgeWllbGQgdGFrZUxhdGVzdChhY3Rpb25zLkNIQU5ORUxfUkVRVUVTVF9ORVcsIG5ld0NoYW5uZWxSZXF1ZXN0KTtcbn07XG5cbmZ1bmN0aW9uICogZ2V0TmV3Q2xhaW1zQW5kVXBkYXRlQ2hhbm5lbCAoYWN0aW9uKSB7XG4gIGNvbnN0IHsgY2hhbm5lbEtleSwgbmFtZSwgbG9uZ0lkLCBwYWdlIH0gPSBhY3Rpb24uZGF0YTtcbiAgY29uc3QgaG9zdCA9IHlpZWxkIHNlbGVjdChzZWxlY3RTaXRlSG9zdCk7XG4gIGxldCBjbGFpbXNEYXRhO1xuICB0cnkge1xuICAgICh7IGRhdGE6IGNsYWltc0RhdGEgfSA9IHlpZWxkIGNhbGwoZ2V0Q2hhbm5lbENsYWltcywgaG9zdCwgbG9uZ0lkLCBuYW1lLCBwYWdlKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gIH1cbiAgeWllbGQgcHV0KHVwZGF0ZUNoYW5uZWxDbGFpbXMoY2hhbm5lbEtleSwgY2xhaW1zRGF0YSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gKiB3YXRjaFVwZGF0ZUNoYW5uZWxDbGFpbXMgKCkge1xuICB5aWVsZCB0YWtlTGF0ZXN0KGFjdGlvbnMuQ0hBTk5FTF9DTEFJTVNfVVBEQVRFX0FTWU5DLCBnZXROZXdDbGFpbXNBbmRVcGRhdGVDaGFubmVsKTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9zYWdhcy9zaG93X2NoYW5uZWwuanMiLCJpbXBvcnQgUmVxdWVzdCBmcm9tICd1dGlscy9yZXF1ZXN0JztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENoYW5uZWxEYXRhIChob3N0LCBpZCwgbmFtZSkge1xuICBpZiAoIWlkKSBpZCA9ICdub25lJztcbiAgY29uc3QgdXJsID0gYCR7aG9zdH0vYXBpL2NoYW5uZWwvZGF0YS8ke25hbWV9LyR7aWR9YDtcbiAgcmV0dXJuIFJlcXVlc3QodXJsKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGFubmVsQ2xhaW1zIChob3N0LCBsb25nSWQsIG5hbWUsIHBhZ2UpIHtcbiAgaWYgKCFwYWdlKSBwYWdlID0gMTtcbiAgY29uc3QgdXJsID0gYCR7aG9zdH0vYXBpL2NoYW5uZWwvY2xhaW1zLyR7bmFtZX0vJHtsb25nSWR9LyR7cGFnZX1gO1xuICByZXR1cm4gUmVxdWVzdCh1cmwpO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9hcGkvY2hhbm5lbEFwaS5qcyIsImNvbnN0IGhhbmRsZVBhZ2VSZW5kZXIgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2hhbmRsZVBhZ2VSZW5kZXIuanN4Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYXBwID0+IHtcbiAgLy8gYSBjYXRjaC1hbGwgcm91dGUgaWYgc29tZW9uZSB2aXNpdHMgYSBwYWdlIHRoYXQgZG9lcyBub3QgZXhpc3RcbiAgYXBwLnVzZSgnKicsIChyZXEsIHJlcykgPT4ge1xuICAgIC8vIHNlbmQgcmVzcG9uc2VcbiAgICBoYW5kbGVQYWdlUmVuZGVyKHJlcSwgcmVzKTtcbiAgfSk7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL3JvdXRlcy9mYWxsYmFjay1yb3V0ZXMuanMiLCJjb25zdCB7IGxvZ0xldmVsIH0gPSByZXF1aXJlKCcuLi8uLi9jb25maWcvbG9nZ2VyQ29uZmlnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKHdpbnN0b24pID0+IHtcbiAgLy8gY29uZmlndXJlXG4gIHdpbnN0b24uY29uZmlndXJlKHtcbiAgICB0cmFuc3BvcnRzOiBbXG4gICAgICBuZXcgKHdpbnN0b24udHJhbnNwb3J0cy5Db25zb2xlKSh7XG4gICAgICAgIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxvZ0xldmVsLFxuICAgICAgICB0aW1lc3RhbXAgICAgICAgICAgICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgY29sb3JpemUgICAgICAgICAgICAgICAgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgcHJldHR5UHJpbnQgICAgICAgICAgICAgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgaGFuZGxlRXhjZXB0aW9ucyAgICAgICAgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgaHVtYW5SZWFkYWJsZVVuaGFuZGxlZEV4Y2VwdGlvbjogdHJ1ZSxcbiAgICAgIH0pLFxuICAgIF0sXG4gIH0pO1xuICAvLyB0ZXN0IGFsbCB0aGUgbG9nIGxldmVsc1xuICB3aW5zdG9uLmVycm9yKCdMZXZlbCAwJyk7XG4gIHdpbnN0b24ud2FybignTGV2ZWwgMScpO1xuICB3aW5zdG9uLmluZm8oJ0xldmVsIDInKTtcbiAgd2luc3Rvbi52ZXJib3NlKCdMZXZlbCAzJyk7XG4gIHdpbnN0b24uZGVidWcoJ0xldmVsIDQnKTtcbiAgd2luc3Rvbi5zaWxseSgnTGV2ZWwgNScpO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9oZWxwZXJzL2NvbmZpZ3VyZUxvZ2dlci5qcyIsImNvbnN0IGxvZ2dlckNvbmZpZyA9IHtcbiAgbG9nTGV2ZWw6ICdkZWJ1ZycsICAvLyBvcHRpb25zOiBzaWxseSwgZGVidWcsIHZlcmJvc2UsIGluZm9cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbG9nZ2VyQ29uZmlnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY29uZmlnL2xvZ2dlckNvbmZpZy5qcyIsImNvbnN0IHdpbnN0b25TbGFja1dlYkhvb2sgPSByZXF1aXJlKCd3aW5zdG9uLXNsYWNrLXdlYmhvb2snKS5TbGFja1dlYkhvb2s7XG5jb25zdCBzbGFja0NvbmZpZyA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZy9zbGFja0NvbmZpZy5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICh3aW5zdG9uKSA9PiB7XG4gIGNvbnN0IHtzbGFja1dlYkhvb2ssIHNsYWNrRXJyb3JDaGFubmVsLCBzbGFja0luZm9DaGFubmVsfSA9IHNsYWNrQ29uZmlnO1xuICBpZiAoc2xhY2tXZWJIb29rKSB7XG4gICAgLy8gYWRkIGEgdHJhbnNwb3J0IGZvciBlcnJvcnMgdG8gc2xhY2tcbiAgICBpZiAoc2xhY2tFcnJvckNoYW5uZWwpIHtcbiAgICAgIHdpbnN0b24uYWRkKHdpbnN0b25TbGFja1dlYkhvb2ssIHtcbiAgICAgICAgbmFtZSAgICAgIDogJ3NsYWNrLWVycm9ycy10cmFuc3BvcnQnLFxuICAgICAgICBsZXZlbCAgICAgOiAnd2FybicsXG4gICAgICAgIHdlYmhvb2tVcmw6IHNsYWNrV2ViSG9vayxcbiAgICAgICAgY2hhbm5lbCAgIDogc2xhY2tFcnJvckNoYW5uZWwsXG4gICAgICAgIHVzZXJuYW1lICA6ICdzcGVlLmNoJyxcbiAgICAgICAgaWNvbkVtb2ppIDogJzpmYWNlX3dpdGhfaGVhZF9iYW5kYWdlOicsXG4gICAgICB9KTtcbiAgICB9O1xuICAgIGlmIChzbGFja0luZm9DaGFubmVsKSB7XG4gICAgICB3aW5zdG9uLmFkZCh3aW5zdG9uU2xhY2tXZWJIb29rLCB7XG4gICAgICAgIG5hbWUgICAgICA6ICdzbGFjay1pbmZvLXRyYW5zcG9ydCcsXG4gICAgICAgIGxldmVsICAgICA6ICdpbmZvJyxcbiAgICAgICAgd2ViaG9va1VybDogc2xhY2tXZWJIb29rLFxuICAgICAgICBjaGFubmVsICAgOiBzbGFja0luZm9DaGFubmVsLFxuICAgICAgICB1c2VybmFtZSAgOiAnc3BlZS5jaCcsXG4gICAgICAgIGljb25FbW9qaSA6ICc6bmVyZF9mYWNlOicsXG4gICAgICB9KTtcbiAgICB9O1xuICAgIC8vIHNlbmQgdGVzdCBtZXNzYWdlXG4gICAgd2luc3Rvbi5lcnJvcignU2xhY2sgXCJlcnJvclwiIGxvZ2dpbmcgaXMgb25saW5lLicpO1xuICAgIHdpbnN0b24uaW5mbygnU2xhY2sgXCJpbmZvXCIgbG9nZ2luZyBpcyBvbmxpbmUuJyk7XG4gIH0gZWxzZSB7XG4gICAgd2luc3Rvbi53YXJuKCdTbGFjayBsb2dnaW5nIGlzIG5vdCBlbmFibGVkIGJlY2F1c2Ugbm8gc2xhY2tXZWJIb29rIGNvbmZpZyB2YXIgcHJvdmlkZWQuJyk7XG4gIH1cbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvaGVscGVycy9jb25maWd1cmVTbGFjay5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIndpbnN0b24tc2xhY2std2ViaG9va1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcIndpbnN0b24tc2xhY2std2ViaG9va1wiXG4vLyBtb2R1bGUgaWQgPSAxNDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiY29uc3QgUGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcclxuY29uc3QgaW1wb3J0U3ViTW9kdWxlcyA9IHJlcXVpcmUoJ2J1aWxkL3V0aWxzL2ltcG9ydFN1Yk1vZHVsZXMnKTtcclxuY29uc3QgdGhpc0ZvbGRlciA9IFBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdjbGllbnQvY29tcG9uZW50cycpO1xyXG5tb2R1bGUuZXhwb3J0cyA9IGltcG9ydFN1Yk1vZHVsZXModGhpc0ZvbGRlcik7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb21wb25lbnRzL2luZGV4LmpzIiwiY29uc3QgUGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcclxuY29uc3QgaW1wb3J0U3ViTW9kdWxlcyA9IHJlcXVpcmUoJ2J1aWxkL3V0aWxzL2ltcG9ydFN1Yk1vZHVsZXMnKTtcclxuY29uc3QgdGhpc0ZvbGRlciA9IFBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdjbGllbnQvY29udGFpbmVycy8nKTtcclxubW9kdWxlLmV4cG9ydHMgPSBpbXBvcnRTdWJNb2R1bGVzKHRoaXNGb2xkZXIpO1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9pbmRleC5qcyIsImNvbnN0IFBhdGggPSByZXF1aXJlKCdwYXRoJyk7XHJcbmNvbnN0IGltcG9ydFN1Yk1vZHVsZXMgPSByZXF1aXJlKCdidWlsZC91dGlscy9pbXBvcnRTdWJNb2R1bGVzJyk7XHJcbmNvbnN0IHRoaXNGb2xkZXIgPSBQYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnY2xpZW50L3BhZ2VzLycpO1xyXG5tb2R1bGUuZXhwb3J0cyA9IGltcG9ydFN1Yk1vZHVsZXModGhpc0ZvbGRlcik7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9wYWdlcy9pbmRleC5qcyIsInZhciBtYXAgPSB7XG5cdFwiLi9pbXBvcnRTdWJNb2R1bGVzXCI6IDEyLFxuXHRcIi4vaW1wb3J0U3ViTW9kdWxlcy5qc1wiOiAxMlxufTtcbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyh3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSk7XG59O1xuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHR2YXIgaWQgPSBtYXBbcmVxXTtcblx0aWYoIShpZCArIDEpKSAvLyBjaGVjayBmb3IgbnVtYmVyIG9yIHN0cmluZ1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIicuXCIpO1xuXHRyZXR1cm4gaWQ7XG59O1xud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IDE0NTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2J1aWxkL3V0aWxzIF5cXC5cXC8uKiRcbi8vIG1vZHVsZSBpZCA9IDE0NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9